版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 摘 要1</b></p><p><b> 引言1</b></p><p><b> 1 器件簡介2</b></p><p> 1.1 AT89S52簡介2<
2、/p><p> 1.1.1 主要性能2</p><p> 1.1.2 引腳說明3</p><p> 1.2 DS18B20簡介5</p><p> 1.2.1 主要特性5</p><p> 1.2.2 DS18B20的外形和內(nèi)部結(jié)構(gòu)6</p><p> 1.2.3 DS18B2
3、0引腳定義7</p><p><b> 2 系統(tǒng)設(shè)計7</b></p><p> 2.1功能與設(shè)計方案7</p><p> 2.1.1 功能要求7</p><p> 2.1.2 設(shè)計方案7</p><p> 2.1.2.1 方案論證8</p><p&g
4、t; 2.1.2.2 總體設(shè)計框圖8</p><p> 2.2 系統(tǒng)硬件設(shè)計8</p><p><b> 3 程序設(shè)計10</b></p><p> 3.1 下位機程序10</p><p> 3.1.1 DS18B20讀寫模塊10</p><p> 3.1.2 數(shù)碼管顯示模
5、塊11</p><p> 3.1.3 RS232串口通訊模塊12</p><p> 3.2 上位機程序12</p><p> 3.2.1 串口初始化12</p><p> 3.2.2 串口觸發(fā)接收程序13</p><p> 3.2.3 界面設(shè)計和數(shù)據(jù)分析統(tǒng)計程序14</p><
6、p><b> 結(jié)束語15</b></p><p><b> 附錄16</b></p><p><b> 致謝30</b></p><p><b> 作者簡介31</b></p><p><b> 聲明31</b&g
7、t;</p><p> 基于51單片機的溫度數(shù)據(jù)采集系統(tǒng)</p><p> ?。壅∫轀囟仁且环N被廣泛應(yīng)用于生產(chǎn)和生活的重要的物理量。在許多應(yīng)用領(lǐng)域,研制適當和高效的測溫系統(tǒng)是十分必要的。本文結(jié)合實際使用經(jīng)驗,設(shè)計了一個基于51單片機和DS18B20溫度傳感器的近距離溫度數(shù)據(jù)采集系統(tǒng)。該系統(tǒng)主要包括:溫度傳感器、單片機與PC RS232串行接口通訊、VB程序、模數(shù)轉(zhuǎn)換等部分。在本文設(shè)計
8、的中,為了實現(xiàn)人機對話和及時了解系統(tǒng)的運行狀況,特給本系統(tǒng)增加了告警功能。該系統(tǒng)可應(yīng)用于倉庫測溫、樓宇空調(diào)控制和生產(chǎn)過程監(jiān)控等領(lǐng)域。</p><p> [關(guān)鍵詞]溫度測量;DS18B20;單片機;Visual Basic;</p><p> The temperature data acquisition system based 51 MCU</p>
9、<p> Abstract:Temperature is an important physical quantity that widely used in production and living. In many applications, it's very necessary to develop appropriate and efficient temperature measuring syste
10、m. Combining with the actual using experience, this article introduces a short distance temperature data acquisition system which designs based on 51MCU and DS18B20. This system mainly includes temperature sensor, MCU, P
11、C RS232 Serial interface, VB programming, and DAC. In this design, in order </p><p> Key words:temperature Measurement;DS18B20;MCU;Visual Basic</p><p><b> 引言</b></p><p&g
12、t; 在生產(chǎn)和日常生活中,溫度的測量及控制十分重要。實時溫度檢測系統(tǒng)在各個方面的應(yīng)用十分廣泛:消防電氣的非破壞性溫度檢測,大型電力、通訊設(shè)備的過熱故障預知檢測,空調(diào)系統(tǒng)的溫度檢測,各類機械組件組件的過熱預警,醫(yī)療相關(guān)設(shè)備的溫度測試…等等【1】。由此可見實時溫度檢測系統(tǒng)應(yīng)用十分廣闊。</p><p> 隨著科學技術(shù)的飛速發(fā)展,電子學的發(fā)展也越來越快,帶動了大批相關(guān)產(chǎn)業(yè)的發(fā)展,其應(yīng)用范圍也越來越廣泛。如今,計算機
13、的使用領(lǐng)域已經(jīng)擴展到了各個行業(yè),在這種形勢下,要想適應(yīng)當今社會需求,就必須設(shè)計一種基于PC技術(shù)的新式電子儀器,以滿足社會更高層次的需求。近年來,單片機發(fā)展同樣十分迅速,一個以嵌入式微機應(yīng)用為主的新技術(shù)革命浪潮正在蓬勃興起,單片機已經(jīng)滲透到工業(yè)、農(nóng)業(yè)、國防、科研等各個領(lǐng)域。傳統(tǒng)的溫度采集方式不僅耗時,而且精度較低,遠不能滿足各行業(yè)對于溫度數(shù)據(jù)高精度、高可靠性的要求。單片機和高精密的數(shù)字溫度傳感器的出現(xiàn)使得溫度數(shù)據(jù)的處理和采集得到了很好的解
14、決?;趩纹瑱C和數(shù)字溫度傳感器的溫度測量系統(tǒng),不但方便快捷,成本較低,而且大幅度提高了測量的精度【2】。</p><p> 本文介紹了一種基于51單片機和DS18B20數(shù)字溫度傳感器實現(xiàn)實時溫度數(shù)據(jù)采集和處理的一種設(shè)計方案。其中涉及了傳感器、數(shù)據(jù)采集、單片機數(shù)據(jù)處理、單片機和PC的串口通訊、VB編程等一系列相關(guān)理論。本設(shè)計運用主從式思想,由一臺上位機(PC微型計算機)處理和顯示溫度,一臺下位機(單片機)進行溫度
15、數(shù)據(jù)采集,組成兩級式溫度測量的檢測系統(tǒng)。該系統(tǒng)采用 RS-232串行通訊標準,通過上位機(PC)控制下位機(單片機)進行實時溫度采集。溫度值既可以送回主控PC進行數(shù)據(jù)處理,由顯示器顯示,也可以由下位機單獨工作,實時顯示當前的溫度值,對溫度進行監(jiān)控。下位機采用的是基于單片機和數(shù)字溫度傳感器DS18B20的系統(tǒng)。DS18B20利用單總線的特點可以方便的實現(xiàn)溫度的測量,并可以輕松的組建傳感器網(wǎng)絡(luò),該系統(tǒng)的抗干擾性好、設(shè)計靈活、方便,而且適合在
16、惡劣的環(huán)境下進行實時溫度測量【3】。本方案設(shè)計的系統(tǒng)可以應(yīng)用在大型工業(yè)及民用常溫監(jiān)測場合,如糧倉系統(tǒng)、大樓空調(diào)系統(tǒng)、醫(yī)療與健診的溫度測試、石化、機械…等,并且該系統(tǒng)在達到所需精度的同時,具有較高的性價比。</p><p><b> 1 器件簡介</b></p><p> 1.1 AT89S52簡介</p><p> AT89S52是一種
17、低功耗、高性能CMOS 8位微控制器,具有8K 在系統(tǒng)可編程Flash 存儲器【4】。使用Atmel 公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52在眾多嵌入式控制應(yīng)用系統(tǒng)中得到廣泛應(yīng)用。</p><p> 1.1.1 主要性能</p&g
18、t;<p> 1、與MCS-51單片機產(chǎn)品兼容;</p><p> 2、8K字節(jié)在系統(tǒng)可編程Flash存儲器;</p><p> 3、1000次擦寫周期;</p><p> 4、全靜態(tài)操作:0Hz-33MHz;</p><p> 5、三級加密程序存儲器;</p><p> 6、32個可編程I/
19、O口線;</p><p> 7、三個16位定時器/計數(shù)器;</p><p><b> 8、六個中斷源;</b></p><p> 9、全雙工UART串行通道;</p><p> 10、低功耗空閑和掉電模式;</p><p> 11、掉電后中斷可喚醒;</p><p&g
20、t; 12、看門狗定時器;</p><p><b> 13、雙數(shù)據(jù)指針;</b></p><p><b> 14、掉電標識符。</b></p><p> 1.1.2 引腳說明</p><p> AT89S52 是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存
21、儲器。使用Atmel 公司高密度非 易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完 全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于 常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng) 可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提 供高靈活、超有效的解決方案。 AT89S52具有以下標準功能: 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時器,2 個數(shù)據(jù)指針,三個16
22、位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口, 片內(nèi)晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工 作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié), 單片機一切工作停止,直到下一個中斷或硬件復位為止。</p><p> P0 口:P0口是一個8位漏極開路的雙向I/O口。作為
23、輸出口,每位能驅(qū)動8個TTL邏 輯電平。對P0端口寫“1”時,引腳用作高阻抗輸入。 當訪問外部程序和數(shù)據(jù)存儲器時,P0口也被作為低8位地址/數(shù)據(jù)復用。在這種模式下, P0不具有內(nèi)部上拉電阻。 在flash編程時,P0口也用來接收指令字節(jié);在程序校驗時,輸出指令字節(jié)。程序校驗 時,需要外部上拉電阻。</p><p> P1 口:P1 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,p1 輸出緩沖器能驅(qū)動4 個 T
24、TL 邏輯電平。對P1 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入 口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。此外,P1.0和P1.1分別作定時器/計數(shù)器2的外部計數(shù)輸入(P1.0/T2)和定時器/計數(shù)器2 的觸發(fā)輸入(P1.1/T2EX)。 在flash編程和校驗時,P1口接收低8位地址字節(jié)。</p><p><b> 引腳號第二功能:</
25、b></p><p> P1.0 T2(定時器/計數(shù)器T2的外部計數(shù)輸入),時鐘輸出</p><p> P1.1 T2EX(定時器/計數(shù)器T2的捕捉/重載觸發(fā)信號和方向控制)</p><p> P1.5 MOSI(在系統(tǒng)編程用)</p><p> P1.6 MISO(在系統(tǒng)編程用)</p><p> P
26、1.7 SCK(在系統(tǒng)編程用)</p><p> P2 口:P2 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅(qū)動 4 個 TTL 邏輯電平。對P2 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入 口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。 在訪問外部程序存儲器或用16位地址讀取外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX @DPTR) 時,P2 口送
27、出高八位地址。在這種應(yīng)用中,P2 口使用很強的內(nèi)部上拉發(fā)送1。在使用 8位地址(如MOVX @RI)訪問外部數(shù)據(jù)存儲器時,P2口輸出P2鎖存器的內(nèi)容。 在flash編程和校驗時,P2口也接收高8位地址字節(jié)和一些控制信號。</p><p> P3 口:P3 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,p3 輸出緩沖器能驅(qū)動4 個 TTL 邏輯電平。對P3 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸
28、入 口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。 P3口亦作為AT89S52特殊功能(第二功能)使用,如下表所示。 在flash編程和校驗時,P3口也接收一些控制信號。</p><p> 端口引腳 第二功能:</p><p> P3.0 RXD(串行輸入口)</p><p> P3.1 TXD(串行輸出口)</p&g
29、t;<p> P3.2 INTO(外中斷0)</p><p> P3.3 INT1(外中斷1)</p><p> P3.4 TO(定時/計數(shù)器0)</p><p> P3.5 T1(定時/計數(shù)器1)</p><p> P3.6 WR(外部數(shù)據(jù)存儲器寫選通)</p><p> P3.7 RD(外
30、部數(shù)據(jù)存儲器讀選通) 此外,P3口還接收一些用于FLASH閃存編程和程序校驗的控制信號。</p><p> RST:復位輸入。當振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將是單片機復位。</p><p> ALE/PROG:當訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因
31、此它可對外輸出時鐘或用于定時目的。要注意的是:每當訪問外部數(shù)據(jù)存儲器時將跳過一個ALE脈沖。對FLASH存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX和MOVC指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應(yīng)設(shè)置ALE禁止位無效。</p><p> PSEN:程序
32、儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當AT89S52由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖,在此期間,當訪問外部數(shù)據(jù)存儲器,將跳過兩次PSEN信號。</p><p> EA/VPP:外部訪問允許,欲使CPU僅訪問外部程序存儲器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復位時內(nèi)部會鎖存EA端狀態(tài)。
33、如EA端為高電平(接Vcc端),CPU則執(zhí)行內(nèi)部程序存儲器的指令。FLASH存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當然這必須是該器件是使用12V編程電壓Vpp。</p><p> XTAL1:振蕩器反相放大器和內(nèi)部時鐘發(fā)生電路的輸入端。</p><p> XTAL2:振蕩器反相放大器的輸出端。</p><p> 1.2 DS18B20簡介<
34、;/p><p> 1.2.1 主要特性</p><p> 1適應(yīng)電壓范圍更寬,電壓范圍:3.0~5.5V,在寄生電源方式下可由數(shù) 據(jù)線供電</p><p> 2獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊</p><p> 3 DS18B20支持多點組網(wǎng)功能,多個DS18B2
35、0可以并聯(lián)在唯一的三線上,實現(xiàn)組網(wǎng)多點測溫</p><p> 4 DS18B20在使用中不需要任何外圍元件,全部 傳感元件及轉(zhuǎn)換電路集成在形如一只三極管的集成電路內(nèi)</p><p> 5 測溫范圍-55℃~+125℃,在-10~+85℃時精度為±0.5℃</p><p> 6 可編程 的分辨率為9~12位,對應(yīng)的可分辨溫度分別為0.5℃、0.25℃、
36、0.125℃和0.0625℃,可實現(xiàn)高精度測溫</p><p> 7 在9位分辨率時最多在 93.75ms內(nèi)把溫度轉(zhuǎn)換為數(shù)字,12位分辨率時最多在750ms內(nèi)把溫度值轉(zhuǎn)換為數(shù)字,速度更快</p><p> 8 測量結(jié)果直接輸出數(shù)字溫度信號,以"一 線總線"串行傳送給CPU,同時可傳送CRC校驗碼,具有極強的抗干擾糾錯能力</p><p>
37、9 負壓特性:電源極性接反時,芯片不會因發(fā)熱而燒毀, 但不能正常工作。</p><p> 1.2.2 DS18B20的外形和內(nèi)部結(jié)構(gòu)</p><p> DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM 、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器【5】。DS18B20的外形和內(nèi)部結(jié)構(gòu)如下圖1、圖2:</p><p><b> 圖
38、1</b></p><p><b> 圖2</b></p><p> 1.2.3 DS18B20引腳定義:</p><p> (1)DQ為數(shù)字信號輸入/輸出端;</p><p> (2)GND為電源地;</p><p> (3)VDD為外接供電電源輸入端(在寄生電源接線方式時
39、接地)。</p><p><b> 2 系統(tǒng)設(shè)計</b></p><p> 2.1功能與設(shè)計方案</p><p> 2.1.1 功能要求</p><p> 設(shè)計一個基于89S52單片機、DS18B20數(shù)字溫度傳感器、Visual Basic 6.0的數(shù)據(jù)采集系統(tǒng)。用單片機系統(tǒng)接收溫度傳感器的溫度數(shù)據(jù),并在6位數(shù)碼
40、管上顯示當前溫度值,可測溫度范圍-55-125攝氏度,精度0.1攝氏度。</p><p> 使用VB6.0編寫上位機程序,接收溫度數(shù)據(jù)并同步畫出溫度變化的曲線。</p><p> 整個實時數(shù)據(jù)采集系統(tǒng)在設(shè)計時主要應(yīng)該滿足一下功能指標:</p><p> 測量溫度,并在8位數(shù)碼管上顯示實時溫度值;</p><p> 可測溫范圍-55-1
41、25攝氏度,精度0.1攝氏度;</p><p> 每秒給上位機傳送一次溫度數(shù)據(jù);</p><p> 上位機接收溫度,并將數(shù)據(jù)相關(guān)信息同步到曲線和表格中;</p><p> 2.1.2 設(shè)計方案</p><p> 2.1.2.1 方案論證</p><p> 方案一:采用熱敏電阻,可滿足40攝氏度至90攝氏度
42、測量范圍,但熱敏電阻精度、重復性、可靠性較差,對于檢測1攝氏度的信號是不適用的。而且在溫度測量系統(tǒng)中,采用單片溫度傳感器,比如AD590,LM35等.但這些芯片輸出的都是模擬信號,必須經(jīng)過A/D轉(zhuǎn)換后才能送給計算機,這樣就使得測溫裝置的結(jié)構(gòu)較復雜.另外,這種測溫裝置的一根線上只能掛一個傳感器,不能進行多點測量.即使能實現(xiàn),也要用到復雜的算法,一定程度上也增加了軟件實現(xiàn)的難度。</p><p> 方案二:考慮使用
43、溫度傳感器,在單片機電路設(shè)計中,大多都是使用傳感器,所以可以采用一只數(shù)字溫度傳感器DS18B20,利用此傳感器,可以很容易直接讀取被測溫度值,進行轉(zhuǎn)換,就可以滿足設(shè)計要求。</p><p> 從以上兩種方案的論述中容易看出,采用方案二電路比較簡單,軟件設(shè)計也比較簡單,綜上所述采用方案二。</p><p> 2.1.2.2 總體設(shè)計框圖</p><p> 實時
44、溫度系統(tǒng)電路設(shè)計總體設(shè)計框圖如圖3所示,控制器采用單片機AT89S52,溫度傳感器采用DS18B20,用8位LED數(shù)碼管以串口傳送數(shù)據(jù)實現(xiàn)溫度顯示并通過串口與上位機通訊,把溫度數(shù)據(jù)傳送給上位機,用VB編寫的圖形界面程序把溫度變化曲線顯示出來。</p><p><b> 圖3</b></p><p> 2.2 系統(tǒng)硬件設(shè)計</p><p>
45、 整體系統(tǒng)硬件電路包括傳感器數(shù)據(jù)采集電路、溫度顯示電路、報警電路、單片機最小系統(tǒng)主板電路等,電路圖和仿真圖如圖4、圖5所示。</p><p><b> 圖4</b></p><p><b> 圖5</b></p><p> 溫度傳感器的數(shù)據(jù)總線接單片機的P3.3口,單片機通過反復讀寫P3.3口的狀態(tài)采集數(shù)據(jù),因此讀寫
46、時有嚴格的時序要求。</p><p> 顯示電路采用6個共陽極的LED數(shù)碼管顯示,顯示掃描代碼PO口發(fā)送,由于PO口內(nèi)部沒有上拉電阻,因此需要外接上拉電阻。P1口的邏輯狀態(tài)作位選線信號,達到分時選通的目的,當相應(yīng)口為高電平是LED數(shù)碼管才能顯示相應(yīng)代碼。</p><p> 此外,電路中還接有蜂鳴器,當DS18B20工作不正常時可以達到報警的目的。最后還要實現(xiàn)單片機與上位機通信的功能,通
47、過MAX232電平轉(zhuǎn)換芯片將單片機的TTL信號轉(zhuǎn)換為串口的標準電平信號,以便能向上位機發(fā)送或接收數(shù)據(jù)。</p><p><b> 3 程序設(shè)計</b></p><p><b> 3.1 下位機程序</b></p><p> 下位機程序采用C語言編寫,開機時對DS18B20數(shù)字溫度傳感器進行檢測,如果DS18B20檢測
48、不正常,則蜂鳴器報警,并關(guān)閉顯示。采用6個LED數(shù)碼管顯示,其中4個顯示溫度值,2個顯示溫度符號。同時如果溫度值最高位為0將不顯示出來。下位機程序使用C語言編寫比使用匯編語言編寫的可讀性要好很多,整個下位機程序包括三個模塊:DS18B20讀寫模塊、數(shù)碼管顯示模塊、RS232串口通訊模塊。只有當上位機向下位機發(fā)出讀取溫度數(shù)據(jù)的指令時,下位機才會將測得的實時溫度數(shù)據(jù)經(jīng)RS232串口傳給上位機。</p><p> 3
49、.1.1 DS18B20讀寫模塊</p><p> 首先需要初始化DS18B20:</p><p> uchar Init_DS18B20(void) </p><p><b> {</b></p><p> DQ = 1; </p><p> Delay(8); <
50、;/p><p> DQ = 0; </p><p> Delay(90); </p><p> DQ = 1; </p><p><b> Delay(8);</b></p><p> presence = DQ; // 如果=0則初始化成功 =1則初
51、始化失敗</p><p> Delay(100);</p><p><b> DQ = 1; </b></p><p> return(presence); // 返回信號,0=presence,1= no presence</p><p><b> }</b></p><
52、;p> 初始化完畢后,轉(zhuǎn)入溫度讀取程序。其流程為一無限循環(huán),單片機不斷從DS18B20讀取溫度數(shù)據(jù)。此處用flash標志DS18B20的工作狀態(tài),當flash=1時表示DS18B20工作異常,同時關(guān)閉顯示和蜂鳴器報警。此部分程序詳見附錄1,此處不再詳述。</p><p> 3.1.2 數(shù)碼管顯示模塊</p><p> 由于單片機控制端口有限,因此采用掃描顯示的方式,即通過快速刷
53、新數(shù)碼管的筆畫顯示,由于人眼視覺殘留的效應(yīng),只要刷新的速度足夠快,就能同時看到6個數(shù)碼管的顯示,有效的節(jié)省了單片機的控制端口。此外,在顯示模塊中,由于設(shè)計要求的顯示精度是精確到一位小數(shù),而DS18B20每一位的轉(zhuǎn)化溫度是0.0625攝氏度,因此小數(shù)第一位只有16種狀態(tài),因此只需要一一算出放在一個數(shù)組中,通過查表命令即可得到第一位小數(shù)的十進制數(shù)值。同時通過移位即可獲得一個新的溫度整數(shù)部分的數(shù)據(jù),此處的部分代碼如下:</p>
54、<p> unsigned char n=0;</p><p> display[4]=temp_data[0]&0x0f;</p><p> display[0]=ditab[display[4]]; // 通過查表命令得小數(shù)位的值</p><p> display[4]=((temp_data[0]&0xf0)>
55、>4)|((temp_data[1]&0x0f)<<4);</p><p> display[3]=display[4]/100;</p><p> display[1]=display[4]%100; </p><p> display[2]=display[1]/10;</p><p> display
56、[1]=display[1]%10; </p><p> if(!display[3]) </p><p><b> { </b></p><p> display[3]=0x0a; </p><p> if(!display[2]) </p>
57、<p> display[2]=0x0a;</p><p><b> }</b></p><p> 此段程序中,display[0]為小數(shù)位十進制數(shù),display[3]為百位十進制數(shù),display[2]為十位十進制數(shù),display[1]為個位十進制數(shù)。然后再通過查詢共陽極LED數(shù)碼管的顯示代碼分時選通即可顯示當前溫度值。</p>
58、<p> unsigned char code LEDData[ ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}</p><p> 因為個位還需要顯示小數(shù)點,故其顯示代碼稍有不同:</p><p> unsigned char code
59、 LEDdian[ ]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78, 0x00,0x10}</p><p> 3.1.3 RS232串口通訊模塊</p><p> 在此部分模塊中,波特率和晶振頻率在程序初始化時已經(jīng)定義為9600b/s和11.0592MHz,以便和上位機的波特率匹配。波特率的產(chǎn)生用定時器產(chǎn)生,本設(shè)計中選擇定時器
60、1,并設(shè)置其為工作方式2,8位的常數(shù)自動重載定時器,這種工作方式可以省去用戶軟件中重裝初值的代碼,極大的簡化了定時初值的計算,并可以精確確定定時時間。計算出定時器的初值后,就可以設(shè)定串口的工作方式了。部分代碼如下:</p><p> void init(void)</p><p><b> {</b></p><p> EA = 1;
61、 </p><p> TMOD = 0x20;// 定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率</p><p> TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));</p><p> TL1=(unsigned char)(256 -
62、(XTAL / (32L * 12L * baudrate))); // 定時器賦初值</p><p> SCON = 0x50;// 設(shè)定串行口工作方式</p><p> PCON &= 0x00;// 波特率不倍增</p><p> TR1 = 1;// 啟動定時器1</p><p> IE = 0
63、x00;// 禁止任何中斷</p><p><b> } </b></p><p><b> 3.2 上位機程序</b></p><p> 上位機程序中,通過使用VB6.0的通用串口控件MSComm來對發(fā)送到串口的數(shù)據(jù)進行處理和顯示。上位機程序設(shè)計的核心是串口的初始化程序和接收程序的設(shè)計。</p>
64、<p> 3.2.1 串口初始化</p><p><b> 主要設(shè)計過程如下:</b></p><p> 串口設(shè)置:MSComm.SetSettings(波特率、校檢方式、數(shù)據(jù)位數(shù)、停止位數(shù))</p><p> 串口數(shù)據(jù):MSComm.InputMode(輸入模式)</p><p><b>
65、; 部分代碼如下:</b></p><p> On Error GoTo err:</p><p> MSComm1.CommPort = 1 ' 默認設(shè)置為COM1</p><p> MSComm1.InputMode = comInputModeBinary
66、 ' 二進制輸入模式</p><p> MSComm1.RThreshold = 1 ' 接收1個字符觸法OnComm 事件</p><p> MSComm1.SThreshold = 1 ' 發(fā)送1個字符觸法OnComm 事件</p><p> MSComm1.
67、Settings = "9600,n,8,2" ' 設(shè)置波特率</p><p> 此處均為默認設(shè)置,可以根據(jù)具體情況更改設(shè)置,但必須與下位機一致。另外程序還包括提示出錯程序,當串口不存在或被占用時會出現(xiàn)提示信息。</p><p> 3.2.2 串口觸發(fā)接收程序</p><p> 當
68、每發(fā)送一次指令時,就會觸發(fā)OnComm事件,并返回數(shù)據(jù)串,通過計算得到溫度測量值并顯示出來,部分程序如下:</p><p> Private Sub MSComm1_OnComm()</p><p> Dim Inbyte() As Byte ' 接收數(shù)據(jù)暫存</p><p> Dim buffer As
69、 String ' 溫度數(shù)據(jù)緩沖</p><p> Dim datatemp2a, datatemp2b As String ' 兩字節(jié)進制溫度數(shù)據(jù)</p><p> Dim datatemp2 As String ' 十六進制溫度數(shù)據(jù)</p>
70、<p> Dim count As Integer ' 接收個數(shù)計數(shù)</p><p> If num > Txttimes.Text - 1 Then ' 接收個數(shù)判斷</p><p> Timer1.Enabled = False '
71、; 接收完畢</p><p> Shpstate.FillColor = &H80FF&</p><p><b> Exit Sub</b></p><p><b> End If</b></p><p> Select Case MSComm1.CommEvent</
72、p><p> Case comEvReceive</p><p> count = MSComm1.InBufferCount </p><p> Inbyte = MSComm1.Input </p><p> If count <> 2 Then Exit Sub coun
73、ter = counter + 1 </p><p> For i = LBound(Inbyte) To UBound(Inbyte) buffer = buffer + Hex(Inbyte(i)) + Chr(32)</p><p><b> Next i</b></p><p> E
74、nd Select</p><p> 3.2.3 界面設(shè)計和數(shù)據(jù)分析統(tǒng)計程序</p><p> 此部分對采集到的實時溫度數(shù)據(jù)進行處理并顯示,包括最大值、最小值、平均值、當前值,同時用表格和坐標曲線表示。此部分代碼詳見附錄2,此處不再詳述。</p><p><b> 結(jié)束語</b></p><p> 溫度測量系統(tǒng)是
75、現(xiàn)代工業(yè)生產(chǎn)過程中的一個重要環(huán)節(jié),特別是大型企業(yè)的主要設(shè)備往往需要極其精確的測量溫度參數(shù),甚至在許多需要對溫度進行監(jiān)控和分析的場合還要求一種保證精度和高穩(wěn)定性的同時自動化水平高、應(yīng)用范圍廣的溫度采集手段。而目前許多老舊設(shè)備上普遍存在和使用的測溫設(shè)備都有溫度信息傳遞不及時、精度不夠的嚴重缺點,不利于工作人員根據(jù)溫度變化及時作出決定,嚴重影響和阻礙了工業(yè)自動化的發(fā)展,此時開發(fā)一種能夠?qū)崟r性高、精度高、穩(wěn)定性高的綜合溫度處理分析監(jiān)控系統(tǒng)就十分
76、必要。</p><p> 在這種背景下,本文設(shè)計實現(xiàn)了低成本、高可靠、高實時性的基于51單片機和DS18B20數(shù)字溫度傳感器的溫度數(shù)據(jù)采集系統(tǒng)。在設(shè)計過程中,對整個系統(tǒng)的硬件和軟件皆采用模塊化程序設(shè)計的方法,將系統(tǒng)功能劃分為幾個子模塊,最后再進行整合,從而實現(xiàn)了最終的溫度數(shù)據(jù)采集系統(tǒng)的設(shè)計。</p><p><b> 參考文獻</b></p><
77、;p> [1] 王勇,葉敦范. 基于AT89S51的便攜式實時溫度檢測儀 [J] 儀表技術(shù)與傳感器 , Instrument Technique and Sensor, 2006,(4).</p><p> [2] 王學梅,金廣鋒.數(shù)字溫度傳感器DS18B20在糧倉溫度智能控制系統(tǒng)中的應(yīng)用 [J] 科技廣場 , Science Mosaic, 2009,(5).</p><p
78、> [3] 史寶玲. DS18B20數(shù)字溫度傳感器技術(shù)分析 [J] 中國新技術(shù)新產(chǎn)品 , China New Technologies and Products, 2011,(4). </p><p> [4] 白建社,王航宇.基于AT89S52的多用途工業(yè)控制器設(shè)計 [J] 科技廣場 , Science Mosaic, 2008,(3). </p><p> [5
79、] 夏莉英,陳雁.基于DS18B20的溫度測控系統(tǒng)設(shè)計 [J] 微計算機信息 , Microcomputer Information, 2011,(1).</p><p> [6] 霖鋒. Professional embedded from 51 mcu to ARM[M].哈工大,2007</p><p> [7] 郭天祥.Altium Designer6.9 PCB設(shè)計
80、教程[M].哈工大,2004</p><p> [8] 戴佳.51單片機應(yīng)用系統(tǒng)開發(fā)典型實例[M].電力出版社,2005年6月</p><p> [9] 沈德金,陳粵初.MCS-51系列單片機接口電路與應(yīng)用程序?qū)嵗齕M].北京航空航天大學出版社,1999</p><p> [10] 陳海宴.51單片機原理及應(yīng)用[M].北京航空航天大學出版社,2010.&
81、lt;/p><p> [11] 童詩白.模擬電子技術(shù)基礎(chǔ)[M].高等教育出版社,2001 </p><p> [12] 鐘富昭等.8051單片機典型模塊設(shè)計與應(yīng)用[M].人民郵電出版社,2007</p><p> [13] 李平等.單片機入門與開發(fā)[M].機械工業(yè)出版社,2008</p><p> [14] 王東峰等.單片機C語言
82、應(yīng)用100例[M].電子工業(yè)出版社,2009</p><p><b> 附錄</b></p><p><b> 附錄A 下位機程序</b></p><p> #include <reg52.h></p><p> #define XTAL 11059200 // CUP晶
83、振頻率</p><p> #define baudrate 9600 // 通信波特率</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> sbit DQ = P3^6; // 定義DS18B20端口D
84、Q </p><p> sbit BEEP = P3^3;</p><p> unsigned char presence ;</p><p> unsigned char code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0xff};</p><p
85、> unsigned char code LEDdian[ ] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78, 0x00,0x10};</p><p> unsigned char data temp_data[2] = {0x00,0x00};</p><p> unsigned char data display[5] = {0
86、x00,0x00,0x00,0x00,0x00}; </p><p> unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,</p><p> 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};</p><p> void beep()
87、; </p><p> //sbit DIN = P0^7; // 小數(shù)點</p><p> bit flash=0; // 顯示開關(guān)標記</p><p> void Delay(unsigned int num)// 延時函數(shù)</p><p><b> {</b></p><p>
88、; while( --num );</p><p><b> }</b></p><p> uchar Init_DS18B20(void) // 初始化ds1820</p><p><b> {</b></p><p> DQ = 1; // DQ復位</p>&
89、lt;p> Delay(8); // 稍做延時</p><p> DQ = 0; // 單片機將DQ拉低</p><p> Delay(90); // 精確延時 大于 480us</p><p> DQ = 1; // 拉高總線</p><p><b> Delay(8);</b
90、></p><p> presence = DQ; // 如果=0則初始化成功 =1則初始化失敗</p><p> Delay(100);</p><p><b> DQ = 1; </b></p><p> return(presence); // 返回信號,0=presence,1= no pre
91、sence</p><p><b> }</b></p><p> uchar ReadOneChar(void) // 讀一個字節(jié)</p><p><b> {</b></p><p> unsigned char i = 0;</p><p> unsigned
92、 char dat = 0;</p><p> for (i = 8; i > 0; i--)</p><p><b> {</b></p><p> DQ = 0; // 給脈沖信號</p><p> dat >>= 1;</p><p> DQ = 1; // 給脈
93、沖信號</p><p><b> if(DQ)</b></p><p> dat |= 0x80;</p><p><b> Delay(4);</b></p><p><b> }</b></p><p> return (dat);<
94、/p><p><b> }</b></p><p> void WriteOneChar(unsigned char dat)// 寫一個字節(jié)</p><p><b> {</b></p><p> unsigned char i = 0;</p><p> for (
95、i = 8; i > 0; i--)</p><p><b> {</b></p><p><b> DQ = 0;</b></p><p> DQ = dat&0x01;</p><p><b> Delay(5);</b></p><
96、;p><b> DQ = 1;</b></p><p><b> dat>>=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> void Read_Temperature
97、(void)// 讀取溫度</p><p><b> {</b></p><p> Init_DS18B20();</p><p> if(presence==1) </p><p><b> { </b></p><p><b> beep
98、();</b></p><p><b> flash=1;</b></p><p> } // DS18B20不正常,蜂鳴器報警</p><p><b> else </b></p><p><b> {</b>
99、</p><p><b> flash=0;</b></p><p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p> Init_DS18B20();</p><p>
100、 WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); // 讀取溫度寄存器</p><p> temp_data[0] = ReadOneChar(); // 溫度低8位</p><p> temp_data[1] = ReadOneChar(); // 溫度高8位 <
101、/p><p><b> }</b></p><p><b> }</b></p><p> void Disp_Temperature()// 顯示溫度</p><p><b> {</b></p><p> unsigned char n=0;
102、</p><p> display[4]=temp_data[0]&0x0f;</p><p> display[0]=ditab[display[4]]; // 查表得小數(shù)位的值</p><p> display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<
103、;<4);</p><p> display[3]=display[4]/100;</p><p> display[1]=display[4]%100; </p><p> display[2]=display[1]/10;</p><p> display[1]=display[1]%10; //</p>
104、<p> if(!display[3]) // 高位為0,不顯示</p><p><b> { </b></p><p> display[3]=0x0a; </p><p> if(!display[2]) // 次高位為0,不顯示</p><p>
105、; display[2]=0x0a;</p><p><b> }</b></p><p> P0 = 0xc6; // 顯示 C</p><p> P1 = 0xfe; //P1.0</p><p> Delay(300);</p><p> P0 = 0x9c;
106、// 顯示 ° </p><p> P1 = 0xfd; //P1.1</p><p> Delay(300);</p><p> P0 =LEDData[display[0]] ; // 顯示小數(shù)位</p><p> P1 = 0xfb; //P1.2</p><p> Delay
107、(300);</p><p> P0 =LEDdian[display[1]]; // 顯示個位</p><p> //DIN = 0;</p><p> P1 = 0xf7; //P1.3 </p><p> Delay(300);</p><p> P0 =LEDData[display[2]];
108、 // 顯示十位</p><p> P1 = 0xef; //P1.4</p><p> Delay(300);</p><p> P0 =LEDData[display[3]]; // 顯示百位</p><p> P1 = 0xdf; //P1.5</p><p> Delay(300);<
109、;/p><p> P1 = 0xff; // 關(guān)閉顯示</p><p><b> }</b></p><p> void beep(void)</p><p><b> {</b></p><p> unsigned char i;<
110、/p><p> for (i=0;i<100;i++)</p><p><b> {</b></p><p> Delay(60);</p><p> BEEP=!BEEP; // BEEP取反</p><p><b> } </b>
111、</p><p> BEEP=1; // 關(guān)閉蜂鳴器</p><p><b> }</b></p><p> void init(void)</p><p><b> {</b></p><p> EA = 1;
112、 // "中斷總允許"</p><p> TMOD = 0x20;// 定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率</p><p> TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));</p><p> TL1=(u
113、nsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定時器0賦初值</p><p> SCON = 0x50;// 設(shè)定串行口工作方式</p><p> PCON &= 0x00;// 波特率不倍增</p><p> TR1 = 1;// 啟動定時器1</p&g
114、t;<p> IE = 0x00;// 禁止任何中斷</p><p><b> }</b></p><p> void send_char(void)</p><p> // 傳送十六位的溫度數(shù)據(jù),低位在前</p><p><b> {</b></p>
115、<p> unsigned i=0;</p><p> while (i < 2)</p><p><b> {</b></p><p> SBUF = temp_data[i];</p><p> while (!TI); // 等特數(shù)據(jù)傳送</p><p&g
116、t; TI = 0; // 清除數(shù)據(jù)傳送標志</p><p><b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p> void main(void)</p><
117、;p><b> {</b></p><p> uchar receive;</p><p><b> init();</b></p><p><b> while(1)</b></p><p><b> {</b></p>&
118、lt;p> Read_Temperature(); // 讀取溫度</p><p> if (flash==0) </p><p><b> {</b></p><p> Disp_Temperature(); // 顯示溫度</p>
119、<p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> P1 = 0xff ; // DS18B20不正常,關(guān)閉顯示</p><p><b> }
120、</b></p><p> if (RI) // 是否有數(shù)據(jù)到來</p><p><b> {</b></p><p><b> RI = 0;</b></p><p> receive = SBUF;</p><p> if
121、 (receive == 's') // 是否開始采集溫度</p><p><b> {</b></p><p> send_char(); // 傳送采集的溫度</p><p><b> }</b></p><p><b> }&
122、lt;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> 附錄B 上位機程序</b></p><p><b> 定義窗體級變量</b></p><p> Di
123、m datatemp(200) As Single ' 用于存儲溫度采樣值</p><p> Dim num As Integer ' 用于存儲采樣值個數(shù)</p><p> Dim counter As Integer ' 采樣個數(shù)計數(shù)器</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計--基于單片機的溫度數(shù)據(jù)采集系統(tǒng)設(shè)計
- 基于單片機的高精度溫度數(shù)據(jù)采集
- 畢業(yè)設(shè)計----基于51單片機的遠程溫度采集與顯示系統(tǒng)設(shè)計
- 基于單片機的溫度采集系統(tǒng)設(shè)計畢業(yè)設(shè)計
- 基于單片機的溫度采集系統(tǒng)的畢業(yè)設(shè)計
- 基于單片機的溫度采集系統(tǒng)的畢業(yè)設(shè)計
- 外文翻譯--基于單片機的溫度和濕度數(shù)據(jù)采集系統(tǒng)的設(shè)計
- 外文翻譯--基于單片機的溫度和濕度數(shù)據(jù)采集系統(tǒng)的設(shè)計
- 畢業(yè)設(shè)計---基于單片機的溫度采集系統(tǒng)的設(shè)計
- 畢業(yè)設(shè)計---基于單片機的數(shù)據(jù)采集系統(tǒng)設(shè)計
- 單片機課程設(shè)計--基于mcs-51單片機的溫度采集系統(tǒng)
- 畢業(yè)設(shè)計論文----基于單片機數(shù)據(jù)采集系統(tǒng)
- 外文翻譯--基于單片機的溫度和濕度數(shù)據(jù)采集系統(tǒng)的設(shè)計(中文)
- 外文翻譯--基于單片機的溫度和濕度數(shù)據(jù)采集系統(tǒng)的設(shè)計(英文)
- 畢業(yè)設(shè)計----單片機的溫度采集系統(tǒng)的設(shè)計
- 畢業(yè)設(shè)計論文基于單片機的數(shù)據(jù)采集系統(tǒng)設(shè)計
- 基于c51單片機的多路數(shù)據(jù)采集系統(tǒng)設(shè)計畢業(yè)設(shè)計論文
- 單片機數(shù)據(jù)采集畢業(yè)設(shè)計
- 畢業(yè)設(shè)計--基于單片機的數(shù)據(jù)采集系統(tǒng)的設(shè)計
- 外文翻譯--基于單片機的溫度和濕度數(shù)據(jù)采集系統(tǒng)的設(shè)計(中文).doc
評論
0/150
提交評論