红外遥控器的发送装置和接收装置以及关于载波等一些原理大家可参看《手把手教你学51单片机》文档第16章知识内容,这里笔者只简单说明如何运用该模块并讲解代码的实现。

1.接收装置

HS0038这个元器件是用来接收红外遥控器发送来的信号做处理的,我们知道红外遥控器有21个按键,按下不同的按键,HS0038的信号引脚就会产生不同的时序,我们解析这些时序就可以判断按下的是什么按键。

比如我们用红外遥控器对准开发板上的接收装置HS0038,按下左上角的按键,那么HS0038的信号引脚就会产生一系列的变化如下:

首先是引导码,也就是一开始HS0038信号引脚会拉低信号线9ms左右的时间,然后是4.5ms的高电平时间,这段时序叫做发送端的引导码。

接着HS0038信号引脚会接收到用户码,只要信号线被拉低560us之后又拉高560us的时间,那么我们就认为这段时序是这种字节的一位,为0。

如果信号线被拉低560us之后又拉高1.68ms的时间,那么这段时序就是代表1。

比如信号线的时序如下

HID语音遥控器 Android_HID语音遥控器 Android

这样我们就知道接收到的字节为0x0C。

0x0C是某个按键所发送的字节,我们要知道按键的发送有5个阶段,分别为:引导码、用户码、用户反码、按键数据码、按键数据反码。

引导码已经说明过它的时序。

然后是用户码,用户码一直是0x00,也就是HS0038信号引脚是如下所示

HID语音遥控器 Android_HID语音遥控器 Android_02

接着用户反码就是0xFF。

按键数据码如果是0x0C,那么按键数据反码就是0xF3。

0x0C:00001100

0xF3:11110011

2.代码的实现原理

在第八章第11讲我们已经学过输入捕获,那么解析红外遥控就是使用这种方式,看到宋老师的例程lesson16_1里面的函数“void EXINT1_ISR() interrupt 2”。

在main.c中“InitInfrared();”就是为输入捕获做好设置,只要信号引脚被拉低就会进入外部中断函数。

当我们在遥控器上按下某个按键时,信号引脚首先接收到的是引导码,也就是9ms的低电平+4.5ms的高电平,由于一开始接收到低电平所以就会进入“void EXINT1_ISR() interrupt 2”函数,函数里就是一关关的判断是否一开始接收到9ms低电平,如果是,那么又接着判断后面是不是产生4.5ms左右的高电平,如果是,接着就是进行判断后面的用户码、用户反码、按键数据码、按键数据反码的字节,并存入全局变量的数组ircode[4]中。