出现的问题是 上电后 有时正常有事不正常
代码如下:
#include <iom8v.h>
#include <AVRdef.h>
#define high 0x005d
#define low 0x003b
unsigned int adc[];
unsigned int flag;
unsigned int finish;
unsigned int cay;//常用电源a电压值
unsigned int cby;//常用电源b电压值
unsigned int ccy;//常用电源c电压值
unsigned int bay;//备用电源a电压值
unsigned int bby;//备用电源b电压值
unsigned int bcy;//备用电源c电压值
unsigned int cap;
unsigned int bap;
unsigned char b;
unsigned char c;
void timer0_init(void);
void adc_init(void);
void timer1_init(void);
void cay_int(void);
void cby_int(void);
void ccy_int(void);
void bay_int(void);
void bby_int(void);
void bcy_int(void);
void main(void)//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
{
DDRD=0xff;//端口初始化
PORTD=0x00;
DDRB=0x00;
PORTB=0x00;
DDRC&=0xc0;//设置PC0-PC5为输入
PORTC&=0xc0;//PC0-PC5无上拉电阻
timer1_init();
//timer0_init();
//adc_init();
//GICR=0x40;
//MCUCR=0x03;
while(1)
{
//if((!(PINC&BIT(4)))||(!(PINC&BIT(5))))PORTD&=0xfc;
//if(!(PINC&BIT(5)))PORTD|=BIT(1);
//else PORTD&=0xfc;
if(flag==1)cay_int();
if(flag==2)cby_int();
if(flag==3)ccy_int();
if(flag==4)bay_int();
if(flag==5)bby_int();
if(flag==6)bcy_int();
if(finish)
{
finish=0;
if((cay>low)&&(cay<high)&&(cby>low)&&(cby<high)&&(ccy>low)&&(ccy<high))cap=1;
else cap=0;
if((bay>low)&&(bay<high)&&(bby>low)&&(bby<high)&&(bcy>low)&&(bcy<high))bap=1;
else bap=0;
if(cap==1)
{
if(PINB&BIT(0))PORTD=0x00;//电机到位
else PORTD=BIT(1);//电机没到位
}
if((cap==0)&&(bap==1))
{
if(PINB&BIT(1))PORTD=0x00;//电机到位
else PORTD=BIT(0)|BIT(2);//电机没到位
}
if((cap==0)&&(bap==0))
{
if(PINC&BIT(4)&&(!(PINC&BIT(5))))//常用分闸没到位
{
PORTD=0x00;//清零
if((cay>low)&&(cay<high))PORTD=BIT(0);//驱动电机
else PORTD=BIT(0)|BIT(2);
}
else if(PINC&BIT(5)&&(!(PINC&BIT(4))))//备用分闸没到位
{
PORTD=0x00;//清零
if((cay>low)&&(cay<high))PORTD=BIT(1);//驱动电机
else PORTD=BIT(1)|BIT(2);//驱动电机
}
else PORTD=0x00;//清零
}
}
//if()if(PINB&BIT(0))PORTD=0x00;//电机到位
//else PORTD=BIT(1);//电机没到位
}
}
void timer1_init(void)//定时器1初始化 上电延时
{
TCCR1B|=BIT(1);//1/8分频
TCNT1H=(65536-25000)/256;//200ms溢出
TCNT1L=(65536-25000)%256;
TIMSK|=BIT(2);//溢出中断使能
SREG|=BIT(7);//打开总中断
}
#pragma interrupt_handler timer1_isr:9
void timer1_isr(void)
{
TCNT1H=(65536-25000)/256;//200ms溢出
TCNT1L=(65536-25000)%256;
c++;
if(c==5)
{
//TIMSK&=~BIT(2);//关闭溢出中断使能
adc_init();//ADC初始化
timer0_init();//定时器0初始化
WDTCR |= (1<<WDCE) | (1<<WDE);//看门狗使能
WDTCR=0x08;//16.3 ms
TCCR1B&=~BIT(1);//关闭定时器1
}
}
void timer0_init(void)//定时器0初始化
{
TCCR0=0x02;//1/8预分频
TCNT0=6;//赋初值 2ms溢出
TIMSK|=BIT(0);//溢出中断使能
SREG|=BIT(7);//打开总中断
}
void adc_init(void)//ADC初始化
{
ADCSRA= 0x00;
ADMUX=0x60;//电源基准AVCC 数据左对齐 通道选择ADC0
ACSR = 0x80;
ADCSRA=0x89;//ADC使能 关闭转换 不连续 ADC中断使能 预分频2
}
#pragma interrupt_handler timer0_int:10
void timer0_int(void) //定时器0溢出中断
{
TCNT0=6;//赋初值
_WDR();//喂狗
ADCSRA&=~0x40;
ADCSRA|=0x40;//2ms转换一次
}
#pragma interrupt_handler adc_int:15
void adc_int(void) //ADC转换完成中断
{
unsigned char h;
//l=ADCL;
h=ADCH;
adc
=(int)h;
b++;
if((b==9)||(b==18)||(b==27)||(b==36)||(b==45)||(b==54))flag++;//周期20ms内取9个数据
if(b==54)b=0;
if(b==0)//通道0
ADMUX&=0xf0;
if(b==9)//通道1
{
ADMUX&=0xf0;
ADMUX|=0x01;
}
if(b==18)//通道2
{
ADMUX&=0xf0;
ADMUX|=0x02;
}
if(b==27)//通道3
{
ADMUX&=0xf0;
ADMUX|=0x03;
}
if(b==36)//通道6
{
ADMUX&=0xf0;
ADMUX|=0x06;
}
if(b==45)//通道7
{
ADMUX&=0xf0;
ADMUX|=0x07;
}
}
void cay_int(void)
{
unsigned char i;
unsigned int z,max=adc[0],min=adc[0];
for(i=0;i<9;i++)
{
if(adc>max)max=adc;
if(adc<min)min=adc;
z+=adc;
}
z=z-max-min;//减去最大和最小数
cay=z/7;
}
void cby_int(void)
{
unsigned char i;
unsigned int z,max=adc[9],min=adc[9];
for(i=9;i<18;i++)
{
if(adc>max)max=adc;
if(adc<min)min=adc;
z+=adc;
}
z=z-max-min;//减去最大和最小数
cby=z/7;
}
void ccy_int(void)
{
unsigned char i;
unsigned int z,max=adc[18],min=adc[18];
for(i=18;i<27;i++)
{
if(adc>max)max=adc;
if(adc<min)min=adc;
z+=adc;
}
z=z-max-min;//减去最大和最小数
ccy=z/7;
}
void bay_int(void)
{
unsigned char i;
unsigned int z,max=adc[27],min=adc[27];
for(i=27;i<36;i++)
{
if(adc>max)max=adc;
if(adc<min)min=adc;
z+=adc;
}
z=z-max-min;//减去最大和最小数
bay=z/7;
}
void bby_int(void)
{
unsigned char i;
unsigned int z,max=adc[36],min=adc[36];
for(i=36;i<45;i++)
{
if(adc>max)max=adc;
if(adc<min)min=adc;
z+=adc;
}
z=z-max-min;//减去最大和最小数
bby=z/7;
}
void bcy_int(void)
{
unsigned char i;
unsigned int z,max=adc[45],min=adc[45];
flag=0;
for(i=45;i<54;i++)
{
if(adc>max)max=adc;
if(adc<min)min=adc;
z+=adc;
}
z=z-max-min;//减去最大和最小数
bcy=z/7;
finish=1;
}
void delay_ms(int ms)
{
int count1,count2;
count1=ms;
while(count1--)
{
count2=1335;
while(count2--);
}
}
此帖出自小平头技术问答
一周热门 更多>