NAME MAIN ;演示主程序
MAIN_CODE SEGMENT CODE
STACK SEGMENT IDATA
RSEG STACK
DS 20H ;32 Bytes Stack
CSEG AT 0000H ;定位0
LJMP START
RSEG MAIN_CODE ;开始程序段
START: MOV SP,#STACK-1
LCALL Infrared_INIT ;红外通讯初始化
MAIN: LCALL Infrared_Test ;调用自收自发红外通讯子程序
LCALL DelayTime ;延时
JMP MAIN ;循环进行红外通讯
;********************************
;红外通讯
;********************************
;初始化
Infrared_INIT: MOV P1,#0FFH ;令发光管灭
MOV B,#1 ;初始发送数据
MOV TMOD,#20H ;定时器工作方式2,设波特率2400
MOV TH1,#0F4H
MOV TL1,#0F4H
SETB TR1 ;选通定时器1,定时器开始工作
MOV SCON,#50H ;串口工作方式1,开允许接收
RET
;红外通讯
Infrared_Test: MOV A,B
LCALL Send_Receive ;红外通讯
LCALL Light ;根据收接到的数据点亮8个红色发光管
INC B ;发送数据逐步递增
RET
;红外通讯数据自收自发子程序
Send_Receive: MOV R7,#60 ;检测接收标志最大次数
CLR TI
MOV SBUF,A
Send_Receive_1: JNB RI,Send_Receive_2 ;每隔0.1ms检测一次接收标志
MOV A,SBUF
CLR RI
RET
Send_Receive_2: LCALL Delay_01ms
DJNZ R7,Send_Receive_1
CLR A
RET
;点亮8个发光管
Light: CPL A ;0-亮,1-灭
MOV P1,A
RET
;延时0.1s
Delay_01ms: PUSH 07H
MOV R7,#50
DJNZ R7,$
POP 07H
RET
;延时程序
DelayTime: PUSH 05H ;延时0.5s
PUSH 06H
PUSH 07H
MOV R5,#5
DelayTime_1: MOV R6,#99
DelayTime_2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DelayTime_2
DJNZ R5,DelayTime_1
POP 07H
POP 06H
POP 05H
RET
END