所有红外遥控器的解码方法

  • 格式:doc
  • 大小:93.50 KB
  • 文档页数:2

下载文档原格式

  / 2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

所有红外遥控器的解码方法

已经完成了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.好,希望该方法可以帮助需要的朋友.