DS18B20數(shù)字溫度測量傳感器,網(wǎng)上介紹很多,我就不羅嗦了。見圖
DS18B20與前產(chǎn)品DS1820的不同:
DS18B20繼承了DS1820的全部優(yōu)點(diǎn),并做了如下改進(jìn) 1.供電范圍擴(kuò)大為3.0--5.5V。2.溫度分辨力可編程。3.轉(zhuǎn)換速率有很大提高.4.內(nèi)部存儲器映射關(guān)系發(fā)生變化。5.具有電源反接保護(hù)電路。5.體積減小一半。 對我們使用來說最大的不同就是DS18B20可以程序設(shè)定9~12位的分辨率數(shù)字值,而DS1820為固定的9位數(shù)字值,且溫度轉(zhuǎn)換時的延時時間由2s減為750ms。。
電路的接法:
DS18B20說明書上介紹了幾種電路的接法,但我這里就說最常用的一種接法見圖:
先介紹一下DS18B20內(nèi)部的結(jié)構(gòu):
常規(guī)的內(nèi)部邏輯圖我就不說了,只說說跟我們使用直接相關(guān)的內(nèi)容。
DS18B20的內(nèi)部存儲資源分為8個字節(jié)的ROM、9個字節(jié)的RAM、3個字節(jié)的EEPROM如下圖:

一、ROM:
在DS18B20內(nèi)部光刻了一個長度為64bit的ROM,這個編碼是器件的身份識別標(biāo)志。如下圖:

64位光刻ROM的排列是:開始(最低)8位是產(chǎn)品類型標(biāo)號,對于DS18B20來說就是(28H),接著的48位是該DS18B20自身的序列號,最后8位是前面56位的循環(huán)冗余校驗(yàn)碼(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一個DS18B20都各不相同,這樣就可以實(shí)現(xiàn)一根總線上掛接多個DS18B20的目的。
二、RAM:
高速暫存存儲器(RAM)由9個字節(jié)組成,包含了8個連續(xù)字節(jié),前兩個字節(jié)是測得的溫度信息,第一個字節(jié)的內(nèi)容是溫度溫度的低八位,第二個字節(jié)是溫度的高八位。第三個和第四個字節(jié)是溫度高限TH、溫度低限TL暫存區(qū),第五個字節(jié)是配置寄存器暫存區(qū),第6、7、8字節(jié)是系統(tǒng)保留用,就相當(dāng)于DS18B20的運(yùn)算內(nèi)存,第九個字節(jié)是冗余檢驗(yàn)字節(jié)。其分配如下表所示。

①、第0和第1字節(jié):
當(dāng)溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補(bǔ)碼形式存放在高速暫存存儲器的第0和第1個字節(jié)。單片機(jī)可通過單線接口讀到該數(shù)據(jù),讀取時低位在前,高位在后。對應(yīng)的溫度計(jì)算:當(dāng)符號位S=0時,直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)S=1時,先將補(bǔ)碼變?yōu)樵a,再計(jì)算十進(jìn)制值。
這是12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲在18B20的兩個8比特的RAM中,二進(jìn)制中的前面5位是符號位,如果測得的溫度大于0,這5位為0,只要將測到的數(shù)值乘于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際溫度。看下圖
例如+125℃的數(shù)字輸出為07D0H,十進(jìn)制是2000,乘以0.0625就等于125℃。同樣+25.0625℃的數(shù)字輸出為0191H,十進(jìn)制為401,乘以0.0625就得出25.0625℃了。-55℃的數(shù)字輸出為FC90H,因?yàn)榉栁粸?,先將1111110010010000取反,得1101101111,再加一得1101110000,十進(jìn)制為880,乘以0.0625就得55,為負(fù)值,即-55℃。
② 第2第3字節(jié):
RAM的第2、3、4字節(jié)和EEPROM的三個字節(jié)是對應(yīng)的,內(nèi)容是相同的,只是RAM因?yàn)槭菚捍嫫?,失電后?shù)據(jù)就丟失了。而EEPROM是電擦除只讀存儲器,失電后數(shù)據(jù)不會丟失。在工作時得到復(fù)位命令后就從EEPROM復(fù)制一份數(shù)據(jù)到RAM的第2、3、4字節(jié)內(nèi),作為我們進(jìn)行報(bào)警搜索、改寫報(bào)警值和改寫器件設(shè)置用,我們從外部只能對RAM進(jìn)行操作,EEPROM只能從RAM復(fù)制而得到要保存的數(shù)據(jù)。
第2字節(jié)為報(bào)警值高限TH,第3字節(jié)為報(bào)警值低限。DS18B20完成一次溫度轉(zhuǎn)換后,就拿溫度值和存儲在TH和TL中的值進(jìn)行比較,因?yàn)檫@些寄存器是8位的,所以小數(shù)位被忽略不計(jì)。TH或TL的最高有效位直接對應(yīng)16位溫度寄存器的符號位。如果測得的溫度高于TH或低于TL,器件內(nèi)部就會置位一個報(bào)警標(biāo)識。每進(jìn)行一次測溫就對這個標(biāo)識進(jìn)行一次更新。當(dāng)報(bào)警標(biāo)識置位時,DS18B20會對報(bào)警搜索命令有反應(yīng)。這樣就允許許多DS18B20并聯(lián)在一起同時測溫,如果某個地方溫度超過了限定值。報(bào)警的器件就會被立即識別出來并讀取。而不用讀未報(bào)警的器件。
③ 第4字節(jié) 配置寄存器:
第4字節(jié)的配置寄存器是用來設(shè)置DS18B20的工作模式和測量精度的,其內(nèi)容如下圖:

