2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  畢業(yè)設計(論文)</b></p><p>  基于51單片機的家用電熱水器設計</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ù)字化,因老式的熱水器使用煤氣或天然氣對水進行燃燒加熱,用手動的方式調節(jié)溫度,不僅不能夠精確的確定使用者需要的水溫,而且還存在一定的危險性。</p><p>  電熱水器是一種可供浴室、洗手間及廚房使用的家用電器,隨著人們生活質量的提高,現(xiàn)代的家用電熱水器已經(jīng)摒棄了以前的做法,而采用一種更加精確、安

3、全的實施方案。</p><p>  C語言對單片機編程有諸多優(yōu)點,例如:便于移植、句法檢查時錯誤少、堅固性好、頭文件種類諸多,能夠方便快捷使用各種函數(shù)等。</p><p>  本文采用 AT 89C 52 單片機作為控制器,使用C語言編寫程序,設計了一款智能家用電熱水器。使用陣型鍵盤輸入溫度,溫度可以精確到0.1攝氏度,并使用LED燈顯示,能夠精確提供用戶所需溫度的溫水。采用DS18B20

4、采集溫度,使用LED燈顯示,精確的顯示出采集的水溫。當所需溫度高于當前采集的水溫時,使用MOC3041芯片觸發(fā)加熱,當所需溫度低于當前采集的水溫時,則停止加熱?;緦崿F(xiàn)了智能控制功能。</p><p>  關鍵詞:單片機;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)硬件設計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 鍵盤輸入設計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技術性能與應用范圍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、設計20</p><p>  3.1 鍵盤輸入的程序20</p><p>  3.2 DS18B20溫度傳感器設計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章 總結與展望38</p><p><b>  附錄 程序41</b></p><p><b>  第1章 緒論</b

11、></p><p>  單片機是一種與我們生活息息相關的控制器,它存在于許多地方,例如:電子手表、掌上游戲機、數(shù)碼相機、錄音筆、電視機遙控器等等。單片機主要由中央處理器、內存、輸入/輸出設備組成,它就好像是一臺小型電腦,它能夠執(zhí)行人們對它編寫的程序,從而發(fā)出各種不同的控制命令,與外部電路結合后,便可以完成各種各樣的功能。通過單片機人們的生活將會變得更加方便、快捷。</p><p> 

12、 1.1 家用電熱水器的現(xiàn)狀</p><p>  我們的生活電熱水器是一種可供浴室、洗手間及廚房使用,按照人們的需要的溫度,提供溫水的家用電器。市場上傳統(tǒng)的機械式電熱水器控制精度低、可靠性差,甚至存在一定的危險隱患。隨著社會的發(fā)展、人們生活質量的提高,人們對電熱水器的要求越來越趨向于智能化和數(shù)字化,這種老式而簡單的電熱水器已經(jīng)不能夠滿足人們的需要了。而智能化家用電熱水器正是適應現(xiàn)代化智能家用電器趨勢而出現(xiàn)。它能提

13、供用戶方便快捷的數(shù)字化輸入方式,并且能精確的采集和控制環(huán)境中的水溫,將其提供給用戶,因此備受人們的關注。</p><p>  1.2 TX-1C單片機實驗開發(fā)板簡介</p><p>  XT-1C單片機開發(fā)板是哈爾濱市天祥電子綜合多年開發(fā)經(jīng)驗,在原TX-1B基礎上,經(jīng)過精心設計開發(fā)出的多功能51單片機開發(fā)平臺。該開發(fā)板集常用的單片機外圍資源、串口和USB口兩種調試下載接口于一身,完全兼容A

14、TMEL公司的51單片機,除此之外還有很多特點,如:無法解密、低功耗、高速、高可靠、強抗靜電、強抗干擾等。</p><p>  TX系列單片機開發(fā)板可完全作為各種51單片機的開發(fā)板,用匯編語言或者C語言對其進行編程。當用STC公司的單片機時,直接用產(chǎn)品套件附帶的串口線將開發(fā)板與計算機串口相連,按照STC單片機下載操作教程便可以下載程序,而且下載速度比起其他下載工具要快的多。本文將使用TX-1C開發(fā)板完成數(shù)字化電熱

15、水器的設計。</p><p>  第2章 系統(tǒng)硬件設計</p><p>  2.1 系統(tǒng)硬件的組成部分</p><p>  系統(tǒng)設計硬件原理結構見圖2.1所示。系統(tǒng)以高性價比的AT89C51單片機為核心,由鍵盤輸入、DS18B20溫度采集、數(shù)碼管顯示電路、電源時鐘復位電路、雙向可控硅驅動電路MOC3041、雙向可控硅TLC336A組成加熱器控制電路。 </p&

16、gt;<p>  圖2.1 系統(tǒng)設計硬件原理結構</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>  時鐘復位電路見圖2.2所示,RET連接單片機的RESET接口,主要完成單片機的復位功能。</p><p>  圖2.2 時鐘復位電路</p><p>  溫度采集芯片由DS18B20芯片完成,DS18B20的2號接口接在單片機的P2^2口,按協(xié)議傳送以兩個字節(jié)為一組的溫度數(shù)據(jù),第3章會介紹具體實現(xiàn)方法

18、。</p><p>  加熱模塊見圖2.3所示,MOC3041芯片的2號接口連接單片機的P2^2口。當需要加熱時,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顯示器有兩種顯示結構:段顯示(7段、米字型等)和點陣顯示(5×8、8×8點陣等)。</p><p>

20、  使用LED顯示器時,要注意區(qū)分這兩種不同的接法。為了顯示數(shù)字或字符,必須對數(shù)字或字符進行編碼。七段數(shù)碼管加上一個小數(shù)點,共計8段。因此為LED顯示器提供的編碼正好是一個字節(jié)。本設計采用的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端對應的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ù)字的十六進制,即P0口應賦的十六進制,以便操作。如以上數(shù)組,使

25、用時僅僅將需要的數(shù)組中的其中一個賦予P0口,這樣可以方便直觀得使數(shù)碼管顯示需要的數(shù)字。</p><p>  選擇位選與選擇片選的過程相當快時,顯示在人眼中就是一排易于識別的十進制數(shù)字,這就是數(shù)碼管的動態(tài)顯示。</p><p>  2.3.3 鎖存器與數(shù)碼管顯示方法</p><p>  在這里先介紹74HC573芯片,這是一個鎖存器芯片,連接方法見圖2.5所示, P2

26、^7、P2^6分別控制位選和段選的L端,例如:當P2^7(程序中的全局變量wei)賦高電平時,74HC573輸入端口的值將直接輸送給74HC573芯片的輸出端,當輸入端變化時,輸出端也變化。P2^7賦低電平時, 74HC573芯片將記住最近一次L端口是高電平時芯片輸入端的8位,并將其輸出,當輸入端變化時,輸出端不變化。在這里就可以利用鎖存器的特性使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,就會導致段選打開后,還未賦予段選P0口需要的數(shù)值之前,這段時間內

31、P0口將剛才位選的8位值賦予了段選鎖存器,這樣就會在極短的時間內,一些不需要的LED燈點亮,在單片機上就是由LED燈微微亮的情況,所以在這里注意每次P0對位選賦值以前,都應該保證P0口為0x00。</p><p>  2.4 鍵盤輸入設計</p><p>  2.4.1 鍵盤輸入方法</p><p>  本設計中使用的是矩陣式鍵盤,見圖2.6所示。</p>

32、;<p>  圖2.6 矩陣式鍵盤</p><p>  S10到S19分別代表數(shù)字0到9。S20代表確認數(shù)字,按下后即可確認要輸入數(shù)字的某一位。</p><p>  左側鍵盤的引腳由上至下分別是P3^0到P3^7,第一行暫時不用,從第二行開始使用,每一行如P3^1都與P3^4、 P3^5、 P3^6 、P3^7,他們是線與的關系。因此可以如此操作,對圖中第二行、第三行、第四行

