所有红外遥控器的解码方法
- 格式:doc
- 大小:93.50 KB
- 文档页数:2
所有红外遥控器的解码方法
已经完成了DS1302,18B20,RS232通讯,24C02存储,红外遥控等.现只将红外遥控的解码方法贴出,希望能与大家交流,起到抛砖引玉的作用.
我的开发环境是IAR FOR AVR 5.11, CPU为M8,晶振 11.0592.
红外遥控解码原理是通过AVR的输入捕获功能,捕获信号后进行宽度判断,并通过串口在电脑中显示出来.下面是捕获的程序,数据未经处理,只是捕获后进行编码的解码.通过这个捕获程序,原则上能解所有线外遥控编码,我已经解了格力和中星九B的遥控编码,代码未优化,只是测试.
#include
#include "MyDelay.h" //在此未提供我的延时程序,如果有需要的我再贴出
#include "MyUSART.h"//在此未提供我的串口配置程序,如果有需要的我再贴出
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
void ini(void)
{
//配置输入捕获
TCCR1A = 0x00;//普通端口模式,OC1A/B未连接
TCCR1B = 0x81;//位7与位6是输入捕获允许和触发方式,BIT2-0,分频选择
TCNT1H = 0x00;//计数器起始值高8位
TCNT1L = 0x00;//计数器起始值低8位
ICR1 = 0x0000;//输入捕获发生时,将该值写入TCNT
TIMSK |= 0x20;//输入捕捉中断使能 BIT5 =1
TIFR &= 0xdf;//输入捕捉标志,外部引脚 ICP1 出现捕捉事件时 ICF1置位
}
#pragma vector = TIMER1_CAPT_vect //定时器0溢出中断入口
__interrupt void TimeINT0(void)
{
uint r;
uchar h,l;
r = ICR1;//接收时序
if(TCCR1B &= 0x40) //更改触发方式
TCCR1B = 0x81; //下降沿触发
else
TCCR1B = 0xc1;//上升沿触发
TCNT1H = 0x00;//计数器起始值高8位
TCNT1L = 0x00;//计数器起始值低8位
TIFR |= 0x20;//输入捕捉标志,外部引脚 ICP1 出现捕捉事件时 ICF1置位
h = (uchar)(r>>8);
l = (uchar)r;
USART_Send(h); //串口显示高八位
USART_Send(l);//串口显示低八位
}
void main(void)
{
ini();
}
以下是由串口调试助手显示的数据.
说明:
1.时间未用,我的程序也通过串口显示了,
2.前两个字节无意义,是因为捕获到低电平后,16位计数器一直在计数,所以,前面的计数值无用.
3.编码原理不管是曼彻斯特_码/日立的通用红外编码/PT2272码等,差不多都由(异步) 码头+引导+编码+停止位组成,大同小异,所以根据这个原理,解出了上述数据的码头,引导和键编码.再根据解出的码画出频率图.
4.计算时要将显示的数据转换成10进制再计算.
5.未知部分估计是停止位,不过只要能检测到码头,引导和编码就可以了.
6.解码后,可以将该数据进行处理, 这时,这个遥控器就可以赋与功能,和开发板互动了.呵呵,
7.为什么选中九B,因为中9B的遥控器不用花钱,中9老是升级,好多客户都不用了,所以又省了10元钱,一块敷铜板的钱,哈哈哈.
8.题外话,中9想升级的可以和我交流,我已经升了很多了.
9.好,希望该方法可以帮助需要的朋友.