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