• 歡迎光臨東莞市飛江電子科技有限公司官網!
    全國咨詢熱線

    13926563901

    18925580829

    飛江淘寶店鋪

    首頁>技術資料>其它單片機

    紅外遙控解碼程序(用戶碼,用戶反碼,數據碼,數據反碼)

    發布時間:2018-04-09   瀏覽量:

    紅外遙控解碼程序(用戶碼,用戶反碼,數據碼,數據反碼)

    (2014-12-06 20:56:41)
    轉載
    標簽:

    it

     

    #include

    #include

     

    typedef unsigned char uChar8;

    typedef unsigned int uInt16;

     

    bit IR_OK;

    bit Pro_OK;

    sbit SEG_SELECT = P2^7;

    sbit BIT_SELECT = P2^6;

    sbit IR = P3^2;             //紅外接口

     

    uChar8 g_IR_Time = 0;

    uChar8 HL_PeriodArr[33] = {0};

    uChar8 IRCord[4] = {0};

     

    //void LedDisplay(void)

    //{

    //    

    //}

     

    void IR_Pro(void)                // 將時間値轉換為邏輯電平

    {

           uChar8 ujVal;

           uChar8 uiVal; 

           uChar8 TL_Time;

           uChar8 ByteVal;

           uChar8 uNum = 1;        // 避開第一個元素(引導碼)

           for(uiVal = 0; uiVal < 4; uiVal++)        //四個字節(用戶碼、用戶反碼、數據碼、數據反碼)的數據

           {

                  for(ujVal = 0; ujVal < 8; ujVal++)

                  {

                         TL_Time = HL_PeriodArr[uNum];

                         if(TL_Time > 6)            // 我們以中間値(1.685ms)作為判斷標準,說明是邏輯“1

                                ByteVal |= 0x80;

                         else

                                ByteVal = ByteVal;        // 說明為邏輯“0

                         if(ujVal < 7)

                         {

                                ByteVal >>= 1;

                         }

                         uNum++;              // 判斷下一個

                  }

                  IRCord[uiVal] = ByteVal;

                  ByteVal = 0x00;    

           }

           if(IRCord[2] == ~IRCord[3])

           {

                 

                  Pro_OK = 1;          // 處理工作完成  

           }

    }

     

    void Time0_Init(void)

    {

            TMOD |= 0x02;           // 讓定時器工作在方式2,8位自動重裝

            TH0 = 0;

            TL0 = 0;

            TR0 = 1;              // 啟動定時器0

            ET0 = 1;

     

    }

     

    void EX0_Init(void)

    {

           IT0 = 1;                       // 下降沿觸發

           EX0 = 1;                      // 開外部中斷

           EA  = 1;                            // 開總中斷

    }

     

    void UART_Init(void)

    {

           TMOD &= 0x00;          //清空定時器1

           TMOD |= 0x21;            //定時器1工作于方式2

           TH1 = 0xfd;                 //為定時器1賦初值

           TL1 = 0xfd;                  //等價于將波特率設置為9600

           ET1 = 0;               //防止中斷產生不必要的干擾

           TR1 = 1;               //啟動定時器1

           SCON |= 0x40;             //串口工作于方式1,不允許接收

    }

     

    void main (void)

    {

           UART_Init();

           EX0_Init();

           Time0_Init();

           while(1)

           {

                  if(IR_OK)             // 說明解碼完成

                  {

                         IR_OK = 0;

                         IR_Pro();              // 處理時間値

                  }

                  if(Pro_OK)

                  {

                         Pro_OK = 0;

                         TI = 1;

                         printf("\n");

                         printf("     YuanQuan \n");

                         printf("          努力!     ");

                         printf("%x--%x--%x--%x\n",(uInt16)IRCord[0], (uInt16)IRCord[1], (uInt16)IRCord[2], (uInt16)IRCord[3]);

                         while(!TI); TI = 0;

                  }

                  //LedDisplay(IRCord);

           }

    }

     

    void Timer0_ISR(void) interrupt 1

    {

           g_IR_Time++;              // 每過256 * 12/11.0592)us

    }

     

     

    void EX0_ISR(void) interrupt 0          // 34個下降沿存儲完畢,這樣紅外解碼完成

    {

           // 存時間値到HL_PeriodArr[33]

           static uChar8 uCounter;                       // 計數,范圍為0~32

           static bit StartFlag = 0;

     

           if(!StartFlag)                // 第一個下降沿,表示解碼開始

           {

                  StartFlag = 1;

                  g_IR_Time = 0;

           }

           else if(StartFlag)           // 從第二個開始一直到第33個下降沿

           {

                  if((g_IR_Time < 50) && (g_IR_Time >= 32))           // 則說明這里是引導碼

                         uCounter = 0;

                  HL_PeriodArr[uCounter] = g_IR_Time;             // 存的是時間値

                  g_IR_Time = 0;            // 為下次存値做準備

                  uCounter++;

                  if(33 == uCounter)        // 說明33次已經存夠了

                  {

                         uCounter = 0;

                         IR_OK = 1;           // 真正的存時間的任務已經完成

                         StartFlag = 0;

                  }

           }

    }

    黑人粗大无码AV人妻一区