Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42736
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-22 19:27
文章分类
文章存档

2017年(1)

2014年(2)

2013年(5)

我的朋友

分类: 嵌入式

2013-11-04 09:25:18

注:最近一直在做一个智能遥控的项目,本人主要负责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 0010B2)。这里所说的地址码也就是设备识别码。

下面就各部分分解说明:

引导码: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的高低电平的值来进行解码的。

如下为网上下载的一个接收解码程序:

点击(此处)折叠或打开

  1. 遥控信号的解码
  2.        下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。
  3.        ;=================================================
  4. ; 红外遥控接收
  5. ;=================================================
  6. ; 中山单片机学习网 智佳科技 逸风
  7. ;=================================================
  8. ORG 0000H
  9. MAIN:
  10.     JNB P2.2,IR ;遥控扫描
  11.     LJMP MAIN ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
  12. ;=================================================
  13. ; 解码程序
  14. IR:
  15.     ;以下对遥控信号的9000微秒的初始低电平信号的识别,波形见图5。
  16. MOV R6,#10
  17. IR_SB:
  18.     ACALL DELAY882 ;调用882微秒延时子程序
  19.     JB P2.2,IR_ERROR ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
  20.     DJNZ R6,IR_SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
  21.     ;识别连发码,和跳过4.5ma的高电平。
  22.     JNB P2.2, $ ;等待高电平避开9毫秒低电平引导脉冲
  23.     ACALL DELAY2400
  24.     JNB P2.2,IR_Rp ;这里为低电平,认为是连发码信号,见图6。
  25.     ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码
  26.     ;以下32数据码的读取 ,0和1的识别 请看图2
  27.     MOV R1,#1AH ;设定1AH为起始RAM区
  28.     MOV R2,#4
  29. IR_4BYTE:
  30.     MOV R3,#8
  31. IR_8BIT:
  32.     JNB P2.2,$ ;等待地址码第一位的高电平信号
  33.     LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
  34.     MOV C,P2.2 ;将P2.2引脚此时的电平状态0或1存入C中
  35.     JNC IR_8BIT_0 ;如果为0就跳转到IR_8BIT_0
  36.     LCALL DELAY1000
  37. IR_8BIT_0:
  38.     MOV A,@R1 ;将R1中地址的给A
  39.     RRC A ;将C中的值0或1移入A中的最低位
  40.     MOV @R1,A ;将A中的数暂时存放在R1中
  41.     DJNZ R3,IR_8BIT ;接收地址码的高8位
  42.     INC R1 ;对R1中的值加1,换下一个RAM
  43.     DJNZ R2,IR_4BYTE ;接收完16位地址码和8位数据码和8位数据,
  44.                            ;存放在1AH/1BH/1CH/1DH的RAM中
  45.     ;解码成功
  46.     JMP IR_GOTO
  47. IR_Rp:
  48.     ;这里为重复码执行处
  49.     ;按住遥控按键时,每过108ms就到这里来
  50.     JMP IR_GOTO
  51. IR_ERROR:
  52.     ;错语退出
  53.     LJMP MAIN ;退出解码子程序
  54. ;=================================================
  55. ;遥控执行部份
  56. IR_GOTO:
  57.     ;这里还要判断1AH和1BH 两个系统码或用户码,用于识别不同的遥控器
  58.     ;MOV A,1AH
  59.     ;CJNE A,#xxH,IR_ERROR ;用户码1不对则退出
  60.     ;MOV A,1BH
  61.     ;CJNE A,#xxH,IR_ERROR ;用户码2不对则退出
  62.     ;判断两个数据码是否相反
  63.     MOV A,1CH
  64.     CPL A
  65.     CJNE A,1DH,IR_ERROR ;两个数据码不相反则退出
  66.     ;遥控执行部份
  67.     ;MOV A,1DH ;判断对应按键
  68.     ;CJNE A,#xxH,$+6
  69.     ;LJMP -à跳到对应按键执行处
  70.     ;CJNE A,#xxH,$+6
  71.     ;LJMP -à跳到对应按键执行处
  72.     ;.
  73.     MOV P1,1DH ;
  74.     CLR P2.3 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
  75.     LCALL DELAY2400
  76.     LCALL DELAY2400
  77.     LCALL DELAY2400
  78.     SETB P2.3 ;蜂鸣器停止
  79.     ;清除遥控值使连按失效
  80.     MOV 1AH,#00H
  81.     MOV 1BH,#00H
  82.     MOV 1CH,#00H
  83.     MOV 1DH,#00H
  84.     LJMP MAIN
  85. ;=================================================
  86. ; 延时子程序
  87. ;=============================882
  88. DELAY882: ;1.085x ((202x4)+5)=882
  89.     MOV R7,#202
  90. DELAY882_A:
  91.     NOP
  92.     NOP
  93.     DJNZ R7,DELAY882_A
  94. RET
  95. ;=============================1000
  96. DELAY1000: ;1.085x ((229x4)+5)=999.285
  97.     MOV R7,#229
  98. DELAY1000_A:
  99.     NOP
  100.     NOP
  101.     DJNZ R7,DELAY1000_A
  102. RET
  103. ;=============================2400
  104. DELAY2400: ;1.085x ((245x9)+5)=2397.85
  105.     MOV R7,#245
  106. DELAY2400_A:
  107.     NOP
  108.     NOP
  109.     NOP
  110.     NOP
  111.     NOP
  112.    NOP
  113.     NOP
  114.     DJNZ R7,DELAY2400_A
  115. RET



