微機(jī)控制應(yīng)用技術(shù)課件:基于DS18B20的數(shù)字溫度計(jì)_第1頁(yè)
微機(jī)控制應(yīng)用技術(shù)課件:基于DS18B20的數(shù)字溫度計(jì)_第2頁(yè)
微機(jī)控制應(yīng)用技術(shù)課件:基于DS18B20的數(shù)字溫度計(jì)_第3頁(yè)
微機(jī)控制應(yīng)用技術(shù)課件:基于DS18B20的數(shù)字溫度計(jì)_第4頁(yè)
微機(jī)控制應(yīng)用技術(shù)課件:基于DS18B20的數(shù)字溫度計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

微機(jī)控制應(yīng)用技術(shù)5.5DS18B20高速緩存RAM5.6DS18B20命令5.7DS18B20時(shí)序圖及函數(shù)5.8數(shù)據(jù)讀取并處理函數(shù)5.9數(shù)字溫度計(jì)源程序項(xiàng)目任務(wù)與目標(biāo)5.1溫度測(cè)試概述5.2DS18B20特點(diǎn)5.3硬件設(shè)計(jì)5.4DS18B20內(nèi)部結(jié)構(gòu)設(shè)計(jì)基于DS18B20的數(shù)字溫度計(jì),編程測(cè)量室內(nèi)或人體等的溫度,并在液晶顯示器12864上顯示溫度值。顯示效果如圖5-1所示。

數(shù)字溫度計(jì)技術(shù)指標(biāo)如下:

(1)溫度范圍:10~40℃,保留1位小數(shù)。

(2)分辨率:0.1℃。知識(shí)目標(biāo)

·了解常用的溫度傳感器。

·了解溫度測(cè)試框圖及溫度傳感器的性能指標(biāo)。

·掌握DS18B20的特點(diǎn)、引腳、命令。

·熟悉DS18B20中ROM與RAM的作用。

·掌握DS18B20的數(shù)據(jù)格式,了解其原碼與補(bǔ)碼。

·會(huì)看DS18B20的時(shí)序圖。

·掌握小數(shù)的顯示方法。

·掌握數(shù)據(jù)處理的步驟及方法。能力目標(biāo)

·認(rèn)識(shí)DS18B20并識(shí)別其引腳。

·正確畫(huà)出硬件電路圖。

·正確寫(xiě)出數(shù)據(jù)的原碼與補(bǔ)碼。

·能夠看懂時(shí)序圖并編寫(xiě)所需函數(shù)。

·編程在液晶顯示器12864顯示小數(shù)。

·正確編寫(xiě)數(shù)據(jù)處理函數(shù)。

5.1

溫度測(cè)試概述

5.1.1溫度傳感器傳感器是把非電學(xué)的物理量轉(zhuǎn)換為電學(xué)量的一種組合器件,它是自動(dòng)控制系統(tǒng)中最前端的部件。圖5-2所示為常用的一些溫度傳感器的實(shí)物圖。熱敏電阻是最簡(jiǎn)單的溫度傳感器,它的阻值會(huì)隨溫度的變化而變化,是一種模擬式溫度傳感器,適用于中、低溫測(cè)量。DS18B20與TN9,均為數(shù)字式溫度傳感器。熱敏電阻和DS18B20是接觸式的溫度傳感器;TN9為非接觸式的溫度傳感器。數(shù)字式溫度傳感器內(nèi)集成了半導(dǎo)體溫度傳感器、ADC等電路,因此可以直接將溫度轉(zhuǎn)換為單片機(jī)所需的數(shù)字量,使用方便,成為溫度傳感器發(fā)展的重要方向,并已逐漸取代模擬式傳感器。【隨堂練習(xí)5-1】

上網(wǎng)查看溫度傳感器的價(jià)格,及特殊環(huán)境使用的溫度傳感器。5.1.2溫度測(cè)試框圖數(shù)字式溫度傳感器測(cè)溫框圖如圖5-3所示。溫度是體現(xiàn)環(huán)境質(zhì)量最基本的一個(gè)物理量,數(shù)字式溫度傳感器可以將待測(cè)溫度轉(zhuǎn)換為數(shù)字量,再通過(guò)總線(xiàn)將數(shù)字量傳遞給單片機(jī)。單片機(jī)的作用是讀入數(shù)字量,再將數(shù)字量溫度值還原為實(shí)際溫度值。顯示器的作用是顯示出實(shí)際溫度值。從單片機(jī)讀入數(shù)字量至顯示實(shí)際溫度值的全過(guò)程,稱(chēng)之為數(shù)據(jù)處理。數(shù)據(jù)處理是各種測(cè)試控制系統(tǒng)中共同的、必不可少環(huán)節(jié)。5.1.3性能指標(biāo)衡量溫度傳感器性能的指標(biāo),常用的有測(cè)溫范圍、精度、分辨率等。1.測(cè)溫范圍測(cè)溫范圍是溫度傳感器最基本的性能指標(biāo),與它的使用場(chǎng)合有密切的關(guān)系。2.精度精度是指溫度傳感器的讀數(shù)與實(shí)際溫度之間的差值,用于衡量數(shù)字式溫度傳感器測(cè)溫準(zhǔn)確程度。3.分辨率分辨率是指數(shù)字式溫度傳感器能識(shí)別的最小溫度,實(shí)際是指數(shù)字式溫度傳感器中ADC的分辨率。4.接口數(shù)字式溫度傳感器一般采用串行接口,常用的有I2C、SPI以及單總線(xiàn)接口。例如,DS18B20采用的是單總線(xiàn)接口,TN9采用的是SPI接口。5.功耗DS18B20工作時(shí)電流典型值為1mA,最大也只到1.5mA,真正做到低功耗。6.封裝同型號(hào)的數(shù)字式溫度傳感器會(huì)有各種不同的封裝,用戶(hù)可根據(jù)使用場(chǎng)地的環(huán)境來(lái)選擇合適的封裝形式?!倦S堂練習(xí)5-2】

