考虑了另外一种解码方法,解码程序在定时中断中执行,定时中断设置成200us中断,在中断程序中扫描I/O,测量遥控信号低电平和高电平的时间。有几个关键变量:ir_ltime-低电平时间,ir_htime-高电平时间,bit_over-位变量,指示一位数据是否处理完。
RC6格式的0,1波形如下:
1位数据“<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0”“1”的周期是888us,高低电平分别是444us,奇偶位的周期是2*888us,高低电平分别是2*444us。
分析RC6格式,可以得到下面的规律,就是解码原理:
1、 如果低电平是窄的,且bit_over=1,那么bit_over=0,当前位为1,ir_bit++。
2、 如果低电平是窄的,且bit_over=0,那么bit_over=1,其它不做处理。
3、 如果低电平是宽的,且bit_over=1,是错误码。
4、 如果低电平是宽的,且bit_over=0,那么bit_over=0,当前位为1,ir_bit++。
5、 如果高电平是窄的,且bit_over=1,那么bit_over=0,当前位为0,ir_bit++。
6、 如果高电平是窄的,且bit_over=0,那么bit_over=1,其它不做处理。
7、 如果高电平是宽的,且bit_over=1,是错误码。
8、 如果高电平是宽的,且bit_over=0,那么bit_over=0,当前位为0,ir_bit++。
9、 奇偶校验位的电平宽度是其他位电平宽度的2倍,在程序中单独处理。
解码程序如下:
/*
定时器0中断函数
中断间隔:200us
*/
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
void Isr_Timer0()
{
shift_ir:
if(ir_shift_flag)
{
ir_shift_flag = 0;
_rlc(&ir_data0);
_rlc(&ir_data1);
_rlc(&ir_data2);
if(ir_bit >= 21)
{
if((ir_usercode == ir_data1) && (ir_value == ir_data0))
{
ir_ok = 1;
}
else
{
ir_usercode = ir_data1;
ir_value = ir_data0;
}
err_ir:
ir_head = 0;
ir_bit = 0;
ir_data0 = 0;
ir_data1 = 0;
ir_data2 = 0;
bit_over = 0;
ir_shift_flag = 0;
}
return;
}
ir_ltime++;
ir_htime++;
if(IR_IN)
{
if(!ir_pin_level)
{
ir_pin_level = 1; //ir电平从低变高
ir_ltime_temp = ir_ltime;
ir_htime = 0;
if(ir_head)
{
if(ir_ltime > 3)
{
if(bit_over)
goto err_ir;
else
{
if(ir_bit == 5)
{
if(ir_ltime > 5) //判断奇偶位为0时的低电平
{
_c = 1;
ir_bit++;
ir_shift_flag = 1;
goto shift_ir;
}
else
{
bit_over = 1;
}
}
else
{
_c = 1;
ir_bit++;
ir_shift_flag = 1;
goto shift_ir;
}
}
}
else
{
if(bit_over)
{
bit_over = 0;
_c = 1;
ir_bit++;
ir_shift_flag = 1;
goto shift_ir;
}
else
bit_over = 1;
}
}
}
}
else
{
if(ir_pin_level)
{
ir_pin_level = 0; //ir电平从高变低
ir_htime_temp = ir_htime;
ir_ltime = 0;
if(ir_head)
{
if(ir_htime > 3)
{
if(bit_over)
{
if(ir_bit == 4)
{
bit_over = 0; //判断奇偶位是0时的高电平
_c = 0;
ir_bit++;
ir_shift_flag = 1;
goto shift_ir;
}
else
goto err_ir;
}
else
{
if(ir_bit == 5)
{
if(ir_htime < 5) //判断奇偶校验位是1时的高电平
{
bit_over = 1;
}
else
{
_c = 0;
ir_bit++;
ir_shift_flag = 1;
goto shift_ir;
}
}
else
{
_c = 0;
ir_bit++;
ir_shift_flag = 1;
goto shift_ir;
}
}
}
else
{
if(bit_over)
{
bit_over = 0;
_c = 0;
ir_bit++;
ir_shift_flag = 1;
goto shift_ir;
}
else
bit_over = 1;
}
}
else
{
if((ir_ltime_temp > 11) && (ir_ltime_temp < 16))
{
ir_head = 1; //检测到头码
bit_over = 1;
}
else
goto err_ir;
}
}
}
}
这种解码方式占用单片机资源少,而且灵敏度高,不会因为遥控波形的高低电平时间的少量偏差检测到误码。
用户1035191 2010-1-6 09:12
用户1323229 2010-1-5 23:36
用户1035191 2010-1-4 10:05
用户1323229 2010-1-1 02:38