80S52:红外遥控模块
功能:显示遥控按键对应用户码毫无作用
红外遥控是类似于之前的串口通信但没有波特率的说法,主要就是按照红外遥控器发出信号的时序进行分析。
如我实验使用的DT9122D遥控器可从说明书中查得其信号时序(如下图)

图中的引导码前9ms为高电平后4.5ms为低电平表示红外信号的开始,是用于过滤噪声的。后面的用户码和键位码组成的32位信号才是表征键位的,键数据反码主要起到验证信号真伪的作用。
而用户编码的组成方式很有意思,图上读入的低(高)八位的用户编码的1、2、3、4…位 是真正的低(高)用户编码的8、7、6、5…位,键位码也一样。
注意:信号读入后经过接收器处理,高低电平会倒置(如下图)
其次,信号读入的关键在0、1的判别。0、1在红外遥控信号中用一组高低电平表示,其区别在于“接收解码”中高电平的持续时间(即宽度),在DT9122D遥控器上0持续0.56ms,1持续1.69ms,思路是每次接收完位信号前半段的低电平,并接收的高点平后延时tms(0.56ms<t<1.69ms),之后若信号仍为高电平则该位为1反之为0。
下面是具体代码实现。
准备工作
数码管显示模块我抄我自己
#define date P0//用于数码管显示
#define place P2//用于数码管显示
typedef unsigned int u16;
typedef unsigned char u8;
sbit IRIN=P3^2;//红外信号i/o,利用了外部中断
u8 code number[]={
0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1};
//数码管显示字库
u8 code where[]={
0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/

本文详细解析了80S52单片机红外遥控模块的工作原理及信号时序,介绍了DT9122D遥控器的信号读取方法,包括引导码、用户码、键位码的识别,以及如何通过位信号判别实现0、1的读取。同时提供了具体的代码实现。
最低0.47元/天 解锁文章
4116





