單片機(jī)溫度計(jì)課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩46頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  摘要</b></p><p>  本設(shè)計(jì)是一個(gè)基于AT89S52單片機(jī)的“數(shù)字溫度計(jì)”。隨著科學(xué)技術(shù)的進(jìn)步和發(fā)展,單片機(jī)技術(shù)已經(jīng)普及到我們的生活、學(xué)習(xí)、工作、科研等各個(gè)領(lǐng)域,已經(jīng)成為一種比較成熟的技術(shù),因此,本文采用AT89S52單片機(jī)來(lái)實(shí)現(xiàn)這個(gè)測(cè)溫系統(tǒng)。此外,測(cè)溫系統(tǒng)的開(kāi)發(fā)還利用了數(shù)字溫度傳感器DS18B20,可以方便的實(shí)現(xiàn)溫度的采集,并對(duì)傳感器在單片機(jī)下的硬

2、件連接,軟件編程以及各個(gè)模塊系統(tǒng)流程進(jìn)行了分析,對(duì)各部分的電路也進(jìn)行一一介紹。此測(cè)溫系統(tǒng)測(cè)量溫度的基本范圍是-50℃~110℃,精度誤差小于0.5℃,采用LED數(shù)碼直讀顯示,并且可以根據(jù)需要任意設(shè)定上下限的報(bào)警溫度以實(shí)現(xiàn)其超過(guò)報(bào)警值時(shí)給出提醒。其體積小、功耗低、結(jié)構(gòu)簡(jiǎn)單、讀數(shù)方便、測(cè)溫范圍廣、測(cè)溫準(zhǔn)確、抗干擾能力強(qiáng),主要用于對(duì)測(cè)溫比較準(zhǔn)確的場(chǎng)所,或科研實(shí)驗(yàn)室使用,有著很好的前景。</p><p>  關(guān)鍵詞:?jiǎn)纹?/p>

3、機(jī),數(shù)字控制,溫度計(jì), DS18B20,AT89S51</p><p><b>  目錄</b></p><p>  第一章.概述- 3 -</p><p>  1.1、設(shè)計(jì)目的及意義- 3 -</p><p>  1.2、設(shè)計(jì)任務(wù)及要求- 3 -</p><p>  第二章.系統(tǒng)總體方案及

4、硬件設(shè)計(jì)- 4 -</p><p>  2.1、設(shè)計(jì)方案論證- 4 -</p><p>  2.1.1、方案一:使用熱敏電阻- 4 -</p><p>  2.1.2、方案二:采用數(shù)字溫度芯片DS18B20- 4 -</p><p>  2.2、總體設(shè)計(jì)框圖- 5 -</p><p>  2.3、主控電路器件

5、- 5 -</p><p>  2.4、時(shí)鐘電路和復(fù)位電路- 6 -</p><p>  2.5、按鈕輸入電路- 7 -</p><p>  2.6、顯示電路和驅(qū)動(dòng)電路- 7 -</p><p>  2.7、數(shù)字溫度傳感器DS18B20- 8 -</p><p>  2.7.1、DS18B20簡(jiǎn)單介紹- 8

6、 -</p><p>  2.7.2、DS18B20性能特點(diǎn)- 9 -</p><p>  2.7.3、DS18B20內(nèi)部結(jié)構(gòu)- 9 -</p><p>  2.7.4、DS18B20控制方法- 11 -</p><p>  2.8、溫度報(bào)警電路- 12 -</p><p>  第三章.軟件設(shè)計(jì)- 14 -&

7、lt;/p><p>  3.1、主程序流程圖- 14 -</p><p>  3.2、讀出溫度子程序- 15 -</p><p>  3.3、數(shù)據(jù)處理子程序- 16 -</p><p>  3.4、數(shù)據(jù)刷新子程序- 16 -</p><p>  3.5、報(bào)警子程序- 17 -</p><p&g

8、t;  第四章.實(shí)驗(yàn)仿真- 18 -</p><p>  4.1、系統(tǒng)仿真設(shè)計(jì)- 18 -</p><p>  4.2、仿真結(jié)果分析- 18 -</p><p>  第五章.軟硬件系統(tǒng)的調(diào)試- 22 -</p><p>  第六章.課程設(shè)計(jì)體會(huì)- 23 -</p><p>  第七章. 參考文獻(xiàn)- 23 -

9、</p><p>  附1源程序代碼- 24 -</p><p>  附2系統(tǒng)原理圖- 36 -</p><p><b>  第一章</b></p><p><b>  概述</b></p><p>  1.1、設(shè)計(jì)目的及意義</p><p>  

10、1、理解單片機(jī)在自動(dòng)化中的作用以及掌握單片機(jī)的編程方法和仿真軟件Proteus的使用方法。</p><p>  2、進(jìn)一步熟悉和掌握單片機(jī)的內(nèi)部結(jié)構(gòu)和工作原理,了解單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)的基本方法和步驟。</p><p>  3、掌握鍵盤(pán)和顯示器在單片機(jī)控制系統(tǒng)中的應(yīng)用。</p><p>  4、掌握撰寫(xiě)課程設(shè)計(jì)報(bào)告的方法。</p><p>  

11、5、鍛煉自己的動(dòng)手能力。</p><p>  1.2、設(shè)計(jì)任務(wù)及要求</p><p>  1、測(cè)量溫度的基本范圍是-50℃~110℃。</p><p>  2、測(cè)量精度誤差小于0.5℃。</p><p>  3、采用LED數(shù)碼直讀顯示。</p><p><b>  4、擴(kuò)展功能。</b></

12、p><p>  5、可以任意設(shè)定溫度的上下限報(bào)警功能。</p><p><b>  第二章</b></p><p>  系統(tǒng)總體方案及硬件設(shè)計(jì)</p><p>  2.1、設(shè)計(jì)方案論證</p><p>  該系統(tǒng)主要由溫度測(cè)量和數(shù)據(jù)采集兩部分電路組成,實(shí)現(xiàn)的方法很多,下面將列出兩種在日常生活和工、農(nóng)業(yè)

13、生產(chǎn)中經(jīng)常用到的實(shí)現(xiàn)方案。</p><p>  2.1.1、方案一:使用熱敏電阻</p><p>  由于本設(shè)計(jì)是測(cè)溫電路,可以使用熱敏電阻之類的器件利用其感溫效應(yīng),在將隨被測(cè)溫度變化的電壓或電流采集過(guò)來(lái),進(jìn)行A/D轉(zhuǎn)換后,就可以用單片機(jī)進(jìn)行數(shù)據(jù)的處理,在顯示電路上,就可以將被測(cè)溫度值顯示出來(lái),這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。</p><p>  

14、2.1.2、方案二:采用數(shù)字溫度芯片DS18B20</p><p>  采用數(shù)字溫度芯片DS18B20 測(cè)量溫度,輸出信號(hào)全數(shù)字化。便于單片機(jī)處理及控制,省去傳統(tǒng)的測(cè)溫方法的很多外圍電路。且該芯片的物理化學(xué)性很穩(wěn)定,它能用做工業(yè)測(cè)溫元件,此元件線形較好。在0~100 攝氏度時(shí),最大線形偏差小于1 攝氏度。DS18B20 的最大特點(diǎn)之一采用了單總線的數(shù)據(jù)傳輸,由數(shù)字溫度計(jì)DS18B20和微控制器AT89S52構(gòu)成的

15、溫度測(cè)量裝置,它直接輸出溫度的數(shù)字信號(hào),可直接與計(jì)算機(jī)連接。這樣,測(cè)溫系統(tǒng)的結(jié)構(gòu)就比較簡(jiǎn)單,體積也不大。采用單片機(jī)控制,軟件編程的自由度大,可通過(guò)編程實(shí)現(xiàn)各種各樣的算術(shù)算法和邏輯控制,而且體積小,硬件實(shí)現(xiàn)簡(jiǎn)單,安裝方便。</p><p>  控制工作,還可以與PC 機(jī)通信上傳數(shù)據(jù),另外AT89S52在工業(yè)控制上也有著廣泛的應(yīng)用,編程技術(shù)及外圍功能電路的配合使用都很成熟。</p><p> 

16、 該系統(tǒng)利用AT89S52芯片控制溫度傳感器DS18B20進(jìn)行實(shí)時(shí)溫度檢測(cè)并顯示,能夠?qū)崿F(xiàn)快速測(cè)量環(huán)境溫度,并可以根據(jù)需要設(shè)定上下限報(bào)警溫度。</p><p>  從以上兩種方案很容易看出,采用方案二,硬件電路比較簡(jiǎn)單,軟件設(shè)計(jì)也比較簡(jiǎn)單,因此,采用方案二進(jìn)行“數(shù)字溫度計(jì)”的設(shè)計(jì)。</p><p>  2.2、總體設(shè)計(jì)框圖</p><p>  數(shù)字溫度計(jì)的原理框圖如

17、圖1所示。</p><p>  圖1 數(shù)字溫度計(jì)原理框圖</p><p>  數(shù)字溫度計(jì)主要是由單片機(jī)控制器AT89S52和溫度傳感器DS18B20以及LED顯示電路組成。由DS18B20溫度傳感器芯片測(cè)量當(dāng)前的溫度,并將結(jié)果送入單片機(jī),通過(guò)AT89S51單片機(jī)芯片對(duì)送來(lái)的測(cè)量溫度讀數(shù)進(jìn)行計(jì)算和轉(zhuǎn)換,并將此結(jié)果送入顯示電路顯示。其中,DSI8B20溫度傳感器芯片采用“一線制”與單片機(jī)相連,

18、它獨(dú)立地完成溫度測(cè)量以及將溫度測(cè)量結(jié)果送到單片機(jī)的工作。</p><p><b>  元器件總清單</b></p><p>  2.3、主控電路器件</p><p>  對(duì)于單片機(jī)選用AT89S52。AT89S52 是美國(guó)ATMEL公司生產(chǎn)的一個(gè)低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含8k Bytes ISP(In-system progra

19、mmable)的可反復(fù)擦寫(xiě)1000次的Flash只讀程序存儲(chǔ)器,器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)制造,兼容標(biāo)準(zhǔn)MCS -51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲(chǔ)單元,功能強(qiáng)大的微型計(jì)算機(jī)的AT89S52可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價(jià)比的解決方案。</p><p>  AT89S52具有如下特點(diǎn):40個(gè)引腳,8k Bytes Flash片內(nèi)程序存

20、儲(chǔ)器,256 bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),32個(gè)外部雙向輸入/輸出(I/O)口,5個(gè)中斷優(yōu)先級(jí)2層中斷嵌套中斷,2個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè) 全雙工串行通信口,看門(mén)狗(WDT)電路,片內(nèi)時(shí)鐘振蕩器。</p><p>  AT89S52單片機(jī)引腳圖如圖2所示。</p><p>  圖 2 AT89S52單片機(jī)引腳圖</p><p>  2.4、時(shí)鐘電

