跟我学51单片机(六):单片机外部中断及红外遥控器解码
上讲介绍并应用了单片机动态扫描驱动数码管,并给出了实例。这一讲将重点介绍单片机如何通过捕获来实现对红外遥控器解码。通过该讲,读者可以掌握红外遥控器的编码原理以及如何通过单片机对遥控器进行解码。
二、原理简介
随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。
一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示:
图1 红外遥控系统框图
其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大、解调、解码电路。举例来说,通常我们家电遥控器信号的发射,就是将相应按键所对应的控制指令和系统码( 由0 和1 组成的序列),调制在32~56kHz 范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。此外,现在流行的控制方法是应用编/ 解码专用集成电路芯片来实现(如下文提到的SAA3010 红外编码芯片和HS0038 红外接收头)。
不同公司的遥控芯片,采用的遥控码格式也不一样。在此介绍目前广泛使用较普遍的两种,一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准,一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。
NEC 标准:遥控载波的频率为38kHz( 占空比为1:3) ;当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。简码重复为延时108ms,即两个引导脉冲上升沿之间的间隔都是108ms。一个完整的全码如图2所示。
图2 NEC标准下的全码表示
其中,引导码高电平4.5ms,低电平4.5ms ;用户码8 位,数据码8 位,共32 位;数据0 可用“高电平0.56ms +低电平0.56ms”表示,数据1 可用“高电平0.56ms +低电平1.68ms”表示,如图3 所示。一个简码可等同于引导码、系统码位0 的反码和结束位(0.56ms) 高电平时间总和。
图3 NEC标准下的数据0和1的表示
PHILIPS 标准:载波频率为38kHz ;没有简码,点按键时,控制码在1 和0 之间切换,若持续按键,则控制码不变。一个全码可等同于起始码、控制码、系统码、数据码的时间总和,如图4 所示。
图4 PHILIPS标准下的全码表示
数据0 用“低电平0. 889ms +高电平0. 889ms”
表示;数据1 用“ 高电平0. 889ms + 低电平0.
889ms”表示(图5)。连续码重复延时114ms。
图5 PHILIPS标准下的数据0和1的表示
在本讲中采用的是SAA3010 这款红外遥控器(见图6(a)),其符合常见的PHILIPS 标准中的RC-5 编码格式,其一帧码序列是由2 位控制码,1 位翻转码,5 为地址码,6 位数据码,结束码组成。其数据位时间长度是1.688ms。连续码重复延时为108ms,即在每按键一直被按下时延时为108ms 再输出同样的一帧数据。
图6 (a) SAA3010遥控器外观图 (b) SAA3010的数据位 (c) SAA3010的数据重复周期
从图6 中可以看出,SAA3010 的位传送方式是采用双相位,位1 和位0 的相位正好相反。在解码时可以用定时采样的方式进行解码,一个位采样二次,分别在位波形的四分之一和四分之三处进行采样,如位1 用这种方法采样的值就是0 和1。当然也可以只采样一次,例如在波形的四分之一处进行采样,然后定时一个波形的周期再采样,这样位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 用于电源去耦滤波,保证红外接收头稳定工作。
四、程序设计
本讲设计的核心程序如下:
void time0() inte
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)