(1)某數(shù)字式溫度傳感器輸出的數(shù)字量為10位,用于測(cè)量0~10V的電壓,試計(jì)算其分辨率。

(2)測(cè)量同一溫度時(shí),分辨率為9位的溫度傳感器所能感知的最小溫度變化

于分辨率為12的溫度傳感器。(填大于或小于)

5.2

DS18B20特點(diǎn)

1.特點(diǎn)數(shù)字式智能溫度傳感器DS18B20是單總線(xiàn)器件(1-Wire串行器件),由DALLAS公司生產(chǎn),其抗干擾能力強(qiáng)、精度高。通過(guò)DS18B20可以直接將溫度轉(zhuǎn)換為微處理器能夠處理的數(shù)字量,除此之外,它還具有如下特點(diǎn):(1)電壓范圍:+3.0~+5.5V,并可工作于寄生電源方式(用數(shù)據(jù)線(xiàn)供電)。(2)測(cè)溫范圍:-55~+125℃,在?-10~+85℃時(shí)精度為±0.5℃。(3)單總線(xiàn)接口方式:DS18B20與微處理器只需要一條連線(xiàn),就可以實(shí)現(xiàn)微處理器與DS18B20之間的雙向通信。(4)分辨率可編程設(shè)置。DS18B20共有9、10、11、12位四種分辨率,通過(guò)編程可改變,實(shí)現(xiàn)高精度測(cè)溫。(5)在使用中不需要任何外圍元件。傳感元件和ADC轉(zhuǎn)換器集成在一起。(6)支持多點(diǎn)組網(wǎng)功能,多個(gè)DS18B20可以并聯(lián)使用,實(shí)現(xiàn)多點(diǎn)組網(wǎng)測(cè)溫。(7)掉電保護(hù)功能。由E2PROM存儲(chǔ)分辨率及報(bào)警溫度。(8)負(fù)壓特性。電源極性接反時(shí),DS18B20不會(huì)因發(fā)熱而燒毀,但不能正常工作。2.應(yīng)用場(chǎng)合DS18B20有各種各樣的封裝形式(即外觀),在實(shí)際應(yīng)用時(shí),可以根據(jù)應(yīng)用場(chǎng)地的環(huán)境選擇合適的封裝形式。DS18B20常用于以下場(chǎng)合:(1)冷凍庫(kù)、糧倉(cāng)、儲(chǔ)罐、機(jī)房、電纜線(xiàn)槽等測(cè)溫和控制領(lǐng)域。(2)軸瓦、缸體、空調(diào)等狹小空間工業(yè)設(shè)備測(cè)溫和控制。(3)汽車(chē)空調(diào)、冰箱、冷柜以及中低溫干燥箱等。(4)供熱、制冷管道、中央空調(diào)分戶(hù)熱能計(jì)量和工業(yè)領(lǐng)域測(cè)溫和控制?!倦S堂練習(xí)5-3】上網(wǎng)了解DS18B20的各種封裝形式。

5.3

硬件設(shè)計(jì)

5.3.1DS18B20引腳圖1.引腳圖圖5-4所示為實(shí)驗(yàn)箱所用DS18B20的外形圖和引腳圖?!ND—地?!Q—數(shù)據(jù)輸入/輸出引腳,為開(kāi)漏的(需外接上拉電阻)單總線(xiàn)接口引腳。工作于寄生電源方式時(shí),由DQ向DS18B20提供電源。·VCC—可選外接電源。在寄生電源方式時(shí)接地。2.應(yīng)用電路圖5-5所示為DS18B20常見(jiàn)應(yīng)用電路,其中圖5-5(a)為單點(diǎn)測(cè)溫外部供電方式,外部供電方式是DS18B20的最佳工作方式,工作穩(wěn)定可靠,抗干擾能力強(qiáng),而且電路也比較簡(jiǎn)單;圖5-5(b)為單點(diǎn)測(cè)溫寄生電源供電方式,寄生電源方式在進(jìn)行遠(yuǎn)距離測(cè)溫時(shí),無(wú)需本地電源,連接也更為簡(jiǎn)潔,但是只適用于單點(diǎn)測(cè)溫;圖5-5(c)為多點(diǎn)測(cè)溫組網(wǎng)外部供電方式,多個(gè)DS18B20共用一個(gè)I/O口,是由于每個(gè)DS18B20都有一個(gè)唯一的地址,編程相對(duì)單點(diǎn)測(cè)溫要復(fù)雜;圖5-5(d)為簡(jiǎn)易的多點(diǎn)測(cè)溫外部供電方式,給每一個(gè)DS18B20分配一個(gè)I/O口,雖然占用的I/O口增加了,但是多個(gè)DS18B20之間互不影響,編程簡(jiǎn)單。5.3.2數(shù)字溫度計(jì)硬件設(shè)計(jì)數(shù)字式溫度計(jì)的硬件設(shè)計(jì)圖如圖5-6所示。項(xiàng)目任務(wù)要求顯示測(cè)量溫度值的同時(shí),還要顯示一些輔助信息,因此選用液晶顯示器12864作為顯示器件。只顯示溫度值時(shí),也可用數(shù)碼管作為顯示器件。12864引腳分配與項(xiàng)目四完全相同?!倦S堂練習(xí)5-4】實(shí)驗(yàn)箱所用DS18B20的外形和90系列高頻小功率三極管的外形相同,簡(jiǎn)述這種外形的引腳識(shí)別方法?!倦S堂練習(xí)5-5】寫(xiě)出DS18B20數(shù)據(jù)線(xiàn)DQ的定義語(yǔ)句。

5.4

DS18B20內(nèi)部結(jié)構(gòu)

