色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          avr中斷使用例子

          作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
          在ICCAVR下,用以下語句可定義中斷程序
          #pragma interrupt_handler 函數(shù)名:中斷向量
          要注意不同的AVR芯片的中斷向量是不同的,因此在ICCAVR下編譯,除了要在程序上注明芯片的類型外,還要在PROJECT的OPTION頁選擇正確的芯片,否則有可能導(dǎo)致程序運行不正常;而GCC只要在MFILE里面選定芯片型號就可以,GCC在這點上的使用比ICCAVR的方便。
          附:定時器1溢出中斷例子,每溢出一次就令i自加1,然后在LCD1602上顯示出來
          ------------------------------------------------------------------------------------------------
          #include
          #include
          #pragma interrupt_handler ANA_COMP:10 //定時器1溢出中斷
          #define uchar unsigned char
          #define uint unsigned int
          #define LcdBus PORTA
          #define rs 2 //LCD端口定義
          #define rw 3
          #define en 4


          void LcdIni(void);
          void WrOp(uchar dat);
          void WrDat(uchar dat);
          void ChkBusy(void);
          void DisText(uchar addr,uchar *text);
          void DisTextConst(uchar addr,uchar const *text);
          void ShowNum(uchar addr,uint num); //在addr處顯示數(shù)字num
          int AdcVal(uchar n);
          void delayms(uint n);
          int AdcValPro(uchar n);
          void ANA_COMP(void);

          char BCD[6]; //十位二進制的顯示碼分別是千百十個位的顯示
          int Adc[3]; //存放Adc轉(zhuǎn)換后的值
          int i=0;
          void main(void)
          {
          LcdIni();
          TIMSK=0X04;
          TCNT1H=0XFF;
          TCNT1L=0X00;
          TCCR1A=0X00;
          TCCR1B=0X01;
          SEI(); //允許全局中斷
          while(1);
          }

          void ANA_COMP(void)
          {//中斷處理程序,溢出時就令i增加1
          TCNT1H=0XFF;
          TCNT1L=0X00;
          ShowNum(0x82,i++);
          }

          int AdcVal(uchar n)
          {//軟件濾波
          uchar i,k;
          uint tmp=0;
          for(i=0;i<20;i++)
          tmp=(tmp+AdcValPro(n))/2;
          k=tmp>Adc[n] ? (tmp-Adc[n]):(Adc[n]-tmp);
          Adc[n]=k>0 ? tmp:Adc[n];
          return Adc[n];
          }

          int AdcValPro(uchar n)
          {//返回第N個ADC的值從0到7
          uchar dat1,dat0;
          int val;
          DDRA &=~BIT(n); //設(shè)置對應(yīng)的ADC口為輸入
          PORTA &=~BIT(n);
          ADMUX=0x40+n; //選擇AVCC,選擇第N個ADC
          ADCSRA=0xc0; //允許轉(zhuǎn)換ADEN,ADSC
          while(ADCSRA & BIT(ADSC)); //
          dat1=ADCH;
          dat0=ADCL;
          val=ADCH*256+ADCL;
          return val;
          }

          void ShowNum(uchar addr,uint num) //在addr處顯示數(shù)字num
          {//將num轉(zhuǎn)化成五個BCD碼存放在全局數(shù)組BCD[5]中
          uchar i;
          for(i=5;i>0;i--) //將NUM數(shù)據(jù)轉(zhuǎn)化成ASCII碼,如521會轉(zhuǎn)化為00521
          {
          BCD[i-1]=(uchar)(num%10+0x30); //取出最低位
          num/=10; //去掉最低位
          }
          i=0;
          while(BCD[i] ==0x30 && i<4) BCD[i++]= ; //NUM轉(zhuǎn)換成數(shù)組存放,但還沒有加上小數(shù)點
          BCD[5]=