找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

基于單片機(jī)的溫濕度檢測(cè)控制系統(tǒng)課設(shè)報(bào)告

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:328014 發(fā)表于 2018-6-30 04:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
                        
1章 總體設(shè)計(jì)概述
1.2 系統(tǒng)實(shí)現(xiàn)的主要功能
1.3 系統(tǒng)的工作原理簡(jiǎn)介
1.4 總體設(shè)計(jì)簡(jiǎn)介
1.4.1總體設(shè)計(jì)框圖
1.4.2 總體設(shè)計(jì)及工作進(jìn)程
                        
2 系統(tǒng)硬件設(shè)計(jì)
2.1 主控模塊設(shè)計(jì)
2.2 DHT11傳感器模塊設(shè)計(jì)
2.2.1 DHT11傳感器簡(jiǎn)介
2.2.2 DHT11傳感器模塊電路設(shè)計(jì)
2.3 1602液晶顯示模塊設(shè)計(jì)
2.3.1 1602液晶顯示屏簡(jiǎn)介
2.3.2 1602液晶顯示模塊
2.4  閾值設(shè)置模塊
2.5 報(bào)警模塊
                        
3章 系統(tǒng)軟件設(shè)計(jì)
3.1 1602液晶顯示模塊程序設(shè)計(jì)
3.2 傳感器模塊程序設(shè)計(jì)

4章 系統(tǒng)分析與調(diào)試
4.1 程序下載軟件說(shuō)明
4.2 所遇問(wèn)題及解決辦法
4.2.1硬件問(wèn)題及解決方法
4.2.2軟件所遇問(wèn)題及解決方法
                        
5章 結(jié)論與展望
附錄
附錄A 硬件原理圖
附錄B 最終實(shí)物圖及簡(jiǎn)介
附錄C 程序清單
                                                               
第1章 總體設(shè)計(jì)概述
                        
1.1 課題的背景和意義
                        
溫度、濕度和人類的生產(chǎn)、生活有著密切的關(guān)系,同時(shí)也是工業(yè)生產(chǎn)中最常見(jiàn)最基本的工藝參數(shù),例如機(jī)械、電子、石油、化工等各類工業(yè)中廣泛需要對(duì)溫度濕度的檢測(cè)與控制。并且隨著人們生活水平的提高,人們對(duì)自己的生存環(huán)境越來(lái)越關(guān)注。而空氣中溫濕度的變化與人體的舒適度和情緒都有直接的影響,所以對(duì)溫度濕度的檢測(cè)及控制就非常有必要了。
                        
8051單片機(jī)是常用于控制的芯片,在智能儀器儀表、工業(yè)檢測(cè)控制、機(jī)電一體化等方面取得了令人矚目的成果,用其作為溫濕度控制系統(tǒng)的實(shí)力也很多。使用8051單片機(jī)能夠?qū)崿F(xiàn)溫濕度全程的自動(dòng)控制,而且8051單片機(jī)易于學(xué)習(xí)掌握,性價(jià)比高。
                        
使用8051型單片機(jī)設(shè)計(jì)溫濕度控制系統(tǒng),可以即時(shí)精確的反應(yīng)溫室內(nèi)的溫度以及適度的變化。完成諸如升溫到特定的溫度、降溫到特定的溫度。在溫度上下限范圍內(nèi)保持恒溫等多種控制方式,在濕度控制方面也是如此。將此系統(tǒng)應(yīng)用到溫室當(dāng)中無(wú)疑為植被生長(zhǎng)提供了更加適宜的環(huán)境。對(duì)于大棚種植和花圃、花卉栽培,必須在某些特定環(huán)境安裝溫濕度裝置對(duì)其進(jìn)行監(jiān)控。本系統(tǒng)可以及時(shí)、精確的反映室內(nèi)的溫度以及濕度的變化,能夠滿足溫濕度的控制要求。
                        
1.2 系統(tǒng)實(shí)現(xiàn)的主要功能
                        
本系統(tǒng)所要實(shí)現(xiàn)的功能是:
                        
1.溫濕度實(shí)時(shí)檢測(cè)及顯示。通過(guò)LCD1602實(shí)時(shí)地顯示傳感器DHT11檢測(cè)到的溫濕度值,并且固定時(shí)間(5s)檢測(cè)更新顯示一次。
                        
2.報(bào)警閾值的手動(dòng)設(shè)置。通過(guò)三個(gè)按鍵實(shí)現(xiàn)溫濕度閾值的設(shè)置,使得系統(tǒng)更加人性化、智能化,具有更高的實(shí)用價(jià)值。
                        
3.當(dāng)溫濕度超出閾值時(shí)能自動(dòng)報(bào)警。通過(guò)蜂鳴器發(fā)出聲音實(shí)現(xiàn)報(bào)警,以提醒用戶做出相應(yīng)的改進(jìn)措施。
                        
1.3 系統(tǒng)的工作原理簡(jiǎn)介
                        
總體來(lái)說(shuō),本次設(shè)計(jì)主要涉及了溫濕度的測(cè)量、顯示以及實(shí)現(xiàn)簡(jiǎn)單控制。硬件方面有五個(gè)模塊,即AT89S52單片機(jī)主控模塊、傳感器模塊、LCD1602液晶顯示模塊、報(bào)警模塊以及閾值設(shè)置模塊。其中主控模塊已經(jīng)給出,我們只需適當(dāng)增加驅(qū)動(dòng)電路即可。
                        
傳感器模塊使用的是DHT11數(shù)字溫濕度傳感器。通過(guò)DHT11檢測(cè)出當(dāng)前環(huán)境下的溫濕度,將所測(cè)數(shù)據(jù)交給AT單片機(jī)進(jìn)行分析和處理,并分別存入不同數(shù)組以便顯示時(shí)候用。其中,為了顯示穩(wěn)定,本系統(tǒng)每間隔5s采集一次數(shù)據(jù)送入單片機(jī)。
                        
1602液晶顯示模塊就是實(shí)現(xiàn)溫濕度檢測(cè)值和閾值的顯示。其分兩行顯示,上邊一行顯示濕度,下邊顯示溫度值,兩行的末尾兩位是閾值顯示位,正常工作的時(shí)候可以通過(guò)按鍵將其隱藏,需要調(diào)節(jié)閾值時(shí),再顯示出來(lái)方便調(diào)整,相對(duì)構(gòu)建了比較友好的人機(jī)交互。
                        
蜂鳴器報(bào)警模塊實(shí)現(xiàn)了檢測(cè)值超過(guò)閾值的時(shí)候鳴響報(bào)警。本系統(tǒng)采用的是有源蜂鳴器,因此無(wú)論溫度還是濕度超出范圍蜂鳴器都是以相同頻率的聲音進(jìn)行報(bào)警提示。提醒工作人員此時(shí)溫度濕度數(shù)據(jù)出現(xiàn)異常、需及時(shí)調(diào)整,及時(shí)啟用升溫器、加濕器、降溫風(fēng)扇以及噴霧器來(lái)有效的調(diào)整實(shí)驗(yàn)室內(nèi)溫濕度。
                        
閾值設(shè)置模塊通過(guò)三個(gè)按鍵來(lái)實(shí)現(xiàn)閾值設(shè)置功能的。使得在不同環(huán)境下設(shè)置閾值提供了極大的方便,不需要每次都在程序里改動(dòng)然后再燒錄,省去了復(fù)雜的過(guò)程。
                        
1.4 總體設(shè)計(jì)簡(jiǎn)介
                        
1.4.1總體設(shè)計(jì)框圖
                        
                                                                按照系統(tǒng)功能的具體要求,在保證實(shí)現(xiàn)其功能的然礎(chǔ)上,盡可能降低系統(tǒng)成本?傮w設(shè)計(jì)方案圍繞上述思想,初步確定系統(tǒng)的方案如圖1-1所示
                        
                                                        
                        
11系統(tǒng)總體設(shè)計(jì)
                        
                        
從圖中可以看出,系統(tǒng)有微處理器模塊、DHT11傳感器模塊、閾值設(shè)置模塊、1602字符液晶顯示模塊、報(bào)警模塊組成。在方案設(shè)計(jì)中,外圍模塊采用并行控制,以簡(jiǎn)化系統(tǒng),提高控制精度。該設(shè)計(jì)以AT89S52單片機(jī)為控制核心,實(shí)現(xiàn)溫濕度采集及顯示的基本功能。
                        
1.4.2 總體設(shè)計(jì)工作進(jìn)程
                                                    本次設(shè)計(jì)相對(duì)而言有兩個(gè)部分弄明白了就能夠設(shè)計(jì)好了。一個(gè)是液晶顯示部分,一個(gè)是DHT11傳感器部分。傳感器比較陌生,以前沒(méi)有接觸太多,液晶相對(duì)而言比較容易點(diǎn)。因此這次先攻克了液晶顯示部分,然后再拿下傳感器部分。整個(gè)流程如下圖所示:
                        
                        
                                                        
                        
圖1-2 整體設(shè)計(jì)流程圖
                        
                        

第2章 系統(tǒng)硬件設(shè)計(jì)
                        
2.1 主控模設(shè)計(jì)
                                        本次課程設(shè)計(jì)使用的主控模塊是由老師給出的一個(gè)AT89S52為核心的最小系統(tǒng)。使用的時(shí)候?qū)1口作為與液晶的數(shù)據(jù)傳輸口,P2.0作為與傳感器DHT11通信的數(shù)據(jù)口,P2.1~P2.3作為閾值模塊中三個(gè)按鍵的接口,P2.4~P2.6作為分別于液晶的RS、R/W和E端相連接,以控制液晶顯示,P2.7接蜂鳴器控制端,以控制報(bào)警模塊工作。
                        
2.2 DHT11傳感器模塊設(shè)計(jì)
                        
2.2.1 DHT11傳感器簡(jiǎn)介
                        
DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長(zhǎng)期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件,并與一個(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)部在檢測(cè)信號(hào)的處理過(guò)程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡(jiǎn)易快捷。超小的體積、極低的功耗,信號(hào)傳輸距離可達(dá)20米以上,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場(chǎng)合的最佳選則。產(chǎn)品為 4 針單排引腳封裝。連接方便,特殊封裝形式可根據(jù)用戶需求而提供。
                        
DHT11傳感器實(shí)物圖如下2-1所示:
                        
                                                        
                        
2-1 DHT11傳感器實(shí)物圖
                        
(1)引腳介紹:
                        
Pin1:(VDD),電源引腳,供電電壓為3~5.5V。
                        
Pin2:(DATA),串行數(shù)據(jù),單總線。
                        
Pin3:(NC),空腳,請(qǐng)懸浮。
                        
Pin4(VDD),接地端,電源負(fù)極。
                        
(2)接口說(shuō)明 :
                        
建議連接線長(zhǎng)度短于20米時(shí)用5K上拉電阻,大于20米時(shí)根據(jù)實(shí)際情況使用合適的上拉電阻。
                        
                                                        
                        
圖2-2 DHT11典型應(yīng)用電路
                        
(3)數(shù)據(jù)幀的描述:
                        
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時(shí)間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說(shuō)明,當(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ù)
                        
數(shù)據(jù)傳送正確時(shí)校驗(yàn)和數(shù)據(jù)等于“8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)”所得結(jié)果的末8位。
                        
(4)電氣特性:VDD=5V,T = 25℃,除非特殊標(biāo)注
                        
表2-1 DHT11的電氣特性
                        
參數(shù)
條件
Min
typ
max
單位
供電
DC
3
5
5.5
V
供電電流
測(cè)量
0.5

2.5
mA
平均
0.2

1
mA
待機(jī)
100

150
uA
采樣周期
1


                        :采樣周期間隔不得低于1秒鐘。
                        
(5)時(shí)序描述:
                        
用戶MCU發(fā)送一次開(kāi)始信號(hào)后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機(jī)開(kāi)始信號(hào)結(jié)束后,DHT11發(fā)送響應(yīng)信號(hào),送出40bit的數(shù)據(jù),并觸發(fā)一次信號(hào)采集,用戶可選擇讀取部分?jǐn)?shù)據(jù).從模式下,DHT11接收到開(kāi)始信號(hào)觸發(fā)一次溫濕度采集,如果沒(méi)有接收到主機(jī)發(fā)送開(kāi)始信號(hào),DHT11不會(huì)主動(dòng)進(jìn)行溫濕度采集.采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。
                        
通訊過(guò)程如下圖2-3所示:
                        
                                                        
                        
圖2-3通訊過(guò)程圖
                        
總線空閑狀態(tài)為高電平,主機(jī)把總線拉低等待DHT11響應(yīng),主機(jī)把總線拉低必須大于18毫秒,保證DHT11能檢測(cè)到起始信號(hào)。DHT11接收到主機(jī)的開(kāi)始信號(hào)后,等待主機(jī)開(kāi)始信號(hào)結(jié)束,然后發(fā)送80us低電平響應(yīng)信號(hào).主機(jī)發(fā)送開(kāi)始信號(hào)結(jié)束后,延時(shí)等待20-40us后, 讀取DHT11的響應(yīng)信號(hào),主機(jī)發(fā)送開(kāi)始信號(hào)后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。
                        
                                                        
                        
圖2-4通訊初始化要求圖
                           
                        
總線為低電平,說(shuō)明DHT11發(fā)送響應(yīng)信號(hào),DHT11發(fā)送響應(yīng)信號(hào)后,再把總線拉高80us,準(zhǔn)備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時(shí)隙開(kāi)始,高電平的長(zhǎng)短定了數(shù)據(jù)位是0還是1.格式見(jiàn)下面圖示.如果讀取響應(yīng)信號(hào)為高電平,則DHT11沒(méi)有響應(yīng),請(qǐng)檢查線路是否連接正常.當(dāng)最后一bit數(shù)據(jù)傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進(jìn)入空閑狀態(tài)。
                        
數(shù)字0信號(hào)表示方法如下圖2-5所示:
                        
                                                        
                        
圖2-5數(shù)字0信號(hào)電平變化圖
                        
數(shù)字1信號(hào)表示方法如下圖2-6所示
                        
                                                        
                        
2-6數(shù)字1數(shù)據(jù)線電平變化圖
                        
2.2.2 DHT11傳感器模塊電路設(shè)計(jì)
                        
DHT11傳感器連接單片機(jī)相對(duì)比較簡(jiǎn)單。單片機(jī)的P2.0口用來(lái)發(fā)收串行數(shù)據(jù),即數(shù)據(jù)口。連接傳感器的Pin2(單總線,串行數(shù)據(jù))。由于測(cè)量范圍電路小于20米,加一個(gè)5K的上拉電阻,因此在傳感器的Pin2口與電源之間連接一個(gè)5K電阻。而傳感器的電源端口Pin1和Pin4分別接單片機(jī)的VDD和GND端。傳感器的第三腳懸浮放置。DHT11傳感器原件的電路原理圖如下2-7所示:
                                    
                        
                        
圖2-7 DHT11電路原理圖
                        
2.3 1602液晶顯示模塊設(shè)計(jì)
                        
2.3.1 1602液晶顯示屏簡(jiǎn)介
                        
1602液晶 是一種工業(yè)字符型液晶,能夠同時(shí)顯示16x02 即32個(gè)字符。(16列2行)。在日常生活中,我們對(duì)液晶顯示器并不陌生。液晶顯示模塊已作為很多電子產(chǎn)品的通過(guò)器件,如在計(jì)算器、萬(wàn)用表、電子表及很多家用電子產(chǎn)品中都可以看到,顯示的主要是數(shù)字、專用符號(hào)和圖形。在單片機(jī)的人機(jī)交流界面中,一般的輸出方式有以下幾種:發(fā)光管、LED數(shù)碼管、液晶顯示器。發(fā)光管和LED數(shù)碼管比較常用,軟硬件都比較簡(jiǎn)單。
                        
                                                        
                        
圖2-8 液晶屏正面
                        
                        2.3.2 1602液晶顯示模塊
                        
液晶顯示的原理是利用液晶的物理特性, 通過(guò)電壓對(duì)其顯示區(qū)域進(jìn)行控制,有電就有顯示,這樣即可以顯示出圖形。液晶顯示器具有厚度薄、適用于大規(guī)模集成電路直接驅(qū)動(dòng)、易于實(shí)現(xiàn)全彩色顯示的特點(diǎn),目前已經(jīng)被廣泛應(yīng)用在便攜式電腦、數(shù)字?jǐn)z像機(jī)、PDA移動(dòng)通信工具等眾多領(lǐng)域。
                        
其中Vo腳,即第三引腳加了一個(gè)10K的滑動(dòng)變阻器,該變阻器的目的是調(diào)節(jié)液晶的顯示對(duì)比度,通過(guò)調(diào)節(jié)滑阻改變Vo的電壓值,從而使液晶顯示在最清晰的狀態(tài)。
                        
                                                        
                        
                        
2-9 1602顯示模塊原理圖
                        
2.4  閾值設(shè)置模塊
                                                                                    從左圖可以看到。從上到下依次設(shè)為K1、K2和K3三個(gè)按鍵,其連接單片機(jī)引腳分別是P2.1~P2.3三個(gè)引腳。
                                                    根據(jù)該模塊使得閾值設(shè)置分為三個(gè)模塊,分別是濕度設(shè)置模式、溫度設(shè)置模式和關(guān)閾值顯示模式。K1為模式選擇鍵,按一次為濕度設(shè)置模式,按兩次是溫度設(shè)置模式,按三次是關(guān)閾值顯示模式。K2和K3只有在濕度和溫度設(shè)置模式下才有效,分別為閾值增加和閾值減小。
                                                    閾值設(shè)置模塊是后來(lái)加進(jìn)來(lái)的部分,設(shè)置非常人性化,一般人都可以操作,而不用每次設(shè)置閾值都到程序里邊去設(shè)置
                        
                        
                        
                        
                        
圖2—10 閾值設(shè)置模塊原理圖
                        
2.5 報(bào)警模塊
                        
                                                        
                        
圖2-11 蜂鳴器原理圖
                        
                                                    系統(tǒng)在設(shè)計(jì)時(shí)候采用的是有源蜂鳴器,只要給蜂鳴器一定的電流值,蜂鳴器就可以按照一定的頻率發(fā)聲,但是單片機(jī)引腳的驅(qū)動(dòng)電流比較小,不足以驅(qū)動(dòng)蜂鳴器工作,因此采用了一個(gè)NPN的三極管C9013來(lái)驅(qū)動(dòng)。
                        

第3章 系統(tǒng)軟件設(shè)計(jì)
                        
在對(duì)我們所要設(shè)計(jì)的課題有了整體的了解之后,需要先建立程序框架的流程圖,對(duì)整個(gè)設(shè)計(jì)劃分模塊,逐個(gè)模塊實(shí)現(xiàn)其功能,最終把各個(gè)子模塊合理的連接起來(lái),構(gòu)成總的程序。
                        
                                                        
                        
3-1 主程序流程圖
                        
                        
                        
3.1 1602液晶顯示模塊程序設(shè)計(jì)
                        
液晶顯示模塊是一個(gè)慢顯示器件,在執(zhí)行每條指令之前要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,則此指令失效,要顯示字符時(shí)要先輸入顯示字符地址,告訴模塊在哪里現(xiàn)實(shí)了字符。1602液晶顯示模塊可與單片機(jī)接口直接連接,無(wú)需再加驅(qū)動(dòng)。
                        
軟件流程圖及調(diào)試結(jié)果如圖3-2所示。
                        
                                                                      
                        
3-2 1602液晶顯示模塊程序流程圖及液晶調(diào)試結(jié)果顯示
                        
                        
3.2 傳感器模塊程序設(shè)計(jì)
                        
溫濕度模塊DH11數(shù)字溫濕傳感器加濕器溫濕度傳感器隨著科技的不斷發(fā)展,汽車、空調(diào)、除濕器、烘干機(jī)等種類繁多的電器都已進(jìn)入人們的日常生活,而這些電器設(shè)備很多都離不開(kāi)對(duì)溫度、濕度等環(huán)境因素的要求。因此,溫度、濕度傳感器用途越來(lái)越廣泛。新一代的數(shù)字傳感器不再需要外置的A D轉(zhuǎn)換模塊,并具有標(biāo)準(zhǔn)接口,使用方便,得到了越來(lái)越多的應(yīng)用。DHT11作為一種新型的單總線溫濕度數(shù)字傳感器,具有更多的優(yōu)點(diǎn),它使系統(tǒng)設(shè)計(jì)更加簡(jiǎn)單,控制方便,易于實(shí)現(xiàn)。
                        
DHT11傳感器模塊的軟件流程圖及實(shí)物調(diào)試結(jié)果如圖3-3.1和圖3-3.2所示。
                        
                        
圖 3-3.1 DHT11傳感器模塊程序流程圖
                                                                                
                        
圖 3-3.1 DHT11傳感器模塊實(shí)物調(diào)試結(jié)果
                        
第4章 系統(tǒng)分析與調(diào)試
                        
4.1 程序下載軟件說(shuō)明
                        
本設(shè)計(jì)是在Keil C環(huán)境下開(kāi)發(fā)的,Keil C軟件支持C語(yǔ)言的編程及調(diào)試,運(yùn)用方便,當(dāng)需要編程時(shí)這就是是做課程設(shè)計(jì)的首選。Keil C是我們比較熟悉的軟件了,直接就可以使用,進(jìn)行程序的編寫(xiě),生成十六進(jìn)制文件以備燒寫(xiě)用。
                        
                                程序燒寫(xiě)使用的是Easy 51Pro中的并行數(shù)據(jù)燒寫(xiě)模式進(jìn)行燒寫(xiě)。軟件運(yùn)行界面如圖4—1所示。
                        
                        
圖4-1 程序燒寫(xiě)軟件運(yùn)行界面圖
                        