數(shù)字式溫度傳感器DS18B20內(nèi)部主要由3部分組成:64位ROM、E2PROM和高速緩存RAM,如圖5-7所示。1.64位ROM64位ROM中存放著DS18B20的地址碼,每個(gè)DS18B20的地址碼是唯一的。DS18B20的地址碼就是一個(gè)64位序列號(hào),該序列號(hào)是DS18B20在出廠前就刻好的,因此一條總線(xiàn)上可以同時(shí)掛接多個(gè)DS18B20,而不會(huì)出現(xiàn)混亂現(xiàn)象。2.E2PROM可電擦除的E2PROM用于存儲(chǔ)DS18B20的分辨率及報(bào)警溫度,斷電后,不需重新設(shè)置。3.高速緩存RAM高速緩存RAM共9B,存儲(chǔ)了溫度值、溫度的高溫限值TH、低溫限值TL、配置寄存器及CRC校驗(yàn)值。

5.5

DS18B20高速緩存RAM

5.5.1高速緩存RAM高速緩存RAM由9個(gè)字節(jié)組成,各字節(jié)的內(nèi)容如表5-1所示。第0、第1字節(jié)中存放的是DS18B20轉(zhuǎn)換后所得的9~12位數(shù)字量溫度值,該數(shù)字量是用補(bǔ)碼表示的。第2、第3字節(jié)中存放的是溫度報(bào)警所需的上限與下限溫度值。第4字節(jié)為配置寄存器,用以改變DS18B20的分辨率。第8字節(jié)為CRC(循環(huán)冗余)校驗(yàn)值。5.5.2原碼、反碼、補(bǔ)碼在C語(yǔ)言中,字符型與整型數(shù)分為無(wú)符號(hào)數(shù)和有符號(hào)數(shù)。有符號(hào)數(shù)的表示方法有三種,即原碼、反碼和補(bǔ)碼。原碼、反碼和補(bǔ)碼均由兩部分組成,即符號(hào)位和數(shù)值位。符號(hào)位均是“0正1負(fù)”;而數(shù)值位,三種表示方法各不相同。在計(jì)算機(jī)中,有符號(hào)數(shù)一律用補(bǔ)碼來(lái)表示和存儲(chǔ)。原因有三,一是使用補(bǔ)碼,可以將符號(hào)位和數(shù)值位統(tǒng)一處理;二是將減法轉(zhuǎn)變?yōu)榧臃ńy(tǒng)一處理;三是補(bǔ)碼與原碼相互轉(zhuǎn)換,運(yùn)算過(guò)程是相同的,不需要額外的硬件電路。在計(jì)算補(bǔ)碼時(shí),一定要先確定模。下面以8位二進(jìn)制數(shù)(位7為符號(hào)位,位6~位0是數(shù)據(jù)位)為例,介紹原碼與補(bǔ)碼的轉(zhuǎn)換方法。1.由原碼求補(bǔ)碼(1)正整數(shù)的補(bǔ)碼=原碼。(2)負(fù)整數(shù)的補(bǔ)碼=~原碼(除符號(hào)位)+1=反碼+1。“~”為C語(yǔ)言中的按位非運(yùn)算?!纠?-1】 寫(xiě)出數(shù)+15的原碼與補(bǔ)碼。 原碼=00001111=0x0f補(bǔ)碼=00001111=0x0f【例5-2】 寫(xiě)出數(shù)-15的原碼與補(bǔ)碼。原碼=10001111=0x8f補(bǔ)碼=~10001111+1=11110000+1=11110001=0xf12.由補(bǔ)碼求原碼正整數(shù)的原碼=補(bǔ)碼負(fù)整數(shù)的原碼=~補(bǔ)碼(除符號(hào)位)+1【例5-3】 補(bǔ)碼為0x16時(shí),求原碼并寫(xiě)出該數(shù)的值。因?yàn)椋a(bǔ)碼0x16=00010110的符號(hào)位(位7)為0,所以是一個(gè)正數(shù)的補(bǔ)碼。所以,原碼=補(bǔ)碼=0x16=+22【例5-4】 補(bǔ)碼為0xe6時(shí),求原碼并寫(xiě)出該數(shù)的值。因?yàn)?,補(bǔ)碼0xe6=11100110的符號(hào)位(位7)為1,所以是一個(gè)負(fù)數(shù)的補(bǔ)碼。所以,原碼=~補(bǔ)碼(除符號(hào)位)+1=~0xe6+1=~11100110+1=10011001+1=10011010=-263.4位二進(jìn)制不同表示方法對(duì)比由表5-2可知:(1)?4位二進(jìn)制無(wú)符號(hào)數(shù)的表示范圍是:0~15(24-1)。(2)?4位二進(jìn)制有符號(hào)數(shù)補(bǔ)碼的表示范圍是:-8~+7(23-1)?!倦S堂練習(xí)5-6】(1)寫(xiě)出數(shù)+36、-20的原碼與補(bǔ)碼。(2)補(bǔ)碼為0x32、0xc3時(shí),求原碼并寫(xiě)出該數(shù)的值。

5.3數(shù)據(jù)格式1.?dāng)?shù)據(jù)格式DS18B20轉(zhuǎn)換后的數(shù)字量有9~12位四種,在出廠時(shí)默認(rèn)配置為12位,此時(shí)DS18B20的分辨率最高,能識(shí)別的最小溫度變化值也最低。下面以12位為例介紹DS18B20的數(shù)據(jù)格式。DS18B20的數(shù)字量以帶符號(hào)擴(kuò)展的補(bǔ)碼形式存放在高速緩存器的第0和第1個(gè)字節(jié),如表5-3所示。表5-3中12位數(shù)字量,符號(hào)位S(位11),0正1負(fù);數(shù)據(jù)位11位(位10~位0)。11位數(shù)據(jù)位由7位整數(shù)和4位小數(shù)組成。DS18B20能識(shí)別的最小溫度由最低位決定。12位數(shù)字量時(shí)分辨率=2-4,用0.0625℃/LSB形式表示,也就是說(shuō)數(shù)字量的最低位由0變1,模擬的溫度值增加0.0625℃。表5-4所示為DS18B20溫度范圍內(nèi)的一些典型的溫度值。2.十六進(jìn)制數(shù)的合成DS18B20輸出的數(shù)字量分為高8位和低8位存入兩個(gè)字節(jié),單片機(jī)需要分2次讀入,因此在轉(zhuǎn)換為實(shí)際溫度值之前,要先將高8位和低8位合成為一個(gè)16位的數(shù)。步驟如下:(1)先將高位數(shù)左移若干位。(2)高位數(shù)的位數(shù)補(bǔ)足后,再與低位數(shù)按位或?!纠?-5】 有兩個(gè)十六進(jìn)制數(shù)0x6、0x59,試合成0x659。首先將做高位的數(shù)0x6與0x659相比,少了2位十六進(jìn)制數(shù),因此先要將0x6→0x600,通過(guò)左移8位(1位十六進(jìn)制=4位二進(jìn)制)。0x6<<8=0110<<8=011000000000=0x600注意:C語(yǔ)言的左移、右移是針對(duì)二進(jìn)制數(shù)運(yùn)算的,但是書(shū)寫(xiě)的形式是十六進(jìn)制。然后再將0x600與低位數(shù)0x59按位或。0x600|0x59=0x659兩步寫(xiě)在一起后為:0x6<<8|0x59=0x659【隨堂練習(xí)5-7】(1)在【例5-5】中,合成0x596。(2)有兩個(gè)無(wú)符號(hào)字符型的變量a和b,用變量b作為高位,合成一個(gè)數(shù)后,存入變量c,試寫(xiě)出相關(guān)語(yǔ)句。3.實(shí)際溫度(1)符號(hào)位S=0時(shí),表示實(shí)際溫度≥0。實(shí)際溫度=數(shù)字量*0.0625(2)符號(hào)位S=1時(shí),表示實(shí)際溫度<0。實(shí)際溫度=(~數(shù)字量+1)*0.0625【例5-6】 已知DS18B20轉(zhuǎn)換后數(shù)字量的低8為是0x91,高8位是0x01,試計(jì)算實(shí)際溫度值。第一步,合成16位數(shù)字量。0x0191=0x01<<8|0x91第二步,計(jì)算實(shí)際溫度。因?yàn)閿?shù)字量0x0191的符號(hào)位為0,所以實(shí)際溫度>0。實(shí)際溫度 =0x0191×0.0625 =(1×16×16+9×16+1×1)×0.0625

=401×0.0625

=25.0625℃【例5-7】 已知DS18B20轉(zhuǎn)換后數(shù)字量的低8為是0x6f,高8位是0xfe,試計(jì)算實(shí)際溫度值。第一步,合成16位數(shù)字量。0xfe6f=0xfe<<8|0x6f第二步,計(jì)算實(shí)際溫度。因?yàn)閿?shù)字量0xfe6f符號(hào)位為1,所以實(shí)際溫度<0。實(shí)際溫度 =(~0xfe6f+1)×0.0625 =-(0x0190+1)×0.0625

=-0x0191×0.0625

=-401×0.0625

=-25.0625℃4.顯示小數(shù)(1)顯式強(qiáng)制類(lèi)型轉(zhuǎn)換符C51中顯式強(qiáng)制類(lèi)型轉(zhuǎn)換的一般形式為: (類(lèi)型說(shuō)明符)(表達(dá)式);作用:是將表達(dá)式的運(yùn)算結(jié)果,強(qiáng)制轉(zhuǎn)換成類(lèi)型說(shuō)明符所表示的類(lèi)型?!纠?-8】 將浮點(diǎn)型常量5.89轉(zhuǎn)換整型??梢员硎緸椋海╥nt)(5.84)=5注意:在把浮點(diǎn)型轉(zhuǎn)換為整型時(shí),只保留整數(shù)部分,將小數(shù)全部舍去。(2)小數(shù)的顯示從上可知,根據(jù)數(shù)字量計(jì)算出的實(shí)際溫度值,一般為小數(shù),但是顯示器是不能直接顯示小數(shù)的。怎么辦呢?我們只能根據(jù)精度的要求,將小數(shù)或負(fù)數(shù)轉(zhuǎn)換為正整數(shù)后顯示,然后在需要的位置人為添加小數(shù)點(diǎn)。步驟如下:① 根據(jù)精度要求,保留n位小數(shù)。即乘以10n。② 四舍五入,加上0.5。③ 將上述結(jié)果強(qiáng)制轉(zhuǎn)換為整型。④ 顯示處理后的整型數(shù),并添加小數(shù)點(diǎn)?!纠?-9】 有一浮點(diǎn)型常量25.0625,保留2位小數(shù),四舍五入后轉(zhuǎn)換為整型后顯示。試寫(xiě)出相關(guān)操作。第一步:保留2位小數(shù) 25.0625*100=2506.25第二步:四舍五入 2506.25+0.5=2506.75第三步:強(qiáng)制轉(zhuǎn)換 (int)(2506.75)=2506第四步:顯示2506。將2506拆分為千位、百位、十位、個(gè)位后顯示,并在百位后添加小數(shù)點(diǎn)。注意:前三步也可寫(xiě)一個(gè)表達(dá)式為:(int)(25.0625*100+0.5)=2506【例5-10】編寫(xiě)函數(shù),在液晶顯示器12864上顯示98.5642,保留1位小數(shù),四舍五入。/*

函數(shù)名:xianshi()作用:在12864上顯示98.7,顯示位置自定。入口參數(shù):無(wú)出口參數(shù):無(wú)說(shuō)明:函數(shù)中用到的字模及函數(shù)聲明如下:ucharcodedian[16]; //存放小數(shù)點(diǎn)的字模ucharcodeshuzi[10][16]; //存放0~9的字模voidlcdxianshi16x8(uchartab[],ucharqiye,ucharqilie);//12864顯示字符函數(shù)*/voidxianshi(void){ float af=98.5642; unsignedint

ai; ai=(unsignedint)(af*10+0.5); lcdxianshi16x8(shuzi[ai/100],0,0);lcdxianshi16x8(shuzi[ai/10%10],0,8);lcdxianshi16x8(dian,0,16);lcdxianshi16x8(shuzi[ai%10],0,32);}【例5-11】有二個(gè)數(shù),0x8d和0x2。編寫(xiě)函數(shù),在液晶顯示器12864上顯示0x28d*0.125,要求保留2位小數(shù),四舍五入。分析:

