第20页 共43页
}
}
{ }
//定时器1关闭计数
RX_flag = 0; break;
TR1=0;
PW_data[PW_pt++] = TH1;//定时器1计数值,负脉宽计数值 PW_data[PW_pt++] = TL1; TH1 = 0; TL1 = 0;
//清零
//步骤五:对功能码的测量。 PW_pt = 0;//调整指针值
for (u8_i=0; u8_i<16; u8_i++)//功能码------这里有16个脉冲,用掉64个存储单元
//步骤六:假如数据已经传完,结束帧是怎么样的。
for (u8_i=0; u8_i<2; u8_i++)//功能码------这里有16个脉冲,用掉64个存储单元
下来。
/
if (Head_flag) { } EX0=1; }
4.2.2数据压缩编码
在软件设计时采用了脉宽测量技术,但在数据存储时发现数据占用的内存容量太大,读写EEPROM时间很长,应寻求一种数据无损压缩的方法,既可降低内存和E PROM占用容量,又能提高系统运行速度。经研究发现,尽管各种被控设备存在标准不一,帧格
//数据处理部分:对数据帧的正脉宽判断,是0还是1。同时把数据和脉宽值存
Data_Process();
第21页 共43页
式、码型、编码长短、发送方式不同等问题,但对于某一个特定的被控设备还是有一定的规律,即表示“0”和“1”的方式在一个设备中是相同的。在系统设计时,只要选择合理的设计方案,就能解决这个问题。通过对不同被控设备的红外遥控命令进行分析,发现长的遥控信号为150 ms,这样最多的高低信号码的数据可达数百个。
数据压缩编码部分程序设计:
/********************************************************************** ** 函数名称:Data_Process ** 入口参数: 缓冲区 ** 出口参数: 缓冲区
** 功能描述:处理脉宽缓冲数据
**********************************************************************/ void Data_Process(void)
{
uchar i;
uint L_time=0, H_time=0, temp;
write_com(0x80+0x40+12);//地址 //write_date('W'); //write_date('I');
EndBit=0; System_Code = 0;
//系统码 //功能码 //功能反码
Funtion_Code = 0; length=4;
//先存好数据低脉冲的脉宽。 //L_time = PW_data[4]; //L_time <<= 8; //L_time |= PW_data[5]; //算好系统码 for(i=0; i<26; i++) {
L_time = PW_data[length]; L_time <<= 8;
L_time |= PW_data[length+1];
Funtion_Anti_Code = 0;
第22页 共43页
}
H_time = PW_data[length+2]; H_time <<= 8;
H_time |= PW_data[length+3];
if (H_time>L_time) { } else { }
length = length + 4;
System_Code=(System_Code<<1);// //length++;
HZ_time = PW_data[length+2]; LZ_time = PW_data[length+3]; temp = H_time - L_time; if (temp>COMP_NUM)//\{ } else { }
System_Code=(System_Code<<1);// //length++;
HZ_time = PW_data[length+2]; LZ_time = PW_data[length+3];
System_Code=(System_Code<<1)|0x00000001;// //length++;
HO_time = PW_data[length+2]; LO_time = PW_data[length+3];
//算出功能码 length = 0; EndBit = 0; for(i=0; i<8; i++)
第23页 共43页
{
L_time = PW_data2[length++]; L_time <<= 8;
L_time |= PW_data2[length++]; H_time = PW_data2[length++]; H_time <<= 8;
H_time |= PW_data2[length++]; if (H_time>L_time) { } else {
Funtion_Code=(Funtion_Code<<1);// temp = H_time - L_time; if (H_time>5000) { }
if (temp>COMP_NUM)//\{ } else { }
Funtion_Code=(Funtion_Code<<1);//
Funtion_Code=(Funtion_Code<<1)|0x00000001;// EndBit = 1;
//结束码高电平
PW_data[16] = PW_data2[length-2];//高位 PW_data[17] = PW_data2[length-1];//低位
第24页 共43页
}
}
//算出功能反码 for(i=0; i<8; i++) { } length = 0; //显示功能码
L_time = PW_data2[length++]; L_time <<= 8;
L_time |= PW_data2[length++]; H_time = PW_data2[length++]; H_time <<= 8;
H_time |= PW_data2[length++]; if (H_time>L_time) { } else { }
Funtion_Anti_Code=(Funtion_Anti_Code<<1);// temp = H_time - L_time; if (temp>COMP_NUM)//\{ } else { }
Funtion_Anti_Code=(Funtion_Anti_Code<<1);//
Funtion_Anti_Code=(Funtion_Anti_Code<<1)|0x00000001;//