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

📄 main.asm

📁 用汇编语言编写的红外遥控解码
💻 ASM
字号:
/**红外遥控解码范例**/
/**作者:田开坤**/
/**较网上可以下载到的程序相比,本代码考虑了解码过程容易死机的问题,采取办法解决了,可以解码失败,但决不死机**/

DQ      equ     0ebh            ;P4.3定义接口,参考STC89C51数据手册
EX2     equ     0c2h            ;外部中断2,参考STC89C51数据手册
SEG1    equ     0ffech          ;数码管1(最右)
SEG2    equ     0ffedh          ;数码管2
SEG3    equ     0ffeeh          ;数码管3
SEG4    equ     0ffefh          ;数码管4(最左)
BYT_DLY equ     5FH             ;延时函数参数变量
DA_BUF  equ     40H             ;解码出的数据缓冲区,包括41H


                ORG 0000h
                LJMP main

                ORG 003bh       ;外部中断2入口地址,参考STC89C51数据手册
                LJMP EINT3

                ORG 40h
main:           MOV SP,#60h
                SETB EA
                SETB EX2
                SJMP $          ;原地踏步,等中断解码


//中断接收解码模块

EINT3:          CLR EA//关闭
                MOV R6,#10
SB:             MOV BYT_DLY,#13 ;834uS
                ACALL DELAY     ;调用834微秒延时子程序
                JB DQ,EXIT      ;延时834微秒后判断DQ脚是否出现高电平如果有就退出解码程序
                DJNZ R6, SB     ;重复 10 次,目的是检测在 9000 微秒内如果出现高电平就退出解码程序
;-------------------------------;以上完成对遥控信号 起始码 的 9000 微秒的初始低电平信号的识别!!!!!

                JNB DQ, $       ;等待,避开 起始码 低电平
                JB DQ,$         ;避开结果码


/*;测试按键一次有多少位低电平,不同遥控器不一样*/
/*;电工电子中心投影遥控器只有32位,这对后边程序参数设置关系重大
                CLR A
ADDLOOP:        JNB DQ,$
                ADD A,#1
                MOV P1,A
                JB DQ,cADD
                sjmp $
*/

                MOV R7,#16      ;忽略前16位系统识别码 (即地址码)
AAQQ:           JNB DQ,$        ;通过低电平段
                ;JB DQ,$        ;以下6行代码可以用本行替换,但这样容易出现死机。
                MOV R6,#255
CTN2:           JNB DQ,DER7     ;等待有效低电平到来,避开 结果码 高电平
                MOV BYT_DLY,#3  ;42uS
                ACALL DELAY     ;调用42微秒延时子程序,延时太短,计数器R6不够大,延时太长,会错过最佳检测点
                DJNZ R6,CTN2                     
                LJMP EXIT       ;防止死机
DER7:           DJNZ R7,AAQQ

                MOV R1,#DA_BUF  ;设定1AH为起始RAM区
                MOV R2,#2       ;接收从DA_BUF到DA_BUF+1的2个内存,用于存放操作码 (即数据码) 和操作反码
PP:             MOV R3,#8       ;每组数据为8位
JJJJ:           JNB DQ,$        ;等待通过数据码的低电平信号,等高电平到来后出去;
                MOV BYT_DLY,#13 ;834uS
                ACALL DELAY     ;高电平开始后用840(560<t<1125,)微秒的时间尺去判断信号此时的高低电平状态
                MOV C,DQ        ;将DQ引脚此时的电平状态0或1存入C中
                JNC UUU         ;如果为0就跳转到UUU
                ;JB DQ,$        ;以下6行代码可以用本行替换,但这样容易出现死机。
                MOV R6,#255
CTN3:           JNB DQ,UUU      ;等待有效低电平到来,避开 结果码 高电平
                MOV BYT_DLY,#3  ;42uS
                ACALL DELAY     ;调用840微秒延时子程序
                DJNZ R6,CTN3            
                LJMP EXIT       ;防止死机

UUU:            MOV A,@R1       ;将R1中地址的给A
                RRC A           ;将C中的值0或1移入A中的最低位
                MOV @R1,A       ;将A中的数暂时存放在R1数值的内存中
                DJNZ R3,JJJJ    ;接收满8位换一个内存

                INC R1          ;对R1中的值加1,换下一个RAM
                DJNZ R2,PP      ;接收完8位数据码和8位数据反码,存放在1AH/1BH中                          

                MOV A,DA_BUF
                CPL A           ;对1AH取反后和1BH比较
                CJNE A,DA_BUF+1,EXIT    ;如果不等表示接收数据发生错误,放弃
                                
                MOV R7,DA_BUF   ;将按键的键值通过数码管显示出来!
                ACALL DISP
                CLR P1.0        ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功               
                MOV BYT_DLY,#50
                ACALL DELAY
                SETB P1.0       ;蜂鸣器停止
EXIT:           SETB EA
                reti


;-------------------------延时子程序---------------------------------
;晶振22.1184M

DELAY:          PUSH    BYT_DLY
DEL31:          PUSH    BYT_DLY
DEL32:          DJNZ    BYT_DLY,DEL32
                POP     BYT_DLY
                DJNZ    BYT_DLY,DEL31
                POP     BYT_DLY
                DJNZ    BYT_DLY,DELAY
                RET

//数码管显示,数据由R7传入
DISP:           mov dptr,#ledmap
                mov a,r7
                anl a,#0fh
                movc a,@a+dptr
                mov dptr,#SEG1
                cpl a
                movx @dptr,a

                mov dptr,#ledmap
                mov a,r7
                swap a                                  
                anl a,#0fh
                movc a,@a+dptr
                mov dptr,#SEG2
                cpl a
                movx @dptr,a

                mov dptr,#SEG3
                mov a,#0ffh
                movx @dptr,a
                mov dptr,#SEG4          
                movx @dptr,a  
                ret

ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,00

                END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -