單片機課程設(shè)計數(shù)字溫度計_第1頁
已閱讀1頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  前 言</b></p><p>  單片機技術(shù)作為計算機技術(shù)的一個分支,廣泛地應(yīng)用于工業(yè)控制,智能儀器儀表,機電一體化產(chǎn)品,家用電器等各個領(lǐng)域?!皢纹瑱C原理與應(yīng)用”在工科院校各專業(yè)中已作為一門重要的技術(shù)基礎(chǔ)課而普遍開設(shè)。學(xué)生在課程設(shè)計,畢業(yè)設(shè)計,科研項目中會廣泛應(yīng)用到單片機知識,而且,進入社會后也會廣泛接觸到單片機的工程項目。鑒于此,提高“單片機原理及應(yīng)用”課的

2、教學(xué)效果,讓學(xué)生參與課程設(shè)計實習(xí)甚為重要。單片機應(yīng)用技術(shù)涉及的內(nèi)容十分廣泛,如何使學(xué)生在有限的時間內(nèi)掌握單片機應(yīng)用的基本原理及方法,是一個很有價值的教學(xué)項目。為此,我們進行了“單片機的學(xué)習(xí)與應(yīng)用”方面的課程設(shè)計,鍛煉學(xué)生的動腦動手以及協(xié)作能力。</p><p>  單片機課程設(shè)計是針對模擬電子技術(shù),數(shù)字邏輯電路,電路,單片機的原理及應(yīng)用課程的要求,對我們進行綜合性實踐訓(xùn)練的實踐學(xué)習(xí)環(huán)節(jié),它包括選擇課設(shè)任務(wù)、軟件設(shè)

3、計,硬件設(shè)計,調(diào)試和編寫課設(shè)報告等實踐內(nèi)容。通過此次課程設(shè)計實現(xiàn)以下三個目標(biāo):第一,讓學(xué)生初步掌握單片機課程的試驗、設(shè)計方法,即學(xué)生根據(jù)設(shè)計要求和性能約束,查閱文獻資料,收集、分析類似的相關(guān)題目,并通過元器件的組裝調(diào)試等實踐環(huán)節(jié),使最終硬件電路達到題目要求的性能指標(biāo);第二,課程設(shè)計為后續(xù)的畢業(yè)設(shè)計打好基礎(chǔ),畢業(yè)設(shè)計是系統(tǒng)的工程設(shè)計實踐,而課程設(shè)計的著眼點是讓學(xué)生開始從理論學(xué)習(xí)的軌道上逐漸引向?qū)嶋H運用,從已學(xué)過的定性分析、定量計算的方法,

4、逐步掌握工程設(shè)計的步驟和方法,了解科學(xué)實驗的程序和實施方法。第三,培養(yǎng)學(xué)生勤于思考樂于動手的習(xí)慣,同時通過設(shè)計并制作單片機類產(chǎn)品,使學(xué)生能夠自己不斷地學(xué)習(xí)接受新知識(如在本課設(shè)題目中存在智能測溫器件DS18B20,就是課堂環(huán)節(jié)中不曾提及的“新器件”),通過多人的合作解決現(xiàn)實中存在的問題,從而不斷地增強學(xué)生在該方面的自信心及興趣,也提高了學(xué)生的動手能力,對學(xué)生以后步入社會參加工作打下一定良好的實踐基礎(chǔ)。</p><p&

5、gt;  摘要:隨著時代的進步和發(fā)展,單片機技術(shù)已經(jīng)普及到我們生活,工作,科研,各個領(lǐng)域,已經(jīng)成為一種比較成熟的技術(shù),單片機具有體積小、功耗低、控制功能強、擴展靈活、微型化和使用方便等優(yōu)點,廣泛應(yīng)用于儀器儀表中,結(jié)合不同種類的傳感器,可實現(xiàn)諸如電壓、濕度、溫度、速度、硬度、壓力等的物理量的測量。本文將介紹一種基于單片機控制理論及其應(yīng)用系統(tǒng)設(shè)計的數(shù)字溫度計。</p><p>  本文主要介紹了一個基于AT89C51

6、單片機的測溫系統(tǒng),詳細描述了利用數(shù)字溫度傳感器DS18B20開發(fā)測溫系統(tǒng)的過程,重點對傳感器在單片機喜愛的硬件連接,軟件編程以及各模塊系統(tǒng)流程進行了詳盡分析,對各部分的電路也進行一一介紹,該系統(tǒng)可以方便的是實現(xiàn)溫度采集和顯示,并可以根據(jù)需要任意設(shè)定上下限報警溫度,它使用起來方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優(yōu)點,適合我們?nèi)粘I詈凸まr(nóng)業(yè)生產(chǎn)中的溫度測量,也可以當(dāng)做溫度處理模塊嵌入其他系統(tǒng)中,作為其他主系統(tǒng)的輔助擴展。D

