DS18B20溫度傳感器使用方法以及代碼_第1頁
DS18B20溫度傳感器使用方法以及代碼_第2頁
DS18B20溫度傳感器使用方法以及代碼_第3頁
DS18B20溫度傳感器使用方法以及代碼_第4頁
DS18B20溫度傳感器使用方法以及代碼_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第7章 DS18B20溫度傳感器7.1 溫度傳感器概述溫度傳感器是各種傳感器中最常用的一種,早起使用的是模擬溫度傳感器,如熱敏電阻,隨著環(huán)境溫度的變化,它的阻值也發(fā)生線性變化,用處理器采集電阻兩端的電壓,然后根據(jù)某個公式就可以計算出當(dāng)前環(huán)境溫度。隨著科技的進(jìn)步,現(xiàn)代的溫度傳感器已經(jīng)走向數(shù)字化,外形小,接口簡單,廣泛應(yīng)用在生產(chǎn)實踐的各個領(lǐng)域,為我們的生活提供便利。隨著現(xiàn)代儀器的發(fā)展,微型化、集成化、數(shù)字化、正成為傳感器發(fā)展的一個重要方向。美國DALLS半導(dǎo)體公司推出的數(shù)字化溫度傳感器DS18B20采用單總線協(xié)議,即單片機接口僅需占用一個I/O端口,無需任何外部元件,直接將環(huán)境溫度轉(zhuǎn)化為數(shù)字信號,

2、以數(shù)碼方式串行輸出,從而大大簡化了傳感器與微處理器的接口。7.2 DS18B20溫度傳感器介紹DS18B20是美國DALLAS半導(dǎo)體公司繼DS1820之后最新推出的一種改進(jìn)型智能溫度傳感器。與傳統(tǒng)的熱敏電阻相比,他能夠直接讀出被測溫度并且可根據(jù)實際要求通過簡單的編程實現(xiàn)912位的數(shù)字值讀數(shù)方式??梢苑謩e在93.75 ms和750 ms內(nèi)完成9位和12位的數(shù)字量,并且從DS18B20讀出的信息或?qū)懭隓S18B20的信息僅需要一根口線(單線接口)讀寫,溫度變換功率來源于數(shù)據(jù)總線,總線本身也可以向所掛接的DS18B20供電,而無需額外電源。因而使用DS18B20可使系統(tǒng)結(jié)構(gòu)更趨簡

3、單,可靠性更高。他在測溫精度、轉(zhuǎn)換時間、傳輸距離、分辨率等方面較DS1820有了很大的改進(jìn),給用戶帶來了更方便的使用和更令人滿意的效果。1. DS18B20溫度傳感器的特性 獨特的單線接口方式:DS18B20與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊。 在使用中不需要任何外圍元件。 可用數(shù)據(jù)線供電,電壓范圍:+3.0 +5.5 V。 測溫范圍:-55 +125 。固有測溫分辨率為0.5 。 通過編程可實現(xiàn)912位的數(shù)字讀數(shù)方式。 用戶可自設(shè)定非易失性的報警上下限值。 支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點測溫。 負(fù)壓特性,電源極性接反

4、時,溫度計不會因發(fā)熱而燒毀,但不能正常工作。2. 引腳介紹 DS18B20有兩種封裝:三腳TO-92直插式(用的最多、最普遍的封裝)和八腳SOIC貼片式。下圖為實驗板上直插式DS18B20的原理圖。3.工作原理單片機需要怎樣工作才能將DS18B20中的溫度數(shù)據(jù)獨取出來呢?下面將給出詳細(xì)分析。首先我們來看看控制DS18B20的指令:(1)讀命令(33H) 通過該命令主機可以讀出ROM中8位系列產(chǎn)品代碼、48位產(chǎn)品序列號和8位CRC碼。讀命令僅用在單個DS18B20在線情況,當(dāng)多于一個時由于DS18B20為開漏輸出將產(chǎn)生線與,從而引起數(shù)據(jù)沖突。 (2)選擇定位命令(55H) 多片DS18B20在線

5、時,主機發(fā)出該命令和一個64位數(shù)列,DS18B20內(nèi)部ROM與主機數(shù)列一致者,才響應(yīng)主機發(fā)送的寄存器操作命令,其他DS18B20等待復(fù)位。該命令也可以用在單片DS18B20情況。 (3)跳過ROM序列號檢測命令(CCH) 對于單片DS18B20在線系統(tǒng),該命令允許主機跳過ROM序列號檢測而直接對寄存器操作,從而節(jié)省時間。對于多片DS18B20在線系統(tǒng),該命令將引起數(shù)據(jù)沖突。 (4)查詢命令(F0H) 當(dāng)系統(tǒng)初建時,主機可能不知道總線上有多少設(shè)備,以及他們各自的64位序列號,用該命令可以做到這點。 (5)報警查詢命令(ECH) 該命令操作過程同ROM查詢命令,但是,僅當(dāng)上次溫度測量值已置位報警標(biāo)

6、志(由于高于TH或低于TL時),DS18B20才響應(yīng)該命令,如果DS18B20處于上電狀態(tài),該標(biāo)志將保持有效,直到遇到下列兩種情況:(1)本次測量溫度發(fā)生變化,測量值處于TH、TL之間;(2)TH、TL改變,溫度值處于新的范圍之間。設(shè)置報警時要考慮到EEROM中的值。 如果主機只是對一個DS18B20進(jìn)行操作,進(jìn)不需要讀取ROM編碼一級匹配ROM編碼了,只要跳過ROM(CCH)命令 ,就可以進(jìn)行如下溫度轉(zhuǎn)換和讀取操作。(1)寫入(4EH) 用此命令把數(shù)據(jù)寫入寄存第24字節(jié),從第2字節(jié)(TH)開始。復(fù)位信號發(fā)出之前必須把這三個字節(jié)寫完。 (2)讀出 (BEH) 用此命令讀出寄存器中的內(nèi)容,從第1

7、字節(jié)開始,直到讀完第9字節(jié),如果僅需要寄存器中部分內(nèi)容,主機可以在合適時刻發(fā)送復(fù)位命令結(jié)束該過程。 (3)復(fù)制(48H) 用該命令把暫存器第24字節(jié)轉(zhuǎn)存到DS18B20的EEROM中,如果DS18B20是由信號線供電,主機發(fā)出此命令后,總線必須保證至少10ms的上拉,當(dāng)發(fā)出命令后,主機發(fā)出讀時隙來讀總線,如果轉(zhuǎn)存正在進(jìn)行,讀結(jié)果為0,轉(zhuǎn)存結(jié)束為1。 (4)開始轉(zhuǎn)換(44H) DS18B20收到該命令后立刻開始溫度轉(zhuǎn)換,不需要其他數(shù)據(jù)。此時DS18B20處于空閑狀態(tài),當(dāng)溫度轉(zhuǎn)換正在進(jìn)行時,主機讀總線將收到0,轉(zhuǎn)換結(jié)束為1。如果DS18B20是由信號線供電,主機發(fā)出此命令后主機必須立即提供至少相應(yīng)

8、于分辨率的溫度轉(zhuǎn)換時間的上拉電平。 (5)回調(diào)(B8H) 執(zhí)行該命令把EEROM中的內(nèi)容回調(diào)到寄存器TH、TL和設(shè)置寄存器單元中,DS18B20上電時能自動回調(diào),因此設(shè)備上電后TH、TL就存在有效數(shù)據(jù)。該命令發(fā)出后,如果主機跟著讀總線,讀到0意味著忙,1為回調(diào)結(jié)束。 (6)讀電源標(biāo)志(B4H) 主機發(fā)出命令后讀總線,DS18B20將發(fā)送電源標(biāo)志,0為信號線供電,1為外接電源。表16.2.4列出了溫度數(shù)據(jù)在高速暫存器RAM和第0和第1個字節(jié)中的存儲格式。DS18B20在出廠時默認(rèn)配置為12位,其中最高位為符號位,即溫度值共11位,單片機在讀取數(shù)據(jù)時,一次會讀兩字節(jié)共16位,讀完后將低11位的二進(jìn)

9、制數(shù)轉(zhuǎn)化為十進(jìn)制數(shù)后再乘以0.0625變?yōu)樗鶞y的實際溫度值。另外,還需要判斷溫度的正負(fù)。前5個數(shù)字為符號位,這5位同時變化,我們只需要判斷其中1位就可以了。前5位為1時,讀取的溫度為負(fù)值,且測到的數(shù)值需要取反加1再乘以0.0625才可得到實際溫度值。前五位為0時;讀取的溫度為正值,只要將測得的數(shù)值乘以0.0625即可得到實際溫度值。4.工作時序圖圖16.26為時序圖中各總線狀態(tài)。(1)初始化(時序圖見圖16.2.7)1) 先將數(shù)據(jù)線置高電平1。2) 延時(該時間要求不是很嚴(yán)格,但是要盡可能短一點)。3) 數(shù)據(jù)線拉到低電平0。4) 延時750s(該時間范圍可以在480-960s)。5) 數(shù)據(jù)線拉

10、到高電平1。6) 延時等待,如果初始化成功則在15-60ms內(nèi)產(chǎn)生一個由DS18B20返回的低電平0,據(jù)該狀態(tài)可以確定它的存在。但是應(yīng)注意,不能無限地等待,不然會使程序進(jìn)入死循環(huán),所以要進(jìn)行超時判斷。7) 若CPU讀到數(shù)據(jù)線上的低電平0后,還要進(jìn)行延時,其延時時間從發(fā)出高電平算起(第5步的時間算起)最少要480s。8) 將數(shù)據(jù)線再次拉到高電平1后結(jié)束。(2)DS18B20寫數(shù)據(jù) (時序圖見圖16.2.8)1) 數(shù)據(jù)線線置低電平0。2) 延時確定的時間為15s、3) 按從地位到高位的順序發(fā)送數(shù)據(jù)(一次只發(fā)送一位)。4) 延時時間45s。5) 將數(shù)據(jù)線拉到高電平1.6) 重復(fù)1-5步驟,直到發(fā)送完

11、整個字節(jié)。7) 最后將數(shù)據(jù)線拉高到1。(3)DS18B20讀數(shù)據(jù) (時序圖見圖16.2.9)1) 將數(shù)據(jù)線拉高到12) 延時2s。3) 將數(shù)據(jù)線拉到04) 延時6s。5) 將數(shù)據(jù)線拉高到1.6) 延時4s。7) 讀數(shù)據(jù)線的狀態(tài)得到一個狀態(tài)位,并進(jìn)行數(shù)據(jù)處理。8) 延時30s。9) 重復(fù)1-7步驟,直到讀取完一個字節(jié)。7.3 綜合實驗四:讀取18B20的信息并顯示在1602上/*程序功能:在1602液晶顯示從DS18B20溫度傳感器中讀出的溫度*/#include <reg52.h>typedef unsigned char uchar; typedef unsigned int u

12、int;sbit ds = P16; / 溫度傳感器信號線sbit beep = P15; / 定義蜂鳴器端口 sbit LCD_RS = P26; / 數(shù)據(jù)/命令選擇端(H/L) sbit LCD_RW = P25; / 讀寫選擇端(1/0)sbit LCD_EP = P27; / 使能信號uint temp;float f_temp;uchar code table1 = "DATA:2014-7-10"uchar code table2 = "Temperature:xx c"uchar code table3 = "0123456789

13、"void delay(uint xms) / 延時函數(shù)uint i,j;for(i = xms;i > 0;i-)for(j = 110;j > 0;j-);/*/ /* /* DS18B20溫度傳感器模塊 /* /*/void dsreset(void) /18B20復(fù)位,初始化函數(shù) uint i; ds=0; i=103; while(i>0)i-; ds=1; i=4; while(i>0)i-;bit tempreadbit() /讀1位數(shù)據(jù)函數(shù) uint i; bit dat; ds=0;i+; /i+ 起延時作用 ds=1;i+;i+; dat=

14、ds; i=8;while(i>0)i-; return dat;uchar tempread() /讀1個字節(jié) uchar i,j,dat; dat=0; for(i=1;i<=8;i+) j=tempreadbit(); dat=(j<<7)|(dat>>1); /讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DAT里 return dat;void tempwritebyte(uchar dat) /向DS18B20寫一個字節(jié)數(shù)據(jù)函數(shù) uint i; uchar j; bit testb; for(j=1;j<=8;j+) testb=dat&am

15、p;0x01; dat=dat>>1; if(testb) /寫 1 ds=0; i+;i+; ds=1; i=8;while(i>0)i-; else ds=0; /寫 0 i=8;while(i>0)i-; ds=1; i+;i+; void tempchange(void) /DS18B20 開始獲取溫度并轉(zhuǎn)換 dsreset(); delay(1); tempwritebyte(0xcc); / 寫跳過讀ROM指令 tempwritebyte(0x44); / 寫溫度轉(zhuǎn)換指令uint get_temp() /讀取寄存器中存儲的溫度數(shù)據(jù)函數(shù) uchar a,b;

16、dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); /讀低8位 b=tempread(); /讀高8位 temp=b; temp<<=8; /兩個字節(jié)組合為1個字 temp=temp|a; f_temp=temp*0.0625; /溫度在寄存器中為12位 分辨率位0.0625° temp=f_temp*10+0.5; /乘以10表示小數(shù)點后面只取1位,加0.5是四舍五入 f_temp=f_temp+0.05; return temp; /temp是整型 /*/ /* /*

17、 1602液晶模塊 /* /*/ void lcd_wcmd(uchar cmd) / 寫入指令數(shù)據(jù)到LCD /RS=L,RW=L,E=高脈沖,D0-D7=指令碼。LCD_RS = 0;LCD_RW = 0;LCD_EP = 0; P0 = cmd;delay(1);LCD_EP = 1;delay(1);LCD_EP = 0; void lcd_wdata(uchar dat) /寫入字符顯示數(shù)據(jù)到LCD /RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;delay(1);LCD_EP = 1;delay(1

18、);LCD_EP = 0; void lcd_init() /LCD初始化設(shè)定初始化函數(shù) lcd_wcmd(0x38); /16*2顯示,5*7點陣,8位數(shù)據(jù)delay(1); lcd_wcmd(0x0c); /設(shè)置開顯示,不顯示光標(biāo)delay(1);lcd_wcmd(0x06); /寫一個字符后地址指針加1delay(1);lcd_wcmd(0x01); /顯示清0,數(shù)據(jù)指針清0delay(1);/*/ /* /* 主函數(shù) /* /*/ void main()uchar i; beep = 0; /蜂鳴器默認(rèn)處于開啟狀態(tài),所以關(guān)閉它lcd_init(); /LCD初始化delay(10);i = 0;lcd_wcmd(0x80); /第1行第1列while(table1i != '0') /按鍵1對應(yīng)的字樣 lcd_wdata(table1i); i+; i

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論