21、路和復(fù)位電路</p><p>  MCS-51內(nèi)部有一個(gè)構(gòu)成振蕩器的高增益反相放大器,此放大器的輸入端口和輸出端口分別是引腳 XTAL1 和 XTAL2,在 XTAL1 和 XTAL2 上外接時(shí)鐘源,即可構(gòu)成時(shí)鐘電路。根據(jù)單片機(jī)的生產(chǎn)工藝不同,可以分為內(nèi)部和外部?jī)煞N時(shí)鐘產(chǎn)生方式。本次設(shè)計(jì)采用內(nèi)部時(shí)鐘產(chǎn)生方式,其電路圖如圖3所示。</p><p><b>  圖3 時(shí)鐘電路圖<

22、;/b></p><p>  復(fù)位是使CPU和系統(tǒng)中其他部件都處于一個(gè)確定的初始狀態(tài),并從這個(gè)狀態(tài)開(kāi)始工作。MCS-51單片機(jī)通常采用上電自動(dòng)復(fù)位、按鈕電平復(fù)位、外部脈沖復(fù)位、上電+按鈕電平復(fù)位、程序運(yùn)行監(jiān)視復(fù)位等方式。本次設(shè)計(jì)采用上電+按鈕電平復(fù)位,其電路圖如圖4所示。</p><p><b>  圖4 復(fù)位電路圖</b></p><p&g

23、t;  2.5、按鈕輸入電路</p><p>  鍵盤(pán)可以分為獨(dú)立連接式和矩陣式兩類。獨(dú)立連接式按鍵是指直接用I/O口線構(gòu)成的單個(gè)按鍵電路。每個(gè)鍵單獨(dú)占用一根I/O口線,每根I/O線的工作狀態(tài)不會(huì)影響其他I/O口線的工作狀態(tài)。</p><p>  未有按鍵按下時(shí),所有的數(shù)據(jù)輸入線都處于高電平狀態(tài)。當(dāng)任何一個(gè)鍵按下時(shí),與之相連的數(shù)據(jù)輸入線將被拉成低電平,要判斷是否有鍵按下,只需要用微操作指令

24、即可。</p><p>  獨(dú)立連接式按鍵接口電路配置靈活,軟件結(jié)構(gòu)簡(jiǎn)單,但每個(gè)按鍵必須占用一根I/O口線,在按鍵較多時(shí),I/O口線浪費(fèi)較大,故只在按鍵數(shù)量不多時(shí)采用這種按鍵電路。</p><p>  于使用按鍵較少,本次設(shè)計(jì)采用獨(dú)立連接式按鍵。按鈕輸入電路如圖5所示。</p><p><b>  圖5 按鈕輸入電路</b></p>

25、<p>  2.6、顯示電路和驅(qū)動(dòng)電路</p><p>  本次設(shè)計(jì)要求使用4位的七段LED數(shù)碼顯示,LED顯示器內(nèi)部由7段發(fā)光二極管組成,因此亦稱之為七段LED顯示器,由于主要用于顯示各種數(shù)字符號(hào),故又稱之為L(zhǎng)ED數(shù)碼管。每個(gè)顯示器還有一個(gè)圓點(diǎn)型發(fā)光二極管,用于顯示小數(shù)點(diǎn)。但其編程相對(duì)復(fù)雜,可顯示字符比較少。顯示電路如圖6所示。</p><p>  圖 6 顯示電路和驅(qū)動(dòng)電

26、路</p><p>  2.7、數(shù)字溫度傳感器DS18B20</p><p>  由于傳統(tǒng)的熱敏電阻等測(cè)溫元件測(cè)出的一般都是電壓,再轉(zhuǎn)換成對(duì)應(yīng)的溫度,需要比較多的外部元件支持,且硬件電路復(fù)雜,制作成本相對(duì)較高。因此,本設(shè)計(jì)采用DALLAS公司的數(shù)字溫度傳感器DS18B20作為測(cè)溫元件。</p><p>  2.7.1、DS18B20簡(jiǎn)單介紹</p>&

27、lt;p>  DS18B20是DALLAS公司的一種新型的單線數(shù)字溫度傳感器,其體積更小、更適用于多種場(chǎng)合、且適用電壓更寬、更經(jīng)濟(jì)。溫度測(cè)量范圍為-55~+125 攝氏度,可編程為9位~12位轉(zhuǎn)換精度,測(cè)溫分辨率可達(dá)0.0625攝氏度,分辨率設(shè)定參數(shù)以及用戶設(shè)定的報(bào)警溫度存儲(chǔ)在EEPROM中,掉電后依然保存。被測(cè)溫度用符號(hào)擴(kuò)展的16位數(shù)字量的方式串行輸出;其工作電源既可以在遠(yuǎn)端引入,也可以采用寄生電源方式產(chǎn)生;多個(gè)DS18B20可

28、以并聯(lián)到3 根或2 根線上,CPU只需一根端口線就能與諸多DS18B20 通信,占用微處理器的端口較少,可節(jié)省大量的引線和邏輯電路。因此用它來(lái)組成一個(gè)測(cè)溫系統(tǒng),具有線路簡(jiǎn)單,在一根通信線,可以連接很多這樣的數(shù)字溫度計(jì),十分方便。</p><p>  2.7.2、DS18B20性能特點(diǎn)</p><p>  DS18B20 的性能特點(diǎn):</p><p>  1、用單總線

29、專用技術(shù),既可通過(guò)串行口線,也可通過(guò)其它I/O 口線與微機(jī)接口,無(wú)須經(jīng)過(guò)其它變換電路,直接輸出被測(cè)溫度值(9 位二進(jìn)制數(shù),含符號(hào)位)。</p><p>  2、測(cè)溫范圍為-55℃-+125℃,測(cè)量分辨率為0.0625℃。</p><p>  3、內(nèi)含64位經(jīng)過(guò)激光修正的只讀存儲(chǔ)器ROM。</p><p>  4、適配各種單片機(jī)或系統(tǒng)機(jī)。</p><

30、;p>  5、用戶可分別設(shè)定各路溫度的上、下限。</p><p><b>  6、內(nèi)含寄生電源。</b></p><p>  2.7.3、DS18B20內(nèi)部結(jié)構(gòu)</p><p>  DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM,溫度傳感器,非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL,高速暫存器。DS18B20的管腳排列如圖7所示。<

31、;/p><p>  圖7 DS18B20 引腳分布圖</p><p>  64 位光刻ROM 是出廠前被光刻好的,它可以看作是該DS18B20 的地址序列號(hào)。不同的器件地址序列號(hào)不同。</p><p>  DS18B20 高速暫存器共9個(gè)存儲(chǔ)單元,如表1所示:</p><p>  表1 DS18B20高速暫存器</p><p

32、>  以12 位轉(zhuǎn)化為例說(shuō)明溫度高低字節(jié)存放形式及計(jì)算:12 位轉(zhuǎn)化后得到的12 位數(shù)據(jù),存儲(chǔ)在18B20 的兩個(gè)高低兩個(gè)8 位的RAM 中,二進(jìn)制中的前面5 位是符號(hào)位。如果測(cè)得的溫度大于0,這5 位為0,只要將測(cè)到的數(shù)值乘于0.0625 即可得到實(shí)際溫度;如果溫度小于0,這5 位為1,測(cè)到的數(shù)值需要取反加1 再乘于0.0625 才能得到實(shí)際溫度。</p><p>  2.7.4、DS18B20控制方法&

33、lt;/p><p>  在硬件上,DS18B20 與單片機(jī)的連接有兩種方法,一種是VCC接外部電源,GND 接地,I/O 與單片機(jī)的I/O 線相連;另一種是用寄生電源供電,此時(shí)UDD、GND 接地,I/O 接單片機(jī)I/O。無(wú)論是內(nèi)部寄生電源還是外部供電,I/O 口線要接5KΩ左右的上拉電阻。</p><p>  DS18B20 有六條控制命令,如表2所示:</p><p&g

34、t;  表2 DS18B20 有六條控制命令</p><p>  CPU 對(duì)DS18B20 的訪問(wèn)流程是:先對(duì)DS18B20 初始化,再進(jìn)行ROM 操作命令,最后才能對(duì)存儲(chǔ)器操作,數(shù)據(jù)操作。DS18B20 每一步操作都要遵循嚴(yán)格的工作時(shí)序和通信協(xié)議。如主機(jī)控制DS18B20 完成溫度轉(zhuǎn)換這一過(guò)程,根據(jù)DS18B20 的通訊協(xié)議,須經(jīng)三個(gè)步驟:每一次讀寫(xiě)之前都要對(duì)DS18B20 進(jìn)行復(fù)位,復(fù)位成功后發(fā)送一條ROM

35、 指令,最后發(fā)送RAM 指令,這樣才能對(duì)DS18B20 進(jìn)行預(yù)定的操作。</p><p>  2.8、溫度報(bào)警電路</p><p>  本設(shè)計(jì)采用軟件處理報(bào)警,直流供電,利用有源蜂鳴器進(jìn)行報(bào)警輸出。當(dāng)所測(cè)溫度超過(guò)或低于所預(yù)設(shè)的溫度值時(shí),數(shù)據(jù)口的電平將會(huì)被拉高,報(bào)警輸出。同時(shí),所測(cè)溫度超過(guò)上限溫度時(shí),紅燈亮;低于下限溫度時(shí),黃燈亮;正常工作時(shí),綠燈亮。報(bào)警電路了硬件連接如圖8所示。</

36、p><p><b>  圖8 報(bào)警電路圖</b></p><p><b>  第三章</b></p><p><b>  軟件設(shè)計(jì)</b></p><p>  由于KeilC是一種結(jié)構(gòu)化的語(yǔ)言,具有靈活、高效等優(yōu)點(diǎn),并且C語(yǔ)言比匯編語(yǔ)言更具有可讀性,因此,本程序是在KeilC的編譯

37、環(huán)境下進(jìn)行編譯連接的。其軟件窗口界面如圖10所示。</p><p>  圖10 KeilC軟件窗口界面</p><p>  本系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度數(shù)據(jù)處理子程序,顯示數(shù)據(jù)刷新子程序,報(bào)警子程序等。</p><p>  3.1、主程序流程圖</p><p>  主程序的主要功能是負(fù)責(zé)溫度的實(shí)時(shí)顯示、讀出并處理DS18B

38、20的測(cè)量的當(dāng)前溫度值,溫度每隔一定時(shí)間測(cè)量進(jìn)行一次,這樣可以實(shí)時(shí)的顯示當(dāng)前的溫度值。主程序流程見(jiàn)圖11所示。</p><p>  圖11 主程序流程圖 圖12 讀出溫度子程序流程圖</p><p>  3.2、讀出溫度子程序</p><p>  讀出溫度子程序的主要功能是讀出RAM中9字節(jié)的內(nèi)容,并將其整合成一整數(shù)存儲(chǔ)在

39、暫存器中。其程序流程圖如圖12所示.</p><p>  3.3、數(shù)據(jù)處理子程序</p><p>  溫度數(shù)據(jù)處理子程序?qū)腞AM中讀取的值進(jìn)行BCD碼的轉(zhuǎn)換運(yùn)算,并進(jìn)行溫度值正負(fù)的判定,其程序流程圖如圖13所示。</p><p>  圖13 數(shù)據(jù)處理子程序流程圖</p><p>  3.4、數(shù)據(jù)刷新子程序</p><p

