;12位分辨率DS18B20程序
;======================================================================
;下面代码是本人在前人的基础上,吸收优化,适合本人实际应用。
;;特点:
;1.防止定时器打断时序;
;2.考虑了DS18B20损坏或者断线,单片机不会死循环;
;3.具备补码=〉原码;
;4.复位不正常时给出温度-55度,提醒用户检查;
;5.稳定性:冰水 0度->用电吹风 120度->冰水 0度 正常//测试时请不要把引脚弄湿短路
;6.破坏性:加热到150度以上,再降温到120度,软件正常显示实际温度;
;注意:
;在调试中,发现时序与DS18B20的批次有关,不同批次需要微调时序;
;如果发现结果错误,请先调整debug 1,不行再依次调整debug 2,debug 3……
;或许全部都要调整,看你运气 ^_^;
;CPU AT89C52 11.0592MHz
;DQ BIT P1.7
;**********************************************************************
;[DS18B20模块]//12位分辨率
;检测DS18B20的温度,最多检测3次;如果失败,给出-55度
;出口:DS1820_L,DS1820_H
;使用资源:A,C,R0,R6,R7,TH0
;Edited by hello 2002/08/19/22
;Changed by hello 2002/08/20/16/06||禁止修改||
;----------------------------------------------------------------------
DS1820:
MOV DS1820_L,#70H
MOV DS1820_H,#83H
MOV TH0,#00 ;防止中断打乱时序
MOV R1,#03
DS1820_1:
LCALL RE1820 ;RESET DS1820
JNZ DS1820_9 ;RESET FAIL
MOV TH0,#00 ;防止中断打乱时序
MOV A,#0CCH ;SKIP ROM
LCALL WR1820
MOV A,#44H ;CONVER T
LCALL WR1820
MOV A,#8 ;/debug 4
LCALL DL100M ;100ms
MOV TH0,#00
LCALL RE1820 ;RESET DS1820
JNZ DS1820_9 ;RESET FAIL
MOV A,#0CCH ;SKIP ROM
LCALL WR1820
MOV TH0,#00 ;防止中断打乱时序
MOV A,#0BEH ;Read scratchpad
LCALL WR1820
MOV TH0,#00 ;防止中断打乱时序
LCALL RD1820
MOV DS1820_L,A
LCALL RD1820
MOV DS1820_H,A ;采样完成
;SJMP DS1820_EXIT
CJNE A,#80H,$+3 ;以下给同事提供方便,将补码还原成原码
JC DS1820_EXIT
CPL A
SETB ACC.7
MOV DS1820_H,A
MOV A,DS1820_L
CPL A
INC A
MOV DS1820_L,A
SJMP DS1820_EXIT
DS1820_9:
DJNZ R1,DS1820_1
DS1820_EXIT:
RET
;-------------------------------------------------------------------------
;[DS1820复位模块]
;出口:A
;复位成功:A=#0,复位失败:A=#0FFH
;使用资源:A,R7
;Edited by hello 2002/08/20
;-------------------------------------------------------------------------
RE1820:
MOV A,#00H ;RESET DS1820 OK
CLR DQ
MOV R7,#100
DJNZ R7,$
DJNZ R7,$
;DQ=#0,DELAY=255*2+100*2=710us /debug 3
SETB DQ
MOV R7,#35
DJNZ R7,$ ;DQ=#1,DELAY=35*2=70us
/debug 3
JNB DQ,RE1820_1 ;RESET OK,GOTO RE1820_1
MOV A,#0FFH ;FAIL,A=#0FFH
RE1820_1:
MOV R7,#240
DJNZ R7,$ ;DELAY=160*2=320us
/debug 3
RET
;------------------------------------------------------------------------
;[DS1820写1个字节]
;入口:A
;使用资源:A,C,R6,R7
;Edited by hello 2002/08/20
;------------------------------------------------------------------------
WR1820:
MOV R6,#08 ;1B=8bit
WR1820_1:
CLR DQ
MOV R7,#6
DJNZ R7,$ ;DQ=#0,DELAY=7*2=15us //debug 2
RRC A ;1us
MOV DQ,C ;1us
MOV R7,#25
DJNZ R7,$ ;DQ=#1,20*2=60us //debug 2
SETB DQ
NOP
NOP
DJNZ R6,WR1820_1
SETB DQ
RET
;----------------------------------------------------------------------
;[DS1820读1个字节]
;出口 :A
;使用资源:A,C,R6,R7
;Edited by hello 2002/08/20
;----------------------------------------------------------------------
RD1820:
MOV R6,#08
RD1820_1:
SETB DQ
NOP
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R7,#7
DJNZ R7,$ ;DQ=1,9*2=18us
//debug 1
MOV C,DQ
RRC A
MOV R7,#7
DJNZ R7,$ ;DQ=1,9*2=18us
//debug 1
NOP
DJNZ R6,RD1820_1
RET
;----------------------------------------------------------------------
;**********************************************************************