找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4289|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)的大型糧倉溫濕度檢測系統(tǒng)設(shè)計(jì)論文下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:328014 發(fā)表于 2018-6-30 04:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
大型糧倉溫濕度檢測系統(tǒng)的設(shè)計(jì)
畢業(yè)設(shè)計(jì)(論文)開題報(bào)告
題目
大型糧倉檢測系統(tǒng)的設(shè)計(jì)
目的及意義(含國內(nèi)外的研究現(xiàn)狀分析):
目的:
糧食儲(chǔ)藏是國家為防備戰(zhàn)爭,災(zāi)荒或其它突發(fā)性事變而采取的有效措施,因此糧食的儲(chǔ)藏有重要意義。影響糧食安全儲(chǔ)存的主要參數(shù)是糧食的溫度和濕度。這兩者之間又是相互關(guān)聯(lián)的。糧食在正常儲(chǔ)藏過程中,含水量一般在12%以下是安全的,不會(huì)發(fā)生溫度突變,一旦糧庫進(jìn)水,結(jié)露是糧食的含水量達(dá)到20%以上時(shí),由于糧粒受潮胚芽萌發(fā),新陳代謝加快而產(chǎn)生呼吸熱是局部糧食溫度突然升高,必然引起糧食霉變,可能造成無法挽回的損失因此設(shè)計(jì)出一種經(jīng)濟(jì)適用的糧倉溫濕度智能檢測系統(tǒng)是非常有必要的。單片機(jī)自誕生以來給全世界人類的生活和工作起到了劇烈的作用,利用單片機(jī)進(jìn)行溫濕度檢測、處理和顯示具有實(shí)時(shí)性好、成本低、穩(wěn)定性高等優(yōu)點(diǎn)。通過該系統(tǒng)的設(shè)計(jì),這樣他們的就業(yè)面會(huì)更加寬廣,也可以滿足當(dāng)今社會(huì)對單片機(jī)開發(fā)人才的大量需求.。
基本內(nèi)容和技術(shù)方案:
設(shè)計(jì)內(nèi)容:
1:設(shè)計(jì)相應(yīng)的信號采集電路,執(zhí)行電路等硬件電路。
2:實(shí)現(xiàn)各環(huán)境要素的自動(dòng)檢測。
3:通過單片機(jī)匯編語言編制數(shù)據(jù)采集,分析采集,顯示,修改。參數(shù)設(shè)計(jì),控制等程序功能模塊
設(shè)計(jì)方案:
1采用模擬溫濕度傳感器,轉(zhuǎn)換結(jié)果需要運(yùn)算放大器傳給單片機(jī),它控制雖然簡單但電路復(fù)雜,不容易實(shí)現(xiàn)對多點(diǎn)溫濕度監(jiān)控,容易出現(xiàn)誤差,導(dǎo)致測量結(jié)果不準(zhǔn)確。
2進(jìn)行傳感器的硬件電路的設(shè)計(jì)。
3數(shù)碼管顯示,及報(bào)警電路的設(shè)計(jì)。
3.進(jìn)度安排:
第1-2周:畢業(yè)實(shí)習(xí),下達(dá)畢業(yè)設(shè)計(jì)任務(wù)書,查閱相關(guān)文獻(xiàn)資料,明確研究內(nèi)容,了解研究所需元件的規(guī)格及其價(jià)格;
第3周:確定方案,完成開題報(bào)告;
第4-6周:完成系統(tǒng)硬件電路的設(shè)計(jì)。
第7-10周:系統(tǒng)各組成部分的選型;
第11-12周:系統(tǒng)軟件框圖設(shè)計(jì)。
第13-15周:完成并修改畢業(yè)論文。
第15周: 準(zhǔn)備論文答辯。
4.指導(dǎo)教師意見:
指導(dǎo)教師簽名:                年    月    日

目  錄

摘  要1
Abstract 7
1.緒論 8
1.1選題背景 8
1.2設(shè)計(jì)目標(biāo) 8
1.2.1基本功能 8
1.2.2主要技術(shù)參數(shù) 8
2 設(shè)計(jì)方案 9
2.1 系統(tǒng)的總體框圖 9
2.2溫濕度傳感器的選擇  9
2.3信號采集通道的選擇 10
2.4 本章小結(jié)10
3 主要芯片簡介11
3.1 DHT11數(shù)字傳感器 11
3.1.1 主要特性11
3.1.2 應(yīng)用領(lǐng)域11
3.1.3 接口說明11
3.1.4 電源引腳11
3.1.5 封裝信息11
3.1.6 DHT11引腳圖 12
3.1.7 注意事項(xiàng)12
3.2 ADC0832與單片機(jī)89C5113
3.2.1 A/D轉(zhuǎn)換 13
3.2.2 單片機(jī)89c51 15
3.3 本章小結(jié)22
4 硬件設(shè)計(jì)23
4.1 顯示與報(bào)警的設(shè)計(jì)23
4.1.1 顯示電路23
4.1.2 報(bào)警電路24
4.2 本章小結(jié)25
5 軟件設(shè)計(jì)26
5.1標(biāo)度變換的實(shí)現(xiàn) 26
5.2 主程序流程圖26
5.3 T0中斷流程圖27
5.4 報(bào)警子程序流程圖28
5.5 溫濕度采樣子程序流程圖29
6 結(jié)論30
6.1 總結(jié)30
6.2 改進(jìn)思路30
6.2.1軟件方面 30
6.2.2硬件方面 30
參考文獻(xiàn)33
附錄A 33
附錄 B   匯編程序34
附錄C  proteus仿真總電路圖......................................................
致  謝44


本畢業(yè)設(shè)計(jì)是應(yīng)用單片機(jī)作為控制器設(shè)計(jì)的溫濕度檢測系統(tǒng),由要由溫度、濕度采集、AD轉(zhuǎn)換、單片機(jī)控制、數(shù)碼管顯示、USB連接器六部分組成 。

本設(shè)計(jì)是以89C51單片機(jī)為控制中心,這種控制芯片具有4KB的快擦寫可編程/擦除只讀存儲(chǔ)器EEPROM、256KB片內(nèi)RAM、3個(gè)16位定時(shí)計(jì)數(shù)器、5個(gè)中斷源,無需進(jìn)行系統(tǒng)擴(kuò)展既可滿足任務(wù)要求,能較大幅度提高系統(tǒng)的性價(jià)比。而溫濕度傳感器我采用的是DHT11數(shù)字溫濕傳感器,它性價(jià)比比較高。DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。

另外該系統(tǒng)除了能顯示溫濕度以外, 還能設(shè)置溫濕度報(bào)警閥值。

關(guān)鍵詞:溫濕度;89C51單片機(jī);DHT11傳感器;溫濕度報(bào)警閥

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 研究背景

由古至今,糧倉糧食的存儲(chǔ)是否得當(dāng)對國家的經(jīng)濟(jì)能否正常合理的運(yùn)行有很大的影響。但是在以前的經(jīng)濟(jì)和科技水平有限,所以我國糧食的存儲(chǔ)的環(huán)境很差,管理落后。糧庫管理的重點(diǎn)之一就是要合理布置測溫點(diǎn),經(jīng)常檢查溫度變化,以便及時(shí)發(fā)現(xiàn)糧食的發(fā)熱點(diǎn),減少糧食的損失。然而,糧堆的熱傳遞又是那樣的緩慢,使人感知極差,需要管理人員經(jīng)常進(jìn)入悶熱、嗆人的倉房內(nèi)觀察溫、濕度,不斷進(jìn)行翻倉、通風(fēng),這種繁重的體力勞動(dòng),不僅對人體有極大地傷害,而且不科學(xué)、不及時(shí)。所以,糧食蟲蛀、霉變的情況時(shí)有發(fā)生。

1.2設(shè)計(jì)目標(biāo)

1.2.1基本功能

1.檢測溫度、濕度

2.顯示溫度、濕度

3.過限報(bào)警

1.2.2主要技術(shù)參數(shù)

1.溫度檢測的范圍: -30℃±55℃

2.測量精度: 2℃

3.濕度檢測的范圍: 20%-90%RH

4.檢測精度:5%RH

5.顯示方式: 溫度:四位顯示  濕度:四位顯示;

  報(bào)警方式: 三極管驅(qū)動(dòng)的蜂鳴音報(bào)警


2 設(shè)計(jì)方案

溫濕度監(jiān)測系統(tǒng)要滿足以下條件:溫濕度監(jiān)測系統(tǒng)能完成數(shù)據(jù)采集和處理、顯示、串行通信、輸出控制信號等多種功能。由數(shù)據(jù)采集、數(shù)據(jù)調(diào)理、單片機(jī)、數(shù)據(jù)顯示等4個(gè)大的部分組成。該測控系統(tǒng)具有實(shí)時(shí)采集(檢測糧庫內(nèi)的溫濕度)、實(shí)時(shí)顯示(對監(jiān)測到的進(jìn)行顯示)、實(shí)時(shí)警報(bào)(根據(jù)監(jiān)測的結(jié)果,超出預(yù)設(shè)定的值的進(jìn)行蜂鳴警告)的功能。

傳感器是實(shí)現(xiàn)測量首要環(huán)節(jié),是監(jiān)測系統(tǒng)的關(guān)鍵部件,如果沒有傳感器對原始被測信號進(jìn)行準(zhǔn)確可靠的捕捉和轉(zhuǎn)換,一切準(zhǔn)確的測量和控制都將無法實(shí)現(xiàn)。工業(yè)生產(chǎn)過程的自動(dòng)化測量和控制,幾乎主要依靠各種傳感器來檢測和控制生產(chǎn)過程中的各種參量,使設(shè)備和系統(tǒng)正常運(yùn)行在最佳狀態(tài),從而保證生產(chǎn)的高效率和高質(zhì)量。

2.1 系統(tǒng)的總體框圖

系統(tǒng)的總體設(shè)計(jì)框圖如圖3-1所示。

圖3-1  系統(tǒng)總體框圖

本設(shè)計(jì)由信號采集、信號分析和信號處理三個(gè)部分組成的。

(一) 信號采集  由dht11溫濕度傳感器和多路模式選擇開關(guān)組成;

(二) 信號分析  由A/D轉(zhuǎn)換器和單片機(jī)80c51組成;

(三) 信號處理  由串行口LCD顯示器和報(bào)警系統(tǒng)等組成。

2.2溫濕度傳感器的選擇

     DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高

的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測 溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲(chǔ)存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達(dá)20米以上,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場合的最佳選則。產(chǎn)品為4針單排引腳封裝。連接方便,特殊封裝形式可根據(jù)用戶需求而提供。

2.3信號采集通道的選擇

在本設(shè)計(jì)系統(tǒng)中,溫度輸入信號為4路的模擬信號,這就需要多通道結(jié)構(gòu)采用多路分時(shí)的模擬量輸入通道。這種結(jié)構(gòu)的模擬量通道特點(diǎn)為:對ADC、S/H要求高。處理速度慢。硬件簡單,成本低。軟件比較復(fù)雜。如圖2-1所示。

圖2-1多路分時(shí)的模擬量輸入通道



2.4 本章小結(jié)

在本章中,主要講了溫濕度傳感器的硬件選擇和信號采集通道的選擇。這些選擇是在實(shí)用性和價(jià)格低廉方面考慮的,如果條件允許可以選擇性能更加強(qiáng)大的傳感器和一個(gè)專門的多路選擇的的模塊。在下一章中,介紹系統(tǒng)的總體設(shè)計(jì)所用到主要芯片。


3 主要芯片簡介

3.1 DHT11數(shù)字傳感器

數(shù)字溫濕度傳感DHT11是由廣州奧松有限公司生產(chǎn)的一款溫濕度一體化的數(shù)字傳感器。

3.1.1 主要特性

DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC              測溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的 濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲(chǔ)存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集 成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達(dá)20米以上,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場合的最佳選則。產(chǎn)品為4針單排引腳 封裝。連接方便,特殊封裝形式可根據(jù)用戶需求而提供。

3.1.2 應(yīng)用領(lǐng)域

該DHT11可以用于暖通空調(diào)、測試及檢測設(shè)備、汽車、數(shù)據(jù)記錄器、消費(fèi)品、自動(dòng)控制、濕度調(diào)節(jié)器及醫(yī)療等應(yīng)用領(lǐng)域。

3.1.3 接口說明

建議連接線長度短于20米時(shí)用5K上拉電阻,大于20米時(shí)根據(jù)實(shí)際情況使用合適的上拉電阻。

圖3-2  dht11應(yīng)用電路

3.1.4 電源引腳

DHT11的供電電壓為3-5.5V。傳感器上電后,要等待1s以越過不穩(wěn)定狀態(tài)在此期間無需發(fā)送任何指令。電源引腳(VDD,GND)之間可增加一個(gè)100nF的電容,用以去耦濾波。

3.1.5 封裝信息

圖3-3  dht11封裝圖

3.1.6 DHT11引腳圖



圖3-4  引腳圖

3.1.7 注意事項(xiàng)

溫度影響 氣體的相對濕度,在很大程度上依賴于溫度。因此在測量濕溫時(shí),應(yīng)盡可能保證濕度傳感器在同一溫度下工作。如果與釋放熱量的電子元件共用一個(gè)印刷線 路板,在安裝時(shí)應(yīng)盡可能將DHT11遠(yuǎn)離電子元件,并安裝在熱源下方,同時(shí)保持 外殼的良好通風(fēng)。為降低熱傳導(dǎo),DHT11與印刷電路板其它部分的銅鍍層應(yīng)盡可 能最小,并在兩者之間留出一道縫隙。光線長時(shí)間暴露在太陽光下或強(qiáng)烈的紫外線輻射中,會(huì)使性能降低。配線注意事項(xiàng)DATA信號線材質(zhì)量會(huì)影響通訊距離和通訊質(zhì)量,推薦使用高質(zhì)量屏蔽線。



3.2 ADC0832與單片機(jī)89C51

3.2.1 A/D轉(zhuǎn)換

3.2.1.1 A/D轉(zhuǎn)換器的特點(diǎn)

ADC0832 是美國國家半導(dǎo)體公司生產(chǎn)的一種8 位分辨率、雙通道A/D轉(zhuǎn)換
芯片。由于它體積小,兼容性強(qiáng),性價(jià)比高而深受單片機(jī)愛好者及企業(yè)歡迎,
其目前已經(jīng)有很高的普及率。學(xué)習(xí)并使用ADC0832 可是使我們了解A/D轉(zhuǎn)換器
的原理,有助于我們單片機(jī)技術(shù)水平的提高。

ADC0832 具有以下特點(diǎn):
8位分辨率;
雙通道A/D轉(zhuǎn)換;
輸入輸出電平與TTL/CMOS相兼容;
5V電源供電時(shí)輸入電壓在0~5V之間;
工作頻率為250KHZ,轉(zhuǎn)換時(shí)間為32μS;
一般功耗僅為15mW;
8P、14P—DIP(雙列直插)、PICC 多種封裝;
商用級芯片溫寬為0°C to +70°C,工業(yè)級芯片溫寬為−40°C to +85°C;

3.2.1.2 ADC0832元件說明

ADC0832 為 8 位分辨率 A/D 轉(zhuǎn)換芯片,其最高分辨可達(dá) 256 級,可以適應(yīng)一般的模擬量轉(zhuǎn)換要求。其內(nèi)部電源輸入與參考電壓的復(fù)用,使得芯片的模擬 電壓輸入在 0~5V 之間。芯片轉(zhuǎn)換時(shí)間僅為 32μS,據(jù)有雙數(shù)據(jù)輸出可作為數(shù)據(jù) 校驗(yàn),以減少數(shù)據(jù)誤差,轉(zhuǎn)換速度快且穩(wěn)定性能強(qiáng)。獨(dú)立的芯片使能輸入,使 多器件掛接和處理器控制變的更加方便。通過 DI 數(shù)據(jù)輸入端,可以輕易的實(shí)現(xiàn) 通道功能的選擇。

3.2.1.3 芯片頂視圖


圖3-5 ADC0832 芯片頂視圖

芯片接口說明:

GND      芯片參考 0 電位(地)。

DI       數(shù)據(jù)信號輸入,選擇通道控制。

DO       數(shù)據(jù)信號輸出,轉(zhuǎn)換數(shù)據(jù)輸出。

CLK      芯片時(shí)鐘輸入。

VCC/REF  輸入及參考電壓輸入(復(fù)用)。

CS       片選使能,低電平芯片使能。

CH0      模擬輸入通道 0,或作為 IN+/-使用。

CH1      模擬輸入通道 1,或作為 IN+/-使用。

3.2.1.4 ADC0832 與單片機(jī)的接口電路

ADC0832與單片機(jī)的接口電路如圖3-7所示

圖3-6 接口電路圖

3.2.1.5 單片機(jī)對 ADC0832 的控制原理

正常情況下 ADC0832 與單片機(jī)的接口應(yīng)為 4 條數(shù)據(jù)線,分別是 CS、CLK、 DO、DI。但由于 DO 端與 DI 端在通信時(shí)并未同時(shí)有效并與單片機(jī)的接口是雙 向的,所以電路設(shè)計(jì)時(shí)可以將 DO 和 DI 并聯(lián)在一根數(shù)據(jù)線上使用。(見圖 3-7)

當(dāng)ADC0832未工作時(shí)其CS輸入端應(yīng)為高電平此時(shí)芯片禁用,CLK 和DO/DI 的電平可任意。當(dāng)要進(jìn)行A/D轉(zhuǎn)換時(shí)須先將CS使能端置于低電平并且保持低電平直到轉(zhuǎn)換完全結(jié)束。此時(shí)芯片開始轉(zhuǎn)換工作,同時(shí)由處理器向芯片時(shí)鐘輸入端 CLK 輸入時(shí)鐘脈沖,DO/DI 端則使用 DI 端輸入通道功能選擇的 數(shù)據(jù)信號。在第1個(gè)時(shí)鐘脈沖的下沉之前 DI 端必須是高電平,表示啟始信號。在第 2、3個(gè)脈沖下沉之前 DI 端應(yīng)輸入 2 位數(shù)據(jù)用于選擇通道功能,其功能項(xiàng)見表3-1。


表3-1 Adc0832 單端 mux 模式

Mux 地址

頻道

Sgl/dif

Odd/sign

0

1

1

0

+


1

1


+


表3-2 Adc0832 多端 mux 模式

Mux地址

頻道

Sgl/dif

Odd/sign

0

1

0

0

+

-

0

1

-

+






如表3-1,表3-2所示,當(dāng)此 2 位數(shù)據(jù)為“1”、“0”時(shí),只對 CH0 進(jìn)行單通道轉(zhuǎn)換。當(dāng) 2 位數(shù)據(jù)為“1”、“1”時(shí),只對CH1進(jìn)行單通道轉(zhuǎn)換。當(dāng)2位數(shù)據(jù)為“0”、“0”時(shí),將CH0作為正輸入端 IN+,CH1 作為負(fù)輸入端 IN-進(jìn)行輸入。  當(dāng) 2 位 數(shù)據(jù)為“0”、“1”時(shí),將 CH0 作為負(fù)輸入端 IN-,CH1 作為正輸入端 IN+進(jìn)行 輸入。到第3個(gè)脈沖的下沉之后 DI 端的輸入電平就失去輸入作用。

此后 DO/DI 端則開始利用數(shù)據(jù)輸出 DO 進(jìn)行轉(zhuǎn)換數(shù)據(jù)的讀取。從第4個(gè)脈沖下沉開始由 DO 端輸出轉(zhuǎn)換數(shù)據(jù)最高位 DATA7,隨后每一個(gè)脈沖下沉 DO端輸出下一位數(shù)據(jù)。直到第 11個(gè)脈沖時(shí)發(fā)出最低位數(shù)據(jù) DATA0,一個(gè)字節(jié)的數(shù)據(jù)輸出完成。也正是 從此位開始輸出下一個(gè)相反字節(jié)的數(shù)據(jù),即從第11個(gè)字節(jié)的下沉輸出 DATD0。隨后輸出 8 位數(shù)據(jù),到第19個(gè)脈沖時(shí)數(shù)據(jù)輸出完成也標(biāo)志著一次 A/D 轉(zhuǎn)換的結(jié)束。最后將 CS 置高電平禁用芯片,直接將轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行處理就可以了。更詳細(xì)的時(shí)序說明請見圖3-7。

作為單通道模擬信號輸入時(shí) ADC0832 的輸入電壓是 0~5V 且 8 位分辨率時(shí)的電壓精度為 19.53mV。如果作為由 IN+與 IN-輸入的輸入時(shí),可是將電壓值設(shè)定在某一個(gè)較大范圍之內(nèi),從而提高轉(zhuǎn)換的寬度。但值得注意的是,在進(jìn)行 IN+與 IN-的輸入時(shí)如果IN-的電壓大于IN+的電壓則轉(zhuǎn)換后的數(shù)據(jù)結(jié)果始終為00H。

3.2.2 單片機(jī)89c51

為了設(shè)計(jì)此系統(tǒng),我們采用了80c51單片機(jī)作為控制芯片。89C51是MCS-51系列單片機(jī)中CHMOS工藝的一個(gè)典型品種 ;其它廠商以8951為基核開發(fā)出的CMOS工藝單片機(jī)產(chǎn)品統(tǒng)稱為89C51系列。該系列單片機(jī)是采用高性能的靜態(tài)89C51 設(shè)計(jì) 由先進(jìn)CMOS 工藝制造并帶有非易失性Flash 程序存儲(chǔ)器 全部支持12時(shí)鐘和6 時(shí)鐘操作 P89C51X2 和P89C52X2/54X2/58X2 分別包含128 字節(jié)和256 字節(jié)RAM 32條I/O 口線3 個(gè)16位定時(shí)/計(jì)數(shù)器 6 輸入4優(yōu)先級嵌套中斷結(jié)構(gòu)1 個(gè)串行I/O 口可用于多機(jī)通信I/O 擴(kuò)展或全雙工UART以及片內(nèi)振蕩器和時(shí)鐘電路。此外,由于器件采用了靜態(tài)設(shè)計(jì),可提供很寬的操作頻率范圍,頻率可降至0 ?蓪(shí)現(xiàn)兩個(gè)由軟件選擇的節(jié)電模式,空閑模式和掉電模式,空閑模式凍結(jié)CPU但RAM定時(shí)器,串口和中斷系統(tǒng)仍然工作掉電模式保存RAM的內(nèi)容 但是凍結(jié)振蕩器 導(dǎo)致所有其它的片內(nèi)功能停止工作。由于設(shè)計(jì)是靜態(tài)的時(shí)鐘可停止而不會(huì)丟失用戶數(shù)據(jù) 運(yùn)行可從時(shí)鐘停止處恢復(fù)。


圖3-7 ADC0832時(shí)序圖

3.2.2.1 89c51的基本結(jié)構(gòu)

89C51的微處理器(CPU)

運(yùn)算器

累加器ACC ;

寄存器B ;

程序狀態(tài)字寄存器PSW。

控制器

程序計(jì)數(shù)器PC ;

指令寄存器IR ;

定時(shí)與控制邏輯。

89C51的片內(nèi)存儲(chǔ)器

內(nèi)部ROM容量4K字節(jié)

內(nèi)部RAM容量128字節(jié)

89C51的I/O口及功能單元

四個(gè)8位的并行口,即P0~P3。它們均為雙向口,既可作為輸入,又可作為輸出。每個(gè)口各有8條I/O線。

有一個(gè)全雙工的串行口(利用P3口的兩個(gè)引腳P3.0和P3.1);

有2個(gè)16位的定時(shí)/計(jì)數(shù)器 ;

有1套完善的中斷系統(tǒng)。

89C51的特殊功能寄存器(SFR)

低功耗的閑置和掉電模式

片內(nèi)振蕩器和時(shí)鐘電路




圖3-8 89c51結(jié)構(gòu)圖


3.2.2.2 89c51的引腳圖


圖3-9 89C51引腳圖

89C51的制作工藝為CMOS,采用40管腳雙列直插DIP封裝,引腳說明如下:

VCC:供電電壓。

GND:接地。

P0口:P0口為一個(gè)8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。

P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。

P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號和控制信號。

P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。

P3口也可作為AT89C51的一些特殊功能口,如下表所示:

口管腳 備選功能

P3.0 RXD(串行輸入口)

P3.1 TXD(串行輸出口)

P3.2 /INT0(外部中斷0)

P3.3 /INT1(外部中斷1)

P3.4 T0(記時(shí)器0外部輸入)

P3.5 T1(記時(shí)器1外部輸入)

P3.6 /WR(外部數(shù)據(jù)存儲(chǔ)器寫選通)

P3.7 /RD(外部數(shù)據(jù)存儲(chǔ)器讀選通)

P3口同時(shí)為閃爍編程和編程校驗(yàn)接收一些控制信號。

RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。

ALE/PROG:當(dāng)訪問外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí), ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。

/PSEN:外部程序存儲(chǔ)器的選通信號。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信號將不出現(xiàn)。

/EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH),不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。

XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。

XTAL2:來自反向振蕩器的輸出。

3.2.2.3 89c51的存儲(chǔ)器配置

圖3-10 89C51存儲(chǔ)器配置

程序存儲(chǔ)器
與ROM密切相關(guān)的兩個(gè)引腳
地址鎖存允許信號端
外部程序存儲(chǔ)器允許輸出信號端
當(dāng)ROM容量不夠時(shí),盡量選擇高容量存儲(chǔ)器空間的單片機(jī),如89C52,89C54,89C58等,應(yīng)避免外擴(kuò)程序存儲(chǔ)器,因?yàn)闀?huì)增加硬件負(fù)擔(dān).
通過16位PC尋址,最大可尋址64kB地址空間

數(shù)據(jù)存儲(chǔ)器

數(shù)據(jù)存儲(chǔ)器用于存放運(yùn)算中間的結(jié)果、數(shù)據(jù)暫存、緩沖、標(biāo)志位、待測程序等功能。

片內(nèi)的128B的RAM地址為00H~7FH,供用戶做RAM用,但是在這中間的前32單元,00H~1FH即引用地址尋址做用戶RAM用,常常做工作寄存器區(qū),分做四組,每組由8個(gè)單元組成通用寄存器R0~R7,任何時(shí)候都由其中一組作為當(dāng)前工作寄存器,通過RS0,RS1的內(nèi)容來決定選擇哪一個(gè)工作寄存器。

低128字節(jié)中的20H~2FH共16字節(jié)可用位尋址方式訪問各位,共128個(gè)位地址,30H~7FH共80個(gè)單元為用戶RAM區(qū),作堆棧或數(shù)據(jù)緩沖用,片內(nèi)RAM不夠用時(shí),須擴(kuò)展片外數(shù)據(jù)存儲(chǔ)器。此時(shí)單片機(jī)通過P2口和P0口選出6位地址,使用ALE作低8位的鎖存信號,再由P0口寫入或讀出數(shù)據(jù)。寫時(shí)用,讀時(shí)用做外部數(shù)據(jù)存儲(chǔ)器的選通信號

特殊功能寄存器SFR

表3-3 特殊功能寄存器SFR的位置

3.2.2.4 89C51的工作模式

有四種工作模式:模式0,模式1,模式2,模式3

模式0:選擇定時(shí)器的高8位和低5位組成一個(gè)13位定時(shí)器/計(jì)數(shù)器。TL低5位溢出時(shí)向TH進(jìn)位,TH溢出時(shí)向中斷標(biāo)志位TF進(jìn)位,并申請中斷。

定時(shí)時(shí)間t=(213-初值)×振蕩周期×12;計(jì)數(shù)長度位213=8192個(gè)外部脈沖

模式1:與模式0的唯一差別是寄存器TH和TL以全部16位參與操作。定時(shí)時(shí)間t=(216-初值)×振蕩周期×12;計(jì)數(shù)長度位216=65536個(gè)外部脈沖

模式2:把TL0和TL1配置成一個(gè)自動(dòng)重裝載的8位定時(shí)器/計(jì)數(shù)器。TL用作8位計(jì)數(shù)器,TH用以保存初值。TL計(jì)數(shù)溢出時(shí)不僅使TF0置1,而且還自動(dòng)將TH中的內(nèi)容重新裝載到TL中。

定時(shí)時(shí)間t=(28-初值)×振蕩周期×12;計(jì)數(shù)長度位28=256個(gè)外部脈沖

模式3:對T0和T1不大相同

若設(shè)T0位模式3,TL0和TH0被分為兩個(gè)相互獨(dú)立的8位計(jì)數(shù)器。TL0為8位計(jì)數(shù)器,功能與模式0和模式1相同,可定時(shí)可計(jì)數(shù)。

TH0僅用作簡單的內(nèi)部定時(shí)功能,它占用了定時(shí)器T1的控制位TR1和中斷標(biāo)志位TF1,啟動(dòng)和關(guān)閉僅受TR1控制。

定時(shí)器T1無工作模式3,但T0在工作模式3時(shí)T1仍可設(shè)置為0~2。

3.2.2.5 89c51的系統(tǒng)時(shí)鐘的設(shè)計(jì)

時(shí)鐘電路是用來產(chǎn)生89c51單片機(jī)工作時(shí)所必須的時(shí)鐘信號,89c51本身就是一個(gè)復(fù)雜的同步時(shí)序電路,為保證工作方式的實(shí)現(xiàn),89c51在唯一的時(shí)鐘信號的控制下嚴(yán)格的按時(shí)序執(zhí)行指令進(jìn)行工作 ,時(shí)鐘的頻率影響單片機(jī)的速度和穩(wěn)定性。通常時(shí)鐘由于兩種形式:內(nèi)部時(shí)鐘和外部時(shí)鐘。

我們系統(tǒng)采用內(nèi)部時(shí)鐘方式來為系統(tǒng)提供時(shí)鐘信號。89c51內(nèi)部有一個(gè)用于構(gòu)成振蕩器的高增益反向放大器,該放大器的輸入輸出引腳為XTAL1和XTAL2,它們跨接在晶體振蕩器和用于微調(diào)的電容,便構(gòu)成了一個(gè)自激勵(lì)振蕩器

電路中的C1、C2的選擇在30PF左右,但電容太小會(huì)影響振蕩的頻率、穩(wěn)定性和快速性。晶振頻率為在1.2MHZ~12MHZ之間,頻率越高單片機(jī)的速度就越快,但對存儲(chǔ)器速度要求就高。為了提高穩(wěn)定性我們采用溫度穩(wěn)定性好的NPO電容,采用的晶振頻率為12MHZ。

圖3-11 系統(tǒng)時(shí)鐘

3.3 本章小結(jié)

本章主要介紹了主要芯片的簡介,其中重點(diǎn)介紹了dht11溫濕度傳感器和89c51的元件結(jié)構(gòu)及其各自的工作原理。


4 硬件設(shè)計(jì)

4.1 顯示與報(bào)警的設(shè)計(jì)

4.1.1 顯示電路            

該設(shè)計(jì)中我們采用顯示驅(qū)動(dòng)接口芯片方式。即用MAX7219 LED顯示驅(qū)動(dòng)芯片與單片機(jī)89c51和4位陰極數(shù)碼管組成顯示電路。

MAX7219是Maxim公司推出的8位LED串行顯示驅(qū)動(dòng)器,它采用3線串口傳送數(shù)據(jù),占用資源少且硬件簡單,只需一個(gè)外部電阻即可方便地調(diào)節(jié)LED的亮度;可靈活地選擇顯示器的個(gè)數(shù)( 1~8個(gè), 級聯(lián)可成倍增加);可進(jìn)行譯碼或不譯碼顯示;內(nèi)含硬件動(dòng)態(tài)掃描控制,可設(shè)置低功耗停機(jī)方式。

顯示電路的電路連接圖如圖4-1,圖4-2,圖4-3所示

圖4-1 max7219引腳連接圖

圖4-2 4led引腳連接圖

圖4-3 89c51引腳連接圖

4.1.2 報(bào)警電路

在微型計(jì)算機(jī)控制系統(tǒng)中,為了安全生產(chǎn),對于一些重要的參數(shù)或系統(tǒng)部位,都設(shè)有緊急狀態(tài)報(bào)警系統(tǒng),以便提醒操作人員注意,或采取緊急措施。其方法就是把計(jì)算機(jī)采集的數(shù)據(jù)或記過計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理、數(shù)字濾波,標(biāo)度變換之后,與該參數(shù)上下限給定值進(jìn)行比較,如果高于上限值(或低于下限值)則進(jìn)行報(bào)警,否則就作為采樣的正常值,進(jìn)行顯示和控制。

本設(shè)計(jì)采用峰鳴音報(bào)警電路。峰鳴音報(bào)警接口電路的設(shè)計(jì)只需購買市售的壓電式蜂鳴器,然后通過MCS-51的1根口線經(jīng)驅(qū)動(dòng)器驅(qū)動(dòng)蜂鳴音發(fā)聲。壓電式蜂鳴器約需10mA的驅(qū)動(dòng)電流,可以使用TTL系列集成電路7406或7407低電平驅(qū)動(dòng),也可以用一個(gè)晶體三極管驅(qū)動(dòng)。在圖中,P3.2接晶體管基極輸入端。當(dāng)P3.2輸出高電平“1”時(shí),晶體管導(dǎo)通,壓電蜂鳴器兩端獲得約+5V電壓而鳴叫;當(dāng)P3.2輸出低電平“0”時(shí),三極管截止,蜂鳴器停止發(fā)聲。

圖4-4是一個(gè)簡單的使用三極管驅(qū)動(dòng)的峰鳴音報(bào)警電路:

圖4-4 三極管驅(qū)動(dòng)的峰鳴音報(bào)警電路

本設(shè)計(jì)是為在溫濕度測量中對溫濕度的上下限超出是的提示報(bào)警,接口位于單片機(jī)AT89C51的P3.2口,但溫濕度過限時(shí),P3.2口被置0,本系統(tǒng)開始工作。

4.2 本章小結(jié)

本章介紹了硬件系統(tǒng)的設(shè)計(jì)部分,包括顯示電路和報(bào)警電路兩部分。而下一章我將講解軟件設(shè)計(jì)部分。


5 軟件設(shè)計(jì)
5.1標(biāo)度變換的實(shí)現(xiàn)

溫濕度主程序的設(shè)計(jì)應(yīng)考慮以下問題:(1)溫度顯示;(2)溫濕度采樣,數(shù)字濾波;(3)越限報(bào)警(5)溫度標(biāo)度轉(zhuǎn)換。通常,符合上述功能的溫濕度監(jiān)測程序由主程序和T0中斷服務(wù)程序兩部分組成。

這里所需要注意的是標(biāo)度變換,下面簡單的介紹一下標(biāo)度變換:

標(biāo)度變換的目的是要把實(shí)際采樣的二進(jìn)制值轉(zhuǎn)換成BCD形式的溫度值,然后存放到顯示緩沖區(qū)34H-3BH。對一般線性儀表來說,標(biāo)度變換公式為:

式中:A0為一次測量儀表的下限;Am為一次測量儀表的上限;AX為實(shí)際測量值;

N0為儀表下限所對應(yīng)的數(shù)字量;Nm為儀表上限所對應(yīng)的數(shù)字量;NX為測量所得數(shù)字量。

軟件部分除主程序外,還包含有中斷服務(wù)、測量、顯示、A/D 轉(zhuǎn)換等功能模塊。由于系統(tǒng)控制過程是由中斷服務(wù)程序?qū)崿F(xiàn)的,本文給出了中斷服務(wù)程序流程圖(見圖4-2),從中可以看到整個(gè)程序設(shè)計(jì)的思路和概貌。

5.2 主程序流程圖

軟件設(shè)計(jì)的主程序流程圖如圖5-1所示。

第一步,先設(shè)置堆棧,堆棧完后清標(biāo)志,清除暫時(shí)存儲(chǔ)的數(shù)據(jù),最后再清顯示的數(shù)字。

第二步進(jìn)行T0初始化,然后進(jìn)行串行口初始化。

第三步進(jìn)行CPU開中斷。

第四步進(jìn)行掃描鍵盤之后進(jìn)行溫濕度采樣。

第五步顯示采集所得到的溫濕度數(shù)據(jù)。

第六步循環(huán)進(jìn)行溫濕度采樣,使得可以隔一段時(shí)間進(jìn)行溫濕度數(shù)據(jù)顯示更新。



圖5-1主程序流程圖

5.3 T0中斷流程圖

軟件的中斷流程圖如圖5-2所示。

第一步先從中斷服務(wù)程序入口進(jìn)入,然后保護(hù)現(xiàn)場,送定時(shí)器初值,最后進(jìn)行記時(shí)處理。

第二步進(jìn)行溫濕度采樣,接著將溫濕度值送顯示,通過指針取設(shè)定值,與已經(jīng)設(shè)定好的設(shè)定值進(jìn)行比較,采用控制算法。

第三步輸出溫、濕度控制量。


圖5-2 中斷服務(wù)程序框圖

5.4 報(bào)警子程序流程圖

報(bào)警子程序圖如圖5-3所示。

圖5-3報(bào)警子流程圖

5.5 溫濕度采樣子程序流程圖

溫濕度采樣子程序流程圖如圖5-4所示。

  

圖5-4溫濕度采集流程圖


6 結(jié)論

6.1 總結(jié)

本文設(shè)計(jì)了一個(gè)簡單的單點(diǎn)糧庫監(jiān)測系統(tǒng),能自動(dòng)簡單的測量糧庫一點(diǎn)的溫濕度并且具有溫濕度超過規(guī)定指標(biāo)進(jìn)行警報(bào)的功能。本系統(tǒng)具有硬件少,結(jié)構(gòu)簡單,容易實(shí)現(xiàn),性能穩(wěn)定可靠,成本低等特點(diǎn)。

6.2 改進(jìn)思路

在電子系統(tǒng)設(shè)計(jì)中,為了少走彎路和節(jié)省時(shí)間,應(yīng)充分考慮并滿足抗干擾 的要求,避免在設(shè)計(jì)完成后再去進(jìn)行抗干擾的補(bǔ)救措施。形成干擾的基本要素有三個(gè):第一個(gè)是干擾源,指產(chǎn)生干擾的元件、設(shè)備或信號,第二個(gè)是傳播路徑,第三個(gè)是敏感器件。下面講具體的抗干擾方案。

6.2.1軟件方面

1、習(xí)慣于將不用的代碼空間全清成“0”,因?yàn)檫@等效于NOP,可在程序跑飛時(shí)歸位;

2、在跳轉(zhuǎn)指令前加幾個(gè)NOP,目的同1;

3、在無硬件WatchDog時(shí)可采用軟件模擬WatchDog,以監(jiān)測程序的運(yùn)行;

4、涉及處理外部器件參數(shù)調(diào)整或設(shè)置時(shí),為防止外部器件因受干擾而出錯(cuò)可定時(shí)將參數(shù)重新發(fā)送一遍,這樣可使外部器件盡快恢復(fù)正確;

5、通訊中的抗干擾,可加數(shù)據(jù)校驗(yàn)位,可采取3取2或5取3策略;

6、在有通訊線時(shí),如I^2C、三線制等,實(shí)際中發(fā)現(xiàn)將Data線、CLK線、INH線常態(tài)置為高,其抗干擾效果要好過置為低。

6.2.2硬件方面

1、地線、電源線的部線肯定重要了!

2、線路的去偶;

3、數(shù)、模地的分開;

4、每個(gè)數(shù)字元件在地與電源之間都要104電容;

5、在有繼電器的應(yīng)用場合,尤其是大電流時(shí),防繼電器觸點(diǎn)火花對電路的干擾,可在繼電器  線圈間并一104和二極管,在觸點(diǎn)和常開端間接472電容,效果不錯(cuò)!

6、為防I/O口的串?dāng)_,可將I/O口隔離,方法有二極管隔離、門電路隔離、光偶隔離、電磁隔離等;

7、當(dāng)然多層板的抗干擾肯定好過單面板,但成本卻高了幾倍。

8、選擇一個(gè)抗干擾能力強(qiáng)的器件比之任何方法都有效,我想這點(diǎn)應(yīng)該最重要。因?yàn)槠骷焐牟蛔闶呛茈y用外部方法去彌補(bǔ)的,但往往抗干擾能力強(qiáng)的就貴些

總結(jié)本文的研究工作,主要做了下面幾點(diǎn)較突出的工作:

  • 通過查閱大量的相關(guān)資料,詳細(xì)了解了dht11傳感器的優(yōu)點(diǎn),以及他的結(jié)構(gòu)與功能并且明確了研究目標(biāo)。
  • 本文設(shè)計(jì)了自動(dòng)采集溫濕度后進(jìn)過A/D轉(zhuǎn)換器和單片機(jī)89c51與max7219的處理最后顯示在led數(shù)碼管上,使我們目測到目前的糧庫的實(shí)際溫濕度情況。
  • 文章給出了系統(tǒng)具體的硬件設(shè)計(jì)方案,硬件結(jié)構(gòu)電路圖,軟件流程圖和具體匯編語言程序設(shè)計(jì)等方面。
  • 在這次畢業(yè)設(shè)計(jì)的過程中學(xué)會(huì)了Proteus仿真軟件的基本使用,感到Proteus仿真軟件對我們專業(yè)的同學(xué)來說是一個(gè)非常方便,值得學(xué)習(xí)的軟件。
  • 通過這次畢業(yè)設(shè)計(jì),重新復(fù)習(xí)并進(jìn)一步學(xué)習(xí)了MCS-51;并且熟練掌握了WORD等軟件的使用。
  • 存在的缺陷是沒進(jìn)行干擾考慮,并且因?yàn)闂l件限制的原因沒能制作成多點(diǎn)測量對糧庫溫濕度的測量帶有局限性。

