在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

    
    
    <address id="vxupu"><td id="vxupu"></td></address>

      <pre id="vxupu"><small id="vxupu"></small></pre>
      <dfn id="vxupu"></dfn>
      <div id="vxupu"><small id="vxupu"></small></div>
    1. 新聞中心

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

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

      作者: 時間:2016-12-02 來源:網絡 收藏

      #include

      本文引用地址:http://www.biyoush.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ū)

      關閉