低五位一直都是"1",TM是測試模式位,用于設(shè)置DS18B20在工作模式還是在測試模式。在DS18B20出廠時該位被設(shè)置為0,用戶不要去改動。R1和R0用來設(shè)置分辨率,如下圖所示:(DS18B20出廠時被設(shè)置為12位)
我們使用時可以跟據(jù)實(shí)際需要通過修改RAM第4字節(jié)的R0和R1的值來DS18B20的溫度測量精度。需要保存這種設(shè)置時,還要用一條復(fù)制命令將RAM內(nèi)的數(shù)據(jù)復(fù)制到EEPROM內(nèi)。
④ 第5、6、7、8字節(jié):
前面我們已經(jīng)說過。RAM的第5、6、7字節(jié)是器件的保留字節(jié),就相當(dāng)于器件內(nèi)部轉(zhuǎn)換運(yùn)算時所用的內(nèi)存。第8字節(jié)是循環(huán)冗余校驗(yàn)字節(jié)。它是前面8個字節(jié)的CRC值。起著對前面字節(jié)的校驗(yàn)作用。
三、EEPROM:
EEPROM只有三個字節(jié),和RAM的第2、3、4字節(jié)的內(nèi)容相對應(yīng),它的作用就是存儲RAM第2、3、4字節(jié)的內(nèi)容,以使這些數(shù)據(jù)在掉電后不丟失??赡芡ㄟ^幾條命令將RAM的該3個字節(jié)內(nèi)容復(fù)制到EEPROM或從EEPROM將該3個字節(jié)內(nèi)容復(fù)制到RAM的第2、3、4字節(jié)去。因?yàn)槲覀儚耐獠肯敫膶憟?bào)警值和器件的設(shè)置都是只對RAM進(jìn)行操作的。要保存這些設(shè)置后的數(shù)據(jù)就還要用相應(yīng)的命令將RAM的數(shù)據(jù)復(fù)制到EEPROM去。
好了,下面說說對DS18B20的操作都有哪些命令:
對DS18B20的操作分為對ROM的操作和對RAM的操作。列表見下圖:
實(shí)際操作的具體實(shí)現(xiàn):
DS18B20是單總線器件,通訊協(xié)議包括幾種單線信號類型:復(fù)位脈沖、存在脈沖、寫0、寫1、讀0、讀1。所有這些信號,除存在脈沖外,其余都是由總線控制器(單片機(jī))發(fā)出的。根據(jù)DS18B20的通訊協(xié)議,主機(jī)(單片機(jī))控制DS18B20完成一次操作經(jīng)過三個步驟:①要對DS18B20進(jìn)行復(fù)位操作,②復(fù)位成功后發(fā)送一條ROM指令,③最后發(fā)送RAM指令,這樣才能對DS18B20進(jìn)行預(yù)定的操作。
① 對DS18B20復(fù)位操作:
主機(jī)(單片機(jī))和DS18B20間的任何通訊都需要以初始化序列開始,初始化序列就是主機(jī)發(fā)出一個復(fù)位脈沖跟著檢測一個DS18B20的存在脈沖,表明DS18B20已經(jīng)準(zhǔn)備好發(fā)送和接收數(shù)據(jù)。初始化序列見下圖:

