吃饱了,聊聊咱的红外遥控的编码和解码

libin200899   2011-5-16 22:09 楼主

红外线遥控是目前应用最广泛的一种通信和遥控手段。由于红外线遥控器具有体积小、功耗低、功能强、成本低等特点。因此在家电产品中有着广泛的应用。

相比与专用的控制芯片,微控制器具有开发灵活的特点,用户可以随意制定编解码格式。

 

但是,长期以来大家,特别是DIY爱好者对红外遥控的编码和解码原理和现实不太理解,以至于

 

无法根据自己的想法写出相应的程序,东奔西走,求爷爷告奶奶也无从得到,于是,今天在这里,咱们有心人开辟一个专题,来深刻地讨论,红外的编码和解码原理,以及实现程序,推而广之,电路的设计和电路图的分享。

 

    好了,废话不多说了。我就把我所知道的和盘托出吧,高手们不要吝啬拍砖啊。

 

    先说红外的编码吧:

 

一、    红外编码格式说明

用户采用红外模块时,编码格式非常灵活。目前市场上的红外编码格式非常多,每家公司都可以自己定义一种编解码格式。下面以一种比较常用的格式来做分析说明(示意图中高电平代表38K载波输出)

                                                图片1.jpg

                                                  

       上面的波形格式包括前导码(Load Code)、身份码和身份反码(ID Code)、数据码和数据反码(Data Code)。

引导码(Load Code:引导码用来通知接受器其后为遥控数据,解码部分在接受到这个信号后就可以开始解码。

系统码(ID Code: 系统码用来区分是哪一机型的数据,接收端依此来判断后续的数据是否为须执行的指令。

      数据码(Data code:  数据码用来区分是哪一个键被按下,接收端根据数据码做出应该执行什么动作的判断。

    数据帧间的空闲时间:有用信号中两帧数据间的空闲时间。

红外遥控数据传输系统中的关键是数据传输的可靠性。因此有些公司也会在系统码和数据码后面分别再传送一个同样的码或反码,供误码校验用。

    在红外遥控编码中数据位的格式一般如下图所示,通过低电平的时间不同,来区别01。在解码的时候既可以根据总的时间长度不同来解码,也可以根据低电平时间的不同来解码。

 

      图片2.jpg  

 

 

 

 

[ 本帖最后由 libin200899 于 2011-5-16 22:21 编辑 ]

回复评论 (40)

接上一话题接着说

二、 红外发射接收硬件电路部分

图片3.jpg

红外遥控的发射接收电路比较简单,其中接收电路可以使用集成红外接收器成品。接收器包括红外接收管和信号处理IC。接收器对外只有3个引脚:VccGND1个脉冲信号输出PO。与单片机接口非常方便,如图所示。

Vcc接系统的电源正极(+5V);

GND接系统的地线(0V);

脉冲信号输出接CPU的中断输入引脚。采取这种连接方法,软件解既可工作于查询方式,也可工作于中断方式。

但需要注意的两点:一是注意发射接收管的驱动电流;二是要注意接收部分的滤波措施,上图中C2就是用做稳定输出波形,但注意C2不可太大。

 

 

点赞  2011-5-16 22:15

接着说,大家可以随便砸砖啊!

一、    红外编码发射接收软件实现部分

1、    红外编码发射部分软件实现方法:

红外发射管需要靠38K的载波驱动,才能将信号发送出去。有的MCU没有BUZZER输出功能,不能靠硬件实现38K载波,就必须用软件模拟38K载波的输出。而我们SN8P25XXSN8P26XXS系列的BUZZER输出功能配合适当的震荡频率,可以很方便的实现38K载波的输出。

红外发射部分的软件实现一般可以分为两种:纯软件编码发射,计时器编码发射。

纯软件编码发射:根据编码格式,利用延时取得适当的时间段来控制载波的输出时间和输出间隔时间,达到编码正确发送的目的。这种方式思路简单容易实现,但比较浪费资源,实时性不高,也不利于程序的移植。

计时器编码发射:根据编码格式,采用计时器中断取得合适的时间段来控制载波的输出时间和输出间隔时间。这种方法充分利用了系统的资源,执行效率很高,并很容易实现程序的移植。

现采用SN8P2602A,外部晶振为3.58MHz所做的一款简单的遥控器,其编码发射流程图见图1图片4.jpg

1、    红外编码接收部分软件实现方法:

根据数据帧中不同的数据位格式和MCU中的资源,重要数据解码接收在程序设计中存在很大差别。一般有几种情况:纯软件解码、计时器解码、外部中断和计时器配合解码等。

纯软件解码:根据数据格式采用延时方式来取得合理的采样时间,每到达一次采样时间就测电平变化以确定解码数值。此种方法对MCU资源要求不高,无需计时器,也无需外部电平变换中断源,其实现方法也比较简单,并可以进行软件滤波处理。但此方法在解码过程中不能并行处理其他事,所以在比较复杂的系统中不推荐应用。

计时器解码:可以有两种思路来实现解码:一种方式是根据数据位格式利用计时器取得合理的采样时间,每达到一次采样时间就检测电平变化,根据在设定的时间内检测到高电平(或低电平)的次数来确定解码数值。另一种方法是累计电平变化的时间,计算两次电平变化之间的时间,再根据时间的长短来确定解码数值。

外部中断和计时器配合解码:利用外部中断的下降沿中断功能侦测编码信号的电平变化,利用计时器采样检测电平,累计时间以确定解码数值。此种方式效率高,解码灵敏,可以实现各种复杂系统中的准确解码。但在应用外部中断做信号变化侦测的时候,要注意外部干扰信号,需要在外部电路中做好滤波措施。

SONIXSN8P25XX,SN8P26XX系列中都有电平变化的外部中断源,因此非常适合各种编码格式的解码。下面为采用方式三解码的程序流程图,如下图。

图片5.jpg

图片6.jpg

 

 

 

 

点赞  2011-5-16 22:20
楼主快手,呵呵
人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
点赞  2011-5-16 23:55
我再补充一下,那个系统码是16位的,有效位为前面8位,后面8位为校验码,数据码也是16位的,有效位也是前面8位,后面8位为校验码,另外想说的是那个引导码过后要延时较长时间才到系统码,系统码和数据码之间没间隔,所以只要能判断引导码然后根据合适的延时就可以解码
人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
点赞  2011-5-17 00:01

回楼上

楼上的兄弟说得很对,引导码要与用户码相隔一段时间,如果不延时的话,可能解码部分会出错误,昨天我写了一个通过软件延时来实现红外发射的程序,结果就是因为引导码之后没有相应的延时而导致解码失败。
点赞  2011-5-18 18:34
顶一下,可惜啊!我现在还是没有明白改怎么编程序
邮箱:ternence.hsu@foxmail.com
点赞  2011-5-21 10:27

标题

犀利啊!研究的这么透彻!这么好的东西怎么没人顶?顶起来啊!
点赞  2011-5-22 01:52

回复 板凳 libin200899 的帖子

顶你!顶你!谢谢!
点赞  2011-5-22 11:23

回复 5楼 梦之旅 的帖子

强人,要是有51的就更好了,再附上程序
点赞  2011-6-3 09:23

回复 6楼 libin200899 的帖子

能否把发射接收程序传上来共享
点赞  2011-6-3 09:41
我对学习型的红外遥控接收单片机更感兴趣,因为身边的遥控器实在是太多了,总想多利用这些资源
点赞  2011-6-8 23:23
zailaixue再来学习一次 有学习到了新的东西
点赞  2011-6-9 10:03
最喜欢的就是这种讨论帖,比光发资料的好多了
点赞  2011-6-19 21:05
学习了,最近在搞IR
点赞  2011-6-24 07:19
强我呀
点赞  2011-6-24 12:38
强人呀
点赞  2011-6-24 12:38
LZ发射你做的有好远啊。。。。。。。。。
点赞  2011-7-2 14:12
我有点不明白的是:如果你用空调遥控器对着接收器发射。读进来的TTL电平是先引导码,然后身份码再数据码的吗?然后单片机记录高电平时间和低电平时间?
点赞  2011-8-5 15:36

能给51的程序么
点赞  2011-8-6 10:06
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复