红外遥控解码记忆开关接线图:
单片机红外遥控解码记忆开关汇编语言源程序如下:
;;;;;;红外遥控解码记忆;;;;;开机同时,按住按键直到蜂鸣器叫一次再松开,按遥控器认定按钮,待蜂鸣器叫一次后,完成解码记忆;;;;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
复制代码