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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 紅外解碼原理及程序

          紅外解碼原理及程序

          作者: 時間:2016-11-18 來源:網(wǎng)絡 收藏
          //----------------------------------------------------------------------------------------------------------------------------------------------

          //紅外解碼原理基本簡介:當發(fā)射鍵按下后,就會發(fā)射出33位遙控編碼,按下的鍵不同,發(fā)射出的編碼不同;
          //33位數(shù)據(jù)中。第一位是起始碼,告訴接收器準備開始接收。后面的32位時數(shù)據(jù),最開始發(fā)送出去的是操控碼,用于不同遙控器的識別。同一各遙控器
          //所有按鍵的操控碼都相同;發(fā)送時,先發(fā)低位,再發(fā)高位;接下來的數(shù)據(jù)是操控碼的反碼,用于驗證操控碼,同樣也是低位在前,高位在后;接下來
          //的就是數(shù)據(jù)了,數(shù)據(jù)石油8位2進制的數(shù)構成,同樣低位在前,高位在后。最后的8位數(shù)據(jù)時前面數(shù)據(jù)的反碼,用于數(shù)據(jù)的校對;
          //在解碼時最關鍵的是怎樣識別發(fā)送過來的0和1;遙控編碼,是用38kHZ的載波發(fā)送的;通常, ”0“用0.56ms的低電平和0.56ms的高電平組合而成,脈沖寬度
          //位1.12ms;”1“是用0.56ms的低電平和1.69ms的高電平組合而成,脈沖寬度為2.25ms。這頁就位我們提供了一種方法來識別0和1,即判別脈沖寬度;這頁就是
          //本程序所用到的方法;其次,比較關鍵的是,如何識別起始位;通常用9ms的低電平和4.5ms的高電平組合成起始位,因而同樣可以用判別脈沖寬度的方法來識
          //別起始位;
          //------------------------------------------------------------------------------------------------------------------------------------------------

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



          #include//包含頭文件;

          //--------------------------------------------------------------------
          //重新聲明變量標識符;
          //--------------------------------------------------------------------
          #defineucharunsignedchar
          #defineuintunsignedint
          #defineulongunsignedlongint

          sbitout=P3^2;//端口定義;


          ucharadd=0,_add=0,tdata=0,_tdata=0;//分別為 操控碼,操控反碼,數(shù)據(jù),數(shù)據(jù)反碼;
          ucharadd_up=0,add_down=0,_add_up=0,_add_down=0,tdata_up=0,tdata_down=0,_tdata_up=0,_tdata_down=0;//up代表高4位,down代表低4位;
          ucharnum=0;//用于判斷接收數(shù)據(jù)的位數(shù),判斷終止位;
          ulongbitdata=0x00000000;//用于存放接收到的32位二進制數(shù);

          bitfinish_flag=0;//結束標志;
          bitstart_flag=0;//開始標志;
          bittime=1;//數(shù)據(jù)與開始標志識別;
          bitdata_start=0;//數(shù)據(jù)開始標志;

          ucharcodetable[]={
          0x28,/*0*/
          0x7E,/*1*/
          0xA2,/*2*/
          0x62,/*3*/
          0x74,/*4*/
          0x61,/*5*/
          0x21,/*6*/
          0x7A,/*7*/
          0x20,/*8*/
          0x60,/*9*/
          0x30,/*A*/
          0x25,/*b*/
          0xA9,/*C*/
          0x26,/*d*/
          0xA1,/*E*/
          0xB1 /*F*/
          };

          //------------------------------------------------------------------------------------------------------
          //所用到函數(shù)的聲明;
          //------------------------------------------------------------------------------------------------------
          voiddisplay(uchart);
          voidinitial();
          bitstart_check(uchardata1,uchardata2);
          bittrans_to_bit(uchardata1,uchardata2);
          voidtrans_bitdata_to_data();
          voidtrans_data();
          bitdata_check();
          voidinterrupt0();
          voiddisplay(uchart);

          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:delay();
          //入口參數(shù):uchar n;
          //功能:延時;

          //-------------------------------------------------------------------------------------------------


          voiddelay(ucharn)
          {
          while(n--);
          }

          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:initial();
          //入口參數(shù):無;
          //功能:初始化;

          //-------------------------------------------------------------------------------------------------

          voidinitial()
          {
          EA=1;//開總中斷;
          EX0=1;//開外部中斷0;
          IT0=1;//外部0中斷方式位下降沿中斷;
          TMOD=0x01;//定時器0,工作方式1;
          TH0=0x00;//置初值;
          TL0=0x00;
          time=1;
          num=0;
          data_start=0;
          start_flag=0;
          finish_flag=0;
          }

          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:start_check();
          //入口參數(shù):uchar data1,uchar data2;
          //出口參數(shù)類型:bit;
          //功能:開始位判斷;
          //-------------------------------------------------------------------------------------------------
          bitstart_check(uchardata1,uchardata2)
          {
          uinti;
          i=data1*256+data2;
          if(i>7500&&i<14500)
          return1;
          else
          return0;
          }


          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:trans_to_bit();
          //入口參數(shù):uchar data1,uchar data2;
          //出口參數(shù)類型:bit;
          //功能:將定時器的值轉(zhuǎn)化位2進制數(shù)0和1;

          //-------------------------------------------------------------------------------------------------

          bittrans_to_bit(uchardata1,uchardata2)
          {
          uint i;
          i=data1*256+data2;
          if(i>1200&&i<2300)
          return1;
          else
          return0;
          }

          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:trans_bitdata_to_data();
          //入口參數(shù):無;
          //出口參數(shù)類型:void;
          //功能:分離出操控碼,操控反碼,數(shù)據(jù),數(shù)據(jù)反碼;;

          //-------------------------------------------------------------------------------------------------

          voidtrans_bitdata_to_data()
          {
          add=(uchar)(bitdata&0x000000ff);
          _add=(uchar)((bitdata&0x0000ff00)>>8);
          tdata=(uchar)((bitdata&0x00ff0000)>>16);
          _tdata=(uchar)((bitdata&0xff000000)>>24);
          }


          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:trans_data();
          //入口參數(shù):無;
          //出口參數(shù)類型:void;
          //功能:分離出操控碼,操控反碼,數(shù)據(jù),數(shù)據(jù)反碼的高4位和低4位;
          //-------------------------------------------------------------------------------------------------
          voidtrans_data()
          {
          add_up=(add&0xf0)/16;
          add_down=add&0x0f;
          _add_up=(_add&0xf0)/16;
          _add_down=_add&0x0f;
          tdata_up=(tdata&0xf0)/16;
          tdata_down=tdata&0x0f;
          _tdata_up=(_tdata&0xf0)/16;
          _tdata_down=_tdata&0x0f;

          }

          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:data_check();
          //入口參數(shù):無;
          //出口參數(shù)類型:bit;
          //功能:檢驗所得數(shù)據(jù)的正確性;
          //-------------------------------------------------------------------------------------------------
          bitdata_check()
          {
          if((add==~_add)&&(tdata==~_tdata))
          return1;
          else
          return0;
          }

          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:interrupt0();
          //入口參數(shù):無;
          //出口參數(shù)類型:void;
          //功能:外部中斷0;

          //-------------------------------------------------------------------------------------------------

          voidinterrupt0()interrupt0
          {
          ucharTH0_BUF,TL0_BUF;//定時器數(shù)據(jù)緩存;
          if(!time&&data_start)//判斷起始位是否有效,為第二次中斷時;
          {
          TR0=0;//關定時器0;
          if(start_check(TH0,TL0))
          {start_flag=1;data_start=0;TH0=0x00;TL0=0x00;TR0=1;}//若起始位有效,置位開始標志位start_flag,定時器重新定時;
          else//若起始位無效,初始化,等待下個起始位;
          initial();
          }

          else if(!time&&start_flag)//起始位有效,則在第二次中斷時接收數(shù)據(jù);
          {
          TR0=0;
          TH0_BUF=TH0;
          TL0_BUF=TL0;
          TH0=0x00;
          TL0=0x00;
          TR0=1;
          bitdata=bitdata>>1;//先移位,后賦值;
          if(trans_to_bit(TH0_BUF,TL0_BUF))
          bitdata=bitdata|0x80000000;
          else
          ;
          if(num>=31)//接收完成,完成標志finish_flag置位;
          finish_flag=1;
          else
          num++;
          }
          elseif(time)//第一此中斷,開定時器;
          {
          time=!time;
          TR0=1;
          data_start=1;
          }
          }


          //-------------------------------------------------------------------------------------------------
          //函數(shù)名稱:display();
          //入口參數(shù):uchar t;
          //出口參數(shù)類型:void;
          //功能:顯示函數(shù);

          //-------------------------------------------------------------------------------------------------
          voiddisplay(uchart)
          {
          while(t--)
          {
          P0=0x00;
          P2=0xfe;
          P0=table[add_up];
          delay(10);
          P0=0x00;
          P2=0xfd;
          P0=table[add_down];
          delay(10);
          P0=0x00;
          P2=0xfb;
          P0=table[_add_up];
          delay(10);
          P0=0x00;
          P2=0xf7;
          P0=table[_add_down];
          delay(10);
          P0=0x00;
          P2=0xef;
          P0=table[tdata_up];
          delay(10);
          P0=0x00;
          P2=0xdf;
          P0=table[tdata_down];
          delay(10);
          P0=0x00;
          P2=0xbf;
          P0=table[_tdata_up];
          delay(10);
          P0=0x00;
          P2=0x7f;
          P0=table[_tdata_down];
          delay(10);
          }
          }


          //----------------------------------------------------------------------------------------------
          //主函數(shù)入口;
          //----------------------------------------------------------------------------------------------

          main()
          {
          initial();//初始化;
          while(1)
          {
          display(1);
          if(finish_flag)//完成后,進行數(shù)據(jù)處理;
          {
          initial();//初始化,準備接收第二次;
          trans_bitdata_to_data();
          if(data_check())//判斷接收數(shù)據(jù)是否正確,如果正確,則顯示,否則丟棄;
          trans_data();
          }
          }
          }



          評論


          技術專區(qū)

          關閉
          看屁屁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); })();