通常的红外遥控器是将二进制脉冲码调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去。
以下是常用的红外接收头的实物
发送数据格式
起始码是一个9ms的低电平,4.5ms的高电平,紧随其后的为数据码。
数据码‘ 0 ’和 ‘ 1 ’表示方法如下:
程序根据起始码和数据码的高低电平时间特征进行程序判断即可顺利解码,在实际应用中我们需要进行中容错处理,将时间增加或减少一定数量,防止实际产品中的误差而产生错误。
对于单片机来说,读取IO电平时间是一个比较基础的操作。
下面的代码利用单片机IO中断,再读取IO定时器计数值的方法来获取IO变化时间,最后通过时间按照IR数据时间来解码。
其实还有很多种方法都可以实现此功能,比如用单片机的定时器的捕获功能,获取IO变化时间。还可以用一个定时器中断,固定时间读IO的电平状态来判断时间达到解码目的。
最简单的方法是利用带IR解码功能的单片机,直接读取IR数据。
IR发射只需按照编码时间控制IO变化再进行输出即可。
IR接收解码代码如下:
void main(void)
{
//程序使用一个定时器来计时。在IO变化时产生中断,来读取定时器的计数值。
TMOD = 0x01;//打开定时器1,
TR0 = 0; //关闭允许定时器1
IT0 = 1;
EX0 = 1; //开外部中断1,下降沿触发,注意与单片机IO对应。
EA = 1; //开总中断
while (1)
{
if (InFrared_Way == 1) //判断是否接收到红外信号,若是能接收到信号,则进入函数。
{
EX0 = 0; //关闭外部中断。
TR0 = 1; //允许定时器1