畢業(yè)設(shè)計--基于51單片機的家用電熱水器設(shè)計_第1頁
畢業(yè)設(shè)計--基于51單片機的家用電熱水器設(shè)計_第2頁
畢業(yè)設(shè)計--基于51單片機的家用電熱水器設(shè)計_第3頁
畢業(yè)設(shè)計--基于51單片機的家用電熱水器設(shè)計_第4頁
畢業(yè)設(shè)計--基于51單片機的家用電熱水器設(shè)計_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 畢業(yè)設(shè)計(論文)基于51單片機的家用電熱水器設(shè)計Design of Household Electric Water Heater Based on the 51-series singlechip 摘 要隨著社會的發(fā)展,人類科技的進步,各行各業(yè)都在使自己的產(chǎn)品智能化、數(shù)字化,因老式的熱水器使用煤氣或天然氣對水進行燃燒加熱,用手動的方式調(diào)節(jié)溫度,不僅不能夠精確的確定使用者需要的水溫,而且還存在一定的危險性。電熱水器是一種可供浴室、洗手間及廚房使用的家用電器,隨著人們生活質(zhì)量的提高,現(xiàn)代的家用電熱水器已經(jīng)摒棄了以前的做法,而采用一種更加精確、安全的實施方案。C語言對單片機編程有諸多優(yōu)點,例如:

2、便于移植、句法檢查時錯誤少、堅固性好、頭文件種類諸多,能夠方便快捷使用各種函數(shù)等。本文采用 AT 89C 52 單片機作為控制器,使用C語言編寫程序,設(shè)計了一款智能家用電熱水器。使用陣型鍵盤輸入溫度,溫度可以精確到0.1攝氏度,并使用LED燈顯示,能夠精確提供用戶所需溫度的溫水。采用DS18B20采集溫度,使用LED燈顯示,精確的顯示出采集的水溫。當(dāng)所需溫度高于當(dāng)前采集的水溫時,使用MOC3041芯片觸發(fā)加熱,當(dāng)所需溫度低于當(dāng)前采集的水溫時,則停止加熱。基本實現(xiàn)了智能控制功能。關(guān)鍵詞:單片機;C語言;采集;智能;家用電熱水器 目 錄第1章 緒論11.1 家用電熱水器的現(xiàn)狀11.2 TX-1C單

3、片機實驗開發(fā)板簡介1第2章 系統(tǒng)硬件設(shè)計22.1 系統(tǒng)硬件的組成部分22.2 系統(tǒng)硬件各部分的簡介22.3 數(shù)碼管顯示32.3.1 數(shù)碼管簡介32.3.2 數(shù)碼管的實現(xiàn)方法42.3.3 鎖存器與數(shù)碼管顯示方法62.4 鍵盤輸入設(shè)計72.4.1 鍵盤輸入方法72.4.2 鍵盤輸入的抖動與去抖的方法82.5 DS18B20溫度采集92.5.1 DS18B20技術(shù)性能與應(yīng)用范圍92.5.2 DS18B20的初始化與讀寫操作102.5.3 DS18B20的指令與格式122.5.4 DS18B20寄生電源供電方式152.5.5 DS18B20改進的寄生電源供電方式162.5.6 DS18B20外部電源供

4、電方式172.5.7 DS18B20寄生電源供電方式18第3章 系統(tǒng)軟件設(shè)計203.1 鍵盤輸入的程序203.2 DS18B20溫度傳感器設(shè)計213.3 主函數(shù)的分析253.4 顯示函數(shù)的分析263.5 中斷加熱子函數(shù)的分析33第4章 功能簡介與成品圖片354.1 智能熱水器具的功能354.2 成品圖片35第5章 總結(jié)與展望38附錄 程序4152第1章 緒論 單片機是一種與我們生活息息相關(guān)的控制器,它存在于許多地方,例如:電子手表、掌上游戲機、數(shù)碼相機、錄音筆、電視機遙控器等等。單片機主要由中央處理器、內(nèi)存、輸入/輸出設(shè)備組成,它就好像是一臺小型電腦,它能夠執(zhí)行人們對它編寫的程序,從而發(fā)出各種

5、不同的控制命令,與外部電路結(jié)合后,便可以完成各種各樣的功能。通過單片機人們的生活將會變得更加方便、快捷。1.1 家用電熱水器的現(xiàn)狀我們的生活電熱水器是一種可供浴室、洗手間及廚房使用,按照人們的需要的溫度,提供溫水的家用電器。市場上傳統(tǒng)的機械式電熱水器控制精度低、可靠性差,甚至存在一定的危險隱患。隨著社會的發(fā)展、人們生活質(zhì)量的提高,人們對電熱水器的要求越來越趨向于智能化和數(shù)字化,這種老式而簡單的電熱水器已經(jīng)不能夠滿足人們的需要了。而智能化家用電熱水器正是適應(yīng)現(xiàn)代化智能家用電器趨勢而出現(xiàn)。它能提供用戶方便快捷的數(shù)字化輸入方式,并且能精確的采集和控制環(huán)境中的水溫,將其提供給用戶,因此備受人們的關(guān)注。

6、1.2 TX-1C單片機實驗開發(fā)板簡介XT-1C單片機開發(fā)板是哈爾濱市天祥電子綜合多年開發(fā)經(jīng)驗,在原TX-1B基礎(chǔ)上,經(jīng)過精心設(shè)計開發(fā)出的多功能51單片機開發(fā)平臺。該開發(fā)板集常用的單片機外圍資源、串口和USB口兩種調(diào)試下載接口于一身,完全兼容ATMEL公司的51單片機,除此之外還有很多特點,如:無法解密、低功耗、高速、高可靠、強抗靜電、強抗干擾等。TX系列單片機開發(fā)板可完全作為各種51單片機的開發(fā)板,用匯編語言或者C語言對其進行編程。當(dāng)用STC公司的單片機時,直接用產(chǎn)品套件附帶的串口線將開發(fā)板與計算機串口相連,按照STC單片機下載操作教程便可以下載程序,而且下載速度比起其他下載工具要快的多。本

7、文將使用TX-1C開發(fā)板完成數(shù)字化電熱水器的設(shè)計。第2章 系統(tǒng)硬件設(shè)計2.1 系統(tǒng)硬件的組成部分系統(tǒng)設(shè)計硬件原理結(jié)構(gòu)見圖2.1所示。系統(tǒng)以高性價比的AT89C51單片機為核心,由鍵盤輸入、DS18B20溫度采集、數(shù)碼管顯示電路、電源時鐘復(fù)位電路、雙向可控硅驅(qū)動電路MOC3041、雙向可控硅TLC336A組成加熱器控制電路。 圖2.1 系統(tǒng)設(shè)計硬件原理結(jié)構(gòu)2.2 系統(tǒng)硬件各部分的簡介這里AT89C51為總控制器。單片機的P0口連接74HC573鎖存器,這樣可以節(jié)約單片機端口,即可多次操作P0口,使其既能控制數(shù)碼管的片選,又能控制數(shù)碼管的位選,從而節(jié)省的單片機的外部接口,擴展了功能。鍵盤的輸入由P

8、3口完成在第4章節(jié)中會具體介紹如何實現(xiàn)。時鐘復(fù)位電路見圖2.2所示,RET連接單片機的RESET接口,主要完成單片機的復(fù)位功能。圖2.2 時鐘復(fù)位電路溫度采集芯片由DS18B20芯片完成,DS18B20的2號接口接在單片機的P22口,按協(xié)議傳送以兩個字節(jié)為一組的溫度數(shù)據(jù),第3章會介紹具體實現(xiàn)方法。加熱模塊見圖2.3所示,MOC3041芯片的2號接口連接單片機的P22口。當(dāng)需要加熱時,P22接口送出低電平,即可觸發(fā)加熱器工作。圖2.3 加熱模塊2.3 數(shù)碼管顯示2.3.1 數(shù)碼管簡介單片機系統(tǒng)中常用的顯示器有:發(fā)光二極管LED(Light Emitting Diode)顯示器、液晶CD(Liqu

9、id Crystal Display)顯示器、CRT顯示器等。LED、LCD顯示器有兩種顯示結(jié)構(gòu):段顯示(7段、米字型等)和點陣顯示(5×8、8×8點陣等)。使用LED顯示器時,要注意區(qū)分這兩種不同的接法。為了顯示數(shù)字或字符,必須對數(shù)字或字符進行編碼。七段數(shù)碼管加上一個小數(shù)點,共計8段。因此為LED顯示器提供的編碼正好是一個字節(jié)。本設(shè)計采用的TX-C1實驗板是采用共陰LED顯示器,根據(jù)電路連接圖顯示十六進制數(shù)的編碼見表2.1所示。表2.1 十六進制數(shù)的編碼十六進制編碼數(shù)碼管顯數(shù)值十六進制編碼數(shù)碼管顯數(shù)值十六進制編碼數(shù)碼管顯數(shù)值0x3f00x7d60x39C0x0610x07

10、70x5eD0x5b20x7f80x79E0x4f30x6f90x71F0x6640x77A0x00無顯示0x6d50x7cB2.3.2 數(shù)碼管的實現(xiàn)方法數(shù)碼管的顯示由P0口完成控制。有兩點需要注意,第一點是要哪一個數(shù)碼管亮,第二點是亮的數(shù)碼管顯示什么數(shù)字。所以數(shù)碼管有位選和段選之分,位選在程序中用wei表示,單片機上是P27端口,即對位選操作時使P27呈現(xiàn)高電平,這時P0的八個端口對數(shù)碼管的操作決定了那幾個數(shù)碼管亮,P0操作完成后使P27呈現(xiàn)低電平,這樣位選就已鎖定。段選在程序中由duan表示,單片機上是P26端口,與位選相同,操作時使P26呈現(xiàn)高電平,這時P0的八個端口對數(shù)碼管的操作決定了

11、亮的幾個數(shù)碼管顯示什么數(shù)字,P0操作完成后使P26呈現(xiàn)低電平,這樣段選就已鎖定。見圖2.4所示由于單片機僅僅起到控制的作用,其輸出電流十分小,所以P0端需要接上拉電阻與5V電源,通過電壓的變化控制5V電源點亮,想要圖中a端由電流通過時,即給P00一個低電平,觸發(fā)上拉電阻兩端間的電勢差,這樣就能促使電流流向a點,從而使a端對應(yīng)的LED燈點亮。圖2.4 單片機與數(shù)碼管的硬件連接首先選擇位選,再選擇段選。uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0x

12、fd,0x87,0xff,0xef,0x00,0x08,0x88;可以直接設(shè)置數(shù)碼管顯示各數(shù)字的十六進制,即P0口應(yīng)賦的十六進制,以便操作。如以上數(shù)組,使用時僅僅將需要的數(shù)組中的其中一個賦予P0口,這樣可以方便直觀得使數(shù)碼管顯示需要的數(shù)字。選擇位選與選擇片選的過程相當(dāng)快時,顯示在人眼中就是一排易于識別的十進制數(shù)字,這就是數(shù)碼管的動態(tài)顯示。2.3.3 鎖存器與數(shù)碼管顯示方法在這里先介紹74HC573芯片,這是一個鎖存器芯片,連接方法見圖2.5所示, P27、P26分別控制位選和段選的L端,例如:當(dāng)P27(程序中的全局變量wei)賦高電平時,74HC573輸入端口的值將直接輸送給74HC573芯片

13、的輸出端,當(dāng)輸入端變化時,輸出端也變化。P27賦低電平時, 74HC573芯片將記住最近一次L端口是高電平時芯片輸入端的8位,并將其輸出,當(dāng)輸入端變化時,輸出端不變化。在這里就可以利用鎖存器的特性使P27起到控制那個數(shù)碼管亮的作用,使P26控制數(shù)碼管亮什么樣的數(shù)字作用。圖2.5 74HC573芯片的連接以下數(shù)碼管顯示部分程序。P0=0xff;wei=1;P0=srtemp;/wein打開后 是低電平亮wei=0;srtemp=_crol_(srtemp,1);P0=0x00;duan=1;P0=tabledisi;duan=0;delay(1);duan=1;P0=0x00;duan=0;要注

14、意的是位選(程序中的wei變量),位選是低電平時選擇該數(shù)碼管亮。在顯示時容易出現(xiàn)不需要亮的LED管微微發(fā)亮的問題,這是因為所選擇的位選和段選都是通過P0賦的值,如果先選擇位選的8位值,P0口不還原成0x00,就會導(dǎo)致段選打開后,還未賦予段選P0口需要的數(shù)值之前,這段時間內(nèi)P0口將剛才位選的8位值賦予了段選鎖存器,這樣就會在極短的時間內(nèi),一些不需要的LED燈點亮,在單片機上就是由LED燈微微亮的情況,所以在這里注意每次P0對位選賦值以前,都應(yīng)該保證P0口為0x00。2.4 鍵盤輸入設(shè)計2.4.1 鍵盤輸入方法本設(shè)計中使用的是矩陣式鍵盤,見圖2.6所示。圖2.6 矩陣式鍵盤S10到S19分別代表數(shù)

15、字0到9。S20代表確認數(shù)字,按下后即可確認要輸入數(shù)字的某一位。左側(cè)鍵盤的引腳由上至下分別是P30到P37,第一行暫時不用,從第二行開始使用,每一行如P31都與P34、 P35、 P36 、P37,他們是線與的關(guān)系。因此可以如此操作,對圖中第二行、第三行、第四行諸行進行掃描。掃描第一行時P3口賦值為0xfd,即為P31口賦“0”,P3的其他口賦“1”,當(dāng)?shù)诙袥]有按鍵按下時P34、 P35、 P36 、P37將都是高電平“1”,一旦有按鍵按下時,由于線與關(guān)系,P34、 P35、 P36 、P37必定有一個為“0”,它們之中那一個為“0”依次代表S10到S13哪個鍵被按下。依次循環(huán)掃描三行即可時

16、時檢測是否有鍵按下。2.4.2 鍵盤輸入的抖動與去抖的方法在2.4.1節(jié)中談到了如何實現(xiàn)鍵盤的掃描,但是理論與實際還是有一定的差距,當(dāng)按下鍵盤到檢測到有電壓變化,這段時間在實際中是存在一定的時間誤差的,經(jīng)過這段時間誤差后電壓才會達到單片能夠檢測到的范圍,但這期間單片機很有可能已經(jīng)完成檢測,見圖2.7所示。圖2.7 抖動示意圖如果不去除抖動的話,人們手指按下的瞬間單片機已經(jīng)開始檢測,這時電壓還未降到穩(wěn)定閉合狀態(tài)所以不能檢測到按下,同理不管是按下,還是是松手都會有這樣的情況出現(xiàn),不利于操作,所以應(yīng)該加入去抖操作,圖中右側(cè)是硬件去除抖動,除了硬件去抖以外還可以利用軟件去抖。在本設(shè)計中采用軟件去抖的方

17、法,原理是檢測兩次,第一次檢測到低電平時延時一段時間,再檢測一次,如果還能檢測到低電平,則說明確實有鍵按下。具體程序如下:while(temp!=0xf0)delay(5);P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0)上述程序是兩個while循環(huán)之間的嵌套,第一個while()語句判斷有鍵按下后,延時一段時間再進行判斷,如果第二次判斷也認為由鍵按下,則可以確認的確由鍵盤操作,并不是抖動。具體按下后的操作可以在后一個while循環(huán)中書寫。2.5 DS18B20溫度采集2.5.1 DS18B20技術(shù)性能與應(yīng)用范圍圖2.8 DS18B20的

18、外形及管腳圖DS18B20是一種可組網(wǎng)數(shù)字溫度傳感器芯片,具有耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測溫和控制領(lǐng)域。獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊。測溫范圍 55125,固有測溫分辨率0.5。支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在唯一的三線上,最多只能并聯(lián)8個,如果數(shù)量過多,會使供電電源電壓過低,從而造成信號傳輸?shù)牟环€(wěn)定,實現(xiàn)多點測溫。工作電源為 35V/DC。在使用中不需要任何外圍元件,測量結(jié)果以912位數(shù)字量方式串行傳送。不銹鋼保護管直徑6,適用于DN1525, DN40DN

19、250各種介質(zhì)工業(yè)管道和狹小空間設(shè)備測溫,標準安裝螺紋 M10X1, M12X1.5, G1/2”任選,PVC電纜直接出線或德式球型接線盒出線,便于與其它電器設(shè)備連接。負壓特性:電源極性接反時,芯片不會因發(fā)熱而燒毀, 但不能正常工作。DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM 、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。DS18B20的外形及管腳排列見圖2.8所示。該產(chǎn)品適用于冷凍庫,糧倉,儲罐,電訊機房,電力機房,電纜線槽等測溫和控制領(lǐng)域、軸瓦,缸體,紡機,空調(diào),等狹小空間工業(yè)設(shè)備測溫和控制、供熱/制冷管道熱量計量,中央空調(diào)分戶熱能計量和工業(yè)領(lǐng)域測溫和控制、汽車

20、空調(diào)、冰箱、冷柜、以及中低溫干燥箱等。2.5.2 DS18B20的初始化與讀寫操作1. DS18B20的初始化(1) 先將數(shù)據(jù)線置高電平“1”; (2) 延時(該時間要求的不是很嚴格,但是盡可能的短一點);(3) 數(shù)據(jù)線拉到低電平“0”; (4) 延時750微秒(該時間的時間范圍可以從480到960微秒); (5) 數(shù)據(jù)線拉到高電平“1”; (6) 延時等待(如果初始化成功則在15到60毫秒時間之內(nèi)產(chǎn)生一個由DS18B20所返回的低電平“0”。據(jù)該狀態(tài)可以來確定它的存在,但是應(yīng)注意不能無限的進行等待,不然會使程序進入死循環(huán),所以要進行超時控制); (7) 若CPU讀到了數(shù)據(jù)線上的低電平“0”后

21、,還要做延時,其延時的時間從發(fā)出的高電平算起(第(5)步的時間算起)最少要480微秒; (8) 將數(shù)據(jù)線再次拉高到高電平“1”后結(jié)束。DS18B20的的初始化見圖2.9所示。圖2.9 DS18B20的的初始化2. DS18B20的寫操作(1) 數(shù)據(jù)線先置低電平“0”; (2) 延時確定的時間為15微秒; (3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位); (4) 延時時間為45微秒; (5) 將數(shù)據(jù)線拉到高電平; (6) 重復(fù)上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止; (7) 最后將數(shù)據(jù)線拉高。在這里要注意的是(3),寫數(shù)據(jù)時時1bit單獨傳送,這里有兩種情況。當(dāng)需要傳送“1”

22、時,單片機應(yīng)該給DS18B20芯片的DQ接口賦低電平,大約15秒以后,將DQ釋放為高電平,延時約45微妙即可。當(dāng)需要傳送“0”時,單片機應(yīng)該給DS18B20芯片的DQ接口賦低電平,并且持續(xù)拉低最少60微妙,然后將DQ釋放為高電平,再延時約15秒即可。DS18B20的寫操作時序圖見圖2.10所示。圖2.10 DS18B20的寫操作時序圖 3. DS18B20的讀操作(1)將數(shù)據(jù)線拉高“1”; (2)延時2微秒; (3)將數(shù)據(jù)線拉低“0”; (4)延時15微秒; (5)將數(shù)據(jù)線拉高“1”; (6)延時15微秒; (7)讀數(shù)據(jù)線的狀態(tài)得到一個狀態(tài)位,并進行數(shù)據(jù)處理; (8)延時30微秒;這里只要按以

23、上操作將狀態(tài)位的各各bit按順序儲存好即可。DS18B20的讀操作時序圖見圖2.11所示。圖2.11 DS18B20的讀操作時序圖2.5.3 DS18B20的指令與格式 DS18B20溫度格式圖見圖2.12所示。圖2.12 DS18B20溫度格式圖這是12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲在DS18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于0,這5位為0,只要將測到的數(shù)值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,測到的數(shù)值需要取反加1再乘于0.0625即可得到實際 溫度。 例如+125的數(shù)字輸出為07D0H,+25.0625的數(shù)字輸出為0191

24、H,-25.0625的數(shù)字輸出為FE6FH,-55的數(shù)字輸出為FC90H 。DS18B20溫度傳感器的存儲器 DS18B20溫度傳感器的內(nèi)部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的EEPRAM,后者存放高溫度和低溫度觸發(fā)器 TH、TL和結(jié)構(gòu)寄存器。配置寄存器,該字節(jié)各位的意義見表2.2所示。表2.2 配置寄存器結(jié)構(gòu)溫度數(shù)據(jù)輸出(二進制)數(shù)據(jù)輸出(十六進制)+1250000 0111 1101 000007D0+850000 0101 0101 00000550+25.06250000 0001 1001 00010191+10.1250000 0000 1010 001000A2

25、+0.50000 0000 0000 1000000800000 0000 0000 00000000-0.51111 1111 1111 1000FFF8-10.1251111 1111 0101 1110FF5E-25.06251111 1110 0110 1111FE6F-551111 1100 1001 0000FC90高速暫存存儲器由9個字節(jié)組成。其分配見表2.3所示,當(dāng)溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補碼形式存放在高速暫存存儲器的第0和第1個字節(jié)。單片機可通過單線接口讀到該數(shù)據(jù),讀取時低位在前,高位在后。對應(yīng)的溫度計算:當(dāng)符號位S=0時,直接將二進制位轉(zhuǎn)換為十進制;當(dāng)

26、S=1時,先將補碼變?yōu)樵a,再計算十進制值。第九個字節(jié)是冗余檢驗字節(jié)。 表2.3 DS18B20暫存寄存器分布寄存器內(nèi)容字節(jié)地址溫度值低位 (LS Byte)0溫度值高位 (MS Byte)1高溫限值(TH)2低溫限值(TL)3配置寄存器4保留5保留6保留7CRC校驗值8根據(jù)DS18B20的通訊協(xié)議,主機(單片機)控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過三個步驟:每一次讀寫之前都要對DS18B20進行復(fù)位操作,復(fù)位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18B20進行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500微秒,然后釋放,當(dāng)DS18B20收到信號后等待1660微秒左右,

27、后發(fā)出60240微秒的存在低脈沖,主CPU收到此信號表示復(fù)位成功。 ROM指令表見表2.4所示,RAM指令表見表2.5所示。表2.4 ROM指令表指 令約定代碼功 能讀ROM33H讀DS1820溫度傳感器ROM中的編碼(即64位地址)符合ROM55H發(fā)出此命令之后,接著發(fā)出 64 位 ROM 編碼,訪問單總線上與該編碼相對應(yīng)的 DS1820 使之作出響應(yīng),為下一步對該 DS1820 的讀寫作準備。搜索ROM0FOH用于確定掛接在同一總線上 DS1820 的個數(shù)和識別 64 位 ROM 地址。為操作各器件作好準備。跳過ROM0CCH忽略 64 位 ROM 地址,直接向 DS1820 發(fā)溫度變換命

28、令。適用于單片工作。警告搜索命令0ECH執(zhí)行后只有溫度超過設(shè)定值上限或下限的片子才做出響應(yīng)。表2.5 RAM指令表指 令約定代碼功 能溫度變換44H啟動DS1820進行溫度轉(zhuǎn)換,12位轉(zhuǎn)換時最長為750ms(9位為93.75ms)。結(jié)果存入內(nèi)部9字節(jié)RAM中。讀暫存器0BEH讀內(nèi)部RAM中9字節(jié)的內(nèi)容寫暫存器4EH發(fā)出向內(nèi)部RAM的3、4字節(jié)寫上、下限溫度數(shù)據(jù)命令,緊跟該命令之后,是傳送兩字節(jié)的數(shù)據(jù)。復(fù)制暫存器48H將RAM中第3 、4字節(jié)的內(nèi)容復(fù)制到EEPROM中。重調(diào) EEPROM0B8H將EEPROM中內(nèi)容恢復(fù)到RAM中的第3 、4字節(jié)。讀供電方式0B4H讀DS1820的供電模式。寄生供

29、電時DS1820發(fā)送“ 0 ”,外接電源供電 DS1820發(fā)送“ 1 ”。2.5.4 DS18B20寄生電源供電方式DS18B20測溫系統(tǒng)具有測溫系統(tǒng)簡單、測溫精度高、連接方便、占用口線少等優(yōu)點。下面就是DS18B20幾個不同應(yīng)用方式下的 測溫電路圖:DS18B20寄生電源供電方式電路圖,見圖2.13所示,在寄生電源供電方式下,DS18B20從單線信號線上汲取能量:在信號線DQ處于高電平期間把能量儲存在內(nèi)部電容里,在信號線處于低電平期間消耗電容上的電能工作,直到高電平到來再給寄生電源(電容)充電。 獨特的寄生電源方式有三個好處: 1. 進行遠距離測溫時,無需本地電源;2. 可以在沒有常規(guī)電源的

30、條件下讀取ROM;3. 電路更加簡潔,僅用一根I/O口實現(xiàn)測溫。 要想使DS18B20進行精確的溫度轉(zhuǎn)換,I/O線必須保證在溫度轉(zhuǎn)換期間提供足夠的能量,由于每個DS18B20在溫度轉(zhuǎn)換期間工作電流達到1mA,當(dāng)幾個溫度傳感器掛在同一根I/O線上進行多點測溫時,只靠4.7K上拉電阻就無法提供足夠的能量,會造成無法轉(zhuǎn)換溫度或溫度誤差極大。 因此,這種電路只適應(yīng)于單一溫度傳感器測溫情況下使用,不適宜采用供電系統(tǒng)中。并且工作電源VCC必須保證在5V,當(dāng)電源電壓下降時,寄生電源能夠汲取的能量也降低,會使溫度誤差變大。   圖2.13 DS18B20寄生電源供電方式 2.5.5 DS1

31、8B20改進的寄生電源供電方式DS18B20寄生電源強上拉供電方式電路圖,改進的寄生電源供電方式見圖2.14所示,為了使DS18B20在動態(tài)轉(zhuǎn)換周期中獲得足夠的電流供應(yīng),當(dāng)進行溫度轉(zhuǎn)換或拷貝到E2存儲器操作時,用MOSFET把I/O線直接拉到VCC就可提供足夠的電流,在發(fā)出任何涉及到拷貝到E2存儲器或啟動溫度轉(zhuǎn)換的指令后,必須在最多10S內(nèi)把I/O線轉(zhuǎn)換到強上拉狀態(tài)。在強上拉方式下可以解決電流供應(yīng)不走的問題,因此也適合于多點測溫應(yīng)用,缺點就是要多占用一根I/O口線進行強上拉切換。   圖2.14 改進的寄生電源供電方式注意:在見圖2.13所示、見圖2.14所示寄生電源供電方

32、式中,DS18B20的VDD引腳必須接地。2.5.6 DS18B20外部電源供電方式DS18B20的外部電源供電方式見圖2.15所示,在外部電源供電方式下,DS18B20工作電源由VDD引腳接入,此時I/O線不需要強上拉,不存在電源電流不足的問題,可以保證轉(zhuǎn)換精度,同時在總線上理論可以掛接任意多。DS18B20傳感器,組成多點測溫系統(tǒng)。注意:在外部供電的方式下,DS18B20的GND引腳不能懸空,否則不能轉(zhuǎn)換溫度,讀取的溫度總是85。    圖2.15 外部供電方式單點測溫電路  在本次設(shè)計中采用外部電源供電方式,連接方法見圖2.16所示。圖2.16 設(shè)

33、計中采用的測溫電路直接將DS18B20的I/O口接在單片機的P22上,這樣在硬件方面就可以進行數(shù)據(jù)交流,從而達到溫度數(shù)據(jù)傳輸?shù)哪康摹?.5.7 DS18B20寄生電源供電方式外部供電方式的多點測溫電路圖見圖2.17所示,外部電源供電方式是DS18B20最佳的工作方式,工作穩(wěn)定可靠,抗干擾能力強,而且電路也比較簡單,可以開發(fā)出穩(wěn)定可靠的多點溫度監(jiān)控系統(tǒng)。站長推薦大家在開發(fā)中使用外部電源供電方式,畢竟比寄生電源方式只多接一根VCC引線。在外接電源方式下,可以充分發(fā)揮DS18B20寬電源電壓范圍的優(yōu)點,即使電源電壓VCC降到3V時,依然能夠保證溫度量精度。圖2.17 外部供電方式的多點測溫電路圖第3

34、章 系統(tǒng)軟件設(shè)計3.1 鍵盤輸入的程序while(temp!=0xf0)delay(5);P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0)temp=P3;switch(temp)case 0xed:num=0;break;case 0xdd:num=1;break;case 0xbd:num=2;break;case 0x7d:num=3;break;while(temp!=0xf0)temp=P3;temp=temp&0xf0;/*0000在這里使用了_crol_函數(shù),所以頭文件中要增加#include<intrins.h

35、>,這里包括去抖和松手檢測。經(jīng)過檢測以后通過不同的temp值,使num被賦予相應(yīng)的數(shù)值,這樣num就是要輸入的一個數(shù)字。3.2 DS18B20溫度傳感器設(shè)計連接好電路以后,就可以開始設(shè)計DS18B20的軟件環(huán)節(jié)。首先要初始化DS18B20以下為初始化程序。void dsstart() unsigned int i;ds=0; i=100; /拉低約800us, 符合協(xié)議要求的480us以上 while(i>0) i-; ds=1; /產(chǎn)生一個上升沿, 進入等待應(yīng)答狀態(tài) i=4;while(i>0) i-;然后延時等待,回應(yīng)。如以下子函數(shù)。void dswait()unsign

36、ed int i;while(ds); /等待應(yīng)答信號 while(ds); /檢測到應(yīng)答脈沖 i=4; while(i>0) i-;以下兩個子函數(shù)為讀取的數(shù)據(jù)時用到的??梢栽跍囟炔杉x取時調(diào)用。bit readbit()/讀取一個bitunsigned int i;bit b;ds=0;i+; /延時約8us, 符合協(xié)議要求至少保持1usds=1;i+;i+; /延時約16us, 符合協(xié)議要求的至少延時15us以上b=ds; i=8; while(i>0) i-; /延時約64us, 符合讀時隙不低于60us要求 return b;uchar readbyte()/讀取一個字節(jié)u

37、int b;uchar date,a;b=0;date=0;while(b<8)a=readbit();date=(a<<7)|(date>>1);b+;return date;以下為寫入命令程序。用于操控DS18B20。void writeor(uchar order)/寫入命令uint b;uchar a;bit bit2;b=0;for(a=0;a<8;a+)bit2=order&0x01;order>>=1;if(bit2)/寫入1ds=0;b+,b+;ds=1;for(b=0;b<8;b+);else/0ds=0;for(

38、b=0;b<8;b+);ds=1;b+;b+;當(dāng)以上程序書寫完成后,準備工作基本完成。現(xiàn)在只要調(diào)用這些函數(shù),來操控DS18B20使其能夠按協(xié)議規(guī)定將溫度數(shù)據(jù)傳送給單片機。軟件實施方法如下:void changetemp()/溫度轉(zhuǎn)變函數(shù)dsstart();dswait();delay(1);writeor(0xcc);/ 跳過讀序號列號的操作writeor(0x44);/ 啟動溫度轉(zhuǎn)換 delay(1);uint gettemp()/獲取溫度float tt;int temp;uchar geta,getb;dsstart();dswait();delay(1);writeor(0xcc

39、);writeor(0xbe);/讀取溫度命令delay(2);geta=readbyte();/讀取兩個字節(jié)getb=readbyte();temp=getb;temp<<=8;/左移8位temp=temp|geta;tt=temp*0.0625;/將temp中的數(shù)轉(zhuǎn)化成實際的溫度值temp=tt*10+(temp > 0 ? 0.5 : -0.5);/,變大十倍且 四舍五入return(temp);以上兩個程序流程為,changetemp()子函數(shù)中先初始化DS18B20,芯片應(yīng)答以后寫入兩個以字節(jié)為一個單位的命令,0xcc與0x44它們的作用分別為跳過讀序號列號的操作和

40、啟動溫度轉(zhuǎn)換。然后溫度獲取gettemp()子函數(shù)完成。在gettemp()子函數(shù)中首先也是初始化DS18B20、等待應(yīng)答,寫入命令0xcc跳過讀序號列號的操作和0xbe讀取溫度命令。使用readbyte()讀取兩個字節(jié)的數(shù)據(jù),分別賦予geta、getb兩個字符型變量,再將getb賦予temp(temp是一個整型變量擁有兩個字節(jié)的容量),這樣temp的低8為就是getb中的值了。temp<<=8的意義是temp=temp<<8,所以temp的低8位將變成temp中的高8位,而C語言規(guī)定低8移位操作后不足的位數(shù)由0補上,這時的目的就是要將geta中的數(shù)據(jù)賦予temp中的低

41、8位,只需要將temp按位與上geta,geta中位為1與上temp中低8位中的0就是1,而geta中位為0與temp中低8位的0相與就是0,這樣就將geta中的值賦給了temp的低8位?,F(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ù)點后一位的數(shù)擴大了十倍,變?yōu)榱艘粋€最高位為百位的三位數(shù),而后面加上的十一個四舍五入的賦值

42、語句,也就相當(dāng)是一個if語句,C語言是任何精度高的變量變?yōu)榫鹊偷淖兞繒r,都會失去一定的精度,而且是向下取整,例如在這里,如果tt是正溫度的話變大10倍以后,小數(shù)點后一位是無論是1還是9,都默認舍去,如果要對正數(shù)的tt進行四舍五入應(yīng)該先給tt加上0.5,再將它賦給精度較低的temp,這樣就可以有四舍五入的功能,而這里沒有這么簡單,這個if語句的還要考慮tt為負值的情況下的操作,如果temp為負值,tt變大10倍以后還要減去0.5,這樣就能夠完成tt為負值情況下的四舍五入。3.3 主函數(shù)的分析首先給出主函數(shù):void main()TMOD=0x01;TH0=(65536-46000)/256;T

43、L0=(65536-46000)%256;EA=1;ET0=1;TR0=1;zd=0;num=21;aaa=0;bbb=0;num1=21;num2=21;num3=21;while(1)uint a;uchar b;changetemp();a=gettemp();b=scanff();numy=gettemp();display(a,b);這里的aaa用于控制是否確定輸入的一個數(shù)字是需要的數(shù)字,bbb用于標記已經(jīng)輸入到了三個數(shù)字的第幾個數(shù)字。主函數(shù)首先將所用到的全局變量賦值,然后進入大循環(huán)首先進入溫度轉(zhuǎn)換函數(shù),使DS18B20啟動溫度轉(zhuǎn)換,然后獲取溫度將兩個字節(jié)的數(shù)值賦給a,而將輸入的溫度

44、賦予b ,再由display(a,b)子函數(shù)輸出所有的值。3.4 顯示函數(shù)的分析以下是display()函數(shù)的具體內(nèi)容。void display(uint a,uchar b)uchar i,temp,srtemp,dis4;uint dda;dda=abs(a);numx=dda/1000;num4=dda%1000/100;num5=dda%100/10;num6=dda%10;dis0=numx;dis1=num4;dis2=num5;dis3=num6;dis2+=10;/num5小數(shù)點if(dis0=0)&&(dis1=0)dis1=20;/如果百位和十位都為0 不顯

45、示if(a<0)/負值 后面加個小數(shù)點dis3+=10;elseif(dis0!=0)/超過100前面加小數(shù)點 dis1=dis1+10;temp=0xfb;for(i=1;i<4;i+)P0=0xff;wei=1;temp=_crol_(temp,1);P0=temp;wei=0;P0=0;duan=1;P0=tabledisi;duan=0;delay(3);duan=1;P0=0x00;duan=0;if(aaa=1&&ccc!=21)bbb+;switch(bbb)case 0:dis1=b;num1=b;dis2=num2;dis3=num3;if(dis

46、2=21)dis2+;elsedis2+=10;srtemp=0xfe;for(i=1;i<4;i+)P0=0xff;wei=1;P0=srtemp;/wein打開后 是低電平亮wei=0;/srtemp=_crol_(srtemp,1);P0=0x00;duan=1;P0=tabledisi;duan=0;delay(1);duan=1;P0=0x00;duan=0;break;case 1:dis1=num1;dis2=b;num2=b;dis3=num3;if(dis2=21)dis2+;elsedis2+=10;srtemp=0xfe;for(i=1;i<4;i+)P0=0

47、xff;wei=1;P0=srtemp;/wein打開后 是低電平亮wei=0;/srtemp=_crol_(srtemp,1);P0=0x00;duan=1;P0=tabledisi;duan=0;delay(1);duan=1;P0=0x00;duan=0;aaa=0;break;case 2:dis1=num1;dis2=num2;dis3=b;num3=b;if(dis2=21)dis2+;elsedis2+=10;srtemp=0xfe;for(i=1;i<4;i+)P0=0xff;wei=1;P0=srtemp;/wein打開后 是低電平亮wei=0;/srtemp=_cro

48、l_(srtemp,1);P0=0x00;duan=1;P0=tabledisi;duan=0;delay(1);duan=1;P0=0x00;duan=0;aaa=0;break;case 3:dis1=num1;dis2=num2;dis3=num3;if(dis2=21)dis2+;elsedis2+=10;srtemp=0xfe;for(i=1;i<4;i+)P0=0xff;wei=1;P0=srtemp;/wein打開后 是低電平亮wei=0;/srtemp=_crol_(srtemp,1);P0=0x00;duan=1;P0=tabledisi;duan=0;delay(1)

49、;duan=1;P0=0x00;duan=0;aaa=0;num=21;break;default:bbb=0;break;首先要清楚a是DS18B20芯片獲取的溫度,b是需要輸入的溫度,也就是要求的水溫。在這里用到了abs(a)和_crol_所以要在再頭文件中寫到#include <math.h>和#include<intrins.h>,dda用于防止a為負值的時候后面的操作不好完成。分別將dda的千位、百位、十位、個位取出存放在Numx,num1,num2,num3中。dis4是用來方便for語句的賦值操作。這里顯示時需要考慮DS18B20采集的數(shù)據(jù)中的各種情況,第

50、一:超過了100度。第二:正常的十幾度或者幾十度。第三:只有幾度沒有超過十度。第四溫度為負值。if(dis0=0)&&(dis1=0)dis1=20;/如果百位和十位都為0 不顯示上面這一句話,就是地三種情況。if(a<0)/負值 后面加個小數(shù)點dis3+=10;elseif(dis0!=0)/超過100前面加小數(shù)點 dis1=dis1+10;上面這句話就是第一種和第四種情況的描述。第二種情況是正常使用的情況,直接將dis1 、dis2、 dis3寫出來即可。ccc的作用是防止出現(xiàn)什么都不輸入直接確認給程序帶來的bug,出現(xiàn)這種情況時系統(tǒng)不做其他的任何反應(yīng),保持在這時的輸

51、入狀態(tài),直到用戶輸入了一個數(shù)字為止。ccc的功能才會解除。這里鍵盤輸入溫度的數(shù)碼管顯示使用的是switch(bbb)語句完成的,bbb共有0、1、2、3,這四種情況,bbb等于0時是無任何輸入的情況,bbb等于1時是輸入了需要溫度的十位,bbb等于2時是輸入了需要溫度的個位,bbb等于3時是輸入了需要溫度的小數(shù)點后一位,這里沒有超過100度和低于0度的設(shè)計。這里基本上就是完成給定了數(shù)字,通過數(shù)字值為多少來設(shè)定數(shù)碼管顯示的數(shù)字,在第三章中已經(jīng)提到。這里要注意的是每次都要將aaa清零,因為aaa為1時,輸入子函數(shù)uchar scanff()的返回值變?yōu)橐粋€使數(shù)碼管顯示一個下劃線的數(shù)值,aaa為0時鍵盤可以通過uchar scanff()向數(shù)碼管顯示0-9中的任何一個數(shù)值。這樣是防止前一個數(shù)字的輸入完成以后,后一個數(shù)字還未輸入時,顯示后一個數(shù)字的數(shù)碼管默認不在顯示下劃線而是前一個確認的數(shù)字,為了防止這種情況才有了aaa的以上操作。3.5 中斷加熱子函數(shù)的分析以下是程序:void timer0() interrupt 1int a;TH0=(65536-46000)/256;TL0=(65536-46000)%256;zd+;if(zd=6)zd=0;a=num1*100+num2*10+num3;if(a>=numy&&num1!=21&a

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論