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

          新聞中心

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

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

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

          #include

          本文引用地址:http://cafeforensic.com/article/201612/324709.htm

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

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

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

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

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

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

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

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

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

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

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

          time = getLowTime();//獲得載波時(shí)間
          if (time < 7833 || time > 8755) //引導(dǎo)碼載波是9ms,這里規(guī)定在8.5ms-9.5ms之間是9ms的載波
          {
          //范圍之外,誤碼
          IE1 = 0;//清零外部中斷1中斷標(biāo)志,為下一次再進(jìn)入中斷
          return;//退出中斷
          }
          //否則是9ms的載波
          time = getHeighTime();//空閑時(shí)間
          if (time < 3686 || time > 4608) //引導(dǎo)碼的空閑時(shí)間4.5ms 這里規(guī)定4ms-5ms是4.5ms的空閑
          {
          IE1 = 0;//清零中斷標(biāo)志
          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;

          //退出中斷時(shí)清零中斷標(biāo)志
          IE1 = 0;
          }


          上一頁 1 2 下一頁

          評(píng)論


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

          關(guān)閉