使用DS18B20溫度傳感器測溫_第1頁
使用DS18B20溫度傳感器測溫_第2頁
使用DS18B20溫度傳感器測溫_第3頁
使用DS18B20溫度傳感器測溫_第4頁
使用DS18B20溫度傳感器測溫_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第11章 使用DS18B20溫度傳感器測溫11.1 概述現(xiàn)實生產(chǎn)生活中,小到測量體溫的溫度計,大到航天飛機的溫控系統(tǒng),處處都離不開溫度測量。工業(yè)生產(chǎn)中的三大指標(流量、壓力、溫度)之一就是溫度,溫度測量可以說是無處不在,遍布了我們生活生產(chǎn)的方方面面。DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司生產(chǎn)的數(shù)字化溫度傳感器,它與以往模擬量溫度傳感器不同,數(shù)字化是其一大特點,它能將被測環(huán)境溫度直接轉(zhuǎn)化為數(shù)字量,并以串行數(shù)據(jù)流的形式傳輸給單片機等微處理器去處理。DS18B20溫度傳感器的另一個主要特點是它是單總線的,即它與單片機等微處理器連接時,只需占用一個I/O管腳,并且不再需要其它任何外部元器

2、件,這大大簡化了它與但單片機之間的接口電路。11.2 DS18B20溫度傳感器介紹目前,使用最普遍的DS18B20溫度傳感器是三腳TO-92直插式封裝這一種,這種封裝的DS18B20實物如圖11-1所示??梢钥吹剿w積很小,只有三只管腳,外形與一般的三極管極其相似。圖11-2是其三腳TO-92直插式封裝圖,表11-1列出了DS18B20各個引腳的定義。 如圖11-1 如圖11-2 表11-1 DS18B20引腳定義。引腳號引腳定義1GND接地端2DQ數(shù)據(jù)輸入輸出端3電源端 1、DS18B20溫度傳感器特性簡介獨特的單總線(一條線)接口,與微處理器通信只需一個I/O管腳,且硬件連接無需其它外部元

3、件;測量結(jié)果直接輸出數(shù)字量,可直接與微處理器通信;供電電壓范圍3.0V5.5V;在寄生電源方式下可有數(shù)據(jù)線供電;測溫范圍-55+125;在-10+85范圍內(nèi),測量精度可達±0.5;可編程的912位測溫分辨率,對應(yīng)的可分辨溫度值分別為0.5,0.25,0.125,0.0625;12位分辨率時的溫度測量轉(zhuǎn)換最長時間(上限)只有750ms;每一片DS18B20都有自己獨一無二的芯片號碼;多片DS18B20可以并聯(lián)在一條數(shù)據(jù)總線上實現(xiàn)不同地點的多點組網(wǎng);應(yīng)用范圍包括溫度調(diào)控,工業(yè)現(xiàn)場測溫,消費類產(chǎn)品,溫度計及熱敏系統(tǒng)等。2、DS18B20溫度傳感器測溫工作原理DS18B20的核心功能就是測量

4、被測環(huán)境溫度并直接轉(zhuǎn)換成為數(shù)字量。我們使用DS18B20測溫,就是要將DS18B20轉(zhuǎn)換成的數(shù)字量溫度值從DS18B20內(nèi)部讀出,送入單片機進行處理,所以了解DS18B20內(nèi)部的存儲器的結(jié)構(gòu)和組成是必要的。另外,控制DS18B20測溫和讀取溫度值的指令也是必不可少的。以下就從這兩個方面逐個說明。DS18B20內(nèi)部的存儲器籠統(tǒng)而言,可以說DS18B20內(nèi)部的存儲器有三個。一個是64位光刻ROM;另一個是中間結(jié)果暫存RAM;第三個是E2RAM。64位光刻ROM前面已經(jīng)提及,每一片DS18B20都有一個獨一無二的號碼,用于唯一標識當前這片DS18B20。這個號碼是DS18B20的生產(chǎn)廠家DALLAS

