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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 紅外通信—紅外遙控器NEC解碼程序

          紅外通信—紅外遙控器NEC解碼程序

          作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò) 收藏

          /**********************紅外解碼*************************************/

          /**
          * @brief 配置定時(shí)器T1,開(kāi)啟外部中斷,T1用來(lái)計(jì)數(shù)
          * @param 無(wú)
          * @retval 無(wú)
          */
          void ConfigTimer1()
          {
          TMOD &= 0x0F;//清零T1控制位
          TMOD |= 0x10;//T1方式1
          TH1 = 0;
          TL1 = 0;//初始化計(jì)數(shù)值為0
          TR1 = 0;//在沒(méi)有進(jìn)入外部中斷前,先關(guān)閉定時(shí)器T1
          ET1 = 0;//關(guān)閉T1中斷,只用來(lái)計(jì)數(shù)
          IT1 = 1;//設(shè)置外部中斷為下降沿觸發(fā)中斷
          EX1 = 1;//開(kāi)啟外部中斷
          }

          /**
          * @brief 獲得高電平時(shí)間(空閑時(shí)間)
          * @param 無(wú)
          * @retval 無(wú)
          */
          unsigned int getHeighTime()
          {
          //在檢測(cè)外部電平之前,先將紅外檢測(cè)引腳拉高釋放
          IRD = 1;

          TH1 = 0;
          TL1 = 0;//重新清零
          TR1 = 1;//打開(kāi)定時(shí)器T1開(kāi)始計(jì)數(shù)
          while (IRD)
          {
          //進(jìn)行超時(shí)判斷,若高電平時(shí)間大于9ms,即引導(dǎo)碼時(shí)間,則直接退出
          if (TH1 > 0x40) //(0x40*256) * (12/11059200) s = 17.7ms
          {
          break;//退出
          }
          }
          TR1 = 0;//關(guān)閉計(jì)數(shù)

          return (TH1*256 + TL1);//返回IRD引腳持續(xù)的高電平時(shí)T1計(jì)數(shù)值
          }

          /**
          * @brief 獲取低電平時(shí)間(載波)
          * @param 無(wú)
          * @retval 無(wú)
          */
          unsigned int getLowTime()
          {
          //釋放IRD檢測(cè)引腳
          IRD = 1;
          TH1 = 0;
          TL1 = 0;//清零T1計(jì)數(shù)值
          TR1 = 1;//啟動(dòng)T1計(jì)數(shù)
          while (!IRD)
          {
          if (TH1 > 0x40) //TL1計(jì)數(shù)滿(mǎn)則進(jìn)位TH1,時(shí)間:TH1*256*12/11059200 s = 17.7ms
          { //時(shí)間大于了NEC協(xié)議的引導(dǎo)碼載波時(shí)間9ms,進(jìn)行強(qiáng)制退出,避免假等待
          break;
          }
          }
          TR1 = 0;//關(guān)閉計(jì)數(shù)

          return (TH1*256 + TL1);//返回低電平持續(xù)的計(jì)數(shù)值 每計(jì)數(shù)一次是一個(gè)機(jī)器周期的時(shí)間即1.08us
          }

          /**
          * @brief 外部中斷服務(wù),檢測(cè)紅外信號(hào)
          * @param 無(wú)
          * @retval 無(wú)
          */
          void ExINT_ISP() interrupt 2 //外部中斷1中斷標(biāo)號(hào)為2
          {
          unsigned int time;//時(shí)間
          unsigned char i, j;
          unsigned char byte = 0;

          time = getLowTime();//獲取低電平T1計(jì)數(shù)值,即引導(dǎo)碼的9ms載波
          if ((time < 7833) || (time > 8755)) //范圍8.5-9.5ms X=0.0085/(12/11059200)
          {
          //錯(cuò)誤引導(dǎo)碼
          IE1 = 0;//清零外部中斷標(biāo)志
          return;//退出中斷
          }
          //符合引導(dǎo)碼的9ms
          time = getHeighTime();//獲取高電平時(shí)間
          if ((time < 3686) || (time > 4608)) //范圍4ms-5ms
          {
          //不是4.5ms的空閑
          IE1 = 0;//清零外部中斷
          return;//退出中斷
          }
          //是正確的引導(dǎo)碼
          for (i = 0; i < 4; i++) //循環(huán)接收用戶(hù)碼 用戶(hù)反碼 鍵數(shù)值碼 鍵數(shù)值反碼
          {
          for (j = 0; j < 8; j++) //接收八位
          {
          //560us的載波(低電平)+560us的空閑(高電平) = 0 560us的載波(低電平)+1.68ms的空閑(高電平) = 1
          time = getLowTime();//載波時(shí)間
          if ((time < 322) || (time > 645)) //范圍350us-700us
          {
          IE1 = 0;//清零外部中斷標(biāo)志
          return;//退出中斷
          }
          time = getHeighTime();//空閑時(shí)間
          if ((time > 322) && (time < 645)) //560us的空閑
          {
          //bit 0
          byte >>= 1;//地位在前,先接收低位
          }
          else if ((time > 1198) && (time < 1658)) //1300us-1800us 1.68ms的空閑
          {
          //bit 1
          byte >>= 1;
          byte |= 0x80;//高位置1
          }
          else
          {
          //無(wú)效碼
          IE1 = 0;
          return;
          }
          }
          ircode = byte;//接收數(shù)據(jù)
          }
          //全部接收完畢
          irflag = 1;
          IE1 = 0;//清零外部中斷標(biāo)志位
          }


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(shù)專(zhuān)區(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); })();