33、諸行進行掃描。掃描第一行時P3口賦值為0xfd,即為P3^1口賦“0”,P3的其他口賦“1”,當?shù)诙袥]有按鍵按下時P3^4、 P3^5、 P3^6 、P3^7將都是高電平“1”,一旦有按鍵按下時,由于線與關系,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)鍵盤的掃描,但是理論與實際還是有一定的差距,當按下鍵盤到檢測到有電壓變化,這段時間在實際中是存在一定的時間誤差的,經(jīng)過這段時間誤差后電壓才會達到單片能夠檢測到的范圍,但這期間單片機很有可能已經(jīng)完成檢測,見圖2.7所示。</p><p>  圖2.7 抖動示意圖</p><p>  如果不去除抖動

35、的話,人們手指按下的瞬間單片機已經(jīng)開始檢測,這時電壓還未降到穩(wěn)定閉合狀態(tài)所以不能檢測到按下,同理不管是按下,還是是松手都會有這樣的情況出現(xiàn),不利于操作,所以應該加入去抖操作,圖中右側是硬件去除抖動,除了硬件去抖以外還可以利用軟件去抖。</p><p>  在本設計中采用軟件去抖的方法,原理是檢測兩次,第一次檢測到低電平時延時一段時間,再檢測一次,如果還能檢測到低電平,則說明確實有鍵按下。具體程序如下:</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技術性能與應用范圍</p><p>  圖2.8 DS18B20的外形及管腳圖</p><p>  DS18B20是一種可組網(wǎng)數(shù)字溫度傳感器芯片,具有耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設備數(shù)字測溫和控制領域。&

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。在使用中不需要任何外圍元件,測量結果以9~12位

40、數(shù)字量方式串行傳送。不銹鋼保護管直徑Φ6,適用于DN15~25, DN40~DN250各種介質工業(yè)管道和狹小空間設備測溫,標準安裝螺紋 M10X1, M12X1.5, G1/2”任選,PVC電纜直接出線或德式球型接線盒出線,便于與其它電器設備連接。</p><p>  負壓特性:電源極性接反時,芯片不會因發(fā)熱而燒毀, 但不能正常工作。DS18B20內部結構主要由四部分組成:64位光刻ROM 、溫度傳感器、非揮發(fā)的

41、溫度報警觸發(fā)器TH和TL、配置寄存器。DS18B20的外形及管腳排列見圖2.8所示。</p><p>  該產(chǎn)品適用于冷凍庫,糧倉,儲罐,電訊機房,電力機房,電纜線槽等測溫和控制領域、軸瓦,缸體,紡機,空調,等狹小空間工業(yè)設備測溫和控制、供熱/制冷管道熱量計量,中央空調分戶熱能計量和工業(yè)領域測溫和控制、汽車空調、冰箱、冷柜、以及中低溫干燥箱等。</p><p>  2.5.2 DS18B2

42、0的初始化與讀寫操作</p><p>  1. DS18B20的初始化</p><p> ?。?) 先將數(shù)據(jù)線置高電平“1”; </p><p> ?。?) 延時(該時間要求的不是很嚴格,但是盡可能的短一點);</p><p> ?。?) 數(shù)據(jù)線拉到低電平“0”; </p><p>  (4) 延時750微秒(該時間的

43、時間范圍可以從480到960微秒); </p><p> ?。?) 數(shù)據(jù)線拉到高電平“1”; </p><p> ?。?) 延時等待(如果初始化成功則在15到60毫秒時間之內產(chǎn)生一個由DS18B20所返回的低電平“0”。據(jù)該狀態(tài)可以來確定它的存在,但是應注意不能無限的進行等待,不然會使程序進入死循環(huán),所以要進行超時控制); </p><p> ?。?) 若CPU讀到

