51单片机红外收发器的编码与解码

最近在研究信号的编码和解码,正好手头有51单片机开发板,所以打算通过研究开发板上的红外模块来加深对编码和解码的认识和理解。

 

 

在各类开发板中基本都会有红外模块,该模块主要由红外遥控器(发射端)和红外接收器(接收端),按下遥控器的某一个键,遥控器会发出一连串经过调制后的信号,这个信号经过红外一体化模块接收后,输出解调后的数字脉冲,每个按键对应不同的脉冲,故识别出不同的脉冲就能识别出不同的按键。

比较常见的是车载MP3红外遥控器及其配套的接收器,它们的工作方式可以用下面这个图来表示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_20,color_FFFFFF,t_70,g_se,x_16

红外遥控器有专门的编码芯片,这里以日本NEC的uPD6121G组成发射电路为例说明编码原理。遥控器上不同的按键对应不同的编码。我的手上的遥控器采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图所示。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_20,color_FFFFFF,t_70,g_se,x_16

如图可见,0与1前端的低电平持续都是0.56ms,那么就是后面的高电平持续时间不同,0为0.56ms,1为1.685ms。

UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码(反码用于检验接收端是否收到了正确的数据)。UPD6121G最多有128种不同组合的编码。 

当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个引导码(9ms低电平+4.5ms高电平),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如下图所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_15,color_FFFFFF,t_70,g_se,x_16

 

如果键按下超过108ms仍未松开,接下来发射的代码:连发码(由 9ms 低电平+2.5m 高电平+0.56ms 低电平+97.94ms 高电平组成),如图所示:
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_17,color_FFFFFF,t_70,g_se,x_16

实际上人手的动作是很慢的,即使快速按下按键,可能对于芯片来说还是超过108ms,所以如何处理连发码是很关键的。

以上就是红外遥控的编码过程,了解了编码过程后,解码就比较容易了,主要要控制好时间上的约束关系。

以下是我的代码,其中,P3.2是单片机引脚与红外接收器引脚相连的引脚,在成功编码解码后,单片机会将处理后的数据传到P1特殊功能寄存器,使相应LED灯亮灭,与此同时蜂鸣器(P2.4)将响三声。

ORG 00H;

;PART 1 定义主程序,实现对红外管脚的循环扫描
MAIN:
     JNB P3.2,IR;遥控扫描(P3.2是单片机和红外接收器的连接处,注意跳线)
     LJMP MAIN;
;PART 2 按位实现解码
IR:
;对遥控信号9000微秒初始低电平信号的识别
MOV R6,#10;
IR_SB:
      ACALL DELAY882;882微秒延时
      JB P3.2,IR_ERROR;
      DJNZ R6,IR_SB; 8820微秒内若出现高电平就退出解码程序

;识别连发码,和跳过4.5ms的高电平
JNB P3.2,$;  等待高电平避开9ms低电平引导脉冲
ACALL DELAY2300;延时2.3ms
JNB P3.2,IR_Rp;  这里若为低电平,则认为是连发码信号
;ACALL DELAY2300;延时2.3ms,和上上行的延时共同形成了4.6ms延时,从而避开了引导码中的4.5ms高电平
JB P3.2,$;可以由上面的行替代,若检测到高电平,则一直循环等待
MOV R1,#1AH;    设定1AH为起始RAM区
MOV R2,#4;

IR_4BYTE:
         MOV R3,#8;     每次传送8位数据

IR_8BIT:
         JNB P3.2,$;等待地址码第一位的高电平信号
         LCALL DELAY882;
         MOV C,P3.2; 将P3.2此时的状态存入C中,即读取有效数据
         JNC IR_8BIT_0; C为0就转移
         LCALL DELAY1000;

IR_8BIT_0:
           MOV A,@R1;
           RRC A;  将C中的值0或1移入A的最低位
           MOV @R1,A;
           DJNZ R3,IR_8BIT;     接收地址码高8位
           INC R1;   换下一个RAM地址
           DJNZ R2,IR_4BYTE;接受完16位地址码、8位数据码和8位数据

   ;解码成功
   JMP IR_GOTO;