致謝
大學(xué)本科的學(xué)習(xí)終于快要畢業(yè)了。得以完成畢業(yè)論文是與方方面面的關(guān)懷和幫助分不開的。首先,我要衷心的感謝我的導(dǎo)師薛麗娟,從論文的選題到畢業(yè)設(shè)計(jì)和論文工作的進(jìn)行,老師都給與我最大的幫助、指導(dǎo)和鼓勵(lì),并盡力為我創(chuàng)造了良好的環(huán)境,從而使我在面臨一些困難的情況下完成了論文的研究工作。同時(shí)還要感謝我班的同學(xué),感謝他們的幫助

附錄A 糧庫溫濕度監(jiān)測的硬件原理圖


附錄 B   匯編程序

            //--------------------------------
              //-----濕度讀取子程序 ------------
              //--------------------------------
              //----以下變量均為全局變量--------
              //----溫度高8位== U8T_data_H------
              //----溫度低8位== U8T_data_L------
              //----濕度高8位== U8RH_data_H-----
              //----濕度低8位== U8RH_data_L-----
              //----校驗(yàn) 8位 == U8checkdata-----
              //----調(diào)用相關(guān)子程序如下----------
              //---- Delay();, Delay_10us();,COM();
              //--------------------------------

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdio.h>

  4. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable                 無符號8位整型變量  */
  5. typedef signed   char  S8;       /* defined for signed 8-bits integer variable                              有符號8位整型變量  */
  6. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable                 無符號16位整型變量 */
  7. typedef signed   int   S16;      /* defined for signed 16-bits integer variable                 有符號16位整型變量 */
  8. typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable                 無符號32位整型變量 */
  9. typedef signed   long  S32;      /* defined for signed 32-bits integer variable                 有符號32位整型變量 */
  10. typedef float          F32;      /* single precision floating point variable (32bits) 單精度浮點(diǎn)數(shù)(32位長度) */
  11. typedef double         F64;      /* double precision floating point variable (64bits) 雙精度浮點(diǎn)數(shù)(64位長度) */
  12. //
  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. #define   Data_0_time    4

  16. sbit DIN=P2^0;
  17. sbit LOAD=P2^1;
  18. sbit CLK=P2^2;
  19. sbit dout=P2^5;
  20. sbit nullio=P2^3;
  21. sbit sound =P3^2;
  22. sbit mode=P1^2;
  23. sbit set=              P1^3;

  24. uchar mode_flag;
  25. uchar  set_flag;

  26. U8  U8FLAG,k;
  27. U8  U8count,U8temp;
  28. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  29. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  30. U8  U8comdata;
  31. U8  outdata[5];  //定義發(fā)送的字節(jié)數(shù)               
  32. U8  indata[5];
  33. U8  count, count_r=0;
  34. U16 U16temp1,U16temp2;
  35. unsigned char th,tl,hh,hl;
  36. unsigned char th0,tl0,hh0,hl0;
  37. bit time_flag;
  38. uchar criterion_hum;
  39. uchar criterion_temp;

  40. void RH(void);
  41. void s_seg(uchar ,uchar ,uchar, uchar );
  42. void send(uchar ,uchar);
  43. void  COM(void);
  44. void  process(void);
  45. void Delay(U16 );
  46. void  Delay_10us(void);
  47. void key_scan(void);
  48. void winkling(void);
  49. void delayMs(unsigned int i);
  50. void special(unsigned char i);
  51. void init(void);
  52. void main(void)
  53. {
  54.   init();
  55.               while(1)
  56.               {
  57.               RH();//讀取數(shù)據(jù)
  58.               process(); //數(shù)據(jù)處理

  59.   s_seg(th,tl,hh,hl);              //顯示溫濕度

  60.   key_scan();//按鍵掃描
  61.   winkling();
  62.               criterion_temp=th0*10+tl0;
  63.               criterion_hum=hh0*10+hl0;
  64.               if ((U8T_data_H>criterion_temp)||(U8RH_data_H>criterion_hum)) sound=0;

  65.               else sound =1;
  66. //              delayMs(150);
  67.   special(180);//延時(shí)

  68.   }
  69. }

  70. void init(void)
  71. {
  72. // s_seg(0x81,0x82,0x83,4,5,6,7,8);
  73.               criterion_temp=19;
  74.               criterion_hum=50;
  75.               th0=criterion_temp/10;
  76.               tl0=criterion_temp%10;
  77.               hh0=criterion_hum/10;
  78.               hl0=criterion_hum%10;
  79. }
  80. void special(unsigned char i)
  81. {
  82.   unsigned int j;
  83.      while(i--)
  84.       {
  85.          for(j = 0; j < 125; j++);
  86.                                                         key_scan();
  87.        }
  88. }

  89. void delayMs(unsigned int i)
  90.   {
  91.      unsigned int j;
  92.      while(i--)
  93.       {
  94.          for(j = 0; j < 125; j++);
  95.      }
  96. }

  97. void key_scan(void)
  98. {
  99.                             if(!set)
  100.                             {
  101.                                           delayMs(10);//延時(shí)10ms
  102.                                                         if(!set) {              set_flag ++ ;while(!set);}
  103.                             }
  104.                             if(!mode)
  105.                                           {
  106.                                           delayMs(10);//延時(shí)10ms
  107.        if(!mode){                                          mode_flag ++ ;              while(!mode) ;}
  108. }                                          }
  109.      void  COM(void)
  110.       {
  111.                       U8 i;
  112.        for(i=0;i<8;i++)               
  113.                   {
  114.                                    U8FLAG=2;
  115.                                //----------------------
  116.                       // P2_1=0 ;  //T
  117.                       // P2_1=1 ;  //T
  118.                   //----------------------
  119.                                while((!dout)&&U8FLAG++);
  120.                                           Delay_10us();
  121.                                           Delay_10us();
  122.                             //              Delay_10us();
  123.                                             U8temp=0;
  124.                    if(dout)U8temp=1;
  125.                                 U8FLAG=2;
  126.                             while((dout)&&U8FLAG++);
  127.                   //----------------------
  128.                       //  P2_1=0 ;  //T
  129.                      //   P2_1=1 ;  //T
  130.                  //----------------------
  131.                                //超時(shí)則跳出for循環(huán)                             
  132.                                if(U8FLAG==1)break;
  133.                                //判斷數(shù)據(jù)位是0還是1            
  134.                             // 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1
  135.                                U8comdata<<=1;
  136.                                   U8comdata|=U8temp;        //0
  137.                    }//rof
  138.               }
  139. void send(uchar add,uchar dat)
  140. {              uchar ADS,i,j;
  141.                  CLK=0;
  142.               LOAD=0;
  143.               DIN=0;
  144.                  i=4;
  145.                  while(i<16)
  146.                  {     if(i<8)
  147.                               {
  148.                                             ADS=add;
  149.                             }
  150.                 else
  151.                               {
  152.                                           ADS=dat;
  153.                             }
  154.                 for(j=8;j>=1;j--)
  155.                               {
  156.                                           if((ADS&0x80)==0)
  157.                                           {              DIN=0 ;}
  158.                                           else
  159.                                           {              DIN=1;}
  160.                                               ADS=ADS<<1;
  161.                             CLK=1;
  162.                             CLK=0;            
  163.                             }
  164.                 i=i+8;
  165.    }
  166.    LOAD=1;
  167. }
  168. //void s_seg(uchar X1,uchar X2,uchar X3,uchar X4,uchar X5,uchar X6,uchar X7, uchar X8)
  169. void s_seg(uchar X5,uchar X6,uchar X7, uchar X8)
  170. { send(0x0c,0x01);//正常狀態(tài)
  171.    send(0x0b,0x07);//設(shè)置掃描范圍DIG0-7
  172.               send(0x0a,0x05);//設(shè)置亮度11/32
  173.    send(0x09,0xff);//采用譯碼方式
  174.   // send(0x01,X1);
  175.   // send(0x02,X2);
  176.   // send(0x03,X3);
  177.   // send(0x04,X4);
  178.    send(0x05,X5);
  179.    send(0x06,X6);
  180.    send(0x07,X7);
  181.    send(0x08,X8);            
  182. }
  183. void RH(void)
  184.               {
  185.                 //主機(jī)拉低18ms
  186.      dout=0;
  187.                  Delay(180);
  188.                  dout=1;
  189.               //總線由上拉電阻拉高 主機(jī)延時(shí)20us
  190.                  Delay_10us();
  191.                  Delay_10us();
  192.                  Delay_10us();
  193.                  Delay_10us();
  194.               //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號
  195.                  dout=1;
  196.               //判斷從機(jī)是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行               
  197.                  if(!dout)                            //T !               
  198.                  {
  199.                  U8FLAG=2;
  200.               //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束            
  201.                  while((!dout)&&U8FLAG++);
  202.                  U8FLAG=2;
  203.               //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
  204.                  while((dout)&&U8FLAG++);
  205.               //數(shù)據(jù)接收狀態(tài)                           
  206.                  COM();
  207.                  U8RH_data_H_temp=U8comdata;
  208.                  COM();
  209.                  U8RH_data_L_temp=U8comdata;
  210.                  COM();
  211.                  U8T_data_H_temp=U8comdata;
  212.                  COM();
  213.                  U8T_data_L_temp=U8comdata;
  214.                  COM();
  215.                  U8checkdata_temp=U8comdata;
  216.                  dout=1;
  217.               //數(shù)據(jù)校驗(yàn)
  218.               U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  219.                  if(U8temp==U8checkdata_temp)
  220.                  {
  221.                                  U8RH_data_H=U8RH_data_H_temp;
  222.                                  U8RH_data_L=U8RH_data_L_temp;
  223.                               U8T_data_H=U8T_data_H_temp;
  224.                                  U8T_data_L=U8T_data_L_temp;
  225.                                  U8checkdata=U8checkdata_temp;
  226.                  }//fi
  227.                  }//fi

  228.               }
  229. void  process(void)
  230. {
  231.                             if(U8RH_data_H==0)
  232.               {              hh=0;
  233.                 hl=0;
  234.               }
  235.               else
  236.               {
  237.                             hh=U8RH_data_H/10;
  238.                             hl=U8RH_data_H%10;
  239.               }
  240.                             if(U8T_data_H==0)
  241.               {              th=0;
  242.                 tl=0;
  243.               }
  244.               else
  245.               {
  246.                             th=U8T_data_H/10;
  247.                             tl=U8T_data_H%10;
  248.               }            
  249. }

  250.      void Delay(U16 j)
  251.     {      U8 i;
  252.                   for(;j>0;j--)
  253.                 {              
  254.                             for(i=0;i<27;i++);
  255.                 }
  256.     }

  257. void  Delay_10us(void)
  258.       {
  259.         U8 i;
  260.         i--;
  261.         i--;
  262.         i--;
  263.         i--;
  264.         i--;
  265.         i--;
  266.        }
  267. void winkling(void)
  268. {
  269. switch(mode_flag)
  270. {
  271.               case 0:break;
  272.                     
  273.               case  1:
  274.               {
  275.                             while(mode_flag==1)
  276.                                                         {
  277.                                                                      
  278.                                                                                        send(0x05,0xf);
  279.                                                                                                     special(100);
  280.                                                                                                                 if(mode_flag!=1)                                           {                send(0x05,th0);               goto XX2;                                          }

  281.                                                                                                                 if(set_flag==1)
  282.                                                                                                   {
  283.                                                                                                                               set_flag=0;
  284.                                                                                                                               th0++;
  285.                                                                                                                               if(th0>9)              th0=0;                                                        
  286.                                                                                                                 }
  287.                                                                                                                                                                                                                                              
  288.                send(0x05,th0);
  289.                                                                                                     special(100);
  290.                                                                                                     if(set_flag==1)
  291.                                                                                                   {
  292.                                                                                                                               set_flag=0;
  293.                                                                                                                               th0++;
  294.                                                                                                                               if(th0>9)              th0=0;                                                        
  295.                                                                                                                 }
  296.                                                                       }
  297.                                                         }

  298.                             case  2:
  299.               {
  300. XX2:                            while(mode_flag==2)
  301.                                                         {
  302.                send(0x06,0xf);
  303.                                                                                                     special(100);
  304.                                                                                                                 if(mode_flag!=2){    send(0x06,tl0);  goto XX3;}
  305.                                                                                                                 if(set_flag==1)
  306.                                                                                                   {
  307.                                                                                                                               set_flag=0;
  308.                                                                                                                               tl0++;
  309.                                                                                                                               if(tl0>9)tl0=0;                                                                                   
  310.                                                                                                                 }
  311.                send(0x06,tl0);
  312.                                                                                                     special(100);
  313.                                                                                                     if(set_flag==1)
  314.                                                                                                   {
  315.                                                                                                                               set_flag=0;
  316.                                                                                                                               tl0++;
  317.                                                                                                                               if(tl0>9)tl0=0;                                                                                   
  318.                                                                                                                 }
  319.                                                                       }
  320.                                                         }
  321.                             case 3:
  322. XX3:                     { while(mode_flag==3)
  323.                                                                       {
  324.                                                                                        send(0x07,0xf);
  325.                                                                                                     special(100);
  326.                                                                                                                 if(mode_flag!=3)                                                                                       { send(0x07,hh0); goto XX4;}
  327.                                                                                                                 if(set_flag==1)
  328.                                                                                                   {
  329.                                                                                                                               set_flag=0;
  330.                                                                                                                               hh0++;
  331.                                                                                                                               if(hh0>9)hh0=0;                                                                                   
  332.                                                                                                                 }
  333.                                                                                        send(0x07,hh0);
  334.                                                                                                     special(100);
  335.                                                                                                     if(set_flag==1)
  336.                                                                                                   {
  337.                                                                                                                               set_flag=0;
  338. ……………………

  339. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
http://www.torrancerestoration.com/bbs/dpj-125422-1.html


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表