在完成對(duì)程序的調(diào)試及燒錄之后,還需要對(duì)其進(jìn)行演示,把開(kāi)發(fā)板與電腦連上,設(shè)置好對(duì)應(yīng)的接口,完成供電及下載。下載完畢,連接好各引腳連線,并開(kāi)始供電后、稍帶幾秒等1602液晶屏能正常顯示當(dāng)前溫濕度了之后。觀察當(dāng)前溫濕度的變化。并且針對(duì)與自己設(shè)定的限值相比較。若當(dāng)前溫度沒(méi)有超標(biāo),即沒(méi)有超過(guò)限值?梢杂檬治孀HT11傳感器,令其溫度的顯示超標(biāo)。測(cè)試能否達(dá)到報(bào)警,經(jīng)過(guò)測(cè)試,完全可行。因而簡(jiǎn)單的實(shí)現(xiàn)了對(duì)溫度的控制。濕度控制原理跟溫度一樣。
                        
4.2 所遇問(wèn)題及解決辦法
                        
4.2.1硬件問(wèn)題及解決方法
                                                    硬件和軟件方面的問(wèn)題相對(duì)來(lái)說(shuō)硬件解決得是比較快的一類問(wèn)題,因?yàn)檫@比較容易檢查不來(lái)錯(cuò)誤。
                                                    1. 單片機(jī)EA端沒(méi)接高電平。
                        
液晶仿真完成以后,這是剛在實(shí)物板上開(kāi)始調(diào)試的時(shí)候犯的第一個(gè)很低級(jí)的錯(cuò)誤。當(dāng)然這個(gè)問(wèn)題首先要?dú)w結(jié)為不是我們做的最小系統(tǒng),因此沒(méi)有顧及到這個(gè)問(wèn)題,這導(dǎo)致了我們?cè)诜抡鏁r(shí)候好用的程序在實(shí)物板上偶爾會(huì)好用一次。
                                                    最后在老師的點(diǎn)撥下,我們找到了這個(gè)原因,以后上電的時(shí)候單片機(jī)就可以實(shí)現(xiàn)自動(dòng)啟動(dòng)工作,而且讀程序的時(shí)候每次都是從片內(nèi)的最低位開(kāi)始執(zhí)行。
                                                    2. 蜂鳴器不響。
                        
后來(lái)在加了報(bào)警裝置的時(shí)候,沒(méi)有問(wèn)老師我們拿的蜂鳴器是有源還是無(wú)源,這樣子這個(gè)問(wèn)題友困擾了我們一小段時(shí)間。當(dāng)時(shí)以為是無(wú)源的,就用了高低電平來(lái)驅(qū)動(dòng),而且還測(cè)試了控制引腳輸出電壓的變化,最終沒(méi)有響。后來(lái)無(wú)意間將蜂鳴器直接連接正負(fù)極,竟然發(fā)聲了,此時(shí)才意識(shí)到我們忽略了它是有源蜂鳴器。
                                                    但是并沒(méi)有就此解決了該問(wèn)題,因?yàn)閱螁问欠澍Q器的引腳輸出電流還不足以驅(qū)動(dòng)蜂鳴器,后來(lái)又加了一個(gè)NPN的三極管來(lái)驅(qū)動(dòng)蜂鳴器。但是在P2.7接口那里加的電阻比較小的時(shí)候還是不能驅(qū)動(dòng),這可能是因?yàn)殡娮杼∈沟勉Q位電壓太低了。最開(kāi)始用的2K的電阻,但是蜂鳴器不能響,換成10K電阻以后蜂鳴器能吱吱的響,但不連續(xù),最后換成24K以后再接上單片機(jī)控制端以后就能夠自如的驅(qū)動(dòng)蜂鳴器發(fā)聲了。
                        
4.2.2軟件所遇問(wèn)題及解決方法
                        
                            本次課程設(shè)計(jì)可以說(shuō)大部分時(shí)間都花在了軟件調(diào)試上了,軟件調(diào)試的時(shí)候畢竟不像硬件那么直觀,對(duì)我們來(lái)說(shuō)是個(gè)瓶頸,需要我們?nèi)ネ黄扑?/div>                        
1.下載程序的時(shí)候,對(duì)此次的燒寫(xiě)軟件Easy 51Pro不熟悉。
                        
以前沒(méi)使用過(guò)該軟件,下載的時(shí)候很容易就出問(wèn)題了。當(dāng)然解決該問(wèn)題也就顯得是最簡(jiǎn)單的了,直接找了老師,然后老師來(lái)給我們演示了一次,這樣問(wèn)題就解決了。
                        
2. 顯示結(jié)果不穩(wěn)定,一直在很快地變化。
                        
由于剛開(kāi)始的時(shí)候程序里邊一直是在采集數(shù)據(jù)然后顯示,單片機(jī)一直做這個(gè)事,這樣就會(huì)導(dǎo)致顯示不穩(wěn)定,尤其是濕度變化特別快,基本上穩(wěn)定不了。
                        
當(dāng)然解決問(wèn)題的方法就是隔固定時(shí)間以后采集一次,而不是一直采集。剛開(kāi)始的時(shí)候想的是用延時(shí)程序來(lái)做,因?yàn)檫@樣思想比較簡(jiǎn)單,但是這樣的弊端同時(shí)也顯現(xiàn)出來(lái)了,那就是他占用單片機(jī)資源,使得單片機(jī)始終在執(zhí)行無(wú)用的語(yǔ)句來(lái)耗時(shí),所以最后跟閾值設(shè)置模塊結(jié)合考慮以后用了定時(shí)器來(lái)實(shí)現(xiàn)5s的定時(shí)。
                        
3.閾值設(shè)置模塊加了按鍵以后按鍵始終不能按預(yù)期效果工作。
                        
剛開(kāi)始還以為是硬件部分沒(méi)有連接好,于是用萬(wàn)用表查了很久,但是電平變化都是正確的。在掙扎了一整下午以后晚上回到宿舍依然在想這個(gè)問(wèn)題,主要是這個(gè)在仿真上邊可以用,但是實(shí)物的時(shí)候就不好用,所以我們都以為是硬件出問(wèn)題了。但是在第二天上午的時(shí)候我發(fā)現(xiàn)當(dāng)按鍵時(shí)間比較長(zhǎng)的時(shí)候,比如6s左右,單片機(jī)還是可以讀出按鍵的,瞬間就想到了,原來(lái)我們的程序里邊單片機(jī)不是一直在掃描鍵盤(pán),而是只有一句話在執(zhí)行掃描,這樣按鍵好用比中五百萬(wàn)都難。
                        
找到問(wèn)題了解決起來(lái)也就容易多了,后來(lái)當(dāng)單片機(jī)在那五秒定時(shí)里邊讓單片機(jī)始終掃描鍵盤(pán),這樣絕大部分時(shí)間按鍵就都是有效的了。
                        

第5章 結(jié)論與展望
                        
在這短短幾天時(shí)間里自己最大的感受就是:仿真和實(shí)物真的有很大的差別。同樣的程序仿真時(shí)候能用但是實(shí)物板上卻不能用,后來(lái)分析其實(shí)本來(lái)也是不能用的,但是仿真卻給了我們一個(gè)錯(cuò)誤的結(jié)果顯示,只能說(shuō)明仿真只是仿真而已,只能作為我們的一個(gè)參考罷了。
                        
經(jīng)過(guò)近兩周的奮斗,從拿到題目,到后來(lái)查找資料,理論學(xué)習(xí),實(shí)驗(yàn)編程調(diào)試,這一切都使我的理論知識(shí)和動(dòng)手能力有了很大的提高。了解了單片機(jī)的硬件結(jié)構(gòu)和軟件編程方法,對(duì)單片機(jī)的工作方式有了很大的認(rèn)知。同時(shí),對(duì)一些外圍設(shè)備比如傳感器、液晶屏、鍵盤(pán)、蜂鳴器等有了一定的了解!
                        
但因?yàn)槲覀兊乃接邢,此設(shè)計(jì)中也存在一定的不足。比如溫濕度的精度是比較低的,這個(gè)跟傳感器也有一定的關(guān)系,還有就是硬件的布局設(shè)計(jì)業(yè)不夠美觀,以后有機(jī)會(huì)應(yīng)該自己做印刷板然后再美化電路板就比較完美了。
                        
溫濕度控制已經(jīng)成為了21世紀(jì)熱門(mén)研究話題之一。無(wú)論是從生產(chǎn)還是生活,與我們?nèi)祟惗际窍⑾⑾嚓P(guān)的。而智能化的控制溫濕度已經(jīng)發(fā)展成為一種必然。隨著世界經(jīng)濟(jì)的發(fā)展,人們生活水平的提高以及社會(huì)的進(jìn)步。我們不可能一直墨守陳規(guī),不能在恪守以前利用人力資源來(lái)控制溫濕度的方法。不僅浪費(fèi)大量的人力資源、財(cái)力資源,并且控制系統(tǒng)也更加單一化。而采用自動(dòng)控制的辦法、既節(jié)省了人力資源,更體現(xiàn)了與時(shí)俱進(jìn)的思想、世界在進(jìn)步、而這種進(jìn)步就該體現(xiàn)在各個(gè)方面。
                        

附錄
                        
附錄A 硬件原理圖
                        
附錄B 最終實(shí)物圖及簡(jiǎn)介
                        
                                
液晶前邊顯示的內(nèi)容為溫濕度的實(shí)時(shí)監(jiān)測(cè)顯示,上下兩行的各后2位為閾值顯示。
                        
中間三個(gè)按鍵分別為:最上邊那個(gè)是模式切換鍵,按1次是濕度調(diào)節(jié)模式,按2次是溫度調(diào)節(jié)模式,按三次試不顯示閾值,每次調(diào)節(jié)完畢立即生效。下邊兩個(gè)鍵分別為增加和減少閾值鍵。
                        
左下角的蜂鳴器是報(bào)警裝置。當(dāng)溫濕度只要有一個(gè)超出其閾值蜂鳴器就會(huì)報(bào)警,提醒人們做相應(yīng)措施。
                        
液晶前的滑動(dòng)變阻器為液晶對(duì)比度調(diào)節(jié)用的。
                        