5、公司在生產(chǎn)該片DS18B20時固化在其內(nèi)部ROM中的,共有64位,所以稱為64位光刻ROM號碼,其數(shù)據(jù)格式如圖11-3所示。 圖11-3 64位光刻ROM數(shù)據(jù)格式這64位號碼由三部分組成,分別是64位號碼中的最低8位,64位號碼中的中間48位和64位號碼中的最高8位。其中,64位號碼中的最低8位對每一片DS18B20而言都相同,其值是0x28H,稱為家族代碼。這個值是專門分配給DS18B20家族的,用以區(qū)別不同的單總線設(shè)備家族。64位號碼中的中間48位是唯一標識當前這片DS18B20的產(chǎn)品序列號。任意兩片DS18B20的家族代碼都是0x28H,但它們的48位產(chǎn)品序列號絕對不相同,這48位一般稱

6、為48位序列號。64位號碼中的最高8位是從前面的56位(8位+48位=56位)計算出的CRC碼,這8位一般不大用,所以此處一筆帶過,讀者可以不予理睬。中間結(jié)果暫存RAM中間結(jié)果暫存RAM共有8個字節(jié),其結(jié)構(gòu)如圖11-4所示。圖11-4中間結(jié)果暫存RAM其中,字節(jié)地址0是所測溫度數(shù)值的低8位,字節(jié)地址1是所測溫度數(shù)值的高8位,字節(jié)地址2是設(shè)定溫度的上限值,字節(jié)地址3是設(shè)定溫度的下限值,字節(jié)地址4是配置寄存器字節(jié)。字節(jié)地址5,6,7保留。這8個字節(jié)中,除字節(jié)地址0,1,4以外的5個字節(jié)幾乎不使用,所以可以忽略,重點掌握字節(jié)地址0,1,4就足夠了。字節(jié)地址0和字節(jié)地址1中存放的就是測量的溫度值,字節(jié)

7、地址1中存放的是高8位,字節(jié)地址0中存放的是低8位。它們中的溫度數(shù)據(jù)存儲格式如圖11-5所示。其中,高5位是符號位S。若5個S全為0則表示溫度是正值,由于是正值,補碼與原碼相同,余下的11位按圖示各位的權(quán)重計算所得數(shù)值就是所測溫度值;若5個S全為1,則余下11位的補碼對應(yīng)的數(shù)值就是所測溫度值,這個溫度值自然是零度以下,是負值。在實際計算溫度值時,在得到11位數(shù)值原碼值以后,再乘以0.0625就得到所測的溫度值。這樣計算的原因是:可以將圖11-5中的小數(shù)點(在權(quán)重20和2-1之間)向右移動4位,即整個數(shù)值擴大了24=16倍,要使與原值相等,自然需要再除以16,即相當于乘以0.0625。圖11-5

8、 溫度數(shù)據(jù)存儲格式字節(jié)地址4是配置寄存器字節(jié)。前面已經(jīng)提及,DS18B20的測溫有9位,10位,11位,12位四種分辨率,實際測溫時選用哪種分辨率是可以通過具體編程來設(shè)定,DS18B20出廠時設(shè)定的默認測溫分辨率是12位。字節(jié)地址4配置寄存器字節(jié)的數(shù)據(jù)格式如圖11-6所示。其中的R1和R0的四種組合一一對應(yīng)9位,10位,11位,12位四種分辨率。對應(yīng)關(guān)系如表11-2所示。附帶說明的是,一般選用出廠時設(shè)定的默認測溫分辨率12位,不用改動。圖11-6 配置寄存器字節(jié)的數(shù)據(jù)格式表11-2 R1和R0的四種組合與測溫分辨率的關(guān)系E2RAME2RAM的結(jié)構(gòu)如圖11-7所示??梢钥吹剑珽2RAM是中間結(jié)果