40、>  顯示數(shù)據(jù)刷新子程序主要是對(duì)顯示緩沖器中的顯示數(shù)據(jù)進(jìn)行刷新操作,當(dāng)最高位顯示為0時(shí),將符號(hào)顯示位移入下一位。程序流程圖如圖14所示。</p><p>  圖14 數(shù)據(jù)刷新子程序流程圖</p><p><b>  3.5、報(bào)警子程序</b></p><p>  報(bào)警子程序主要實(shí)現(xiàn)當(dāng)測(cè)量的實(shí)際溫度高于設(shè)定溫度的上限時(shí),蜂鳴器響,并且紅色

41、指示燈亮;當(dāng)測(cè)量的實(shí)際溫度低于設(shè)定溫度的下限時(shí),蜂鳴器響,黃色指示燈亮;當(dāng)測(cè)量的實(shí)際溫度介于設(shè)定溫度的上下限時(shí),蜂鳴器不響,綠色指示燈亮。其流程圖如圖15所示。</p><p>  圖15 報(bào)警子程序流程圖</p><p><b>  第四章</b></p><p><b>  實(shí)驗(yàn)仿真</b></p>&

42、lt;p>  4.1、系統(tǒng)仿真設(shè)計(jì)</p><p>  對(duì)于單片機(jī)這一門(mén)實(shí)踐性非常強(qiáng)、非常抽象的課程,Proteus是一個(gè)非常好的仿真軟件。因此,本次設(shè)計(jì)采用Proteus對(duì)數(shù)字溫度計(jì)進(jìn)行仿真。Proteus軟件窗口界面如圖16所示。</p><p>  圖16 Proteus軟件窗口界面</p><p>  將與真實(shí)元件對(duì)應(yīng)的虛擬元件調(diào)出,繪制在窗口的圖紙

43、上。連接好線路并保證沒(méi)有問(wèn)題時(shí),將編譯生成的(*.hex)文件調(diào)入虛擬單片機(jī)中,點(diǎn)擊運(yùn)行,即可通過(guò)仿真電路了解真實(shí)電路的運(yùn)行結(jié)果。</p><p>  4.2、仿真結(jié)果分析</p><p>  此數(shù)字溫度計(jì)可以測(cè)量溫度范圍為-50℃~110℃,溫度誤差小于0.5℃,并且可以任意設(shè)定上下限溫度。假設(shè)上限溫度設(shè)定為40℃,下限溫度設(shè)定為15℃。如圖17、圖18所示。</p>&l

44、t;p>  圖17 上限溫度設(shè)定為40℃</p><p>  圖18 下限溫度設(shè)定為15℃</p><p>  當(dāng)溫度傳感器測(cè)量的實(shí)際溫度超過(guò)上限溫度時(shí),蜂鳴器響、紅色指示燈亮。如圖19所示。</p><p>  圖19 實(shí)際溫度超過(guò)40℃</p><p>  當(dāng)實(shí)際溫度低于下限溫度時(shí),蜂鳴器響、黃色指示燈亮。如圖20所示。<

45、;/p><p>  圖20 實(shí)際溫度低于15℃</p><p>  當(dāng)實(shí)際溫度介于上下限溫度之間時(shí),蜂鳴器不響、綠色指示燈亮。如圖21所示。</p><p>  圖21 實(shí)際溫度介于15℃~40℃</p><p><b>  第五章</b></p><p><b>  軟硬件系統(tǒng)的調(diào)試&

46、lt;/b></p><p>  DS18B20最大的特點(diǎn)是單總線數(shù)據(jù)傳輸方式,DS18B20的數(shù)據(jù)I/O均由同一條線來(lái)完成。DS18B20的電源供電方式有2種:外部供電方式和寄生電源方式。工作于寄生電源方式時(shí),VDD和GND均接地,這在需要遠(yuǎn)程溫度探測(cè)和空間受限的場(chǎng)合特別有用,原理是當(dāng)1Wire總線的信號(hào)線DQ為高電平時(shí),竊取信號(hào)能量給DS18B20供電,同時(shí)一部分能量給內(nèi)部電容充電;當(dāng)DQ為低電平時(shí)釋放

47、能量為DS18B20供電。但寄生電源方式需要上啦電路,軟件控制變得復(fù)雜(特別是在完成溫度轉(zhuǎn)換和拷貝數(shù)據(jù)到E2PROM時(shí)),同時(shí)芯片的性能也有所降低。因此,在條件允許的場(chǎng)合,盡量采用外部供電方式。無(wú)論是內(nèi)部寄生電源還是外部電源,I/O口線要接5K左右的上拉電阻。在這里采用外部電源供電方式。DS18B20與芯片連接電路如圖22所示。</p><p>  圖22 DS18B20與單片機(jī)的連接</p>&l

48、t;p>  外部電源供電方式是DS18B20最佳的工作方式,工作穩(wěn)定可靠,抗干擾能力強(qiáng),而且電路也比較簡(jiǎn)單,可以開(kāi)發(fā)出穩(wěn)定可靠的多點(diǎn)溫度監(jiān)控系統(tǒng)。一般在發(fā)中使用外部電源供電方式,畢竟比寄生電源方式只多接一根VCC引線。在外接電源方式下,可以充分發(fā)揮DS18B20寬電源電壓范圍的優(yōu)點(diǎn),即使電源電壓VCC降到3V時(shí),依然能夠保證溫度量精度。</p><p><b>  第六章</b><

