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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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的外形和內部結構6</p><p>  1.2.3 DS18B2

3、0引腳定義7</p><p><b>  2 系統設計7</b></p><p>  2.1功能與設計方案7</p><p>  2.1.1 功能要求7</p><p>  2.1.2 設計方案7</p><p>  2.1.2.1 方案論證8</p><p&g

4、t;  2.1.2.2 總體設計框圖8</p><p>  2.2 系統硬件設計8</p><p><b>  3 程序設計10</b></p><p>  3.1 下位機程序10</p><p>  3.1.1 DS18B20讀寫模塊10</p><p>  3.1.2 數碼管顯示模

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 界面設計和數據分析統計程序14</p><

6、p><b>  結束語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單片機的溫度數據采集系統</p><p> ?。壅∫轀囟仁且环N被廣泛應用于生產和生活的重要的物理量。在許多應用領域,研制適當和高效的測溫系統是十分必要的。本文結合實際使用經驗,設計了一個基于51單片機和DS18B20溫度傳感器的近距離溫度數據采集系統。該系統主要包括:溫度傳感器、單片機與PC RS232串行接口通訊、VB程序、模數轉換等部分。在本文設計

8、的中,為了實現人機對話和及時了解系統的運行狀況,特給本系統增加了告警功能。該系統可應用于倉庫測溫、樓宇空調控制和生產過程監(jiān)控等領域。</p><p> ?。坳P鍵詞]溫度測量;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;  在生產和日常生活中,溫度的測量及控制十分重要。實時溫度檢測系統在各個方面的應用十分廣泛:消防電氣的非破壞性溫度檢測,大型電力、通訊設備的過熱故障預知檢測,空調系統的溫度檢測,各類機械組件組件的過熱預警,醫(yī)療相關設備的溫度測試…等等【1】。由此可見實時溫度檢測系統應用十分廣闊。</p><p>  隨著科學技術的飛速發(fā)展,電子學的發(fā)展也越來越快,帶動了大批相關產業(yè)的發(fā)展,其應用范圍也越來越廣泛。如今,計算機

13、的使用領域已經擴展到了各個行業(yè),在這種形勢下,要想適應當今社會需求,就必須設計一種基于PC技術的新式電子儀器,以滿足社會更高層次的需求。近年來,單片機發(fā)展同樣十分迅速,一個以嵌入式微機應用為主的新技術革命浪潮正在蓬勃興起,單片機已經滲透到工業(yè)、農業(yè)、國防、科研等各個領域。傳統的溫度采集方式不僅耗時,而且精度較低,遠不能滿足各行業(yè)對于溫度數據高精度、高可靠性的要求。單片機和高精密的數字溫度傳感器的出現使得溫度數據的處理和采集得到了很好的解

14、決?;趩纹瑱C和數字溫度傳感器的溫度測量系統,不但方便快捷,成本較低,而且大幅度提高了測量的精度【2】。</p><p>  本文介紹了一種基于51單片機和DS18B20數字溫度傳感器實現實時溫度數據采集和處理的一種設計方案。其中涉及了傳感器、數據采集、單片機數據處理、單片機和PC的串口通訊、VB編程等一系列相關理論。本設計運用主從式思想,由一臺上位機(PC微型計算機)處理和顯示溫度,一臺下位機(單片機)進行溫度

15、數據采集,組成兩級式溫度測量的檢測系統。該系統采用 RS-232串行通訊標準,通過上位機(PC)控制下位機(單片機)進行實時溫度采集。溫度值既可以送回主控PC進行數據處理,由顯示器顯示,也可以由下位機單獨工作,實時顯示當前的溫度值,對溫度進行監(jiān)控。下位機采用的是基于單片機和數字溫度傳感器DS18B20的系統。DS18B20利用單總線的特點可以方便的實現溫度的測量,并可以輕松的組建傳感器網絡,該系統的抗干擾性好、設計靈活、方便,而且適合在

16、惡劣的環(huán)境下進行實時溫度測量【3】。本方案設計的系統可以應用在大型工業(yè)及民用常溫監(jiān)測場合,如糧倉系統、大樓空調系統、醫(yī)療與健診的溫度測試、石化、機械…等,并且該系統在達到所需精度的同時,具有較高的性價比。</p><p><b>  1 器件簡介</b></p><p>  1.1 AT89S52簡介</p><p>  AT89S52是一種

17、低功耗、高性能CMOS 8位微控制器,具有8K 在系統可編程Flash 存儲器【4】。使用Atmel 公司高密度非易失性存儲器技術制造,與工業(yè)80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得AT89S52在眾多嵌入式控制應用系統中得到廣泛應用。</p><p>  1.1.1 主要性能</p&g

18、t;<p>  1、與MCS-51單片機產品兼容;</p><p>  2、8K字節(jié)在系統可編程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位定時器/計數器;</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、雙數據指針;</b></p><p><b>  14、掉電標識符。</b></p><p>  1.1.2 引腳說明</p><p>  AT89S52 是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統可編程Flash 存

21、儲器。使用Atmel 公司高密度非 易失性存儲器技術制造,與工業(yè)80C51 產品指令和引腳完 全兼容。片上Flash允許程序存儲器在系統可編程,亦適于 常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統 可編程Flash,使得AT89S52為眾多嵌入式控制應用系統提 供高靈活、超有效的解決方案。 AT89S52具有以下標準功能: 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時器,2 個數據指針,三個16

22、位 定時器/計數器,一個6向量2級中斷結構,全雙工串行口, 片內晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數器、串口、中斷繼續(xù)工 作。掉電保護方式下,RAM內容被保存,振蕩器被凍結, 單片機一切工作停止,直到下一個中斷或硬件復位為止。</p><p>  P0 口:P0口是一個8位漏極開路的雙向I/O口。作為

23、輸出口,每位能驅動8個TTL邏 輯電平。對P0端口寫“1”時,引腳用作高阻抗輸入。 當訪問外部程序和數據存儲器時,P0口也被作為低8位地址/數據復用。在這種模式下, P0不具有內部上拉電阻。 在flash編程時,P0口也用來接收指令字節(jié);在程序校驗時,輸出指令字節(jié)。程序校驗 時,需要外部上拉電阻。</p><p>  P1 口:P1 口是一個具有內部上拉電阻的8 位雙向I/O 口,p1 輸出緩沖器能驅動4 個 T

24、TL 邏輯電平。對P1 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入 口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。此外,P1.0和P1.1分別作定時器/計數器2的外部計數輸入(P1.0/T2)和定時器/計數器2 的觸發(fā)輸入(P1.1/T2EX)。 在flash編程和校驗時,P1口接收低8位地址字節(jié)。</p><p><b>  引腳號第二功能:</

25、b></p><p>  P1.0 T2(定時器/計數器T2的外部計數輸入),時鐘輸出</p><p>  P1.1 T2EX(定時器/計數器T2的捕捉/重載觸發(fā)信號和方向控制)</p><p>  P1.5 MOSI(在系統編程用)</p><p>  P1.6 MISO(在系統編程用)</p><p>  P

26、1.7 SCK(在系統編程用)</p><p>  P2 口:P2 口是一個具有內部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅動 4 個 TTL 邏輯電平。對P2 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入 口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。 在訪問外部程序存儲器或用16位地址讀取外部數據存儲器(例如執(zhí)行MOVX @DPTR) 時,P2 口送

27、出高八位地址。在這種應用中,P2 口使用很強的內部上拉發(fā)送1。在使用 8位地址(如MOVX @RI)訪問外部數據存儲器時,P2口輸出P2鎖存器的內容。 在flash編程和校驗時,P2口也接收高8位地址字節(jié)和一些控制信號。</p><p>  P3 口:P3 口是一個具有內部上拉電阻的8 位雙向I/O 口,p3 輸出緩沖器能驅動4 個 TTL 邏輯電平。對P3 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸

28、入 口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(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(定時/計數器0)</p><p>  P3.5 T1(定時/計數器1)</p><p>  P3.6 WR(外部數據存儲器寫選通)</p><p>  P3.7 RD(外

30、部數據存儲器讀選通) 此外,P3口還接收一些用于FLASH閃存編程和程序校驗的控制信號。</p><p>  RST:復位輸入。當振蕩器工作時,RST引腳出現兩個機器周期以上高電平將是單片機復位。</p><p>  ALE/PROG:當訪問外部程序存儲器或數據存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因

31、此它可對外輸出時鐘或用于定時目的。要注意的是:每當訪問外部數據存儲器時將跳過一個ALE脈沖。對FLASH存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX和MOVC指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應設置ALE禁止位無效。</p><p>  PSEN:程序

32、儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當AT89S52由外部程序存儲器取指令(或數據)時,每個機器周期兩次PSEN有效,即輸出兩個脈沖,在此期間,當訪問外部數據存儲器,將跳過兩次PSEN信號。</p><p>  EA/VPP:外部訪問允許,欲使CPU僅訪問外部程序存儲器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復位時內部會鎖存EA端狀態(tài)。

33、如EA端為高電平(接Vcc端),CPU則執(zhí)行內部程序存儲器的指令。FLASH存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當然這必須是該器件是使用12V編程電壓Vpp。</p><p>  XTAL1:振蕩器反相放大器和內部時鐘發(fā)生電路的輸入端。</p><p>  XTAL2:振蕩器反相放大器的輸出端。</p><p>  1.2 DS18B20簡介<

34、;/p><p>  1.2.1 主要特性</p><p>  1適應電壓范圍更寬,電壓范圍:3.0~5.5V,在寄生電源方式下可由數 據線供電</p><p>  2獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20的雙向通訊</p><p>  3 DS18B20支持多點組網功能,多個DS18B2

35、0可以并聯在唯一的三線上,實現組網多點測溫</p><p>  4 DS18B20在使用中不需要任何外圍元件,全部 傳感元件及轉換電路集成在形如一只三極管的集成電路內</p><p>  5 測溫范圍-55℃~+125℃,在-10~+85℃時精度為±0.5℃</p><p>  6 可編程 的分辨率為9~12位,對應的可分辨溫度分別為0.5℃、0.25℃、

36、0.125℃和0.0625℃,可實現高精度測溫</p><p>  7 在9位分辨率時最多在 93.75ms內把溫度轉換為數字,12位分辨率時最多在750ms內把溫度值轉換為數字,速度更快</p><p>  8 測量結果直接輸出數字溫度信號,以"一 線總線"串行傳送給CPU,同時可傳送CRC校驗碼,具有極強的抗干擾糾錯能力</p><p>  

37、9 負壓特性:電源極性接反時,芯片不會因發(fā)熱而燒毀, 但不能正常工作。</p><p>  1.2.2 DS18B20的外形和內部結構</p><p>  DS18B20內部結構主要由四部分組成:64位光刻ROM 、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器【5】。DS18B20的外形和內部結構如下圖1、圖2:</p><p><b>  圖

38、1</b></p><p><b>  圖2</b></p><p>  1.2.3 DS18B20引腳定義:</p><p>  (1)DQ為數字信號輸入/輸出端;</p><p>  (2)GND為電源地;</p><p>  (3)VDD為外接供電電源輸入端(在寄生電源接線方式時

39、接地)。</p><p><b>  2 系統設計</b></p><p>  2.1功能與設計方案</p><p>  2.1.1 功能要求</p><p>  設計一個基于89S52單片機、DS18B20數字溫度傳感器、Visual Basic 6.0的數據采集系統。用單片機系統接收溫度傳感器的溫度數據,并在6位數碼

40、管上顯示當前溫度值,可測溫度范圍-55-125攝氏度,精度0.1攝氏度。</p><p>  使用VB6.0編寫上位機程序,接收溫度數據并同步畫出溫度變化的曲線。</p><p>  整個實時數據采集系統在設計時主要應該滿足一下功能指標:</p><p>  測量溫度,并在8位數碼管上顯示實時溫度值;</p><p>  可測溫范圍-55-1

41、25攝氏度,精度0.1攝氏度;</p><p>  每秒給上位機傳送一次溫度數據;</p><p>  上位機接收溫度,并將數據相關信息同步到曲線和表格中;</p><p>  2.1.2 設計方案</p><p>  2.1.2.1 方案論證</p><p>  方案一:采用熱敏電阻,可滿足40攝氏度至90攝氏度

42、測量范圍,但熱敏電阻精度、重復性、可靠性較差,對于檢測1攝氏度的信號是不適用的。而且在溫度測量系統中,采用單片溫度傳感器,比如AD590,LM35等.但這些芯片輸出的都是模擬信號,必須經過A/D轉換后才能送給計算機,這樣就使得測溫裝置的結構較復雜.另外,這種測溫裝置的一根線上只能掛一個傳感器,不能進行多點測量.即使能實現,也要用到復雜的算法,一定程度上也增加了軟件實現的難度。</p><p>  方案二:考慮使用

43、溫度傳感器,在單片機電路設計中,大多都是使用傳感器,所以可以采用一只數字溫度傳感器DS18B20,利用此傳感器,可以很容易直接讀取被測溫度值,進行轉換,就可以滿足設計要求。</p><p>  從以上兩種方案的論述中容易看出,采用方案二電路比較簡單,軟件設計也比較簡單,綜上所述采用方案二。</p><p>  2.1.2.2 總體設計框圖</p><p>  實時

44、溫度系統電路設計總體設計框圖如圖3所示,控制器采用單片機AT89S52,溫度傳感器采用DS18B20,用8位LED數碼管以串口傳送數據實現溫度顯示并通過串口與上位機通訊,把溫度數據傳送給上位機,用VB編寫的圖形界面程序把溫度變化曲線顯示出來。</p><p><b>  圖3</b></p><p>  2.2 系統硬件設計</p><p> 

45、 整體系統硬件電路包括傳感器數據采集電路、溫度顯示電路、報警電路、單片機最小系統主板電路等,電路圖和仿真圖如圖4、圖5所示。</p><p><b>  圖4</b></p><p><b>  圖5</b></p><p>  溫度傳感器的數據總線接單片機的P3.3口,單片機通過反復讀寫P3.3口的狀態(tài)采集數據,因此讀寫

46、時有嚴格的時序要求。</p><p>  顯示電路采用6個共陽極的LED數碼管顯示,顯示掃描代碼PO口發(fā)送,由于PO口內部沒有上拉電阻,因此需要外接上拉電阻。P1口的邏輯狀態(tài)作位選線信號,達到分時選通的目的,當相應口為高電平是LED數碼管才能顯示相應代碼。</p><p>  此外,電路中還接有蜂鳴器,當DS18B20工作不正常時可以達到報警的目的。最后還要實現單片機與上位機通信的功能,通

47、過MAX232電平轉換芯片將單片機的TTL信號轉換為串口的標準電平信號,以便能向上位機發(fā)送或接收數據。</p><p><b>  3 程序設計</b></p><p><b>  3.1 下位機程序</b></p><p>  下位機程序采用C語言編寫,開機時對DS18B20數字溫度傳感器進行檢測,如果DS18B20檢測

48、不正常,則蜂鳴器報警,并關閉顯示。采用6個LED數碼管顯示,其中4個顯示溫度值,2個顯示溫度符號。同時如果溫度值最高位為0將不顯示出來。下位機程序使用C語言編寫比使用匯編語言編寫的可讀性要好很多,整個下位機程序包括三個模塊:DS18B20讀寫模塊、數碼管顯示模塊、RS232串口通訊模塊。只有當上位機向下位機發(fā)出讀取溫度數據的指令時,下位機才會將測得的實時溫度數據經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>  初始化完畢后,轉入溫度讀取程序。其流程為一無限循環(huán),單片機不斷從DS18B20讀取溫度數據。此處用flash標志DS18B20的工作狀態(tài),當flash=1時表示DS18B20工作異常,同時關閉顯示和蜂鳴器報警。此部分程序詳見附錄1,此處不再詳述。</p><p>  3.1.2 數碼管顯示模塊</p><p>  由于單片機控制端口有限,因此采用掃描顯示的方式,即通過快速刷

53、新數碼管的筆畫顯示,由于人眼視覺殘留的效應,只要刷新的速度足夠快,就能同時看到6個數碼管的顯示,有效的節(jié)省了單片機的控制端口。此外,在顯示模塊中,由于設計要求的顯示精度是精確到一位小數,而DS18B20每一位的轉化溫度是0.0625攝氏度,因此小數第一位只有16種狀態(tài),因此只需要一一算出放在一個數組中,通過查表命令即可得到第一位小數的十進制數值。同時通過移位即可獲得一個新的溫度整數部分的數據,此處的部分代碼如下:</p>

54、<p>  unsigned char n=0;</p><p>  display[4]=temp_data[0]&0x0f;</p><p>  display[0]=ditab[display[4]]; // 通過查表命令得小數位的值</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]為小數位十進制數,display[3]為百位十進制數,display[2]為十位十進制數,display[1]為個位十進制數。然后再通過查詢共陽極LED數碼管的顯示代碼分時選通即可顯示當前溫度值。</p>

58、<p>  unsigned char code LEDData[ ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}</p><p>  因為個位還需要顯示小數點,故其顯示代碼稍有不同:</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>  在此部分模塊中,波特率和晶振頻率在程序初始化時已經定義為9600b/s和11.0592MHz,以便和上位機的波特率匹配。波特率的產生用定時器產生,本設計中選擇定時器

60、1,并設置其為工作方式2,8位的常數自動重載定時器,這種工作方式可以省去用戶軟件中重裝初值的代碼,極大的簡化了定時初值的計算,并可以精確確定定時時間。計算出定時器的初值后,就可以設定串口的工作方式了。部分代碼如下:</p><p>  void init(void)</p><p><b>  {</b></p><p>  EA = 1;

61、 </p><p>  TMOD = 0x20;// 定時器1工作于8位自動重載模式, 用于產生波特率</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;// 設定串行口工作方式</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ā)送到串口的數據進行處理和顯示。上位機程序設計的核心是串口的初始化程序和接收程序的設計。</p>

64、<p>  3.2.1 串口初始化</p><p><b>  主要設計過程如下:</b></p><p>  串口設置:MSComm.SetSettings(波特率、校檢方式、數據位數、停止位數)</p><p>  串口數據:MSComm.InputMode(輸入模式)</p><p><b>

65、;  部分代碼如下:</b></p><p>  On Error GoTo err:</p><p>  MSComm1.CommPort = 1 ' 默認設置為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" ' 設置波特率</p><p>  此處均為默認設置,可以根據具體情況更改設置,但必須與下位機一致。另外程序還包括提示出錯程序,當串口不存在或被占用時會出現提示信息。</p><p>  3.2.2 串口觸發(fā)接收程序</p><p>  當

68、每發(fā)送一次指令時,就會觸發(fā)OnComm事件,并返回數據串,通過計算得到溫度測量值并顯示出來,部分程序如下:</p><p>  Private Sub MSComm1_OnComm()</p><p>  Dim Inbyte() As Byte ' 接收數據暫存</p><p>  Dim buffer As

69、 String ' 溫度數據緩沖</p><p>  Dim datatemp2a, datatemp2b As String ' 兩字節(jié)進制溫度數據</p><p>  Dim datatemp2 As String ' 十六進制溫度數據</p>

70、<p>  Dim count As Integer ' 接收個數計數</p><p>  If num > Txttimes.Text - 1 Then ' 接收個數判斷</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 界面設計和數據分析統計程序</p><p>  此部分對采集到的實時溫度數據進行處理并顯示,包括最大值、最小值、平均值、當前值,同時用表格和坐標曲線表示。此部分代碼詳見附錄2,此處不再詳述。</p><p><b>  結束語</b></p><p>  溫度測量系統是

75、現代工業(yè)生產過程中的一個重要環(huán)節(jié),特別是大型企業(yè)的主要設備往往需要極其精確的測量溫度參數,甚至在許多需要對溫度進行監(jiān)控和分析的場合還要求一種保證精度和高穩(wěn)定性的同時自動化水平高、應用范圍廣的溫度采集手段。而目前許多老舊設備上普遍存在和使用的測溫設備都有溫度信息傳遞不及時、精度不夠的嚴重缺點,不利于工作人員根據溫度變化及時作出決定,嚴重影響和阻礙了工業(yè)自動化的發(fā)展,此時開發(fā)一種能夠實時性高、精度高、穩(wěn)定性高的綜合溫度處理分析監(jiān)控系統就十分

76、必要。</p><p>  在這種背景下,本文設計實現了低成本、高可靠、高實時性的基于51單片機和DS18B20數字溫度傳感器的溫度數據采集系統。在設計過程中,對整個系統的硬件和軟件皆采用模塊化程序設計的方法,將系統功能劃分為幾個子模塊,最后再進行整合,從而實現了最終的溫度數據采集系統的設計。</p><p><b>  參考文獻</b></p><

77、;p>  [1] 王勇,葉敦范. 基于AT89S51的便攜式實時溫度檢測儀 [J] 儀表技術與傳感器 , Instrument Technique and Sensor, 2006,(4).</p><p>  [2] 王學梅,金廣鋒.數字溫度傳感器DS18B20在糧倉溫度智能控制系統中的應用 [J] 科技廣場 , Science Mosaic, 2009,(5).</p><p

78、>  [3] 史寶玲. DS18B20數字溫度傳感器技術分析 [J] 中國新技術新產品 , China New Technologies and Products, 2011,(4). </p><p>  [4] 白建社,王航宇.基于AT89S52的多用途工業(yè)控制器設計 [J] 科技廣場 , Science Mosaic, 2008,(3). </p><p>  [5

79、] 夏莉英,陳雁.基于DS18B20的溫度測控系統設計 [J] 微計算機信息 , Microcomputer Information, 2011,(1).</p><p>  [6] 霖鋒. Professional embedded from 51 mcu to ARM[M].哈工大,2007</p><p>  [7] 郭天祥.Altium Designer6.9 PCB設計

80、教程[M].哈工大,2004</p><p>  [8] 戴佳.51單片機應用系統開發(fā)典型實例[M].電力出版社,2005年6月</p><p>  [9] 沈德金,陳粵初.MCS-51系列單片機接口電路與應用程序實例[M].北京航空航天大學出版社,1999</p><p>  [10] 陳海宴.51單片機原理及應用[M].北京航空航天大學出版社,2010.&

81、lt;/p><p>  [11] 童詩白.模擬電子技術基礎[M].高等教育出版社,2001 </p><p>  [12] 鐘富昭等.8051單片機典型模塊設計與應用[M].人民郵電出版社,2007</p><p>  [13] 李平等.單片機入門與開發(fā)[M].機械工業(yè)出版社,2008</p><p>  [14] 王東峰等.單片機C語言

82、應用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; // 小數點</p><p>  bit flash=0; // 顯示開關標記</p><p>  void Delay(unsigned int num)// 延時函數</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); // 啟動溫度轉換</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]]; // 查表得小數位的值</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]] ; // 顯示小數位</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; // 關閉顯示</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; // 關閉蜂鳴器</p><p><b>  }</b></p><p>  void init(void)</p><p><b>  {</b></p><p>  EA = 1;

112、 // "中斷總允許"</p><p>  TMOD = 0x20;// 定時器1工作于8位自動重載模式, 用于產生波特率</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;// 設定串行口工作方式</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>  // 傳送十六位的溫度數據,低位在前</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); // 等特數據傳送</p><p&g

116、t;  TI = 0; // 清除數據傳送標志</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不正常,關閉顯示</p><p><b>  }

120、</b></p><p>  if (RI) // 是否有數據到來</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 ' 用于存儲采樣值個數</p><p>  Dim counter As Integer ' 采樣個數計數器</p>

溫馨提示

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

評論

0/150

提交評論