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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論