<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 利用AVR的輸入捕捉進(jìn)行紅外解碼

          利用AVR的輸入捕捉進(jìn)行紅外解碼

          作者: 時間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
          使用AVR輸入捕捉可以對組碼進(jìn)行有效地區(qū)分,這里是對紅外接收頭接收到遙控器的碼型進(jìn)行解碼,也可以擴(kuò)展到其他的應(yīng)用領(lǐng)域。

          關(guān)于紅外的基本知識參看下面的參考文章。需要說明的是紅外的數(shù)據(jù)端口電源最好加10uf濾波電容,然后數(shù)據(jù)引腳加上1K限流電阻。

          本文引用地址:http://www.ex-cimer.com/article/201612/325120.htm

          硬件平臺:ATMega16-16PU 紅外接收頭4338 康佳遙控器

          編譯器: IAR For AVR

          代碼:

          /*================START==================*/

          #include
          #include
          #include

          /**********************************************************
          變量聲明
          **********************************************************/

          unsigned int Receive_NewData = 0;
          unsigned int Receive_OldData = 0;
          unsigned int Calc_num = 0;
          unsigned int Temp;
          unsigned char Num;
          unsigned char buffer[5]={0};

          /**********************************************************
          定時器1 捕獲定時器初始化
          **********************************************************/
          void Timer1_Init(void)
          {
          TCCR1A = 0x00;
          // Input Capture on Falling Edge
          TCCR1B = (1< // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK = (1<}
          /**********************************************************
          開始捕獲
          **********************************************************/
          void main(void)
          {
          Timer1_Init();
          _SEI();// Global enable interrupts
          while(1){;}
          }
          /**********************************************************
          定時器1 捕獲中斷 中斷服務(wù)程序
          **********************************************************/
          #pragma vector=TIMER1_CAPT_vect//定時器1 輸入捕獲中斷
          __interrupt void OldTimer1_capt_isr(void)
          // Timer 1 input capture interrupt service routine
          {
          unsigned char i,j;
          Receive_NewData = ICR1; //得到新的數(shù)據(jù)
          Temp = Receive_NewData - Receive_OldData ;//用這一次的數(shù)據(jù)減去上一次的數(shù)據(jù),得到本次捕捉時間
          Receive_OldData = Receive_NewData ;//更新數(shù)據(jù)到 Receive_OldData

          if(Temp>100 && Temp<150)// ‘0 ’ 信號
          {
          Num = 0;
          }
          else if(Temp>230 && Temp<280)// ‘1 ’ 信號
          {
          Num = 1;
          }
          else if(Temp>1300 && Temp<1800)// ‘ hearder ’信號
          {
          Calc_num = 0;
          Num = 2;
          }
          else//干擾信號
          {
          return ;
          }

          //將二進(jìn)制碼轉(zhuǎn)換成十六進(jìn)制

          //按下的按鍵鍵值碼型應(yīng)為 1001 1000 1000 0011 0011 1011 (1110 1100 0001 0011 )11
          for(i=0;i<5;i++)
          {
          if((Calc_num>8*i) && (Calc_num<(8*i+8)))
          {
          buffer[i]=buffer[i] | Num;
          buffer[i]<<=1;
          }
          else if(Calc_num==(8*i+8))
          {
          buffer[i]=buffer[i] | Num;
          }
          }


          Calc_num++; //計數(shù)變量


          if(Calc_num>41)
          {
          Calc_num=0;
          for(j=0;j<5;j++)
          {
          buffer[j]=0;
          }
          }

          }

          /*================END==================*/

          粗體部分是下面代碼總結(jié)的:

          /*
          if((Calc_num>0) && (Calc_num<8))
          {
          buffer[0]=buffer[0] | Num;
          buffer[0]<<=1;
          }
          else if(Calc_num==8)
          {
          buffer[0]=buffer[0] | Num;
          }
          //-------------

          if((Calc_num>8) && (Calc_num<16))
          {
          buffer[1]=buffer[1] | Num;
          buffer[1]<<=1;
          }
          else if(Calc_num==16)
          {
          buffer[1]=buffer[1] | Num;
          }
          //-------------
          if((Calc_num>16) && (Calc_num<24))
          {
          buffer[2]=buffer[2] | Num;
          buffer[2]<<=1;
          }
          else if(Calc_num==24)
          {
          buffer[2]=buffer[2] | Num;
          }
          //-------------
          if((Calc_num>24) && (Calc_num<32))
          {
          buffer[3]=buffer[3] | Num;
          buffer[3]<<=1;
          }
          else if(Calc_num==32)
          {
          buffer[3]=buffer[3] | Num;
          }
          //-------------
          if((Calc_num>32) && (Calc_num<40))
          {
          buffer[4]=buffer[4] | Num;
          buffer[4]<<=1;
          }
          else if(Calc_num==40)
          {
          buffer[4]=buffer[4] | Num;
          }

          */
          //-------------



          關(guān)鍵詞: AVR輸入捕捉紅外解

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();