<object id="k0taz"><form id="k0taz"></form></object>
<pre id="k0taz"></pre>
      1. <table id="k0taz"></table>
        <bdo id="k0taz"><center id="k0taz"></center></bdo>
        <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>
        專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        紅外遙控器單片機編碼程序加詳解

        作者:佚名   來源:不詳   點擊數:  更新時間:2014年08月17日   【字體:

         

         
         
        void IR_IN() interrupt 0 using 0   //采用12MHz晶振
        {
          unsigned char j,k,N=0;
             EX0 = 0;   //初始化,關閉外中斷
          delay(15);
          if (IRIN==1) //沒有脈沖到來高電平
             { EX0 =1;   //默認狀態下開中斷,尋找9ms引導脈沖
            return;
           }
                                   //確認IR信號出現
          while (!IRIN)            //等IR變為高電平,跳過9ms的前導低電平信號。
            {delay(1);}      //單片機接收電平與遙控器電平完全相反,delay(1)延時0.14ms
         
         for (j=0;j<4;j++)         //收集四組數據
         {
          for (k=0;k<8;k++)        //每組數據有8位
          {
           while (IRIN)            //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
             {delay(1);}
            while (!IRIN)          //等 IR 變為高電平(0.56ms)
             {delay(1);}
             while (IRIN)           //計算IR高電平時長
              {
            delay(1);
            N++;          
            if (N>=14)    //大于1.685ms高電平長度,為了保證可靠性N=14
          { EX0=1;    //(2.25/0.14=16,1.685/0.14=12,0.565/0.14=4)
          return;}                  //0.14ms計數過長自動離開,重新判斷。
              }                        //高電平計數完畢               
             IRCOM[j]=IRCOM[j] >> 1;                  //數據最高位補“0”
             if (N>=6) {IRCOM[j] = IRCOM[j] | 0x80;}  //大于0.565ms高電平長度,N=6,7,8(1.685/2)都行,判斷為“1”,數據最高位補“1”
             N=0;
          }//end for k
         }//end for j
          
           if (IRCOM[2]!=~IRCOM[3])     數據碼與數據反碼相反,繼續執行,否則,數據出錯。返回,重新判斷。
           { EX0=1;
             return; }
         
           IRCOM[5]=IRCOM[2] & 0x0F;     //取鍵碼的低四位
           IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位變為低四位
         
           if(IRCOM[5]>9)
            { IRCOM[5]=IRCOM[5]+0x37;}    //轉換成相應的ASCII碼,送1602顯示。
           else
           IRCOM[5]=IRCOM[5]+0x30;
         
           if(IRCOM[6]>9)
            { IRCOM[6]=IRCOM[6]+0x37;}
           else
           IRCOM[6]=IRCOM[6]+0x30;
         
             lcd_pos(0x4b);            
             lcd_wdat(IRCOM[6]);        //第一位數顯示
             lcd_pos(0x4c);              
             lcd_wdat(IRCOM[5]);        //第二位數顯示
         
             beep();
             EX0 = 1;      //開中斷,繼續判斷
        }
         
        關閉窗口
        欧美国产伦久久久久_亚洲爽爽一区二区三区_一色屋精品视频在线观看免费_久久伊人成色777综合网
        <object id="k0taz"><form id="k0taz"></form></object>
        <pre id="k0taz"></pre>
          1. <table id="k0taz"></table>
            <bdo id="k0taz"><center id="k0taz"></center></bdo>
            <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>