📄 ir.asm
字号:
;----------------------------------
; 单片机红外遥控实例
; 功能:通过红外遥控实现对LED的控制
;-----------------------------------
ORG 0000H
MAIN:
JNB P2.2,IR ; 遥控扫描
LJMP MAIN ; 在正常无遥控信号时一体化红外接收头输出是高电平,程序一直在循环。
;------------------------------
; 解码程序
;-------------------------------
IR:
; 以下对遥控信号的9000微秒的初始低电平信号的识别
MOV R6,#10
IR_SB:
ACALL DELAY882 ; 调用882微秒延时子程序
JB P2.2,IR_ERROR ; 延时882微秒后判断P2.2脚是否出现高电平,如果有就退出解码程序
DJNZ R6,IR_SB ; 重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
; 识别连发码,和跳过4.5ms高电平
JNB P2.2,$ ; 等待高电平避开9毫秒低电平引导脉冲
ACALL DELAY2400
JNB P2.2,IR_Rp ; 这里为低电平,认为是连发码信号?
ACALL DELAY2400
; 以下32位数据码读取
MOV R1,#2AH ; 设定2AH为初始RAM
MOV R2,#4
IR_4BYTE:
MOV R3,#8
IR_8BIT:
JNB P2.2,$ ; 等待地址码第一位的高电平信号
LCALL DELAY882 ; 高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P2.2 ; 将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位数据反码
; 存放在2AH、2bh、2ch、2dh的ram中
; 解码成功
JMP IR_GOTO
IR_Rp:
; 这里为重复码执行处
; 按住遥控按键时,每过108ms就到这里来
JMP IR_GOTO
IR_ERROR:
; 出错退出
LJMP MAIN ; 退出解码子程序
;---------------------------
; 遥控执行部分
;---------------------------
IR_GOTO:
; 这里还要判断1AH和1BH两个系统码或用户码,用于识别不同的遥控器
MOV A,2AH
CJNE A,#07H,IR_ERROR ; 用户码1不对则退出
MOV A,2BH
CJNE A,#11H,IR_ERROR ; 用户码2不对则退出
; 判断两个数据码是否相反
MOV A,2CH
CPL A
CJNE A,2DH,IR_ERROR ; 两个数据码不相反则退出
; 遥控执行部分
MOV P1,1DH ; 将按键的键值通过P1口的8个LED显示出来
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
; 清除遥控值使连按失败
MOV 1AH,#00H
MOV 1BH,#00H
MOV 1CH,#00H
LJMP MAIN
;------------------------
; 延时子程序
;------------------------
DELAY882:
;-------------
; 1.085*((202*4)+5)=882
;-------------
MOV R7,#202
DELAY882_A:
NOP
NOP
DJNZ R7,DELAY882_A
RET
DELAY1000:
;-------------
; 1.085*((229*4)+5)=1000
;-------------
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY882_A
RET
DELAY2400:
;-------------
; 1.085*((245*9)+5)=2397.85
;-------------
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY882_A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -