📄 jiema.a51
字号:
//下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。
;=================================================
//; 红外遥控接收
;=================================================
//;中山单片机学习网 智佳科技 逸风
;=================================================
?PR?jiema SEGMENT CODE //在程序存储区中定义段
PUBLIC jiema //声明函数
RSEG ?PR?jiema //函数可被连接器放置在任何地方
jiema:
JNB P2.3,IR //;遥控扫描
LJMP jiema //;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
;=================================================
//; 解码程序
IR:
//;以下对遥控信号的9000微秒的初始低电平信号的识别,波形见图5。
MOV R6,#10
IR_SB:
ACALL DELAY882 //;调用882微秒延时子程序
JB P2.3,IR_ERROR //;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
DJNZ R6,IR_SB // ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
//
// ;识别连发码,和跳过4.5ma的高电平。
JNB P2.3, $ // ;等待高电平避开9毫秒低电平引导脉冲
ACALL DELAY2400
JNB P2.3,IR_Rp // ;这里为低电平,认为是连发码信号,见图6。
ACALL DELAY2400 // ;延时4.74毫秒避开4.5毫秒的结果码
// ;以下32数据码的读取 ,0和1的识别 请看图2
MOV R1,#1AH // ;设定1AH为起始RAM区
MOV R2,#4
IR_4BYTE:
MOV R3,#8
IR_8BIT:
JNB P2.3,$ // ;等待地址码第一位的高电平信号
LCALL DELAY882 // ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P2.3 // ;将P2.2引脚此时的电平状态0或1存入C中
JNC IR_8BIT_0 // ;如果为0就跳转到IR_8BIT_0
LCALL DELAY1000
IR_8BIT_0:
MOV A,@R1 // ;将R1中地址的给A
RRC A // ;将C中的值0或1移入A中的最低位
MOV @R1,A // ;将A中的数暂时存放在R1中
DJNZ R3,IR_8BIT // ;接收地址码的高8位
INC R1 // ;对R1中的值加1,换下一个RAM
DJNZ R2,IR_4BYTE // ;接收完16位地址码和8位数据码和8位数据,
// ;存放在1AH/1BH/1CH/1DH的RAM中
// ;解码成功
JMP IR_GOTO
IR_Rp:
// ;这里为重复码执行处
// ;按住遥控按键时,每过108ms就到这里来
JMP IR_GOTO
IR_ERROR:
// ;错语退出
LJMP jiema //;退出解码子程序
;=================================================
//;遥控执行部份
IR_GOTO:
// ;判断两个数据码是否相反
MOV A,1CH
CPL A
CJNE A,1DH,IR_ERROR // ;两个数据码不相反则退出
// ;遥控执行部份
;MOV A,1DH // ;判断对应按键
;CJNE A,#xxH,$+6
;LJMP // -à跳到对应按键执行处
;CJNE A,#xxH,$+6
;LJMP // -à跳到对应按键执行处
;.
//MOV P1,1DH // ;将按键的键值通过P1口的8个LED显示出来!
MOV A,1DH
// CLR P3.5 //;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
//SETB P3.5 // ;蜂鸣器停止
//;清除遥控值使连按失效
MOV 1AH,#00H
MOV 1BH,#00H
MOV 1CH,#00H
// MOV 1DH,#00H
// LJMP jiema
;=================================================
//; 延时子程序
;=============================882
DELAY882: ;1.085x ((202x4)+5)=882
MOV R7,#202
DELAY882_A:
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000: ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
;=============================2400
DELAY2400: ;1.085x ((245x9)+5)=2397.85
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -