DS18B20的读写程序
RE00:
MOV R2,#8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;//*****************************************//
; 将从DS18B20中读出的温度数据进行转换
;//*****************************************//
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A ; 保存变换后的温度数据
LCALL BIN_BCD
RET
;//*****************************************//
; 将16进制的温度数据转换成压缩BCD码
;//*****************************************//
BIN_BCD:
MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H
;//*****************************************//
函数TEMPER_COV中的Bug所在:四舍五入进行得太早!
当读入的温度是31.5度时,TEMPER_L中的数值为11111XXX
TEMPER_H中的数值为00000001,按你的程序,在四舍五入完成时(INC TEMPER_NUM),TEMPER_NUM中为00010000,在后面和TEMPER_H中数据相或时,
这个进位的1就给忽略了,造成转换结果是16度。
只要把四舍五入放到最后进行就可以了!
0
上一篇:DS18B20温度转换
下一篇:没有了
下一篇:没有了
最新评论共有 0 位网友发表了评论
查看所有评论
发表评论
热点关注

