五月丁香激情综合免费视频_国产精品自产拍在线播放桃_午夜福利视频不卡a_免费在线观看亚洲视频_亚洲欧美精品丝袜一区区_国产情趣酒店鸳鸯浴在线观看_亚洲大片久久精品_巜朋友的人妻之诱感人妻

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

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;

              }

       }

}