; 一秒定时中段
; *****************************************
TOIT: PUSH PSW
PUSH ACC
MOV TH0, #3CH
MOV TL0, #0B0H
INC
MOV A, MS50
CJNE A, #14H, RETURN
MOV S1OK, #1
MOV MS50, #00H
RETURN:POP ACC
POP PSW
RETI
; *****************************************
;温度总子程序
; *****************************************
wendu: ACALL INIT_1820
ACALL RE_CONFIG
ACALL GET_TEMPER
ACALL TEMPER_COV
RET
; *****************************************
;DS18B20初始化程序
; *****************************************
INIT_1820:
SETB P2.0
NOP
CLR P2.0
MOV R0,#06BH
MOV R1,#03H
TSR1:
DJNZ R0,TSR1 ; 延时
MOV R0,#6BH
DJNZ R1,TSR1
SETB P2.0
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P2.0,TSR3
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB 20H.1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR 20H.1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#06BH
MOV R1,#03H
TSR6:DJNZ R0,TSR6 ; 延时
MOV R0,#6BH
DJNZ R1,TSR6
TSR7:SETB P2.0
RET
; *****************************************
; 重新写DS18B20暂存存储器设定值
; *****************************************
RE_CONFIG:JB 20H.1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#1FH ; 选择9位温度分辨率
LCALL WRITE_1820
RET
; *****************************************
; 读出转换后的温度值
; *****************************************
GET_TEMPER:
SETB P2.0 ; 定时入口
LCALL INIT_1820
&n
RET ; 若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL INIT_1820
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200
MOV 37H,A ; 将读出的温度数据保存
RET