注:最近一直在做一个智能遥控的项目,本人主要负责MCU部分,对基于HT46R01N的MCU部分编程设计做一个简单总结(其中也包含网络上知识的汇总)!转入正题。
学习型红外遥控系统
1,学习型红外遥控系统
学习型红外遥控系统主要由红外发射、红外接收、模拟UART口通信和温度检测模块组成,基本结构图如下所示。
其中CPU芯片选择合泰的HT46R01N,该控制器具有四个12位ADC通道、一个8位PWM通道、两个8位可编程定时器、10个双向IO口,EPROM:1K,RAM:96byte。
红外接收头选择VISHAY 1838接收头,该红外接收头输出解调后的脉冲波。
2,遥控器发射及其编码
CPU接收到UART口发过来已学习的红外编码后(有遥控码发出),经LED红外发送器发射出去。不同的遥控码实现具体不同的控制功能。
这里以日本NEC的uPD6121G组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用这种编码方式),大部分编码都采用脉宽编码方式。也就是对于逻辑‘1’和逻辑‘0’,对应的方波信号高低电平时间不同来加以区分。
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图所示。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射。
遥控信号编码波形图
可以看见,一个完整的控制信号,包括引导码,系统码,数据码。不同的遥控器,虽然会有差别,但通常都是有这几部分组成的。
UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。
遥控码的发射就是周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,图4为发射波形图。
图4 遥控连发信号波形
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个引导码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发码)将仅由起始码(9ms)和结束码(2.25ms)组成。
图5 引导码
图6连发码
这里再给出一个例子,这是一台空调的编码分析。
美的空调(R51D)协议一次按键重复发两次,前后两次完全一样,上个图片:
前、后两次完全一样,下面再发一次前面部分的图片:
可以看见,他同样也是由引导码、8位地址码、8位地址反码、前8位数据、前8位数据反码、后8位数据、后8位数据反码、后置单脉冲
其中地址码是:1011 0010(B2)。这里所说的地址码也就是设备识别码。
下面就各部分分解说明:
引导码:4.5mS发送、4.5mS间隔:
“1”:0.56uS发送、0.56*3uS间隔:
“0”:0.56uS发射、0.56uS间隔:
后置单脉冲:0.56发送、4.5mS间隔:
后置单脉冲的作用就是结束码,作为整个码序列的结尾。
附上几个按键的16位数据码:
摆风:6B E0
强劲:F5 A2
清新:F5 A3
数显:F5 A5
关:7B E0
开:根据温度不同数据码不同,下面一一列表:
17度:1F 08 18度:1F 18 19度:1F 38
20度:1F 28 21度:1F 68 22度:1F 78
23度:1F 58 24度:1F 48 25度:1F C8
26度:1F D8 27度:1F 98 28度:1F 88
29度:1F A8 30度:1F B8
风向:1F 44
3,遥控器接收及其学习解码
遥控器接收选择VISHAY 1838接收头,该红外接收头输出解调后的脉冲波。
接收头对外只有3个引脚:Out、GND、Vcc与单片机接口非常方便,如图7所示。
图 7
① 脉冲信号输出接,直接接单片机的IO 口。
② GND接系统的地线(0V);
③ Vcc接系统的电源正极(+5V);
学习解码:也就是通过读取接收头引脚pin的高低电平的值来进行解码的。
如下为网上下载的一个接收解码程序:
-
遥控信号的解码
-
下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。
-
;=================================================
-
; 红外遥控接收
-
;=================================================
-
; 中山单片机学习网 智佳科技 逸风
-
;=================================================
-
ORG 0000H
-
MAIN:
-
JNB P2.2,IR ;遥控扫描
-
LJMP MAIN ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
-
;=================================================
-
; 解码程序
-
IR:
-
;以下对遥控信号的9000微秒的初始低电平信号的识别,波形见图5。
-
MOV R6,#10
-
IR_SB:
-
ACALL DELAY882 ;调用882微秒延时子程序
-
JB P2.2,IR_ERROR ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
-
DJNZ R6,IR_SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
-
;识别连发码,和跳过4.5ma的高电平。
-
JNB P2.2, $ ;等待高电平避开9毫秒低电平引导脉冲
-
ACALL DELAY2400
-
JNB P2.2,IR_Rp ;这里为低电平,认为是连发码信号,见图6。
-
ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码
-
;以下32数据码的读取 ,0和1的识别 请看图2
-
MOV R1,#1AH ;设定1AH为起始RAM区
-
MOV R2,#4
-
IR_4BYTE:
-
MOV R3,#8
-
IR_8BIT:
-
JNB P2.2,$ ;等待地址码第一位的高电平信号
-
LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
-
MOV C,P2.2 ;将P2.2引脚此时的电平状态0或1存入C中
-
JNC IR_8BIT_0 ;如果为0就跳转到IR_8BIT_0
-
LCALL DELAY1000
-
IR_8BIT_0:
-
MOV A,@R1 ;将R1中地址的给A
-
RRC A ;将C中的值0或1移入A中的最低位
-
MOV @R1,A ;将A中的数暂时存放在R1中
-
DJNZ R3,IR_8BIT ;接收地址码的高8位
-
INC R1 ;对R1中的值加1,换下一个RAM
-
DJNZ R2,IR_4BYTE ;接收完16位地址码和8位数据码和8位数据,
-
;存放在1AH/1BH/1CH/1DH的RAM中
-
;解码成功
-
JMP IR_GOTO
-
IR_Rp:
-
;这里为重复码执行处
-
;按住遥控按键时,每过108ms就到这里来
-
JMP IR_GOTO
-
IR_ERROR:
-
;错语退出
-
LJMP MAIN ;退出解码子程序
-
;=================================================
-
;遥控执行部份
-
IR_GOTO:
-
;这里还要判断1AH和1BH 两个系统码或用户码,用于识别不同的遥控器
-
;MOV A,1AH
-
;CJNE A,#xxH,IR_ERROR ;用户码1不对则退出
-
;MOV A,1BH
-
;CJNE A,#xxH,IR_ERROR ;用户码2不对则退出
-
;判断两个数据码是否相反
-
MOV A,1CH
-
CPL A
-
CJNE A,1DH,IR_ERROR ;两个数据码不相反则退出
-
;遥控执行部份
-
;MOV A,1DH ;判断对应按键
-
;CJNE A,#xxH,$+6
-
;LJMP -à跳到对应按键执行处
-
;CJNE A,#xxH,$+6
-
;LJMP -à跳到对应按键执行处
-
;.
-
MOV P1,1DH ;
-
CLR P2.3 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
-
LCALL DELAY2400
-
LCALL DELAY2400
-
LCALL DELAY2400
-
SETB P2.3 ;蜂鸣器停止
-
;清除遥控值使连按失效
-
MOV 1AH,#00H
-
MOV 1BH,#00H
-
MOV 1CH,#00H
-
MOV 1DH,#00H
-
LJMP MAIN
-
;=================================================
-
; 延时子程序
-
;=============================882
-
DELAY882: ;1.085x ((202x4)+5)=882
-
MOV R7,#202
-
DELAY882_A:
-
NOP
-
NOP
-
DJNZ R7,DELAY882_A
-
RET
-
;=============================1000
-
DELAY1000: ;1.085x ((229x4)+5)=999.285
-
MOV R7,#229
-
DELAY1000_A:
-
NOP
-
NOP
-
DJNZ R7,DELAY1000_A
-
RET
-
;=============================2400
-
DELAY2400: ;1.085x ((245x9)+5)=2397.85
-
MOV R7,#245
-
DELAY2400_A:
-
NOP
-
NOP
-
NOP
-
NOP
-
NOP
-
NOP
-
NOP
-
DJNZ R7,DELAY2400_A
-
RET
4,模拟UART口数据通信
利用CPU的两个普通I/O模拟UART口与WIFI模块进行通信。下面为MCU普通IO口模拟UART口编程部分:
-
;传输 8 位数据、一个停止位、不带奇偶校验的通用 UART。
-
;基本地,我们是利用消耗指令周期来获得期望的波特率,
-
;于是,在仿真中会存在一点误差。总体上来说,系统频率和
-
;波特率越高,误差则越小。
-
;
-
#define UART_ASM
-
#INCLUDE UART.INC
-
-
BAUDRATE EQU BAUDRATECONST ;波特率为波特率常数(在uart.inc中由用户定义)
-
TX EQU TXPIN ;用户定义TXPIN引脚指定为TX
-
RX EQU RXPIN ;用户定义RXPIN引脚指定为RX
-
-
SDATA .SECTION 'DATA'
-
COUNT DB ? ;串行位计数器
-
TXREG DB ? ;发送数据寄存器
-
RCREG DB ? ;接收数据寄存器
-
DELAY DB ? ;延时计数器
-
-
SERIAL .SECTION 'CODE'
-
;----------------UART发射-------------------
-
TRANSMIT:
-
MOV TXREG,A ;将发送的数据赋给TXREG
-
MOV A,BAUDRATE ;设置波特率延时
-
MOV DELAY,A ;
-
CLR TX ;发送起始标志位“0”
-
MOV A,9 ;设置发送数据的位数
-
MOV COUNT,A ;
-
-
TXDELAY: ;
-
SDZ DELAY ;波特率延时循环
-
JMP TXDELAY ;
-
MOV A,BAUDRATE ;重新载入波特率延时常数
-
MOV DELAY,A ;
-
SDZ COUNT ;检查数据发送是否完毕
-
JMP SENDBIT ;如果未发送完毕,跳到SENDBIT发送下一位
-
JMP ENDTX ;数据发送完毕,跳到ENDTX
-
-
SENDBIT:
-
RRC TXREG ;带借位C循环右移txreg以获得发送的数据
-
SNZ C ;检查借位C
-
JMP LOBIT ;C=0跳到LOBIT发送 “0”
-
SET TX ;C=1发送“1”
-
JMP TXDELAY ;
-
-
LOBIT: ;
-
CLR TX ;发送“0”
-
JMP TXDELAY ;
-
-
ENDTX: ;
-
NOP ;延时
-
NOP ;
-
SET TX ;发送停止位
-
-
T1: ;
-
SDZ DELAY ;在发送每一位之间延时
-
JMP T1 ;
-
MOV A,BAUDRATE ;
-
MOV DELAY,A ;
-
-
T2: ;
-
SDZ DELAY ;
-
JMP T2 ;
-
-
RET ;
-
-
;------------UART接收--------------------
-
RECEIVE:
-
SZ RX ;检查起始位“0”
-
JMP RECEIVE ;若无起始位,则跳到receive
-
MOV A,9 ;接收到起始位则对接收数据进行初始化
-
MOV COUNT,A ;设置接收位数
-
MOV A,BAUDRATE+1 ;设置波特率延时
-
MOV DELAY,A ;
-
-
RXDELAY: ;
-
SDZ DELAY ;波特率延时
-
JMP RXDELAY ;
-
-
MOV A,BAUDRATE+1 ;重新载入波特率常数
-
MOV DELAY,A ;
-
-
SDZ COUNT ;检查数据接收是否完毕
-
JMP RXBIT ;如果接收未完毕则跳到RXBIT接收下一位数据
-
MOV A,RCREG ;如果接收完毕,则将准备接收数据
-
RET ;
-
-
RXBIT: ;
-
SET C ;先设置接收位为“1”
-
SNZ RX ;检查所接收位是否为“1”
-
CLR C ;若接收标志为“0”,则清除接收位 “0”
-
RRC RCREG ;带借位循环右移rcreg
-
JMP RXDELAY ;
-
-
-
;-----
-
; End of UART.ASM
-
;--------------------------------------------------------
5,主程序设计
UART口扫描;不断的循环接收接收头信息,判断为遥控码后进行解码;收到UART口发射编码后,进行红外发射。还有一个实时接收温度传感数据。
阅读(2003) | 评论(0) | 转发(0) |