標(biāo)題: 基于51單片機(jī)的DHT11溫濕度檢測控制系統(tǒng)設(shè)計資料 [打印本頁]

作者: 雨和你    時間: 2017-5-17 13:50
標(biāo)題: 基于51單片機(jī)的DHT11溫濕度檢測控制系統(tǒng)設(shè)計資料
從開始到最后都有詳細(xì)的過程

摘  要

本次設(shè)計是采用MSC-51系列單片機(jī)中的AT89S51和DHT11構(gòu)成的低成本的溫濕度的檢測控制系統(tǒng)。單片機(jī)AT89S51是一款低消耗、高性能的CMOS8位單片機(jī),由于它強(qiáng)大的功能和低價位,因此在很多領(lǐng)域都是用它。DHT11溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字輸出的溫濕度復(fù)合傳感器,傳感器包括一個電阻式感濕原件和一個NTC測溫元件,該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價比極高等優(yōu)點。設(shè)計主要包括硬件電路的設(shè)計和系統(tǒng)軟件的設(shè)計。
硬件電路主要包括單片機(jī)、溫濕度傳感器、顯示模塊、報警器以及控制設(shè)備等5部分。其中由DHT11溫濕度傳感器及1602字符型液晶模塊構(gòu)成系統(tǒng)顯示模塊;測溫濕度控制電路由溫濕度傳感器和預(yù)設(shè)溫度值比較報警電路組成;用戶根據(jù)需要預(yù)先輸入預(yù)設(shè)值,當(dāng)實際測量的溫濕度不符合預(yù)設(shè)的溫濕度標(biāo)準(zhǔn)時,發(fā)出報警信號(蜂鳴器蜂鳴),啟動相應(yīng)控制。
軟件部分包括了主程序、顯示子程序、測溫濕度子程序。   
                            目 錄

前  言

1.1本文研究的背景及意義

1.2研究現(xiàn)狀

1.3本文研究的主要內(nèi)容

第2章 設(shè)計任務(wù)分析及方案論證

2.1設(shè)計過程及其工藝要求設(shè)計

2.2設(shè)計總體方案及其論證

2.3器件選定

2.4 AT89S51單片機(jī)

2.5中斷系統(tǒng)

2.6復(fù)位電路

2.7時鐘電路

2.8顯示部分

2.9本章小結(jié)

第3章 硬件設(shè)計

3.1主控制電路和測溫時控制電路

3.2主要模塊的電路

3.3硬件實施控制

3.4設(shè)備運(yùn)行

3.5控制設(shè)備:

3.6 本章小結(jié)

第4章  軟件設(shè)計

4.1系統(tǒng)流程圖

4.2按鍵流程圖

4.3 Protues運(yùn)行結(jié)果

4.4 本章小結(jié)

結(jié) 論

參考文獻(xiàn)

附  錄


前  言1.1本文研究的背景及意義
糧庫已經(jīng)被廣泛的運(yùn)用,是存儲糧食的一個重要方式。是糧食倉庫的簡稱,是糧食倉儲企業(yè)習(xí)慣稱謂,屬于全民所有制企業(yè),是我國糧食企業(yè)的一個重要組成部分,由糧食部門統(tǒng)一管理,擔(dān)負(fù)著國家糧食儲備、地方糧食儲備、糧食流通的主渠道作用,其主要任務(wù)是完成糧食的接受、保管和調(diào)運(yùn)輸送等糧食流通諸環(huán)節(jié)。在不同季節(jié)內(nèi),尤其是不利于存儲食物的季節(jié)內(nèi)進(jìn)行的一種保護(hù)措施。
因此研究溫濕度的控制非常有必要,它可以進(jìn)一步優(yōu)化儲存控制方式,提升水平。
1.2研究現(xiàn)狀
我國地大物博,各地的自然環(huán)境條件不同,所以在不利于存儲糧食的自然環(huán)境中,具有可調(diào)節(jié)溫濕度的可控糧庫更能夠創(chuàng)造適宜存儲的條件,中國各地經(jīng)濟(jì)水平和發(fā)達(dá)水平有比較大的差異,所以研制出又具有實用價值并且采用最低的成本達(dá)到最好的效果是非常有必要的,既節(jié)約了人力親自檢查,又節(jié)約制造成本,不會對貧困地區(qū)造成經(jīng)濟(jì)負(fù)擔(dān),又避免了能源和經(jīng)濟(jì)浪費[1]。
本系統(tǒng)所要完成的任務(wù)是:

    ①人性化的設(shè)計。界限溫度值及濕度值能夠由用戶根據(jù)不同被儲存的糧食的存儲需求輸入并通過顯示器顯示,能夠?qū)崟r、準(zhǔn)確的顯示采樣溫度值與濕度值。

②通過采集溫度及濕度值,準(zhǔn)確的判斷標(biāo)準(zhǔn)值與當(dāng)前值之間的差異,看是否符合標(biāo)準(zhǔn)值,及時的啟動報警裝置(包括警報燈的提示功能以及蜂鳴等)進(jìn)行報警,并采取相應(yīng)控制溫濕度的方案。

1.3本文研究的主要內(nèi)容
一、首先我們必須了解溫濕度控制對儲存糧食的重要性,其次我們才能夠?qū)Υ俗鞒龈玫呐袛啵郧蟾玫慕鉀Q用戶所需要的問題。
二、溫濕度的監(jiān)測和控制是我們研究的主要內(nèi)容。數(shù)字化溫濕度檢測的方法為一旦環(huán)境中的溫濕度發(fā)生變化時,濕度傳溫度感器和濕度傳感器隨著溫濕度的變化而變化,然后將變化的電阻通過轉(zhuǎn)換電路和轉(zhuǎn)換信號檢測為與之對應(yīng)變化的電壓,然后把模擬電壓信號由A/D轉(zhuǎn)換器轉(zhuǎn)換為數(shù)字信號并送入到單片機(jī)中,對采集到的信號單片機(jī)進(jìn)行濾波處理并通過查表得到實際測量的濕度值,之后通過單片機(jī)的各外部接口電路顯示該溫濕度值。
三、該系統(tǒng)通過按鈕設(shè)定最適宜的溫度和濕度,傳感器向中央控制系統(tǒng)輸送監(jiān)控信號,超過預(yù)設(shè)值的話,蜂鳴器就會報警提醒,控制溫、濕度的設(shè)備即可作出調(diào)整,回到正常范圍內(nèi),系統(tǒng)正常運(yùn)行。
四、根據(jù)各種不同糧食的適宜溫度進(jìn)行溫室溫度調(diào)節(jié),若低于下限溫度則采取升溫措施,通常采取電熱增溫和火力增溫等,電熱增溫比較方便。若高于上限溫度則采取降溫措施,通常通過水管降溫和風(fēng)扇降溫,風(fēng)扇降溫比較方便;為滿足糧庫不同種類糧食對濕度的要求,可以在地上、臺階、盆壁灑水,還可以在空中懸掛濕布,以增加水分的蒸發(fā),最好的辦法是設(shè)置自動噴霧裝置,自動調(diào)節(jié)濕度。如果濕度過大,容易導(dǎo)致植被過于潮濕,發(fā)生腐爛,可采用烘干技術(shù),加快水分流失,保持被存儲糧食的干燥。為滿足對于不同糧食的儲存方式和需求,我們可以隨時對溫、濕度進(jìn)行調(diào)節(jié),對于不利情況能夠及時的作出顯示,并能夠采取相應(yīng)的措施提醒用戶進(jìn)行調(diào)整,以達(dá)到最適宜的溫濕度。


第2章 設(shè)計任務(wù)分析及方案論證
本章詳細(xì)介紹了本次設(shè)計的主要任務(wù),以及對于所要實現(xiàn)的內(nèi)容加以分析,同時詳細(xì)的介紹了主要元器件的選擇,以及各自的特性。
2.1設(shè)計過程及其工藝要求設(shè)計
一個以單片機(jī)為核心的溫濕度控制系統(tǒng),需要實現(xiàn)的功能為:
   ①能夠準(zhǔn)確的顯示當(dāng)前的溫度以及濕度。溫度檢測的范圍0℃-60℃,測溫精度:±2℃;濕度檢測范圍20%-100%RH,  測濕精度:±5%RH。
   ②能夠自主調(diào)節(jié)當(dāng)前需要溫度以及濕度的預(yù)設(shè)溫濕度值,在系統(tǒng)上面有調(diào)節(jié)按鈕,可隨時根據(jù)需要增加或者減少預(yù)設(shè)值。
   ③一旦發(fā)現(xiàn)超過了預(yù)設(shè)值,蜂鳴器蜂鳴報警,控制設(shè)備立即啟動,立即調(diào)控溫濕度。
   ④報警方式為三極管驅(qū)動的蜂鳴音報警。
   ⑤系統(tǒng)的顯示方式均為四位顯示,采用LCD顯示。
2.2設(shè)計總體方案及其論證2.2.1設(shè)計總體方案及其論證
本設(shè)計要實現(xiàn)的功能是:實時顯示當(dāng)前環(huán)境的溫濕度,并且允許用戶設(shè)定溫濕度標(biāo)準(zhǔn)值,當(dāng)環(huán)境溫濕度超過或低于標(biāo)準(zhǔn)值時,系統(tǒng)會以蜂鳴器鳴響的方式進(jìn)行報警提示,并且控制設(shè)備自啟動,待達(dá)到標(biāo)準(zhǔn)值時,蜂鳴器停止鳴響,控制設(shè)備停止運(yùn)行,系統(tǒng)正常工作,工作指示燈亮。
   (1)溫度監(jiān)控:對溫室溫度進(jìn)行測量和控制并反映在顯示器上。

(2)濕度監(jiān)控:對溫室濕度進(jìn)行測量和控制反映在顯示器上。

(3)顯    示:LCD就地顯示此時此刻溫濕度值,擺放在生產(chǎn)現(xiàn)場用于顯示當(dāng)前的溫濕度。

依據(jù)功能設(shè)定,本系統(tǒng)主要分為以下三個模塊:
              (1)溫濕度采集模塊
              (2)數(shù)據(jù)處理模塊
              (3)用戶交互模塊
              其中溫濕度采集模塊使用的是DHT11數(shù)字溫濕度傳感器,它使用單總線方式,接口簡單,而且無需另外校準(zhǔn)。分辨率為8bit,完全能夠滿足日常環(huán)境溫濕度的檢測要求。
              數(shù)據(jù)處理模塊使用的是AT89S51單片機(jī),其完成溫濕度數(shù)據(jù)的采集、運(yùn)算和邏輯控制的功能。
              用戶交互模塊主要由按鍵、1602點陣液晶、蜂鳴器和控制器構(gòu)成。其中按鍵用于用戶設(shè)定溫濕度準(zhǔn)確值,1602用于數(shù)據(jù)顯示,蜂鳴器用于提示用戶,控制器用于調(diào)節(jié)控制不符合要求的溫、濕度。按照系統(tǒng)的設(shè)計功能所要求的,溫濕度監(jiān)控系統(tǒng)原理圖如下圖2.2.1所示:(在附件中)


圖2-2-1 溫濕度監(jiān)控系統(tǒng)原理圖


單片機(jī)作為主控制器,主要負(fù)責(zé)處理由溫濕度傳感器送來數(shù)據(jù),并把處理好的數(shù)據(jù)送向顯示器模塊,數(shù)據(jù)溫濕度傳感器主要用來采集周圍的環(huán)境參數(shù),并把所采集到得數(shù)據(jù)送向單片機(jī),按鍵電路主要是用來完成單片機(jī)的復(fù)位操作和溫濕度初始值的設(shè)定。蜂鳴器電路就是用三極管來實現(xiàn)的,用來判斷周圍的溫度或者濕度是否超出設(shè)定數(shù)值,控制設(shè)備等候指令,當(dāng)蜂鳴器響起,溫、濕度不在標(biāo)準(zhǔn)范圍內(nèi),控制設(shè)備自行啟動,直到溫、濕度正常,顯示電路主要用來顯示當(dāng)前的溫濕度[10]。
2.3器件選定
將單片機(jī)用作測控系統(tǒng)時,總要有被測信號輸入通道,由計算機(jī)拾取必要的輸入信息。對于測量系統(tǒng)而言,其核心任務(wù)是怎么樣獲得準(zhǔn)確的被測信號;而對測控系統(tǒng)來說,不可缺少的環(huán)節(jié)是對條件的監(jiān)測和對被控對象狀態(tài)的測試,傳感器是實現(xiàn)測量與控制的第一環(huán)節(jié),是測控系統(tǒng)的關(guān)鍵部分,一切準(zhǔn)確的測量和控制都將在傳感器對于原始信號的準(zhǔn)確可靠的轉(zhuǎn)換和捕捉,工業(yè)生產(chǎn)過程的自動化測量和控制,基本主要依賴各種傳感器來控制和檢測生產(chǎn)過程中的各種量,使系統(tǒng)和設(shè)備在最佳狀態(tài)正常運(yùn)行,從而保證生產(chǎn)的高質(zhì)量和高效率 [6]。
2.3.1測量部分:溫濕度傳感器
DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器,它應(yīng)用專用的溫濕度傳感和數(shù)字模塊采集技術(shù),具有很高的穩(wěn)定性和可靠性,DHT11傳感器內(nèi)含一個NTC測溫和一個電阻式感濕元件,并與一個8位的高性能單片機(jī)相連接,在精確的濕度校驗室中DHT11傳感器進(jìn)行過校準(zhǔn),以程序的形式校準(zhǔn)系數(shù)儲存在0TP內(nèi)存中,檢測信號的時候,在處理過程中傳感器內(nèi)部要調(diào)用這些校準(zhǔn)系數(shù),采用單線制的串行接口[13],使系統(tǒng)集成可以有較低的功耗,而且更加簡單快速,信號傳輸距離超過20米,作為一個數(shù)字溫濕度傳感器DHT11具有響應(yīng)快速、抗干擾強(qiáng)、性價比高等優(yōu)點,它的性能指標(biāo)如下:濕度測量范圍為20%~90%RH;濕度測量精度為±5%RH;溫度測量范圍為0~50 ℃,溫度測量精度為±2℃,工作電壓3.0~5.5 V,相應(yīng)時間<5S,DHT1l采用4針單排引腳封裝, 傳感器通電后,需要等待1s,這是因為要越過不穩(wěn)定的狀態(tài),在此期間不需發(fā)送指令,電源引腳(VDD,GND)之間可增加一個100nF 的電容,用以去耦濾波[7]。

圖2-3-1典型的應(yīng)用電路

電源引腳
四條引角中有兩條是電源引腳,有兩條是輸出數(shù)據(jù)的引腳,你只需要給他供上額定電壓,然后再他的輸出引腳采集信號就可以了,輸出信號如果是模擬量的話,通過A/D芯片,將模擬量轉(zhuǎn)換為數(shù)字信號,然后傳送給單片機(jī)。DHT11是數(shù)字傳感器,所以不需要進(jìn)行模數(shù)的轉(zhuǎn)換。

圖2-3-1  DHT11實物圖

(1)DHT11溫濕度傳感器產(chǎn)品參數(shù):
相對濕度
分 辨 率:16Bit
重 復(fù) 性:±1%RH
精    度:25°C  ±5%RH
互 換 性:可完全互換
響應(yīng)時間:1/e(63%)25°C   6s
          1m/s 空氣 6s
遲    滯:<±0.3%RH
長期穩(wěn)定性:<±0.5%RH/yr

溫度
分 辨 率:16Bit
重 復(fù) 性:±0.2°C
量程范圍:25°C  ±2°C
響應(yīng)時間:1/e(63%)  10s

電氣特征
供    電:DC 3.5-5.5V
供電電流:測量0.3mA  待機(jī)60μA
采樣周期:次  大于2秒

引腳說明
(1)VDD  供電3.5-5.5V
(2)DATA 串行數(shù)據(jù),單總線
(3)NC 空腳
(4)GND 接地,電源負(fù)極
2.3.2串行接口(單線雙向)
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明,當(dāng)前小數(shù)部分用于以后擴(kuò)展,現(xiàn)讀出為零.操作流程如下:一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗和。
數(shù)據(jù)傳送正確時校驗和數(shù)據(jù)等于“8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)”所得結(jié)果的末8位。
用戶MCU發(fā)送一次開始信號后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機(jī)開始信號結(jié)束后,DHT11發(fā)送響應(yīng)信號,送出40bit的數(shù)據(jù),并觸發(fā)一次信號采集,用戶可選擇讀取部分?jǐn)?shù)據(jù).如果沒有接收到主機(jī)發(fā)送開始信號,DHT11不會主動進(jìn)行溫濕度采集.采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。
    總線空閑狀態(tài)為高電平的時候主機(jī)把總線拉低等待DHT11響應(yīng), DHT11能檢測到起始信號,主機(jī)必須把總線拉低,至少大于18ms。DHT11一旦接收到主機(jī)的開始信號,接著就等待開始信號的結(jié)束,然后發(fā)送80us的低電平響應(yīng)信號,要讀取DHT11的響應(yīng)信號,必須等待開始信號的結(jié)束,并延時等待20-40us后才能夠接受,主機(jī)發(fā)送開始信號后,這時候就可輸出高電平或切換到輸入模式,接著總線由上拉電阻拉高。
DHT11發(fā)送響應(yīng)信號的時候總線為低電平 ,DHT11把總線拉高80us之前,必須等到響應(yīng)信號發(fā)送,準(zhǔn)備發(fā)送數(shù)據(jù)時,每一bit數(shù)據(jù)都以50us低電平時隙開始,數(shù)據(jù)位是0或1是由高電平的長或短來決定。假如響應(yīng)信號的讀取為高電平,但是DHT11無響應(yīng)響應(yīng),這時候說明路線可能連接不正常,當(dāng)最后一bit數(shù)據(jù)傳送結(jié)束后,DHT11把總線拉低50us,接著總線由上拉電阻拉高進(jìn)入空閑狀態(tài)。
2.3.3電氣特性
VDD=5V,T = 25℃
圖2-3-3電氣特性(注:采樣周期間隔不得低于1秒鐘)

參數(shù)

條件

min

typ

max

單位

供電

DC

3

5

5.5

V

供電電流

測量

0.5


2.5

Ma

平均

0.2


1

Ma

待機(jī)

100


150

Ua

采樣周期

1




               

2.3.4性能說明

  

表2-3-4 性能說明

參數(shù)

條件

Min

Typ

Max

單位

分辨率


8

±

Bit

1

1

1

%RH

精度

25℃


±4


%RH

重復(fù)性



±1


%RH

溫度

0-50℃



±5

%RH

溫度


量程范圍

0℃

30


90

%RH

50℃

20


80

%RH

25℃

20


90

%RH

長期穩(wěn)定性

典型值


±1


%RH/yr

遲滯



±1


互換性

可完全互換

分辨率


8

8

8

Bit

1

1

1

重復(fù)性


±1


響應(yīng)時間

1/e(63%)

6


30

S

量程范圍


0


50

精度


±1


±2

2.3.5引腳說明

表2.3.5 DHT11引腳說明

pin

名稱

注釋

1

VDD

供電3-5.5V

2

DATA

串行數(shù)據(jù),單總線

3

NC

空腳,懸空

4

GND

接地,電源負(fù)極


注意 引腳2在接單片機(jī)時,同時要在數(shù)據(jù)線接一上拉電阻,接到電源上[4]。
2.3.6應(yīng)用信息
電阻式溫、濕度傳感器暴露在化學(xué)物質(zhì)中會受到干擾,導(dǎo)致靈敏度下降,當(dāng)處于極限狀態(tài)時,傳感器可以通過程序處理,回復(fù)到初試的校準(zhǔn)狀態(tài),在不符合規(guī)范的范圍內(nèi)使用傳感器,不僅會導(dǎo)致幾乎3%的臨時漂移信號,而且會加速產(chǎn)品的老化,轉(zhuǎn)為正常的使用范圍后,會漸漸恢復(fù)校準(zhǔn)狀態(tài);溫度是影響氣體相對濕度的關(guān)鍵,因此測量時最好讓濕度傳感器工作溫度相同[5]。
2.3.7 封裝信息

圖2-3-6 DHT11的封裝信息

2.4 AT89S51單片機(jī)2.4.1單片機(jī)介紹
AT89S51是美國ATMEL公司生產(chǎn)的低功耗、高性能CMOS 的8位單片機(jī),片內(nèi)含4K的可編程的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)8051指令系統(tǒng)及引腳。它集Flash程序存儲器既可在線編程(ISP),也可用傳統(tǒng)方法進(jìn)行編程及通用8位微處理器于單片機(jī)芯片中,低價位AT89S51單片機(jī)可為您提供許多高性價比的應(yīng)用場合,可靈活應(yīng)用于各種控制的領(lǐng)域【8】。AT89S51提供以下的功能標(biāo)準(zhǔn):4K字節(jié)閃爍存儲器,128字節(jié)隨機(jī)存取數(shù)據(jù)存儲器,2個16位定時/計數(shù)器,32個I/O口, 1個串行通信口,1個5向量兩級中斷結(jié)構(gòu),另外,AT89S51還可以進(jìn)行0HZ的靜態(tài)邏輯操作,并支持兩種軟件的節(jié)電模式,閑散方式停止中央處理器的工作,可允許隨機(jī)存取數(shù)據(jù)存儲器、定時/計數(shù)器、串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存隨機(jī)存取數(shù)據(jù)存儲器中的內(nèi)容,但震蕩器停止工作并禁止其它所有部件的工作直到下一個復(fù)位,在AT89C51上新增加的功能使AT89S51性能有了較大提升,它的價格甚至更低,它的工作頻率可達(dá)33MHz,比AT89C51的工作頻率更高,ISP在線編程功能的優(yōu)越性在于它不必要將芯片從工作狀態(tài)下分離,特別是在改寫存儲器內(nèi)的程序,這是一個相當(dāng)方便簡單的功能,它不需要像AT89C51那樣外接看門狗計時器單元電路,由于它內(nèi)部具有雙工UART串行通道內(nèi)部集成看門狗計時器,它具有全新的加密算法,大大加強(qiáng)的程序的保密性,有效的保護(hù)知識產(chǎn)權(quán)不被侵犯,它完全兼容51全部字系列產(chǎn)品[8]。

圖2-5-1  AT89S51引腳圖

2.4.2引腳說明:
VCC:電源電壓輸入端。
GND:電源地

P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的低八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗時,P0輸出原碼,此時P0外部必須被拉高。P0口在訪問外部存儲器時,P0口既是一個真正的雙向數(shù)據(jù)總線口,又是輸出8位地址口。它包括一個輸出鎖存器,兩個三態(tài)緩沖器,一個輸出驅(qū)動電路和一個輸出控制電路

P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入”1”后,被內(nèi)部上拉為高電平,可用作輸入。P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。專門為用戶使用的I/O口,是準(zhǔn)雙向口,P1口為8位準(zhǔn)雙向口,每一位均可單獨定義為輸入或輸出口。在編程校驗期間,用做輸入低位字節(jié)地址。P1口可以驅(qū)動4個TTL負(fù)載。
P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進(jìn)行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。
P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流,這是由于上拉的緣故。P2口也是雙向口。它是供系統(tǒng)擴(kuò)展時輸出高8位地址。如果沒有系統(tǒng)擴(kuò)展時,也可以作為用戶的I/O口使用。P2口作為外部數(shù)據(jù)存儲器或程序存儲器的地址總線的高8位輸出口AB8-AB15,P0口由ALE選通作為地址總線的低8位輸出口AB0-AB7。外部的程序存儲器由PSEN信號選通,數(shù)據(jù)存儲器則由WR和RD讀寫信號選通,因為2=64k,所以AT89S51最大可外接64kB的程序存儲器和數(shù)據(jù)存儲器。P3口除了作為普通I/O口,還有第二功能:





表2-5-2 P3口的第二功能

端口引腳

功能特性

P3.0

串行輸入口(RXD)

P3.1

串行輸出口(TXD)

P3.2

外中斷0(INTO)

P3.3

外中斷1(INT1)

P3.4

定時/計數(shù)器0的外部輸入口(T0)

P3.5

定時/計數(shù)器1的外部輸入口(T1)

P3.6

外部數(shù)據(jù)存儲器寫選通(WR)

P3.7

外部數(shù)據(jù)存儲器讀選通(RD)

    RST:復(fù)位輸入端,高電平有效。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機(jī)器周期的高電平時間。
ALE/PROG:地址鎖存允許/編程脈沖信號端。當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的低位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。
PSEN:外部程序存儲器的選通信號,低電平有效。在由外部程序存儲器取指期間,每個機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。
EA/VPP:外部程序存儲器訪問允許。注意加密方式1時,EA將內(nèi)部鎖定為RESET;當(dāng)EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。
XTAL1:片內(nèi)振蕩器反相放大器和時鐘發(fā)生器的輸入端。
XTAL2:片內(nèi)振蕩器反相放大器的輸出端。

現(xiàn)在已經(jīng)對四個8位雙向并行I/O口有了初步的了解。根據(jù)以上的內(nèi)容可知只有P1口是標(biāo)準(zhǔn)的I/O口,所以我們選用P1口作為數(shù)據(jù)端口,P1口可逐位分別定義各口線為輸入或輸出線[7]。

2.4.3單片機(jī)最小系統(tǒng)
所謂單片機(jī)的最小系統(tǒng)是指使單片機(jī)能運(yùn)行程序、正常工作的最簡單電路系統(tǒng),是保證單片正常啟動、開始工作的必須電路,缺一不可。單片機(jī)最小系統(tǒng)一般由單片機(jī)、程序存儲器、時鐘電路和復(fù)位電路組成。對于AT89S51單片機(jī),由于片內(nèi)有4K的程序存儲器,所以其最小系統(tǒng)除了單片機(jī)本身外,只需外接時鐘電路與復(fù)位電路即可。
2.4.4主要性能特點和優(yōu)越性
(1)4k Bytes Flash片內(nèi)程序存儲器;
(2)128 bytes的隨機(jī)存取數(shù)據(jù)存儲器(RAM);
(3)32個外部雙向輸入/輸出(I/O)口;
(4)5個中斷優(yōu)先級、2層中斷嵌套中斷;
(5)6個中斷源;
(6)2個16位可編程定時器/計數(shù)器;
(7)2個全雙工串行通信口;
(8)看門狗(WDT)電路;
(9)片內(nèi)振蕩器和時鐘電路;
(10)與MCS-51兼容;
(11)全靜態(tài)工作:0Hz-33MHz;
(12)三級程序存儲器保密鎖定;
(13)可編程串行通道;
(14)低功耗的閑置和掉電模式。
2.5中斷系統(tǒng)2.5.1中斷

    程序執(zhí)行過程中,允許外部或內(nèi)部事件通過硬件打斷程序的執(zhí)行,使其轉(zhuǎn)向為處理內(nèi)部事件的中斷服務(wù)程序中去;完成中斷服務(wù)的程序后,CPU繼續(xù)原來被打斷的程序,這樣的過程稱為中斷過程。

2.5.2產(chǎn)生中斷

能產(chǎn)生中斷的外部和內(nèi)部事件。AT89S51有5個中斷源:

(1)INT0:外部中斷0請求,低電平有效。通過P3.2引腳輸入。
(2)INT1:外部中斷1請求,低電平有效。通過P3.3引腳輸入。
(3)T0:定時器/計數(shù)器0溢出中斷請求。
(4)TI:定時器/計數(shù)器1溢出中斷請求。
(5)TXD/RXD:串行口中斷請求。當(dāng)串行口完成一幀數(shù)據(jù)的發(fā)送或接收時,便請求中斷。每一個中斷源都對應(yīng)一個中斷請求標(biāo)志位,它們設(shè)置在特殊功能寄存器TCON和SCON中。當(dāng)這些中斷源請求中斷時,相應(yīng)的標(biāo)志分別有TCON和SCON中的相應(yīng)位來鎖存。
2.5.3中斷系統(tǒng)有以下4個特殊功能寄存器
(1)定時器控制寄存器TCON(用6位);
(2)串行口控制寄存器SCON(用2位);
(3)中斷允許寄存器IE;
(4)中斷優(yōu)先級寄存器IP。
    其中,TCON和SCON只有一部分用于中斷控制。通過對以上各特殊功能寄存器的各位進(jìn)行置位或復(fù)位等操作,可實現(xiàn)各種中斷控制功能。
2.6復(fù)位電路

    復(fù)位是單片機(jī)的初始化操作。其主要功能是把PC初始化為000H,使單片機(jī)從0000H單元開始執(zhí)行程序。除了進(jìn)入系統(tǒng)的正常初始化之外,當(dāng)由于程序運(yùn)行出錯或操作錯誤使系統(tǒng)處于死鎖狀態(tài)時,為擺脫困境,也需按復(fù)位鍵重新啟動。

除PC之外,復(fù)位操作還對其他一些寄存器有影響,它們的復(fù)位狀態(tài)如下圖所示.
表2-8 復(fù)位操作對寄存器的影響
寄存器
復(fù)位狀態(tài)
  寄存器
復(fù)位狀態(tài)
PC
0000H
TCON
00H
ACC
00H
TL0
00H
PSW
00H
THO
00H
SP
07H
TL1
00H
DPTR
0000H
TH1
00H
P0-P3
FFH
SCON
00H
IP
XX000000B
SBUF
不定
IE
0X000000B
PCON
OXXXOOOOB
TMOD
OOH





    為確保微機(jī)系統(tǒng)中電路穩(wěn)定可靠工作,復(fù)位電路是必不可少的一部分,一般微機(jī)電路正常工作需要供電電源為5V±5%,即4.75~5.25V。由于微機(jī)電路是時序數(shù)字電路,它需要穩(wěn)定的時鐘信號,因此在電源上電時,只有當(dāng)VCC超過4.75V低于5.25V以及晶體振蕩器穩(wěn)定工作時,復(fù)位信號才被撤除,微機(jī)電路開始正常工作。單片機(jī)的復(fù)位分為上電自動復(fù)位、按鍵手動復(fù)位兩種和看門狗強(qiáng)制復(fù)位三種等。上電復(fù)位通常利用電容的充放電來實現(xiàn),按鍵復(fù)位則可分為按鍵脈沖復(fù)位和按鍵電平復(fù)位兩種,看門狗復(fù)位則通過外接看門狗電路或軟件看門狗程序?qū)崿F(xiàn)。常見的有上電復(fù)位和按鍵復(fù)位電路。
2.7時鐘電路
時鐘電路可以簡單定義如下:1.就是產(chǎn)生象時鐘一樣準(zhǔn)確的振蕩電路;2.任何工作都按時間順序。用于產(chǎn)生這個時間的電路就是時鐘電路。時鐘電路一般由晶體震蕩器、晶震控制芯片和電容組成。時鐘電路應(yīng)用十分廣泛,如電腦的時鐘電路、電子表的時鐘電路以及MP3、MP4的時鐘電路。
時鐘電路用于產(chǎn)生單片機(jī)的基本時鐘信號,是用來配合外部晶體實現(xiàn)振蕩的電路,這樣可以為單片機(jī)提供運(yùn)行時鐘,如果運(yùn)行時鐘為0 的話,單片機(jī)就不工作,當(dāng)然超出單片機(jī)的工作頻率的時鐘也會導(dǎo)致單片機(jī)不工作。時鐘電路是微型計算機(jī)的心臟,它控制著計算機(jī)的工作節(jié)奏,CPU就是通過復(fù)雜的時序電路完成不同的指令功能的。MCS-51的時鐘信號可以由兩種方式:一種是內(nèi)部方式,利用芯片內(nèi)部的振蕩電路,產(chǎn)生時鐘信號:另一種為外部方式,時鐘信號由外部引入。如果沒有時鐘電路來產(chǎn)生時鐘驅(qū)動單片機(jī),單片機(jī)是無法工作的[12]。AT89S51的時鐘信號可由內(nèi)部振蕩器產(chǎn)生,也可由外部電路直接提供。
內(nèi)部振蕩器的輸入和輸出腳分別為XTAL1和XATL2,由XTAL2給單片機(jī)內(nèi)部電路提供時鐘信號。當(dāng)時鐘信號由外部電路提供時,外部時鐘引入XTAL2,而XTAL1腳接地。
2.8顯示部分:LCD
顯示部分是LCD1602液晶顯示,

圖2-8 正常工作LCD1602顯示

2.8.1 LCD1602液晶簡介
LCD1602分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的               比不帶背光的厚,是否帶背光在應(yīng)用中并無差別,兩者尺寸差別如圖2-9所示。

圖2-8-1 LCD1602規(guī)格

字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號等點陣式LCD,目前常用16*1,16*2,20*2和40*2行等的模塊
2.8.2 LCD1602主要技術(shù)參數(shù)
表2-8-2 1602的主要技術(shù)參數(shù)
工作電壓:
4.5—5.5V
容量
16×2個字符
最佳工作電壓
5.0V
工作電流
2.0mA
字符尺寸
2.95×4.35(W×H)mm


2.8.3引腳功能說明
1602液晶模塊的讀寫操作,屏幕和光標(biāo)的操作都是通過指令編程來實現(xiàn)的。

表2-8-3 引腳接口說明表

LCD1602采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表編號

符號

引腳說明

1

VDD

正極

2

VSS

3

VL

液晶顯示偏壓

4

RS

寄存器選擇

5

R/W

讀/寫選擇

6

EN

使能信號

7

D0

數(shù)據(jù)

8

D1

數(shù)據(jù)

9

D2

數(shù)據(jù)

10

D3

數(shù)據(jù)

11

D4

數(shù)據(jù)

12

D5

數(shù)據(jù)

13

D6

數(shù)據(jù)

14

D7

數(shù)據(jù)

15

BLA

背光源正極

16

BLK

背光源負(fù)極




圖2-8-3  LCD1602的管腳圖



圖2-8-3 1602字符型液晶顯示器實物圖

2.8.4  LCD1602的RAM地址映射及標(biāo)準(zhǔn)字庫表
液晶顯示模塊是一個比較慢的顯示器件,因此在執(zhí)行指令之前要首先確認(rèn)模塊的忙標(biāo)志處于低電平,表示空閑,不然此指令失效,輸入顯示字符地址后會顯示字符,圖是1602的內(nèi)部顯示地址。


圖2-8-4 1602LCD內(nèi)部顯示地址
2.8.5指令說明
LCD1602液晶模塊內(nèi)部的控制器控制指令:
指令功能
                       指令編碼


執(zhí)行時間/ms

清屏
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2

DB1

DB0

1.64

  0
0
0
0
0
0
0
0

0

1

功能:
①清除液晶顯示器,即將DDRAM的內(nèi)容全部填入“空白”的ASCII碼20H;
②光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方;
③將地址計數(shù)器(AC)的值設(shè)為0.
指令功能
                       指令編碼


執(zhí)行時間/ms

光標(biāo)歸位
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2

DB1

DB0

1.64

  0
0
0
0
0
0
0
0

1

X


功能:
①把光標(biāo)撤回到顯示器的左上方;
②把地址計數(shù)器(AC)的值設(shè)置為0;
③保持DDRAM的內(nèi)容不變
(3)進(jìn)入模式設(shè)置指令
指令功能
                       指令編碼


執(zhí)行時間/us

進(jìn)入模式設(shè)置
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2

DB1

DB0

40

  0
0
0
0
0
0
0
I

I/D

S

功能:
設(shè)定每次定入1位數(shù)據(jù)后光標(biāo)的以為方向,并且設(shè)定每次寫入的一個字符是否移動。參數(shù)設(shè)定的情況如下所示:
位名         設(shè)置
I/D          0=寫入新數(shù)據(jù)后光標(biāo)左移      1=寫入新數(shù)據(jù)后光標(biāo)右移
S            0=寫入新數(shù)據(jù)后顯示屏不移動  1=寫入新數(shù)據(jù)后顯示屏整體右移一個字符
(4)顯示開關(guān)指令控制

指令功能

                       指令編碼


執(zhí)行時間/us

顯示開關(guān)控制

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

40

  0

0

0

0

0

0

1

D

C

B

功能:
控制顯示器開/關(guān)、光標(biāo)顯示/關(guān)閉以及光標(biāo)是否閃爍,參數(shù)設(shè)定的情況如下:
位名         設(shè)置
D             0=顯示功能關(guān)    1=顯示功能開
C             0=無光標(biāo)        1=有光標(biāo)
B             0=光標(biāo)閃爍      1=光標(biāo)不閃爍

指令功能

                       指令編碼


執(zhí)行時間/us

設(shè)定顯示屏或光標(biāo)移動方向

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

40

  0

0

0

0

0

1

S/C

R/L

X

X

功能:使光標(biāo)移位或使整個顯示屏幕移位。參數(shù)設(shè)定的情況如下:
S/C        R/L       設(shè)定情況
0           0        光標(biāo)左移1格,且AC值減1
0           1        光標(biāo)右移1格,且AC值加1
1           0        顯示器上字符全部左移1格,但光標(biāo)不動
1           1        顯示器上字符全部右移1格,但光標(biāo)不動
(6)功能設(shè)定指令

指令功能

                       指令編碼


執(zhí)行時間/us

功能設(shè)定

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

40

  0

0

0

0

1

DL

N

F

X

X

功能:設(shè)定數(shù)據(jù)總線為數(shù)、顯示的行數(shù)及字型。
參數(shù)設(shè)定的情況如下:
位名             設(shè)置
DL               0=數(shù)據(jù)總線為4位       1=數(shù)據(jù)總線為8位
N                0=顯示1行             1=顯示2行
F                0=5×7點陣/每字符      1=5×10點陣/每字符
(7)設(shè)定CGRAM地址指令

指令功能

                       指令編碼


執(zhí)行時間/us

設(shè)定CGRAM地址

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

40

  0

0

0

1

       CRGAM的地址(6位)

功能:設(shè)定下一個要存入數(shù)據(jù)的CGRAM的地址。
DB5 DB4 DB3為字符號,也就是將來要顯示該字符時要用到的字符地址(000-111)(能定義8個字符)
DB2 DB1 DB0為行號。(000-111)(八行)


指令功能

                       指令編碼


執(zhí)行時間/us

設(shè)定DDRAM地址

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

40

  0

0

  1

DDRAM的地址(7位)

功能:設(shè)定下一個要存入數(shù)據(jù)的DDRAM的地址
(9)讀取忙信號或AC地址指令

指令功能

                       指令編碼


執(zhí)行時間/us

讀取忙碌信號或AC地址

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

40

  0

1

FB

              AC內(nèi)容(7位)

功能:
①讀取忙碌信號BF的內(nèi)容,BF=1表示液晶顯示器忙,暫時無法接受單片機(jī)送來的數(shù)據(jù)或指令;當(dāng)BF=0時,液晶顯示器一接受單片機(jī)送來的數(shù)據(jù)或指令
(10)數(shù)據(jù)寫入DDRAM或CGRAM指令一覽

指令功能

                       指令編碼


執(zhí)行時間/us

數(shù)據(jù)寫入到DDRAM或CGRAM

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

40

1

0

要寫入的數(shù)據(jù)D7-D0

功能:
①將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對應(yīng)的字符
②將使用著自己設(shè)計的圖形存入CGRAM
     DB7 DB6 DB5可為任何數(shù)據(jù),一般取“000”
  DB4 DB3 DB2 DB1 DB0對應(yīng)于每行5點的字模數(shù)據(jù)

指令功能

                       指令編碼


執(zhí)行時間/us

從CGRAM或DDRAM讀出數(shù)據(jù)

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

40

  1

1

           要讀出的數(shù)據(jù)D7-D0

功能:讀取DDRAM或CGRAMD中的內(nèi)容
基本操作時序:
讀狀態(tài)    輸入:RS=L,RW=H,E=H      輸出:DB0-DB7=狀態(tài)字
寫指令    輸入:RS=L,RW=L,E=下降沿脈沖  DB0-DB7=指令碼  輸出:無
讀數(shù)據(jù)    輸入:RS=H,RW=H E=H        輸出:DB0-DB7=數(shù)據(jù)
寫數(shù)據(jù)    輸入:RS=H,RW=L,E=下降沿脈沖  DB0-DB7=數(shù)據(jù)    輸出:無
2.8.6顯示設(shè)置
DDRAM是顯示數(shù)據(jù)RAM,用來寄存帶顯示的字符代碼,共80個字節(jié)。


顯示位置

1

2

    3

4

5

6

7

.......

40

DDRAM

地址

第一行

00H

01H

02H

03H

04H

05H

06H

......

27H

第二行

40H

41H

42H

43H

44H

45H

46H

......

67H

表2-8-6 地址和屏幕的對應(yīng)關(guān)系

    想要在LCD1602屏幕的第一行第一列顯示一個“A”字,就要向DDRAM的00H地址寫入“A”字的代碼就行了。具體的寫入是要按LCD模塊的指令格式來進(jìn)行的。在1602中用到16個即可。

第二行也一樣用到前16個地址。

表2-8-6 對應(yīng)關(guān)系

00H

01H

02H

03H

04H

05H

06H

07H

08H

09H

0AH

0BH

0CH

0DH

0EH

0FH

40H

41H

42H

43H

44H

45H

46H

47H

48H

49H

4AH

4BH

4CH

4DH

4EH

4FH

               

在PC上我們只要打開文本文件就能在屏幕上看到對應(yīng)的字符是因為在操作系統(tǒng)里和BIOS里都固化有字符字模。字模代表了是在點陣屏幕上點亮和熄滅的信息數(shù)據(jù)。例如“A”字的字模:

  01110          ○■■■○

  10001          ■○○○■

  10001          ■○○○■

10001          ■○○○■

11111          ■■■■■

10001          ■○○○■

10001          ■○○○■

上圖左邊的數(shù)據(jù)就是字模數(shù)據(jù),右邊就是將左邊數(shù)據(jù)用“○”代表0,用“■”代表1。

想要在LCD1602屏幕的第一行第一列顯示一個“A”字,就要向DDRAM的00H地址寫入“A”字的代碼41H即可。在LCD模塊上也固化了字模存儲器,這就是CGROM和CGRAM HD44780內(nèi)置了192個常用字符的字模,存于字符產(chǎn)生器CFROM Character Generator ROM中,另外還有8個允許用戶自定義的字符產(chǎn)生RAM,稱為CGRAM Character Generator RAM。

2.9本章小結(jié)
本章節(jié)主要有兩部分,第一部分主要介紹了溫濕度實時監(jiān)測和控制的意義,第二部分主要介紹了設(shè)計的總體思路,以及元器件的選擇,并加以詳細(xì)的解釋。

              第3章 硬件設(shè)計

    單片機(jī)是整個系統(tǒng)的控制中樞,它指揮外圍器件協(xié)調(diào)工作,從而完成特定的功能,硬件實現(xiàn)上采用模塊化設(shè)計,每一模塊只實現(xiàn)一個特定功能,最后再將各個模塊搭接在一起,這種設(shè)計方法可以降低系統(tǒng)設(shè)計的復(fù)雜性,本系統(tǒng)主要硬件設(shè)計包括電源電路、蜂鳴器電路、晶振電路,LCD顯示電路以及溫濕度傳感器電路[11]。

3.1主控制電路和測溫時控制電路

    本次硬件的核心就是AT89S511,其他的外圍電路都是圍繞它所設(shè)計的。數(shù)字溫濕度傳感器的DHT11的DATA口連接單片機(jī)AT89S51的P3.0口。顯示電路就是把LCD1602和單片機(jī)的P1口分別相連,當(dāng)溫度或濕度高于預(yù)設(shè)值的時候蜂鳴器蜂鳴報警,代表控制系統(tǒng)的指示燈常亮,增加單片機(jī)的輸出能力,增加單片機(jī)的輸出電流,故使用電阻排來完成[14]。本系統(tǒng)采用的是上電復(fù)位,充電之后,RST被拉至高電平,單片機(jī)進(jìn)入工作狀態(tài)。

     AT89S51中有一個用于構(gòu)成內(nèi)部振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外石英晶體或者陶瓷諧振器構(gòu)成自激振蕩器,他們與電容C1,C2接在放大器的反饋電路中構(gòu)成并聯(lián)震蕩電路,雖然電容沒有一個嚴(yán)格的要求,但是電容的大小會輕微影響振蕩頻率的高低、溫度穩(wěn)定性以及振蕩器工作的穩(wěn)定性。



圖3-1 系統(tǒng)電路原理圖

3.2主要模塊的電路3.2.1系統(tǒng)的蜂鳴器電路
微型計算機(jī)控制系統(tǒng)中,為了安全起見,對于一些重要的參數(shù)或系統(tǒng),都設(shè)定有緊急狀態(tài)報警系統(tǒng),以便于提醒操作人員注意,或者采取緊急措施,本設(shè)計采用把計算機(jī)采集的數(shù)據(jù)進(jìn)行數(shù)據(jù)處理、標(biāo)度變換、數(shù)字濾波之后,與該參數(shù)上下限與設(shè)定值進(jìn)行比較,不符合標(biāo)準(zhǔn)值則進(jìn)行報警,否則就作為采樣的正常值,進(jìn)行顯示[12]。
本設(shè)計采用峰鳴音報警電路。如圖所示。蜂鳴器額定電流≤30Ma,而對于AT89S51單片機(jī),P3口的灌電流為15mA,由此可見,僅靠單片機(jī)的P3口電流是不能驅(qū)動蜂鳴器的,必須使用晶體管放大電路,為了使單片機(jī)的功率更小,所以使用PNP型晶體管,當(dāng)外部環(huán)境的溫度或者濕度超過預(yù)設(shè)值的時候,基級變?yōu)榈碗娖,蜂鳴器導(dǎo)通鳴叫[11]。

圖3-2-1  蜂鳴器實物圖



圖3-2-1  蜂鳴器電路


3.2.2晶振電路
    單片機(jī)系統(tǒng)都有晶振,在單片機(jī)系統(tǒng)中晶振的作用非常大,全稱叫做晶體振蕩器,它結(jié)合單片機(jī)內(nèi)部電路產(chǎn)生所需時鐘頻率,單片機(jī)晶振提供的時鐘頻率越高,那么單片機(jī)的運(yùn)行速度就會越快,單片機(jī)的一切指令執(zhí)行都是建立在單片機(jī)晶振所提供的時鐘頻率。在通常的工作條件下,普通的晶振頻率的絕對精度可以達(dá)到百萬分之五十,高級晶振精度更高,有些晶振還可以由外加的電壓在一定范圍內(nèi)調(diào)整頻率,稱為壓榨振蕩器,在共振的狀態(tài)下晶振用一種能把電能和機(jī)械能相互轉(zhuǎn)化的晶體工作,以提供穩(wěn)定,精確的單頻振蕩。
    單片機(jī)晶振的作用是為系統(tǒng)提供及本周的時鐘信號,通常一個系統(tǒng)共用一個晶振,以便于各部分保持同步,有些通訊系統(tǒng)的基頻和射頻使用不同的晶振,而是通過電子調(diào)整頻率的方法保持同步。晶振通常與鎖相環(huán)電路配合使用,以提供系統(tǒng)所需的時鐘頻率,可以用于同一個晶振項鏈的不同鎖相環(huán)來提供的。單片機(jī)AT89S51的晶振電路采用無源晶振,微調(diào)電容取22uf。


圖3-2-2晶振電路

3.2.3 溫濕度設(shè)置(按鍵)電路

圖3-2-3 按鍵電路

3.2.4顯示電路
    在日常生活中,我們對液晶顯示器并不陌生,它已作為很多電子產(chǎn)品的通過器件,比方在計算器、萬用表、電子表及很多家用電子產(chǎn)品中都可以看到,顯示的主要是數(shù)字、專用符號和圖形。

    顯示模塊選用1602字符型液晶模塊,它是目前工控系統(tǒng)中使用最廣泛的液晶屏之一,由于它顯示的質(zhì)量高,電路圖如圖3.4所示,1602字符型液晶模塊是點陣型液晶,驅(qū)動方便,經(jīng)過編程后顯示內(nèi)容多樣化[2]。


圖3-2-4 顯示電路

3.2.5傳感器電路
    DHT11是數(shù)字型溫濕度傳感器,可直接以數(shù)字方式傳輸所采集的當(dāng)前環(huán)境溫濕度,DHT11采用的是單總線通信,因此只需將單片機(jī)的一個I/O端口與DHT11的通信接口連接就可以實現(xiàn)數(shù)據(jù)的采集和傳送,相對于其他電路來說比較簡單。如圖3.4所示:

圖3-2-5 傳感器電路


3.2.6復(fù)位電路
    本次設(shè)計采用的是上電復(fù)位,當(dāng)RST引腳上出現(xiàn)了兩個周期以上的高電平就會觸發(fā)內(nèi)部復(fù)位,這里的EA端與復(fù)位電路無關(guān),由于數(shù)據(jù)都放在了內(nèi)部存儲器,所以連接EA只是直接拉高引腳。

圖3-2-6 復(fù)位電路

3.2.7電源指示燈電路

圖3-2-7  電源指示燈電路

3.3硬件實施控制3.3.1溫濕度設(shè)置
溫濕度上下限控制設(shè)置如圖所示。

(1)濕度上限設(shè)置界面      

      

(2)濕度下限設(shè)置界面


(3)溫度度下限設(shè)置界面               

(4)溫度度上限設(shè)置界面

    圖4-1-1 溫濕度上下限設(shè)置


3.3.2工作指示燈和電源
代表控制設(shè)備啟動的燈泡(加熱、降溫;加濕、除濕)







3.3.3功能按鍵
3.4設(shè)備運(yùn)行
    本次設(shè)計主要是能夠?qū)崟r顯示出當(dāng)前確切的溫濕度,并且在高于預(yù)設(shè)值的時候能夠發(fā)出蜂鳴。一旦接通電源,工作指示燈常亮,蜂鳴器首先蜂鳴,表示系統(tǒng)正常運(yùn)行。接著LCD初始化,采用八位的數(shù)據(jù)端口,兩行顯示,其中第一行顯示的濕度預(yù)設(shè)值,根據(jù)鍵盤我們可以加減數(shù)值,第二行顯示的是實時的溫濕度值,在程序設(shè)計中,分別定義溫濕度參數(shù),根據(jù)數(shù)據(jù)轉(zhuǎn)換過來的數(shù)值,判斷是否超過了預(yù)設(shè)值,本次設(shè)計溫度初試值設(shè)定為32℃,濕度初始設(shè)定為34%,等待傳送的數(shù)值連續(xù)20次都超過預(yù)設(shè)值的話,蜂鳴器便會蜂鳴警報,1602顯示當(dāng)前的溫濕度值,溫濕度不在標(biāo)準(zhǔn)范圍內(nèi),溫度和濕度的控制措施燈亮,表示對溫度和濕度不在范圍內(nèi)采取相應(yīng)措施。采取措施后,傳輸數(shù)據(jù)正常,再次循環(huán)判斷,如果沒有超過預(yù)設(shè)值,蜂鳴器不會蜂鳴,1602正常顯示,不會啟動控制措施,也同樣再次循環(huán)。
    按鍵說明:左起第一個是功能鍵,按一次進(jìn)入報警溫度設(shè)置此時出現(xiàn)H 40,進(jìn)行上限溫度設(shè)置,此時設(shè)置H高溫報警溫度并閃爍顯示;按第二次,進(jìn)行下限溫度設(shè)置此時出現(xiàn)L 03,此時設(shè)置L低溫報警溫度并閃爍顯示;再按一次即第三次,則恢復(fù)正常的溫度顯示界面。第二個按鍵是增加鍵,可以對上限溫度或下限溫度進(jìn)行增大調(diào)整第三個按鍵是減小鍵,可以對下限溫度或下限溫度進(jìn)行減小調(diào)整;濕度同理。這樣便可設(shè)置好溫、濕度的上、下限。
3.5控制設(shè)備:
采用設(shè)備:
(1)風(fēng)扇或者排濕器:負(fù)責(zé)系統(tǒng)的降溫工作。
風(fēng)扇可以是USB借口的或者與電源相連接的,根據(jù)本設(shè)計需要,由于在糧庫內(nèi)使用,所以用電源連接的風(fēng)扇較為適合。小風(fēng)扇材料的選擇主要注意它的耐性和穩(wěn)定性,要選擇不變形的塑料材質(zhì),苯乙烯聚合物是一種熱塑性樹脂,無色、無味,而且有光澤的透明固體,具有耐化學(xué)腐蝕性、耐水性和優(yōu)良的電絕緣性和高頻點介性。
排潮器根據(jù)功率大小還有性價比來進(jìn)行選擇,做了市場調(diào)查以后,根據(jù)糧庫環(huán)境,選擇了ZD-8138C 空氣排濕機(jī),完全滿足糧庫儲存糧食的要求。其中內(nèi)部壓縮機(jī)采用世界名牌高效渦漩式壓縮機(jī),質(zhì)量可靠、高效節(jié)能;風(fēng)機(jī)采用工業(yè)通風(fēng)專業(yè)的外轉(zhuǎn)子風(fēng)機(jī),具有使用壽命長、噪音低、出風(fēng)量大的有點;保護(hù)功能系統(tǒng)完善,電源缺相、錯相;壓縮機(jī)過流、高低壓力、延時保護(hù)、風(fēng)機(jī)過載、電加熱過熱、風(fēng)機(jī)壓差保護(hù)。主要性能參數(shù)指標(biāo)如下。
表3-5 排潮器的主要性能參數(shù)

除濕量

5.75公斤/小時( 138升/天)

電源

220V~50Hz

環(huán)境溫度

5~58℃

循環(huán)風(fēng)量

1725m3

運(yùn)轉(zhuǎn)噪音

50dB

壓縮機(jī)保護(hù)

三分鐘延時

適用面積(3m/高)

100 ~150

(2)加熱設(shè)備:負(fù)責(zé)系統(tǒng)的加熱工作。
加熱設(shè)備:本設(shè)計采用的是電加熱設(shè)備,不銹鋼加熱器在耐高溫不銹鋼無縫管內(nèi)均勻地分布高溫電阻絲,在空隙部分致密地填入導(dǎo)熱性能和絕緣性能均良好的結(jié)晶氧化鎂粉,這種結(jié)構(gòu)不但先進(jìn),熱效率高,而且發(fā)熱均勻,當(dāng)高溫電阻絲中有電流通過時,產(chǎn)生的熱通過結(jié)晶氧化鎂粉向金屬管表面擴(kuò)散,再傳遞到被加熱件或空氣中去,達(dá)到加熱的目的。針對目前市場的需求,主要不銹鋼加熱器有304和316l不同材質(zhì),供客戶選擇。目前使用比較多的有直型加熱管、u型加熱管、w型加熱管、螺旋式加熱器、法蘭式加熱管、異型加熱器、易燃易爆加熱管、重油加熱器等系列產(chǎn)品。為了降低成本,耐用環(huán)保,我們采用的是直型加熱管。
(3)噴霧設(shè)備:負(fù)責(zé)系統(tǒng)的加濕工作。
自動灑水器:1. 材料為工程塑料和不銹鋼,強(qiáng)度高,耐化學(xué)物質(zhì)(化肥、農(nóng)藥等)腐蝕。2. 整體壓鑄成型,結(jié)構(gòu)強(qiáng)度高。3. 整個內(nèi)芯可從噴頭頂部旋出(外殼與管道間的連接不動),清洗修方便。4. 1806和1812型有兩個接口(底部和側(cè)壁)供用戶選擇。我們選擇1812型。5. 接口尺寸:1/2¨陰螺紋;射程:90m-120m。把灑水器內(nèi)注滿水,如若是大型功耗的灑水器,每100平方米只需放置一個即可,若是中小型工號的灑水器,每100平方米放置2-3個即可。本設(shè)計采用的是大型功耗灑水器,全面噴灑形,噴灑面積90-120平方米,流量Q=130-150L/H。美中不足的是需要人力檢測容器內(nèi)剩余水的多少,需要人在一天內(nèi)觀察一次。
(4)排潮設(shè)備:負(fù)責(zé)系統(tǒng)的去濕工作。

烘干節(jié)能排潮系統(tǒng):包括烘干排潮室,沿所述烘干排潮室縱向間隔垂直設(shè)置的隔板將其自后至前分為多個加熱單元[3];所述每個隔板均自烘干排潮室頂壁向下延伸至中部;在位于隔板下方的烘干排潮室內(nèi)沿縱向設(shè)置有多條輸送鏈條;在所述每個加熱單元地板下方分別開設(shè)有氣體通道,所述氣體通道的進(jìn)、出氣口分別位于本加熱單元的地板表面;相鄰兩單元的進(jìn)、出氣口通過管道、抽風(fēng)機(jī)相連通,位于最右端加熱單元的出氣口延伸出烘干排潮室之外。本實用新型優(yōu)點在于從后向前分若干區(qū),每個區(qū)從地下管道抽后區(qū)風(fēng)送往前區(qū),上吹下吸,依次進(jìn)行,熱能反復(fù)利用,大大降低了熱能消耗,同時排向大氣的熱量大為減少,起到了很好的節(jié)能、環(huán)保效果。

  本系統(tǒng)控制設(shè)備采用的加濕設(shè)備、除濕設(shè)備、加溫設(shè)備、降溫設(shè)備作為控制器,加濕設(shè)備、除濕設(shè)備、加溫設(shè)備、降溫設(shè)備分別控制濕度與溫度,使得糧庫的溫濕度得到合理控制。
(1)當(dāng)溫度高于預(yù)設(shè)的標(biāo)準(zhǔn)范圍內(nèi),蜂鳴響起,并根據(jù)報警信號和當(dāng)前溫度顯示,小型風(fēng)扇、排潮器自行啟動,當(dāng)達(dá)到標(biāo)準(zhǔn)范圍內(nèi),溫度恢復(fù)正常,蜂鳴停止,小型風(fēng)扇、排潮器自動關(guān)閉,工作指示燈亮,設(shè)備正常運(yùn)行;
(2)當(dāng)溫度低于預(yù)設(shè)的標(biāo)準(zhǔn)范圍內(nèi),蜂鳴響起,根據(jù)報警信號和當(dāng)前溫度顯示,電加熱設(shè)備自行啟動,當(dāng)溫度歸于正常值時,蜂鳴停止,電加熱設(shè)備關(guān)閉,工作指示燈亮,設(shè)備正常運(yùn)行;
(3)當(dāng)濕度高于預(yù)設(shè)的標(biāo)準(zhǔn)范圍內(nèi),蜂鳴響起并根據(jù)報警信號和當(dāng)前濕度值系統(tǒng)自動啟動烘干節(jié)能排潮系統(tǒng),達(dá)到去濕效果,當(dāng)濕度降低到正常范圍內(nèi)時,蜂鳴停止,烘干節(jié)能排潮系統(tǒng)關(guān)閉,工作指示燈亮,設(shè)備正常運(yùn)行;
(4)當(dāng)濕度低于預(yù)設(shè)的標(biāo)準(zhǔn)范圍內(nèi),蜂鳴響起并根據(jù)報警信號和當(dāng)前濕度值系統(tǒng)啟動自動灑水器,達(dá)到加濕效果后,滿足糧庫工作的濕度范圍內(nèi),工作指示燈亮,設(shè)備正常運(yùn)行。
(5)如若溫濕度同時不在標(biāo)準(zhǔn)范圍內(nèi),兩個功能性設(shè)備同時啟動。

3.6 本章小結(jié)
本章節(jié)主要介紹了硬件設(shè)計的總思路及其各部分電路的主要設(shè)計方法,詳細(xì)的給出了各個模塊(蜂鳴器,晶振電路,顯示電路,按鍵電路,傳感器電路,復(fù)位電路,電源指示燈電路)的電路設(shè)計。初步連接構(gòu)造硬件,并且設(shè)計了控制部分,較細(xì)致的介紹了硬件運(yùn)行。

第4章  軟件設(shè)計

軟件設(shè)計是本次設(shè)計中不可缺少的環(huán)節(jié),貫穿了整個設(shè)計,是本次設(shè)計能夠完成的最重要的環(huán)節(jié)之一。
4.1系統(tǒng)流程圖
根據(jù)溫濕度監(jiān)控系統(tǒng)功能,系統(tǒng)軟件流程圖如圖4-1所示:

圖4-1系統(tǒng)軟件流程圖



4.2按鍵流程圖
按鍵檢測過程中,流程如下圖4-2所示:




                        圖4-2 按鍵檢測的流程圖

4.3 Protues運(yùn)行結(jié)果
4.4 本章小結(jié)
本章主要給出了系統(tǒng)流程圖,了解了系統(tǒng)流程更好的做出硬件。通過Proteus軟件或Protel99SE繪制仿真圖、流程圖。


結(jié)  論

本文設(shè)計的是糧庫的溫濕度監(jiān)測報警、控制系統(tǒng)。由高性價比單片機(jī)對數(shù)字溫濕度傳感器控制,通過溫、濕度傳感器,實現(xiàn)對溫濕度數(shù)據(jù)采集,并對數(shù)據(jù)處理、LCD1602顯示屏顯示即時溫、濕度值。當(dāng)溫濕度數(shù)據(jù)超出設(shè)定溫、濕度值時,由單片機(jī)驅(qū)動報警裝置,實現(xiàn)現(xiàn)場報警功能,控制系統(tǒng)自行啟動,調(diào)節(jié)不在范圍內(nèi)的溫、濕度,使其恢復(fù)正常。
首先,介紹了設(shè)計的核心組成部分單片機(jī)AT89S51的的基本構(gòu)成和原理,簡要的說明了單片機(jī)的最小系統(tǒng),中斷系統(tǒng),復(fù)位電路和時鐘電路。然后介紹了顯示部分LCD1602的各個引腳和指令說明,為下面的編程做準(zhǔn)備。
其次,介紹了本次設(shè)計的傳感器:DHT11溫濕度傳感器。然后給出了主要模塊電路的結(jié)構(gòu),在硬件連接以后,初步的硬件運(yùn)行結(jié)果,以實物圖的形式進(jìn)行了說明。介紹了控制溫、濕度的設(shè)備,在根據(jù)不同環(huán)境下的應(yīng)用和選擇。
最后,說明了用到的軟件,給出了總體的原理圖和流程圖和Proteus運(yùn)行結(jié)果,以便更好的理解。
最后程序檢查正常,焊接成品,硬件運(yùn)行正常,滿足了初步設(shè)計要求,達(dá)到了糧庫溫、濕度控制的目的。在設(shè)計中還有不足的部分,在現(xiàn)場控制時,保證傳感器不受條件因素的影響是很重要的,由于研究時間和條件的限制,糧庫溫、濕度還有許多地方需要深入研究。


參考文獻(xiàn)
[1] 孫宏宇.牛舍環(huán)境及供料自動控制系統(tǒng)的研究[D].吉林農(nóng)業(yè)大學(xué),2008:24
[2] 湯武輝.Proteus仿真軟件與單片機(jī)實驗教學(xué)[N].長江大學(xué)學(xué)報(自然版),2010,(3):33-36.
[3] 王劍,朱濤,李冬.protel 99se電路仿真在電子實驗教學(xué)中的應(yīng)用[J].2010,(5):38-40.
[4] 王國防.基于nRF24E1的數(shù)據(jù)采集及無線傳輸系統(tǒng)的研究[D].河北科技大學(xué),2009:8-10.
[5] 張冬林,李鑫,戴梅.基于DHT11的低成本蠶室溫濕度自動控制系統(tǒng)設(shè)計[J].現(xiàn)代農(nóng)業(yè)科技,2010,(18):11.
[6] 徐春河.淺談AT89S51[J].制造業(yè)自動化,2010,(12):6.
[7] 薛玲,孫曼,張志會,夏莉麗,魏希文.基于單片機(jī)AT89S51的溫濕度控制儀[J].2010, (7):12-14.
[8] 吳漢清.常用的典型單片機(jī)資料[J].無線電,2007,(11):50-57.
[9] 葉健斌.基于單片機(jī)嵌入式系統(tǒng)的GPS應(yīng)用[J].電子質(zhì)量,2008,(7):16-24.
[10] 王靜.通用庫房溫濕度測控系統(tǒng)[D].中國海洋大學(xué),2009:5.
[11] 劉寶元,張玉虹,姜旭,段存麗.基于單片機(jī)的溫濕度監(jiān)控系統(tǒng)設(shè)計[J].國外電子測量技術(shù),2009,(12):30-33,35.
[12] 陳汝全.實用微機(jī)與單片機(jī)控制技術(shù)[M].電子科技大學(xué)出版社.2005:16-17.
[13] 張廣軍,黃俊欽.溫度傳感器現(xiàn)場動態(tài)校準(zhǔn)方法與實驗研究[J] 北京航空航天大學(xué)學(xué)報 1997:7-9.
[14] 李建民.單片機(jī)在溫度控制系統(tǒng)中的應(yīng)用[M].江漢大學(xué)學(xué)報,1996:72-78.
[15] Vizimuller, P.Basic knowledge of transducers[J].World Cement.2000
[16] Tulone, S. Madden.Quorum systems for wireless sensor networks[J].2007



單片機(jī)源程序如下:
  1. #include

  2. #include "key_contrl.h"
  3. #include "lcd1602.h"


  4. #define LCM_Data P1
  5. #define Busy 0x80 //用于檢測LCM狀態(tài)字中的Busy標(biāo)識

  6. extern int temp_value, humi_value;
  7. extern int flag;
  8. extern int temp;

  9. sbit red=P2^6;
  10. sbit blue=P2^7;

  11. sbit LCM_RW= P2^4; //定義引腳
  12. sbit LCM_RS= P2^5;
  13. sbit LCM_E= P2^3;


  14. sbit beep = P0^6; //beep = 0時候發(fā)聲


  15. extern int temph,templ,disp_mode,huih,huil;
  16. extern char tel,teh,hh,hl;

  17. //寫數(shù)據(jù)

  18. void alarm()
  19. {
  20.               beep=0;

  21.               Delay5Ms();
  22.               Delay5Ms();
  23.               beep=1;

  24.               Delay5Ms();
  25.               Delay5Ms();

  26. }


  27. void WriteDataLCM(unsigned char WDLCM)
  28. {
  29. ReadStatusLCM(); //檢測忙
  30. LCM_Data = WDLCM;
  31. LCM_RS = 1;
  32. LCM_RW = 0;
  33. LCM_E = 0; //若晶振速度太高可以在這后加小的延時
  34. LCM_E = 0; //延時
  35. LCM_E = 1;
  36. }
  37. //寫指令
  38. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
  39. {
  40. if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測忙
  41. LCM_Data = WCLCM;
  42. LCM_RS = 0;
  43. LCM_RW = 0;
  44. LCM_E = 0;
  45. LCM_E = 0;
  46. LCM_E = 1;
  47. }
  48. //讀數(shù)據(jù)
  49. unsigned char ReadDataLCM(void)
  50. {
  51. LCM_RS = 1;
  52. LCM_RW = 1;
  53. LCM_E = 0;
  54. LCM_E = 0;
  55. LCM_E = 1;
  56. return(LCM_Data);
  57. }
  58. //讀狀態(tài)
  59. unsigned char ReadStatusLCM(void)
  60. {
  61. LCM_Data = 0xFF;
  62. LCM_RS = 0;
  63. LCM_RW = 1;
  64. LCM_E = 0;
  65. LCM_E = 0;
  66. LCM_E = 1;
  67. while (LCM_Data & Busy); //檢測忙信號
  68. return(LCM_Data);
  69. }
  70. void LCMInit(void) //LCM初始化
  71. {
  72. LCM_Data = 0;
  73. WriteCommandLCM(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號
  74. Delay5Ms();
  75. WriteCommandLCM(0x38,0);
  76. Delay5Ms();
  77. WriteCommandLCM(0x38,0);
  78. Delay5Ms();
  79. WriteCommandLCM(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
  80. WriteCommandLCM(0x08,1); //關(guān)閉顯示
  81. WriteCommandLCM(0x01,1); //顯示清屏
  82. WriteCommandLCM(0x06,1); // 顯示光標(biāo)移動設(shè)置
  83. WriteCommandLCM(0x0C,1); // 顯示開及光標(biāo)設(shè)置
  84. }
  85. //按指定位置顯示一個字符
  86. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  87. {
  88. Y &= 0x1;
  89. X &= 0xF; //限制X不能大于15,Y不能大于1
  90. if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼 0x40;
  91. X |= 0x80; // 算出指令碼
  92. WriteCommandLCM(X, 0); //這里不檢測忙信號,發(fā)送地址碼
  93. WriteDataLCM(DData);
  94. }
  95. //按指定位置顯示一串字符
  96. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  97. {
  98. unsigned char ListLength;
  99. ListLength = 0;
  100. Y &= 0x1;
  101. X &= 0xF; //限制X不能大于15,Y不能大于1
  102. while (DData[ListLength]>0x20) //若到達(dá)字串尾則退出
  103. {
  104. if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
  105. {
  106. DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  107. ListLength++;
  108. X++;
  109. }
  110. }
  111. }
  112. //5ms延時
  113. void Delay5Ms(void)
  114. {
  115. unsigned int TempCyc = 5552;
  116. while(TempCyc--);
  117. }
  118. /*void Delay_xMs(unsigned int x)
  119. {
  120.     unsigned int i,j;
  121.     for( i =0;i < x;i++ )
  122.     {
  123.         for( j =0;j<500;j++ );
  124.     }
  125. }
  126. */
  127. void display_temp(void)
  128. {
  129.               DisplayOneChar(0,0,' ');
  130.               DisplayOneChar(1,0,' ');
  131.               DisplayOneChar(2,0,'T');
  132.               DisplayOneChar(3,0,'e');
  133.               DisplayOneChar(4,0,'m');
  134.               DisplayOneChar(5,0,'p');
  135.               DisplayOneChar(6,0,':');
  136.               DisplayOneChar(10,0,'C');
  137.               DisplayOneChar(9,0,0xdf);
  138.               DisplayOneChar(7,0,temp_value/100+0x30);
  139.               DisplayOneChar(8,0,(temp_value/10)-(temp_value/100)*10+0x30);
  140.               DisplayOneChar(11,0,' ');
  141.               DisplayOneChar(12,0,' ');
  142.               DisplayOneChar(13,0,' ');
  143.               DisplayOneChar(14,0,' ');
  144.               DisplayOneChar(15,0,' ');


  145.               DisplayOneChar(0,1,' ');
  146.               DisplayOneChar(1,1,' ');
  147.               DisplayOneChar(2,1,'H');
  148.               DisplayOneChar(3,1,'u');
  149.               DisplayOneChar(4,1,'m');
  150.               DisplayOneChar(5,1,'i');
  151.               DisplayOneChar(6,1,'d');
  152.               DisplayOneChar(7,1,'i');
  153.               DisplayOneChar(8,1,'t');
  154.                             DisplayOneChar(9,1,'y');
  155.               DisplayOneChar(10,1,':');
  156.               DisplayOneChar(11,1,humi_value/100+0x30);
  157.               DisplayOneChar(12,1,(humi_value/10)-(humi_value/100)*10+0x30);
  158.               DisplayOneChar(13,1,'%');

  159.               DisplayOneChar(14,1,' ');
  160.               DisplayOneChar(15,1,' ');
  161. }            

  162. void display_temp1(void)
  163. {

  164.               DisplayOneChar(0,0,' ');
  165.               DisplayOneChar(1,0,'T');
  166.               DisplayOneChar(2,0,'h');
  167.               DisplayOneChar(3,0,':');
  168.               if(flag&teh)
  169.               {
  170.               DisplayOneChar(4,0,0x20);
  171.               DisplayOneChar(5,0,0x20);
  172.               }
  173.               else
  174.               {
  175.               DisplayOneChar(4,0,temph/10+0x30);
  176.               DisplayOneChar(5,0,temph%10+0x30);
  177.               }

  178.               DisplayOneChar(6,0,0xdf);
  179.               DisplayOneChar(7,0,'C');



  180.               DisplayOneChar(8,0,' ');
  181.               DisplayOneChar(9,0,'T');
  182.               DisplayOneChar(10,0,'h');
  183.               DisplayOneChar(11,0,':');
  184.               if(flag&tel)
  185.               {
  186.               DisplayOneChar(12,0,0x20);
  187.               DisplayOneChar(13,0,0x20);
  188.               }
  189.               else
  190.               {
  191.               DisplayOneChar(12,0,templ/10+0x30);
  192.               DisplayOneChar(13,0,templ%10+0x30);
  193.               }
  194.               DisplayOneChar(14,0,0xdf);
  195.               DisplayOneChar(15,0,'C');



  196.                             DisplayOneChar(0,1,' ');
  197.               DisplayOneChar(1,1,'H');
  198.               DisplayOneChar(2,1,'h');
  199.               DisplayOneChar(3,1,':');
  200.                             if(flag&hh)
  201.               {
  202.               DisplayOneChar(4,1,0x20);
  203.               DisplayOneChar(5,1,0x20);
  204.               }
  205.               else
  206.               {
  207.               DisplayOneChar(4,1,huih/10+0x30);
  208.               DisplayOneChar(5,1,huih%10+0x30);
  209.               }
  210.               DisplayOneChar(6,1,'%');
  211.               DisplayOneChar(7,1,' ');



  212.               DisplayOneChar(8,1,' ');
  213.               DisplayOneChar(9,1,'H');
  214.               DisplayOneChar(10,1,'l');
  215.               DisplayOneChar(11,1,':');
  216.                             if(flag&hl)
  217.               {
  218.               DisplayOneChar(12,1,0x20);
  219.               DisplayOneChar(13,1,0x20);
  220.               }
  221.               else
  222.               {

  223.               DisplayOneChar(12,1,huil/10+0x30);
  224.               DisplayOneChar(13,1,huil%10+0x30);
  225.               }
  226.               DisplayOneChar(14,1,'%');
  227.               DisplayOneChar(15,1,' ');
  228. }            


  229. void displayfun1()
  230. {
  231.               display_temp();

  232. }

  233. void displayfun2()
  234. {
  235.               display_temp1();            
  236. }


  237. void display()
  238. {

  239.                             if((((temp_value/10)%100)<templ)||(((humi_value 10)%100)<huil))
  240.                             {beep=0;red=0;}                //溫度低于下限值,報警
  241.                             else if(((temp_value/10)%100)>=temph || ((humi_value/10)%100)>=huih)
  242.                                           {beep=0;blue=0;}      //溫度高于或等于上限值,報警
  243.                             else {beep=1;red=1;blue=1;}

  244. //                            if(((humi_value/10)%100)<huil){beep=0;led=0;} 溫度低于下限值,報警
  245. //                            else if(((humi_value/10)%100)>=huih)beep=0;      //溫度高于或等于上限值,報警
  246. //                            else {beep=1;led=1;}


  247.               if(!disp_mode)
  248.                             displayfun1(); //顯示正常
  249.               else
  250.                             displayfun2(); //設(shè)置界面

  251. }
  252. #include "dht11.h"
  253. #include


  254. //請根據(jù)自己的dht11 接的IO 口來改動位定義


  255. sbit dht11 = P3^0;
  256. //防止在與硬件通信時發(fā)生死循環(huán)的計數(shù)范圍

  257. #define NUMBER 20
  258. #define SIZE 5

  259. static unsigned char status;

  260. //存放五字節(jié)數(shù)據(jù)的數(shù)組
  261. static unsigned char value_array[SIZE];

  262. /*可在其他的文件引用溫濕度值,實際是溫度的整數(shù)的10 倍
  263. 如dht11 讀回的溫度是26,則temp_value = 260, 濕度同理*/
  264. int temp_value, humi_value;


  265. static unsigned char ReadValue(void);



  266. void Delay_1ms(unsigned int ms)
  267. {
  268.               unsigned int x, y;
  269.               for(x = ms; x > 0; x--)
  270.               {
  271.                             for(y = 124; y > 0; y--);
  272.               }
  273. }
  274. static void DHT11_Delay_10us(void)
  275. {
  276.               unsigned char i;
  277.               i--;
  278.               i--;
  279.               i--;
  280.               i--;
  281.               i--;
  282.               i--;
  283. }
  284. /*讀一個字節(jié)的數(shù)據(jù)*/
  285. static unsigned char DHT11_ReadValue(void)
  286. {
  287.               unsigned char count, value = 0, i;
  288.               status = OK; //設(shè)定標(biāo)志為正常狀態(tài)
  289.               for(i = 8; i > 0; i--)
  290.               {
  291.                             //高位在先
  292.                             value <<= 1;
  293.                             count = 0;
  294.                             //每一位數(shù)據(jù)前會有一個50us 的低電平時間.等待50us 低電平結(jié)束
  295.                             while(dht11 == 0 && count++ < NUMBER);
  296.                             if(count >= NUMBER)
  297.                                           {
  298.                                           status = ERROR; //設(shè)定錯誤標(biāo)志
  299.                                           return 0; //函數(shù)執(zhí)行過程發(fā)生錯誤就退出函數(shù)
  300.                                           }
  301.                             //26-28us 的高電平表示該位是0,為70us 高電平表該位1
  302.                             DHT11_Delay_10us();
  303.                             DHT11_Delay_10us();
  304.                             DHT11_Delay_10us();
  305.                             //延時30us 后檢測數(shù)據(jù)線是否還是高電平
  306.                             if(dht11 != 0)
  307.                             {
  308.                             //進(jìn)入這里表示該位是1
  309.                                           value++;
  310.                             //等待剩余(約40us)的高電平結(jié)束
  311.                                           while(dht11 != 0 && count++ < NUMBER)
  312.                                           {
  313.                                                         dht11 = 1;
  314.                                           }
  315.                                           if(count >= NUMBER)
  316.                                           {
  317.                                                         status = ERROR; //設(shè)定錯誤標(biāo)志
  318.                                                         return 0;
  319.                                           }
  320.                             }
  321.               }
  322.               return (value);
  323. }
  324. //讀溫度和濕度函數(shù),讀一次的數(shù)據(jù),共五字節(jié),讀出成功函數(shù)返回OK, 錯誤返回ERROR
  325. unsigned char DHT11_ReadTempAndHumi(void)
  326. {
  327.               unsigned char i = 0, check_value = 0,count = 0;
  328.               EA = 0;
  329.               dht11 = 0; //拉低數(shù)據(jù)線大于18ms 發(fā)送開始信號
  330.               Delay_1ms(20); //需大于18 毫秒
  331.               dht11 = 1; //釋放數(shù)據(jù)線,用于檢測低電平的應(yīng)答信號
  332.               //延時20-40us,等待一段時間后檢測應(yīng)答信號,應(yīng)答信號是從機(jī)拉低數(shù)據(jù)線80us
  333.               DHT11_Delay_10us();
  334.               DHT11_Delay_10us();
  335.               DHT11_Delay_10us();
  336.               DHT11_Delay_10us();
  337.               if(dht11 != 0) //檢測應(yīng)答信號,應(yīng)答信號是低電平
  338.               {
  339.                             //沒應(yīng)答信號
  340.                             EA = 1;
  341.                             return ERROR;
  342.               }
  343.               else
  344.               {
  345.                             //有應(yīng)答信號
  346.                             while(dht11 == 0 && count++ < NUMBER); //等待應(yīng)答信號結(jié)束
  347.                             if(count >= NUMBER) //檢測計數(shù)器是否超過了設(shè)定的范圍
  348.                             {
  349.                                           dht11 = 1;
復(fù)制代碼

為了防止有人抄襲,頭文件沒有上傳,文檔僅供參考學(xué)習(xí),給大家一個大體的實現(xiàn)思路,少走彎路,沒有頭文件是無法編譯的,所以無法抄襲:
以上文字word版下載: 基于51單片機(jī)的溫濕度檢測控制系統(tǒng) .doc (1.1 MB, 下載次數(shù): 1167)

作者: 雷猴嘛    時間: 2017-5-23 15:47
樓主做的很完整很全面,贊一個,但是我黑幣不夠,今天下載不了,等明天簽到賺黑幣再來吧
作者: 雷猴嘛    時間: 2017-5-24 13:29
樓主,能不能lcd1602,dht,key_contrl的頭文件給我,謝了
作者: 13625542024    時間: 2017-6-21 22:22
我也要做個溫濕度系統(tǒng) 不太會
作者: 51@11    時間: 2017-6-24 14:56
我也在做
作者: xinghang    時間: 2017-7-1 16:34
做的很好,需要完整程序
作者: xueliang    時間: 2017-11-1 22:59
樓主,能不能lcd1602,dht,key_contrl的頭文件給我,謝了
作者: xueliang    時間: 2017-11-1 23:00
給一下頭文件,樓主
作者: houyang    時間: 2017-12-22 09:52
挺好的就是沒有做出來
作者: sunrise99    時間: 2017-12-25 23:26
贊一個
作者: danpianji10    時間: 2018-1-1 20:56
贊一個
作者: 150605200    時間: 2018-1-10 21:35
樓主有proteus文件嗎,求
作者: 棉質(zhì)橘貓    時間: 2018-2-1 11:03
請問為什么既有分塊電路又有整體在一起的電路圖呢,是整體的電路圖是最終結(jié)果嗎
作者: 36704803    時間: 2018-2-1 21:15
請問為什么既有分塊電路又有整體在一起的電路圖呢,是整體的電路圖是最終結(jié)果嗎
作者: hhhhii    時間: 2018-3-2 16:12
有沒有大佬分享一下程序啊啊啊啊啊
作者: xiaosong1234    時間: 2018-3-7 20:10
畢業(yè)設(shè)計用到了  求黑幣啊  或者源代碼啊給大佬!
作者: xiaosong1234    時間: 2018-3-8 10:38
l樓主你好  在main函數(shù)里面的delay_LCM 和 Scan_Key 這兩個函數(shù)在整個工程中都沒有找到啊 能指點一下嗎
作者: 玩世不恭YY    時間: 2018-4-9 15:54
做的不錯,就是現(xiàn)在我積分不夠  哈哈 再接再厲

作者: wenye647958    時間: 2018-5-1 14:25
真棒,正需要
作者: 向上    時間: 2018-5-2 09:04
寫的很好!
作者: 快過快過    時間: 2018-5-2 17:02
我啥時候才能像樓主一樣聰明呢,求程序呀
作者: uoiuouo    時間: 2018-5-2 21:58
在main函數(shù)里面的delay_LCM 和 Scan_Key 這兩個函數(shù)在整個工程中都沒有找到啊 能指點一下嗎
作者: 向上    時間: 2018-5-7 09:23
樓主寫的很好,不知道能不下不
作者: linwenqiang    時間: 2018-5-7 10:22
樓主做的真的不錯,我想要這份代碼學(xué)習(xí)下
作者: chb333    時間: 2018-5-7 13:26
你程序怎么不對呢
作者: headache    時間: 2018-5-9 16:55
這里所有的都僅供參考,這個仿真圖和程序完全不匹配。我也不知道這東西怎么能跑的起來,浪費我黑幣
作者: 夜空之巔    時間: 2018-5-13 09:38
大哥你這頭文件是哪個都分不清啊,能穿個壓縮包行嗎
作者: sunnyzhu    時間: 2018-5-22 20:38

樓主,能不能lcd1602,dht,key_contrl的頭文件給我,謝謝
作者: meng51    時間: 2018-5-29 11:08
贊一個,很厲害。
作者: 王陳    時間: 2018-5-31 11:12
贊,很給力!
作者: 徐路    時間: 2018-6-3 13:22
非常棒
作者: shuiyan778    時間: 2018-6-7 03:56
謝謝分享~正好需要這個
作者: z904662562    時間: 2018-6-11 09:38

樓主,從能不能lcd1602,dht,key_contrl的頭文件給我,謝了
作者: woheiheihei    時間: 2018-7-1 22:13
非常實用
作者: snow趙云    時間: 2018-7-3 11:05
樓主,從能不能lcd1602,dht,key_contrl的頭文件給我,謝了
作者: 沈心齋    時間: 2018-8-4 11:22
多謝分享,學(xué)習(xí)一下
作者: Yukiline    時間: 2018-9-28 18:24
多謝樓主慷慨解囊
作者: 沉默的歌    時間: 2018-10-28 11:38
很詳細(xì)
作者: 小乙fury    時間: 2018-10-28 14:30
好東西,正好需要這個
作者: starryboy2048    時間: 2018-10-28 15:58
很棒!
作者: huanga    時間: 2018-11-25 13:14
這波很nice
作者: huanga    時間: 2018-11-25 13:46
最后的代碼好亂阿哪個是哪個阿

作者: xuanwunianhua    時間: 2018-11-29 09:15
很給力啊,
作者: 256655    時間: 2018-12-11 10:06
很詳細(xì),我也在做,想要完整版的
作者: 嗨!傻丫頭    時間: 2018-12-27 20:30
很給力,想看后面的程序
作者: 誕生便是罪惡    時間: 2019-1-8 20:06
贊。。!
作者: LKOOJIPMI    時間: 2019-1-9 18:27
贊一個

作者: coldkilla    時間: 2019-3-20 14:14
xiaosong1234 發(fā)表于 2018-3-8 10:38
l樓主你好  在main函數(shù)里面的delay_LCM 和 Scan_Key 這兩個函數(shù)在整個工程中都沒有找到啊 能指點一下嗎

請問你做出來了嗎
作者: coldkilla    時間: 2019-3-20 14:15
headache 發(fā)表于 2018-5-9 16:55
這里所有的都僅供參考,這個仿真圖和程序完全不匹配。我也不知道這東西怎么能跑的起來,浪費我黑幣

就是  坑人的
作者: struggle1112    時間: 2019-3-29 09:24
最近也在做這個,感謝樓主。
作者: struggle1112    時間: 2019-4-7 21:00
樓主,那個庫文件是不是沒發(fā)出來。
作者: 765028711    時間: 2019-4-10 16:54
很全面
作者: WYX277845846    時間: 2019-5-19 11:03
想要源代碼,可是黑幣不夠,哭了
作者: wang11187    時間: 2019-5-21 12:09
可以的

作者: ben0147    時間: 2019-5-21 17:04

正想學(xué)習(xí)ESP8266,謝謝樓主
作者: 冫令刀    時間: 2019-5-22 15:25
附件在哪里。课矣泻趲,我要下載!
作者: xiaolong_net    時間: 2019-6-10 15:17
贊,很給力!
作者: kajdlajfsldj    時間: 2019-6-25 21:29
感謝分享 感謝
作者: 酸菜余    時間: 2019-12-6 10:42
還不錯
作者: DYNAST    時間: 2019-12-17 16:47
雷猴嘛 發(fā)表于 2017-5-23 15:47
樓主做的很完整很全面,贊一個,但是我黑幣不夠,下載不了,我想要那個完整程序

我也想和樓主學(xué)習(xí)學(xué)習(xí)
作者: DYNAST    時間: 2019-12-17 16:48
樓主寫的很好,想要學(xué)習(xí)一下,不知道可不可以分享一下完整版
作者: 775825899    時間: 2019-12-18 16:06
很強(qiáng)更新資料
作者: 林總呀    時間: 2019-12-18 16:28
贊呀,值得學(xué)習(xí)
作者: 翼總牛逼    時間: 2019-12-18 17:17
真的贊,我們新手值得學(xué)習(xí)
作者: Arhat    時間: 2020-3-17 11:42
贊!求文件
作者: 李天澤    時間: 2020-4-15 11:22
樓主,能不能lcd1602,dht,key_contrl的頭文件給我,謝了
作者: 乘風(fēng)破浪ff    時間: 2020-4-21 08:46
給作者點贊!
作者: 2017080915    時間: 2020-5-4 17:39
如果多加兩個DHT實現(xiàn)多點監(jiān)測該怎么做
作者: josehegood    時間: 2020-5-22 01:45
謝謝,很詳細(xì)
作者: lixingyi    時間: 2020-6-17 19:22
帖子很不錯!
作者: koljs    時間: 2020-7-25 21:20
厲害!很符合我想做的項目要求
作者: koljs    時間: 2020-7-25 21:21
很符合我想做的項目要求
作者: koljs    時間: 2020-7-25 22:12
很好,符合我想要做的項目要求
作者: 123scy    時間: 2020-8-16 13:38
我實物也不行
作者: 1296966189abcd    時間: 2020-12-19 15:23
那兩個頭文件可以發(fā)一下嗎?
作者: LBJ000    時間: 2021-4-3 16:38
咋這么多錯誤呢
作者: Lixiaohua    時間: 2021-4-6 10:36
DIY小玩意設(shè)計用得到,參考參考

作者: wanlm檸檬    時間: 2021-5-14 17:03
sunnyzhu 發(fā)表于 2018-5-22 20:38
樓主,能不能lcd1602,dht,key_contrl的頭文件給我,謝謝

請問頭文件給你了?我也想要一份
作者: seaver    時間: 2021-6-2 10:09
樓主,程序運(yùn)行有錯,keil運(yùn)行,我是小白,不會弄
作者: gjhgfg    時間: 2021-9-13 17:44
        好貼啊,樓主好人啊,我剛好要做一個溫濕控.
作者: 1310567903    時間: 2021-10-22 15:18
求key_contrl頭文件
作者: 鄉(xiāng)下人001    時間: 2022-3-26 19:15
學(xué)習(xí)了,感覺寫得很完整
作者: 云梵    時間: 2022-3-27 15:31
文章不錯,點贊
作者: xyb123456    時間: 2022-4-16 09:32

樓主,能不能lcd1602,dht,key_contrl的頭文件給我
作者: dreamloveamy    時間: 2024-12-12 01:04
好貼,剛好有課題需求學(xué)習(xí)




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1