4,模拟UART口数据通信

     利用CPU的两个普通I/O模拟UART口与WIFI模块进行通信。下面为MCU普通IO口模拟UART口编程部分:

点击(此处)折叠或打开

  1. ;传输 8 位数据、一个停止位、不带奇偶校验的通用 UART。
  2. ;基本地,我们是利用消耗指令周期来获得期望的波特率,
  3. ;于是,在仿真中会存在一点误差。总体上来说,系统频率和
  4. ;波特率越高,误差则越小。
  5. ;
  6. #define UART_ASM
  7. #INCLUDE UART.INC
  8.                                           
  9. BAUDRATE EQU BAUDRATECONST ;波特率为波特率常数(在uart.inc中由用户定义)
  10. TX EQU TXPIN ;用户定义TXPIN引脚指定为TX
  11. RX EQU RXPIN ;用户定义RXPIN引脚指定为RX

  12. SDATA .SECTION 'DATA'
  13. COUNT DB ? ;串行位计数器
  14. TXREG DB ? ;发送数据寄存器
  15. RCREG DB ? ;接收数据寄存器
  16. DELAY DB ? ;延时计数器

  17. SERIAL .SECTION 'CODE'
  18. ;----------------UART发射-------------------
  19. TRANSMIT:
  20. MOV TXREG,A ;将发送的数据赋给TXREG
  21. MOV A,BAUDRATE ;设置波特率延时
  22. MOV DELAY,A ;
  23. CLR TX ;发送起始标志位“0”
  24. MOV A,9 ;设置发送数据的位数
  25. MOV COUNT,A ;

  26. TXDELAY: ;
  27. SDZ DELAY ;波特率延时循环
  28. JMP TXDELAY ;
  29. MOV A,BAUDRATE ;重新载入波特率延时常数
  30. MOV DELAY,A ;
  31. SDZ COUNT ;检查数据发送是否完毕
  32. JMP SENDBIT ;如果未发送完毕,跳到SENDBIT发送下一位
  33. JMP ENDTX ;数据发送完毕,跳到ENDTX

  34. SENDBIT:
  35. RRC TXREG ;带借位C循环右移txreg以获得发送的数据
  36. SNZ C ;检查借位C
  37. JMP LOBIT ;C=0跳到LOBIT发送 “0”
  38. SET TX ;C=1发送“1”
  39. JMP TXDELAY ;

  40. LOBIT: ;
  41. CLR TX ;发送“0”
  42. JMP TXDELAY ;

  43. ENDTX: ;
  44. NOP ;延时
  45. NOP ;
  46. SET TX ;发送停止位

  47. T1: ;
  48. SDZ DELAY ;在发送每一位之间延时
  49. JMP T1 ;
  50. MOV A,BAUDRATE ;
  51. MOV DELAY,A ;

  52. T2: ;
  53. SDZ DELAY ;
  54. JMP T2 ;
  55.  
  56. RET ;
  57.  
  58. ;------------UART接收--------------------
  59. RECEIVE:
  60. SZ RX ;检查起始位“0”
  61. JMP RECEIVE ;若无起始位,则跳到receive
  62. MOV A,9 ;接收到起始位则对接收数据进行初始化
  63. MOV COUNT,A ;设置接收位数
  64. MOV A,BAUDRATE+1 ;设置波特率延时
  65. MOV DELAY,A ;

  66. RXDELAY: ;
  67. SDZ DELAY ;波特率延时
  68. JMP RXDELAY ;
  69.  
  70. MOV A,BAUDRATE+1 ;重新载入波特率常数
  71. MOV DELAY,A ;
  72.  
  73. SDZ COUNT ;检查数据接收是否完毕
  74. JMP RXBIT ;如果接收未完毕则跳到RXBIT接收下一位数据
  75. MOV A,RCREG ;如果接收完毕,则将准备接收数据
  76. RET ;

  77. RXBIT: ;
  78. SET C ;先设置接收位为“1”
  79. SNZ RX ;检查所接收位是否为“1”
  80. CLR C ;若接收标志为“0”,则清除接收位 “0”
  81. RRC RCREG ;带借位循环右移rcreg
  82. JMP RXDELAY ;
  83.  

  84. ;-----
  85. ; End of UART.ASM
  86. ;--------------------------------------------------------


5,主程序设计

     UART口扫描;不断的循环接收接收头信息,判断为遥控码后进行解码;收到UART口发射编码后,进行红外发射。还有一个实时接收温度传感数据。




阅读(1968) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~