版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 單片機(jī)課程設(shè)計(jì)報(bào)告</b></p><p> 基于單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì) </p><p><b> 1 緒論</b></p><p><b> 2 方案設(shè)計(jì)</b></p><p><b> 3 系統(tǒng)的硬件設(shè)計(jì)</b&g
2、t;</p><p><b> 3.1 主控制器</b></p><p><b> 3.2 顯示電路</b></p><p> 3.3 溫度傳感器工作原理</p><p> 3.4 溫度傳感器接口電路</p><p><b> 4 系統(tǒng)的軟件設(shè)計(jì)</
3、b></p><p><b> 4.1 主程序</b></p><p><b> 4.2 溫度測量</b></p><p> 4.2.1 初始化DS18B20</p><p> 4.2.2 等待應(yīng)答信號</p><p> 4.2.3 DS18B20讀字節(jié)<
4、;/p><p> 4.2.4 DS18B20寫字節(jié)</p><p> 4.2.5 啟動溫度測量</p><p> 4.2.6 讀取測量結(jié)果</p><p> 4.2.7各算法流程圖</p><p><b> 4.3 數(shù)碼管顯示</b></p><p> 5 系統(tǒng)的測
5、試與總結(jié)</p><p><b> 參考文獻(xiàn)</b></p><p><b> 附錄1 原理圖</b></p><p> 附錄2 源程序清單</p><p><b> 1 緒 論</b></p><p> 隨著人們生活水平的不斷提高,單
6、片機(jī)控制無疑是人們追求的目標(biāo)之一,它所給人帶來的方便也是不可否定的,其中數(shù)字溫度計(jì)就是一個(gè)典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活提供更好的更方便的設(shè)施就需要從單片機(jī)技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。 現(xiàn)代社會對各種信息參數(shù)的準(zhǔn)確度和精確度的要求都有了幾何級的增長,而如何準(zhǔn)確而又迅速的獲得這些參數(shù)就需要受制于現(xiàn)代信息基礎(chǔ)的發(fā)展水平。在三大信息信息采集(即傳感器技術(shù))、信息
7、傳輸(通信技術(shù))和信息處理(計(jì)算機(jī)技術(shù))中,傳感器屬于信息技術(shù)的前沿尖端產(chǎn)品,尤其是溫度傳感器技術(shù),在我國各領(lǐng)域已經(jīng)引用的非常廣泛,可以說是滲透到社會的每一個(gè)領(lǐng)域,人民的生活與環(huán)境的溫度息息相關(guān),在工業(yè)生產(chǎn)過程中需要實(shí)時(shí)測量溫度,在農(nóng)業(yè)生產(chǎn)中也離不開溫度的測量,因此研究溫度的測量方法和裝置具有重要的意義。</p><p> 測量溫度的關(guān)鍵是溫度傳感器,溫度傳感器的發(fā)展經(jīng)歷了三個(gè)發(fā)展階段:</p>
8、<p> ①傳統(tǒng)的分立式溫度傳感器</p><p> ?、谀M集成溫度傳感器</p><p> ?、壑悄芗蓽囟葌鞲衅?。</p><p> 目前的智能溫度傳感器(亦稱數(shù)字溫度傳感器)是在20世紀(jì)90年代中期問世的,它是微電子技術(shù)、計(jì)算機(jī)技術(shù)和自動測試技術(shù)(ATE)的結(jié)晶,特點(diǎn)是能輸出溫度數(shù)據(jù)及相關(guān)的溫度控制量,適配各種微控制器(MCU)。社會的發(fā)展使人
9、們對傳感器的要求也越來越高,現(xiàn)在的溫度傳感器正在基于單片機(jī)的基礎(chǔ)上從模擬式向數(shù)字式,從集成化向智能化、網(wǎng)絡(luò)化的方向飛速發(fā)展,并朝著高精度、多功能、總線標(biāo)準(zhǔn)化、高可靠性及安全性、開發(fā)虛擬傳感器和網(wǎng)絡(luò)傳感器、研制單片測溫系統(tǒng)等高科技的方向迅速發(fā)展,本文將介紹智能集成溫度傳感器DS18B20的結(jié)構(gòu)特征及控制方法,并對以此傳感器,89S51單片機(jī)為控制器構(gòu)成的數(shù)字溫度測量裝置的工作原理及程序設(shè)計(jì)作了詳細(xì)的介紹。與傳統(tǒng)的溫度計(jì)相比,其具有讀數(shù)方便
10、,測溫范圍廣,測溫準(zhǔn)確,輸出溫度采用數(shù)字顯示,主要用于對測溫要求比較準(zhǔn)確的場所,或科研實(shí)驗(yàn)室使用。該設(shè)計(jì)控制器使用ATMEL公司的AT89S52單片機(jī),測溫傳感器使用DALLAS公司DS18B20,用數(shù)碼管來實(shí)現(xiàn)溫度顯示。</p><p><b> 2方案設(shè)計(jì)</b></p><p> 本設(shè)計(jì)主要是介紹了單片機(jī)控制下的溫度檢測系統(tǒng),詳細(xì)介紹了其硬件和軟件設(shè)計(jì),并對
11、其各功能模塊做了詳細(xì)介紹,其主要功能和指標(biāo)如下:</p><p> ●利用溫度傳感器(DS18B20)測量某一點(diǎn)環(huán)境溫度</p><p> ●測量范圍為-55℃~+125℃,精度為±0.5℃</p><p> ●用數(shù)碼管進(jìn)行實(shí)際溫度值顯示</p><p> 采用AT89S52單片機(jī)P3 .5口控制溫度傳感器DS18B20的溫
12、度測量,以四位數(shù)碼感形式輸出測量溫度,原理圖如下圖1.1所示:</p><p> 圖2.1 DS18B20與單片機(jī)接口原理</p><p> 圖2.2 總體設(shè)計(jì)方框圖</p><p><b> 3 系統(tǒng)的硬件設(shè)計(jì)</b></p><p><b> 3.1 主控制器</b></p>
13、;<p> AT89S52 是一種低功耗、高性能CMOS8位微控制器,具有8K在系統(tǒng)可編程Flash 存儲器。使用Atmel 公司高密度非 易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完 全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng) 可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提 供高靈活、超有效的解決方案。AT89S52具有以
14、下標(biāo)準(zhǔn)功能: </p><p> 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè)16 位 定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級中斷結(jié)構(gòu),全雙工串行口, 片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工 作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩
15、器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。8 位微控制器 8K 字節(jié)在系統(tǒng)可編程 Flash AT89S52</p><p> 圖3.1 時(shí)鐘電路與復(fù)位電路</p><p><b> 3.2顯示電路</b></p><p> 顯示采用4位數(shù)碼管,圖3.2.1為數(shù)碼管段驅(qū)動,圖3.2.2為數(shù)碼管位驅(qū)動,圖3.2.3為溫度顯
16、示電路</p><p> 圖3.2.1數(shù)碼管段驅(qū)動</p><p> 圖3.2.2數(shù)碼管位驅(qū)動</p><p> 圖3.2.3溫度顯示電路</p><p> 3.3 溫度傳感器工作原理</p><p> DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等
17、測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。DS18B20的性能特點(diǎn)如下:</p><p> ? 獨(dú)特的單線接口僅需一個(gè)端口引腳進(jìn)行通訊</p><p> ? 簡單的多點(diǎn)分布應(yīng)用</p><p><b> ? 無需外部器件</b></p><p> ? 可通
18、過數(shù)據(jù)線供電</p><p><b> ? 零待機(jī)功耗</b></p><p> ? 測溫范圍-55~+125℃,以0.5℃遞增。華氏器件-67~+2570F,以0.90F 遞增</p><p> ? 溫度以9 位數(shù)字量讀出</p><p> ? 溫度數(shù)字量轉(zhuǎn)換時(shí)間200ms(典型值)</p>&l
19、t;p> ? 用戶可定義的非易失性溫度報(bào)警設(shè)置</p><p> ? 報(bào)警搜索命令識別并標(biāo)志超過程序限定溫度(溫度報(bào)警條件)的器件</p><p> DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。DS18B20的管腳排列、各種封裝形式如圖 3.3.1所示,DQ 為數(shù)據(jù)輸入/輸出引腳。開漏單總線接口引腳。當(dāng)被用
20、著在寄生電源下,也可以向器件提供電源;GND為地信號;VDD為可選擇的VDD引腳。當(dāng)工作于寄生電源時(shí),此引腳必須接地。其電路圖 3.3.2所示.。 </p><p> 圖 3.3.1外部封裝形式 圖3.3.2傳感器電路圖</p><p> DS18B20的測溫原理如圖3.3.3所示,圖
21、中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小用于產(chǎn)生固定頻率的脈沖信號送給減法計(jì)數(shù)器1,高溫度系數(shù)晶振隨溫度變化其震蕩頻率明顯改變,所產(chǎn)生的信號作為減法計(jì)數(shù)器2的脈沖輸入,圖中還隱含著計(jì)數(shù)門,當(dāng)計(jì)數(shù)門打開時(shí),DS18B20就對低溫度系數(shù)振蕩器產(chǎn)生的時(shí)鐘脈沖后進(jìn)行計(jì)數(shù),進(jìn)而完成溫度測量.計(jì)數(shù)門的開啟時(shí)間由高溫度系數(shù)振蕩器來決定,每次測量前,首先將-55 ℃所對應(yīng)的基數(shù)分別置入減法計(jì)數(shù)器1和溫度寄存器中,減法計(jì)數(shù)器1和溫度寄存器被預(yù)置在-55
22、 ℃所對應(yīng)的一個(gè)基數(shù)值。</p><p> 減法計(jì)數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行減法計(jì)數(shù),當(dāng)減法計(jì)數(shù)器1的預(yù)置值減到0時(shí)溫度寄存器的值將加1,減法計(jì)數(shù)器 1的預(yù)置將重新被裝入,減法計(jì)數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行計(jì)數(shù),如此循環(huán)直到減法計(jì)數(shù)器2計(jì)數(shù)到0時(shí),停止溫度寄存器值的累加,此時(shí)溫度寄存器中的數(shù)值即為所測溫圖2中的斜率累加器用于補(bǔ)償和修正測溫過程中的非線性其輸出用,于修正減法計(jì)數(shù)器
23、的預(yù)置值,只要計(jì)數(shù)門仍未關(guān)閉就重復(fù)上述過程,直至溫度寄存器值達(dá)到被測溫度值,這就是DS18B20的測溫原理。</p><p> 另外,由于DS18B20單線通信功能是分時(shí)完成的,他有嚴(yán)格的時(shí)隙概念,因此讀寫時(shí)序很重要。系統(tǒng)對DS18B20的各種操作必須按協(xié)議進(jìn)行。操作協(xié)議為:初始化DS18B20(發(fā)復(fù)位脈沖)→發(fā)ROM功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù)。</p><p> 圖3.3.
24、3 DS18B20測溫原理圖</p><p> 在正常測溫情況下,DS1820的測溫分辨力為0.5℃,可采用下述方法獲得高分辨率的溫度測量結(jié)果:首先用DS1820提供的讀暫存器指令(BEH)讀出以0.5℃為分辨率的溫度測量結(jié)果,然后切去測量結(jié)果中的最低有效位(LSB),得到所測實(shí)際溫度的整數(shù)部分Tz,然后再用BEH指令取計(jì)數(shù)器1的計(jì)數(shù)剩余值Cs和每度計(jì)數(shù)值CD??紤]到DS1820測量溫度的整數(shù)部分以0.25℃、
25、0.75℃為進(jìn)位界限的關(guān)系,實(shí)際溫度Ts可用下式計(jì)算:</p><p> 3.4 溫度傳感器接口電路</p><p> 圖3.4.1溫度傳感器接口電路</p><p><b> 4 系統(tǒng)的軟件設(shè)計(jì)</b></p><p><b> 4.1 主程序</b></p><p&g
26、t; /*------------------ 主函數(shù) --------------------*/</p><p> void main()</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b>
27、;</p><p> Convert(); //調(diào)用啟動溫度轉(zhuǎn)換函數(shù)</p><p> RdTemp(); //調(diào)用讀取溫度值函數(shù)</p><p><b> }</b></p><p><b> }</b></p><p><b> 4.2 溫度測
28、量</b></p><p> 4.2.1 初始化DS18B20</p><p> /*--------------- 初始化DS18B20 ----------------*/</p><p> void TxReset()</p><p><b> { </b></p><p
29、><b> uint i;</b></p><p> DQ=0;//發(fā)送復(fù)位脈沖</p><p><b> i=100;</b></p><p> while(i>0) i--; //拉低900us </p><p> DQ=1; //釋放總線</p>&
30、lt;p><b> i=4;</b></p><p> while(i>0) i--;</p><p><b> }</b></p><p> 4.2.2 等待應(yīng)答信號</p><p> /*-------------- 等待DS18B20應(yīng)答 ---------------*
31、/</p><p> void RxWait()</p><p><b> { </b></p><p><b> uint i;</b></p><p> while(DQ); //等待15-60us</p><p> while(~DQ); //DS18
32、B20發(fā)出存在脈沖60-240us</p><p><b> i=4;</b></p><p> while(i>0) i--;</p><p><b> }</b></p><p> 4.2.3 DS18B20讀字節(jié)</p><p> /*---------
33、------- 讀取一位數(shù)據(jù) ----------------*/</p><p> bit RdBit()</p><p><b> {</b></p><p><b> uchar i;</b></p><p><b> bit b;</b></p>
34、<p> DQ = 0; //讀開始1us</p><p><b> i++;</b></p><p> DQ = 1; //產(chǎn)生讀時(shí)間隙15us</p><p><b> i++;</b></p><p><b> i++;</b></p&g
35、t;<p> b = DQ; //讀位</p><p><b> i = 8;</b></p><p> while(i>0) i--; //等待60us</p><p> DQ = 1; //釋放總線</p><p><b> return b;</b><
36、/p><p><b> }</b></p><p> /*---------------- 讀取字節(jié)數(shù)據(jù) ----------------*/</p><p> uchar RdByte()</p><p><b> {</b></p><p> uchar i,j,d
37、;</p><p><b> d=0;</b></p><p> for(i=0;i<8;i++) //各位由低向高讀出DS18B20</p><p><b> {</b></p><p> j=RdBit();</p><p> d=(j<<7
38、)|(d>>1);</p><p><b> }</b></p><p><b> return d;</b></p><p><b> }</b></p><p> 4.2.4 DS18B20寫字節(jié)</p><p> /*----
39、------------ 寫入字節(jié)數(shù)據(jù) ----------------*/</p><p> void WrByte(uchar d)</p><p><b> {</b></p><p><b> uint i;</b></p><p><b> uchar j;</b&
40、gt;</p><p><b> bit btmp;</b></p><p> for(j=0;j<8;j++) //各位由低向高寫入DS18B20</p><p><b> {</b></p><p> btmp=d&0x01;</p><p>&l
41、t;b> d=d>>1;</b></p><p> if(btmp) //寫1</p><p><b> {</b></p><p> DQ=0; //延時(shí)15us</p><p><b> i++;</b></p><p><
42、b> i++;</b></p><p> DQ=1; //寫1時(shí)隙不低于60u</p><p><b> i=8;</b></p><p> while(i>0) i--;</p><p><b> }</b></p><p> els
43、e //寫0</p><p><b> {</b></p><p><b> DQ=0;</b></p><p><b> i=8;</b></p><p> while(i>0) i--; //保持低電平60us到120us</p><p
44、> DQ=1; //釋放總線</p><p><b> i++;</b></p><p><b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p>&l
45、t;b> }</b></p><p> 4.2.5 啟動溫度測量</p><p> /*---------------- 啟動溫度測量----------------*/</p><p> void Convert()</p><p><b> {</b></p><p&g
46、t;<b> uint i;</b></p><p> Delay(125); //延時(shí)1ms</p><p> TxReset(); //初始化DS18B20</p><p> RxWait(); //等待DS18B20答應(yīng)</p><p> Delay(125); //延時(shí)&l
47、t;/p><p> WrByte(0xcc); //跳過ROM命令</p><p> WrByte(0x44); //溫度轉(zhuǎn)換命令</p><p> for(i=0;i<250;i++) //延時(shí)1s</p><p> Display();</p><p><b> }</b>&
48、lt;/p><p> 4.2.6 讀取測量結(jié)果</p><p> /*----------------- 讀取溫度值 -----------------*/</p><p> void RdTemp(void)</p><p><b> {</b></p><p> short int te
49、mp;</p><p><b> uint x;</b></p><p> bit flag = 1;</p><p> TxReset(); //初始化DS18B20</p><p> RxWait(); //等待DS18B20應(yīng)答</p><p> Delay(12
50、5); //延時(shí)</p><p> WrByte(0xcc); //跳過ROM命令</p><p> WrByte(0xbe); //讀暫存存儲器命令</p><p> templow = RdByte(); //溫度值低字節(jié),低4位為小數(shù)</p><p> temphigh = RdByte(); //溫度值高字節(jié)&
51、lt;/p><p> temp = (temphigh << 8) | templow; //溫度為16位補(bǔ)碼</p><p> if(temp<0) //負(fù)溫度</p><p><b> {</b></p><p><b> flag = 0;</b></p>
52、<p> temp = ~temp + 1;</p><p><b> }</b></p><p> tempzheng = temp >> 4; //溫度值整數(shù) </p><p> x = temp & 0x000f; </p><p> tempxiao = (x*
53、10)/16; //溫度值小數(shù)</p><p> if(flag) //正溫度</p><p> disp[0] = tempzheng/100; //百位</p><p> else //負(fù)溫度</p><p> disp[0] = 16; //負(fù)號</p><p> disp
54、[1] = (tempzheng%100)/10; //十位</p><p> disp[2] = tempzheng%10; //個(gè)位</p><p> disp[3] = tempxiao; //小數(shù) </p><p><b> }</b></p><p> 4.2.7各算法
55、流程圖</p><p> 圖 4.2.7.1DS18B20初始化流程圖 圖4.2.7.2主程序流程圖</p><p> 圖4.2.7.3 溫度轉(zhuǎn)換流程圖</p><p> 圖4.2.7.4 計(jì)算溫度流程圖</p><p> 圖4.2.7.5 顯示數(shù)據(jù)刷新流程圖</p><p><b
56、> 4.3 數(shù)碼管顯示</b></p><p> /*---------------- 數(shù)碼管顯示 -----------------*/</p><p> void Display()</p><p><b> {</b></p><p> uchar i,j;</p><
57、;p><b> j=0x08;</b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> P1=j; //數(shù)碼管位碼輸出</p><p> LOCK=1; //打開鎖存</p><p>
58、 if(i==2) P0=led[disp[i]]|0x01; //顯示小數(shù)點(diǎn)</p><p> else P0=led[disp[i]]; //數(shù)碼管段碼輸出</p><p> LOCK=0; //關(guān)閉鎖存</p><p> j=j>>1; //調(diào)整位碼 </p><p> Delay(125);
59、</p><p> P0=0x00;</p><p><b> }</b></p><p><b> }</b></p><p> 5 系統(tǒng)的測試與總結(jié)</p><p> 5.1 測試時(shí)的圖片</p><p> 圖5.1.1溫度傳感器
60、 </p><p> 圖5.1.2測試時(shí)室內(nèi)溫度顯示</p><p> 圖5.1.3測試時(shí)手握住傳感器時(shí)的溫度顯示</p><p><b> 5.2總結(jié)</b></p><p> 通過近兩個(gè)星期的單片機(jī)課程設(shè)計(jì),我終于完成了“基于單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì)”,心中不免有些高興,但高興之余也有我值得深思的。</p
61、><p> 雖然以前做過類似的實(shí)驗(yàn),但這次的課程設(shè)計(jì)還是讓我學(xué)到了很多東西,單片機(jī)課程設(shè)計(jì)重點(diǎn)就在于軟件算法的設(shè)計(jì),需要有很巧妙的程序算法。有好多的東西,只有我們?nèi)ピ囍隽?,才能真正的掌握,只學(xué)習(xí)理論有些東西是很難理解的,更談不上掌握。通過這次的單片機(jī)課程設(shè)計(jì)我認(rèn)識到了,學(xué)習(xí)要理論聯(lián)系實(shí)際,把學(xué)到的理論知識同實(shí)際運(yùn)用相結(jié)合,才能是我們的知識融匯貫通,才能真正的學(xué)到知識,真正的做到學(xué)以致用。</p>&
62、lt;p><b> 附錄1 原理圖</b></p><p> 附錄2 源程序清單</p><p> #include <reg52.h></p><p> #define ulong unsigned long</p><p> #define uint unsigned int</
63、p><p> #define uchar unsigned char</p><p> uchar code led[]={ 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,</p><p> 0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x02,0x00 }; //數(shù)碼管碼表</p>
64、<p> uchar disp[4]={1,2,3,4}; //數(shù)碼管顯示緩沖區(qū)</p><p> //數(shù)碼管位選P1低四位,段選P0</p><p> sbit LOCK=P1^4; //74573鎖存端</p><p> sbit DQ=P3^5; //DS18B20數(shù)據(jù)端</p><p> uchar
65、templow; //溫度值低字節(jié)</p><p> uchar temphigh; //溫度值高字節(jié)</p><p> char tempzheng; //溫度值整數(shù)</p><p> char tempxiao; //溫度值小數(shù)</p><p> void Delay(uint x);</p><p&
66、gt; void Display();</p><p> void TxReset();</p><p> void RxWait();</p><p> bit RdBit();</p><p> uchar RdByte();</p><p> void WrBit(bit b);</p>
67、<p> void WrByte(uchar d);</p><p> void Convert();</p><p> void RdTemp();</p><p> sbit ACC0 = ACC^0;</p><p> sbit ACC7 = ACC^7;</p><p> /*-----
68、------------- 主函數(shù) --------------------*/</p><p> void main()</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p>
69、<p> Convert(); //調(diào)用啟動溫度轉(zhuǎn)換函數(shù)</p><p> RdTemp(); //調(diào)用讀取溫度值函數(shù)</p><p><b> }</b></p><p><b> }</b></p><p> /*--------------- 初始化DS18B2
70、0 ----------------*/</p><p> void TxReset()</p><p><b> { </b></p><p><b> uint i;</b></p><p> DQ=0;//發(fā)送復(fù)位脈沖</p><p><b>
71、 i=100;</b></p><p> while(i>0) i--; //拉低900us </p><p> DQ=1; //釋放總線</p><p><b> i=4;</b></p><p> while(i>0) i--;</p><p><b
72、> }</b></p><p> /*-------------- 等待DS18B20應(yīng)答 ---------------*/</p><p> void RxWait()</p><p><b> { </b></p><p><b> uint i;</b><
73、;/p><p> while(DQ); //等待15-60us</p><p> while(~DQ); //DS18B20發(fā)出存在脈沖60-240us</p><p><b> i=4;</b></p><p> while(i>0) i--;</p><p><b>
74、 }</b></p><p> /*---------------- 讀取一位數(shù)據(jù) ----------------*/</p><p> bit RdBit()</p><p><b> {</b></p><p><b> uchar i;</b></p>&l
75、t;p><b> bit b;</b></p><p> DQ = 0; //讀開始1us</p><p><b> i++;</b></p><p> DQ = 1; //產(chǎn)生讀時(shí)間隙15us</p><p><b> i++;</b></p&g
76、t;<p><b> i++;</b></p><p> b = DQ; //讀位</p><p><b> i = 8;</b></p><p> while(i>0) i--; //等待60us</p><p> DQ = 1; //釋放總線</p>
77、;<p><b> return b;</b></p><p><b> }</b></p><p> /*---------------- 讀取字節(jié)數(shù)據(jù) ----------------*/</p><p> uchar RdByte()</p><p><b>
78、 {</b></p><p> uchar i,j,d;</p><p><b> d=0;</b></p><p> for(i=0;i<8;i++) //各位由低向高讀出DS18B20</p><p><b> {</b></p><p>
79、j=RdBit();</p><p> d=(j<<7)|(d>>1);</p><p><b> }</b></p><p><b> return d;</b></p><p><b> }</b></p><p>
80、 /*---------------- 寫入字節(jié)數(shù)據(jù) ----------------*/</p><p> void WrByte(uchar d)</p><p><b> {</b></p><p><b> uint i;</b></p><p><b> uchar j;
81、</b></p><p><b> bit btmp;</b></p><p> for(j=0;j<8;j++) //各位由低向高寫入DS18B20</p><p><b> {</b></p><p> btmp=d&0x01;</p><
82、p><b> d=d>>1;</b></p><p> if(btmp) //寫1</p><p><b> {</b></p><p> DQ=0; //延時(shí)15us</p><p><b> i++;</b></p><p&
83、gt;<b> i++;</b></p><p> DQ=1; //寫1時(shí)隙不低于60u</p><p><b> i=8;</b></p><p> while(i>0) i--;</p><p><b> }</b></p><p&g
84、t; else //寫0</p><p><b> {</b></p><p><b> DQ=0;</b></p><p><b> i=8;</b></p><p> while(i>0) i--; //保持低電平60us到120us</p>
85、<p> DQ=1; //釋放總線</p><p><b> i++;</b></p><p><b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><
86、p><b> }</b></p><p> /*---------------- 啟動溫度轉(zhuǎn)換 ----------------*/</p><p> void Convert()</p><p><b> {</b></p><p><b> uint i;</b&
87、gt;</p><p> Delay(125); //延時(shí)1ms</p><p> TxReset(); //初始化DS18B20</p><p> RxWait(); //等待DS18B20應(yīng)答</p><p> Delay(125); //延時(shí)</p><p> WrByte
88、(0xcc); //跳過ROM命令</p><p> WrByte(0x44); //溫度轉(zhuǎn)換命令</p><p> for(i=0;i<250;i++) //延時(shí)1s</p><p> Display();</p><p><b> }</b></p><p> /*---
89、-------------- 讀取溫度值 -----------------*/</p><p> void RdTemp(void)</p><p><b> {</b></p><p> short int temp;</p><p><b> uint x;</b></p>
90、<p> bit flag = 1;</p><p> TxReset(); //初始化DS18B20</p><p> RxWait(); //等待DS18B20應(yīng)答</p><p> Delay(125); //延時(shí)</p><p> WrByte(0xcc); //跳過ROM命令<
91、/p><p> WrByte(0xbe); //讀暫存存儲器命令</p><p> templow = RdByte(); //溫度值低字節(jié),低4位為小數(shù)</p><p> temphigh = RdByte(); //溫度值高字節(jié)</p><p> temp = (temphigh << 8) | templow;
92、 //溫度為16位補(bǔ)碼</p><p> if(temp<0) //負(fù)溫度</p><p><b> {</b></p><p><b> flag = 0;</b></p><p> temp = ~temp + 1;</p><p><b>
93、}</b></p><p> tempzheng = temp >> 4; //溫度值整數(shù) </p><p> x = temp & 0x000f; </p><p> tempxiao = (x*10)/16; //溫度值小數(shù)</p><p> if(flag) //正溫度&l
94、t;/p><p> disp[0] = tempzheng/100; //百位</p><p> else //負(fù)溫度</p><p> disp[0] = 16; //負(fù)號</p><p> disp[1] = (tempzheng%100)/10; //十位</p><p> disp[2]
95、= tempzheng%10; //個(gè)位</p><p> disp[3] = tempxiao; //小數(shù) </p><p><b> }</b></p><p> /*-------------------- 延時(shí) -------------------*/</p><p>
96、void Delay(uint x)</p><p><b> {</b></p><p><b> uint i;</b></p><p> for(i=x;i>0;i--);</p><p><b> }</b></p><p> /
97、*---------------- 數(shù)碼管顯示 -----------------*/</p><p> void Display()</p><p><b> {</b></p><p> uchar i,j;</p><p><b> j=0x08;</b></p><
98、;p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> P1=j; //數(shù)碼管位碼輸出</p><p> LOCK=1; //打開鎖存</p><p> if(i==2) P0=led[disp[i]]|0x01; //顯示小數(shù)點(diǎn)</p&g
99、t;<p> else P0=led[disp[i]]; //數(shù)碼管段碼輸出</p><p> LOCK=0; //關(guān)閉鎖存</p><p> j=j>>1; //調(diào)整位碼 </p><p> Delay(125);</p><p> P0=0x00;</p><
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)-- 基于單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--基于單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)數(shù)字顯示溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于單片機(jī)的數(shù)字溫度計(jì)的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)控制的數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)數(shù)字溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)——數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 基于單片機(jī)數(shù)字溫度計(jì)課程設(shè)計(jì)
評論
0/150
提交評論