DS18B20溫度傳感器的內(nèi)部存儲(chǔ)器包括一個(gè)高速暫存RAM和一個(gè)非易失性的可電擦除的E2RAM,后者存放高溫度和低溫度觸發(fā)器TH、TL和結(jié)構(gòu)寄存器。
暫存存儲(chǔ)器包含了8個(gè)連續(xù)字節(jié),前兩個(gè)字節(jié)是測(cè)得的溫度信息,第一個(gè)字節(jié)的內(nèi)容是溫度的低八位,第二個(gè)字節(jié)是溫度的高八位。第三個(gè)和第四個(gè)字節(jié)是TH、TL的易失性拷貝,第五個(gè)字節(jié)是結(jié)構(gòu)寄存器的易失性拷貝,這三個(gè)字節(jié)的內(nèi)容在每一次上電復(fù)位時(shí)被刷新。第六、七、八個(gè)字節(jié)用于內(nèi)部計(jì)算。第九個(gè)字節(jié)是冗余檢驗(yàn)字節(jié)。
該字節(jié)各位的意義如下:
TM R1 R0 1 1 1 1 1
低五位一直都是1 ,TM是測(cè)試模式位,用于設(shè)置DS18B20在工作模式還是在測(cè)試模式。在DS18B20出廠時(shí)該位被設(shè)置為0,用戶不要去改動(dòng)。R1和R0用來(lái)設(shè)置分辨率,如下表所示:(DS18B20出廠時(shí)被設(shè)置為12位)
分辨率設(shè)置表:
R1 R0 分辨率 溫度最大轉(zhuǎn)換時(shí)間
0 0 9位 93.75ms
0 1 10位 187.5ms
1 0 11位 375ms
1 1 12位 750ms
根據(jù)DS18B20的通訊協(xié)議,主機(jī)控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過(guò)三個(gè)步驟:每一次讀寫(xiě)之前都要對(duì)DS18B20進(jìn)行復(fù)位,復(fù)位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對(duì)DS18B20進(jìn)行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500微秒,然后釋放,DS18B20收到信號(hào)后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收到此信號(hào)表示復(fù)位成功。
DS1820使用中注意事項(xiàng)
DS1820雖然具有測(cè)溫系統(tǒng)簡(jiǎn)單、測(cè)溫精度高、連接方便、占用口線少等優(yōu)點(diǎn),但在實(shí)際應(yīng)用中也應(yīng)注意以下幾方面的問(wèn)題:
(1)較小的硬件開(kāi)銷需要相對(duì)復(fù)雜的軟件進(jìn)行補(bǔ)償,由于DS1820與微處理器間采用串行數(shù)據(jù)傳送,因此,在對(duì)DS1820進(jìn)行讀寫(xiě)編程時(shí),必須嚴(yán)格的保證讀寫(xiě)時(shí)序,否則將無(wú)法讀取測(cè)溫結(jié)果。在使用PL/M、C等高級(jí)語(yǔ)言進(jìn)行系統(tǒng)程序設(shè)計(jì)時(shí),對(duì)DS1820操作部分最好采用匯編語(yǔ)言實(shí)現(xiàn)。
(2)在DS1820的有關(guān)資料中均未提及單總線上所掛DS1820數(shù)量問(wèn)題,容易使人誤認(rèn)為可以掛任意多個(gè)DS1820,在實(shí)際應(yīng)用中并非如此。當(dāng)單總線上所掛DS1820超過(guò)8個(gè)時(shí),就需要解決微處理器的總線驅(qū)動(dòng)問(wèn)題,這一點(diǎn)在進(jìn)行多點(diǎn)測(cè)溫系統(tǒng)設(shè)計(jì)時(shí)要加以注意。
匯編源程序如下:
ORG 0000H
TEMPER_L EQU 41H ;用于保存讀出溫度的低8位
TEMPER_H EQU 40H ;用于保存讀出溫度的高8位
FLAG1 EQU 38H ;是否檢測(cè)到DS18B20標(biāo)志位
A_BIT1 EQU 31H ;數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置
B_BIT1 EQU 32H ;數(shù)碼管十位數(shù)存放內(nèi)存位置
D_BIT1 EQU 35H ;數(shù)碼管百位數(shù)存放內(nèi)存位置
DQ EQU P3.7 ;30H,31H,32H,33H: X 個(gè)位 十位 X
MOD7: MOV SP,#60H
LCALL GET_TEMPER ;調(diào)用讀溫度子程序
LCALL TEMPCOV
LCALL DISPLAY ;調(diào)用數(shù)碼管顯示子程序
AJMP MOD7
TEMP0: INC A
AJMP TEMP1
TEMPCOV: MOV A,TEMPER_L ;數(shù)據(jù)處理子程序TEMPCOV
MOV B,#16
DIV AB
JB B.3,TEMP0
TEMP1: MOV 34H,A ;將TEMPER_L的高四位右移四位,存入34H中(溫度值)
MOV A,B ;將TEMPER_L的低四位X10/16得小數(shù)后一位數(shù).
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 30H,A ;將小數(shù)后一位數(shù).存入30H中
MOV A,TEMPER_H ;TEMPER_H中存放高8位數(shù),權(quán)重16
MOV B,#16
MUL AB
ADD A,34H ;34H中存入溫度值的整數(shù)部分
MOV B,#10
DIV AB
MOV 31H,B ;個(gè)位存入31H中
MOV B,#10 ;
DIV AB ;
MOV 32H,B ;十位存入32H中
MOV B,#10 ;
DIV AB ;
MOV 35H,B ;百位存入33H中
MOV A,TEMPER_H
MOV 33H,#10H ;
JB ACC.7,EXIT7
MOV 33H,#00H
EXIT7: RET
INIT_1820: ;這是DS18B20復(fù)位初始化子程序
SETB DQ
NOP
CLR DQ ;主機(jī)發(fā)出延時(shí)537微秒的復(fù)位低脈沖
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB DQ ;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DQ,TSR3 ;等待DS18B20回應(yīng)
DJNZ R0,TSR2
LJMP TSR4 ;延時(shí)
TSR3: SETB FLAG1 ;置標(biāo)志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ;清標(biāo)志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;時(shí)序要求延時(shí)一段時(shí)間
TSR7: SETB DQ
RET
GET_TEMPER: ;讀出轉(zhuǎn)換后的溫度值
SETB DQ
LCALL INIT_1820 ;先復(fù)位DS18B20
JB FLAG1,TSS2
RET ;判斷DS1820是否存在?若DS18B20不存在則返回
TSS2: MOV A,#0CCH ;跳過(guò)ROM匹配
LCALL WRITE_1820
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_1820
LCALL DISPLAY ;等待AD轉(zhuǎn)換結(jié)束,12位的話750微秒
LCALL INIT_1820 ;準(zhǔn)備讀溫度前先復(fù)位
MOV A,#0CCH ;跳過(guò)ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200 ;將讀出的溫度數(shù)據(jù)保存到35H/36H
RET
;寫(xiě)DS18B20的子程序(有具體的時(shí)序要求)
WRITE_1820: MOV R2,#8 ;一共8位數(shù)據(jù)
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
READ_18200: MOV R4,#2 ;將溫度高位和低位從DS18B20中讀出
MOV R1,#TEMPER_L ;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
RE00: MOV R2,#8 ;數(shù)據(jù)一共有8位
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;顯示子程序
DISPLAY: MOV DPTR,#TABLE ;指定查表啟始地址
MOV R0,#4
DPL1: MOV R1,#250 ;顯示1000次
DPLOP: MOV A,A_BIT1 ;取個(gè)位數(shù)
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
MOV P0,A ;送出個(gè)位的7段代碼
CLR P2.0 ;開(kāi)個(gè)位顯示
ACALL D1MS ;顯示1MS
SETB P2.0
MOV A,B_BIT1 ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
MOV P0,A ;送出十位的7段代碼
CLR P2.1 ;開(kāi)十位顯示
ACALL D1MS ;顯示1MS
SETB P2.1
MOV A,D_BIT1 ;取百位數(shù)
MOVC A,@A+DPTR ;查百位數(shù)的7段代碼
MOV P0,A ;送出百位的7段代碼
CLR P2.2;開(kāi)百位顯示
ACALL D1MS ;顯示1MS
SETB P2.2
MOV P0,#00H
DJNZ R1,DPLOP ;100次沒(méi)完循環(huán)
DJNZ R0,DPL1 ;4個(gè)100次沒(méi)完循環(huán)
RET
;1MS延時(shí)(按12MHZ算)
D1MS: MOV R7,#0FFH
DJNZ R7,$
RET
;7段數(shù)碼管0~9數(shù)字的共陽(yáng)顯示代碼
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
注:晶振12MHZ。
本程序已通過(guò)實(shí)踐驗(yàn)證!��!