版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 畢業(yè)設(shè)計(論文)</b></p><p> 基于51單片機的家用電熱水器設(shè)計</p><p> Design of Household Electric Water Heater Based on the 51-series singlechip</p><p><b> 摘 要</b&
2、gt;</p><p> 隨著社會的發(fā)展,人類科技的進步,各行各業(yè)都在使自己的產(chǎn)品智能化、數(shù)字化,因老式的熱水器使用煤氣或天然氣對水進行燃燒加熱,用手動的方式調(diào)節(jié)溫度,不僅不能夠精確的確定使用者需要的水溫,而且還存在一定的危險性。</p><p> 電熱水器是一種可供浴室、洗手間及廚房使用的家用電器,隨著人們生活質(zhì)量的提高,現(xiàn)代的家用電熱水器已經(jīng)摒棄了以前的做法,而采用一種更加精確、安
3、全的實施方案。</p><p> C語言對單片機編程有諸多優(yōu)點,例如:便于移植、句法檢查時錯誤少、堅固性好、頭文件種類諸多,能夠方便快捷使用各種函數(shù)等。</p><p> 本文采用 AT 89C 52 單片機作為控制器,使用C語言編寫程序,設(shè)計了一款智能家用電熱水器。使用陣型鍵盤輸入溫度,溫度可以精確到0.1攝氏度,并使用LED燈顯示,能夠精確提供用戶所需溫度的溫水。采用DS18B20
4、采集溫度,使用LED燈顯示,精確的顯示出采集的水溫。當(dāng)所需溫度高于當(dāng)前采集的水溫時,使用MOC3041芯片觸發(fā)加熱,當(dāng)所需溫度低于當(dāng)前采集的水溫時,則停止加熱?;緦崿F(xiàn)了智能控制功能。</p><p> 關(guān)鍵詞:單片機;C語言;采集;智能;家用電熱水器 </p><p><b> 目 錄</b></p><p><b> 第
5、1章 緒論1</b></p><p> 1.1 家用電熱水器的現(xiàn)狀1</p><p> 1.2 TX-1C單片機實驗開發(fā)板簡介1</p><p> 第2章 系統(tǒng)硬件設(shè)計2</p><p> 2.1 系統(tǒng)硬件的組成部分2</p><p> 2.2 系統(tǒng)硬件各部分的簡介2</p>
6、;<p> 2.3 數(shù)碼管顯示3</p><p> 2.3.1 數(shù)碼管簡介3</p><p> 2.3.2 數(shù)碼管的實現(xiàn)方法4</p><p> 2.3.3 鎖存器與數(shù)碼管顯示方法6</p><p> 2.4 鍵盤輸入設(shè)計7</p><p> 2.4.1 鍵盤輸入方法7</p
7、><p> 2.4.2 鍵盤輸入的抖動與去抖的方法8</p><p> 2.5 DS18B20溫度采集9</p><p> 2.5.1 DS18B20技術(shù)性能與應(yīng)用范圍9</p><p> 2.5.2 DS18B20的初始化與讀寫操作10</p><p> 2.5.3 DS18B20的指令與格式12&l
8、t;/p><p> 2.5.4 DS18B20寄生電源供電方式15</p><p> 2.5.5 DS18B20改進的寄生電源供電方式16</p><p> 2.5.6 DS18B20外部電源供電方式17</p><p> 2.5.7 DS18B20寄生電源供電方式18</p><p> 第3章 系統(tǒng)軟件
9、設(shè)計20</p><p> 3.1 鍵盤輸入的程序20</p><p> 3.2 DS18B20溫度傳感器設(shè)計21</p><p> 3.3 主函數(shù)的分析25</p><p> 3.4 顯示函數(shù)的分析26</p><p> 3.5 中斷加熱子函數(shù)的分析33</p><p>
10、 第4章 功能簡介與成品圖片35</p><p> 4.1 智能熱水器具的功能35</p><p> 4.2 成品圖片35</p><p> 第5章 總結(jié)與展望38</p><p><b> 附錄 程序41</b></p><p><b> 第1章 緒論</b
11、></p><p> 單片機是一種與我們生活息息相關(guān)的控制器,它存在于許多地方,例如:電子手表、掌上游戲機、數(shù)碼相機、錄音筆、電視機遙控器等等。單片機主要由中央處理器、內(nèi)存、輸入/輸出設(shè)備組成,它就好像是一臺小型電腦,它能夠執(zhí)行人們對它編寫的程序,從而發(fā)出各種不同的控制命令,與外部電路結(jié)合后,便可以完成各種各樣的功能。通過單片機人們的生活將會變得更加方便、快捷。</p><p>
12、 1.1 家用電熱水器的現(xiàn)狀</p><p> 我們的生活電熱水器是一種可供浴室、洗手間及廚房使用,按照人們的需要的溫度,提供溫水的家用電器。市場上傳統(tǒng)的機械式電熱水器控制精度低、可靠性差,甚至存在一定的危險隱患。隨著社會的發(fā)展、人們生活質(zhì)量的提高,人們對電熱水器的要求越來越趨向于智能化和數(shù)字化,這種老式而簡單的電熱水器已經(jīng)不能夠滿足人們的需要了。而智能化家用電熱水器正是適應(yīng)現(xiàn)代化智能家用電器趨勢而出現(xiàn)。它能提
13、供用戶方便快捷的數(shù)字化輸入方式,并且能精確的采集和控制環(huán)境中的水溫,將其提供給用戶,因此備受人們的關(guān)注。</p><p> 1.2 TX-1C單片機實驗開發(fā)板簡介</p><p> XT-1C單片機開發(fā)板是哈爾濱市天祥電子綜合多年開發(fā)經(jīng)驗,在原TX-1B基礎(chǔ)上,經(jīng)過精心設(shè)計開發(fā)出的多功能51單片機開發(fā)平臺。該開發(fā)板集常用的單片機外圍資源、串口和USB口兩種調(diào)試下載接口于一身,完全兼容A
14、TMEL公司的51單片機,除此之外還有很多特點,如:無法解密、低功耗、高速、高可靠、強抗靜電、強抗干擾等。</p><p> TX系列單片機開發(fā)板可完全作為各種51單片機的開發(fā)板,用匯編語言或者C語言對其進行編程。當(dāng)用STC公司的單片機時,直接用產(chǎn)品套件附帶的串口線將開發(fā)板與計算機串口相連,按照STC單片機下載操作教程便可以下載程序,而且下載速度比起其他下載工具要快的多。本文將使用TX-1C開發(fā)板完成數(shù)字化電熱
15、水器的設(shè)計。</p><p> 第2章 系統(tǒng)硬件設(shè)計</p><p> 2.1 系統(tǒng)硬件的組成部分</p><p> 系統(tǒng)設(shè)計硬件原理結(jié)構(gòu)見圖2.1所示。系統(tǒng)以高性價比的AT89C51單片機為核心,由鍵盤輸入、DS18B20溫度采集、數(shù)碼管顯示電路、電源時鐘復(fù)位電路、雙向可控硅驅(qū)動電路MOC3041、雙向可控硅TLC336A組成加熱器控制電路。 </p&
16、gt;<p> 圖2.1 系統(tǒng)設(shè)計硬件原理結(jié)構(gòu)</p><p> 2.2 系統(tǒng)硬件各部分的簡介</p><p> 這里AT89C51為總控制器。單片機的P0口連接74HC573鎖存器,這樣可以節(jié)約單片機端口,即可多次操作P0口,使其既能控制數(shù)碼管的片選,又能控制數(shù)碼管的位選,從而節(jié)省的單片機的外部接口,擴展了功能。</p><p> 鍵盤的輸入
17、由P3口完成在第4章節(jié)中會具體介紹如何實現(xiàn)。</p><p> 時鐘復(fù)位電路見圖2.2所示,RET連接單片機的RESET接口,主要完成單片機的復(fù)位功能。</p><p> 圖2.2 時鐘復(fù)位電路</p><p> 溫度采集芯片由DS18B20芯片完成,DS18B20的2號接口接在單片機的P2^2口,按協(xié)議傳送以兩個字節(jié)為一組的溫度數(shù)據(jù),第3章會介紹具體實現(xiàn)方法
18、。</p><p> 加熱模塊見圖2.3所示,MOC3041芯片的2號接口連接單片機的P2^2口。當(dāng)需要加熱時,P2^2接口送出低電平,即可觸發(fā)加熱器工作。</p><p><b> 圖2.3 加熱模塊</b></p><p><b> 2.3 數(shù)碼管顯示</b></p><p> 2.3.
19、1 數(shù)碼管簡介</p><p> 單片機系統(tǒng)中常用的顯示器有:</p><p> 發(fā)光二極管LED(Light Emitting Diode)顯示器、液晶CD(Liquid Crystal Display)顯示器、CRT顯示器等。LED、LCD顯示器有兩種顯示結(jié)構(gòu):段顯示(7段、米字型等)和點陣顯示(5×8、8×8點陣等)。</p><p>
20、 使用LED顯示器時,要注意區(qū)分這兩種不同的接法。為了顯示數(shù)字或字符,必須對數(shù)字或字符進行編碼。七段數(shù)碼管加上一個小數(shù)點,共計8段。因此為LED顯示器提供的編碼正好是一個字節(jié)。本設(shè)計采用的TX-C1實驗板是采用共陰LED顯示器,根據(jù)電路連接圖顯示十六進制數(shù)的編碼見表2.1所示。</p><p> 表2.1 十六進制數(shù)的編碼</p><p> 2.3.2 數(shù)碼管的實現(xiàn)方法</p&
21、gt;<p> 數(shù)碼管的顯示由P0口完成控制。有兩點需要注意,第一點是要哪一個數(shù)碼管亮,第二點是亮的數(shù)碼管顯示什么數(shù)字。所以數(shù)碼管有位選和段選之分,位選在程序中用wei表示,單片機上是P2^7端口,即對位選操作時使P2^7呈現(xiàn)高電平,這時P0的八個端口對數(shù)碼管的操作決定了那幾個數(shù)碼管亮,P0操作完成后使P2^7呈現(xiàn)低電平,這樣位選就已鎖定。段選在程序中由duan表示,單片機上是P2^6端口,與位選相同,操作時使P2^6呈
22、現(xiàn)高電平,這時P0的八個端口對數(shù)碼管的操作決定了亮的幾個數(shù)碼管顯示什么數(shù)字,P0操作完成后使P2^6呈現(xiàn)低電平,這樣段選就已鎖定。</p><p> 見圖2.4所示由于單片機僅僅起到控制的作用,其輸出電流十分小,所以P0端需要接上拉電阻與5V電源,通過電壓的變化控制5V電源點亮,想要圖中a端由電流通過時,即給P0^0一個低電平,觸發(fā)上拉電阻兩端間的電勢差,這樣就能促使電流流向a點,從而使a端對應(yīng)的LED燈點亮。
23、</p><p> 圖2.4 單片機與數(shù)碼管的硬件連接</p><p> 首先選擇位選,再選擇段選。</p><p> uchar code table[]={</p><p> 0x3f,0x06,0x5b,0x4f,</p><p> 0x66,0x6d,0x7d,0x07,</p><
24、;p> 0x7f,0x6f,0xbf,0x86,</p><p> 0xdb,0xcf,0xe6,0xed,</p><p> 0xfd,0x87,0xff,0xef,</p><p> 0x00,0x08,0x88};</p><p> 可以直接設(shè)置數(shù)碼管顯示各數(shù)字的十六進制,即P0口應(yīng)賦的十六進制,以便操作。如以上數(shù)組,使
25、用時僅僅將需要的數(shù)組中的其中一個賦予P0口,這樣可以方便直觀得使數(shù)碼管顯示需要的數(shù)字。</p><p> 選擇位選與選擇片選的過程相當(dāng)快時,顯示在人眼中就是一排易于識別的十進制數(shù)字,這就是數(shù)碼管的動態(tài)顯示。</p><p> 2.3.3 鎖存器與數(shù)碼管顯示方法</p><p> 在這里先介紹74HC573芯片,這是一個鎖存器芯片,連接方法見圖2.5所示, P2
26、^7、P2^6分別控制位選和段選的L端,例如:當(dāng)P2^7(程序中的全局變量wei)賦高電平時,74HC573輸入端口的值將直接輸送給74HC573芯片的輸出端,當(dāng)輸入端變化時,輸出端也變化。P2^7賦低電平時, 74HC573芯片將記住最近一次L端口是高電平時芯片輸入端的8位,并將其輸出,當(dāng)輸入端變化時,輸出端不變化。在這里就可以利用鎖存器的特性使P2^7起到控制那個數(shù)碼管亮的作用,使P2^6控制數(shù)碼管亮什么樣的數(shù)字作用。</p&
27、gt;<p> 圖2.5 74HC573芯片的連接</p><p> 以下數(shù)碼管顯示部分程序。</p><p><b> P0=0xff;</b></p><p><b> wei=1;</b></p><p> P0=srtemp;//wein打開后 是低電平亮</p
28、><p><b> wei=0;</b></p><p> srtemp=_crol_(srtemp,1);</p><p><b> P0=0x00;</b></p><p><b> duan=1;</b></p><p> P0=table[
29、dis[i]];</p><p><b> duan=0;</b></p><p><b> delay(1);</b></p><p><b> duan=1;</b></p><p><b> P0=0x00;</b></p>&
30、lt;p><b> duan=0;</b></p><p> 要注意的是位選(程序中的wei變量),位選是低電平時選擇該數(shù)碼管亮。</p><p> 在顯示時容易出現(xiàn)不需要亮的LED管微微發(fā)亮的問題,這是因為所選擇的位選和段選都是通過P0賦的值,如果先選擇位選的8位值,P0口不還原成0x00,就會導(dǎo)致段選打開后,還未賦予段選P0口需要的數(shù)值之前,這段時間內(nèi)
31、P0口將剛才位選的8位值賦予了段選鎖存器,這樣就會在極短的時間內(nèi),一些不需要的LED燈點亮,在單片機上就是由LED燈微微亮的情況,所以在這里注意每次P0對位選賦值以前,都應(yīng)該保證P0口為0x00。</p><p> 2.4 鍵盤輸入設(shè)計</p><p> 2.4.1 鍵盤輸入方法</p><p> 本設(shè)計中使用的是矩陣式鍵盤,見圖2.6所示。</p>
32、;<p> 圖2.6 矩陣式鍵盤</p><p> S10到S19分別代表數(shù)字0到9。S20代表確認數(shù)字,按下后即可確認要輸入數(shù)字的某一位。</p><p> 左側(cè)鍵盤的引腳由上至下分別是P3^0到P3^7,第一行暫時不用,從第二行開始使用,每一行如P3^1都與P3^4、 P3^5、 P3^6 、P3^7,他們是線與的關(guān)系。因此可以如此操作,對圖中第二行、第三行、第四行
33、諸行進行掃描。掃描第一行時P3口賦值為0xfd,即為P3^1口賦“0”,P3的其他口賦“1”,當(dāng)?shù)诙袥]有按鍵按下時P3^4、 P3^5、 P3^6 、P3^7將都是高電平“1”,一旦有按鍵按下時,由于線與關(guān)系,P3^4、 P3^5、 P3^6 、P3^7必定有一個為“0”,它們之中那一個為“0”依次代表S10到S13哪個鍵被按下。依次循環(huán)掃描三行即可時時檢測是否有鍵按下。</p><p> 2.4.2 鍵盤輸
34、入的抖動與去抖的方法</p><p> 在2.4.1節(jié)中談到了如何實現(xiàn)鍵盤的掃描,但是理論與實際還是有一定的差距,當(dāng)按下鍵盤到檢測到有電壓變化,這段時間在實際中是存在一定的時間誤差的,經(jīng)過這段時間誤差后電壓才會達到單片能夠檢測到的范圍,但這期間單片機很有可能已經(jīng)完成檢測,見圖2.7所示。</p><p> 圖2.7 抖動示意圖</p><p> 如果不去除抖動
35、的話,人們手指按下的瞬間單片機已經(jīng)開始檢測,這時電壓還未降到穩(wěn)定閉合狀態(tài)所以不能檢測到按下,同理不管是按下,還是是松手都會有這樣的情況出現(xiàn),不利于操作,所以應(yīng)該加入去抖操作,圖中右側(cè)是硬件去除抖動,除了硬件去抖以外還可以利用軟件去抖。</p><p> 在本設(shè)計中采用軟件去抖的方法,原理是檢測兩次,第一次檢測到低電平時延時一段時間,再檢測一次,如果還能檢測到低電平,則說明確實有鍵按下。具體程序如下:</p
36、><p> while(temp!=0xf0)</p><p><b> {</b></p><p><b> delay(5);</b></p><p><b> P3=0xfd;</b></p><p><b> temp=P3;&l
37、t;/b></p><p> temp=temp&0xf0;</p><p> while(temp!=0xf0)</p><p> 上述程序是兩個while循環(huán)之間的嵌套,第一個while()語句判斷有鍵按下后,延時一段時間再進行判斷,如果第二次判斷也認為由鍵按下,則可以確認的確由鍵盤操作,并不是抖動。具體按下后的操作可以在后一個while循環(huán)
38、中書寫。</p><p> 2.5 DS18B20溫度采集</p><p> 2.5.1 DS18B20技術(shù)性能與應(yīng)用范圍</p><p> 圖2.8 DS18B20的外形及管腳圖</p><p> DS18B20是一種可組網(wǎng)數(shù)字溫度傳感器芯片,具有耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測溫和控制領(lǐng)域。&
39、lt;/p><p> 獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊。測溫范圍 -55℃~+125℃,固有測溫分辨率0.5℃。支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在唯一的三線上,最多只能并聯(lián)8個,如果數(shù)量過多,會使供電電源電壓過低,從而造成信號傳輸?shù)牟环€(wěn)定,實現(xiàn)多點測溫。工作電源為 3~5V/DC。在使用中不需要任何外圍元件,測量結(jié)果以9~12位
40、數(shù)字量方式串行傳送。不銹鋼保護管直徑Φ6,適用于DN15~25, DN40~DN250各種介質(zhì)工業(yè)管道和狹小空間設(shè)備測溫,標(biāo)準安裝螺紋 M10X1, M12X1.5, G1/2”任選,PVC電纜直接出線或德式球型接線盒出線,便于與其它電器設(shè)備連接。</p><p> 負壓特性:電源極性接反時,芯片不會因發(fā)熱而燒毀, 但不能正常工作。DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM 、溫度傳感器、非揮發(fā)的
41、溫度報警觸發(fā)器TH和TL、配置寄存器。DS18B20的外形及管腳排列見圖2.8所示。</p><p> 該產(chǎn)品適用于冷凍庫,糧倉,儲罐,電訊機房,電力機房,電纜線槽等測溫和控制領(lǐng)域、軸瓦,缸體,紡機,空調(diào),等狹小空間工業(yè)設(shè)備測溫和控制、供熱/制冷管道熱量計量,中央空調(diào)分戶熱能計量和工業(yè)領(lǐng)域測溫和控制、汽車空調(diào)、冰箱、冷柜、以及中低溫干燥箱等。</p><p> 2.5.2 DS18B2
42、0的初始化與讀寫操作</p><p> 1. DS18B20的初始化</p><p> (1) 先將數(shù)據(jù)線置高電平“1”; </p><p> (2) 延時(該時間要求的不是很嚴格,但是盡可能的短一點);</p><p> ?。?) 數(shù)據(jù)線拉到低電平“0”; </p><p> ?。?) 延時750微秒(該時間的
43、時間范圍可以從480到960微秒); </p><p> ?。?) 數(shù)據(jù)線拉到高電平“1”; </p><p> ?。?) 延時等待(如果初始化成功則在15到60毫秒時間之內(nèi)產(chǎn)生一個由DS18B20所返回的低電平“0”。據(jù)該狀態(tài)可以來確定它的存在,但是應(yīng)注意不能無限的進行等待,不然會使程序進入死循環(huán),所以要進行超時控制); </p><p> ?。?) 若CPU讀到
44、了數(shù)據(jù)線上的低電平“0”后,還要做延時,其延時的時間從發(fā)出的高電平算起(第(5)步的時間算起)最少要480微秒; </p><p> ?。?) 將數(shù)據(jù)線再次拉高到高電平“1”后結(jié)束。</p><p> DS18B20的的初始化見圖2.9所示。</p><p> 圖2.9 DS18B20的的初始化</p><p> 2. DS18B20的
45、寫操作</p><p> (1) 數(shù)據(jù)線先置低電平“0”; </p><p> (2) 延時確定的時間為15微秒; </p><p> (3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位); </p><p> (4) 延時時間為45微秒; </p><p> ?。?) 將數(shù)據(jù)線拉到高電平; </p&g
46、t;<p> ?。?) 重復(fù)上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止; </p><p> (7) 最后將數(shù)據(jù)線拉高。</p><p> 在這里要注意的是(3),寫數(shù)據(jù)時時1bit單獨傳送,這里有兩種情況。</p><p> 當(dāng)需要傳送“1”時,單片機應(yīng)該給DS18B20芯片的DQ接口賦低電平,大約15秒以后,將DQ釋放為高電平,延時約
47、45微妙即可。</p><p> 當(dāng)需要傳送“0”時,單片機應(yīng)該給DS18B20芯片的DQ接口賦低電平,并且持續(xù)拉低最少60微妙,然后將DQ釋放為高電平,再延時約15秒即可。</p><p> DS18B20的寫操作時序圖見圖2.10所示。</p><p> 圖2.10 DS18B20的寫操作時序圖</p><p> 3. DS18B
48、20的讀操作</p><p> ?。?)將數(shù)據(jù)線拉高“1”; </p><p> ?。?)延時2微秒; </p><p> (3)將數(shù)據(jù)線拉低“0”; </p><p> ?。?)延時15微秒; </p><p> ?。?)將數(shù)據(jù)線拉高“1”; </p><p> ?。?)延時15微秒; &l
49、t;/p><p> ?。?)讀數(shù)據(jù)線的狀態(tài)得到一個狀態(tài)位,并進行數(shù)據(jù)處理; </p><p> (8)延時30微秒;</p><p> 這里只要按以上操作將狀態(tài)位的各各bit按順序儲存好即可。</p><p> DS18B20的讀操作時序圖見圖2.11所示。</p><p> 圖2.11 DS18B20的讀操作時序
50、圖</p><p> 2.5.3 DS18B20的指令與格式</p><p> DS18B20溫度格式圖見圖2.12所示。</p><p> 圖2.12 DS18B20溫度格式圖</p><p> 這是12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲在DS18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于0,這5位為0
51、,只要將測到的數(shù)值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,測到的數(shù)值需要取反加1再乘于0.0625即可得到實際 溫度。 例如+125℃的數(shù)字輸出為07D0H,+25.0625℃的數(shù)字輸出為0191H,-25.0625℃的數(shù)字輸出為FE6FH,-55℃的數(shù)字輸出為FC90H 。</p><p> DS18B20溫度傳感器的存儲器 DS18B20溫度傳感器的內(nèi)部存儲器包括一個高速暫存RAM和一
52、個非易失性的可電擦除的EEPRAM,后者存放高溫度和低溫度觸發(fā)器 TH、TL和結(jié)構(gòu)寄存器。配置寄存器,該字節(jié)各位的意義見表2.2所示。</p><p> 表2.2 配置寄存器結(jié)構(gòu)</p><p> 高速暫存存儲器由9個字節(jié)組成。其分配見表2.3所示,當(dāng)溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補碼形式存放在高速暫存存儲器的第0和第1個字節(jié)。單片機可通過單線接口讀到該數(shù)據(jù),讀取時低
53、位在前,高位在后。對應(yīng)的溫度計算:當(dāng)符號位S=0時,直接將二進制位轉(zhuǎn)換為十進制;當(dāng)S=1時,先將補碼變?yōu)樵a,再計算十進制值。第九個字節(jié)是冗余檢驗字節(jié)。 </p><p> 表2.3 DS18B20暫存寄存器分布</p><p> 根據(jù)DS18B20的通訊協(xié)議,主機(單片機)控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過三個步驟:每一次讀寫之前都要對DS18B20進行復(fù)位操作,復(fù)位成功后發(fā)送一
54、條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18B20進行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500微秒,然后釋放,當(dāng)DS18B20收到信號后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收到此信號表示復(fù)位成功。 ROM指令表見表2.4所示,RAM指令表見表2.5所示。</p><p> 表2.4 ROM指令表</p><p> 表2.5 RAM指令表&l
55、t;/p><p> 2.5.4 DS18B20寄生電源供電方式</p><p> DS18B20測溫系統(tǒng)具有測溫系統(tǒng)簡單、測溫精度高、連接方便、占用口線少等優(yōu)點。下面就是DS18B20幾個不同應(yīng)用方式下的 測溫電路圖:</p><p> DS18B20寄生電源供電方式電路圖,見圖2.13所示,在寄生電源供電方式下,DS18B20從單線信號線上汲取能量:在信號線DQ
56、處于高電平期間把能量儲存在內(nèi)部電容里,在信號線處于低電平期間消耗電容上的電能工作,直到高電平到來再給寄生電源(電容)充電。 </p><p> 獨特的寄生電源方式有三個好處: </p><p> 1. 進行遠距離測溫時,無需本地電源;</p><p> 2. 可以在沒有常規(guī)電源的條件下讀取ROM;</p><p> 3. 電路更加簡潔
57、,僅用一根I/O口實現(xiàn)測溫。 </p><p> 要想使DS18B20進行精確的溫度轉(zhuǎn)換,I/O線必須保證在溫度轉(zhuǎn)換期間提供足夠的能量,由于每個DS18B20在溫度轉(zhuǎn)換期間工作電流達到1mA,當(dāng)幾個溫度傳感器掛在同一根I/O線上進行多點測溫時,只靠4.7K上拉電阻就無法提供足夠的能量,會造成無法轉(zhuǎn)換溫度或溫度誤差極大。 </p><p> 因此,這種電路只適應(yīng)于單一溫度傳感器測溫情況下
58、使用,不適宜采用供電系統(tǒng)中。并且工作電源VCC必須保證在5V,當(dāng)電源電壓下降時,寄生電源能夠汲取的能量也降低,會使溫度誤差變大。 </p><p> 圖2.13 DS18B20寄生電源供電方式</p><p> 2.5.5 DS18B20改進的寄生電源供電方式</p><p> DS18B20寄生電源強上拉供電方式電路圖,改進的寄生電源供電方式見圖2.14所示
59、,為了使DS18B20在動態(tài)轉(zhuǎn)換周期中獲得足夠的電流供應(yīng),當(dāng)進行溫度轉(zhuǎn)換或拷貝到E2存儲器操作時,用MOSFET把I/O線直接拉到VCC就可提供足夠的電流,在發(fā)出任何涉及到拷貝到E2存儲器或啟動溫度轉(zhuǎn)換的指令后,必須在最多10μS內(nèi)把I/O線轉(zhuǎn)換到強上拉狀態(tài)。在強上拉方式下可以解決電流供應(yīng)不走的問題,因此也適合于多點測溫應(yīng)用,缺點就是要多占用一根I/O口線進行強上拉切換。 </p><p> 圖2.14 改進的
60、寄生電源供電方式</p><p> 注意:在見圖2.13所示、見圖2.14所示寄生電源供電方式中,DS18B20的VDD引腳必須接地。</p><p> 2.5.6 DS18B20外部電源供電方式</p><p> DS18B20的外部電源供電方式見圖2.15所示,在外部電源供電方式下,DS18B20工作電源由VDD引腳接入,此時I/O線不需要強上拉,不存在電
61、源電流不足的問題,可以保證轉(zhuǎn)換精度,同時在總線上理論可以掛接任意多。DS18B20傳感器,組成多點測溫系統(tǒng)。注意:在外部供電的方式下,DS18B20的GND引腳不能懸空,否則不能轉(zhuǎn)換溫度,讀取的溫度總是85℃。 </p><p> 圖2.15 外部供電方式單點測溫電路</p><p> 在本次設(shè)計中采用外部電源供電方式,連接方法見圖2.16所示。</p><p>
62、; 圖2.16 設(shè)計中采用的測溫電路</p><p> 直接將DS18B20的I/O口接在單片機的P2^2上,這樣在硬件方面就可以進行數(shù)據(jù)交流,從而達到溫度數(shù)據(jù)傳輸?shù)哪康摹?lt;/p><p> 2.5.7 DS18B20寄生電源供電方式</p><p> 外部供電方式的多點測溫電路圖見圖2.17所示,外部電源供電方式是DS18B20最佳的工作方式,工作穩(wěn)定可靠
63、,抗干擾能力強,而且電路也比較簡單,可以開發(fā)出穩(wěn)定可靠的多點溫度監(jiān)控系統(tǒng)。站長推薦大家在開發(fā)中使用外部電源供電方式,畢竟比寄生電源方式只多接一根VCC引線。在外接電源方式下,可以充分發(fā)揮DS18B20寬電源電壓范圍的優(yōu)點,即使電源電壓VCC降到3V時,依然能夠保證溫度量精度。</p><p> 圖2.17 外部供電方式的多點測溫電路圖</p><p> 第3章 系統(tǒng)軟件設(shè)計</p
64、><p> 3.1 鍵盤輸入的程序</p><p> while(temp!=0xf0)</p><p><b> {</b></p><p><b> delay(5);</b></p><p><b> P3=0xfd;</b></p&g
65、t;<p><b> temp=P3;</b></p><p> temp=temp&0xf0;</p><p> while(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P3;</b>&l
66、t;/p><p> switch(temp)</p><p><b> {</b></p><p> case 0xed:num=0;</p><p><b> break;</b></p><p> case 0xdd:num=1;</p><p&
67、gt;<b> break;</b></p><p> case 0xbd:num=2;</p><p><b> break;</b></p><p> case 0x7d:num=3;</p><p><b> break;</b></p><
68、p><b> }</b></p><p> while(temp!=0xf0)</p><p><b> {</b></p><p><b> temp=P3;</b></p><p> temp=temp&0xf0;//****0000</p&g
69、t;<p><b> }</b></p><p><b> }</b></p><p> 在這里使用了_crol_函數(shù),所以頭文件中要增加#include<intrins.h>,這里包括去抖和松手檢測。經(jīng)過檢測以后通過不同的temp值,使num被賦予相應(yīng)的數(shù)值,這樣num就是要輸入的一個數(shù)字。</p>
70、<p> 3.2 DS18B20溫度傳感器設(shè)計</p><p> 連接好電路以后,就可以開始設(shè)計DS18B20的軟件環(huán)節(jié)。首先要初始化DS18B20以下為初始化程序。</p><p> void dsstart()</p><p><b> { </b></p><p> unsigned int
71、 i;</p><p><b> ds=0;</b></p><p> i=100; //拉低約800us, 符合協(xié)議要求的480us以上</p><p> while(i>0) i--;</p><p> ds=1; //產(chǎn)生一個上升沿, 進入等待應(yīng)答狀態(tài) </p><p&g
72、t;<b> i=4;</b></p><p> while(i>0) i--;</p><p><b> }</b></p><p> 然后延時等待,回應(yīng)。如以下子函數(shù)。</p><p> void dswait()</p><p><b> {
73、</b></p><p> unsigned int i;</p><p> while(ds); //等待應(yīng)答信號</p><p> while(~ds); //檢測到應(yīng)答脈沖</p><p><b> i=4;</b></p><p> while(i>0)
74、i--;</p><p><b> }</b></p><p> 以下兩個子函數(shù)為讀取的數(shù)據(jù)時用到的??梢栽跍囟炔杉x取時調(diào)用。</p><p> bit readbit()//讀取一個bit</p><p><b> {</b></p><p> unsigned
75、 int i;</p><p><b> bit b;</b></p><p><b> ds=0;</b></p><p> i++; //延時約8us, 符合協(xié)議要求至少保持1us</p><p><b> ds=1;</b></p><p&
76、gt;<b> i++;</b></p><p> i++; //延時約16us, 符合協(xié)議要求的至少延時15us以上</p><p><b> b=ds;</b></p><p><b> i=8;</b></p><p> while(i>0) i--;
77、 //延時約64us, 符合讀時隙不低于60us要求</p><p><b> return b;</b></p><p><b> }</b></p><p> uchar readbyte()//讀取一個字節(jié)</p><p><b> {uint b;</b>&l
78、t;/p><p> uchar date,a;</p><p> b=0;date=0;</p><p> while(b<8)</p><p><b> {</b></p><p> a=readbit();</p><p> date=(a<<
79、7)|(date>>1);</p><p><b> b++;</b></p><p><b> }</b></p><p> return date;</p><p><b> }</b></p><p> 以下為寫入命令程序。
80、用于操控DS18B20。</p><p> void writeor(uchar order)//寫入命令</p><p><b> {</b></p><p><b> uint b;</b></p><p><b> uchar a;</b></p>
81、<p><b> bit bit2;</b></p><p><b> b=0;</b></p><p> for(a=0;a<8;a++)</p><p><b> {</b></p><p> bit2=order&0x01;</p&
82、gt;<p> order>>=1;</p><p> if(bit2)//寫入1</p><p><b> {</b></p><p><b> ds=0;</b></p><p><b> b++,b++;</b></p>
83、<p><b> ds=1;</b></p><p> for(b=0;b<8;b++);</p><p><b> }</b></p><p><b> else//0</b></p><p><b> {</b></p&
84、gt;<p><b> ds=0;</b></p><p> for(b=0;b<8;b++);</p><p><b> ds=1;</b></p><p><b> b++;b++;</b></p><p><b> }</b&
85、gt;</p><p><b> }</b></p><p><b> }</b></p><p> 當(dāng)以上程序書寫完成后,準備工作基本完成?,F(xiàn)在只要調(diào)用這些函數(shù),來操控DS18B20使其能夠按協(xié)議規(guī)定將溫度數(shù)據(jù)傳送給單片機。軟件實施方法如下:</p><p> void changetem
86、p()//溫度轉(zhuǎn)變函數(shù)</p><p><b> {</b></p><p> dsstart();</p><p><b> dswait();</b></p><p><b> delay(1);</b></p><p> writeor
87、(0xcc);// 跳過讀序號列號的操作</p><p> writeor(0x44);// 啟動溫度轉(zhuǎn)換 </p><p><b> delay(1);</b></p><p><b> }</b></p><p> uint gettemp()//獲取溫度</p><
88、p><b> {</b></p><p><b> float tt;</b></p><p><b> int temp;</b></p><p> uchar geta,getb;</p><p> dsstart();</p><p&g
89、t;<b> dswait();</b></p><p><b> delay(1);</b></p><p> writeor(0xcc);</p><p> writeor(0xbe);//讀取溫度命令</p><p><b> delay(2);</b><
90、/p><p> geta=readbyte();//讀取兩個字節(jié)</p><p> getb=readbyte();</p><p> temp=getb;</p><p> temp<<=8;//左移8位</p><p> temp=temp|geta;</p><p>
91、tt=temp*0.0625;//將temp中的數(shù)轉(zhuǎn)化成實際的溫度值</p><p> temp=tt*10+(temp > 0 ? 0.5 : -0.5);//,變大十倍且 四舍五入</p><p> return(temp);</p><p><b> }</b></p><p> 以上兩個程序流程為,
92、changetemp()子函數(shù)中先初始化DS18B20,芯片應(yīng)答以后寫入兩個以字節(jié)為一個單位的命令,0xcc與0x44它們的作用分別為跳過讀序號列號的操作和啟動溫度轉(zhuǎn)換。然后溫度獲取gettemp()子函數(shù)完成。在gettemp()子函數(shù)中首先也是初始化DS18B20、等待應(yīng)答,寫入命令0xcc跳過讀序號列號的操作和0xbe讀取溫度命令。使用readbyte()讀取兩個字節(jié)的數(shù)據(jù),分別賦予geta、getb兩個字符型變量,再將getb賦
93、予temp(temp是一個整型變量擁有兩個字節(jié)的容量),這樣temp的低8為就是getb中的值了。temp<<=8的意義是temp=temp<<8,所以temp的低8位將變成temp中的高8位,而C語言規(guī)定低8移位操作后不足的位數(shù)由0補上,這時的目的就是要將geta中的數(shù)據(jù)賦予temp中的低8位,只需要將temp按位與上geta,geta中位為1與上temp中低8位中的0就是1,而geta中位為0與temp中低8
94、位的0相與就是0,這樣就將geta中的值賦給了temp的低8位。</p><p> 現(xiàn)在已獲得了溫度的數(shù)據(jù),還要通過軟件計算出具體傳送數(shù)據(jù)代表的溫度值,在前面已經(jīng)談到數(shù)據(jù)中的1就代表了0.0625攝氏度。直接將temp值乘0.0625就是需要的溫度,temp乘以0.0625后的值賦予tt ,temp=tt*10+(temp > 0 ? 0.5 : -0.5)這句話是先將tt由一個最高位為十位保留小數(shù)點后一
95、位的數(shù)擴大了十倍,變?yōu)榱艘粋€最高位為百位的三位數(shù),而后面加上的十一個四舍五入的賦值語句,也就相當(dāng)是一個if語句,C語言是任何精度高的變量變?yōu)榫鹊偷淖兞繒r,都會失去一定的精度,而且是向下取整,例如在這里,如果tt是正溫度的話變大10倍以后,小數(shù)點后一位是無論是1還是9,都默認舍去,如果要對正數(shù)的tt進行四舍五入應(yīng)該先給tt加上0.5,再將它賦給精度較低的temp,這樣就可以有四舍五入的功能,而這里沒有這么簡單,這個if語句的還要考慮tt
96、為負值的情況下的操作,如果temp為負值,tt變大10倍以后還要減去0.5,這樣就能夠完成tt為負值情況下的四舍五入。</p><p> 3.3 主函數(shù)的分析</p><p><b> 首先給出主函數(shù):</b></p><p> void main()</p><p><b> {</b>&
97、lt;/p><p> TMOD=0x01;</p><p> TH0=(65536-46000)/256;</p><p> TL0=(65536-46000)%256;</p><p><b> EA=1;</b></p><p><b> ET0=1;</b><
98、;/p><p><b> TR0=1;</b></p><p><b> zd=0;</b></p><p> num=21;aaa=0;bbb=0;</p><p> num1=21;num2=21;num3=21;</p><p><b> while(1
99、)</b></p><p><b> {uint a;</b></p><p><b> uchar b;</b></p><p> changetemp();</p><p> a=gettemp();</p><p> b=scanff();<
100、;/p><p> numy=gettemp();</p><p> display(a,b);</p><p><b> }</b></p><p><b> }</b></p><p> 這里的aaa用于控制是否確定輸入的一個數(shù)字是需要的數(shù)字,bbb用于標(biāo)記已經(jīng)輸入到
101、了三個數(shù)字的第幾個數(shù)字。</p><p> 主函數(shù)首先將所用到的全局變量賦值,然后進入大循環(huán)首先進入溫度轉(zhuǎn)換函數(shù),使DS18B20啟動溫度轉(zhuǎn)換,然后獲取溫度將兩個字節(jié)的數(shù)值賦給a,而將輸入的溫度賦予b ,再由display(a,b)子函數(shù)輸出所有的值。</p><p> 3.4 顯示函數(shù)的分析</p><p> 以下是display()函數(shù)的具體內(nèi)容。<
102、/p><p> void display(uint a,uchar b)</p><p><b> {</b></p><p> uchar i,temp,srtemp,dis[4];</p><p><b> uint dda;</b></p><p> dda=ab
103、s(a);</p><p> numx=dda/1000;</p><p> num4=dda%1000/100;</p><p> num5=dda%100/10;</p><p> num6=dda%10;</p><p> dis[0]=numx;</p><p> dis[1
104、]=num4;</p><p> dis[2]=num5;</p><p> dis[3]=num6;</p><p> dis[2]+=10;//num5小數(shù)點</p><p> if((dis[0]==0)&&(dis[1]==0))</p><p> dis[1]=20;//如果百位和十
105、位都為0 不顯示</p><p> if(a<0)//負值 后面加個小數(shù)點</p><p> dis[3]+=10;</p><p><b> else</b></p><p> {if(dis[0]!=0)//超過100前面加小數(shù)點</p><p> dis[1]=dis[1]+
106、10;</p><p><b> }</b></p><p> temp=0xfb;</p><p> for(i=1;i<4;i++)</p><p><b> {</b></p><p><b> P0=0xff;</b></p
107、><p><b> wei=1;</b></p><p> temp=_crol_(temp,1);</p><p><b> P0=temp;</b></p><p><b> wei=0;</b></p><p><b> P0=0;
108、</b></p><p><b> duan=1;</b></p><p> P0=table[dis[i]];</p><p><b> duan=0;</b></p><p><b> delay(3);</b></p><p>
109、<b> }</b></p><p><b> duan=1;</b></p><p><b> P0=0x00;</b></p><p><b> duan=0;</b></p><p> if(aaa==1&&ccc!=21)
110、</p><p><b> bbb++;</b></p><p> switch(bbb)</p><p><b> {</b></p><p><b> case 0:</b></p><p><b> dis[1]=b;</
111、b></p><p><b> num1=b;</b></p><p> dis[2]=num2;</p><p> dis[3]=num3;</p><p> if(dis[2]==21)</p><p><b> dis[2]++;</b></p&g
112、t;<p><b> else</b></p><p> dis[2]+=10;</p><p> srtemp=0xfe;</p><p> for(i=1;i<4;i++)</p><p><b> {</b></p><p><b&
113、gt; P0=0xff;</b></p><p><b> wei=1;</b></p><p> P0=srtemp;//wein打開后 是低電平亮</p><p><b> wei=0;//</b></p><p> srtemp=_crol_(srtemp,1);<
114、/p><p><b> P0=0x00;</b></p><p><b> duan=1;</b></p><p> P0=table[dis[i]];</p><p><b> duan=0;</b></p><p><b> dela
115、y(1);</b></p><p><b> duan=1;</b></p><p><b> P0=0x00;</b></p><p><b> duan=0;</b></p><p><b> }</b></p>&l
116、t;p><b> break;</b></p><p><b> case 1:</b></p><p> dis[1]=num1;</p><p><b> dis[2]=b;</b></p><p><b> num2=b;</b>&l
117、t;/p><p> dis[3]=num3;</p><p> if(dis[2]==21)</p><p><b> dis[2]++;</b></p><p><b> else</b></p><p> dis[2]+=10;</p><p&g
118、t; srtemp=0xfe;</p><p> for(i=1;i<4;i++)</p><p><b> {</b></p><p><b> P0=0xff;</b></p><p><b> wei=1;</b></p><p>
119、; P0=srtemp;//wein打開后 是低電平亮</p><p><b> wei=0;//</b></p><p> srtemp=_crol_(srtemp,1);</p><p><b> P0=0x00;</b></p><p><b> duan=1;</b
120、></p><p> P0=table[dis[i]];</p><p><b> duan=0;</b></p><p><b> delay(1);</b></p><p><b> duan=1;</b></p><p><b&
121、gt; P0=0x00;</b></p><p><b> duan=0;</b></p><p><b> }</b></p><p><b> aaa=0;</b></p><p><b> break;</b></p>
122、;<p><b> case 2:</b></p><p> dis[1]=num1;</p><p> dis[2]=num2;</p><p><b> dis[3]=b;</b></p><p><b> num3=b;</b></p>
123、<p> if(dis[2]==21)</p><p><b> dis[2]++;</b></p><p><b> else</b></p><p> dis[2]+=10;</p><p> srtemp=0xfe;</p><p> for(
124、i=1;i<4;i++)</p><p><b> {</b></p><p><b> P0=0xff;</b></p><p><b> wei=1;</b></p><p> P0=srtemp;//wein打開后 是低電平亮</p><
125、;p><b> wei=0;//</b></p><p> srtemp=_crol_(srtemp,1);</p><p><b> P0=0x00;</b></p><p><b> duan=1;</b></p><p> P0=table[dis[i]]
126、;</p><p><b> duan=0;</b></p><p><b> delay(1);</b></p><p><b> duan=1;</b></p><p><b> P0=0x00;</b></p><p>
127、;<b> duan=0;</b></p><p><b> }</b></p><p><b> aaa=0;</b></p><p><b> break;</b></p><p><b> case 3:</b><
128、;/p><p> dis[1]=num1;</p><p> dis[2]=num2;</p><p> dis[3]=num3;</p><p> if(dis[2]==21)</p><p><b> dis[2]++;</b></p><p><b>
129、 else</b></p><p> dis[2]+=10;</p><p> srtemp=0xfe;</p><p> for(i=1;i<4;i++)</p><p><b> {</b></p><p><b> P0=0xff;</b>
130、;</p><p><b> wei=1;</b></p><p> P0=srtemp;//wein打開后 是低電平亮</p><p><b> wei=0;//</b></p><p> srtemp=_crol_(srtemp,1);</p><p><b
131、> P0=0x00;</b></p><p><b> duan=1;</b></p><p> P0=table[dis[i]];</p><p><b> duan=0;</b></p><p><b> delay(1);</b></p&
132、gt;<p><b> duan=1;</b></p><p><b> P0=0x00;</b></p><p><b> duan=0;</b></p><p><b> }</b></p><p> aaa=0;num=21;
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文----基于51單片機的家用電熱水器設(shè)計
- 畢業(yè)設(shè)計---基于單片機控制的快熱式家用電熱水器的設(shè)計
- 基于單片機的電熱水器畢業(yè)設(shè)計
- 畢業(yè)設(shè)計(論文)-基于單片機控制的快熱式家用電熱水器的設(shè)計
- 家用電熱水器的設(shè)計畢業(yè)設(shè)計
- 【課程設(shè)計】-基于單片機的快熱式家用電熱水器的設(shè)計
- 畢業(yè)設(shè)計---快熱式家用電熱水器的設(shè)計
- 畢業(yè)設(shè)計--快熱式家用電熱水器的設(shè)計
- 基于單片機的電熱水器畢業(yè)設(shè)計開題報告
- -畢業(yè)設(shè)計----基于at89s51單片機的智能電熱水器的設(shè)計
- 快熱式家用電熱水器的設(shè)計
- 智能家用電熱水器控制器設(shè)計畢業(yè)設(shè)計
- 畢業(yè)設(shè)計論文基于單片機的電熱水器控制器設(shè)計
- 基于單片機的家電熱水器控制系統(tǒng)設(shè)計畢業(yè)設(shè)計
- 家用電熱水器控制系統(tǒng)設(shè)計
- 課題實踐快熱式家用電熱水器的設(shè)計
- 基于單片機的電熱水器溫度控制系統(tǒng)設(shè)計
- 基于單片機的電熱水器定時控制器設(shè)計畢業(yè)論文
- 智能家用電熱水器控制器
- 智能家用電熱水器控制器
評論
0/150
提交評論