您当前的位置:首页 > 百科

单片机红外遥控程序 单片机如何通过捕获来实现对红外遥控器解码

时间:2023-02-09 07:38:01

单片机红外遥控程序 单片机如何通过捕获来实现对红外遥控器解码

一、执行摘要

介绍了单片机动态扫描驱动数码管的应用,并给出了实例。本次讲座将重点介绍单片机如何通过捕捉来解码红外遥控器。通过本讲座,读者可以掌握红外遥控器的编码原理,以及单片机如何对遥控器进行解码。

二、原理介绍

随着家用电器和视听产品的普及,红外遥控器已经广泛应用于各类家用电器(如遥控开关、智能开关等)中。).它具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也有广泛的应用。

一般来说,一般的红外遥控系统由发射和接收两部分组成,如图1所示:

图1红外遥控系统框图

发射部分主要包括键盘矩阵、编码调制和红外发射管;接收部分包括光电信号转换、放大、解调和解码电路。举个例子,一般来说,我们的家电遥控器的信号传输是将相应按键对应的控制指令和系统码(由0和1组成的序列)调制在32~56kHz范围内的载波上,然后放大驱动红外发射管发射信号。另外,目前流行的控制方式是利用编解码ASIC芯片(下面提到的SAA3010红外编码芯片和HS0038红外接收器)实现的。

不同公司的遥控芯片使用不同格式的遥控代码。这里介绍两个广泛使用的标准,一个是NEC协议的PWM(脉宽调制)标准,一个是飞利浦RC-5协议的PPM(脉冲位置调制)标准。

NEC标准:遥控载波频率38kHz(占空比1:3);当按下一个键时,系统首先发送一个完整的完整代码,然后经过一段延迟后发送一系列简化代码,直到松开该键。简化码以108ms的延迟重复,即两个导频脉冲上升沿之间的间隔为108 ms,完整的完整码如图2所示。

图NEC标准下的完整代码表示

其中,导频码高电平为4.5ms,低电平为4.5 ms用户码8位,数据码8位,共32位;数据0可以用“高电平0.56ms+低电平0.56 ms”表示,数据1可以用“高电平0.56 ms+低电平1.68ms”表示,如图3所示。一个简单的码可以相当于导频码、系统码位0的补码和结束位的高电平的时间之和(0.56ms)。

图NEC标准下数据0和1的表示

飞利浦标准:载频38 kHz没有简化的代码。按下该键时,控制代码在1和0之间切换。如果连续按下该键,控制代码保持不变。一个完整的代码可以等于起始代码、控制代码、系统代码和数据代码的时间总和,如图4所示。

图4飞利浦标准下的完整代码表示

数据0是“低电平0”。889 ms+高水平0。889ms”。

代表;数据1是“高电平0”。889 ms+低电平0。

889毫秒”(图5)。连续码的重复延迟是114毫秒

图5飞利浦标准下数据0和1的表示

本次讲座使用的是红外遥控器SAA3010(见图6(a)),它符合通用飞利浦标准中的RC-5编码格式,其帧码序列由2位控制码、1位翻转码、5位地址码、6位数据码和结束码组成。其数据位时间长度为1.688 ms,连续码的重复延迟为108ms,即每一个键一直按下时,延迟108ms后输出同一帧数据。

图6(a)SAA 3010遥控器的外观(b)SAA 3010的数据位(c)SAA 3010的数据重复周期。

从图6可以看出,SAA3010的位传输模式是双相的,位1和位0的相位正好相反。解码时,可以通过定时采样进行解码。一个比特采样两次,分别以比特波形的四分之一和四分之三采样。如果位1以这种方式采样,则值为0和1。当然也可以只采样一次,比如在波形的四分之一处,然后在波形的某个周期再次采样,这样bit 1采样的值就是0(本例采用的就是这种方法)。

三、电路详情

如图7 (a)所示,红外接收器的解码电路非常简单,并且采用了集成的红外接收器。集成红外接收器集遥控信号的接收、放大、检测、整形于一体,输出单片机能识别的TTL信号,大大简化了接收电路的复杂程度和电路的设计工作,使用方便。本次讲座使用的是红外集成接收器HS0038,其外观如图7(b)所示。采用黑色环氧树脂封装,不受阳光、荧光灯等光源干扰,内部有磁屏蔽,功耗低,灵敏度高。在用小功率发射管传输信号的情况下,接收距离可以达到30m。它可以兼容TTL和COMS电路。HS0038为垂直侧光接收型。它接收频率为38 kHz、周期约为26 s的红外信号,同时对信号进行放大、检波和整形,得到TTL级编码信号。

图7 (a)红外接收器(b) HS0038解码电路外观图。

它的三个管脚分别是地、电源正极和解调信号输出端。

为了响应速度,红外接收器的解码信号输出连接到单片机的P3.3(外部中断1)端口,这样一旦输出红外解码信号,就可以触发中断。此外,电容器C7用于电源去耦滤波,以确保红外接收器的稳定工作。

四、编程

本次讲座设计的核心程序如下:

无效时间0()中断1 ( 1)

bit in=~ IR _ Input( 2)

TH0=0XFF( 3)

TL0=0X83( 4)

IR _ Data[IR _ sign]=IR _ Data[IR _ sign]| in;( 5)

IR _ count( 6)

if(IR_count==1 || IR_count==2) ( 7)

{

if(in==0) ( 8)

{

TR0=0;( 9)

EX1=1;( 10)

返回;( 11)

}

}

if(IR_count==3) ( 12)

{

IR _ sign=1;( 13)

}

else if(IR_count==8) ( 14)

{

if(IR_Data[1]!=0) ( 15)

{

TR0=0;( 16)

EX1=1;

返回;

}

IR _ sign=2;( 17)

}

else if(IR_count==14) ( 18)

{

IR _ sign=3;( 19)

}

else if(IR_sign==3) ( 20)

{

TR0=0;( 21)

IR _ Success();( 22)

返回;( 23)

}

其他

红外数据[红外信号]=红外数据[红外信号]《1;( 24)

程序的详细描述:

(1)定时器中断0服务功能,红外接收器解码数据后触发定时器中断,触发外部中断1,从而进行抓拍解码。

(2)解码时将载频改为低电平,即低电平实际为1,高电平实际为0。

(3)设置定时器0的高八位初始值,因为时间长度应该是一个数据位周期。

(4)设置定时器0的低八位的初始值。经过实测,SAA3010的位时间约为1.655 ms。

(5)将红外数据放入最低处。

(6)红外计数不中断一次,加1。

(7)如果是第一次和第二次进入定时器中断。

(8)如果此时in的值为0,即发现前两位不全是1。

(9)关闭定时器0。

(10)重新打开外部中断进行接收。也就是说,前两位数字必须都是1。

(11)退出和返回。

(12)如果接收到开始位(2位)和控制位(1位)。

(13)设置IR _ sign为1,即将接收到的红外系统码放入IR_Data[1]中。

(14)如果当前计数达到第八次,则接收5位系统码。

(15)如果接收的系统代码不为0,则要求所有系统代码都为0才是正确的。

(16)关闭定时器,重启外部中断并返回。

(17)将IR _ sign设置为2,并将接收到的红外数据位放入IR_Data[2]中。

(18)如果当前计数达到第14次,则接收6位数据码。

(19)IR_sign被设置为3,表示数据码被成功接收。

(20)如果IR_sign等于3,则表示接收完成。

(21)接收后,关闭定时器0,停止捕获。

(22)接收后,跳转执行IR_Success()函数,显示并重新初始化。

(23)退货。

(24)将数据向左移动一位,以便将低位数据与最低位组合。

五、调试要点和实验现象

连接硬件,下载冷启动生成的程序。hex文件下载到单片机后,打开串口调试助手软件,设置波特率为9600,复位单片机,然后按SAA3010遥控器上相应的按钮。可以观察到,接收到的数据显示在接收窗口中,如图8所示。此外,电路板上的串行通信指示灯会闪烁,P0端口也会在LED灯上显示接收到的数据。

值得注意的是,不同红外遥控器的编码格式是不同的,即使是同一型号的红外遥控器,发出的码值也可能略有不同。比如笔者使用的SAA3010红外遥控器,测得的位时间约为1.655ms,而不是标称的1.688 ms,因此有条件的读者可以用示波器或逻辑分析仪等仪器测量遥控器发出的码值,从而进行相应的修改。另外,红外穿透能力较弱,比如我们用手遮住遥控器的发射器或接收器,此时很难接收数据或引入干扰。

六、摘要

本次讲座介绍51单片机如何通过外部中断触发和内部定时器捕捉的方式对红外遥控器进行解码,简要概括如下:

要对红外遥控器进行解码,首先要知道遥控器的编码标准,是本文介绍的NEC标准和飞利浦标准还是其他编码格式。因为不知道编码格式,很难判断编码,导致解码错误码。其次,由于晶振(如遥控器内部、单片机晶振)的不稳定性,为了保证解码的准确性,每一个码都要进行长时间的测量,如使用仪器或使用单片机本身,这样才能得到准备结果。

标签:遥控器数据解码

数据

最新文章