0x28d×0.125=(2×16×16+8×16+13×1)×0.125=653×0.125=81.625/*

函數(shù)名:xianshi2()作用:在12864上顯示0x28d*0.125,顯示位置自定。入口參數(shù):無(wú)出口參數(shù):無(wú)*/voidxianshi2(void){ unsignedcharc1=0x8d,c2=0x2;unsignedint ci1,ci2;float cf;ci1=c2<<8|c1; cf=ci1*0.125; ci2=(unsignedint)(ci1*100+0.5);

lcdxianshi16x8(shuzi[ci2/1000],2,0);lcdxianshi16x8(shuzi[ci2/100%10],2,0);lcdxianshi16x8(dian,2,16);lcdxianshi16x8(shuzi[ci2/10%10],2,8);lcdxianshi16x8(shuzi[ci2%10],2,32);}【隨堂練習(xí)5-8】(1)解釋下面的語(yǔ)句,并寫(xiě)出執(zhí)行結(jié)果。unsignedinta;floatb=26.97;a=(unsignedint)(b);(2)解釋【例5-11】中各變量的作用。5.4配置寄存器配置寄存器字節(jié)中各位的含義如表5-5所示?!の?~位0一直都是“1”;·位7:TM是測(cè)試模式位,用于設(shè)置DS18B20是工作模式還是測(cè)試模式。在DS18B20出廠時(shí),TM位被設(shè)置為0,用戶(hù)不要去改動(dòng)?!の?和位5:R1和R0用來(lái)設(shè)置DS18B20分辨率,如表5-6所示。DS18B20在出廠時(shí),分辨率被設(shè)置為12位。

5.6

DS18B20命令

6.1ROM命令1.跳過(guò)ROM,指令碼CCH該指令的作用是忽略DS18B20溫度傳感器的地址,直接向DS18B20發(fā)送溫度轉(zhuǎn)換命令。只適用于單片機(jī)I/O口接一塊DS18B20的情況。2.讀ROM,指令碼33H該指令的作用是讀DS18B20溫度傳感器ROM中的64位編碼(即地址)。3.匹配ROM,指令碼55H發(fā)出此命令之后,接著發(fā)出DS18B20的64位ROM地址,訪問(wèn)單總線(xiàn)上與該地址相對(duì)應(yīng)的DS18B20使之作出響應(yīng),為下一步對(duì)該DS18B20的讀寫(xiě)作準(zhǔn)備。4.搜索ROM,指令碼F0H該指令用于確定在同一總線(xiàn)上掛接DS18B20的個(gè)數(shù),并識(shí)別64位ROM地址。為操作各器件作好準(zhǔn)備。5.告警搜索命令,指令碼ECH該指令執(zhí)行后只有實(shí)際溫度超過(guò)設(shè)定值上限或下限的芯片才能夠做出響應(yīng)。多點(diǎn)測(cè)溫時(shí),如果單片機(jī)的I/O口足夠使用,在一個(gè)I/O口線(xiàn)上只連接一片DS18B20,就可以像單點(diǎn)測(cè)溫一樣,不用讀取ROM地址及匹配ROM,只要用跳過(guò)ROM命令,就可以啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換并讀取結(jié)果了。6.2RAM命令1.溫度轉(zhuǎn)換,指令碼44H該指令的作用是啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換,12位分辨率時(shí)轉(zhuǎn)換時(shí)間最長(zhǎng)為750ms。轉(zhuǎn)換后數(shù)字量的低8位存入高速緩存RAM的第0字節(jié),高8位存入第1字節(jié)中。2.讀暫存器,指令碼BEH該命令的作用是讀高速緩存RAM中9個(gè)字節(jié)的內(nèi)容。該命令只是通知DS18B20,要讀高速緩存RAM,并不能讀出所需的內(nèi)容。3.寫(xiě)暫存器,指令碼4EH該命令的作用是向高速緩存RAM的第2字節(jié)寫(xiě)入溫度報(bào)警所需的上限溫度,向第3字節(jié)寫(xiě)入溫度報(bào)警所需的下限溫度,向第4字節(jié)寫(xiě)入配置寄存器所需數(shù)值。在該命令之后,緊跟著傳送上限、下限溫度及配置寄存器的數(shù)據(jù)。也可以在任何時(shí)刻發(fā)出復(fù)位命令來(lái)中止寫(xiě)入。4.復(fù)制暫存器,指令碼48H該命令的作用是將高速緩存RAM中第2~4字節(jié)的內(nèi)容復(fù)制到EEPROM中。5.調(diào)EEPROM,指令碼B8H該命令的作用是將EEPROM中內(nèi)容恢復(fù)到RAM中的第2~4字節(jié)。6.讀供電方式,指令碼B4H該命令的作用是讀DS18B20的供電模式。寄生電源供電時(shí),DS18B20發(fā)送“0”;外接電源供電時(shí),DS18B20發(fā)送“1”。

5.7

DS18B20時(shí)序圖及函數(shù)