49、;/p><p><b>  課程設(shè)計(jì)體會(huì)</b></p><p>  經(jīng)過(guò)兩周的時(shí)間,終于完成了數(shù)字溫度計(jì)的單片機(jī)課程設(shè)計(jì),雖然完成的效果沒(méi)有想象的那么完美,但我們已經(jīng)盡力做了,雖然在硬件電路的連接和調(diào)試上出現(xiàn)了一定的問(wèn)題我們還是努力的研究去解決了。從中我們也學(xué)到了很多課本中沒(méi)有的東西。軟件設(shè)計(jì)方面,程序不是最簡(jiǎn)潔的,算法也不是最優(yōu)的,但我們通過(guò)努力認(rèn)真地去完成了它,讓我

50、們嘗試了那種程序設(shè)計(jì)中的難點(diǎn)重點(diǎn),為我們以后的編程設(shè)計(jì)打下了一定的基礎(chǔ)。通過(guò)本次溫度計(jì)的設(shè)計(jì),我們對(duì)單片機(jī)有了進(jìn)一步的熟悉和掌握,同時(shí)也熟悉了Proteus、KeilC等軟件的基本操作、了解了如何撰寫(xiě)課程設(shè)計(jì)報(bào)告、和對(duì)word長(zhǎng)文檔的排版方式,并且在此過(guò)程中我們還學(xué)會(huì)了利用各種資源查找我們所需要的資料,提高了我們的判斷和分析問(wèn)題的能力。</p><p>  這次課程設(shè)計(jì)讓我們重新體驗(yàn)到理論與實(shí)際相結(jié)合的重要性,不

51、僅鍛煉了我們的動(dòng)手能力,并且為以后的工作和學(xué)習(xí)積累了經(jīng)驗(yàn),為以后我們參加工作打下了良好的基礎(chǔ)。</p><p><b>  第七章</b></p><p><b>  參考文獻(xiàn)</b></p><p>  [1]余發(fā)山 王福忠.《單片機(jī)原理及應(yīng)用技術(shù)》.中國(guó)礦業(yè)大學(xué)出版社.2008</p><p>

52、  [2]彭偉.《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)》電子工業(yè)出版社.2010. </p><p>  [3]楊凌霄.《微型計(jì)算機(jī)原理與應(yīng)用》.中國(guó)電力出版社2003 </p><p>  [4]李朝青.單片機(jī)原理及接口技術(shù)(簡(jiǎn)明修訂版).杭州:北京航空航天大學(xué)出版社,1998</p><p>  [5]李廣弟.單片機(jī)基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,1994<

53、/p><p>  [6]閻石.數(shù)字電子技術(shù)基礎(chǔ)(第三版). 北京:高等教育出版社,1989</p><p>  [7]DS18B20數(shù)據(jù)手冊(cè)</p><p><b>  附1源程序代碼</b></p><p>  /***************************************************/<

54、;/p><p>  #include "reg51.h"</p><p>  #include "intrins.h"//_nop_();延時(shí)函數(shù)用</p><p>  #include "math.h"</p><p>  #define disdata P0

55、 //段碼輸出口</p><p>  #define discan P2 //掃描口</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit duqu=P3^

56、6; //溫度輸入口</p><p>  sbit dian=P0^7; //LED小數(shù)點(diǎn)控制</p><p>  sbit beep=P1^6;//蜂鳴器</p><p>  sbit key0=P3^0;</p><p>  sbit

57、key1=P3^1;</p><p>  sbit key02=P3^2;</p><p>  sbit key03=P3^3;</p><p>  sbit led0=P1^0;//紅燈</p><p>  sbit led1=P1^1;//綠燈</p><p>  s

58、bit led2=P1^2;//黃燈</p><p>  uint h; </p><p>  uint temp;</p><p>  uchar r;</p><p>  char high=40,low=15;</p><p>  uchar sign;</p>

59、;<p>  uchar st=1;</p><p>  uchar ti;</p><p>  uchar pp;</p><p>  uchar ee;</p><p>  uchar nn;</p><p>  //**************溫度小數(shù)部分用查表法*****

60、******//</p><p>  uchar code ditab[16]=</p><p>  {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};</p><p><b>  //</b></p><p&g

61、t;  uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};</p><p>  //共陰LED段碼表 "0" "1" "2" "3" "4" &q

62、uot;5" "6" "7" "8" "9" "不亮" "-" "H" "L" "C" </p><p>  uchar code scan_con[4]={0x70,0xb0,0xd0,0xe0}

63、; //列掃描控制字</p><p>  uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫放</p><p>  uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數(shù)據(jù),共4個(gè)數(shù)據(jù)和一個(gè)運(yùn)算暫用</p><p>  /*****

64、************11us延時(shí)函數(shù)*************************/</p><p>  void delay(uint t)</p><p><b>  {</b></p><p>  for (;t>0;t--);</p><p><b>  }</b></p

