yaokong.asm

来自「单片机红外解码及无线解码的应用」· 汇编 代码 · 共 190 行

ASM
190
字号
JK1 EQU P1.6;
JK2 EQU P1.5;
JK3 EQU P1.4;
JK4 EQU P1.3;
JK5 EQU P1.2;
JK6 EQU P1.1;
IR EQU P1.7;
BUFF EQU 1AH;
SERIOR EQU 20H;

ORG 0000H

AJMP MAIN

ORG 0023H
CLR TI;
CLR RI;
RETI;
 

ORG 0050H 
MAIN:
MOV SCON,#50H;
MOV TMOD,#20H;
MOV TH1,#0F3H;//0xF3;2400
MOV TL1,#0F3H;
;MOV SP,#7FH
SETB TR1;
;SETB EA;
;SETB ES;

START:
JB IR,$;等待遥控信号出现
MOV R6,#10
SB: ACALL YS1;调用882微秒延时子程序
JB IR,START;延时882微秒后判断IR脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
;JB IR,START;///////////////// 
JNB IR, $ ;等待高电平避开9毫秒低电平引导脉冲
ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码
MOV R1,#BUFF ;设定1AH为起始RAM区
MOV R2,#4 
PP: MOV R3,#8
JJJJ:
JB IR,START;///////////////// 
JNB IR,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,IR;将IR引脚此时的电平状态0或1存入C中
JNC UUU;如果为0就跳转到UUU
JNB IR,START;/////////////////
JB IR,$;如果为1就等待高电平信号结束
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 ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
;以下对代码是否正确和定义进行识别


;MOV A,1AH;比较高8位地址码
;XRL A,#00H ;判断1AH的值是否等于00000002,相等的话A为0
;JNZ START;如果不相等说明解码失败退出解码程序//JNZ
;MOV A,1BH;比较低8位地址
;XRL A,#0FFH ;再判断高8位地址是否正确
;JNZ START;如果不相等说明解码失败退出解码程序
MOV A,1CH;比较数据码和数据反码是否正确?
CPL A
XRL A,1DH ;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确
JNZ START;如果不相等说明解码失败退出解码程序
;CLR P1.6;解码成功发光二极管点亮指示!

MOV A,1CH
CJNE A,#18H,T12
CPL JK1
T12:
CJNE A,#1FH,T13
CPL JK2

T13:
CJNE A,#1EH,T14
CPL JK3

T14:
CJNE A,#1BH,T15
CPL JK4

T15:
CJNE A,#14H,T16
CPL JK5

T16:
CJNE A,#15H,T17
CPL JK6
;//////////////////////////////////////////////////////////////////
T17:
CJNE A,#0FH,T18;上
MOV SERIOR,#0FH
ACALL SEND

T18:
CJNE A,#05H,T19;下
MOV SERIOR,#05H
ACALL SEND

T19:
CJNE A,#0AH,T20;左
MOV SERIOR,#0AH
ACALL SEND

T20:
CJNE A,#09H,T21;右
MOV SERIOR,#09H
ACALL SEND


T21:
CJNE A,#1DH,T22
MOV P1,#80H


T22:
CJNE A,#1CH,T23
MOV P1,#0FFH

T23:

AJMP START

;判断在118毫秒内是否有连发码
;AA:MOV R1,#25
;XX:ACALL YS2
;JNB IR,HH;跳转到判断连发代码是否正确的程序段
;DJNZ R1,XX

;连发码判断程序段-----------
;HH:MOV R6,#4
;S: ACALL YS1;调用882微秒延时子程序
;JB IR,EXIT;延时882微秒后判断IR脚是否出现高电平如果有就退出解码程序
;DJNZ R6, S;重复4次,目的是确认连发码的低电平信号波形
;JNB IR, $ ;等待高电平
SEND:
MOV A,#0AAH
MOV SBUF,A
JNB TI,$    ;等待发送结束
CLR TI 
MOV R5,#70H
DJNZ R5,$

MOV A,#55H
MOV SBUF,A
JNB TI,$    ;等待发送结束
CLR TI
MOV R5,#70H
DJNZ R5,$

MOV A,#0A5H
MOV SBUF,A
JNB TI,$    ;等待发送结束
CLR TI
MOV R5,#70H
DJNZ R5,$

MOV A,SERIOR
MOV SBUF,A
JNB TI,$    ;等待发送结束
CLR TI
MOV R5,#70H
DJNZ R5,$

RET




YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1 
RET

YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2 
RET
END

⌨️ 快捷键说明

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