基于12T 51内核的红外解码汇编程序,移植到1T STC单片机上,需要修改频率来达到比较精确的延时

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

image.png
单片机红外遥控解码记忆开关汇编语言源程序如下:
;;;;;;红外遥控解码记忆;;;;;开机同时,按住按键直到蜂鸣器叫一次再松开,按遥控器认定按钮,待蜂鸣器叫一次后,完成解码记忆
  • ;;;;RC频率30M,分频系数1/16,采用15F104EA   ;;2015-4-16;;
  • IAP_DATA    EQU 0C2H                ;IAP数据寄存器
  • IAP_ADDRH   EQU 0C3H                ;IAP地址寄存器高字
  • IAP_ADDRL   EQU 0C4H                ;IAP地址寄存器低字
  • IAP_CMD     EQU 0C5H                ;IAP命令寄存器
  • IAP_TRIG    EQU 0C6H                ;IAP命令触发寄存器
  • IAP_CONTR   EQU 0C7H                ;IAP控制寄存器
  • CMD_IDLE    EQU 0                   ;空闲模式
  • CMD_READ    EQU 1                   ;IAP字节读命令
  • CMD_PROGRAM EQU 2                   ;IAP字节编程命令
  • CMD_ERASE   EQU 3                   ;IAP扇区擦除命令
  • ENABLE_IAP  EQU 83H                  ;if SYSCLK<12MHz
  • IAP_ADDRESS EQU 0000H               ;测试地址(15L204EA的EEPROM空间为1K,分两个扇区,每个512字节)
  • CLK_DIV     DATA    97H             ;RC频率30M,分频系数1/16,采用15F104EA
  • ID          DATA    30H             ;灯组个数状态值
  • HONG        DATA    31H             ;红外数据缓存区
  • ANJIAN      BIT     26H.0           ;按键选择标志
  • FENG        BIT     P3.3           ;蜂鸣器
  • KEY         BIT     P3.0            ;解码记忆选择开关
  • PH          BIT     P3.4            ;红外一体化接受头
  • SW          BIT     P3.5
  •        ORG         0000H
  •        AJMP        MAIN1
  •        ORG         0040H
  • MAIN1: MOV      CLK_DIV,#1        ;分频设置
  •        MOV   ID,#00H
  •        MOV   P3,#0FFH
  •        SETB  ANJIAN
  •        JB    KEY,START1            ;按键判断
  •        MOV   R7,#50
  • D4:    ACALL  YS3
  •        DJNZ   R7,D4
  •        JB     KEY,START1
  •        CLR    FENG                 ;声音延时
  •        MOV   R7,#50
  • D5:    ACALL  YS3
  •        DJNZ   R7,D5
  •        SETB   FENG
  •        CLR    ANJIAN
  • START1:MOV   DPTR,#IAP_ADDRESS     ;读取EEPOM红外数据到缓存区  ;设置ISP/IAP/EEPROM地址
  •        LCALL IAP_READ                                          ;读IAP数据
  •        MOV   31H,A
  • START:JB PH,$                       ;等待遥控信号出现
  • SB:MOV R4,#8                 
  • SBA:MOV R5,#250
  • SBB:JB PH,SXB1
  • DJNZ R5,SBB
  • DJNZ R4,SBA
  • MOV R4,#2
  • JMP SBC
  • SXB1: MOV R5,#5
  • SXB2: JNB PH,SBB
  • DJNZ R5,SXB2
  • JMP EXIT
  • SBC:MOV R5,#250
  • SB1:JB PH,SB2                     ;2MS内不为高电平错误
  • DJNZ R5,SB1
  • DJNZ R4,SBC
  • JMP EXIT
  • SB2: MOV R5,#5
  • SB2_A:JNB PH,SB1
  • DJNZ R5,SB2_A
  • MOV R4,#3
  • SB2_1:MOV R5,#250
  • SB3: JNB PH,SXC
  • DJNZ R5,SB3
  • DJNZ R4,SB2_1
  • MOV R4,#2
  • JMP SB3_1
  • SXC:MOV R5,#5
  • SXC1:JB PH,SB3
  • DJNZ R5,SXC1
  • JMP EXIT
  • SB3_1:MOV R5,#250
  • SB3_2:JNB PH,SB4
  • DJNZ R5,SB3_2
  • DJNZ R4,SB3_1
  • JMP EXIT
  • SB4: MOV R5,#5
  • SB4_1:JB PH,SB3_2
  • DJNZ R5,SB4_1
  • MOV R1,#1AH                   ;设定1AH为起始RAM区
  • MOV R2,#4
  • PP: MOV R3,#8
  • JJJJ:MOV R5,#250
  • JJJJ2:JB PH,JJJJ3
  • DJNZ R5,JJJJ2
  • JMP EXIT
  • JJJJ3:LCALL YS1
  • MOV C,PH
  • JNC UUU
  • MOV R5,#250
  • JJJJ4:JNB PH,UUU
  • NOP
  • DJNZ R5,JJJJ4
  • JMP EXIT
  • UUU: MOV A,@R1                 ;将R1中地址的给A
  • RRC A                          ;将C中的值移入A中的最低位
  • MOV @R1,A                      ;将A中的数暂存在R1中
  • DJNZ R3,JJJJ                   ;接收地址码的高8位
  • INC R1                         ;对R1加1,换成下一个RAM
  • DJNZ R2,PP                     ;以下对代码是否正确和定义进行识别
  • MOV A,1AH                      ;比较高8位地址码
  • XRL A,#00000000B               ;判断1AH的值是否等于00000000,相等的话A为0
  • JNZ EXIT                       ;如果不等解码失败退出
  • MOV A,1BH                      ;比较低8位地址
  • XRL A,#11111111B               ;再判高8位地址是否正确
  • JNZ EXIT                       ;如果不相等说明解码失败退出
  • LCALL YS3
  • MOV A,1CH                      ;比较数据码和数据反码是否正确?
  • CPL A
  • XRL A,1DH                      ;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确
  • JNZ EXIT                       ;如果不相等说明解码失败退出
  •        JB ANJIAN,MAIN2
  •        MOV   DPTR,#IAP_ADDRESS         ;设置ISP/IAP/EEPROM地址
  •        LCALL IAP_ERASE                 ;扇区擦除
  •        MOV   A,1CH
  •        MOV   DPTR,#IAP_ADDRESS         ;设置ISP/IAP/EEPROM地址
  •        LCALL IAP_PROGRAM               ;字节编程
  •        CLR    FENG                     ;红外数据写入成功蜂鸣器叫一次指示
  •        MOV   R7,#50
  • D6:    ACALL  YS3
  •        DJNZ   R7,D6
  •        SETB   FENG
  •        SETB   ANJIAN
  •        MOV    31H,1CH                  ;;;写入成功,建议关机重启
  • EXIT:   AJMP   START   
  • MAIN2: MOV   A,31H
  •        CJNE  A,1CH,EXIT               ;;;判断红外遥控次数决定遥控灯组个数;;;;
  •        CPL   SW
  •        LJMP  START
  • IAP_IDLE:                           ;;;关闭IAP;;;
  •     MOV   IAP_CONTR,#0              ;关闭IAP功能
  •     MOV   IAP_CMD,#0                ;清除命令寄存器
  •     MOV   IAP_TRIG,#0               ;清除触发寄存器
  •     MOV   IAP_ADDRH,#80H            ;将地址设置到非IAP区域
  •     MOV   IAP_ADDRL,#0
  •     RET
  • IAP_READ:                           ;;;从ISP/IAP/EEPROM区域读取一字节;;;
  •     MOV   IAP_CONTR,#ENABLE_IAP     ;使能IAP
  •     MOV   IAP_CMD,#CMD_READ         ;设置IAP命令
  •     MOV   IAP_ADDRL,DPL             ;设置IAP低地址
  •     MOV   IAP_ADDRH,DPH             ;设置IAP高地址
  •     MOV   IAP_TRIG,#5AH             ;写触发命令(0x5a)
  •     MOV   IAP_TRIG,#0A5H            ;写触发命令(0xa5)
  •     NOP                             ;等待ISP/IAP/EEPROM操作完成
  •     MOV   A,IAP_DATA                ;读IAP数据
  •     LCALL IAP_IDLE                  ;关闭IAP功能
  •     RET
  • IAP_PROGRAM:                       ;;;写一字节数据到ISP/IAP/EEPROM区域;;;
  •     MOV   IAP_CONTR,#ENABLE_IAP    ;使能IAP
  •     MOV   IAP_CMD,#CMD_PROGRAM     ;设置IAP命令
  •     MOV   IAP_ADDRL,DPL            ;设置IAP低地址
  •     MOV   IAP_ADDRH,DPH            ;设置IAP高地址
  •     MOV   IAP_DATA,A               ;写IAP数据
  •     MOV   IAP_TRIG,#5AH            ;写触发命令(0x5a)
  •     MOV   IAP_TRIG,#0A5H           ;写触发命令(0xa5)
  •     NOP                            ;等待ISP/IAP/EEPROM操作完成
  •     LCALL IAP_IDLE                 ;关闭IAP功能
  •     RET
  • IAP_ERASE:                         ;;;扇区擦除;;;
  •     MOV   IAP_CONTR,#ENABLE_IAP    ;使能IAP
  •     MOV   IAP_CMD,#CMD_ERASE       ;设置IAP命令
  •     MOV   IAP_ADDRL,DPL            ;设置IAP低地址
  •     MOV   IAP_ADDRH,DPH            ;设置IAP高地址
  •     MOV   IAP_TRIG,#5AH            ;写触发命令(0x5a)
  •     MOV   IAP_TRIG,#0A5H           ;写触发命令(0xa5)
  •     NOP                            ;等待ISP/IAP/EEPROM操作完成
  •     LCALL IAP_IDLE                 ;关闭IAP功能
  •     RET
  • YS1: MOV R4,#20 ;延时子程序1, 882微秒
  • D1: MOV R5,#20
  • DJNZ R5,$
  • DJNZ R4,D1
  • RET
  • YS3: MOV R4,#2 ;延时程序3, 1000微秒
  • D3:MOV R5,#248
  • DJNZ R5,$
  • DJNZ R4,D3
  • RET
  • END
  • 复制代码