由于DS18B20是在一根I/O線(xiàn)上讀寫(xiě)數(shù)據(jù)的,因此,DS18B20有嚴(yán)格的通信協(xié)議(讀寫(xiě)的數(shù)據(jù)位的時(shí)序要求)來(lái)保證各位數(shù)據(jù)傳輸?shù)恼_性和完整性。該協(xié)議包含:初始化時(shí)序、讀時(shí)序、寫(xiě)時(shí)序。主機(jī)與DS18B20之間傳送數(shù)據(jù)和命令時(shí),都是先傳送低位、后傳送高位。5.7.1DS18B20初始化時(shí)序及函數(shù)單總線(xiàn)上的所有操作均從初始化序列開(kāi)始。初始化序列包括主機(jī)發(fā)出一復(fù)位脈沖,接著由從屬器件送出存在脈沖。存在脈沖讓總線(xiàn)控制器知道DS18B20在總線(xiàn)上且已準(zhǔn)備好操作。1.DS18B20初始化時(shí)序如圖5-8所示為DS18B20的初始化時(shí)序圖。初始化步驟如下:(1)主機(jī)發(fā)出復(fù)位脈沖(負(fù)脈沖),寬度為480~960s。(2)?DS18B20上電后,檢測(cè)主機(jī)發(fā)出的復(fù)位脈沖,檢測(cè)到后,等待15~60s。(3)?DS18B20發(fā)出存在脈沖(負(fù)脈沖),寬度為60~240s。(4)主機(jī)發(fā)出復(fù)位脈沖后,就開(kāi)始檢測(cè)DS18B20發(fā)出的應(yīng)答脈沖,如檢測(cè)到,表示DS18B20應(yīng)答,從第2步開(kāi)始最少延時(shí)480s;未檢測(cè)到,表示沒(méi)有DS18B20應(yīng)答。如果電路中只有一個(gè)DS18B20,主機(jī)在發(fā)出復(fù)位脈沖后,可以不等DS18B20應(yīng)答,直接進(jìn)行下一步。2.DS18B20初始化函數(shù)/*函數(shù)名:ds18b20chushihua()作用:初始化DS18B20。入口參數(shù):無(wú)出口參數(shù):無(wú)說(shuō)明:由主機(jī)發(fā)出復(fù)位脈沖。voiddelayus(uinta);*/voidds18b20chushihua(void){DQ=1;delayus(8);DQ=0;delayus(80);DQ=1;delayus(14);}【隨堂練習(xí)5-9】(1)畫(huà)出上升沿、下降沿、正脈沖以及負(fù)脈沖。(2)編寫(xiě)函數(shù),產(chǎn)生正脈沖,寬度為100us。5.7.2DS18B20寫(xiě)操作時(shí)序及函數(shù)1.寫(xiě)操作時(shí)序?qū)懖僮鲿r(shí),數(shù)據(jù)由單片機(jī)傳送給DS18B20。DS18B20的寫(xiě)操作時(shí)序分為寫(xiě)0時(shí)序和寫(xiě)1時(shí)序兩個(gè)過(guò)程,如圖5-9所示。寫(xiě)時(shí)序步驟如下:(1)主機(jī)拉低總線(xiàn)DQ,1s,表示寫(xiě)周期開(kāi)始。(2)主機(jī)將待傳送的1位數(shù)據(jù)送至總線(xiàn)DQ,先傳送低位,保持60~20s。(3)主機(jī)釋放總線(xiàn)DQ為1,為下次操作總線(xiàn)作準(zhǔn)備。(4)步驟(1)~(3)重復(fù)8次,發(fā)送一個(gè)字節(jié)。在寫(xiě)周期內(nèi),DS18B20在檢測(cè)到總線(xiàn)被拉低并等待15s后,開(kāi)始采樣總線(xiàn),接收數(shù)據(jù)。2.DS18B20寫(xiě)函數(shù)/*

函數(shù)名:ds18b20xie()作用:由主機(jī)向DS18B20寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù)。入口參數(shù):zijie:存放待寫(xiě)入的一個(gè)字節(jié)的數(shù)據(jù),出口參數(shù):無(wú)*/

voidds18b20xie(ucharzijie){ uchari; for(i=0;i<8;i++)

{ DQ=0; //拉低總線(xiàn) if(zijie&0x01) DQ=1; //取出形參zijie的位0并送至DQ else DQ=0; delayus(5); DQ=1; //拉高總線(xiàn) zijie=zijie>>1; //變量zijie右移一位,為了下一次取出位0作準(zhǔn)備

}}【隨堂練習(xí)5-10】(1)寫(xiě)出DS18B20寫(xiě)函數(shù)的函數(shù)聲明及調(diào)用。(2)將變量b的位7送給變量a,寫(xiě)出實(shí)現(xiàn)此要求的語(yǔ)句。5.7.3DS18B20讀操作時(shí)序及函數(shù)1.DS18B20讀操作時(shí)序讀操作時(shí),數(shù)據(jù)由DS18B20傳送給單片機(jī)。DS18B20的讀時(shí)序分為讀0時(shí)序和讀1時(shí)序兩個(gè)過(guò)程,如圖5-10所示。讀時(shí)序步驟如下:(1)主機(jī)拉低總線(xiàn)DQ,1μs。(2)主機(jī)釋放總線(xiàn)DQ為1,為了讓DS18B20將數(shù)據(jù)傳送至總線(xiàn)DQ。DS18b20在檢測(cè)到總線(xiàn)被拉低1s后,送一位數(shù)據(jù)至DQ,先傳送低位。(3)主機(jī)在15s內(nèi),采樣總線(xiàn)DQ,讀入一位數(shù)據(jù)并存放。(4)步驟(1)~(3)重復(fù)8次,讀入一個(gè)字節(jié)。2.二進(jìn)制數(shù)的合成主機(jī)從DS18B20讀取數(shù)據(jù)時(shí),每次只能讀入一位二進(jìn)制0或1,一個(gè)字節(jié)的數(shù)據(jù)主機(jī)需要讀8次,共讀入了8個(gè)一位二進(jìn)制數(shù)。單片機(jī)處理數(shù)據(jù)時(shí),要將8個(gè)一位二進(jìn)制數(shù)根據(jù)高低位合成一個(gè)8位二進(jìn)制數(shù)。然后才能進(jìn)行后續(xù)處理。變量zijie用于存放分8次讀入的8個(gè)一位二進(jìn)制數(shù),并賦初值0。表5-7給出了串行從DQ接收一個(gè)字節(jié)的數(shù)據(jù)0xd5=11010101時(shí)的全過(guò)程。DS18B20先發(fā)送的是位0,但在表5-7中,卻沒(méi)有將位0存到zijie的位0,而是存到了位7,這是由于串行接收一個(gè)字節(jié)時(shí),用循環(huán)for語(yǔ)句實(shí)現(xiàn)時(shí),只能將每次接收到的一位數(shù)據(jù)存至固定的位置(位7),然后通過(guò)右移運(yùn)算,在第8次接收時(shí),移至正確的位置。單片機(jī)串行讀入一個(gè)字節(jié)的數(shù)據(jù),并且先發(fā)送位0時(shí),步驟如下:(1)存放接收數(shù)據(jù)的變量先右移1位。(2)判斷待接收的數(shù)據(jù)為1時(shí),將1存至位7。將1存至變量zijie的位7,其他位不變時(shí),可用按位或運(yùn)算“|”實(shí)現(xiàn)。zijie=zijie|0x80;(3)重復(fù)(1)(2)8次之后,讀入一個(gè)字節(jié)。3.DS18B20讀函數(shù)/*

函數(shù)名:ds18b20du()作用:?jiǎn)纹瑱C(jī)串行接收DS18B20發(fā)送的一個(gè)字節(jié)的數(shù)據(jù)。入口參數(shù):無(wú)出口參數(shù):zijie:局部變量,存放串行接收的一個(gè)字節(jié)的數(shù)據(jù)。*/uchards18b20du(void){ uchari; ucharzijie=0; for(i=0;i<8;i++) { DQ=0; //拉低總線(xiàn) zijie=zijie>>1; //為接收DQ至變量zijie的位7作準(zhǔn)備 DQ=1; //拉高總線(xiàn) if(DQ)zijie=zijie|0x80; //DQ為1時(shí),存至zijie的位7 delayus(5);

}

return(zijie);}【隨堂練習(xí)5-11】(1)將0存至變量ad的位7,試寫(xiě)出實(shí)現(xiàn)此要求的表達(dá)式。(2)將1存至變量c的位0,試寫(xiě)出實(shí)現(xiàn)此要求的表達(dá)式。(3)寫(xiě)出DS18B20讀函數(shù)的函數(shù)聲明及調(diào)用。(4)打開(kāi)項(xiàng)目四的源程序,錄入DS18B20的初始化、寫(xiě)及讀函數(shù)。

