⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir.asm

📁 单片机红外遥控实例 功能:通过红外遥控实现对LED的控制
💻 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 + -