主機(jī)首先發(fā)出一個480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖剑⒃陔S后的480微秒時間內(nèi)對總線進(jìn)行檢測,如果有低電平出現(xiàn)說明總線上有器件已做出應(yīng)答。若無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答。
做為從器件的DS18B20在一上電后就一直在檢測總線上是否有480-960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應(yīng)存在脈沖,告訴主機(jī)本器件已做好準(zhǔn)備。若沒有檢測到就一直在檢測等待。
?、凇S18B20的寫和讀操作:
接下來就是主機(jī)發(fā)出各種操作命令,但各種操作命令都是向DS18B20寫0和寫1組成的命令字節(jié),接收數(shù)據(jù)時也是從DS18B20讀取0或1的過程。因此首先要搞清主機(jī)是如何進(jìn)行寫0、寫1、讀0和讀1的。
寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機(jī)先把總線拉低1微秒表示寫周期開始。隨后若主機(jī)想寫0,則繼續(xù)拉低電平最少60微秒直至寫周期結(jié)束,然后釋放總線為高電平。若主機(jī)想寫1,在一開始拉低總線電平1微秒后就釋放總線為高電平,一直到寫周期結(jié)束。而做為從機(jī)的DS18B20則在檢測到總線被拉底后等待15微秒然后從15us到45us開始對總線采樣,在采樣期內(nèi)總線為高電平則為1,若采樣期內(nèi)總線為低電平則為0。
對于讀數(shù)據(jù)操作時序也分為讀0時序和讀1時序兩個過程。讀時隙是從主機(jī)把單總線拉低之后,在1微秒之后就得釋放單總線為高電平,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。DS18B20在檢測到總線被拉低1微秒后,便開始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結(jié)束。若要送出1則釋放總線為高電平。主機(jī)在一開始拉低總線1微秒后釋放總線,然后在包括前面的拉低總線電平1微秒在內(nèi)的15微秒時間內(nèi)完成對總線進(jìn)行采樣檢測,采樣期內(nèi)總線為低電平則確認(rèn)為0。采樣期內(nèi)總線為高電平則確認(rèn)為1。完成一個讀時序過程,至少需要60us才能完成。(為什么不可以像寫時序那樣將采樣時間放在讀周期開始后的第15微秒到45微秒之間呢。雖然目前這樣也不是不可以,但總覺得不安全。有點(diǎn)懸啊?。?br> DS18B20的說明書上也說,由于主機(jī)拉低總線電平時間Tint、釋放總線時的恢復(fù)時間TRC與采樣時間Tsample之和必須小于15微秒。如下圖13。為了使讀出數(shù)據(jù)更可靠,說明書上建議Tint和TRC保持時間盡可能小,把控制器采樣時間放到15微秒周期的最后。如下圖14。
?。ㄒ窍駥懼芷谀菢硬痪蛷娜萘耍伪馗愕镁o緊張張的,唉!)

好!弄清了如何復(fù)位,如何寫1寫0和讀1讀0,我們現(xiàn)在就要看看在總線上如何進(jìn)行實(shí)際的運(yùn)用。
例如,我們做兩個操作,第一個是讓DS18B20進(jìn)行一次溫度的轉(zhuǎn)換。第二是讀取RAM內(nèi)的溫度。
?、佟∽孌S18B20進(jìn)行一次溫度的轉(zhuǎn)換。前面已經(jīng)講過每一個對DS18B20的操作都要有三個步驟。一是復(fù)位操作。二是對ROM的操作。三是對RAM的操作?,F(xiàn)在我們要做的是讓DS18B20進(jìn)行一次溫度的轉(zhuǎn)換,那具體的操作就是:1、主機(jī)先作個復(fù)位操作,2、主機(jī)再寫跳過ROM的操作(CCH)命令,3、然后主機(jī)接著寫個轉(zhuǎn)換溫度的操作命令,后面釋放總線至少一秒,讓DS18B20完成轉(zhuǎn)換的操作。在這里要注意的是每個命令字節(jié)在寫的時候都是低字節(jié)先寫,例如CCH的二進(jìn)制為11001100,在寫到總線上時要從低位開始寫,寫的順序是“零、零、壹、壹、零、零、壹、壹”。整個操作的總線狀態(tài)如下圖。
?、凇∽x取RAM內(nèi)的溫度數(shù)據(jù)。同樣,這個操作也要接照三個步驟。1、主機(jī)發(fā)出復(fù)位操作并接收DS18B20的應(yīng)答(存在)脈沖。2、主機(jī)發(fā)出跳過對ROM操作的命令(CCH)。3、主機(jī)發(fā)出讀取RAM的命令(BEH),隨后主機(jī)依次讀取DS18B20發(fā)出的從第0一第8,共九個字節(jié)的數(shù)據(jù)。如果只想讀取溫度數(shù)據(jù),那在讀完第0和第1個數(shù)據(jù)后就不再理會后面DS18B20發(fā)出的數(shù)據(jù)即可。同樣讀取數(shù)據(jù)也是低位在前的。整個操作的總線狀態(tài)如下圖:
在這里得說明一下,第二步跳過對ROM操作的命令是在總線上只有一個器件時,為節(jié)省時間而簡化的操作,若總線上不止一個器件,那么跳過ROM操作命令將會使幾器件同時響應(yīng),這樣就會出現(xiàn)數(shù)據(jù)沖突。