📄 ir_rx.asm
字号:
;-----------------------------------------------------------------
;--------------------红外接收程序---------------------------------
;-----------------用外部中断INT0脚输入----------------------------
;引导码9mS低,4.5mS高+用户码16位00FF+操作码8位反码+操作码8位
;0.56mS低+0.56mS高=0;0.56mS低+0.56*3mS高=1
;-----------------------------------------------------------------
G_IR_TX BIT P3.2
;-----------------------------------------------------------------
ORG 0000H
AJMP G_Main
ORG 0003H
AJMP G_INT0
ORG 0030H
MOV SP,#50H
G_Main: SETB IT0 ;选择INT0为边沿触发方式
SETB EA ;开全局中断使能位
SETB EX0 ;开INT0中断使能位
SJMP $
;-----------------------------------------------------------------
G_INT0: PUSH ACC
PUSH PSW
MOV R3,#10 ;延时8800
G_LOOP: LCALL G_Delay880 ;延时880uS
JB G_IR_TX,G_Exit ;为1跳出中断继续检测
DJNZ R3,G_LOOP ;循环10次
JNB G_IR_TX,$ ;等待上升沿的到来延时200uS
LCALL G_Delay4780 ;延时4500uS+280uS
CLR P2.0
MOV R0,#40H
MOV R5,#04 ;计数4x8次
G_LOOP3:MOV R4,#08 ;计数8次
G_LOOP2:JNB G_IR_TX,$
LCALL G_Delay840 ;进入用户码检测
MOV C,G_IR_TX ;把值放入C
RRC A ;带进位C右移
JNB G_IR_TX,G_LOOP1 ;为0说明接收的是0码
LCALL G_Delay1120 ;为1延时1120uS
CLR P2.3
G_LOOP1:DJNZ R4,G_LOOP2 ;循环8次
CLR P2.1
MOV @R0,A ;第一个用户码放进40H单元中
INC R0 ;寄存器加1
DJNZ R5,G_LOOP3 ;循环4x8次
CLR P2.2
MOV A,41H ;第二个用户码放进41H单元中
CPL A ;
CJNE A,40H,G_Fial ;两个用户码想比较不相等接收是错的
MOV A,43H ;第二个操作码放入43H单元中
CPL A ;取反和操作码反码比较
CJNE A,42H,G_Fial ;不相等说明操作码接收错误
MOV P0,42H ;相等说明接收操作码是正确的
LJMP G_Exit
G_Fial: MOV P2,#00H ;错误p2口灯全亮
MOV P1,#00H
G_Exit: POP PSW
POP ACC
RETI
;-----------------------------------------------------------------延时880uS=1+(((3+((1+(2x108)+2))x4)))+1+2
G_Delay880:
MOV R6,#4 ;1
G_D880: MOV R7,#108 ;1
DJNZ R7,$ ;2x108
DJNZ R6,G_D880 ;
NOP
RET
;-----------------------------------------------------------------延时4780uS
G_Delay4780:
MOV R6,#25
G_D4780:MOV R7,#94
DJNZ R7,$
DJNZ R6,G_D4780
RET
;-----------------------------------------------------------------延时840uS
G_Delay840:
MOV R6,#5
G_D840: MOV R7,#82
DJNZ R7,$
DJNZ R6,G_D840
RET
;------------------------------------------------------------------延时1120uS
G_Delay1120:
MOV R6,#5
G_D1120:MOV R7,#110
DJNZ R7,$
DJNZ R6,G_D1120
RET
;-----------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -