MOV A, SBUF ;将接受到字节存入队列
MOV R0, #BASE
MOV R4, #LENGTH
SHT_LOOP:
XCH A, @R0
INC R0
DJNZ R4, SHT_LOOP
TEST_HEAD: ;测试报文头
MOV R0, #BASE+LENGTH
MOV A, @R0
XRL A, #H1
JNZ ERR_HEAD
DEC R0
MOV A, @R0
XRL A, #H2
JNZ ERR_HEAD
TEST_ADDRESS: ;测试地址
DEC R0
MOV A, @R0
XRL A, #ID
JNZ ERR_ADR
TEST_CRC:
MOV A, BASE
XRL A, BASE+1
XRL A, BASE+2
JNZ ERR_CRC
SETB GET_CMD
ES_EXIT:
RETI
ERR_HEAD:
RETI
ERR_ADR:
RETI
ERR_CRC:
RETI
;--------------------------------------------------------------------------
;命令执行子程序
;--------------------------------------------------------------------------
RET_PC:
CLR ES
MOV A, #L1 ;返回头字节
ACALL TMIT
MOV A, #L2 ;返回头字节
ACALL TMIT
MOV A, #ID
ACALL TMIT
MOV A, DIS_1 ;返回温度符号
ACALL TMIT
MOV A, DIS_2 ;返回温度十位
ACALL TMIT
MOV A, DIS_3 ;返回温度个位
ACALL TMIT
MOV A, #2EH ;返回小数点
ACALL TMIT
MOV A, DIS_4 ;返回小数第一位
ACALL TMIT
MOV A, DIS_5 ;返回小数第二位
ACALL TMIT
MOV A, DOOR
ACALL TMIT
SETB SD
AJMP MAIN
;--------------------------------------------------------------------------
FORMULA:
;将61H中的低4位移入60H中的高4位,得到温度的整数部分,并存于ZHENGSHU单元
MOV 29H, 61H
MOV A, 60H
MOV C, 48H
RRC A
MOV C, 49H
RRC A
MOV C, 4AH
RRC A
MOV C, 4BH
RRC A
MOV ZHENGSHU, A
; (M每度-M剩余)/M每度,小数值存于A中
MOV A, 67H
SUBB A, 66H
MOV B, #64H
MUL AB
MOV R4, B
MOV R5, A
MOV R7, 67H
LCALL DIV457
MOV A, R3
;再减去0.25,实际应用中减去25
SUBB A, #19H
MOV DOT, A ;小数部分存于DOT中
MOV A, ZHENGSHU
SUBB A, #00H ;整数部分减去来自小数部分的借位
MOV ZHENGSHU, A
MOV C, 4BH
JNC ZHENG ;是否为负数
CPL A
INC A
MOV DIS_1, #2DH ;零度以下时,第一位显示"-"号
MOV ZHENGSHU, A
ZHENG:
MOV DIS_1, #2BH ;零度以上时,第一位显示"+"号
RET
;--------------------------------------------------------------------------
;双字节除以单字节子程序
;--------------------------------------------------------------------------
DIV457:
CLR C
MOV A, R4
SUBB A, R7
JC DV50
SETB OV ;商溢出
RET
DV50:
MOV R6, #8 ;求平均值(R4R5/R7-→R3)
DV51:
MOV A, R5
RLC A
MOV R5, A
MOV A, R4
RLC A
MOV R4, A
MOV F0, C
CLR C
SUBB A, R7
ANL C, /F0
JC DV52
MOV R4, A
DV52:
CPL C
MOV A, R3
RLC A
MOV R3, A
DJNZ R6, DV51
MOV A, R4 ;四舍五入
ADD A, R4
JC DV53
SUBB A, R7
JC DV54
DV53:
INC R3
DV54:
CLR OV
RET
;--------------------------------------------------------------------------
;转换成非压缩的BCD码
;--------------------------------------------------------------------------
BCD:
MOV A, ZHENGSHU
MOV B, #0AH
DIV AB
ORL A, #00110000B ;转换成ASCII码
MOV DIS_2, A
MOV DIS_3, B
MOV A, DIS_3
ORL A, #00110000B ;转换成ASCII码
MOV DIS_3, A
MOV A, DOT
MOV B, #0AH
DIV AB
ORL A, #00110000B ;转换成ASCII码
MOV DIS_4, A
MOV DIS_5, B
MOV A, DIS_5
ORL A, #00110000B ;转换成ASCII码
MOV DIS_5, A
RET