(1)DS18B20初步認(rèn)識(shí)
DS18B20是美國(guó)DALLAS半導(dǎo)體公司推出的一種數(shù)字化單總線器件,屬于新一代適配微處理器的改進(jìn)型智能溫度傳感器。我們先來(lái)看看DS18B20在芯片手冊(cè)上的標(biāo)題——“DS18B20 Programmable Resolution 1-Wire Digital Thermometer”。從這個(gè)標(biāo)題上看我可以獲取一些有價(jià)值的信息。首先分辨率是可以編程的,也就是我們可以通過(guò)程序來(lái)修改這個(gè)器件的分辨率。其次它又是“一線-總線”,那么簡(jiǎn)單的講,就是我們與DS18B20的溝通就是通過(guò)這一根線實(shí)現(xiàn)的,換一個(gè)說(shuō)法就是“寫(xiě)數(shù)據(jù)”,“發(fā)命令”,“讀數(shù)據(jù)”等等都是通過(guò)這根線來(lái)完成的。第三點(diǎn),從標(biāo)題可以看到,它是數(shù)字溫度計(jì),也就是它能把溫度信號(hào)轉(zhuǎn)成數(shù)字信號(hào)。
其實(shí)這里的“第三點(diǎn)”非常重要——把溫度信號(hào)轉(zhuǎn)成數(shù)字信號(hào)。注意我們使用這個(gè)器件的目的就是要獲取溫度的信息,那么我們要做的事情就是獲取這個(gè)DS18B20器件轉(zhuǎn)換的“數(shù)字信號(hào)”。這是我們的根本目的。其實(shí)這個(gè)過(guò)程中有很多問(wèn)題值得思考。比如說(shuō),這個(gè)器件既然能把溫度信號(hào)轉(zhuǎn)成數(shù)字信號(hào),那么可以推測(cè)這個(gè)器件有個(gè)部分或者說(shuō)它的核心材料具備感知溫度的能力。那么這個(gè)材料是什么?為什么這個(gè)材料具備這樣的能力?最重要的一點(diǎn)是,DS18B20內(nèi)部是如何把感知的溫度信號(hào)轉(zhuǎn)成數(shù)字信號(hào)的?可以看到,這幾個(gè)問(wèn)題才是DS18B20的核心內(nèi)容(叁議電子)。但是想一想我們需要去解答這些問(wèn)題嗎?根本不需要。注意我們這里是從應(yīng)用層面來(lái)思考問(wèn)題的。我們要干什么?目的就是獲取溫度值嘛。剛才不是說(shuō)了嗎,DS18B20能把溫度信號(hào)轉(zhuǎn)成數(shù)字信號(hào)。那么我們只需要關(guān)心這個(gè)“數(shù)字信號(hào)”放到哪里了,然后通過(guò)這一根“一線-總線”進(jìn)行溝通,取出這個(gè)“數(shù)字信號(hào)”就可以了。至于我們剛才思考那些問(wèn)題有用嗎?根本沒(méi)必要。當(dāng)然如果你想深入了解這個(gè)器件也可以去查閱相關(guān)的資料。這里再次強(qiáng)調(diào),我們是從應(yīng)用層面來(lái)思考問(wèn)題的。好了,通過(guò)對(duì)DS18B20芯片手冊(cè)的標(biāo)題分析,我們可以推測(cè)出一個(gè)大概的思路:DS18B20會(huì)把周圍的溫度信號(hào)變成數(shù)字信號(hào),放在了某個(gè)地方(www.ppptalk.com),然后我們通過(guò)這一根“一線-總線”取出這個(gè)“數(shù)字信號(hào)”。知道了這個(gè)思路,剩下的工作就是去查閱芯片手冊(cè),確定具體的操作的過(guò)程了。這里我用一幅圖來(lái)描述這個(gè)過(guò)程,如下所示:

首先DS18B20內(nèi)部的傳感器(前面說(shuō)過(guò)關(guān)于這個(gè)傳感器不關(guān)心,只要知道它具備的功能就行了)感知周圍的溫度并且把它轉(zhuǎn)成數(shù)字信號(hào)(這個(gè)過(guò)程也不關(guān)心),然后把這個(gè)“數(shù)字信號(hào)”存儲(chǔ)在一個(gè)叫做“ScratchPad”的里面。ScratchPad存儲(chǔ)器一共9個(gè)字節(jié)(Byte0-Byte8),數(shù)字信號(hào)就存儲(chǔ)在Byte0_LSM和Byte1_MSB中。其中Byte0為低位,Byte1為高位。
BYTE2-BYTE3是關(guān)于“報(bào)警”的功能,BYTE2是設(shè)定的高溫界限,BYTE3是設(shè)定的低溫界限。可以想到,當(dāng)周圍溫度超過(guò)這個(gè)范圍時(shí),會(huì)發(fā)出某種警告信號(hào)。接著就是Byte2_TH和Byte3_TL報(bào)警的功能了,圖中Byte2_TH表示設(shè)置的最高溫度,Byte3_TL表示設(shè)置的最低溫度。同樣S表示溫度的正負(fù),如果S=0,那么表示正,如果S=1,那么溫度為負(fù)。Byte2_TH和Byte3_TL就表示設(shè)定溫度的范圍了。注意這里的Byte2_TH與Byte3_TL與”T-16bit”中的bit11到bit4是對(duì)應(yīng)的,如圖中藍(lán)色部分所示。前面講了,在”T-16bit”中,bit4每變化1為1°C,因此在Byte2_TH與Byte3_TL中的最低位每變化1,表示溫度變化1°C.比如Byte2_TH設(shè)定為,01111001(十進(jìn)制為121),首位為0,表示+121°C, Byte3_TL為01001001(十進(jìn)制為73),首位為0,表示+73°C .因此溫度的設(shè)定范圍為: 73-121°C.當(dāng)”T-16bit”中的溫度高于/等于+121°C,或者低于/等于73°C時(shí),將觸發(fā)報(bào)警。
BYTE4是關(guān)于精度設(shè)定的,剛好與它的“標(biāo)題”對(duì)應(yīng),“精度可編程”。一共四種精度可選,這樣四種精度只需兩個(gè)bit就可以組合了,如圖中的Byte4_Config所示。bit5和bit6分別為R0和R1,其他幾位是固定的。R0和R1分別可以取0或者1,因此可以組合成4種情況,00/01/10/11,分別對(duì)應(yīng)不同的精度。
Byte5-Byte7未給出
Byte8為CRC用與通信錯(cuò)誤檢測(cè),我們暫且不用管它,我們先考慮簡(jiǎn)單的部分。
為了簡(jiǎn)化問(wèn)題,這里我們先只重點(diǎn)關(guān)注BYTE0和BYTE1,里面存在的就是我們需要的數(shù)字信息。如上圖所示,我們把Byte0_LSM和Byte1_MSB組合成一個(gè)16bit的數(shù)字信號(hào),Byte0_LSB為低位,Byte1_MSB為高位,并給它取個(gè)名字叫”T-16bit”。那么如何把這個(gè)”T-16bit”的數(shù)字信號(hào)轉(zhuǎn)換成溫度呢?從圖中看出,bit11-bit15為S,表示溫度的正負(fù),如果S=0,那么溫度為正,如果S=1那么溫度為負(fù)。后面的bit10-bit0,數(shù)值每增加一就表示溫度增加0.0625°C,舉個(gè)例子:假如LSB中讀出來(lái)的是1100 0011,MSB讀出來(lái)的是0000 0110,那么LSB和MSB結(jié)合起來(lái)”T-16bit”就是0000 0110 1100 0011,高5位為0,表示溫度為正,余下11位bit10-bit0(110 1100 0011=1731),把1731×0.0625=108.1875,那么測(cè)量的溫度為+108.1875°C.
(2)DS18B20操作步驟
這個(gè)“一線-總線”在硬件上比較省事,但是對(duì)應(yīng)的增加了程序的復(fù)雜性。它要求每次與DS18B20溝通都要有這三個(gè)步驟,(1)初始化;(2)ROM指令;(3)DS18B20 功能指令。 什么意思呢?比如你想“write scratchpad”,那么首先就要初始化,然后rom指令,之后write scratchpad,如果緊跟著你想read scratchpad,那么就必須再次重復(fù)初始化;rom指令;read scrachpad這個(gè)過(guò)程。以下步驟是讀出scratchpad中BYTE0和BYTE1并通過(guò)LCD1602顯示溫度結(jié)果的過(guò)程:
(1) DS18B20初始化
(2) 跳過(guò)ROM指令
(3) 轉(zhuǎn)換溫度,注意上電的時(shí)候DS18B20是沒(méi)有工作的。如果沒(méi)有Convert這個(gè)指令,那么讀出來(lái)的溫度應(yīng)該是默認(rèn)值80度。
(4) 溫度轉(zhuǎn)換是需要時(shí)間的,不少于750ms,這里需要有忙信號(hào)檢查,確定轉(zhuǎn)換完成
? ? ? ? ?現(xiàn)在可以讀Scatchpad了,但是同樣要有三個(gè)步驟
(5) DS18B20初始化
(6) 跳過(guò)ROM
(7) 讀Scatchpad
(8) RCV DATA(參考read time slot)
(9) 讀出來(lái)的是二進(jìn)制信號(hào),需要轉(zhuǎn)成十進(jìn)制
(10)輸出溫度值(通過(guò)數(shù)碼管/LCD1602液晶模塊)