9、暫存RAM中字節(jié)地址位2,3,4的三個字節(jié)內(nèi)容的拷貝或者說是備份,以備數(shù)據(jù)的完備性需要。這個存儲器一般不使用,故可以忽略不予考慮。圖11-7 E2RAM的結(jié)構(gòu)綜上所述,在不改變測溫出廠分辨率(12位)的前提下,DS18B20內(nèi)部存儲器中,我們需關(guān)注的就只有64位光刻ROM和中間結(jié)果暫存RAM中用于存放溫度值的字節(jié)地址0和字節(jié)地址1了。DS18B20的指令DS18B20的指令可分為三大類,第一類是與64位光刻ROM相關(guān)聯(lián)的一系列指令,第二類是與中間結(jié)果暫存RAM相關(guān)聯(lián)的溫度值讀取等一些相關(guān)指令,第三類就是控制溫度轉(zhuǎn)換的控制類指令。上面剛剛提到,在不改變測溫出廠分辨率(12位)的前提下,DS18B

10、20內(nèi)部存儲器中,我們只需關(guān)注64位光刻ROM和中間結(jié)果暫存RAM中字節(jié)地址0和字節(jié)地址1中的溫度值??紤]到DS18B20的指令集中,部分指令極少使用,此處僅就常用的、關(guān)鍵指令做解釋說明,其余指令請讀者查閱參考其它相關(guān)資料。與64位光刻ROM相關(guān)的指令讀64位光刻ROM號碼指令【0x33H】 本條指令用于讀取唯一標識當前這片DS18B20的64位號碼,但要求總線上只能有一片DS18B20,否則會出現(xiàn)多片DS18B20沖突的問題;匹配64位光刻ROM號碼指令【0x55H】本條指令主要用在單總線上掛接多片DS18B20的情況下,此時,執(zhí)行本指令0x55H后,緊跟其后的是一64位光刻ROM號碼(特別

11、注意:在輸入64位光刻ROM號碼時,低位在前),這一64位光刻ROM號碼將與單總線上每一片DS18B20的64位光刻ROM號碼進行比對,號碼匹配的那一片DS18B20將執(zhí)行后續(xù)的指令,例如轉(zhuǎn)換溫度、讀取溫度值等指令;而號碼不匹配的那些DS18B20將不執(zhí)行任何指令,繼續(xù)等待下去,直到總線復(fù)位后再等待下一次被匹配的機會。跳過64位光刻ROM號碼匹配指令【0xCCH】可以設(shè)想,如果總線上只有一片DS18B20掛接其上,執(zhí)行溫度轉(zhuǎn)換指令、讀取溫度值指令等只能是針對這一片DS18B20而言。如果先讀取其64位光刻ROM號碼,再去匹配64位光刻ROM號碼,顯然是畫蛇添足,多此一舉,所以完全可以跳過64位

12、光刻ROM號碼的匹配環(huán)節(jié),直接執(zhí)行轉(zhuǎn)換溫度、讀取溫度值等指令。需要說明的是,不需要執(zhí)行匹配時,不用執(zhí)行上一條0x55H指令,但必須執(zhí)行跳過指令,即執(zhí)行0xCCH指令完成跳過功能。搜索64位光刻ROM指令【0xF0H】 當總線上掛接多片DS18B20芯片時,執(zhí)行本指令可以搜索當前掛接在總線上的DS18B20芯片的個數(shù),并識別它們的64位光刻ROM號碼,便于后續(xù)方便操作各個DS18B20芯片。與中間結(jié)果暫存RAM相關(guān)的溫度數(shù)值讀取指令讀中間結(jié)果暫存RAM指令【0xBEH】單片機發(fā)出并執(zhí)行讀中間結(jié)果暫存RAM指令0xBEH后,就可以從字節(jié)地址0開始,每次讀取一個字節(jié),依次讀取中間結(jié)果暫存RAM的8個