65、><p>  /****************顯示掃描函數(shù)***************************/</p><p>  void scan()</p><p><b>  {</b></p><p><b>  char k;</b></p><p>  for

66、(k=0;k<4;k++) //4位LED掃描控制</p><p><b>  {</b></p><p>  discan=scan_con[k]; //位選</p><p>  disdata=dis_7[display[k]]; //數(shù)據(jù)顯示</p><p&g

67、t;  if (k==1){dian=1;} //小數(shù)點(diǎn)顯示</p><p>  delay(200);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /****************DS18B20復(fù)位函數(shù)*********

68、***************/</p><p>  ow_reset(void)</p><p><b>  {</b></p><p>  char presence=1;</p><p>  while(presence)</p><p><b>  {</b><

69、/p><p>  while(presence)</p><p><b>  {</b></p><p>  duqu=1;_nop_();_nop_(); //從高拉倒低</p><p>  duqu=0; </p><p>

70、;  delay(50); //550 us</p><p>  duqu=1; </p><p>  delay(6); //66 us</p><p>  presence=duqu; //presence=0 復(fù)

71、位成功,繼續(xù)下一步</p><p><b>  } </b></p><p>  delay(45); //延時(shí)500 us</p><p>  presence=~duqu; </p><p><b>  }</b></p><

72、p>  duqu=1; //拉高電平</p><p><b>  }</b></p><p>  /****************DS18B20寫(xiě)命令函數(shù)************************/</p><p>  //向1-WIRE 總線上寫(xiě)1個(gè)字節(jié)</p>&l

73、t;p>  void write_byte(uchar val)</p><p><b>  { </b></p><p><b>  uchar i;</b></p><p>  for(i=8;i>0;i--)</p><p><b>  {</b></p

74、><p>  duqu=1;_nop_();_nop_(); //從高拉倒低</p><p>  duqu=0;_nop_();_nop_();_nop_();_nop_(); //5 us</p><p>  duqu=val&0x01; //最低位移出</p>

75、<p>  delay(6); //66 us</p><p>  val=val/2; //右移1位</p><p><b>  }</b></p><p><b>  duqu=1;</b&

76、gt;</p><p><b>  delay(1);</b></p><p><b>  }</b></p><p>  /****************DS18B20讀1字節(jié)函數(shù)************************/</p><p>  //從總線上取1個(gè)字節(jié)</p>

77、<p>  uchar read_byte(void)</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  uchar value=0;</p><p>  for(i=8;i>0;i--)</p><

78、;p><b>  {</b></p><p>  duqu=1;_nop_();_nop_();</p><p>  value>>=1;</p><p>  duqu=0;_nop_();_nop_();_nop_();_nop_(); //4 us</p><p>  duqu=1;_n

79、op_();_nop_();_nop_();_nop_(); //4 us</p><p>  if(duqu)value|=0x80;</p><p>  delay(6); //66 us</p><p><b>  }</b></p><

80、;p><b>  duqu=1;</b></p><p>  return(value);</p><p><b>  }</b></p><p>  /****************讀出溫度函數(shù)************************/</p><p>  uint read_te

81、mp()</p><p><b>  {</b></p><p>  ow_reset(); //總線復(fù)位</p><p>  delay(200);</p><p>  write_byte(0xcc); //發(fā)命令</p><p>  w

82、rite_byte(0x44); //發(fā)轉(zhuǎn)換命令</p><p>  ow_reset(); </p><p><b>  delay(1);</b></p><p>  write_byte(0xcc); //發(fā)命令</p><p>  write_byte(0xbe);&l

83、t;/p><p>  temp_data[0]=read_byte(); //讀溫度值的第字節(jié)</p><p>  temp_data[1]=read_byte(); //讀溫度值的高字節(jié)</p><p>  temp=temp_data[1];</p><p>  temp<<=8;

84、 </p><p>  temp=temp|temp_data[0]; // 兩字節(jié)合成一個(gè)整型變量。</p><p>  return temp; //返回溫度值</p><p><b>  }</b></p><p>  

85、/****************溫度數(shù)據(jù)處理函數(shù)************************/</p><p>  //二進(jìn)制高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一字節(jié),這個(gè)</p><p>  //字節(jié)的二進(jìn)制轉(zhuǎn)換為十進(jìn)制后,就是溫度值的百、十、個(gè)位值,而剩</p><p>  //下的低字節(jié)的低半字節(jié)轉(zhuǎn)化成十進(jìn)制后,就是溫度值的小數(shù)部分</p>

86、;<p>  /********************************************************/</p><p>  work_temp(uint tem)</p><p><b>  {</b></p><p>  uchar n=0;</p><p><b>

87、  nn=0;</b></p><p>  if(tem>6348) // 溫度值正負(fù)判斷</p><p>  {tem=65536-tem;n=1;nn=1;} // 負(fù)溫度求補(bǔ)碼,標(biāo)志位置1</p><p>  display[4]=tem&0x0f; // 取

88、小數(shù)部分的值</p><p>  display[0]=ditab[display[4]]; // 存入小數(shù)部分顯示值</p><p>  display[4]=tem>>4; // 取中間八位,即整數(shù)部分的值</p><p>  display[3]=display[4]/100; // 取百位數(shù)據(jù)暫存</p&g

89、t;<p>  display[1]=display[4]%100; // 取后兩位數(shù)據(jù)暫存</p><p>  display[2]=display[1]/10; // 取十位數(shù)據(jù)暫存</p><p>  display[1]=display[1]%10;</p><p>  r=display[1]+display[2]*10+d

90、isplay[3]*100;</p><p>  /******************符號(hào)位顯示判斷**************************/</p><p>  if(!display[3]) </p><p><b>  {</b></p><p>  display[3]=0x0a; //

91、最高位為0時(shí)不顯示</p><p>  if(!display[2])</p><p><b>  {</b></p><p>  display[2]=0x0a; //次高位為0時(shí)不顯示</p><p><b>  }</b></p><p><b>  }&

92、lt;/b></p><p>  if(n){display[3]=0x0b;} //負(fù)溫度時(shí)最高位顯示"-"</p><p><b>  }</b></p><p>  /******************蜂鳴器報(bào)警函數(shù)**************************/</p><p&

93、gt;  void BEEP()</p><p><b>  {</b></p><p>  if(r>=high||r<=low)</p><p><b>  {</b></p><p>  beep=0;led1=1;</p><p>  if(r>=h

94、igh)</p><p><b>  {</b></p><p>  led0=0;led2=1;</p><p><b>  }</b></p><p>  else if(r<=low)</p><p><b>  {</b></p&g

95、t;<p>  led2=0;led0=1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if((nn==1)&&(r>=abs(low)))</p><p><b>  {</b

96、></p><p>  led2=0;led0=1;beep=0;led1=1;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  beep=1;led

97、1=0;led0=1;led2=1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************初始化函數(shù)**************************/</p><p>  void init()</p&g

98、t;<p><b>  {</b></p><p><b>  beep=0;</b></p><p><b>  EA=1;</b></p><p><b>  EX0=0;</b></p><p><b>  EX1=0;&l

99、t;/b></p><p><b>  IT0=1;</b></p><p><b>  IT1=1;</b></p><p>  TMOD=0x11;</p><p>  TH0=(65536-10000)/256;</p><p>  TL0=(65536-1000

100、0)%256;</p><p>  TH1=(65536-833)/256;</p><p>  TL1=(65536-833)%256;</p><p><b>  sign=0;</b></p><p><b>  ti=high;</b></p><p><b&

101、gt;  }</b></p><p>  /******************溫度/上下限調(diào)整切換**************************/</p><p>  void key11()</p><p><b>  {</b></p><p>  while(key1==0)</p>

102、<p><b>  {</b></p><p>  delay(300);</p><p>  if(key1==0)</p><p><b>  {</b></p><p><b>  st++;</b></p><p><b&

103、gt;  if(st==4)</b></p><p><b>  st=1;</b></p><p><b>  }</b></p><p>  while(!key1);</p><p>  delay(300);</p><p>  while(!key1);

104、</p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************切換調(diào)整上下限**************************/</p><p>  void key10()</p><p>&l

105、t;b>  {</b></p><p>  while(key0==0)</p><p>  { </p><p>  delay(300); //消抖動(dòng)</p><p>  if(key0==0)</p><p><b>  {&

106、lt;/b></p><p>  sign=!sign;</p><p><b>  }</b></p><p>  while(!key0);</p><p>  delay(300);</p><p>  while(!key0);</p><p><b&g

107、t;  }</b></p><p><b>  }</b></p><p>  /******************上下限加1**************************/</p><p>  void key2() </p><p><b>  {</b></p>

108、<p>  while(key02==0)</p><p><b>  {</b></p><p>  delay(400);</p><p>  if(key02==0)</p><p><b>  {</b></p><p><b>  if(si

109、gn)</b></p><p>  {low=low+1;</p><p>  if(low>high)</p><p>  {pp=low;low=high;high=pp;}</p><p><b>  }</b></p><p><b>  else</b

110、></p><p>  {high=high+1;ti=high;}</p><p><b>  }</b></p><p>  while(!key02);</p><p>  delay(400);</p><p>  while(!key02);</p><p&g

111、t;<b>  }</b></p><p><b>  }</b></p><p>  /******************上下限減1**************************/</p><p>  void key3() </p><p><b>  {</b>&

112、lt;/p><p>  while(key03==0)</p><p><b>  {</b></p><p>  delay(400);</p><p>  if(key03==0)</p><p><b>  {</b></p><p><b&g

113、t;  if(sign)</b></p><p>  low=low-1;</p><p><b>  else</b></p><p>  {high=high-1;ti=high;</p><p>  if(low>high)</p><p>  {pp=low;low=h

114、igh;high=pp;}</p><p><b>  }</b></p><p><b>  }</b></p><p>  while(!key03);</p><p>  delay(400);</p><p>  while(!key03);</p>

115、<p><b>  } </b></p><p><b>  }</b></p><p>  /******************上限溫度顯示**************************/</p><p>  void high1()</p><p><b>  

116、{</b></p><p><b>  uchar k;</b></p><p>  if(high<100)</p><p>  {display[0]=high%10;</p><p>  display[1]=high/10;</p><p>  display[2]=1

117、0;</p><p>  display[3]=12;</p><p>  for(k=0;k<4;k++) </p><p><b>  {</b></p><p>  discan=scan_con[k]; </p><

118、;p>  disdata=dis_7[display[k]]; </p><p>  if (k==1){dian=0;} </p><p>  delay(300);</p><p>  disdata=0x00;</p><p>  delay(100);</p>&

119、lt;p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  display[0]=high%10;</p><

120、;p>  display[1]=high%100/10;</p><p>  display[2]=high/100;</p><p>  display[3]=12;</p><p>  for(k=0;k<4;k++) </p><p><b>  {</b>

121、;</p><p>  discan=scan_con[k]; </p><p>  disdata=dis_7[display[k]]; </p><p>  if (k==1){dian=0;} </p><p>  delay(300);</p>

122、<p>  disdata=0x00;</p><p>  delay(100);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /********

123、**********下限溫度顯示**************************/</p><p>  void low1()</p><p><b>  {</b></p><p><b>  uchar ki;</b></p><p>  if(low>=0)</p>&

124、lt;p>  { display[0]=low%10;</p><p>  display[1]=low/10;</p><p>  display[2]=10;</p><p>  display[3]=13;</p><p>  for(ki=0;ki<4;ki++) </p&

125、gt;<p><b>  {</b></p><p>  discan=scan_con[ki]; </p><p>  disdata=dis_7[display[ki]]; </p><p>  if (ki==1){dian=0;} </p>

126、<p>  delay(100);</p><p>  disdata=0x00;</p><p>  delay(100);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</

127、b></p><p><b>  {</b></p><p>  ee=abs(low);</p><p>  display[0]=ee%10;</p><p>  display[1]=ee/10;</p><p>  display[2]=11;</p><p>

128、;  display[3]=13;</p><p>  for(ki=0;ki<4;ki++) </p><p><b>  {</b></p><p>  discan=scan_con[ki]; </p><p>  disdata=dis_7[

129、display[ki]]; </p><p>  if (ki==1){dian=0;} </p><p>  delay(100);</p><p>  disdata=0x00;</p><p>  delay(100);</p><p><b>  }<

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論