基于12T 51内核的红外解码汇编程序,移植到1T STC单片机上,需要修改频率来达到比较精确的延时
红外遥控解码记忆开关接线图:
单片机红外遥控解码记忆开关汇编语言源程序如下:
- ;;;;;;红外遥控解码记忆;;;;;开机同时,按住按键直到蜂鸣器叫一次再松开,按遥控器认定按钮,待蜂鸣器叫一次后,完成解码记忆
- ;;;;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
复制代码
|