红外遥控解码程序(用户码,用户反码,数据码,数据反码)
发布时间:2018-04-09 浏览量:
标签:
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;
}
}
}