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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 通過串口發(fā)送紅外遙控器的解碼值到PC

          通過串口發(fā)送紅外遙控器的解碼值到PC

          作者: 時間:2016-12-02 來源:網(wǎng)絡 收藏

          #include

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

          sbit IRD = P3^3;//紅外接收檢測端口

          bit irflag = 0;//接收到數(shù)據(jù)的標志
          unsigned char ircode[4];//存放紅外遙控器發(fā)送的用戶碼,用戶碼反碼 鍵碼 鍵碼反碼

          /**
          * @brief 紅外配置
          * @param 無
          * @retval 無
          */
          void ConfigInfrared()
          {
          TH0 = 0;
          TL0 = 0;//清零T0計數(shù)
          TMOD &= 0xF0;
          TMOD |= 0x01;//T0方式1
          TR0 = 0;//在沒有紅外信號之前先關閉T0
          ET0 = 0;//只用T0的計數(shù)

          //外部中斷1
          IT1 = 1;//設置外部中斷觸發(fā)方式為下降沿觸發(fā)
          EX1 = 1;//開啟外部中斷1
          }

          /**
          * @brief 獲得IRD紅外檢測引腳的高電平時間(空閑時間)
          * @param 無
          * @retval 高電平持續(xù)的計數(shù)值
          */
          unsigned int getHeighTime()
          {
          //在檢測外部信號前,必須先將IRDIO口拉高
          IRD = 1;
          TH0 = 0;
          TL0 = 0;//清零T0計數(shù)
          TR0 = 1;//開啟T0計數(shù)

          while (IRD) //持續(xù)高電平
          {
          //超時判斷
          if (TH0 > 0x40) //當IRD持續(xù)高電平時間17.7ms,遠遠大于引導碼的9ms,是誤碼
          {
          break;//退出
          }
          }
          TR0 = 0;//停止計數(shù)

          return (TH0*256 + TL0);//返回高電平計數(shù)值
          }

          /**
          * @brief 獲得IRD紅外檢測引腳的低電平時間(載波時間)
          * @param 無
          * @retval 低電平持續(xù)的計數(shù)值
          */
          unsigned int getLowTime()
          {
          IRD = 1;//釋放IRD,檢測外部信號
          TH0 = 0;
          TL0 = 0;//清零T0計數(shù)
          TR0 = 1;//開始計數(shù)

          while (!IRD) //持續(xù)低電平
          {
          if (TH0 > 0x40) //超過18ms就是誤碼,錯誤信號
          {
          break;
          }
          }
          TR0 = 0;//停止計數(shù)

          return (TH0*256 + TL0);//返回低電平計數(shù)值
          }

          /**
          * @brief 外部中斷1服務程序,檢測紅外信號
          * @param 無
          * @retval 無
          */
          void EXINT_ISP() interrupt 2 //外部中斷標號2
          {
          unsigned char byte;//接收數(shù)據(jù)
          unsigned char i, j;
          unsigned int time;//時間

          time = getLowTime();//獲得載波時間
          if (time < 7833 || time > 8755) //引導碼載波是9ms,這里規(guī)定在8.5ms-9.5ms之間是9ms的載波
          {
          //范圍之外,誤碼
          IE1 = 0;//清零外部中斷1中斷標志,為下一次再進入中斷
          return;//退出中斷
          }
          //否則是9ms的載波
          time = getHeighTime();//空閑時間
          if (time < 3686 || time > 4608) //引導碼的空閑時間4.5ms 這里規(guī)定4ms-5ms是4.5ms的空閑
          {
          IE1 = 0;//清零中斷標志
          return;//退出中斷
          }
          //否則是4.5ms的空閑
          //開始接收用戶碼和鍵碼等
          for (i = 0; i < 4; i++)
          {
          for (j = 0; j < 8; j++)
          {
          time = getLowTime();//載波
          if (time < 423 || time > 608) //560us的載波和560us的空閑是0 范圍460us-660us
          {
          IE1 = 0;
          return;
          }
          //560us載波
          time = getHeighTime();
          if (time > 423 && time < 608) //560us空閑
          {
          //bit 0
          byte >>= 1;//低位在前,移入一位0
          }
          else if (time > 1198 && time < 1658) //1.68ms的空閑是1 范圍 1300us-1800us
          {
          //bit 1
          byte >>= 1;//移入一位
          byte |= 0x80;//移入的一位置1
          }
          else
          {
          //誤碼
          IE1 = 0;
          return;//退出中斷
          }
          }
          ircode = byte;
          }
          //接收完成
          irflag = 1;

          //退出中斷時清零中斷標志
          IE1 = 0;
          }


          上一頁 1 2 下一頁

          評論


          技術專區(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); })();