13、字節(jié)中的數(shù)據(jù)。由于溫度值只保存在前面兩個字節(jié)中,所以實際讀取中只讀取兩個字節(jié)就可以了??刂茰囟绒D(zhuǎn)換指令啟動溫度轉(zhuǎn)換指令【0x44H】本指令是啟動溫度轉(zhuǎn)換指令,轉(zhuǎn)換結(jié)束后的溫度值被存入中間結(jié)果暫存RAM的字節(jié)地址0(低8位)和字節(jié)地址1(高8位)中。然后就可以從中讀取溫度值了。DS18B20的通信規(guī)則僅用一條線通信的DS18B20的系統(tǒng),在與微處理器通信時,其數(shù)據(jù)的傳輸規(guī)則不同于一般芯片,其數(shù)據(jù)傳輸規(guī)則的特殊性表現(xiàn)在每次操作都要按部就班的執(zhí)行以下四個步驟:第一步初始化DS18B20;第二步向DS18B20發(fā)送與64位光刻ROM相關(guān)的指令;第三步執(zhí)行與中間結(jié)果暫存RAM相關(guān)指令(包括控制溫度轉(zhuǎn)換指

14、令);第四步是數(shù)據(jù)處理。以下針對主要的三個操作:讀取64位光刻ROM號碼操作,啟動DS18B20溫度轉(zhuǎn)換操作,讀取溫度操作,細化上述四個步驟。讀取64位光刻ROM號碼操作第一步:初始化DS18B20;第二步:單片機向DS18B20發(fā)送讀64位光刻ROM號碼指令0x33H;第三步:由于讀取64位光刻ROM號碼操作不涉及中間結(jié)果暫存RAM,此步驟就什么都不做;第四步:單片機從單總線上一位接著一位地讀取,共64位,得到64位光刻ROM號碼(注意:低位在前)。啟動DS18B20溫度轉(zhuǎn)換操作第一步:初始化DS18B20;第二步:單片機向DS18B20發(fā)送跳過64位光刻ROM號碼匹配指令0xCCH(假設(shè)只

15、有一片DS18B20掛接在總線上);第三步:單片機向DS18B20發(fā)送啟動溫度轉(zhuǎn)換指令0x44H;第四步:本操作只啟動溫度轉(zhuǎn)換,無數(shù)據(jù)處理,故本步驟什么都不做。讀取溫度操作第一步:初始化DS18B20;第二步:單片機向DS18B20發(fā)送跳過64位光刻ROM號碼匹配指令0xCCH(假設(shè)只有一片DS18B20掛接在總線上);第三步:單片機向DS18B20發(fā)送讀中間結(jié)果暫存RAM指令0xBEH;第四步:單片機從單總線上一位接著一位地讀取,連續(xù)讀取兩個字節(jié)的數(shù)據(jù)(低字節(jié)在前,高位在前),得到溫度值的低字節(jié)和高字節(jié)數(shù)據(jù)。此處還需要解釋說明兩點:1、DS18B20的操作時序很嚴格,特別是延時,要比較精確才

16、行。所以以上每一步驟后都緊跟一段延時,具體延時時間多長,后面的初始化、讀寫操作等時序會給出詳細說明。2、由于DS18B20是單總線的,只有一條線與單片機的一個I/O管腳相連接。初始化、指令數(shù)據(jù)、64位光刻ROM號碼、溫度值等等數(shù)據(jù),這些數(shù)據(jù)中,有些是從單片機到DS18B20,有些是從DS18B20到單片機,但都是(也只能)借助這一條總線在傳輸,所以數(shù)據(jù)是在單片機與DS18B20之間一位一位地串行傳輸?shù)?。DS18B20的初始化、數(shù)據(jù)讀寫操作時序前面已經(jīng)提及,由于DS18B20是單總線的,所以其操作時序很嚴格,特別是延時,要比較精確才行。DS18B20的初始化DS18B20的初始化時序如圖11-8

17、所示。圖11-8 DS18B20的初始化時序DS18B20的初始化時序是:首先是單片機發(fā)送一低電平到單一數(shù)據(jù)總線上,將單總線拉低,拉低的時間至少是480s,但不能超過960s。實際中一般取750s左右;然后,單片機釋放單總線的控制權(quán),轉(zhuǎn)而準備被動地去接收DS18B20發(fā)送來的數(shù)據(jù)。此時,焊接在單總線上5K的上拉電阻將單總線由低電平拉高到高電平,此電平從低到高的上升沿被DS18B20捕捉到以后,單總線轉(zhuǎn)而由DS18B20控制了;當DS18B20控制了總線時,在等待1560s以后,DS18B20將單總線再次拉低,作為向單片機做出的回應(yīng),表明自己(DS18B20)已經(jīng)就緒,準備接收后續(xù)的指令等等。D

18、S18B20將單總線拉低的時間至少是60s,但不能超過240s。隨后,DS18B20釋放但總線,單總線上5K的上拉電阻再次將將單總線由低電平拉高到高電平。此時DS18B20的初始化完成。具體到程序設(shè)計時,可以簡化初始化過程。實現(xiàn)如下:首先,單片機發(fā)送一低電平到單一數(shù)據(jù)總線上,將單總線拉低,拉低的時間750s左右,這750s= 480s+40s+230s,其中480s是單片機將總線拉低所需的最少時間,40s是單片機釋放總線后DS18B20等待時間(大約),230s是DS18B20的反饋回應(yīng)的低電平時間。這樣處理的目的是忽略DS18B20的反饋回應(yīng),改為延時處理,原因是單片機將總線拉低后,何時釋放

19、總線不太好把握,自然不太好確定何時接收DS18B20的反饋回應(yīng)的低電平,采用延時以后,至于單片機何時釋放總線、DS18B20等待多長時間、DS18B20發(fā)回應(yīng)低電平多長一段時間后又釋放總線,使總線又被上拉電阻拉高,這期間的細節(jié)可以不考慮。但這些過程結(jié)束后,單總線是高電平就行,所以進入下一步驟:拉高總線。然后,單片機發(fā)送一高電平到單一數(shù)據(jù)總線上,將單總線拉高,拉高的時間500s左右;單片機向DS18B20寫數(shù)據(jù) 單片機向DS18B20寫一位數(shù)據(jù)的時序圖如圖11-9所示。圖11-9 單片機向DS18B20寫一位數(shù)據(jù)的時序單片機向DS18B20寫一位數(shù)據(jù)的時序:首先,單片機將單總線拉低(延時時間小于

20、15s)然后,如果單片機向DS18B20寫的數(shù)是二進制數(shù)0,則單片機繼續(xù)將單總線拉低,讓DS18B20采樣當前單總線上的數(shù)據(jù)(低電平,即數(shù)據(jù)0),此總線拉低的延時時間最大45s,因為單片機向DS18B20寫一位數(shù)據(jù)的時間必須在60s內(nèi)完成;如果單片機向DS18B20寫的數(shù)是二進制數(shù)1,則單片機釋放總線,由外接上拉電阻將單總線拉高供DS18B20采樣當前單總線上的數(shù)據(jù)(高電平,即數(shù)據(jù)1)。實際編程中將上拉電阻拉高總線更改為單片機將單總線拉高,都是高電平,無所謂是誰拉高的。同樣,此拉高的延時時間最大也是45s,以此保證單片機向DS18B20寫一位數(shù)據(jù)的時間必須在60s內(nèi);最后,單片機再次將單總線拉

21、高,準備下一位數(shù)據(jù)寫入DS18B20,一般在總線拉高后延時10s 左右。具體程序設(shè)計時,實現(xiàn)如下:單片機將單總線拉低,延時15s;如果寫0:單片機將單總線拉低,延時60s; 如果寫1:單片機將單總線拉高,延時40s;單片機將單總線拉高,延時10s;單片機從DS18B20讀數(shù)據(jù)單片機從DS18B20讀一位數(shù)據(jù)的時序如圖11-10所示。圖11-10 單片機從DS18B20讀一位數(shù)據(jù)的時序從圖11-10可以看到,單片機從DS18B20讀一位數(shù)據(jù)時序比較嚴格,留給單片機采樣窗口很窄,單片機從DS18B20讀取一位二進制數(shù)據(jù)的時間必須要控制在開始讀以后的15s以內(nèi)。具體分析如下:首先,單片機將單總線拉低

22、,拉低后的延時時間極短,一般在1s以內(nèi);然后,單片機釋放單總線,由DS18B20將單總線拉低,或者由外接上拉電阻將單總線拉高,共單片機去采樣0或者1。需要強調(diào)的是:此時單總線被拉低或者拉高不是由單片機控制拉低或者拉高,單片機此時是讀取這些高低電平的。整個拉低或者拉高電平的持續(xù)時間只有15-2=13s左右,單片機此時應(yīng)抓緊時間去讀取,否則電平就要發(fā)生變化。具體程序設(shè)計時,實現(xiàn)如下:首先,單片機將單總線拉低,拉低后的延時時間極短,一般在1s以內(nèi);然后,單片機將單總線拉高,這一點不是單片機從DS18B20讀一位數(shù)據(jù)的時序要求決定的,而是51單片機的I/O口在輸入數(shù)據(jù)前必須先寫1決定的。為了使單片機I

23、/O口讀取數(shù)據(jù)穩(wěn)定,此處一般延時8s左右;最后,單片機讀取單總線上的數(shù)據(jù)。11.3 DS18B20溫度傳感器測溫實例1功能要求:單片機與一片DS18B20連接,在1602液晶屏第一行顯示所測的溫度值(數(shù)據(jù)已處理過)及中間結(jié)果暫存RAM的字節(jié)地址0和字節(jié)地址1的溫度值(數(shù)據(jù)未處理),在1602液晶屏第二行顯示該片DS18B20的64位光刻ROM號碼。#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS=P20; sbit R

24、W=P21; sbit E=P22; sbit DQ=P23; uint temp; uchar wdL,wdH; static uchar sn8=0; uchar code b2hex="0123456789ABCDEF"/*void wrcmd1602(uchar cmd) uchar m; RW=0; RS=0; P1=cmd; for(m=0;m<=7;m+);/延時25us E=1; for(m=0;m<=7;m+);/延時25us E=0; void wrdata1602(uchar shuju) uchar m; RW=0; RS=1; P1=s

25、huju; for(m=0;m<=7;m+);/延時25us E=1; for(m=0;m<=7;m+);/延時25us E=0; void init1602(void) RW=0; E=0; wrcmd1602(0x38); wrcmd1602(0x0c); wrcmd1602(0x06); wrcmd1602(0x01); void disp1602(uchar x,uchar y,uchar ch) wrcmd1602(0x80+x*0x40+y); wrdata1602(ch);/*/void init18b20(void) uchar m; DQ=0; for(m=0;m

26、<=90;m+); /延時732us DQ=1; for(m=0;m<=65;m+); /延時532us void wrcmd18b20(uchar cmd18b20) bit sendbit; uchar i,m; for(i=1;i<=8;i+) sendbit=cmd18b20&0x01; cmd18b20=cmd18b20>>1; if(sendbit=0) DQ=0; for(m=0;m<=2;m+);/延時12us DQ=0; for(m=0;m<=20;m+); /延時66usDQ=1;for(m=0;m<=2;m+);/延

27、時12us else DQ=0; for(m=0;m<=1;m+);/延時9us DQ=1; for(m=0;m<=10;m+);/延時36us DQ=1;for(m=0;m<=1;m+);/延時9us bit rdbit18b20(void) uchar m; bit onebit; DQ=0; _nop_(); DQ=1; /單片機的I/O口要輸入,必須先寫入1 for(m=0;m<=1;m+);/延時9us onebit=DQ; for(m=0;m<=10;m+);/延時36us return(onebit);uchar rdbyte18b20(void)

28、uchar i,j; uint wenduzhi=0; for(i=1;i<=8;i+) j=rdbit18b20();wenduzhi=(j<<7)|(wenduzhi>>1); return(wenduzhi); void stconv18b20(void) uchar m,n; init18b20();for(m=0;m<=1;m+);/延時9uswrcmd18b20(0xCC);for(m=0;m<=1;m+);/延時9uswrcmd18b20(0x44);for(n=0;n<=250;n+) for(m=0;m<=250;m+);

29、for(n=0;n<=250;n+) for(m=0;m<=250;m+); /延時760ms uint rdwendu(void) init18b20(); wrcmd18b20(0xCC); wrcmd18b20(0xBE); wdL=rdbyte18b20(); wdH=rdbyte18b20(); temp=wdH; temp=temp<<8; temp=temp|wdL; temp=(uint)(float)temp*0.0625*10+0.5); return(temp); void rd18b20rom(void) uchar j; init18b20()

