实现代码:
#include
// --- 红外接收一体化输出口 ----------------------------------
sbit IR_Out = P3^2;
bit START_Flag = 0;
bit BOOT_REPEATING_CODE_Flag = 0;
unsigned char DATA[4] = {0};
bdata unsigned char TEMP_BIT;
sbit B0 = TEMP_BIT^0;
sbit B1 = TEMP_BIT^1;
sbit B2 = TEMP_BIT^2;
sbit B3 = TEMP_BIT^3;
sbit B4 = TEMP_BIT^4;
sbit B5 = TEMP_BIT^5;
sbit B6 = TEMP_BIT^6;
sbit B7 = TEMP_BIT^7;
// --- 有无遥控信号判断函数 ----------------------------------
bit START_Judge();
// --- 连发码判断函数 ----------------------------------------
bit BOOT_REPEATING_CODE_Judge();
// --- "0"和"1"识别 ------------------------------------------
bit H_L_LEVEL_Judge();
bit START_Judge()
{
bit TEMP_Flag = 1;
unsigned char i = 0;
//在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
while ( IR_Out == 1);
//重复10次,目的是检测在6876~8352微秒内如果出现高电平就退出解码程序
for(i =0;i<9; i++)
{
DELAY_Us(800); // 测试实际延时约为764~928us
if ( IR_Out == 1 )
{
TEMP_Flag = 0;
break;
}
}
return TEMP_Flag;
}
bit BOOT_REPEATING_CODE_Judge()
{
bit TEMP_Flag = 1;
while( IR_Out == 0 ) ; // 等待高电平避开9毫秒低电平引导脉冲
DELAY_Ms(1); // 测试实际延时约为1.007ms
DELAY_Ms(1); // 测试实际延时约为1.007ms
DELAY_Us(200); // 0.086ms
DELAY_Us(200); // 0.086ms
DELAY_Us(200); // 0.086ms
// 共计2.272ms
if( IR_Out == 0 )
{
TEMP_Flag = 1; // 是连发码
}
else
{
TEMP_Flag = 0; // 不是连发码,而是引导码
}
return TEMP_Flag;
}
bit H_L_LEVEL_Judge()
{
while( IR_Out == 0 ); // 等待地址码第一位的高电平信号
DELAY_Us(800); // 测试实际延时约为764~928us
if ( IR_Out == 1)
{
DELAY_Ms(1); // 测试实际延时约为1.007ms
return 1;
}
else
{
return 0;
}
// --- 串口初始化 --------------------------------------------