CHECK EQU 70H ;校验位缓存
;接收缓存
RSV_1 EQU 50H ;开始标志
RSV_2 EQU 51H
RSV_3 EQU 52H ;从机地址
RSV_4 EQU 53H ;信息长度
RSV_5 EQU 54H ;命令
RSV_6 EQU 55H ;参数
RSV_7 EQU 56H ;校验
;-----------------------------------------------------------------
ORG 0000H
AJMP MAIN
ORG 0023H ;串行中断入口地址
AJMP SIN
;------------------------------通信测试程序------------------------------------
ORG 0100H
MAIN: MOV SP,35H ; 修改堆栈地址
MOV TMOD,#20H ; 定时计数器1工作于方式2
MOV TH1,#0FDH ; 计数初值(11.0592MHz晶振下,波特率为9600)
MOV TL1,#0FDH
MOV SCON,#50H ; 置串口为方式1,允许接收
MOV R0,#00H ; 设置计数器初值为0
MOV R1,#07 ; 设置定长为7
MOV CHECK,#00H
SETB TR1 ; 启动定时器1
SETB EA ; 开中断
SETB ES
SIN: CLR ES ;关串行中断
CLR RI ;清接收中断标志
MOV A,@R0
ADD A,#01 ;计数值加1
MOV R0,A
CJNE R0,#07,COMPARE ;计数值是否小于定长值
COMPARE: JC SMALL ;CY=1,表示计算机初值 <定长
AJMP MORE ;CY=0,表示计算机初值> =定长
SMALL: MOV A,#50H
ADD A,@R0
DEC A
MOV A,SBUF
XRL A,CHECK
MOV CHECK,A
REND: SETB ES
RETI
MORE: MOV A,#50H ;大于等于定长时
ADD A,@R0
DEC A
MOV A,SBUF ;等于定长时最后一位不用异或,用最后一位的值和CHECK内容相比较
CJNE A,#CHECK,REND ;相等则表明传输正确
ACALL DISP
MOV R0,#00H ;重置计数初值
AJMP REND
DISP: CLR p1.5
ACALL DELAY_1
SETB p1.5
RET
DELAY_1:
MOV R0, #0FFH
LOOP2: MOV R1, #0FFH
LOOP1: NOP
NOP
DJNZ R1, LOOP1
DJNZ R0, LOOP2
RET
END