📄 irrece1.asm
字号:
/***********************************************************
红外线解码程序
引导码: 9ms 4.5ms
函数调用
unsinged char IRRead();
***********************************************************/
?PRIRRead SEGMENT CODE
PUBLIC IRREAD
RSEG ?PRIRRead
IRREAD:
CLR EA
SETB P3.2
CLR P3.5
// JB P3.2, $ ;等待红外线脉冲
MOV R6,#3
SB: LCALL YS3 ;调用900微秒延时子程序
JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB ;重复3次,目的是检测在3000微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
; JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
LCALL IOLOW_ERR ;低电平超时判断
CJNE R4,#160,DD0
LJMP EXITERR
DD0: MOV R6,#3
SB1: LCALL YS3 ;调用延时1600us
JNB P3.2,EXIT ;延时900微秒后判断P3.2脚是否出现低电平如果有就退出解码程序
DJNZ R6, SB1 ;重复3次,目的是检测在3000微秒内如果出现高电平就退出解码程序
; JB P3.2, $ ;等待高电平避开3毫秒低电平引导脉冲
LCALL IOHEI_ERR ;高电平超时判断
CJNE R4,#160,DD1
LJMP EXITERR
DD1: SETB P3.5
MOV R1,#1AH ;设定1AH为起始RAM区
MOV R2,#2
PP: MOV R3,#8
JJJJ:
; JNB P3.2,$ ;等待地址码第一位的高电平信号
LCALL IOLOW_ERR ;低电平超时判断
CJNE R4,#160,DD2
LJMP EXITERR
DD2: LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
JNC UUU ;如果为0就跳转到UUU
; SETB P3.5
; JB P3.2,$ ;如果为1就等待高电平信号结束
; CLR P3.5
LCALL IOHEI_ERR ;高电平超时判断
CJNE R4,#160,UUU
LJMP EXITERR
UUU: MOV A,@R1 ;将R1中地址的给A
RLC 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中
;以下对代码是否正确和定义进行识别
;判断结束码
; SETB P3.5
LCALL YS2 ;延时6ms
LCALL YS2
LCALL YS2 ;延时6ms
LCALL YS2
CLR P3.5
; JNB P3.2, EXIT ;判断P3.2是低电平 ,说明是错误码,退出,是高电平,正确
; LCALL IOLOW_ERR ;低电平超时判断
; CJNE R4,#160,DD4
; LJMP EXITERR
EXIT:
SETB EA ;允许中断
MOV R7,#1
RET
EXITERR:
LCALL YS2 ;延时6ms
LCALL YS2
SETB EA ;允许中断
MOV R7,#0
RET
YS1: MOV R4,#20 ;延时子程序1,精确延时1600微秒20Mhz 413 * 20 * (指令周期0.1808) = 1493
D1: MOV R5,#205 ;延时413 = (2*205+2+1)
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#30 ;延时子程序2,精确延时3018微秒 503 * 30 * 0.1808 = 2728.272
D2: MOV R5,#250 ;延时 503 = (2*250+2+1)
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#10;延时程序3,精确延时900微秒 403 * 10 * 0.1808 = 728.624
D3:MOV R5,#200 ;延时403 //1 c 403 = (2*200+2+1)
DJNZ R5,$ //2 c
DJNZ R4,D3 //2 c
RET
//低电平超时判断
IOLOW_ERR:
MOV R4,#30 ;延时子程序2,精确延时3018微秒
LD1: MOV R5,#250
LD2: DEC R5
CJNE R5,#0,LD21
LJMP LD3
LD21:JNB P3.2,LD2
LJMP LD4 ;高电平,退出
LD3: DEC R4
CJNE R4,#0,LD1 ;说明超时了,直接退出
LJMP LD5
LD4:
MOV R4,#0AH
RET
LD5: MOV R4,#160
RET
//高电平超时判断
IOHEI_ERR:
MOV R4,#30 ;延时子程序2,精确延时3018微秒
HD1: MOV R5,#250
HD2: DEC R5
CJNE R5,#0,HD21
LJMP HD3
HD21:JB P3.2,HD2
LJMP HD4 ;高电平,退出
HD3: DEC R4
CJNE R4,#0,HD1 ;说明超时了,直接退出
LJMP HD5
HD4:
MOV R4,#0AH
RET
HD5: MOV R4,#160
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -