ds1820雖然具有測(cè)溫系統(tǒng)簡(jiǎn)單、測(cè)溫精度高、連接方便、占用口線(xiàn)少等優(yōu)點(diǎn),但在實(shí)際應(yīng)用中也應(yīng)注意以下幾方面的問(wèn)題:
(1)較小的硬件開(kāi)銷(xiāo)需要相對(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)。由于本節(jié)技術(shù)復(fù)雜性,對(duì)一般讀者ds18b20內(nèi)容只作閱讀。
(2)在ds1820的有關(guān)資料中均未提及單總線(xiàn)上所掛ds1820數(shù)量問(wèn)題,容易使人誤認(rèn)為可以?huà)烊我舛鄠€(gè)ds1820,在實(shí)際應(yīng)用中并非如此。當(dāng)單總線(xiàn)上所掛ds1820超過(guò)8個(gè)時(shí),就需要解決微處理器的總線(xiàn)驅(qū)動(dòng)問(wèn)題,這一點(diǎn)在進(jìn)行多點(diǎn)測(cè)溫系統(tǒng)設(shè)計(jì)時(shí)要加以注意。
(3)連接ds1820的總線(xiàn)電纜是有長(zhǎng)度限制的。試驗(yàn)中,當(dāng)采用普通信號(hào)電纜傳輸長(zhǎng)度超過(guò)50m時(shí),讀取的測(cè)溫?cái)?shù)據(jù)將發(fā)生錯(cuò)誤。當(dāng)將總線(xiàn)電纜改為雙絞線(xiàn)帶屏蔽電纜時(shí),正常通訊距離可達(dá)150m,當(dāng)采用每米絞合次數(shù)更多的雙絞線(xiàn)帶屏蔽電纜時(shí),正常通訊距離進(jìn)一步加長(zhǎng)。這種情況主要是由總線(xiàn)分布電容使信號(hào)波形產(chǎn)生畸變?cè)斐傻?。因此,在用ds1820進(jìn)行長(zhǎng)距離測(cè)溫系統(tǒng)設(shè)計(jì)時(shí)要充分考慮總線(xiàn)分布電容和阻抗匹配問(wèn)題。
溫度傳感器ds18b20指令(命令)說(shuō)明
命令功能
指令代碼
功能說(shuō)明
讀rom
33h
讀ds18b20中的64位光刻rom序列號(hào)
啟動(dòng)轉(zhuǎn)換
44h
啟動(dòng)溫度轉(zhuǎn)換,結(jié)果存入內(nèi)部高速暫存器ram中
寫(xiě)溫限值
4eh
向內(nèi)部字節(jié)地址2和3 中寫(xiě)入上下限溫度值
匹配rom
55h
發(fā)出命令后,還發(fā)送64位rom序列號(hào)尋找對(duì)應(yīng)號(hào)碼的18b20
讀供電
b4h
讀電源供給方式: 18b20發(fā)0為寄生供電,1為外接供電
讀取溫度
beh
讀取溫度寄存器等9字節(jié)的內(nèi)容
跳過(guò)rom
cch
單片18b20時(shí),跳過(guò)讀序列號(hào)操作,直接發(fā)溫度轉(zhuǎn)換
報(bào)警搜索
ech
執(zhí)行后,當(dāng)溫度超過(guò)上下限值時(shí)18b20才作響應(yīng)
搜索rom
f0h
搜索同一條線(xiàn)上掛接有幾個(gè)18b20,識(shí)別rom
(4)在ds18b20測(cè)溫程序設(shè)計(jì)中,向ds18b20發(fā)出溫度轉(zhuǎn)換命令后,程序總要等待ds18b20的返回信號(hào),一旦某個(gè)ds18b20接觸不好或斷線(xiàn),當(dāng)程序讀該ds18b20時(shí),將沒(méi)有返回信號(hào),程序會(huì)進(jìn)入死循環(huán)。這一點(diǎn)在進(jìn)行ds18b20硬件連接和軟件設(shè)計(jì)時(shí)也要給予一定的重視。測(cè)溫電纜線(xiàn)建議采用屏蔽4芯雙絞線(xiàn),其中一對(duì)線(xiàn)接地線(xiàn)與信號(hào)線(xiàn),另一組接vcc和地線(xiàn),屏蔽層在源端單點(diǎn)接地。
當(dāng)用p1.0和ds18b20相連接時(shí)參考程序如下。
dq equ p1.0
org 0000h
ajmp main
org 1000h
main: lcall init_18b20;調(diào)復(fù)位子程序
mov a,#0cch
lcall write_18b20 ; 跳過(guò)讀序列號(hào)操作
mov a,#4eh;寫(xiě)限制溫度命令
lcall write_18b20
mov a, #th;寫(xiě)入上限溫度值
lcall write_18b20
mova,#tl
lcall write_18b20;寫(xiě)入下限溫度值
mov a, config12
lcall write_18b20;設(shè)為12位轉(zhuǎn)換精度
main1: lcall init_18b20?。粡?fù)位子程序
lcall rd_temper??;讀溫度
lcall ldvv ;調(diào)數(shù)據(jù)處理子程序,簡(jiǎn)寫(xiě)程序
lcall display;調(diào)顯示子程序, 省略程序
ljmp main1
;**********ds18b20復(fù)位程序*****************
init_18b20: mov r7 #06h;復(fù)位時(shí)查詢(xún)次數(shù)
lop0: setb dq;18b20輸入端
mov r0,#0fbh
clr dq
tsr1: djnz r0,tsr1??;維持dq低電平480μs~960μs
setb dq
mov r0,#25h
tsr2: djnz r0,tsr2
jnb dq ,tsr3?。徊榭?8b20把dq拉低否
djnz r7,lop0 ;未拉低則延時(shí)再查,6次結(jié)束
setb p2.0??;延時(shí)期未能查到18b20
sjmp tsr4
tsr3: setb flag1??;置標(biāo)志位flag1,表明ds18b20存在
clr p2.0??;二極管指示
tsr5: mov r0,#06bh
tsr6: djnz r0,tsr6;延時(shí)后結(jié)束
clr c
orl c, dq
lop1;jc tsr4 ;確認(rèn)一次
ajmp tsr7
tsr4: clr flag1??;未能查到
setb p2.0;取消指示燈
setb dq?。槐砻鞑淮嬖?br>tsr7: ret
;*****************讀轉(zhuǎn)換后的溫度值****************
rd_temper:
setb dq
lcall init_18b20
jb flag1,tss2
ret?。蝗舨淮嬖趧t返回
tss2: mov a,#0cch;跳過(guò)rom
lcall write_18b20
mov a,#44h;發(fā)出溫度轉(zhuǎn)換命令
lcall write_18b20
lcall delay??;調(diào)延時(shí)子程序500ms
lcall init_18b20??;調(diào)復(fù)位子程序
mov a,#0cch ;跳過(guò)rom
lcall write_18b20
mov a,#0beh ;發(fā)出讀溫度換命令
lcall write_18b20
lcall read2_18b20??;讀兩個(gè)字節(jié)的溫度
ret
;***************寫(xiě)ds18b20程序************
write_18b20:
mov r2,#8
setb dq
wr1: clr dq
mov r3,#6
djnz r3,$;寫(xiě)前保持15μs低電平
rrc a
mov dq,c??;寫(xiě)入一位
mov r3,#30
djnz r3,$?。坏却?8b20讀入
setb dq
djnz r2,wr1?。?位寫(xiě)完否
setb dq?。粚?xiě)完結(jié)束
ret
;***********讀18b20程序,讀出兩個(gè)字節(jié)的溫度*********
read2_18b20:
mov r4,#2;低位存在29h,高位存在28h
mov r1,#29h
re00: mov r2,#8
re01: clr dq?。坏碗娖?0μs
nop
nop
nop
setb dq??;高電平延時(shí)
mov r3,#7
djnz r3,$
mov c,dq;讀入一位溫度到c中
mov r3,#30
djnz r3,$
rrc a
djnz r2,re01 ;共讀8位
mov @r1,a;保存
decr1?。槐4嫦乱粩?shù)據(jù)單元地址
djnz r4,re00??;讀第二字節(jié)
ret
;************讀出的溫度進(jìn)行數(shù)據(jù)轉(zhuǎn)換**************
ldvv: mov a,29h ; 看成溫度大于0
mov c,28h.0 ;將28h中的最低位移入c
rrc a
mov c,28h.1
rrc a
mov c,28h.2
rrc a
mov c,28h.3
rrc a
mov 30h,a ;整數(shù)溫度結(jié)果存30h單元
jnc lop2??;小數(shù)點(diǎn)后面的數(shù)四舍五入
inc 30h
lop2:ret