IR_Rp:;重复码执行处
      
      JMP IR_GOTO;

IR_ERROR:
         ;MOV P0,#86H;
         ;ACALL DELAY2400;
         LJMP MAIN;


;PART 3  遥控器识别
IR_GOTO:;判断两个数据码是否相反
        MOV A,1CH;
        CPL A;
        CJNE A,1DH,IR_ERROR;两个数据不相等就退出
        ;SETB P2.5;573使能
        ;CLR P2.3  ; 位选第四个数码管
        ;MOV P0,A;
        MOV P1,1DH;将按键的键值通过P1的8个LED灯显示出来
         CLR P2.4;蜂鸣器响三声,表示解码成功
        LCALL DELAY2400;
        LCALL DELAY2400;
        LCALL DELAY2400;
        SETB P2.4;

;清除遥控器值使连按失效
MOV 1AH,#00H;
MOV 1BH,#00H;
MOV 1CH,#00H;
MOV 1DH,#00H;
LJMP MAIN;


;PART 4    延时程序
DELAY882:  延时880微秒
         MOV R7,#202;
DELAY882_A:
         NOP;
         NOP;
         DJNZ R7,DELAY882_A;
         RET;

DELAY2400: ;延时4.74ms
         MOV R7,#255;
DELAY2400_A:
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         DJNZ R7,DELAY2400_A;
         DELAY40ws:
         MOV R7,#7H;
DELAY40ws_A:   ;延时40微秒
         NOP;
         NOP;
         DJNZ R7,DELAY40ws_A;
         RET;

DELAY4600:  
          MOV R7,#235;
DELAY4600_A:
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         DJNZ R7,DELAY4600_A;
         RET;
        

DELAY1000: ;延时1ms
         MOV R7,#229;
DELAY1000_A:
         NOP;
         NOP;
         DJNZ R7,DELAY1000_A;
         RET;

DELAY2300:       ;延时2.3ms
         MOV R7,#210;
DELAY2300_A:
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         NOP;
         DJNZ R7,DELAY2300_A;
         RET;

END

 

代码中的RRC A;代表A和CY放在一起进行循环右移

例如:某时刻,A=1101 0010,CY=1,二者作为一个整体构成九位二进制码:1 1010 0101。则在指令RRC A之后,九位二进制码循环右移一位,得到:1 1101 0010。此时,A=1110 1001,CY=0。

 

在程序写好之后,要进行相应的调试,这里我将采用单片机在线调试的方式,主要观察寄存器A、R0~R7,PSW中的CY位以及存放地址数据和控制数据的地址1AH~1DH。

在进入在线调试界面后,打开Watch Windows,输入想要观察的特殊功能寄存器。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_20,color_FFFFFF,t_70,g_se,x_16

这里主要想知道A中存的接收数据,所以输入A

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_20,color_FFFFFF,t_70,g_se,x_16

在使用反码检验传输数据正确性时,反码是存在单片机内部RAM中,地址为1DH的寄存器中,所以打开Memory Windows,并在Address框中输入:D:1DH,在窗口中第一行第一个显示的就是1DH中存的数据(反码)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_20,color_FFFFFF,t_70,g_se,x_16

 

接下来在:CJNE A,1DH,IR_ERROR处设置断点,点击'Run',然后按下红外遥控器上的一个按键(我这里按的是0),此时观察A和1DH的值,分别为0E9H和0E9H,由于此时A中存储的是1CH中的数据再取反,所以1CH中的数据取反后等于1DH中的数据(反码),因此数据传输正确。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_20,color_FFFFFF,t_70,g_se,x_16

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTMzMDMzNjU=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

以上是我对单片机红外收发的粗浅认识,若有错误,敬请指正。谢谢!

 

 

 

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值