技术资料>其它单片机

红外遥控解码程序(用户码,用户反码,数据码,数据反码)

发布时间: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;           // 让定时器工作在方式28位自动重装

        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;

              }

       }

}