宋世彥
[摘 要] DS18B20數字溫度傳感器具有體積小、接線簡單、測溫精準、抗干擾能力強等優(yōu)點,在空調、管槽線槽、電信機房等社會生活的各個方面都得到了廣泛應用。
[關 鍵 詞] 溫度傳感器;數據處理;精度
[中圖分類號] G718 [文獻標志碼] A [文章編號] 2096-0603(2016)14-0083-01
DS18B20數字溫度傳感器采用單總線一線式總線協(xié)議,即在一根數據線上實現(xiàn)數據的雙向傳輸,所以單片機對數據處理必須采用軟件的方法來模擬單總線的協(xié)議時序來完成對DS18B20芯片的訪問,要求對讀寫的數據位有嚴格的時隙來保證各位數據傳輸的正確性和完整性。下面我們將就DS18B20傳感器在接線、時序、數據處理等幾個方面進行要點剖析,全面掌握它的使用。
一、硬件接線
對于TO封裝的DS18B20只有3個引腳,正對平面(有字母的一面)引腳垂直,最右側為電源,中間為數據,左側是地線。
DS18B20采用單總線的接線方式,可以實現(xiàn)多點分布式測溫。供電方式靈活,根據實際情況可以選擇單獨電源供電或者寄生供電方式。
(一)外部電源供電方式
外部電源供電方式是DS18B20最佳的工作方式,電路簡單,工作穩(wěn)定,抗干擾能力強,可以保證溫度測量精度。當DS18B20采用外部供電時,工作電源由VDD引腳接入,GND引腳接地,此時I/O線不需要強上拉,不存在電源電流不足的問題,可以保證轉換精度,只需將其數據線與單片機的一位雙向端口相連就可以實現(xiàn)數據的傳遞,如果讀取的溫度始終顯示85℃,那么很可能是電源接反了,改過來就可以了,一般不會損壞芯片。
(二)寄生電源供電方式
DS18B20可以通過內部寄生電路從單線數據線上獲取電源,在信號線處于高電平期間把能量存儲在內部電容里,在信號線處于低電平期間消耗電容上的電能使DS18B20工作,直到高電平到再次給寄生電源(電容)充電。
在寄生電源方式工作時,DS18B20可以進行遠距離測溫,無需本地電源,電路更加簡單(VDD必須接地),在遠程溫度測量和測量空間受限的情況下非常有用。但是DS18B20在溫度轉換期間工作電流達到了1mA以上,超出了內部電容所能提供的電流,要想保證溫度轉換的精度,I/O線必須提供足夠的能量,當多個
DS18B20掛在同一根總線上進行多點測溫時,4.7K上拉無法提供足夠的能量,會造成誤差較大或無法轉換溫度。一般我們再拿出一根I/O口線控制MOSFET管把總線直接拉到VCC上就可以解決這個問題了。
(三)分布式測溫
當多個DS18B20進行分布式測溫時,可以將所有的器件引腳對應連接到一起就可以了,通過讀取每個DS18B20內部芯片的序列號來識別。
在總線上理論上可以掛接任意多個DS18B20傳感器,組成多點測溫系統(tǒng),但實際上,當單總線所掛DS18B20超過8個時,就需要解決總線驅動問題了。
(四)遠距離測溫
在進行遠距離測溫時,連接DS18B20的總線電纜長度也是有限制的,主要原因是總線分布電容使信號波形產生畸變,采用普通信號電纜傳輸長度超過50米時,讀取的溫度值就將發(fā)生錯誤,因此長距離測溫時要充分考慮總線分布電容和阻抗匹配的問題。
二、時序要求
由于DS18B20在一根線上實現(xiàn)數據的發(fā)送與接收,因此,對讀寫的數據位有著嚴格的時隙要求,才能保證各位數據傳輸時的正確性和完整性。
控制器先發(fā)出負脈沖(750個微妙左右)“我要通信”的要求信號后等待DS18B20回復,DS18B20收到(上升沿)邀請后稍矜持(15~60個微妙)下,馬上拉低總線(60~240個微妙)表示“我在”,產生應答脈沖,控制器收到響應后,表示握手成功,可以通信了。在實際使用上,我們往往發(fā)出邀請一段時間后(延時跳過響應信號),直接向DS18B20發(fā)出讀寫信號。
DS18B20進行溫度轉換的時間和分辨率有關,需要的時間大概在94~750個毫秒。
三、數據處理
DS18B20在啟動溫度轉換后,溫度數據存儲在高速暫存器RAM的第0~1個字節(jié)里,我們在讀取數據BE命令后,每次只能讀取一位,讀取時低位在前,這時數據的處理就很重要了。
(一)變量類型的定義
由于每次只能讀、寫一位數據,所以這時數據類型必須定義成位變量bit型。
溫度數據存儲在高速暫存器RAM的第0~1個字節(jié)里,不管分辨率是9位還是12位,溫度數據都要占2個字節(jié),單片機是8位的,所以都要對2個字節(jié)的數據進行高8位和低8位的合成處理,這時的2個接收變量要定義成8位字符型(unsigned char),合成16位完整溫度數據時,數據類型就要定義成16位的unsigned int型,當我們進行最后的十進制溫度轉換時(含有小數),變量類型定義成為float就可以了。
(二)數據的處理方法
讀字節(jié)數據時低位在前,很多人采用dat=(j<<7)|(dat>>1)語句,個人覺得可以采用庫里自帶的字符循環(huán)右移函數_cror_(a,b)更方便些。
DS18B20在出廠時默認配置為12位,其中最高位是符號位,即溫度值共11位,2個字節(jié)合計16位,也就是說高5位都可以看成是相同的符號位,同時變化。前5位是1時,讀取的溫度值是負數,取得的數值需要取反加1再乘以0.0625才可以得到實際的溫度值。當前5位為0時,讀取的溫度為正值,只要將得到的數值乘以0.0625就可以得到實際的溫度值了。
在程序中,采用浮點型變量f_temp來接收整型變量temp乘以0.0625得到的實際溫度值,這時得到的實際溫度值是含有小數的,而我們的數碼管處理顯示的都是整數,要顯示小數,必須人為地加上小數點,所以我們還要再次對數據處理,首先把得到的浮點型溫度數據f_temp乘以10把數據擴大十倍,目的是為了在數碼管上顯示小數部分(人為加上小數點),再加上0.5后是為了對溫度數據四舍五入,最后把f_temp送給整型變量temp舍去小數部分。這時得到的數據就可以送去數碼管顯示了,顯示的數據精度為四舍五入后帶一位小數。
在DS18B20程序調試時,如果發(fā)現(xiàn)諸如溫度顯示錯誤等故障,基本上都是由于時隙的誤差較大甚至時序錯誤或者是變量類型定義錯誤導致的,一定要嚴格參照時序圖,精確把握總線電平隨時間(微秒級)的變化,正確地使用變量,才能夠順利地控制和操作DS18B20。
參考文獻:
[1]戴佳,戴衛(wèi)恒.51單片機C語言應用程序設計[M].北京:電子工業(yè)出版社,2006.
[2]李華.MCS-51單片機實用接口技術[M].北京:北京航空航天出版社,1997.