本帖最后由 skw168 于 2019-4-6 09:35 编辑
最近一段时间在研究解码红外无线信号,现将心得记录在此,欢迎探讨!
1.首先需要了解红外无线信号的组成:
a.引导码
整个引导码时间约为9+4.5ms
b.32位实际码
(包含地址码:8bit 地址反码:8bit 数据码:8bit 数据反码:8bit)
2.单片机如何识别
a.打开外部中断,下降沿触发
b.触发时,用定时器开始计时,下一个触发到来时,计时结束,判断这段时间,如果时间约为1.125ms,此位为0;如果时间约为2.25ms,此位为1;
c.依次保存触发时间间隔,组成32bit实际码值
d.校验用户码和数据码
注意事项:
①引导码为1位,时间约为13.5ms,可以单独判断
②连发码也需要判断
③码值保存过程中若发生异常,需要返回引导码重新判断
最后是程序基本框架:
void interrupt()
{
flag_rm = 1;
}
void timer0()
{
count++;
}
void main()
{
if(flag_rm)
{
flag_rm = 0;
if(count_rm == 0)
{
count_rm = 1;
}
else if(count_rm == 1)
{
此处识别引导码;
count_rm = 2;
}
else if(count_rm == 2)
{
此处识别用户码的每一位;
依次保存32位数据;
接收完成后,开始校验用户码;
count_rm = 0;
}
}
}
PS:
2019年4月6日 09:32:05
今日发现一个新问题,在定时器中断里面计数时,不能被其他中断干扰,否则计数值会不准,影响解码
|