大型糧倉溫濕度檢測系統的設計
畢業設計(論文)開題報告
題目
大型糧倉檢測系統的設計
目的及意義(含國內外的研究現狀分析):
目的:
糧食儲藏是國家為防備戰爭,災荒或其它突發性事變而采取的有效措施,因此糧食的儲藏有重要意義。影響糧食安全儲存的主要參數是糧食的溫度和濕度。這兩者之間又是相互關聯的。糧食在正常儲藏過程中,含水量一般在12%以下是安全的,不會發生溫度突變,一旦糧庫進水,結露是糧食的含水量達到20%以上時,由于糧粒受潮胚芽萌發,新陳代謝加快而產生呼吸熱是局部糧食溫度突然升高,必然引起糧食霉變,可能造成無法挽回的損失因此設計出一種經濟適用的糧倉溫濕度智能檢測系統是非常有必要的。單片機自誕生以來給全世界人類的生活和工作起到了劇烈的作用,利用單片機進行溫濕度檢測、處理和顯示具有實時性好、成本低、穩定性高等優點。通過該系統的設計,這樣他們的就業面會更加寬廣,也可以滿足當今社會對單片機開發人才的大量需求.。
基本內容和技術方案:
設計內容:
1:設計相應的信號采集電路,執行電路等硬件電路。
2:實現各環境要素的自動檢測。
3:通過單片機匯編語言編制數據采集,分析采集,顯示,修改。參數設計,控制等程序功能模塊
設計方案:
1采用模擬溫濕度傳感器,轉換結果需要運算放大器傳給單片機,它控制雖然簡單但電路復雜,不容易實現對多點溫濕度監控,容易出現誤差,導致測量結果不準確。
2進行傳感器的硬件電路的設計。
3數碼管顯示,及報警電路的設計。
3.進度安排:
第1-2周:畢業實習,下達畢業設計任務書,查閱相關文獻資料,明確研究內容,了解研究所需元件的規格及其價格;
第3周:確定方案,完成開題報告;
第4-6周:完成系統硬件電路的設計。
第7-10周:系統各組成部分的選型;
第11-12周:系統軟件框圖設計。
第13-15周:完成并修改畢業論文。
第15周: 準備論文答辯。
4.指導教師意見:
指導教師簽名: 年 月 日
目 錄
摘 要1
Abstract 7
1.緒論 8
1.1選題背景 8
1.2設計目標 8
1.2.1基本功能 8
1.2.2主要技術參數 8
2 設計方案 9
2.1 系統的總體框圖 9
2.2溫濕度傳感器的選擇 9
2.3信號采集通道的選擇 10
2.4 本章小結10
3 主要芯片簡介11
3.1 DHT11數字傳感器 11
3.1.1 主要特性11
3.1.2 應用領域11
3.1.3 接口說明11
3.1.4 電源引腳11
3.1.5 封裝信息11
3.1.6 DHT11引腳圖 12
3.1.7 注意事項12
3.2 ADC0832與單片機89C5113
3.2.1 A/D轉換 13
3.2.2 單片機89c51 15
3.3 本章小結22
4 硬件設計23
4.1 顯示與報警的設計23
4.1.1 顯示電路23
4.1.2 報警電路24
4.2 本章小結25
5 軟件設計26
5.1標度變換的實現 26
5.2 主程序流程圖26
5.3 T0中斷流程圖27
5.4 報警子程序流程圖28
5.5 溫濕度采樣子程序流程圖29
6 結論30
6.1 總結30
6.2 改進思路30
6.2.1軟件方面 30
6.2.2硬件方面 30
參考文獻33
附錄A 33
附錄 B 匯編程序34
附錄C proteus仿真總電路圖......................................................
致 謝44
摘要
本畢業設計是應用單片機作為控制器設計的溫濕度檢測系統,由要由溫度、濕度采集、AD轉換、單片機控制、數碼管顯示、USB連接器六部分組成 。 本設計是以89C51單片機為控制中心,這種控制芯片具有4KB的快擦寫可編程/擦除只讀存儲器EEPROM、256KB片內RAM、3個16位定時計數器、5個中斷源,無需進行系統擴展既可滿足任務要求,能較大幅度提高系統的性價比。而溫濕度傳感器我采用的是DHT11數字溫濕傳感器,它性價比比較高。DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。 另外該系統除了能顯示溫濕度以外, 還能設置溫濕度報警閥值。 關鍵詞:溫濕度;89C51單片機;DHT11傳感器;溫濕度報警閥 Abstract
The graduation project is based on the single chip design temperature and humidity monitoring system, mainly by temperature, humidity acquisition, AD conversion, microprocessor control, digital display, usb connector composed of six parts. The design of the control center using 89c51 microcontroller, the chip has 4KB of flash programmable / erasable read only memory EEPROM, 256 KB on-chip RAM, 3 16-bit timer counters, six interrupt sources, both without the need for system expansion to meet mission requirements, can greatly improve the system's cost. The temperature and humidity sensor I use is dht11, he cost effective. DHT11 digital temperature and humidity sensor is a calibrated digital signal output with the temperature and humidity combined sensor. Its application-specific digital modules acquisition and temperature and humidity sensor technology, to ensure that products with high reliability and excellent long-term stability. Sensor includes a resistive element and a sense of wet NTC temperature components and with a high-performance 8-bit microcontroller connected. So the product has excellent quality, fast response, anti-interference ability, high cost performance advantages. In addition the system in addition to showing the outside temperature and humidity, but also set the temperature and humidity alarm threshold.
Keywords:Temperature and humidity; 89C51 microcontroller;dht11 Sensor
1.緒論 1.1 研究背景 由古至今,糧倉糧食的存儲是否得當對國家的經濟能否正常合理的運行有很大的影響。但是在以前的經濟和科技水平有限,所以我國糧食的存儲的環境很差,管理落后。糧庫管理的重點之一就是要合理布置測溫點,經常檢查溫度變化,以便及時發現糧食的發熱點,減少糧食的損失。然而,糧堆的熱傳遞又是那樣的緩慢,使人感知極差,需要管理人員經常進入悶熱、嗆人的倉房內觀察溫、濕度,不斷進行翻倉、通風,這種繁重的體力勞動,不僅對人體有極大地傷害,而且不科學、不及時。所以,糧食蟲蛀、霉變的情況時有發生。 1.2設計目標 1.2.1基本功能 1.檢測溫度、濕度 2.顯示溫度、濕度 3.過限報警 1.2.2主要技術參數 1.溫度檢測的范圍: -30℃±55℃ 2.測量精度: 2℃ 3.濕度檢測的范圍: 20%-90%RH 4.檢測精度: 5%RH 5.顯示方式: 溫度:四位顯示 濕度:四位顯示; 報警方式: 三極管驅動的蜂鳴音報警
2 設計方案
溫濕度監測系統要滿足以下條件:溫濕度監測系統能完成數據采集和處理、顯示、串行通信、輸出控制信號等多種功能。由數據采集、數據調理、單片機、數據顯示等4個大的部分組成。該測控系統具有實時采集(檢測糧庫內的溫濕度)、實時顯示(對監測到的進行顯示)、實時警報(根據監測的結果,超出預設定的值的進行蜂鳴警告)的功能。 傳感器是實現測量首要環節,是監測系統的關鍵部件,如果沒有傳感器對原始被測信號進行準確可靠的捕捉和轉換,一切準確的測量和控制都將無法實現。工業生產過程的自動化測量和控制,幾乎主要依靠各種傳感器來檢測和控制生產過程中的各種參量,使設備和系統正常運行在最佳狀態,從而保證生產的高效率和高質量。 2.1 系統的總體框圖 系統的總體設計框圖如圖3-1所示。 圖3-1 系統總體框圖 本設計由信號采集、信號分析和信號處理三個部分組成的。 (一) 信號采集 由dht11溫濕度傳感器和多路模式選擇開關組成; (二) 信號分析 由A/D轉換器和單片機80c51組成; (三) 信號處理 由串行口LCD顯示器和報警系統等組成。 2.2溫濕度傳感器的選擇 DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高 的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測 溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為4針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。 2.3信號采集通道的選擇 在本設計系統中,溫度輸入信號為4路的模擬信號,這就需要多通道結構采用多路分時的模擬量輸入通道。這種結構的模擬量通道特點為:對ADC、S/H要求高。處理速度慢。硬件簡單,成本低。軟件比較復雜。如圖2-1所示。 
圖2-1多路分時的模擬量輸入通道
2.4 本章小結 在本章中,主要講了溫濕度傳感器的硬件選擇和信號采集通道的選擇。這些選擇是在實用性和價格低廉方面考慮的,如果條件允許可以選擇性能更加強大的傳感器和一個專門的多路選擇的的模塊。在下一章中,介紹系統的總體設計所用到主要芯片。
3 主要芯片簡介
3.1 DHT11數字傳感器 數字溫濕度傳感DHT11是由廣州奧松有限公司生產的一款溫濕度一體化的數字傳感器。 3.1.1 主要特性 DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC 測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的 濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集 成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為4針單排引腳 封裝。連接方便,特殊封裝形式可根據用戶需求而提供。 3.1.2 應用領域 該DHT11可以用于暖通空調、測試及檢測設備、汽車、數據記錄器、消費品、自動控制、濕度調節器及醫療等應用領域。 3.1.3 接口說明 建議連接線長度短于20米時用5K上拉電阻,大于20米時根據實際情況使用合適的上拉電阻。 
圖3-2 dht11應用電路 3.1.4 電源引腳 DHT11的供電電壓為3-5.5V。傳感器上電后,要等待1s以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間可增加一個100nF的電容,用以去耦濾波。 3.1.5 封裝信息 圖3-3 dht11封裝圖 3.1.6 DHT11引腳圖
圖3-4 引腳圖 3.1.7 注意事項 溫度影響 氣體的相對濕度,在很大程度上依賴于溫度。因此在測量濕溫時,應盡可能保證濕度傳感器在同一溫度下工作。如果與釋放熱量的電子元件共用一個印刷線 路板,在安裝時應盡可能將DHT11遠離電子元件,并安裝在熱源下方,同時保持 外殼的良好通風。為降低熱傳導,DHT11與印刷電路板其它部分的銅鍍層應盡可 能最小,并在兩者之間留出一道縫隙。光線長時間暴露在太陽光下或強烈的紫外線輻射中,會使性能降低。配線注意事項DATA信號線材質量會影響通訊距離和通訊質量,推薦使用高質量屏蔽線。
3.2 ADC0832與單片機89C51 3.2.1 A/D轉換 3.2.1.1 A/D轉換器的特點 ADC0832 是美國國家半導體公司生產的一種8 位分辨率、雙通道A/D轉換
芯片。由于它體積小,兼容性強,性價比高而深受單片機愛好者及企業歡迎,
其目前已經有很高的普及率。學習并使用ADC0832 可是使我們了解A/D轉換器
的原理,有助于我們單片機技術水平的提高。 ADC0832 具有以下特點:
8位分辨率;
雙通道A/D轉換;
輸入輸出電平與TTL/CMOS相兼容;
5V電源供電時輸入電壓在0~5V之間;
工作頻率為250KHZ,轉換時間為32μS;
一般功耗僅為15mW;
8P、14P—DIP(雙列直插)、PICC 多種封裝;
商用級芯片溫寬為0°C to +70°C,工業級芯片溫寬為−40°C to +85°C; 3.2.1.2 ADC0832元件說明 ADC0832 為 8 位分辨率 A/D 轉換芯片,其最高分辨可達 256 級,可以適應一般的模擬量轉換要求。其內部電源輸入與參考電壓的復用,使得芯片的模擬 電壓輸入在 0~5V 之間。芯片轉換時間僅為 32μS,據有雙數據輸出可作為數據 校驗,以減少數據誤差,轉換速度快且穩定性能強。獨立的芯片使能輸入,使 多器件掛接和處理器控制變的更加方便。通過 DI 數據輸入端,可以輕易的實現 通道功能的選擇。
3.2.1.3 芯片頂視圖
圖3-5 ADC0832 芯片頂視圖 芯片接口說明: GND 芯片參考 0 電位(地)。 DI 數據信號輸入,選擇通道控制。 DO 數據信號輸出,轉換數據輸出。 CLK 芯片時鐘輸入。 VCC/REF 輸入及參考電壓輸入(復用)。 CS 片選使能,低電平芯片使能。 CH0 模擬輸入通道 0,或作為 IN+/-使用。 CH1 模擬輸入通道 1,或作為 IN+/-使用。 3.2.1.4 ADC0832 與單片機的接口電路 ADC0832與單片機的接口電路如圖3-7所示 圖3-6 接口電路圖 3.2.1.5 單片機對 ADC0832 的控制原理 正常情況下 ADC0832 與單片機的接口應為 4 條數據線,分別是 CS、CLK、 DO、DI。但由于 DO 端與 DI 端在通信時并未同時有效并與單片機的接口是雙 向的,所以電路設計時可以將 DO 和 DI 并聯在一根數據線上使用。(見圖 3-7) 當ADC0832未工作時其CS輸入端應為高電平此時芯片禁用,CLK 和DO/DI 的電平可任意。當要進行A/D轉換時須先將CS使能端置于低電平并且保持低電平直到轉換完全結束。此時芯片開始轉換工作,同時由處理器向芯片時鐘輸入端 CLK 輸入時鐘脈沖,DO/DI 端則使用 DI 端輸入通道功能選擇的 數據信號。在第1個時鐘脈沖的下沉之前 DI 端必須是高電平,表示啟始信號。在第 2、3個脈沖下沉之前 DI 端應輸入 2 位數據用于選擇通道功能,其功能項見表3-1。
表3-1 Adc0832 單端 mux 模式
表3-2 Adc0832 多端 mux 模式
如表3-1,表3-2所示,當此 2 位數據為“1”、“0”時,只對 CH0 進行單通道轉換。當 2 位數據為“1”、“1”時,只對CH1進行單通道轉換。當2位數據為“0”、“0”時,將CH0作為正輸入端 IN+,CH1 作為負輸入端 IN-進行輸入。 當 2 位 數據為“0”、“1”時,將 CH0 作為負輸入端 IN-,CH1 作為正輸入端 IN+進行 輸入。到第3個脈沖的下沉之后 DI 端的輸入電平就失去輸入作用。 此后 DO/DI 端則開始利用數據輸出 DO 進行轉換數據的讀取。從第4個脈沖下沉開始由 DO 端輸出轉換數據最高位 DATA7,隨后每一個脈沖下沉 DO端輸出下一位數據。直到第 11個脈沖時發出最低位數據 DATA0,一個字節的數據輸出完成。也正是 從此位開始輸出下一個相反字節的數據,即從第11個字節的下沉輸出 DATD0。隨后輸出 8 位數據,到第19個脈沖時數據輸出完成也標志著一次 A/D 轉換的結束。最后將 CS 置高電平禁用芯片,直接將轉換后的數據進行處理就可以了。更詳細的時序說明請見圖3-7。 作為單通道模擬信號輸入時 ADC0832 的輸入電壓是 0~5V 且 8 位分辨率時的電壓精度為 19.53mV。如果作為由 IN+與 IN-輸入的輸入時,可是將電壓值設定在某一個較大范圍之內,從而提高轉換的寬度。但值得注意的是,在進行 IN+與 IN-的輸入時如果IN-的電壓大于IN+的電壓則轉換后的數據結果始終為00H。 3.2.2 單片機89c51 為了設計此系統,我們采用了80c51單片機作為控制芯片。89C51是MCS-51系列單片機中CHMOS工藝的一個典型品種 ;其它廠商以8951為基核開發出的CMOS工藝單片機產品統稱為89C51系列。該系列單片機是采用高性能的靜態89C51 設計 由先進CMOS 工藝制造并帶有非易失性Flash 程序存儲器 全部支持12時鐘和6 時鐘操作 P89C51X2 和P89C52X2/54X2/58X2 分別包含128 字節和256 字節RAM 32條I/O 口線3 個16位定時/計數器 6 輸入4優先級嵌套中斷結構1 個串行I/O 口可用于多機通信I/O 擴展或全雙工UART以及片內振蕩器和時鐘電路。此外,由于器件采用了靜態設計,可提供很寬的操作頻率范圍,頻率可降至0 。可實現兩個由軟件選擇的節電模式,空閑模式和掉電模式,空閑模式凍結CPU但RAM定時器,串口和中斷系統仍然工作掉電模式保存RAM的內容 但是凍結振蕩器 導致所有其它的片內功能停止工作。由于設計是靜態的時鐘可停止而不會丟失用戶數據 運行可從時鐘停止處恢復。 
圖3-7 ADC0832時序圖 3.2.2.1 89c51的基本結構 89C51的微處理器(CPU) 運算器 累加器ACC ; 寄存器B ; 程序狀態字寄存器PSW。 控制器 程序計數器PC ; 指令寄存器IR ; 定時與控制邏輯。 89C51的片內存儲器 內部ROM容量4K字節 內部RAM容量128字節 89C51的I/O口及功能單元 四個8位的并行口,即P0~P3。它們均為雙向口,既可作為輸入,又可作為輸出。每個口各有8條I/O線。 有一個全雙工的串行口(利用P3口的兩個引腳P3.0和P3.1); 有2個16位的定時/計數器 ; 有1套完善的中斷系統。 89C51的特殊功能寄存器(SFR) 低功耗的閑置和掉電模式 片內振蕩器和時鐘電路
圖3-8 89c51結構圖
3.2.2.2 89c51的引腳圖
圖3-9 89C51引腳圖 89C51的制作工藝為CMOS,采用40管腳雙列直插DIP封裝,引腳說明如下: VCC:供電電壓。 GND:接地。 P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 P3口也可作為AT89C51的一些特殊功能口,如下表所示: 口管腳 備選功能 P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(記時器0外部輸入) P3.5 T1(記時器1外部輸入) P3.6 /WR(外部數據存儲器寫選通) P3.7 /RD(外部數據存儲器讀選通) P3口同時為閃爍編程和編程校驗接收一些控制信號。 RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。 ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。 /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。 /EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 3.2.2.3 89c51的存儲器配置 圖3-10 89C51存儲器配置 程序存儲器
與ROM密切相關的兩個引腳
地址鎖存允許信號端
外部程序存儲器允許輸出信號端
當ROM容量不夠時,盡量選擇高容量存儲器空間的單片機,如89C52,89C54,89C58等,應避免外擴程序存儲器,因為會增加硬件負擔.
通過16位PC尋址,最大可尋址64kB地址空間 數據存儲器 數據存儲器用于存放運算中間的結果、數據暫存、緩沖、標志位、待測程序等功能。 片內的128B的RAM地址為00H~7FH,供用戶做RAM用,但是在這中間的前32單元,00H~1FH即引用地址尋址做用戶RAM用,常常做工作寄存器區,分做四組,每組由8個單元組成通用寄存器R0~R7,任何時候都由其中一組作為當前工作寄存器,通過RS0,RS1的內容來決定選擇哪一個工作寄存器。 低128字節中的20H~2FH共16字節可用位尋址方式訪問各位,共128個位地址,30H~7FH共80個單元為用戶RAM區,作堆棧或數據緩沖用,片內RAM不夠用時,須擴展片外數據存儲器。此時單片機通過P2口和P0口選出6位地址,使用ALE作低8位的鎖存信號,再由P0口寫入或讀出數據。寫時用 ,讀時用 做外部數據存儲器的選通信號 特殊功能寄存器SFR 表3-3 特殊功能寄存器SFR的位置
3.2.2.4 89C51的工作模式 有四種工作模式:模式0,模式1,模式2,模式3 模式0:選擇定時器的高8位和低5位組成一個13位定時器/計數器。TL低5位溢出時向TH進位,TH溢出時向中斷標志位TF進位,并申請中斷。 定時時間t=(213-初值)×振蕩周期×12;計數長度位213=8192個外部脈沖 模式1:與模式0的唯一差別是寄存器TH和TL以全部16位參與操作。定時時間t=(216-初值)×振蕩周期×12;計數長度位216=65536個外部脈沖 模式2:把TL0和TL1配置成一個自動重裝載的8位定時器/計數器。TL用作8位計數器,TH用以保存初值。TL計數溢出時不僅使TF0置1,而且還自動將TH中的內容重新裝載到TL中。 定時時間t=(28-初值)×振蕩周期×12;計數長度位28=256個外部脈沖 模式3:對T0和T1不大相同 若設T0位模式3,TL0和TH0被分為兩個相互獨立的8位計數器。TL0為8位計數器,功能與模式0和模式1相同,可定時可計數。 TH0僅用作簡單的內部定時功能,它占用了定時器T1的控制位TR1和中斷標志位TF1,啟動和關閉僅受TR1控制。 定時器T1無工作模式3,但T0在工作模式3時T1仍可設置為0~2。 3.2.2.5 89c51的系統時鐘的設計 時鐘電路是用來產生89c51單片機工作時所必須的時鐘信號,89c51本身就是一個復雜的同步時序電路,為保證工作方式的實現,89c51在唯一的時鐘信號的控制下嚴格的按時序執行指令進行工作 ,時鐘的頻率影響單片機的速度和穩定性。通常時鐘由于兩種形式:內部時鐘和外部時鐘。 我們系統采用內部時鐘方式來為系統提供時鐘信號。89c51內部有一個用于構成振蕩器的高增益反向放大器,該放大器的輸入輸出引腳為XTAL1和XTAL2,它們跨接在晶體振蕩器和用于微調的電容,便構成了一個自激勵振蕩器 電路中的C1、C2的選擇在30PF左右,但電容太小會影響振蕩的頻率、穩定性和快速性。晶振頻率為在1.2MHZ~12MHZ之間,頻率越高單片機的速度就越快,但對存儲器速度要求就高。為了提高穩定性我們采用溫度穩定性好的NPO電容,采用的晶振頻率為12MHZ。 圖3-11 系統時鐘 3.3 本章小結 本章主要介紹了主要芯片的簡介,其中重點介紹了dht11溫濕度傳感器和89c51的元件結構及其各自的工作原理。
4 硬件設計
4.1 顯示與報警的設計 4.1.1 顯示電路 該設計中我們采用顯示驅動接口芯片方式。即用MAX7219 LED顯示驅動芯片與單片機89c51和4位陰極數碼管組成顯示電路。 MAX7219是Maxim公司推出的8位LED串行顯示驅動器,它采用3線串口傳送數據,占用資源少且硬件簡單,只需一個外部電阻即可方便地調節LED的亮度;可靈活地選擇顯示器的個數( 1~8個, 級聯可成倍增加);可進行譯碼或不譯碼顯示;內含硬件動態掃描控制,可設置低功耗停機方式。 顯示電路的電路連接圖如圖4-1,圖4-2,圖4-3所示 圖4-1 max7219引腳連接圖 圖4-2 4led引腳連接圖 圖4-3 89c51引腳連接圖 4.1.2 報警電路 在微型計算機控制系統中,為了安全生產,對于一些重要的參數或系統部位,都設有緊急狀態報警系統,以便提醒操作人員注意,或采取緊急措施。其方法就是把計算機采集的數據或記過計算機進行數據處理、數字濾波,標度變換之后,與該參數上下限給定值進行比較,如果高于上限值(或低于下限值)則進行報警,否則就作為采樣的正常值,進行顯示和控制。 本設計采用峰鳴音報警電路。峰鳴音報警接口電路的設計只需購買市售的壓電式蜂鳴器,然后通過MCS-51的1根口線經驅動器驅動蜂鳴音發聲。壓電式蜂鳴器約需10mA的驅動電流,可以使用TTL系列集成電路7406或7407低電平驅動,也可以用一個晶體三極管驅動。在圖中,P3.2接晶體管基極輸入端。當P3.2輸出高電平“1”時,晶體管導通,壓電蜂鳴器兩端獲得約+5V電壓而鳴叫;當P3.2輸出低電平“0”時,三極管截止,蜂鳴器停止發聲。 圖4-4是一個簡單的使用三極管驅動的峰鳴音報警電路: 圖4-4 三極管驅動的峰鳴音報警電路 本設計是為在溫濕度測量中對溫濕度的上下限超出是的提示報警,接口位于單片機AT89C51的P3.2口,但溫濕度過限時,P3.2口被置0,本系統開始工作。 4.2 本章小結 本章介紹了硬件系統的設計部分,包括顯示電路和報警電路兩部分。而下一章我將講解軟件設計部分。
5 軟件設計
5.1標度變換的實現 溫濕度主程序的設計應考慮以下問題:(1)溫度顯示;(2)溫濕度采樣,數字濾波;(3)越限報警(5)溫度標度轉換。通常,符合上述功能的溫濕度監測程序由主程序和T0中斷服務程序兩部分組成。 這里所需要注意的是標度變換,下面簡單的介紹一下標度變換: 標度變換的目的是要把實際采樣的二進制值轉換成BCD形式的溫度值,然后存放到顯示緩沖區34H-3BH。對一般線性儀表來說,標度變換公式為: 
式中:A0為一次測量儀表的下限;Am為一次測量儀表的上限;AX為實際測量值; N0為儀表下限所對應的數字量;Nm為儀表上限所對應的數字量;NX為測量所得數字量。 軟件部分除主程序外,還包含有中斷服務、測量、顯示、A/D 轉換等功能模塊。由于系統控制過程是由中斷服務程序實現的,本文給出了中斷服務程序流程圖(見圖4-2),從中可以看到整個程序設計的思路和概貌。 5.2 主程序流程圖 軟件設計的主程序流程圖如圖5-1所示。 第一步,先設置堆棧,堆棧完后清標志,清除暫時存儲的數據,最后再清顯示的數字。 第二步進行T0初始化,然后進行串行口初始化。 第三步進行CPU開中斷。 第四步進行掃描鍵盤之后進行溫濕度采樣。 第五步顯示采集所得到的溫濕度數據。 第六步循環進行溫濕度采樣,使得可以隔一段時間進行溫濕度數據顯示更新。

圖5-1主程序流程圖 5.3 T0中斷流程圖 軟件的中斷流程圖如圖5-2所示。 第一步先從中斷服務程序入口進入,然后保護現場,送定時器初值,最后進行記時處理。 第二步進行溫濕度采樣,接著將溫濕度值送顯示,通過指針取設定值,與已經設定好的設定值進行比較,采用控制算法。 第三步輸出溫、濕度控制量。
圖5-2 中斷服務程序框圖 5.4 報警子程序流程圖 報警子程序圖如圖5-3所示。 圖5-3報警子流程圖 5.5 溫濕度采樣子程序流程圖 溫濕度采樣子程序流程圖如圖5-4所示。 圖5-4溫濕度采集流程圖
6 結論
6.1 總結 本文設計了一個簡單的單點糧庫監測系統,能自動簡單的測量糧庫一點的溫濕度并且具有溫濕度超過規定指標進行警報的功能。本系統具有硬件少,結構簡單,容易實現,性能穩定可靠,成本低等特點。 6.2 改進思路 在電子系統設計中,為了少走彎路和節省時間,應充分考慮并滿足抗干擾 的要求,避免在設計完成后再去進行抗干擾的補救措施。形成干擾的基本要素有三個:第一個是干擾源,指產生干擾的元件、設備或信號,第二個是傳播路徑,第三個是敏感器件。下面講具體的抗干擾方案。 6.2.1軟件方面 1、習慣于將不用的代碼空間全清成“0”,因為這等效于NOP,可在程序跑飛時歸位; 2、在跳轉指令前加幾個NOP,目的同1; 3、在無硬件WatchDog時可采用軟件模擬WatchDog,以監測程序的運行; 4、涉及處理外部器件參數調整或設置時,為防止外部器件因受干擾而出錯可定時將參數重新發送一遍,這樣可使外部器件盡快恢復正確; 5、通訊中的抗干擾,可加數據校驗位,可采取3取2或5取3策略; 6、在有通訊線時,如I^2C、三線制等,實際中發現將Data線、CLK線、INH線常態置為高,其抗干擾效果要好過置為低。 6.2.2硬件方面 1、地線、電源線的部線肯定重要了! 2、線路的去偶; 3、數、模地的分開; 4、每個數字元件在地與電源之間都要104電容; 5、在有繼電器的應用場合,尤其是大電流時,防繼電器觸點火花對電路的干擾,可在繼電器 線圈間并一104和二極管,在觸點和常開端間接472電容,效果不錯! 6、為防I/O口的串擾,可將I/O口隔離,方法有二極管隔離、門電路隔離、光偶隔離、電磁隔離等; 7、當然多層板的抗干擾肯定好過單面板,但成本卻高了幾倍。 8、選擇一個抗干擾能力強的器件比之任何方法都有效,我想這點應該最重要。因為器件天生的不足是很難用外部方法去彌補的,但往往抗干擾能力強的就貴些 總結本文的研究工作,主要做了下面幾點較突出的工作: - 通過查閱大量的相關資料,詳細了解了dht11傳感器的優點,以及他的結構與功能并且明確了研究目標。
- 本文設計了自動采集溫濕度后進過A/D轉換器和單片機89c51與max7219的處理最后顯示在led數碼管上,使我們目測到目前的糧庫的實際溫濕度情況。
- 文章給出了系統具體的硬件設計方案,硬件結構電路圖,軟件流程圖和具體匯編語言程序設計等方面。
- 在這次畢業設計的過程中學會了Proteus仿真軟件的基本使用,感到Proteus仿真軟件對我們專業的同學來說是一個非常方便,值得學習的軟件。
- 通過這次畢業設計,重新復習并進一步學習了MCS-51;并且熟練掌握了WORD等軟件的使用。
- 存在的缺陷是沒進行干擾考慮,并且因為條件限制的原因沒能制作成多點測量對糧庫溫濕度的測量帶有局限性。
致謝
大學本科的學習終于快要畢業了。得以完成畢業論文是與方方面面的關懷和幫助分不開的。首先,我要衷心的感謝我的導師薛麗娟,從論文的選題到畢業設計和論文工作的進行,老師都給與我最大的幫助、指導和鼓勵,并盡力為我創造了良好的環境,從而使我在面臨一些困難的情況下完成了論文的研究工作。同時還要感謝我班的同學,感謝他們的幫助
附錄A 糧庫溫濕度監測的硬件原理圖
附錄 B 匯編程序
//-------------------------------- //-----濕度讀取子程序 ------------ //-------------------------------- //----以下變量均為全局變量-------- //----溫度高8位== U8T_data_H------ //----溫度低8位== U8T_data_L------ //----濕度高8位== U8RH_data_H----- //----濕度低8位== U8RH_data_L----- //----校驗 8位 == U8checkdata----- //----調用相關子程序如下---------- //---- Delay();, Delay_10us();,COM(); //--------------------------------
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
-
- typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位整型變量 */
- typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位整型變量 */
- typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位整型變量 */
- typedef signed int S16; /* defined for signed 16-bits integer variable 有符號16位整型變量 */
- typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 無符號32位整型變量 */
- typedef signed long S32; /* defined for signed 32-bits integer variable 有符號32位整型變量 */
- typedef float F32; /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
- typedef double F64; /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
- //
- #define uchar unsigned char
- #define uint unsigned int
- #define Data_0_time 4
-
- sbit DIN=P2^0;
- sbit LOAD=P2^1;
- sbit CLK=P2^2;
- sbit dout=P2^5;
- sbit nullio=P2^3;
- sbit sound =P3^2;
- sbit mode=P1^2;
- sbit set= P1^3;
-
- uchar mode_flag;
- uchar set_flag;
-
- U8 U8FLAG,k;
- U8 U8count,U8temp;
- U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- U8 U8comdata;
- U8 outdata[5]; //定義發送的字節數
- U8 indata[5];
- U8 count, count_r=0;
- U16 U16temp1,U16temp2;
- unsigned char th,tl,hh,hl;
- unsigned char th0,tl0,hh0,hl0;
- bit time_flag;
- uchar criterion_hum;
- uchar criterion_temp;
-
- void RH(void);
- void s_seg(uchar ,uchar ,uchar, uchar );
- void send(uchar ,uchar);
- void COM(void);
- void process(void);
- void Delay(U16 );
- void Delay_10us(void);
- void key_scan(void);
- void winkling(void);
- void delayMs(unsigned int i);
- void special(unsigned char i);
- void init(void);
- void main(void)
- {
- init();
- while(1)
- {
- RH();//讀取數據
- process(); //數據處理
-
- s_seg(th,tl,hh,hl); //顯示溫濕度
-
- key_scan();//按鍵掃描
- winkling();
- criterion_temp=th0*10+tl0;
- criterion_hum=hh0*10+hl0;
- if ((U8T_data_H>criterion_temp)||(U8RH_data_H>criterion_hum)) sound=0;
-
- else sound =1;
- // delayMs(150);
- special(180);//延時
-
- }
- }
-
- void init(void)
- {
- // s_seg(0x81,0x82,0x83,4,5,6,7,8);
- criterion_temp=19;
- criterion_hum=50;
- th0=criterion_temp/10;
- tl0=criterion_temp%10;
- hh0=criterion_hum/10;
- hl0=criterion_hum%10;
- }
- void special(unsigned char i)
- {
- unsigned int j;
- while(i--)
- {
- for(j = 0; j < 125; j++);
- key_scan();
- }
- }
-
- void delayMs(unsigned int i)
- {
- unsigned int j;
- while(i--)
- {
- for(j = 0; j < 125; j++);
- }
- }
-
- void key_scan(void)
- {
- if(!set)
- {
- delayMs(10);//延時10ms
- if(!set) { set_flag ++ ;while(!set);}
- }
- if(!mode)
- {
- delayMs(10);//延時10ms
- if(!mode){ mode_flag ++ ; while(!mode) ;}
- } }
- void COM(void)
- {
- U8 i;
- for(i=0;i<8;i++)
- {
- U8FLAG=2;
- //----------------------
- // P2_1=0 ; //T
- // P2_1=1 ; //T
- //----------------------
- while((!dout)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- // Delay_10us();
- U8temp=0;
- if(dout)U8temp=1;
- U8FLAG=2;
- while((dout)&&U8FLAG++);
- //----------------------
- // P2_1=0 ; //T
- // P2_1=1 ; //T
- //----------------------
- //超時則跳出for循環
- if(U8FLAG==1)break;
- //判斷數據位是0還是1
- // 如果高電平高過預定0高電平值則數據位為 1
- U8comdata<<=1;
- U8comdata|=U8temp; //0
- }//rof
- }
- void send(uchar add,uchar dat)
- { uchar ADS,i,j;
- CLK=0;
- LOAD=0;
- DIN=0;
- i=4;
- while(i<16)
- { if(i<8)
- {
- ADS=add;
- }
- else
- {
- ADS=dat;
- }
- for(j=8;j>=1;j--)
- {
- if((ADS&0x80)==0)
- { DIN=0 ;}
- else
- { DIN=1;}
- ADS=ADS<<1;
- CLK=1;
- CLK=0;
- }
- i=i+8;
- }
- LOAD=1;
- }
- //void s_seg(uchar X1,uchar X2,uchar X3,uchar X4,uchar X5,uchar X6,uchar X7, uchar X8)
- void s_seg(uchar X5,uchar X6,uchar X7, uchar X8)
- { send(0x0c,0x01);//正常狀態
- send(0x0b,0x07);//設置掃描范圍DIG0-7
- send(0x0a,0x05);//設置亮度11/32
- send(0x09,0xff);//采用譯碼方式
- // send(0x01,X1);
- // send(0x02,X2);
- // send(0x03,X3);
- // send(0x04,X4);
- send(0x05,X5);
- send(0x06,X6);
- send(0x07,X7);
- send(0x08,X8);
- }
- void RH(void)
- {
- //主機拉低18ms
- dout=0;
- Delay(180);
- dout=1;
- //總線由上拉電阻拉高 主機延時20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主機設為輸入 判斷從機響應信號
- dout=1;
- //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
- if(!dout) //T !
- {
- U8FLAG=2;
- //判斷從機是否發出 80us 的低電平響應信號是否結束
- while((!dout)&&U8FLAG++);
- U8FLAG=2;
- //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
- while((dout)&&U8FLAG++);
- //數據接收狀態
- COM();
- U8RH_data_H_temp=U8comdata;
- COM();
- U8RH_data_L_temp=U8comdata;
- COM();
- U8T_data_H_temp=U8comdata;
- COM();
- U8T_data_L_temp=U8comdata;
- COM();
- U8checkdata_temp=U8comdata;
- dout=1;
- //數據校驗
- U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
- if(U8temp==U8checkdata_temp)
- {
- U8RH_data_H=U8RH_data_H_temp;
- U8RH_data_L=U8RH_data_L_temp;
- U8T_data_H=U8T_data_H_temp;
- U8T_data_L=U8T_data_L_temp;
- U8checkdata=U8checkdata_temp;
- }//fi
- }//fi
-
- }
- void process(void)
- {
- if(U8RH_data_H==0)
- { hh=0;
- hl=0;
- }
- else
- {
- hh=U8RH_data_H/10;
- hl=U8RH_data_H%10;
- }
- if(U8T_data_H==0)
- { th=0;
- tl=0;
- }
- else
- {
- th=U8T_data_H/10;
- tl=U8T_data_H%10;
- }
- }
-
- void Delay(U16 j)
- { U8 i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
-
- void Delay_10us(void)
- {
- U8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- void winkling(void)
- {
- switch(mode_flag)
- {
- case 0:break;
-
- case 1:
- {
- while(mode_flag==1)
- {
-
- send(0x05,0xf);
- special(100);
- if(mode_flag!=1) { send(0x05,th0); goto XX2; }
-
- if(set_flag==1)
- {
- set_flag=0;
- th0++;
- if(th0>9) th0=0;
- }
-
- send(0x05,th0);
- special(100);
- if(set_flag==1)
- {
- set_flag=0;
- th0++;
- if(th0>9) th0=0;
- }
- }
- }
-
- case 2:
- {
- XX2: while(mode_flag==2)
- {
- send(0x06,0xf);
- special(100);
- if(mode_flag!=2){ send(0x06,tl0); goto XX3;}
- if(set_flag==1)
- {
- set_flag=0;
- tl0++;
- if(tl0>9)tl0=0;
- }
- send(0x06,tl0);
- special(100);
- if(set_flag==1)
- {
- set_flag=0;
- tl0++;
- if(tl0>9)tl0=0;
- }
- }
- }
- case 3:
- XX3: { while(mode_flag==3)
- {
- send(0x07,0xf);
- special(100);
- if(mode_flag!=3) { send(0x07,hh0); goto XX4;}
- if(set_flag==1)
- {
- set_flag=0;
- hh0++;
- if(hh0>9)hh0=0;
- }
- send(0x07,hh0);
- special(100);
- if(set_flag==1)
- {
- set_flag=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址:
http://www.zg4o1577.cn/bbs/dpj-125422-1.html
|