30、; wrcmd18b20(0x33); for(j=0;j<=7;j+) snj=rdbyte18b20(); _nop_(); /*/main() uint t,k; init1602(); rd18b20rom(); for(k=0;k<=7;k+) disp1602(1,2*k,b2hex(snk&0xf0)>>4); disp1602(1,2*k+1,b2hexsnk&0x0f); while(1) stconv18b20(); t=rdwendu(); disp1602(0,0,t/100+'0'); disp1602(0,1,

31、t/10%10+'0'); disp1602(0,2,'.'); disp1602(0,3,t%10+'0'); disp1602(0,5,39); disp1602(0,6,'C'); disp1602(0,14,b2hex(wdL&0xf0)>>4); disp1602(0,15,b2hexwdL&0x0f); disp1602(0,12,b2hex(wdH&0xf0)>>4); disp1602(0,13,b2hexwdH&0x0f); 11.4 DS18B20溫度傳感

32、器測溫實例2功能要求:單片機與四片DS18B20連接,在1602液晶屏第一行起始位置顯示“1:”,緊接著顯示第一片DS18B20所測溫度值,在1602液晶屏第一行中間位置起顯示“2:”緊接著顯示第二片DS18B20所測溫度值,在1602液晶屏第二行起始位置顯示“3:”,緊接著顯示第三片DS18B20所測溫度值,在1602液晶屏第二行中間位置起顯示“4:”緊接著顯示第四片DS18B20所測溫度值。#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned

33、 int sbit RS=P20; sbit RW=P21; sbit E=P22; sbit DQ=P23; uint temp; uchar wdL,wdH; uchar code sn8= 0x28,0x0D,0x3F,0x2C,0x03,0x00,0x00,0x39, 0x28,0xE7,0x50,0x2C,0x03,0x00,0x00,0xA1, 0x28,0xB2,0x40,0x2C,0x03,0x00,0x00,0x18, 0x28,0xD1,0x45,0x2C,0x03,0x00,0x00,0x50; uchar code b2hex="0123456789ABCDE

34、F" /* void wrcmd1602(uchar cmd) uchar m; RW=0; RS=0; P1=cmd; for(m=0;m<=7;m+);/延時25us E=1; for(m=0;m<=7;m+);/延時25us E=0; void wrdata1602(uchar shuju) uchar m; RW=0; RS=1; P1=shuju; for(m=0;m<=7;m+);/延時25us E=1; for(m=0;m<=7;m+);/延時25us E=0; void init1602(void) RW=0; E=0; wrcmd1602(0

35、x38); wrcmd1602(0x0c); wrcmd1602(0x06); wrcmd1602(0x01); void disp1602(uchar x,uchar y,uchar ch) wrcmd1602(0x80+x*0x40+y); wrdata1602(ch); /*/void init18b20(void) uchar m; DQ=0; for(m=0;m<=90;m+); /延時732us DQ=1; for(m=0;m<=65;m+); /延時532us void wrcmd18b20(uchar cmd18b20) bit sendbit; uchar i,m

36、; for(i=1;i<=8;i+) sendbit=cmd18b20&0x01; cmd18b20=cmd18b20>>1; if(sendbit=0) DQ=0; for(m=0;m<=2;m+);/延時12us DQ=0; for(m=0;m<=20;m+); /延時66usDQ=1;for(m=0;m<=2;m+);/延時12us else DQ=0; for(m=0;m<=1;m+);/延時9us DQ=1; for(m=0;m<=10;m+);/延時36us DQ=1;for(m=0;m<=1;m+);/延時9us bi

37、t rdbit18b20(void) uchar m; bit onebit; DQ=0; _nop_(); DQ=1; for(m=0;m<=1;m+);/延時9us onebit=DQ; for(m=0;m<=10;m+);/延時36us return(onebit); uchar rdbyte18b20(void) uchar i,j; uint wenduzhi=0; for(i=1;i<=8;i+) j=rdbit18b20(); wenduzhi=(j<<7)|(wenduzhi>>1); return(wenduzhi); /*/void match18b20(uchar n) uchar i; init18b20(); wrcmd18b20(0x55); for(i=0;i<=7;i+) wrcmd18b20(snni); _nop_(); /* void stconv18b20(void) uchar m,n; init18b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論