S_DATA:MOV A,R3
MOVC A,@A+DPTR
LCALL WDATA ;写入数据
INC R3
DJNZ R2,S_DATA
RET
D_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H
;**********************************************DS18B20数据写入操作子程序
WRITE: MOV R2,#8 ;一共8位数据
CLR C
WR1:CLR DQ ;开始写入D18B20总线要处于复位(低)状态
MOV R3,#07
DJNZ R3,$ ;总线复位保持16uS以上
RRC A ;把一个字节DATA分成8个BIT环移给C
MOV DQ,C ;写入一位
MOV R3,#3CH
DJNZ R3,$ ;等待100us
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一位
SETB DQ
RET
;**********************************************DS18B20数据读取操作子程序
READ:MOV R4,#4 ;将温度低位、高位、TH、 TL从DS18B20中读
MOV R1,#TEMPL ;存入 25H、 26H、27H、28H单元
RE00:MOV R2,#8
RE01:CLR CY
SETB DQ
NOP
NOP
CLR DQ ;读前总线保持为低
NOP
NOP
NOP
SETB DQ ;开始读总线释放
MOV R3,#09 ;延时18us
DJNZ R3,$
MOV C,DQ
MOV R3,#3CH ;从DS18B20总线读得一位
DJNZ R3,$ ;等待100us
RRC A ;把读得的位值环移给A
DJNZ R2,RE01 ;读下一位
MOV @R1,A
DJNZ R4,RE00
RET
;;**********************************************温度值BCD码处理子程序
CONVTEMP:MOV A,TEMPH ;判温度是否零下
ANL A,#08H
JZ TEMPC1 ;温度为零上则跳转
CLR C
MOV A,TEMPL ;二进制数求补(双字节)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
MOV TEMPHC,#0BH ;负温度标志
MOV TEMPFC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH;正温度标志
MOV TEMPFC,#0AH
TEMPC11 :MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR ;TEMPLC Low=小数部分BCD
MOV TEMPLC,A
MOV A,TEMPL ;整数部分
ANL A,#0F0H ;取出高四位
SWAP A
MOV TEMPL,A
MOV A,TEMPH ;取出低四位
ANL A,#0FH
SWAP A ;重新组合
ORL A, TEMPL
MOV TEMP_ZH,A
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ;TEMP HC LOW-十位数BCD
MOV TEMPHC,A
MOV A, TEMPL
ANL A,#0FH
SWAP A ;TEMPLC HI=个位数BCD
ORL A, TEMPLC
MOV TEMPLC,A
MOV A,R4
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R4,A;TEMPHC HI
MOV A, TEMPHC ;TEMPHC HI=百位数BCD
ANL A,#0FH
ORL A,R4
MOV TEMPHC,A
TEMPC12:RET
;**********************************************二-十迸制转換子程序
HEX2BCD1 :MOV B, #064H
DIV AB
MOV R4,A
MoV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
TEMPDOTTAB:
DB 00H, 00H, 01H, 01H, 02H, 03H, 03H,04H ;小数部分碼表
DB 05H, 05H, 06H, 06H, 07H, 08H, 08H,09H
;**********************************************査洵温度扱警値子程序
LOOK_ALARM:MOV DPTR, #M_ALAX2;指針指到昆示信息区
MOV A,#2 ;湿示在第二行
LCALL LCD_PRINT
MOV A, #0C6H
LCALL TEMP_BJ1
MOV A,TEMP_TH ;加載TH数据
Mov LCD_X,#3 ;没置晁示位置
LCALL SHOW_DIG2H ;晁示数据
MOV A, #0CEH
LCALL TEMP_BJ1
MOV A,TEMP_TL ;加載TL数据
MoV LCD_X,#12 ;没置晁示位置
LCALL SHOW_DIG2L ;湿示数据
RET
M_ALAX1:DB "L00K ALERT CODE",0
M_ALAX2:DB "TH: TL: ",0
TEMP_BJ1:LCALL WCOM
MOV DPTR, #BJ2 ;指针指到显示信息区
MOV R1,#0
MOV R0,#2
BBJJ2: MOV A,R1
MOVC A, @A+DPTR
LCALL WDATA
INC R1
DJNZ R0, BBJJ2
RET
BJ2:DB 00H,"C"
;**********************************************LCD显示子程序
SHOW_DIG2H:MOV B,#100
DIV AB
ADD A, #30H
PUSH B
MOV B,LCD_X
LCALL LCDP2
POP B
MOV A, #0AH
XCH A,B
DIV AB
ADD A,#30H
INC LCD_X
PUSH B
MOV B,LCD_X
LCALL LCDP2
POP B
INC LCD_X
MOV A,B
MOV B,LCD_X
ADD A,#30H
LCALL LCDP2
RET
SHOW_DIG2L:
MOV B,#100
DIV AB
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H
PUSH B
MOV B,LCD_X
LCALL LCDP2
POP B
INC LCD_X
MOV A,B
MOV B,LCD_X
ADD A,#30H
LCALL LCDP2
RET
;**********************************************显示区BCD码温度值刷新子程序
DISPBCD:MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A ;小数位
MOV A,TEMPLC
SWAP A
ANL A, #0FH
MOV 71H,A ;个位
MOV A, TEMPHC
ANL A, #0FH
MOV 72H,A ;十位
MOV A, TEMPHC
SWAP A
ANL A, #0FH
MOV 73H,A ;百位
DISPBCD2 :RET