版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)數(shù)字溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)——數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 基于單片機(jī)溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 基于單片機(jī)溫度計(jì)課程設(shè)計(jì)
- 數(shù)字溫度計(jì)--單片機(jī)課程設(shè)計(jì)
- 溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)數(shù)字顯示溫度計(jì)
- 溫度計(jì)課程設(shè)計(jì)---單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)溫度計(jì)課程設(shè)計(jì)--人工智能時(shí)鐘溫度計(jì)
評(píng)論
0/150
提交評(píng)論