44、了數(shù)據(jù)線上的低電平“0”后,還要做延時,其延時的時間從發(fā)出的高電平算起(第(5)步的時間算起)最少要480微秒; </p><p>  (8) 將數(shù)據(jù)線再次拉高到高電平“1”后結束。</p><p>  DS18B20的的初始化見圖2.9所示。</p><p>  圖2.9 DS18B20的的初始化</p><p>  2. DS18B20的

45、寫操作</p><p> ?。?) 數(shù)據(jù)線先置低電平“0”; </p><p> ?。?) 延時確定的時間為15微秒; </p><p>  (3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位); </p><p>  (4) 延時時間為45微秒; </p><p> ?。?) 將數(shù)據(jù)線拉到高電平; </p&g

46、t;<p> ?。?) 重復上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止; </p><p> ?。?) 最后將數(shù)據(jù)線拉高。</p><p>  在這里要注意的是(3),寫數(shù)據(jù)時時1bit單獨傳送,這里有兩種情況。</p><p>  當需要傳送“1”時,單片機應該給DS18B20芯片的DQ接口賦低電平,大約15秒以后,將DQ釋放為高電平,延時約

47、45微妙即可。</p><p>  當需要傳送“0”時,單片機應該給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位轉化后得到的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溫度傳感器的內部存儲器包括一個高速暫存RAM和一

52、個非易失性的可電擦除的EEPRAM,后者存放高溫度和低溫度觸發(fā)器 TH、TL和結構寄存器。配置寄存器,該字節(jié)各位的意義見表2.2所示。</p><p>  表2.2 配置寄存器結構</p><p>  高速暫存存儲器由9個字節(jié)組成。其分配見表2.3所示,當溫度轉換命令發(fā)布后,經(jīng)轉換所得的溫度值以二字節(jié)補碼形式存放在高速暫存存儲器的第0和第1個字節(jié)。單片機可通過單線接口讀到該數(shù)據(jù),讀取時低

53、位在前,高位在后。對應的溫度計算:當符號位S=0時,直接將二進制位轉換為十進制;當S=1時,先將補碼變?yōu)樵a,再計算十進制值。第九個字節(jié)是冗余檢驗字節(jié)。 </p><p>  表2.3 DS18B20暫存寄存器分布</p><p>  根據(jù)DS18B20的通訊協(xié)議,主機(單片機)控制DS18B20完成溫度轉換必須經(jīng)過三個步驟:每一次讀寫之前都要對DS18B20進行復位操作,復位成功后發(fā)送一

54、條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18B20進行預定的操作。復位要求主CPU將數(shù)據(jù)線下拉500微秒,然后釋放,當DS18B20收到信號后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收到此信號表示復位成功。 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幾個不同應用方式下的 測溫電路圖:</p><p>  DS18B20寄生電源供電方式電路圖,見圖2.13所示,在寄生電源供電方式下,DS18B20從單線信號線上汲取能量:在信號線DQ

56、處于高電平期間把能量儲存在內部電容里,在信號線處于低電平期間消耗電容上的電能工作,直到高電平到來再給寄生電源(電容)充電。 </p><p>  獨特的寄生電源方式有三個好處: </p><p>  1. 進行遠距離測溫時,無需本地電源;</p><p>  2. 可以在沒有常規(guī)電源的條件下讀取ROM;</p><p>  3. 電路更加簡潔

57、,僅用一根I/O口實現(xiàn)測溫。 </p><p>  要想使DS18B20進行精確的溫度轉換,I/O線必須保證在溫度轉換期間提供足夠的能量,由于每個DS18B20在溫度轉換期間工作電流達到1mA,當幾個溫度傳感器掛在同一根I/O線上進行多點測溫時,只靠4.7K上拉電阻就無法提供足夠的能量,會造成無法轉換溫度或溫度誤差極大。 </p><p>  因此,這種電路只適應于單一溫度傳感器測溫情況下

58、使用,不適宜采用供電系統(tǒng)中。并且工作電源VCC必須保證在5V,當電源電壓下降時,寄生電源能夠汲取的能量也降低,會使溫度誤差變大。 </p><p>  圖2.13 DS18B20寄生電源供電方式</p><p>  2.5.5 DS18B20改進的寄生電源供電方式</p><p>  DS18B20寄生電源強上拉供電方式電路圖,改進的寄生電源供電方式見圖2.14所示

59、,為了使DS18B20在動態(tài)轉換周期中獲得足夠的電流供應,當進行溫度轉換或拷貝到E2存儲器操作時,用MOSFET把I/O線直接拉到VCC就可提供足夠的電流,在發(fā)出任何涉及到拷貝到E2存儲器或啟動溫度轉換的指令后,必須在最多10μS內把I/O線轉換到強上拉狀態(tài)。在強上拉方式下可以解決電流供應不走的問題,因此也適合于多點測溫應用,缺點就是要多占用一根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、源電流不足的問題,可以保證轉換精度,同時在總線上理論可以掛接任意多。DS18B20傳感器,組成多點測溫系統(tǒng)。注意:在外部供電的方式下,DS18B20的GND引腳不能懸空,否則不能轉換溫度,讀取的溫度總是85℃。 </p><p>  圖2.15 外部供電方式單點測溫電路</p><p>  在本次設計中采用外部電源供電方式,連接方法見圖2.16所示。</p><p>

62、;  圖2.16 設計中采用的測溫電路</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)軟件設計</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被賦予相應的數(shù)值,這樣num就是要輸入的一個數(shù)字。</p>

70、<p>  3.2 DS18B20溫度傳感器設計</p><p>  連接好電路以后,就可以開始設計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)生一個上升沿, 進入等待應答狀態(tài) </p><p&g

72、t;<b>  i=4;</b></p><p>  while(i>0) i--;</p><p><b>  }</b></p><p>  然后延時等待,回應。如以下子函數(shù)。</p><p>  void dswait()</p><p><b>  {

73、</b></p><p>  unsigned int i;</p><p>  while(ds); //等待應答信號</p><p>  while(~ds); //檢測到應答脈沖</p><p><b>  i=4;</b></p><p>  while(i>0)

74、i--;</p><p><b>  }</b></p><p>  以下兩個子函數(shù)為讀取的數(shù)據(jù)時用到的??梢栽跍囟炔杉x取時調用。</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>  當以上程序書寫完成后,準備工作基本完成?,F(xiàn)在只要調用這些函數(shù),來操控DS18B20使其能夠按協(xié)議規(guī)定將溫度數(shù)據(jù)傳送給單片機。軟件實施方法如下:</p><p>  void changetem

86、p()//溫度轉變函數(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);// 啟動溫度轉換 </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ù)轉化成實際的溫度值</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,芯片應答以后寫入兩個以字節(jié)為一個單位的命令,0xcc與0x44它們的作用分別為跳過讀序號列號的操作和啟動溫度轉換。然后溫度獲取gettemp()子函數(shù)完成。在gettemp()子函數(shù)中首先也是初始化DS18B20、等待應答,寫入命令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ù),而后面加上的十一個四舍五入的賦值語句,也就相當是一個if語句,C語言是任何精度高的變量變?yōu)榫鹊偷淖兞繒r,都會失去一定的精度,而且是向下取整,例如在這里,如果tt是正溫度的話變大10倍以后,小數(shù)點后一位是無論是1還是9,都默認舍去,如果要對正數(shù)的tt進行四舍五入應該先給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用于標記已經(jīng)輸入到

101、了三個數(shù)字的第幾個數(shù)字。</p><p>  主函數(shù)首先將所用到的全局變量賦值,然后進入大循環(huán)首先進入溫度轉換函數(shù),使DS18B20啟動溫度轉換,然后獲取溫度將兩個字節(jié)的數(shù)值賦給a,而將輸入的溫度賦予b ,再由display(a,b)子函數(shù)輸出所有的值。</p><p>  3.4 顯示函數(shù)的分析</p><p>  以下是display()函數(shù)的具體內容。<

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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論