附錄C 程序清單
  1. //****************************************************************//
  2. //單片機(jī) : AT89S52
  3. // 功能  :串口發(fā)送溫濕度數(shù)據(jù) 晶振 12M
  4. //硬件連接: P2.0口為通訊口連接DHT11,DHT11的電源和地連接單片機(jī)的電源和地。            
  5. //****************************************************************//
  6. 大連海事大學(xué)自動(dòng)化專業(yè)課程設(shè)計(jì)
  7. #include <reg52.h>
  8. #define LCD_DB P1
  9. unsigned char s1[5];
  10. unsigned char s2[5];
  11. sbit LCD_RS=P2^4;
  12. sbit LCD_RW=P2^5;
  13. sbit LCD_E=P2^6;
  14. sbit P2_0 = P2^0;
  15. sbit moshi=P2^1;
  16. sbit INC=P2^2;
  17. sbit DEC=P2^3;
  18. sbit SPK=P2^7;
  19. /******定義函數(shù)****************/
  20. #define uchar unsigned char
  21. #define uint unsigned int
  22. typedef unsigned char  U8;      
  23. /*   無(wú)符號(hào)8位整型變量    */
  24. typedef unsigned int   U16;   
  25. /*                 無(wú)符號(hào)16位整型變量 */
  26. uchar count1=70,count2=35;
  27. uchar moshicount=0;
  28. uchar TD=0;//定時(shí)次數(shù)

  29. U8  U8FLAG;
  30. U8  U8count,U8temp;
  31. U8  U8T_data_H,U8T_data_L,U8RH_data_H,
  32. U8RH_data_L,U8checkdata;
  33. U8  U8T_data_H_temp,U8T_data_L_temp,
  34. U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  35. U8  U8comdata;
  36. void LCD_init(void);//初始化函數(shù)
  37. void LCD_write_command(uchar command); //寫(xiě)指令函數(shù)
  38. void LCD_write_data(uchar dat);
  39. //寫(xiě)數(shù)據(jù)函數(shù)
  40. void LCD_disp_char(uchar x,
  41. uchar y,uchar dat);
  42. //在某個(gè)屏幕位置上顯示一個(gè)字符,X(0-16),y(1-2)
  43. void delay_n40us(uint n);//延時(shí)函數(shù)
  44. //********************************
  45. //*******液晶初始化函數(shù)***************
  46. void LCD_init(void)
  47. {
  48.               LCD_write_command(0x38);
  49. //設(shè)置 8 位格式,2 行,5x7
  50.               LCD_write_command(0x0c);
  51. //整體顯示,關(guān)光標(biāo),不閃爍
  52.               LCD_write_command(0x06);
  53. //設(shè)定輸入方式,增量不移位
  54.               LCD_write_command(0x03);
  55. //清除屏幕顯示
  56.               delay_n40us(100);
  57. }
  58. //********************************

  59. //*******定時(shí)器初始化函數(shù)**********
  60. void timerinit()
  61. {
  62.               TMOD=0x01;
  63.               TH0=-50000/256;
  64.               TL0=-50000%256;
  65.               EA=1;
  66.               ET0=1;
  67. }
  68. //********************************

  69. //********寫(xiě)指令函數(shù)************
  70. void LCD_write_command(uchar dat)
  71. {
  72.               LCD_DB=dat;
  73.               LCD_RS=0;//指令
  74.               LCD_RW=0;//寫(xiě)入
  75.               LCD_E=1;//允許
  76.               delay_n40us(1);
  77.               LCD_E=0;
  78.               delay_n40us(1);
  79. }
  80. //*******************************
  81. //********寫(xiě)數(shù)據(jù)函數(shù)*************
  82. void LCD_write_data(uchar dat)
  83. {
  84.               LCD_DB=dat;
  85.               LCD_RS=1;//數(shù)據(jù)
  86.               LCD_RW=0;//寫(xiě)入
  87.               LCD_E=1;//允許
  88.               delay_n40us(1);
  89.               LCD_E=0;
  90.               delay_n40us(1);            
  91. }
  92. //********************************
  93. //*******顯示一個(gè)字符函數(shù)*********
  94. void LCD_disp_char(uchar x,
  95. uchar y,uchar dat)
  96. {
  97.               uchar address;
  98.               if(y==1)
  99.                               address=0x80+x;
  100.               else
  101.                               address=0xc0+x;
  102.               LCD_write_command(address);
  103.               LCD_write_data(dat);
  104. }
  105. //********************************
  106. //********延時(shí)函數(shù)***************
  107. void delay_n40us(uint n)
  108. {              
  109.               uint i;
  110.               uchar j;                        
  111.               for(i=n;i>0;i--)
  112.                               for(j=0;j<2;j++);
  113. }
  114. void  Delay_10us(void)
  115. {
  116.    U8 i;
  117.    i--;
  118.     i--;
  119.     i--;
  120.     i--;
  121.     i--;
  122.     i--;
  123. }
  124. void Delay(U16 j)
  125. {     
  126.                             U8 i;
  127.                 for(;j>0;j--)            
  128.                                for(i=0;i<27;i++);
  129. }

  130. //*******一字節(jié)數(shù)據(jù)傳送函數(shù)*********
  131. void  COM(void)
  132. {
  133.     U8 i;
  134.      for(i=0;i<8;i++)               
  135.                  {
  136.                                  U8FLAG=2;            
  137.                                   while((!P2_0)&&U8FLAG++);
  138.                                              Delay_10us();
  139.                                 Delay_10us();
  140.                                              Delay_10us();
  141.                                             U8temp=0;
  142.                      if(P2_0)U8temp=1;
  143.                                  U8FLAG=2;
  144.                                  while((P2_0)&&U8FLAG++);
  145.                                    //超時(shí)則跳出for循環(huán)                             
  146.                                   if(U8FLAG==1)break;
  147.                                    //判斷數(shù)據(jù)位是0還是1            
  148. // 如果高電平高過(guò)預(yù)定0高電平值則數(shù)據(jù)位為 1
  149.                                   U8comdata<<=1;
  150.                                  U8comdata|=U8temp;      
  151.                   }
  152. }

  153. *******單片機(jī)與傳感器通信函數(shù)*********
  154. void RH(void)
  155. {
  156.               //主機(jī)拉低18ms
  157.      P2_0=0;
  158.                  Delay(180);
  159.                  P2_0=1;
  160. //總線由上拉電阻拉高 主機(jī)延時(shí)20us
  161.                  Delay_10us();
  162.                  Delay_10us();
  163.                  Delay_10us();
  164.                  Delay_10us();
  165.               //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)      
  166.                  P2_0=1;
  167.               //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行               
  168.                  if(!P2_0)                            //T !               
  169.                  {
  170.                     U8FLAG=2;
  171.               //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束                  
  172.                     while((!P2_0)&&U8FLAG++);
  173.                     U8FLAG=2;
  174.               //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)              
  175.                      while((P2_0)&&U8FLAG++);
  176.                     //數(shù)據(jù)接收狀態(tài)                           
  177.                     COM();
  178.                     U8RH_data_H_temp=U8comdata;
  179.                     COM();
  180.                      U8RH_data_L_temp=U8comdata;
  181.                      COM();
  182.                      U8T_data_H_temp=U8comdata;
  183.                      COM();
  184.                      U8T_data_L_temp=U8comdata;
  185.                      COM();
  186.                      U8checkdata_temp=U8comdata;
  187.                     P2_0=1;
  188.               //數(shù)據(jù)校驗(yàn)                U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  189.                  if(U8temp==U8checkdata_temp)
  190.                  {                                 
  191. U8RH_data_H=U8RH_data_H_temp;                      U8RH_data_L=U8RH_data_L_temp;
  192.                               U8T_data_H=U8T_data_H_temp;
  193.                                  U8T_data_L=U8T_data_L_temp;
  194.                                  U8checkdata=U8checkdata_temp;
  195.                  }
  196.     //濕度整數(shù)部分   
  197. s1[0] = (char)(0X30+U8RH_data_H/10);
  198.    s1[1] = (char)(0X30+U8RH_data_H%10);   
  199.    //濕度小數(shù)部分
  200.   s1[2] = (char)(0X30+U8RH_data_L/10);
  201.     //溫度整數(shù)部分        
  202.   s2[0] = (char)(0X30+U8T_data_H/10);
  203.   s2[1] = (char)(0X30+U8T_data_H%10);      
  204.    //溫度小數(shù)部分            
  205.   s2[2] = (char)(0X30+U8T_data_L/10);
  206. }
  207. }
  208. //*******************************

  209. //液晶顯示函數(shù)
  210. void disp()
  211. {
  212.                             LCD_disp_char(0,1,'s');
  213.                             LCD_disp_char(1,1,'h');
  214.                             LCD_disp_char(2,1,'i');
  215.                             LCD_disp_char(3,1,'d');
  216.                             LCD_disp_char(4,1,'u');
  217.                             LCD_disp_char(5,1,':');
  218.                             LCD_disp_char(6,1,s1[0]);
  219.                             LCD_disp_char(7,1,s1[1]);
  220.                             LCD_disp_char(8,1,'.');
  221.                             LCD_disp_char(9,1,s1[2]);
  222.     LCD_disp_char(10,1,'%');
  223.      LCD_disp_char(11,1,'R');
  224.     LCD_disp_char(12,1,'H');

  225.                             LCD_disp_char(0,2,'w');
  226.                             LCD_disp_char(1,2,'e');
  227.                             LCD_disp_char(2,2,'n');
  228.                             LCD_disp_char(3,2,'d');
  229.                             LCD_disp_char(4,2,'u');
  230.                             LCD_disp_char(5,2,':');
  231.                             LCD_disp_char(6,2,s2[0]);
  232.                             LCD_disp_char(7,2,s2[1]);
  233.                             LCD_disp_char(8,2,'.');
  234.                             LCD_disp_char(9,2,s2[2]);
  235.                             LCD_disp_char(10,2,0xDF);
  236.                  LCD_disp_char(11,2,'C');
  237. }
  238. //閾值設(shè)置函數(shù)
  239. void shezhi()
  240. {
  241. //初值
  242. s1[3] = (char)(0X30+count1/10);
  243.                 s1[4] = (char)(0X30+count1%10);
  244.                 //初值
  245.                 s2[3] = (char)(0X30+count2/10);
  246.                 s2[4] = (char)(0X30+count2%10);
  247.   moshi=1;
  248.                 if(moshi==0)
  249.                 {
  250.                                Delay_10us();
  251.                                while(moshi==0);
  252.                                moshicount++;
  253.                  }
  254.                  switch(moshicount)
  255.                  {
  256.                                case 1:
  257.                                {
  258.                                               INC=1;DEC=1;
  259.                                               if(INC==0)
  260.                                               {
  261.                                                              Delay_10us();
  262.                                                              while(INC==0);
  263.                                                              count1++;
  264.                                                }
  265.                                                else if(DEC==0)
  266.                                                {
  267.                                                               Delay_10us();
  268.                                                               while(DEC==0);
  269.                                                               count1--;
  270.                                                 }
  271.                        LCD_disp_char(14,1,s1[3]);
  272.                        LCD_disp_char(15,1,s1[4]);
  273.                                               LCD_disp_char(14,2,s2[3]);
  274.                                               LCD_disp_char(15,2,s2[4]);
  275.                                 }break;
  276.                                 case 2:
  277.                                 {
  278.                                                 //moshicount=0;
  279.                                                 INC=1;DEC=1;
  280.                                                 if(INC==0)
  281.                                                 {
  282.                                                                Delay_10us();
  283.                                                                while(INC==0);
  284.                                                                count2++;
  285.                                                   }
  286.                                                   else if(DEC==0)
  287.                                                   {
  288.                                                                   Delay_10us();
  289.                                                                   while(DEC==0);
  290.                                                                   count2--;
  291.                                                    }
  292.                        LCD_disp_char(14,1,s1[3]);
  293.                       LCD_disp_char(15,1,s1[4]);
  294.                                                LCD_disp_char(14,2,s2[3]);
  295.                                                LCD_disp_char(15,2,s2[4]);
  296.                                 }break;
  297.                                 case 3:
  298.                                 {
  299.                                                moshicount=0;            
  300.                        LCD_disp_char(14,1,' ');
  301.                        LCD_disp_char(15,1,' ');
  302.                                               LCD_disp_char(14,2,' ');
  303.                                               LCD_disp_char(15,2,' ');
  304.                                  }break;
  305.                             default :break;
  306.               }
  307. }
  308. //蜂鳴器報(bào)警程序
  309. void laba()
  310. ……………………

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

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


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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