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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

·掌握DS18B20的特點、引腳、命令。

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

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

·會看DS18B20的時序圖。

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

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

·認識DS18B20并識別其引腳。

·正確畫出硬件電路圖。

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

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

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

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

5.1

溫度測試概述

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

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

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

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

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

5.2

DS18B20特點

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

5.3

硬件設(shè)計

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

5.4

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

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

5.5

DS18B20高速緩存RAM

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

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

=-0x0191×0.0625

=-401×0.0625

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

函數(shù)名:xianshi()作用:在12864上顯示98.7,顯示位置自定。入口參數(shù):無出口參數(shù):無說明:函數(shù)中用到的字模及函數(shù)聲明如下:ucharcodedian[16]; //存放小數(shù)點的字模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】有二個數(shù),0x8d和0x2。編寫函數(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ù):無出口參數(shù):無*/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)解釋下面的語句,并寫出執(zhí)行結(jié)果。unsignedinta;floatb=26.97;a=(unsignedint)(b);(2)解釋【例5-11】中各變量的作用。5.4配置寄存器配置寄存器字節(jié)中各位的含義如表5-5所示?!の?~位0一直都是“1”;·位7:TM是測試模式位,用于設(shè)置DS18B20是工作模式還是測試模式。在DS18B20出廠時,TM位被設(shè)置為0,用戶不要去改動?!の?和位5:R1和R0用來設(shè)置DS18B20分辨率,如表5-6所示。DS18B20在出廠時,分辨率被設(shè)置為12位。

5.6

DS18B20命令

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

5.7

DS18B20時序圖及函數(shù)

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

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

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

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

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

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

}

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

5.8

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

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

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

ucharshuzidi8,shuzigao8;

uintshuzi16; floatmonif; uintmoniint; ds18b20chushihua(); //18B20初始化 ds18b20xie(0xcc); //跳過ROM,指令碼0XCC ds18b20xie(0x44); //啟動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)換為實際溫度值

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

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

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

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

5.9

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

數(shù)字溫度計源程序如下:/*預(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); //跳過ROM,指令碼0XCC ds18b20xie(0x44); //啟動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)換為實際溫度值 moniint=(uint)(monif*10+0.5); //浮點型實際溫度變?yōu)檎?,保?位小數(shù) lcdxianshi16x8(shuzi[moniint/100],4,82); //顯示整型實際溫度的百位 lcdxianshi16x8(shuzi[moniint/10%10],4,90); //顯示整型實際溫度的十位 lcdxianshi16x8(xiaoshudian,4,98); //顯示小數(shù)點 lcdxianshi16x8(shuzi[moniint%10],4,106); //顯示整型實際溫度的個位}uchards18b20du(void){ uchari; ucharzijie=0; for(i=0;i<8;i++) { DQ=0; //拉低總線

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

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

else DQ=0; delayus(5); DQ=1; //拉高總線 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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論