7、S18B20和AT89C51結(jié)合實現(xiàn)最簡溫度檢測系統(tǒng),該系統(tǒng)結(jié)構(gòu)簡單,抗干擾能力強,適合與惡劣環(huán)境下進行現(xiàn)場溫度測量,有廣泛的應(yīng)用前景。</p><p>  本設(shè)計首先是確定目標(biāo),氣候是各個功能模塊的設(shè)計,再在Proteus軟件上進行仿真,修改,仿真。</p><p>  本溫度計屬于多功能溫度計,可以設(shè)置上下報警溫度,當(dāng)溫度不在設(shè)置范圍內(nèi)時,可以報警。 </p><p

8、>  關(guān)鍵詞:單片機,數(shù)字控制,溫度計, DS18B20,AT89C51</p><p><b>  目 錄</b></p><p>  前言…………………………………………………………………………………………1</p><p>  摘要…………………………………………………………………………………………3</p><

9、p>  關(guān)鍵字………………………………………………………………………………………3</p><p>  一.單片機簡介………………………………………………………………………………5</p><p>  1.1單片機的應(yīng)用…………………………………………………………………………5</p><p>  1.2單片機的開發(fā)過程……………………………………………………

10、………………6</p><p>  二、設(shè)計方案…………………………………………………………………………………6</p><p>  2.1設(shè)計任務(wù)和要求………………………………………………………………………6</p><p>  2.2方案辯證………………………………………………………………………………7</p><p>  1溫度計軟件設(shè)

11、計流程圖………………………………………………………………7</p><p>  2元器件的選取…………………………………………………………………………7</p><p>  3系統(tǒng)最終設(shè)計方案……………………………………………………………………8</p><p>  三、設(shè)計方案的總體設(shè)計框圖……………………………………………………………8</p>&

12、lt;p>  3.1硬件電路框圖…………………………………………………………………………8</p><p>  3.2硬件電路概述…………………………………………………………………………9</p><p>  3.3主控電路………………………………………………………………………………9</p><p>  3.4顯示電路……………………………………………………

13、…………………………10</p><p>  3.5報警溫度調(diào)節(jié)電路……………………………………………………………………10</p><p>  3.6溫度傳感器及 DS18B20測溫原理…………………………………………………11</p><p>  四、系統(tǒng)軟件算法設(shè)計………………………………………………………………15</p><p>

14、  4.1主程序…………………………………………………………………………………15</p><p>  4.2讀出溫度子程序………………………………………………………………………16</p><p>  4.3溫度轉(zhuǎn)換命令子程序…………………………………………………………………17</p><p>  4.4 計算溫度子程序………………………………………………………

15、………………17</p><p>  4.5 顯示數(shù)據(jù)刷新子程序…………………………………………………………………17</p><p>  4.6 1602的液晶顯示……………………………………………………………………18</p><p>  五、軟件仿真………………………………………………………………………………18</p><p>  

16、5.1系統(tǒng)仿真設(shè)計…………………………………………………………………………18</p><p>  5.2系統(tǒng)原理圖……………………………………………………………………………19</p><p>  結(jié)與體會……………………………………………………………………………………20</p><p>  附錄………………………………………………………………………………………

17、……21</p><p>  參考文獻………………………………………………………………………………………29</p><p><b>  二、設(shè)計方案</b></p><p>  2.1設(shè)計務(wù)任和要求</p><p>  1、基本范圍-20℃——125℃</p><p>  2、精度誤差小于0.5

18、℃</p><p>  3、LED 數(shù)碼直讀顯示</p><p>  4、可以任意設(shè)定溫度的上下限報警功能.</p><p><b>  2.2方案辯證</b></p><p>  1溫度計軟件設(shè)計流程圖: </p><p><b>  2元器件的選?。?lt

19、;/b></p><p><b>  單片機芯片的選?。?lt;/b></p><p><b>  方案一.</b></p><p>  采用89C51芯片作為硬件核心,利用Flash ROM,內(nèi)部具有4KB ROM 存儲空間,能于3V的超低壓工作,而且與MCS-51系列單片機完全兼容,但是運用于電路設(shè)計中時由于不具備IS

20、P在線編程技術(shù), 當(dāng)在對電路進行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,對芯片的多次拔插會對芯片造成一定的損壞。</p><p><b>  方案二:</b></p><p>  采用AT89C51單片機與MCS-51系列單片機相比有兩大優(yōu)勢:第一,片內(nèi)程序存儲器采用閃存,使程序的寫入更加方便;第二,提供了更小尺寸的芯片,使整個硬件電路的體積更小,

21、且管腳數(shù)目為20個,與MCS-51相比減少一倍,使理解更容易。</p><p>  綜上所述:本課設(shè)中單片機芯片采用AT89C51。</p><p><b>  溫度傳感器的選?。?lt;/b></p><p><b>  方案一:</b></p><p>  采用熱敏電阻傳感器。利用熱敏電阻隨溫度變化而

22、顯著變化,能直接將溫度的變化轉(zhuǎn)換為能量的變化,進而制成溫度計。但是其測溫傳感器比較復(fù)雜,而且不易通過編制程序來控制測溫精度,增大系統(tǒng)設(shè)計的難度。</p><p><b>  方案二:</b></p><p>  采用DS18B20溫度傳感器。DS18B20的內(nèi)部3腳(或8腳)封裝;使用特有的溫度測量技術(shù),將被測溫度轉(zhuǎn)換成數(shù)值信號;3.0~5.5V的電源供電方式和寄生電

23、源供電方式;ROM由64位二進制數(shù)字組成,共分為8個字節(jié);RAM由9個字節(jié)的高速暫存器和非易失性電擦寫ROM組成。</p><p>  綜上所述:溫度傳感器選取智能測溫器件DS18B20。</p><p>  本設(shè)計顯示電路采用1602液晶顯示模塊芯片。</p><p>  3系統(tǒng)最終設(shè)計方案:</p><p>  綜上各方案所述,對此次課設(shè)

24、的方案選定: 采用AT89C51作為主控制系統(tǒng); 1602液晶顯示模塊芯片作為溫度數(shù)據(jù)顯示裝置;而智能溫度傳感器DS18B20器件作為測溫電路主要組成部分。至此,系統(tǒng)最終方案確定。</p><p>  三、設(shè)計方案的總體設(shè)計框圖</p><p>  溫度計電路設(shè)計總體設(shè)計方框圖如圖所示,控制器采用單片機AT89C51,溫度傳感器采用DS18B20,用1602液晶顯示屏以串口傳送數(shù)據(jù)實現(xiàn)溫度

25、顯示。</p><p>  3.1硬件電路框圖:</p><p><b>  圖 總體設(shè)計方框圖</b></p><p>  3.2硬件電路概述:</p><p>  系統(tǒng)由單片機最小系統(tǒng)、顯示電路、按鍵、溫度傳感器等組成。</p><p>  本電路是由AT89C2051單片機為控制核心,具有與

26、MCS-51系列單片機完全兼容,程序加密等功能,帶2KB字節(jié)可編程閃存,工作電壓范圍為2.7~6V,全靜態(tài)工作頻率為0~24MHZ;顯示電路由1602液晶顯示模塊芯片,可以進行多行顯示;溫度報警按鍵設(shè)為五個,可以顯示華氏溫度,調(diào)節(jié)高低報警溫度;溫度傳感器電路主要由DS18B20測溫器件構(gòu)成,該器件主要功能有:采用單總線技術(shù);每只DS18B20具有一個獨立的不可修改的64位序列號;低壓供電,電源范圍為3~5V;測溫范圍為-20℃~+125

27、℃,誤差為±0.5℃;復(fù)位電路是10K電阻構(gòu)成的上電自動復(fù)位。</p><p><b>  3.3主控電路</b></p><p>  單片機AT89C51 具有低電壓供電和體積小等特點,四個端口只需要兩個口就能滿足電路系統(tǒng)的設(shè)計需要,很適合便攜手持式產(chǎn)品的設(shè)計使用系統(tǒng)可用二節(jié)電池供電。晶振采用12MHZ。復(fù)位電路采用上電加自動復(fù)位。</p>

28、<p>  主控芯片AT89C51</p><p><b>  晶振電路 </b></p><p><b>  復(fù)位電路</b></p><p><b>  3.4顯示電路</b></p><p>  本設(shè)計顯示電路采用1602液晶顯示模塊芯片,該芯片可現(xiàn)實16x2個

29、字符,比以前的七段數(shù)碼管LED顯示器在顯示字符的數(shù)量上要多得多。另外,由于1602芯片編程比較簡單,界面直觀,因此更加易于使用者的操作和觀測。1602A芯片的接口信號說明如下表:</p><p>  1602A芯片的接口信號說明</p><p><b>  圖 液晶顯示電路</b></p><p>  3.5報警溫度調(diào)節(jié)電路</p>

30、;<p>  本系統(tǒng)一共設(shè)置了五個按鍵,k1鍵只是顯示華氏溫度,k4鍵按下不松開顯示高低報警溫度,松開后恢復(fù)顯示正常溫度,k2鍵和k3鍵是分別用來調(diào)節(jié)高低報警溫度,k鍵控制調(diào)節(jié)時的上調(diào)或下調(diào)。具體調(diào)節(jié)如將高溫報警溫度調(diào)高,第一步將k4鍵按下不松,k鍵升起位置,調(diào)節(jié)k2鍵,則高溫報警溫度向上增加,反之亦然。低溫報警同理。</p><p><b>  圖 報警點調(diào)節(jié)電路</b>&l

31、t;/p><p>  3.6溫度傳感器及DS18B20測溫原理</p><p>  DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9-12位的數(shù)字值讀數(shù)方式。DS18B20的性能特點如下:</p><p> ?。?)獨特的單線接口僅需要一個

32、端口引腳進行通信,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊。</p><p> ?。?)DS18B20支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點組網(wǎng)測溫;</p><p> ?。?)無須外部器件,全部傳感元件及轉(zhuǎn)換電路集成在形如一只三極管的集成電路內(nèi);</p><p> ?。?)可通過數(shù)據(jù)線供

33、電,電壓范圍為3.0-5.5V;</p><p><b>  (5)零待機功耗;</b></p><p> ?。?)溫度以9或12位數(shù)字,對應(yīng)的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃,可實現(xiàn)高精度測溫;</p><p> ?。?)用戶可定義報警設(shè)置;</p><p> ?。?)報警搜索命令識別

34、并標(biāo)志超過程序限定溫度(溫度報警條件)的器件;</p><p> ?。?)負(fù)電壓特性,電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作;</p><p> ?。?0)測量結(jié)果直接輸出數(shù)字溫度信號,以"一線總線"串行傳送給CPU,同時可傳送CRC校驗碼,具有極強的抗干擾糾錯能力</p><p>  DS18B20采用3腳PR35封裝或8腳SO

35、IC封裝,其引腳排列及內(nèi)部結(jié)構(gòu)框圖如圖及測溫原理圖如下所示:</p><p><b>  圖 引腳排列</b></p><p><b>  圖 內(nèi)部結(jié)構(gòu)框圖</b></p><p>  圖 DS18B20測溫原理圖</p><p>  64位ROM的結(jié)構(gòu)開始8位是產(chǎn)品類型的編號,接著是每個器件的惟一

36、的序號,共有48位,最后8位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。溫度報警觸發(fā)器TH和TL,可通過軟件寫入戶報警上下限。</p><p>  DS18B20溫度傳感器的內(nèi)部存儲器還包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結(jié)構(gòu)為8字節(jié)的存儲器,結(jié)構(gòu)如圖4所示。頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)TH和TL的拷貝,是易失的,每次上電

37、復(fù)位時被刷新。第5個字節(jié),為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時寄存器中的分辨率轉(zhuǎn)換為相應(yīng)精度的溫度數(shù)值。該字節(jié)各位的定義如圖5所示。低5位一直為1,TM是工作模式位,用于設(shè)置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設(shè)置為0,用戶不要去改動,R1和R0決定溫度轉(zhuǎn)換的精度位數(shù),來設(shè)置分辨率。</p><p>  圖5 DS18B20的字節(jié)定義</p

38、><p>  DS18B20的分辨率定義如表1所示</p><p>  表1 分辨率設(shè)置表</p><p>  由表1可見,DS18B20溫度轉(zhuǎn)換的時間比較長,而且分辨率越高,所需要的溫度數(shù)據(jù)轉(zhuǎn)換時間越長。因此,在實際應(yīng)用中要將分辨率和轉(zhuǎn)換時間權(quán)衡考慮。</p><p>  主機控制DS18B20完成溫度轉(zhuǎn)換過

39、程是:每一次讀寫之前都要對DS18B20進行復(fù)位,即將數(shù)據(jù)總線下拉500us,然后釋放,DS18B20收到信號后等待16-60us左右,之后發(fā)出60-240us的存在低脈沖,主CPU收到此此信號表示復(fù)位成功;復(fù)位成功后發(fā)送一條ROM指令,然后發(fā)送RAM指令,這樣才能對DS18B20進行預(yù)訂的讀寫操作。</p><p>  表2 ROM指令集</p><

40、;p>  表3 RAM指令集</p><p>  DS18B20的測溫原理是這這樣的,器件中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小,用于產(chǎn)生固定頻率的脈沖信號送給減法計數(shù)器1;高溫度系數(shù)晶振隨溫度變化其振蕩頻率明顯改變,所產(chǎn)生的信號作為減法計數(shù)器2的脈沖輸入。器件中還有一個計數(shù)門,當(dāng)計數(shù)門打開時,DS18B20就對低溫度系數(shù)振蕩器產(chǎn)生的時鐘脈沖進行計數(shù)進而完成溫

41、度測量。計數(shù)門的開啟時間由高溫度系數(shù)振蕩器來決定,每次測量前,首先將最低溫所對應(yīng)的一個基數(shù)分別置入減法計數(shù)器1、溫度寄存器中,計數(shù)器1和溫度寄存器被預(yù)置在最低溫所對應(yīng)的一個基數(shù)值。</p><p>  減法計數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行減法計數(shù),當(dāng)減法計數(shù)器1的預(yù)置值減到0時,溫度寄存器的值將加1,減法計數(shù)器1的預(yù)置將重新被裝入,減法計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行計數(shù),如此循環(huán)直到

42、減法計數(shù)器計數(shù)到0時,停止溫度寄存器的累加,此時溫度寄存器中的數(shù)值就是所測溫度值。其輸出用于修正減法計數(shù)器的預(yù)置值,只要計數(shù)器門仍未關(guān)閉就重復(fù)上述過程,直到溫度寄存器值大致被測溫度值。</p><p><b>  測溫電路</b></p><p>  四、系統(tǒng)軟件算法設(shè)計</p><p>  整個系統(tǒng)是由硬件配合軟件來實現(xiàn)的,在硬件確定后,編寫

43、的軟件的功能也就基本定型了。所以軟件的功能大致可分為兩個部分:一是監(jiān)控,這也是系統(tǒng)的核心部分,二是執(zhí)行部分,完成各個具體的功能。系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉(zhuǎn)換命令子程序,計算溫度子程序,顯示數(shù)據(jù)刷新子程序等。</p><p><b>  4.1主程序</b></p><p>  主程序的主要功能是負(fù)責(zé)溫度的實時顯示、讀出并處理DS18B20的測量的當(dāng)

44、前溫度值,溫度測量每1s進行一次。這樣可以在一秒之內(nèi)測量一次被測溫度,其程序流程見圖所示。</p><p>  圖 主程序流程圖圖讀溫度流程圖</p><p>  4.2讀出溫度子程序</p><p>  讀出溫度子程序的主要功能是讀出RAM中的9字節(jié),在讀出時需進行CRC校驗,校驗有錯時不進行溫度數(shù)據(jù)的改寫。其程序流程圖如圖示</p><p&

45、gt;<b>  圖 溫度轉(zhuǎn)換流程圖</b></p><p>  4.3溫度轉(zhuǎn)換命令子程序</p><p>  溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令,當(dāng)采用12位分辨率時轉(zhuǎn)換時間約為750ms,在本程序設(shè)計中采用1s顯示程序延時法等待轉(zhuǎn)換的完成。溫度轉(zhuǎn)換命令子程序流程圖如上圖,圖9所示</p><p>  4.4 計算溫度子程序</

46、p><p>  計算溫度子程序?qū)AM中讀取值進行BCD碼的轉(zhuǎn)換運算,并進行溫度值正負(fù)的判定,其程序流程圖如圖所示。</p><p>  圖 計算溫度流程圖   圖 顯示數(shù)據(jù)刷新流程圖</p><p>  4.5 顯示數(shù)據(jù)刷新子程序</p><p>  顯示數(shù)據(jù)刷新子程序主要是對顯示緩沖器中的顯示數(shù)據(jù)進行刷新操作,當(dāng)最高顯示位為0時將符號顯

47、示位移入下一位。程序流程圖如圖。</p><p>  4.6 1602的液晶顯示</p><p>  1602液晶顯示流程圖:</p><p><b>  五、軟件仿真</b></p><p><b>  5.1系統(tǒng)仿真設(shè)計</b></p><p>  本設(shè)計是在Prote

48、us環(huán)境下進行仿真的,仿真所用到的器件有:單片機AT89C51,DS1820溫度傳感器,蜂鳴器,液晶顯示器,一些電阻,電容等。</p><p><b>  仿真結(jié)果如下:</b></p><p>  顯示器顯示 傳感器溫度</p><p><b>  高低報警溫度</b></p>

49、;<p>  高溫報警 低溫報警</p><p>  報警時的led燈提示</p><p><b>  5.2系統(tǒng)原理圖</b></p><p><b>  六、總結(jié)與體會</b></p><p>  經(jīng)過將近三周的單片機課程設(shè)計,終于完成了我的數(shù)字溫度計的

50、設(shè)計,雖然沒有完全達到設(shè)計要求,但從心底里說,還是高興的,畢竟這次設(shè)計把實物都做了出來,高興之余不得不深思呀!</p><p>  在本次設(shè)計的過程中,我發(fā)現(xiàn)很多的問題,雖然以前還做過這樣的設(shè)計但這次設(shè)計真的讓我長進了很多,單片機課程設(shè)計重點就在于軟件算法的設(shè)計,需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我覺的寫好一個程序并不是一件簡單的事,舉個例子,以前寫的那幾次,數(shù)據(jù)加減時,我用的都是BCD碼,這一次,

51、我全部用的都是16進制的數(shù)直接加減,顯示處理時在用除法去刪分,感覺效果比較好,有好多的東西,只有我們?nèi)ピ囍隽耍拍苷嬲恼莆?,只學(xué)習(xí)理論有些東西是很難理解的,更談不上掌握。</p><p>  從這次的課程設(shè)計中,我真真正正的意識到,在以后的學(xué)習(xí)中,要理論聯(lián)系實際,把我們所學(xué)的理論知識用到實際當(dāng)中,學(xué)習(xí)單機片機更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設(shè)計中的最大收獲。通過這次對數(shù)字溫

52、度計的設(shè)計與制作,讓我了解了設(shè)計電路的程序,也讓我了解了關(guān)于數(shù)字溫度計的原理與設(shè)計理念,要設(shè)計一個電路總要先用仿真仿真成功之后才實際接線的。但是最后的成品卻不一定與仿真時完全一樣,因為,再實際接線中有著各種各樣的條件制約著。而且,在仿真中無法成功的電路接法,在實際中因為芯片本身的特性而能夠成功。所以,在設(shè)計時應(yīng)考慮兩者的差異,從中找出最適合的設(shè)計方法。</p><p>  通過這次學(xué)習(xí),讓我對各種電路都有了大概的

53、了解,所以說,坐而言不如立而行,對于這些電路還是應(yīng)該自己動手實際操作才會有深刻理解。</p><p>  從這次的課程設(shè)計中,我真真正正的意識到,在以后的學(xué)習(xí)中,要理論聯(lián)系實際,把我們所學(xué)的理論知識用到實際當(dāng)中,學(xué)習(xí)單機片機更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設(shè)計中的最大收獲。</p><p><b>  附錄:</b></p&g

54、t;<p>  //******************************************************</p><p>  #include<reg51.h></p><p>  #include<intrins.h> //shiyongyanshi</p><p>  #include<

55、;math.h> </p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit DQ=P3^3;</p><p>  sbit RS =P2^0;</p><p>  sbi

56、t RW =P2^1;</p><p>  sbit EN =P2^2;</p><p>  sbit k=P1^0;</p><p>  sbit k1=P1^4;</p><p>  sbit k2=P1^5;</p><p>  sbit k3=P1^6;</p><p>  sbi

57、t k4=P1^7;</p><p>  sbit led_red=P2^5;</p><p>  sbit led_blue=P2^6;</p><p>  sbit BEEP=P3^7;</p><p>  uchar bz=1;</p><p><b>  //BEEP=0;</b><

58、;/p><p>  uchar ng=0; //fuhaobiaoshiwei </p><p>  uchar TempBuffer[] ={"TEMP: "};</p><p>  int temp_value; //溫度值</p><p>  uchar code dis_title[

59、]={"--current temp--"};</p><p>  void xianshi_huashi();</p><p>  uchar gw=40;</p><p>  char dw= 10;</p><p>  uchar xianshi_title[]={" TEMP ALARM &qu

60、ot;};</p><p>  uchar xianshi_baojing[]={"HI: LO: "}; //345 10 `` 12</p><p>  //----------------延時--------------------------------</p><p>  void delayxus(uint x)&

61、lt;/p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  while(x--) for(i=0;i<200;i++);</p><p><b>  }</b></p><p>  //***

62、******************LCD 控制********************</p><p><b>  //讀lcd 狀態(tài)</b></p><p>  uchar read_lcd_state()</p><p><b>  {</b></p><p>  uchar state ;

63、</p><p>  RS=0;RW=1;EN=1;delayxus(1);state=P0;EN=0;delayxus(1);</p><p>  return state;</p><p>  } </p><p><b>  // 忙等待&

64、lt;/b></p><p>  void lcd_busy_wait()</p><p><b>  {</b></p><p>  while((read_lcd_state()&0x80)==0x80);</p><p>  delayxus(5);</p><p><b

65、>  }</b></p><p><b>  //向LCD寫數(shù)據(jù)</b></p><p>  void write_lcd_data(uchar dat)</p><p><b>  {</b></p><p>  lcd_busy_wait();</p><p

66、>  RS=1;RW=0;EN=0;P0=dat;EN=1;delayxus(1);EN=0;</p><p><b>  }</b></p><p><b>  //向LCD寫指令</b></p><p>  void write_lcd_cmd(uchar cmd)</p><p>  {

67、 lcd_busy_wait();</p><p>  RS=0;RW=0;EN=0;P0=cmd;EN=1;delayxus(1);EN=0;</p><p><b>  }</b></p><p>  //--------------------------------------------------------------------

68、---------------------------------</p><p><b>  //LCD初始化</b></p><p>  void init_lcd()</p><p><b>  {</b></p><p>  write_lcd_cmd(0x38); delayxus(1)

69、;</p><p>  write_lcd_cmd(0x01) ; delayxus(1);</p><p>  write_lcd_cmd(0x06); delayxus(1);</p><p>  write_lcd_cmd(0x0C) ; delayxus(1);</p><p><b>  } </b><

70、;/p><p>  //-----------------------------------------------</p><p>  //設(shè)置液晶顯示位置</p><p>  void set_lcd_pos(uchar p)</p><p><b>  {</b></p><p>  writ

71、e_lcd_cmd(p| 0x80);</p><p><b>  }</b></p><p>  //---------------------------------------</p><p>  //在LCD上顯示字符串</p><p>  void dis_lcd_string(uchar p,uchar *s

72、) //位置,字符指針</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  set_lcd_pos(p);</p><p>  for(i=0;i<16;i++) //16*2</p><p>&

73、lt;b>  {</b></p><p>  write_lcd_data(s[i]) ;</p><p>  delayxus(1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  //--------

74、-----------------------------------------------------------</p><p>  void delay_18B20(unsigned int i)</p><p><b>  {</b></p><p>  while(i--);</p><p><b>

75、;  }</b></p><p>  //--------------------蜂鳴器---------------------------</p><p>  void beep()</p><p><b>  {</b></p><p><b>  uchar i;</b><

76、/p><p>  for(i=0;i<100;i++)</p><p><b>  {</b></p><p>  delayxus(1);</p><p>  BEEP=~BEEP;</p><p><b>  }</b></p><p><

77、b>  BEEP=1;</b></p><p><b>  }</b></p><p><b>  //延時2</b></p><p>  void delay2(uint x)</p><p><b>  {</b></p><p>

78、  while(--x);</p><p><b>  }</b></p><p>  //==================================================</p><p><b>  //初始化DS!*</b></p><p>  /**********ds18

79、b20初始化函數(shù)**********************/</p><p>  void Init_DS18B20(void) </p><p><b>  {</b></p><p>  unsigned char x=0;</p><p>  DQ = 1; //DQ復(fù)位</p>

80、<p>  delay_18B20(8); //稍做延時</p><p>  DQ = 0; //單片機將DQ拉低</p><p>  delay_18B20(80); //精確延時 大于 480us</p><p>  DQ = 1; //拉高總線</p><p>  delay_18B20(

81、14);</p><p>  x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗</p><p>  delay_18B20(20);</p><p><b>  }</b></p><p>  /***********ds18b20讀一個字節(jié)**************/ &

82、lt;/p><p>  uchar ReadOneChar(void)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  uchar dat = 0;</p><p>  for (i=8;i>0;i--)</p><p&g

83、t;<b>  {</b></p><p>  DQ = 0; // 給脈沖信號</p><p><b>  dat>>=1;</b></p><p>  DQ = 1; // 給脈沖信號</p><p><b>  if(DQ)</b></p>&l

84、t;p>  dat|=0x80;</p><p>  delay_18B20(4);</p><p><b>  }</b></p><p>  return(dat);</p><p><b>  }</b></p><p>  /*************ds18b

85、20寫一個字節(jié)****************/ </p><p>  void WriteOneChar(uchar dat)</p><p><b>  {</b></p><p>  unsigned char i=0;</p><p>  for (i=8; i>0; i--)</p>&l

86、t;p><b>  {</b></p><p><b>  DQ = 0;</b></p><p>  DQ = dat&0x01;</p><p>  delay_18B20(5);</p><p><b>  DQ = 1;</b></p>&l

87、t;p><b>  dat>>=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /**************讀取ds18b20當(dāng)前溫度************/</p><p>  void

88、ReadTemp(void)</p><p><b>  {</b></p><p>  unsigned char a=0;</p><p>  unsigned char b=0;</p><p>  unsigned char t=0;</p><p>  Init_DS18B20();&l

89、t;/p><p>  WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p>  WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p>  delay_18B20(100); // this message is wery important</p><p>  Init_D

90、S18B20();</p><p>  WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p>  WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p>  delay_18B20(100);</p><p>  a=ReadOneChar();

91、//讀取溫度值低位 aaaaaaaaaaaaaaaaaaaa</p><p>  b=ReadOneChar(); //讀取溫度值高位 bbbbbbbbbb b.a</p><p>  temp_value= b<<4; </p><p>  temp_value+=(a&0xf0)>>4; </p>&

92、lt;p><b>  }</b></p><p>  void temp_to_str() //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p><p><b>  { </b></p><p>  if((temp_value & 0xE0)==0xE0)</p><p><b

93、>  {</b></p><p>  temp_value =~temp_value +1 ; </p><p><b>  ng=1;</b></p><p><b>  }</b></p><p><b>  else</b></p><

94、;p><b>  ng=0;</b></p><p>  if(k1==0) {//while(k1==0);</p><p>  bz=(bz+1) %2; }</p><p><b>  if(bz==0)</b></p><p><b>  { </b>

95、</p><p>  temp_value =(int)(temp_value )*(9.0/5.0)+32;</p><p><b>  }</b></p><p><b>  if(ng==1)</b></p><p><b>  {</b></p><

96、p>  TempBuffer[9]=temp_value/100+'0';</p><p>  if(TempBuffer[9]= ' ') </p><p>  TempBuffer[9]='-'; </p><p>  TempBuffer[10]=temp_value%100/10+'0';

97、 //十位</p><p>  TempBuffer[11]=temp_value%10+'0'; //個位</p><p>  TempBuffer[12]=0xdf; //溫度符號</p><p>  TempBuffer[13]='C';</p><p>  TempBuff

98、er[14]='\0';</p><p>  //TempBuffer[1]=ng %10+ '\0'; </p><p><b>  }</b></p><p><b>  if(ng==0)</b></p><p><b>  { </b>

99、;</p><p>  TempBuffer[9]=temp_value/100+'0';</p><p>  if(temp_value/100==0) TempBuffer[9] =' ';</p><p>  TempBuffer[10]=temp_value % 100/10+'0'; //十位</p

100、><p>  if(temp_value % 100/10==0) TempBuffer[10] =' ';</p><p>  TempBuffer[11]=temp_value%10+'0'; //個位</p><p>  // if(temp_value%10==0) TempBuffer[11] =' ';<

101、;/p><p>  TempBuffer[13]='C'; //溫度符號</p><p>  if(bz==0) TempBuffer[13]='F'; </p><p>  TempBuffer[14]='\0';</p><p>  //TempBuffer[1]=ng%10+

102、9;\0'; </p><p><b>  }</b></p><p><b>  }</b></p><p>  void Delay1ms(unsigned int count)</p><p><b>  {</b></p><p>  u

103、nsigned int i,j;</p><p>  for(i=0;i<count;i++)</p><p>  for(j=0;j<120;j++);</p><p><b>  }</b></p><p><b>  /*延時子程序*/</b></p><p&g

104、t;  void mdelay(uint delay)</p><p><b>  {uint i;</b></p><p>  for(;delay>0;delay--)</p><p><b>  {</b></p><p>  for(i=0;i<62;i++) ; /

105、/1ms延時.</p><p><b>  }</b></p><p><b>  }</b></p><p>  void show_time() //液晶顯示程序</p><p><b>  { </b></p><p>  ReadTemp()

106、; </p><p>  //開啟溫度采集程序</p><p>  temp_to_str(); //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符</p><p>  dis_lcd_string(0x40,TempBuffer); //顯示溫度</p><p>  dis_lcd_string(0x00,di

107、s_title); //</p><p>  Delay1ms(400); //掃描延時</p><p><b>  }</b></p><p>  void xianshi_dw()</p><p><b>  {</b></p><p>

108、<b>  if(dw>=0)</b></p><p>  { xianshi_baojing[3]=gw/100+'0';</p><p>  xianshi_baojing[4]=gw%100/10+'0';</p><p>  xianshi_baojing[5]=gw%10+'0';

109、</p><p>  xianshi_baojing[10]=dw/100+'0';</p><p>  xianshi_baojing[11]=dw%100/10+'0';</p><p>  xianshi_baojing[12]=dw%10+'0';</p><p>  dis_lcd_s

110、tring(0x00,xianshi_title);</p><p>  dis_lcd_string(0x40,xianshi_baojing);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  if(dw<0)&l

111、t;/b></p><p><b>  {</b></p><p>  xianshi_baojing[3]=gw/100+'0';</p><p>  xianshi_baojing[4]=gw%100/10+'0';</p><p>  xianshi_baojing[5]=gw

112、%10+'0';</p><p>  xianshi_baojing[10]= '-';</p><p>  xianshi_baojing[11]=abs(dw)%100/10+'0';</p><p>  xianshi_baojing[12]=abs(dw)%10+'0';</p>

113、<p>  dis_lcd_string(0x00,xianshi_title);</p><p>  dis_lcd_string(0x40,xianshi_baojing);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void

114、main()</p><p><b>  {</b></p><p>  led_red=0;</p><p>  led_blue=0;</p><p><b>  BEEP=0;</b></p><p>  delayxus(10); </p><p

115、>  init_lcd();</p><p>  //init_DS();</p><p>  Init_DS18B20();</p><p>  delay2(500);</p><p>  delay2(500);</p><p><b>  while(1)</b></p>

116、<p><b>  { </b></p><p>  if( k2==1 &&k3==1 && k4==1)</p><p>  show_time();</p><p><b>  }</b></p><p><b>  if(k2==0)

117、</b></p><p><b>  {</b></p><p>  // while(k2==0);</p><p>  xianshi_dw();</p><p><b>  }</b></p><p>  if(k3==0 && k2==0

118、 &&k==1)</p><p>  { while(k3==0);</p><p><b>  gw++;</b></p><p><b>  } </b></p><p>  if(k4==0 && k2==0 &&k==1)</p

119、><p><b>  {</b></p><p>  while(k4==0);</p><p><b>  dw++;</b></p><p><b>  }</b></p><p>  if(k3==0 && k2==0 &&am

120、p;k==0)</p><p><b>  { </b></p><p>  while(k3==0);</p><p><b>  gw--;</b></p><p><b>  } </b></p><p>  if(k4==0 &&a

121、mp; k2==0 &&k==0)</p><p><b>  {</b></p><p>  while(k4==0);</p><p><b>  dw--;</b></p><p>  if(dw<0) dw=0;</p><p>  /*if

122、(dw<0)</p><p><b>  {</b></p><p>  xianshi_baojing[10]='-';</p><p>  } */</p><p><b>  } </b></p><p>  delayxus(1

123、00);</p><p><b>  //報警設(shè)置</b></p><p><b>  if(bz==1)</b></p><p>  {if(temp_value>gw &&bz==1)</p><p>  { beep(); delayxus(50);led_red=1

124、;}</p><p><b>  else</b></p><p>  led_red=0;</p><p>  if( temp_value<dw &&bz==1) </p><p>  { beep(); delayxus(50);led_blue=1;}</p><p&g

125、t;<b>  else</b></p><p>  led_blue=0;</p><p>  if( (TempBuffer[9]=='-')&& abs( temp_value)>=abs(dw) && bz==1 )</p><p>  { beep(); delayxus(50);

126、}</p><p>  if( dw<=0 && abs( temp_value)>=abs(dw) &&bz==1 )</p><p>  { beep(); delayxus(50);} </p><p>  if((-abs(temp_value))<=(-abs(dw)) && dw&l

127、t;=0 &&bz==1) </p><p>  { beep(); delayxus(50);}</p><p><b>  }</b></p><p><b>  }</b></p><p>  } </p>&l

128、t;p>  //*******************************************************</p><p><b>  參考文獻</b></p><p>  [1] 李朝青.單片機原理及接口技術(shù)(簡明修訂版).杭州:北京航空航天大學(xué)出版社,1998</p><p>  [2] 李廣弟.單片機基礎(chǔ)[M].

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論