找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1098|回复: 0
打印 上一主题 下一主题
收起左侧

STC15F104EA红外遥控解码记忆开关汇编语言程序范例 附原理图

[复制链接]
跳转到指定楼层
楼主
基于12T 51内核的红外解码汇编程序,移植到1T STC单片机上,需要修改频率来达到比较精确的延时

红外遥控解码记忆开关接线图:


单片机红外遥控解码记忆开关汇编语言源程序如下:
  1. ;;;;;;红外遥控解码记忆;;;;;开机同时,按住按键直到蜂鸣器叫一次再松开,按遥控器认定按钮,待蜂鸣器叫一次后,完成解码记忆
  2. ;;;;RC频率30M,分频系数1/16,采用15F104EA   ;;2015-4-16;;
  3. IAP_DATA    EQU 0C2H                ;IAP数据寄存器
  4. IAP_ADDRH   EQU 0C3H                ;IAP地址寄存器高字
  5. IAP_ADDRL   EQU 0C4H                ;IAP地址寄存器低字
  6. IAP_CMD     EQU 0C5H                ;IAP命令寄存器
  7. IAP_TRIG    EQU 0C6H                ;IAP命令触发寄存器
  8. IAP_CONTR   EQU 0C7H                ;IAP控制寄存器
  9. CMD_IDLE    EQU 0                   ;空闲模式
  10. CMD_READ    EQU 1                   ;IAP字节读命令
  11. CMD_PROGRAM EQU 2                   ;IAP字节编程命令
  12. CMD_ERASE   EQU 3                   ;IAP扇区擦除命令
  13. ENABLE_IAP  EQU 83H                  ;if SYSCLK<12MHz
  14. IAP_ADDRESS EQU 0000H               ;测试地址(15L204EA的EEPROM空间为1K,分两个扇区,每个512字节)
  15. CLK_DIV     DATA    97H             ;RC频率30M,分频系数1/16,采用15F104EA
  16. ID          DATA    30H             ;灯组个数状态值
  17. HONG        DATA    31H             ;红外数据缓存区
  18. ANJIAN      BIT     26H.0           ;按键选择标志
  19. FENG        BIT     P3.3           ;蜂鸣器
  20. KEY         BIT     P3.0            ;解码记忆选择开关
  21. PH          BIT     P3.4            ;红外一体化接受头
  22. SW          BIT     P3.5
  23.        ORG         0000H
  24.        AJMP        MAIN1
  25.        ORG         0040H
  26. MAIN1: MOV      CLK_DIV,#1        ;分频设置
  27.        MOV   ID,#00H
  28.        MOV   P3,#0FFH
  29.        SETB  ANJIAN
  30.        JB    KEY,START1            ;按键判断
  31.        MOV   R7,#50
  32. D4:    ACALL  YS3
  33.        DJNZ   R7,D4
  34.        JB     KEY,START1
  35.        CLR    FENG                 ;声音延时
  36.        MOV   R7,#50
  37. D5:    ACALL  YS3
  38.        DJNZ   R7,D5
  39.        SETB   FENG
  40.        CLR    ANJIAN
  41. START1:MOV   DPTR,#IAP_ADDRESS     ;读取EEPOM红外数据到缓存区  ;设置ISP/IAP/EEPROM地址
  42.        LCALL IAP_READ                                          ;读IAP数据
  43.        MOV   31H,A
  44. START:JB PH,$                       ;等待遥控信号出现
  45. SB:MOV R4,#8                 
  46. SBA:MOV R5,#250
  47. SBB:JB PH,SXB1
  48. DJNZ R5,SBB
  49. DJNZ R4,SBA
  50. MOV R4,#2
  51. JMP SBC
  52. SXB1: MOV R5,#5
  53. SXB2: JNB PH,SBB
  54. DJNZ R5,SXB2
  55. JMP EXIT
  56. SBC:MOV R5,#250
  57. SB1:JB PH,SB2                     ;2MS内不为高电平错误
  58. DJNZ R5,SB1
  59. DJNZ R4,SBC
  60. JMP EXIT
  61. SB2: MOV R5,#5
  62. SB2_A:JNB PH,SB1
  63. DJNZ R5,SB2_A
  64. MOV R4,#3
  65. SB2_1:MOV R5,#250
  66. SB3: JNB PH,SXC
  67. DJNZ R5,SB3
  68. DJNZ R4,SB2_1
  69. MOV R4,#2
  70. JMP SB3_1
  71. SXC:MOV R5,#5
  72. SXC1:JB PH,SB3
  73. DJNZ R5,SXC1
  74. JMP EXIT
  75. SB3_1:MOV R5,#250
  76. SB3_2:JNB PH,SB4
  77. DJNZ R5,SB3_2
  78. DJNZ R4,SB3_1
  79. JMP EXIT
  80. SB4: MOV R5,#5
  81. SB4_1:JB PH,SB3_2
  82. DJNZ R5,SB4_1
  83. MOV R1,#1AH                   ;设定1AH为起始RAM区
  84. MOV R2,#4
  85. PP: MOV R3,#8
  86. JJJJ:MOV R5,#250
  87. JJJJ2:JB PH,JJJJ3
  88. DJNZ R5,JJJJ2
  89. JMP EXIT
  90. JJJJ3:LCALL YS1
  91. MOV C,PH
  92. JNC UUU
  93. MOV R5,#250
  94. JJJJ4:JNB PH,UUU
  95. NOP
  96. DJNZ R5,JJJJ4
  97. JMP EXIT
  98. UUU: MOV A,@R1                 ;将R1中地址的给A
  99. RRC A                          ;将C中的值移入A中的最低位
  100. MOV @R1,A                      ;将A中的数暂存在R1中
  101. DJNZ R3,JJJJ                   ;接收地址码的高8位
  102. INC R1                         ;对R1加1,换成下一个RAM
  103. DJNZ R2,PP                     ;以下对代码是否正确和定义进行识别
  104. MOV A,1AH                      ;比较高8位地址码
  105. XRL A,#00000000B               ;判断1AH的值是否等于00000000,相等的话A为0
  106. JNZ EXIT                       ;如果不等解码失败退出
  107. MOV A,1BH                      ;比较低8位地址
  108. XRL A,#11111111B               ;再判高8位地址是否正确
  109. JNZ EXIT                       ;如果不相等说明解码失败退出
  110. LCALL YS3
  111. MOV A,1CH                      ;比较数据码和数据反码是否正确?
  112. CPL A
  113. XRL A,1DH                      ;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确
  114. JNZ EXIT                       ;如果不相等说明解码失败退出
  115.        JB ANJIAN,MAIN2
  116.        MOV   DPTR,#IAP_ADDRESS         ;设置ISP/IAP/EEPROM地址
  117.        LCALL IAP_ERASE                 ;扇区擦除
  118.        MOV   A,1CH
  119.        MOV   DPTR,#IAP_ADDRESS         ;设置ISP/IAP/EEPROM地址
  120.        LCALL IAP_PROGRAM               ;字节编程
  121.        CLR    FENG                     ;红外数据写入成功蜂鸣器叫一次指示
  122.        MOV   R7,#50
  123. D6:    ACALL  YS3
  124.        DJNZ   R7,D6
  125.        SETB   FENG
  126.        SETB   ANJIAN
  127.        MOV    31H,1CH                  ;;;写入成功,建议关机重启
  128. EXIT:   AJMP   START   
  129. MAIN2: MOV   A,31H
  130.        CJNE  A,1CH,EXIT               ;;;判断红外遥控次数决定遥控灯组个数;;;;
  131.        CPL   SW
  132.        LJMP  START

  133. IAP_IDLE:                           ;;;关闭IAP;;;
  134.     MOV   IAP_CONTR,#0              ;关闭IAP功能
  135.     MOV   IAP_CMD,#0                ;清除命令寄存器
  136.     MOV   IAP_TRIG,#0               ;清除触发寄存器
  137.     MOV   IAP_ADDRH,#80H            ;将地址设置到非IAP区域
  138.     MOV   IAP_ADDRL,#0
  139.     RET

  140. IAP_READ:                           ;;;从ISP/IAP/EEPROM区域读取一字节;;;
  141.     MOV   IAP_CONTR,#ENABLE_IAP     ;使能IAP
  142.     MOV   IAP_CMD,#CMD_READ         ;设置IAP命令
  143.     MOV   IAP_ADDRL,DPL             ;设置IAP低地址
  144.     MOV   IAP_ADDRH,DPH             ;设置IAP高地址
  145.     MOV   IAP_TRIG,#5AH             ;写触发命令(0x5a)
  146.     MOV   IAP_TRIG,#0A5H            ;写触发命令(0xa5)
  147.     NOP                             ;等待ISP/IAP/EEPROM操作完成
  148.     MOV   A,IAP_DATA                ;读IAP数据
  149.     LCALL IAP_IDLE                  ;关闭IAP功能
  150.     RET

  151. IAP_PROGRAM:                       ;;;写一字节数据到ISP/IAP/EEPROM区域;;;
  152.     MOV   IAP_CONTR,#ENABLE_IAP    ;使能IAP
  153.     MOV   IAP_CMD,#CMD_PROGRAM     ;设置IAP命令
  154.     MOV   IAP_ADDRL,DPL            ;设置IAP低地址
  155.     MOV   IAP_ADDRH,DPH            ;设置IAP高地址
  156.     MOV   IAP_DATA,A               ;写IAP数据
  157.     MOV   IAP_TRIG,#5AH            ;写触发命令(0x5a)
  158.     MOV   IAP_TRIG,#0A5H           ;写触发命令(0xa5)
  159.     NOP                            ;等待ISP/IAP/EEPROM操作完成
  160.     LCALL IAP_IDLE                 ;关闭IAP功能
  161.     RET

  162. IAP_ERASE:                         ;;;扇区擦除;;;
  163.     MOV   IAP_CONTR,#ENABLE_IAP    ;使能IAP
  164.     MOV   IAP_CMD,#CMD_ERASE       ;设置IAP命令
  165.     MOV   IAP_ADDRL,DPL            ;设置IAP低地址
  166.     MOV   IAP_ADDRH,DPH            ;设置IAP高地址
  167.     MOV   IAP_TRIG,#5AH            ;写触发命令(0x5a)
  168.     MOV   IAP_TRIG,#0A5H           ;写触发命令(0xa5)
  169.     NOP                            ;等待ISP/IAP/EEPROM操作完成
  170.     LCALL IAP_IDLE                 ;关闭IAP功能
  171.     RET

  172. YS1: MOV R4,#20 ;延时子程序1, 882微秒
  173. D1: MOV R5,#20
  174. DJNZ R5,$
  175. DJNZ R4,D1
  176. RET

  177. YS3: MOV R4,#2 ;延时程序3, 1000微秒
  178. D3:MOV R5,#248
  179. DJNZ R5,$
  180. DJNZ R4,D3
  181. RET
  182. END
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表