;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IR_IN EQU P3.2
BZ EQU P2.0
LED EQU P2.1 ;进入中断后亮,退出中断熄灭
LED1 EQU P2.7 ;程序正常运行,长亮或不亮表示死循环
LED2 EQU P2.2 ;串口正在发送数据
LED3 EQU P3.4 ;解码正确则亮,否则熄灭
LED4 EQU P3.5 ;解码错误指示灯亮
LED_PORT EQU P0 ;数码管显示端口
FLAG EQU 20H.0 ;接收正确标志
R_Data EQU 30H
DATA_USR EQU 31H ;接收红外编码中的用户码
DATA_USN EQU 32H ;反码
DATA_OPT EQU 33H ;接收红外编码中的操作码
DATA_OPN EQU 34H ;反码
DISP_BUF EQU 35H ;存放数码管显示的内容
TX_BUF EQU 36H
CONT0 EQU 40H
CONT1 EQU 41H
CONT2 EQU 42H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
AJMP RESET
ORG 0003H
AJMP INT0_ISR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RESET AND SYSTEM INIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET: MOV SP, #60H
CLR BZ
MOV R0, #07FH
CLR A
R_LP: MOV @R0, A
DJNZ R0, R_LP
MOV R0, #0FFH
CLR A
R_LP0: MOV @R0, A
DEC R0
CJNE R0, #7FH,R_LP0
LCALL INT0_INIT
MOV TMOD,#21H
MOV TH1, #0FDH
MOV TL1, #0FDH
MOV TH0, #00H
MOV TL0, #00H
MOV SCON,#50H
CLR TR0
SETB TR1
SETB LED3
SETB LED4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN: NOP
INC CONT0
MOV A,CONT0
CJNE A,#250,JIXU0
MOV CONT0,#00
INC CONT1
MOV A,CONT1
CJNE A,#250,JIXU0
MOV CONT1,#00
CPL LED1
INC CONT2
MOV A,CONT2
CJNE A,#2,JIXU0
MOV CONT2,#0
CPL P2.2
JIXU0: NOP
JNB FLAG,MAIN ;接收正确?
MOV A,DATA_OPT ;正确,显示数字,发送数码
ANL A,#0FH
MOV R2,A
CLR CY
SUBB A,#10
JB CY,XIAOYU10
AJMP JIXU1
XIAOYU10:MOV A,R2
JIXU1: MOV DISP_BUF,A ;操作码送显示数码管
LCALL LED_DISPLAY
TX_TRS: CLR LED2
CLR EA ;TX DATA TO PC
MOV A,DATA_USR
CJNE A,#0FFH,TX_TRS0
AJMP TX_EXIT
TX_TRS0:
MOV TX_BUF,DATA_USR
;LCALL TX_BYTE
MOV TX_BUF,DATA_USN
;LCALL TX_BYTE
MOV TX_BUF,DATA_OPT
LCALL TX_BYTE
MOV TX_BUF,DATA_OPN
;LCALL TX_BYTE
TX_EXIT:
SETB EA
SETB LED2
AJMP MAIN
LED_DISPLAY:
MOV A,DISP_BUF
MOV DPTR,#TABLED
MOVC A,@A+DPTR
MOV LED_PORT,A
NOP
RET
INT0_ISR:
PUSH ACC
PUSH PSW
CLR EA
CLR LED
SETB BZ
MOV R4,#0AH
I_LOP:
LCALL DEL840
JB IR_IN,DECODE_ERROR_0 ;9MS内出现高电平则出错
DJNZ R4,I_LOP ;引导码检测 9MS_H
JNB IR_IN, $ ;引导码检测 ;等待高
LCALL DEL4D7MS ;延时4.7MS,避开引导码
;--------------------------------------------------------
MOV R3,#04H ;共4个字节
MOV R1,#DATA_USR
NEXT_BYTE:
MOV R4,#08H
NEXT_BIT: ;检测一位数据
JNB IR_IN,$ ;等待560US结束,;560=230H
LCALL DEL840 ;840US后的IR_IN状态即为此时对应的数据位
MOV C,IR_IN
RRC A
JNB IR_IN,BIT_IS_ZERO
LCALL DEL1120 ;数据位是1时,延时1120US,
BIT_IS_ZERO:
NOP ;否则不延时
DJNZ R4,NEXT_BIT
MOV @R1,A
INC R1
DJNZ R3,NEXT_BYTE
MOV R1,#DATA_USR ;检查操作码正确?
MOV A,@R1
INC R1
ANL A,@R1
CJNE A,#00H,DECODE_ERROR ;操作码检验失败
CLR P3.7
SETB P3.6
SETB LED4
NEXTBY3:
SETB FLAG ;置1接接收正确标志
;解码正确,LED3熄灭
AJMP DE_EXT0
;-------------------------------------------------------
DE_EXIT: CLR FLAG
DE_EXT0: SETB LED
CLR BZ
SETB EA
POP PSW
POP ACC
RETI ;接收完成中断返回
;-------------------------------------------------------
DECODE_ERROR_0:
CLR P3.6
SETB P3.7
SETB LED4
AJMP DE_EXIT
;引导码出错,返回
;-------------------------------------------------------
DECODE_ERROR:
CLR FLAG
CLR LED4
SETB P3.6
SETB P3.7
AJMP DE_EXIT ;解码校验出错,返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;NAME : TABLED:
; : GONG YIN JI LED TAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TABLED: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H,0BFH,0FFH
; 0, 1, 2, 3, 4, 5, 6, ,7 8, 9, -, 灭
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;NAME : INT0_INIT
;FUNCTION: ;外部中断0初始化
;INPUT : NONE
;OUTPUT : NONE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT0_INIT:
SETB EX0 ;外中断允许
SETB IT0
SETB EA ;start the int0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;NAME : TX_BYTE
;FUNCTION: SEND BYTE TO RS232
;INPUT : TX_BUF
;OUTPUT : PC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TX_BYTE:
CLR TI
MOV SBUF,TX_BUF
JNB TI,$
CLR TI
RET
DEL4D7MS:
MOV R7,#15
L_LOP0: MOV R6,#155
DJNZ R6,$
DJNZ R7,L_LOP0
RET
DEL470US:
MOV R7,#4
L_LOP1: MOV R6,#52
DJNZ R6,$
DJNZ R7,L_LOP1
RET
DEL1120:
MOV R7,#5
L_LOP2:
MOV R6,#110
DJNZ R6,$
DJNZ R7,L_LOP2
RET
DEL840:
MOV R7,#5
L_LOP3:
MOV R6,#82
DJNZ R6,$
DJNZ R7,L_LOP3
RET
DEL880US:
MOV R6,#5 ;//延时880微秒
D2: MOV R7,#86 ;
DJNZ R7,$
DJNZ R6,D2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END |