一个atmega8检测电压的程序问题 求教

2019-03-24 20:49发布

出现的问题是 上电后 有时正常有事不正常

代码如下:
#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--);
   }
} 此帖出自小平头技术问答
0条回答

一周热门 更多>