5.8

數(shù)據(jù)讀取并處理函數(shù)

數(shù)據(jù)處理是單片機(jī)控制系統(tǒng)為了正確顯示結(jié)果所做的一些操作。為了便于理解,這里,將讀取數(shù)據(jù)、數(shù)據(jù)處理、數(shù)據(jù)顯示這三個(gè)連續(xù)的過(guò)程安排在一起完成。5.8.1數(shù)據(jù)讀取并處理過(guò)程DS18B20與主機(jī)的通信功能是分時(shí)完成的,有嚴(yán)格的時(shí)序要求,主機(jī)對(duì)DS18B20的各種操作必須按協(xié)議進(jìn)行,否則DS18B20不響應(yīng)主機(jī)。根據(jù)DS18B20的通信協(xié)議,主機(jī)控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過(guò)三個(gè)步驟:第一步:每次讀寫(xiě)前對(duì)DS18B20進(jìn)行復(fù)位操作。第二步:至少發(fā)送一條ROM指令。第三步:最后發(fā)送RAM指令。DS18B20的數(shù)據(jù)讀取并處理的具體步驟如下:(1)啟動(dòng)DS18B20開(kāi)始溫度轉(zhuǎn)換。①主機(jī)復(fù)位;②主機(jī)發(fā)送跳過(guò)ROM指令;③主機(jī)發(fā)送溫度轉(zhuǎn)換命令。(2)分兩次讀取DS18B20轉(zhuǎn)換后的12位數(shù)字量。①主機(jī)復(fù)位;②主機(jī)發(fā)送跳過(guò)ROM指令;③主機(jī)發(fā)送讀RAM命令。④調(diào)用讀函數(shù)讀取轉(zhuǎn)換后的溫度值。(3)合成16位的數(shù)字量。(4)將16位的數(shù)字量轉(zhuǎn)換為實(shí)際溫度值(浮點(diǎn)型)。(5)將實(shí)際溫度值(浮點(diǎn)型)轉(zhuǎn)換為整型。(6)顯示實(shí)際溫度(整型),并在合適的位置添加小數(shù)點(diǎn)。5.8.2數(shù)據(jù)讀取并處理函數(shù)/*

函數(shù)名:ds18b20sjcl()作用:實(shí)現(xiàn)從啟動(dòng)DS18B20開(kāi)始溫度轉(zhuǎn)換一直到顯示實(shí)際溫度的全過(guò)程,顯示結(jié)果保留1位小數(shù)。溫度范圍:10~40℃。入口參數(shù):無(wú)void出口參數(shù):無(wú)void說(shuō)明: shuzidi8:存放數(shù)字量溫度值的低8位;shuzigao8:存放數(shù)字量溫度值的高8位;shuzi16:存放16位數(shù)字量溫度值;monif:存放實(shí)際溫度值(浮點(diǎn)型);moniint:存放實(shí)際溫度值(整型),即待顯示的數(shù)據(jù)。*/voidds18b20sjcl(void){

ucharshuzidi8,shuzigao8;

uintshuzi16; floatmonif; uintmoniint; ds18b20chushihua(); //18B20初始化 ds18b20xie(0xcc); //跳過(guò)ROM,指令碼0XCC ds18b20xie(0x44); //啟動(dòng)18B20溫度轉(zhuǎn)換,指令碼0X44 ds18b20chushihua(); ds18b20xie(0xcc); ds18b20xie(0xbe);

//讀高速緩存RAM,指令碼0XBE

shuzidi8=ds18b20du(); //讀數(shù)字量的低8位 shuzigao8=ds18b20du(); //讀數(shù)字量的高8位 shuzi16=shuzigao8<<8|shuzidi8;

//合成16位數(shù)字量 monif=shuzi16*0.0625; //16位數(shù)字量轉(zhuǎn)換為實(shí)際溫度值

moniint=(uint)(monif*10+0.5); //浮點(diǎn)型實(shí)際溫度變?yōu)檎?,保?位小數(shù) lcdxianshi16x8(shuzi[moniint/100],4,86);

//顯示整型實(shí)際溫度的百位 lcdxianshi16x8(shuzi[moniint/10%10],4,94); //顯示整型實(shí)際溫度的十位 lcdxianshi16x8(xiaoshudian,4,102);

//顯示小數(shù)點(diǎn) lcdxianshi16x8(shuzi[moniint%10],4,110);

//顯示整型實(shí)際溫度的個(gè)位}【隨堂練習(xí)5-12】(1)顯示結(jié)果保留2位小數(shù)時(shí),試分析數(shù)據(jù)處理函數(shù)中相關(guān)語(yǔ)句。(2)測(cè)溫范圍為0~99℃,試分析數(shù)據(jù)處理函數(shù)中相關(guān)語(yǔ)句。(3)錄入DS18B20數(shù)據(jù)數(shù)理函數(shù)。

5.9

數(shù)字溫度計(jì)源程序

數(shù)字溫度計(jì)源程序如下:/*預(yù)處理*/#include<reg51.h>#defineuintunsignedint#defineucharunsignedchar/*全局變量定義*/sbitCS1=P2^5;sbitCS2=P2^2;sbitRS=P2^0;sbitRW=P2^4;sbitE=P2^1;sbitRST=P2^6;sbitDQ=P1^4;ucharcodeji[32];ucharcodeshi[32];ucharcodenei[32];ucharcodewen[32];ucharcodedu[32];ucharcodemaohao[32];ucharcodesheshidu[32];ucharcodexiaoshudian[16];ucharcodeshuzi[10][16];/*函數(shù)聲明*/voidlcdkaixianshi(void);voidlcdguanxianshi(void);voidlcdshezhiye(ucharye);voidlcdshezhilie(ucharlie);voidlcdxiezimo(ucharzijie);voidlcdshezhiyelie(ucharye,ucharlie);voidlcdqingping(void);voidlcdchushihua(void);voidlcdxianshi16x16(uchartab[],ucharqiye,ucharqilie);voidlcdxianshi16x8(uchartab[],ucharqiye,ucharqilie);voiddelayus(uinta);voidds18b20chushihua(void);voidds18b20xie(ucharzijie);uchards18b20du(void);voidds18b20sjcl(void);/*主函數(shù)*/main(){ lcdchushihua(); lcdxianshi16x16(wen,2,40); lcdxianshi16x16(du,2,56); lcdxianshi16x16(ji,2,72); lcdxianshi16x16(shi,4,2); lcdxianshi16x16(nei,4,18); lcdxianshi16x16(wen,4,34); lcdxianshi16x16(du,4,50); lcdxianshi16x16(maohao,4,66); lcdxianshi16x16(sheshidu,4,114); while(1) { ds18b20sjcl(); }}voidds18b20sjcl(void){ ucharshuzidi8,shuzigao8; uintshuzi16; floatmonif; uintmoniint;

ds18b20chushihua(); //18B20初始化 ds18b20xie(0xcc); //跳過(guò)ROM,指令碼0XCC ds18b20xie(0x44); //啟動(dòng)18B20溫度轉(zhuǎn)換,指令碼0X44 ds18b20chushihua(); ds18b20xie(0xcc); ds18b20xie(0xbe); //讀高速緩存RAM,指令碼0XBE shuzidi8=ds18b20du(); //讀數(shù)字量的低8位 shuzigao8=ds18b20du(); //讀數(shù)字量的高8位 shuzi16=shuzigao8<<8|shuzidi8; //合成16位數(shù)字量 monif=shuzi16*0.0625; //16位數(shù)字量轉(zhuǎn)換為實(shí)際溫度值 moniint=(uint)(monif*10+0.5); //浮點(diǎn)型實(shí)際溫度變?yōu)檎?,保?位小數(shù) lcdxianshi16x8(shuzi[moniint/100],4,82); //顯示整型實(shí)際溫度的百位 lcdxianshi16x8(shuzi[moniint/10%10],4,90); //顯示整型實(shí)際溫度的十位 lcdxianshi16x8(xiaoshudian,4,98); //顯示小數(shù)點(diǎn) lcdxianshi16x8(shuzi[moniint%10],4,106); //顯示整型實(shí)際溫度的個(gè)位}uchards18b20du(void){ uchari; ucharzijie=0; for(i=0;i<8;i++) { DQ=0; //拉低總線(xiàn)

zijie=zijie>>1; //為接收DQ至變量zijie的位7作準(zhǔn)備 DQ=1; //拉高總線(xiàn) if(DQ)zijie=zijie|0x80; //DQ為1時(shí),存至zijie的位7 delayus(5); } return(zijie);}voidds18b20xie(ucharzijie){ uchari; for(i=0;i<8;i++) { DQ=0; //拉低總線(xiàn) if(zijie&0x01) DQ=1;

//取出形參zijie的位0并送至DQ

else DQ=0; delayus(5); DQ=1; //拉高總線(xiàn) zijie=zijie>>1; //變量zijie右移一位,為了下一次取出位0作準(zhǔn)備 }}voidds18b20chushihua(void){ DQ=1;delayus(8); DQ=0;delayus(80); DQ=1;delayus(14);}voiddelayus(uinta){ while(a--);}voidlcdxianshi16x8(uchartab[],ucharqiye,ucharqilie){ uchari,j; for(i=0;i<2;i++) { for(j=0;j<8;j++) { lcdshezhiyelie(i+qiye,j+qilie); lcdxiezimo(tab[i*8+j]); } }}voidlcdxianshi16x16(uchartab[],ucharqiye,ucharqilie){ uchari,j; for(i=0;i<2;i++) { for(j=0;j<16;j++) { lcdshezhiyelie(i+qiye,j+qilie);

溫馨提示

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

評(píng)論

0/150

提交評(píng)論