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

QQ登錄

只需一步,快速開始

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

51單片機(jī)+DHT11的恒溫控制系統(tǒng)資料+程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:702467 發(fā)表于 2020-5-12 18:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
   溫度和濕度是兩個(gè)基本的環(huán)境參數(shù)。在我們的生活中,我們要時(shí)刻關(guān)心環(huán)境的變化,只有很好的把握好環(huán)境的差異變化,我們才能更好的生存與發(fā)展。比如說在一些養(yǎng)殖廠,牲畜的成長(zhǎng),和溫濕度是離不開的,它們只有在適宜的環(huán)境下,在適宜的溫度和濕度下,才能成長(zhǎng)的更快,我們才能獲取更大的效益。準(zhǔn)確測(cè)量溫濕度在生物藥學(xué)、食品加工、造紙業(yè)等行業(yè)更是至關(guān)重要。總之,無論在日常生活中還是在工業(yè)、農(nóng)業(yè)方面都離不開對(duì)周圍環(huán)境溫濕度的測(cè)量。因此,研究溫濕度的控制和測(cè)量具有非常重要的意義。
由于傳感器能將各種物理量、化學(xué)量和生物量等信號(hào)轉(zhuǎn)變?yōu)殡娦盘?hào),使得人們可以利用計(jì)算機(jī)實(shí)現(xiàn)自動(dòng)測(cè)量、信息處理和自動(dòng)控制。傳感器主要用于測(cè)量和控制系統(tǒng),它的性能好壞直接影響系統(tǒng)的性能。因此我們必須掌握各種傳感器的結(jié)構(gòu)、原理及其性能指標(biāo),通過對(duì)傳感器實(shí)例的分析了解,才能將傳感器和信息通信和信息處理結(jié)合起來,適應(yīng)傳感器的生產(chǎn)、研制和開發(fā)及應(yīng)用。溫濕度傳感器發(fā)展速度快,應(yīng)用領(lǐng)域也很廣泛,并且還有很大發(fā)展?jié)摿,為了提高?duì)傳感器的認(rèn)識(shí)和了解,尤其是對(duì)溫濕度傳感器的深入研究,基于實(shí)時(shí)、準(zhǔn)確和廣泛的原則進(jìn)行了設(shè)計(jì)。
本文設(shè)計(jì)的是基于單片機(jī)AT89C51的溫濕度檢測(cè)和控制系統(tǒng),主要以廣泛應(yīng)用的DHT11溫濕度傳感器作為溫度和濕度數(shù)據(jù)的采集,該傳感器具有測(cè)量精度高、硬件電路簡(jiǎn)單、數(shù)據(jù)傳輸方便,可測(cè)試不同環(huán)境溫濕度的特點(diǎn)。另外和控制電路相連,可以進(jìn)行閾值的控制,使溫度和濕度參數(shù)在預(yù)先設(shè)定的范圍內(nèi),不需要人的直接參與。

空氣中的水蒸汽吸附在感濕材料上后,元件的阻抗、介質(zhì)常數(shù)發(fā)生很大的變化,從而制成濕敏元件。近年來,國(guó)內(nèi)外在濕度傳感器研發(fā)領(lǐng)域取得了較大的發(fā)展。濕敏傳感器正從簡(jiǎn)單的濕敏元件向集成化、智能化、多參數(shù)檢測(cè)的方向迅速發(fā)展。國(guó)內(nèi)外各廠家的濕度傳感器產(chǎn)品水平不一,質(zhì)量?jī)r(jià)格都相差較大,用戶如何選擇性能價(jià)格比最優(yōu)的理想產(chǎn)品確有一定難度,需要在這方面作深入的了解,F(xiàn)在國(guó)內(nèi)市場(chǎng)上出現(xiàn)了不少國(guó)內(nèi)外濕度傳感器產(chǎn)品,電容式高分子聚合物,氯化鋰和金屬氧化物。
    測(cè)量溫濕度的關(guān)鍵是溫濕度傳感器。過去測(cè)量溫度與濕度是分開的。隨著技術(shù)的進(jìn)步和人們生活的需要出現(xiàn)了溫濕度共測(cè)的傳感器。溫度傳感器的發(fā)展經(jīng)歷了3個(gè)階段:傳統(tǒng)的分立式溫度傳感器、模擬集成溫度傳感器、智能集成溫度傳感器。目前,國(guó)際上新型溫度傳感器正從模擬式向數(shù)字式、從集成化向智能化、網(wǎng)絡(luò)化的方向發(fā)展。溫濕度傳感器也是經(jīng)歷了這樣一個(gè)階段逐漸走向數(shù)字智能化。
溫濕度檢測(cè)系統(tǒng)在國(guó)內(nèi)各行業(yè)的發(fā)展水平仍然不高,雖然應(yīng)用已經(jīng)十分廣泛,但從國(guó)內(nèi)生產(chǎn)的溫濕度檢測(cè)器來講發(fā)展水平仍然不高,同日本、美國(guó)、德國(guó)等先進(jìn)國(guó)家相比,仍然有著較大的差距。
進(jìn)入21世紀(jì)后,特別在我國(guó)加入WTO后,國(guó)內(nèi)產(chǎn)品面臨巨大挑戰(zhàn)。各行業(yè)特別是傳統(tǒng)產(chǎn)業(yè)都急切需要應(yīng)用電子技術(shù)、自動(dòng)控制技術(shù)進(jìn)行改造和提高。例如紡織業(yè),溫濕度是影響紡織品質(zhì)量的重要因素,但紡織企業(yè)對(duì)溫濕度的控制手段仍很粗糙,十分落后,絕大多數(shù)仍然在使用干濕球溫度計(jì),采用人工觀測(cè),人工調(diào)節(jié)閥門、風(fēng)機(jī)的方法,其控制效果可想而知。制藥行業(yè)里也基本如此。在食品行業(yè)里,則基本上憑經(jīng)驗(yàn),很少有人使用溫濕度傳感器。
1.3 設(shè)計(jì)的市場(chǎng)現(xiàn)狀分析
縱觀市場(chǎng),溫濕度檢測(cè)技術(shù)已經(jīng)比較成熟,已有的各種溫濕度檢測(cè)產(chǎn)品,五花八門,如A2000家用溫濕度報(bào)警表、YD-808A工業(yè)用溫濕度顯示器等產(chǎn)品。 從功能上分析這些產(chǎn)品可以看出,一個(gè)比較完整的環(huán)境溫濕度檢測(cè)系統(tǒng)應(yīng)該具備以下主要的三個(gè)功能:
   (1)實(shí)時(shí)檢測(cè)出環(huán)境中的溫度和濕度參數(shù);
   (2)檢測(cè)的參數(shù)值顯示在顯示設(shè)備上(如數(shù)碼管,液晶顯示器等);
   (3)根據(jù)環(huán)境要求,設(shè)定溫度濕度報(bào)警的上下限值,并實(shí)時(shí)報(bào)警。
因此,本設(shè)計(jì)也應(yīng)該具備這些功能,并且對(duì)每一個(gè)部分進(jìn)行優(yōu)化設(shè)計(jì),也可以擴(kuò)展系統(tǒng)功能。
除了功能上的分析之外,再看這些產(chǎn)品還存在一個(gè)問題就是價(jià)格太高,不符合普通消費(fèi)者的消費(fèi)水平,如A2000家用溫濕度報(bào)警表,售價(jià)300元左右。
    綜上所述,本設(shè)計(jì)設(shè)計(jì)出的環(huán)境溫濕度檢測(cè)系統(tǒng),除了具備市場(chǎng)上已有產(chǎn)品的功能之外,還應(yīng)該盡量降低制作價(jià)格。
1.4 溫濕度檢測(cè)技術(shù)和存在的問題
傳統(tǒng)的溫度和濕度檢測(cè)系統(tǒng)主要有以下幾種:
   (1)水汽壓(e):是水汽在大氣總壓力中的分壓力。它表示了空氣中水汽的絕對(duì)含量的大小,以毫巴為單位;
   (2)相對(duì)濕度(rh):濕空氣中實(shí)際水汽壓e與同溫度下飽和水汽壓E的百分比,相對(duì)濕度的大小能直接表示空氣距離飽和的相對(duì)程度?諝馔耆稍飼r(shí),相對(duì)濕度為零。相對(duì)濕度越小,表示當(dāng)時(shí)空氣越干燥。當(dāng)相對(duì)濕度接近于100%時(shí),表示空氣很潮濕,越接近于飽和;
   (3)露點(diǎn)(或霜點(diǎn))溫度:指空氣在水汽含量和氣壓都不改變的條件下,冷卻到飽和時(shí)的溫度;
   (4)干濕球溫度表:用一對(duì)并列裝置的、形狀完全相同的溫度表,一支測(cè)氣溫,稱干球溫度表,另一支包有保持浸透蒸餾水的脫脂紗布,稱濕球溫度表;
   (5)發(fā)濕度表(計(jì)):利用脫脂人發(fā)(或牛的腸衣)具有空氣潮濕時(shí)伸長(zhǎng),干燥時(shí)縮短的特性,制成毛發(fā)濕度表或濕度自記儀器,它的測(cè)濕精度較差,毛發(fā)濕度表通常在氣溫低于-10℃時(shí)使用;
   (6)電阻式濕度片:利用吸濕膜片隨濕度變化改變其電阻值的原理,常用的有碳膜濕敏電阻和氯化鋰濕度片兩種。前者用高分子聚合物和導(dǎo)電材料碳黑,加上粘合劑配成一定比例的膠狀液體,涂覆到基片上組成的電阻片;后者是在基片上涂上一層氯化鋰酒精溶液,當(dāng)空氣濕度變化時(shí),氯化鋰溶液濃度隨之改變從而也改變了測(cè)濕膜片的電阻;
   (7)薄膜濕敏電容:是以高分子聚合物為介質(zhì)的電容器,因吸收(或釋放)水汽而改變電容值。它制作精巧,性能優(yōu)良,常用在探空儀和遙測(cè)中。
隨著智能檢測(cè)系統(tǒng)的飛速發(fā)展,基于單片機(jī)的溫濕度檢測(cè)系統(tǒng)將多傳感器系統(tǒng)結(jié)合在一起。如何把多傳感器集中于一個(gè)檢測(cè)控制系統(tǒng),綜合利用來自多傳感器的信息,獲得對(duì)被測(cè)對(duì)象的可靠了解和解釋,以利于系統(tǒng)做出正確的響應(yīng)、決策和控制,是智能檢測(cè)控制系統(tǒng)中需要解決的首要問題。在溫濕度要求嚴(yán)格的場(chǎng)合,利用多傳感技術(shù)可以提高系統(tǒng)的可靠性和精度,亦可以提高系統(tǒng)的時(shí)間空間的覆蓋范圍。
1.5 設(shè)計(jì)內(nèi)容和預(yù)期結(jié)果
1.5.1 主要完成內(nèi)容
本文主要完成的內(nèi)容有:
(1) 確定系統(tǒng)的總體功能設(shè)計(jì)方案;
(2) 完成總體設(shè)計(jì)方案原理圖的繪制;
(3) 完成硬件電路的焊接及調(diào)試;
(4) 完成軟件系統(tǒng)的設(shè)計(jì)及編譯。
1.5.2 本文的設(shè)計(jì)思路
本文的設(shè)計(jì)目的是要對(duì)空氣中的溫度和濕度進(jìn)行檢測(cè)。系統(tǒng)的數(shù)據(jù)采集部分是溫濕度傳感器完成的,溫濕度傳感器將采集到的數(shù)據(jù)送入AT89C51單片機(jī)中,然后通過液晶顯示器LCD1602進(jìn)行顯示,單片機(jī)將預(yù)設(shè)的參考值與測(cè)量值進(jìn)行比較,根據(jù)比較結(jié)果作出判斷,當(dāng)溫濕度值超過允許的誤差范圍,系統(tǒng)將發(fā)出報(bào)警聲音。
(1)系統(tǒng)硬件設(shè)計(jì)
通過比較,選用AT89C51單片機(jī)來構(gòu)造本系統(tǒng)。在設(shè)計(jì)過程當(dāng)中,單片機(jī)的P0口用于液晶LCD1602顯示, P3.4、P3.5、P3.6、P3.7為獨(dú)立式鍵盤接口,P1.0口接溫濕度傳感器DHT11,P2.4口連接蜂鳴報(bào)警器。
(2)系統(tǒng)模塊設(shè)計(jì)
測(cè)控模塊:檢測(cè)所處環(huán)境的溫濕度數(shù)據(jù)。顯示模塊:溫度和濕度采用液晶顯示,分兩行顯示使測(cè)量結(jié)果更直觀,便于管理人員做出決策。報(bào)警模塊:系統(tǒng)采用三極管驅(qū)動(dòng)的蜂鳴音報(bào)警,當(dāng)溫濕度超過系統(tǒng)所設(shè)置的閾值時(shí),蜂鳴器就會(huì)發(fā)生報(bào)警。鍵盤模塊;鍵盤采用的是獨(dú)立式鍵盤,可分別設(shè)置溫度和濕度的上限值。
1.5.3 預(yù)期結(jié)果
根據(jù)設(shè)計(jì)方案及思路,預(yù)測(cè)出現(xiàn)的設(shè)計(jì)結(jié)果,當(dāng)系統(tǒng)完好的設(shè)計(jì)完后,連接所有的硬件設(shè)備,運(yùn)行相應(yīng)的軟件設(shè)備。
軟硬件連接完好,電路完善的情況下,肉眼能看到的是經(jīng)過一系列的軟硬件編譯過的在LCD液晶顯示器上顯示的數(shù)字,當(dāng)液晶顯示器顯示的溫濕度值超過了預(yù)定的值時(shí)系統(tǒng)發(fā)出報(bào)警提示,當(dāng)溫濕度值沒有超過預(yù)定的溫濕度范圍,測(cè)系統(tǒng)接收下一次的溫濕度采集值。

2  溫濕度測(cè)量系統(tǒng)方案設(shè)計(jì)
2.1系統(tǒng)總體設(shè)計(jì)
系統(tǒng)要完成的設(shè)計(jì)功能如下:
(1)實(shí)現(xiàn)對(duì)環(huán)境溫濕度參數(shù)的實(shí)時(shí)采集,由單片機(jī)對(duì)數(shù)據(jù)進(jìn)行循環(huán)檢測(cè)、數(shù)據(jù)處理、顯示,實(shí)現(xiàn)溫濕度的連續(xù)測(cè)量;
(2)實(shí)現(xiàn)超限數(shù)據(jù)的及時(shí)報(bào)警;
(3)現(xiàn)場(chǎng)檢測(cè)設(shè)備應(yīng)具有較高的靈敏度、可靠性、抗干擾能力;
(4)軟件設(shè)計(jì)既要具有完成數(shù)據(jù)采集、處理的功能,其軟件編程應(yīng)具有功能強(qiáng)大、界面友好、便于操作和執(zhí)行速度快。
設(shè)計(jì)要達(dá)到的技術(shù)指標(biāo):
(1)測(cè)量范圍: 濕度20-90%RH, 溫度0-50℃;                  
(2)測(cè)量精度: 濕度±5%RH, 溫度±2℃;                                           
(3)分 辨 率: 濕度1%RH, 溫度1℃。
(4)測(cè)量數(shù)據(jù)無線上傳到手機(jī)進(jìn)行顯示。
    該設(shè)計(jì)的總體方案是數(shù)據(jù)采集用的是DHT11溫濕度傳感器,它是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器,傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件,具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等特點(diǎn)。單片機(jī)采用AT89C51,液晶顯示采用LCD1602,報(bào)警采用蜂鳴器,鍵盤使用獨(dú)立鍵盤,外加復(fù)位電路和時(shí)鐘電路,測(cè)量數(shù)據(jù)無線上傳串口WIFI模塊。
溫度濕度信號(hào)通過溫濕度傳感器進(jìn)行信號(hào)的采集并轉(zhuǎn)換成數(shù)字信號(hào),再運(yùn)用單片機(jī)AT89C51進(jìn)行數(shù)據(jù)的分析和處理,并在LCD1602上顯示當(dāng)前溫濕度。外加復(fù)位電路、時(shí)鐘電路、鍵盤電路和報(bào)警電路。系統(tǒng)程序主要包括數(shù)據(jù)采集程序、溫溫度閾值設(shè)置程序、報(bào)警程序及顯示程序等。本設(shè)計(jì)可以通過鍵盤手動(dòng)設(shè)置溫度濕度的上、下限值,該設(shè)定值為系統(tǒng)閾值。溫濕度傳感器將檢測(cè)到的值傳輸給單片機(jī),通過分析比較,當(dāng)檢測(cè)數(shù)值超出閾值時(shí),驅(qū)動(dòng)蜂鳴器報(bào)警,以便管理人員及時(shí)切斷電源,實(shí)現(xiàn)系統(tǒng)的保護(hù)。

2.2 系統(tǒng)設(shè)計(jì)原則
要求單片機(jī)系統(tǒng)應(yīng)具有可靠性高、操作維護(hù)方便、性價(jià)比高等特點(diǎn)。設(shè)計(jì)原則有以下幾個(gè):
(1)可靠性高 可靠性是單片機(jī)系統(tǒng)應(yīng)用的前提,在系統(tǒng)設(shè)計(jì)的每一個(gè)環(huán)節(jié),都應(yīng)該將可靠性作為首要的設(shè)計(jì)準(zhǔn)則。提高系統(tǒng)的可靠性通常從以下幾個(gè)方面考慮:使用可靠性高的元器件;設(shè)計(jì)電路板時(shí)布線和接地要合理;對(duì)供電電源采用抗干擾措施;輸入輸出通道抗干擾措施;進(jìn)行軟硬件濾波等。

溫度、濕度設(shè)置參數(shù)斷電保存模塊

電路選擇了AT24C01電路作為溫度、濕度參數(shù)的儲(chǔ)存電路。AT24C01是美國(guó)Atmel公司的低功耗CMOS型E2PROM,內(nèi)含256×8位存儲(chǔ)空間,具有工作電壓寬(2.5~5.5 V)、擦寫次數(shù)多(大于10000次)、寫入速度快(小于10 ms)、抗干擾能力強(qiáng)、數(shù)據(jù)不易丟失、體積小等特點(diǎn)。而且他是采用了I2C總線式進(jìn)行數(shù)據(jù)讀寫的串行器件,占用很少的資源和I/O線,并且支持在線編程,進(jìn)行數(shù)據(jù)實(shí)時(shí)的存取十分方便。AT24C01中帶有的片內(nèi)地址寄存器。每寫入或讀出一個(gè)數(shù)據(jù)字節(jié)后,該地址寄存器自動(dòng)加1,以實(shí)現(xiàn)對(duì)下一個(gè)存儲(chǔ)單元的讀寫。所有字節(jié)均以單一操作方式讀取。為降低總的寫入時(shí)間,一次操作可寫入多達(dá)8個(gè)字節(jié)的數(shù)據(jù)。I2C總線是一種用于IC器件之間連接的二線制總線。他通過SDA(串行數(shù)據(jù)線)及SCL(串行時(shí)鐘線)兩根線在連到總線上的器件之間傳送信息,并根據(jù)地址識(shí)別每個(gè)器件。 AT24C01正是運(yùn)用了I2C規(guī)程,使用主/從機(jī)雙向通信,主機(jī)(通常為單片機(jī))和從機(jī)(AT24C01)均可工作于接收器和發(fā)送器狀態(tài)。主機(jī)產(chǎn)生串行時(shí)鐘信號(hào)(通過SCL引腳)并發(fā)出控制字,控制總線的傳送方向,并產(chǎn)生開始和停止的條件。無論是主機(jī)還是從機(jī),接收到一個(gè)字節(jié)后必須發(fā)出一個(gè)確認(rèn)信號(hào)ACK。AT24C01的控制字由8位二進(jìn)制數(shù)構(gòu)成,在開始信號(hào)發(fā)出以后,主機(jī)便會(huì)發(fā)出控制字,以選擇從機(jī)并控制總線傳送的方向。
管腳描述:
●  SCK 為串行時(shí)鐘:
    串行時(shí)鐘輸入管腳用于產(chǎn)生器件所有數(shù)據(jù)發(fā)送或接收的時(shí)鐘這是一個(gè)輸入管腳。
● SDA 為串行數(shù)據(jù)/地址:
雙向串行數(shù)據(jù)/地址管腳用于器件所有數(shù)據(jù)的發(fā)送或接收SDL,是一個(gè)開漏輸出管腳可與其它開漏輸出或集電極開路輸出進(jìn)行線。
●  A0、A1、A2 為器件地址輸入端:
當(dāng)使用24C02 時(shí)最大可級(jí)聯(lián)8個(gè)器件,如果只有一個(gè)24C01被總線尋址,這三個(gè)地址輸入腳A0、A1、A2可懸空或連接到Vss。
● WP為寫保護(hù):
如果WP 管腳連接到Vcc 所有的內(nèi)容都被寫保護(hù)只能讀當(dāng)WP, 管腳連接到Vss 或懸空,允許器件進(jìn)行正常的讀/寫操作。管腳圖如圖3-3所示。

特點(diǎn):
內(nèi)建128x8存儲(chǔ)序列
2線制串行接口
雙向數(shù)據(jù)傳送協(xié)議
100kHz(1.8V,2.5V,2.7V) 和400kHz(5V)兼容
寫同步時(shí)鐘(最大10ms)
高可靠性
-極限:1M寫時(shí)鐘周期
-數(shù)據(jù)保存:100年
AT24C01提供電可擦除的串行1024位存儲(chǔ)或可編程只讀存儲(chǔ)器(EEPROM)128字(8位/字)。
芯片在低壓的工業(yè)與商業(yè)應(yīng)用中進(jìn)行了最優(yōu)化。AT24C01的封裝為8腳PDIP、8腳JEDEC
SOIC、8腳TSSOP,通過2線制串行接口進(jìn)行數(shù)據(jù)傳輸。
設(shè)備操作: SDA管腳通常外部要拉高。SDA管腳上的數(shù)據(jù)只能在SCL低期間改變。數(shù)據(jù)在SCL高期間改變定義為一個(gè)開始或停止信號(hào)。
開始狀態(tài):在任何操作之前必須有一個(gè)開始信號(hào)----在SCL為高時(shí)SDA上產(chǎn)生一個(gè)下降沿。
停止?fàn)顟B(tài): SCL為高時(shí)SDA產(chǎn)生一個(gè)上升沿是停止信號(hào),停止信號(hào)后將停止所有通信。
在一個(gè)讀的序列之后,停止信號(hào)將讓EEPROM進(jìn)入備用電源模式。

3.8報(bào)警模塊及溫度濕度控制模塊

本系統(tǒng)采用蜂鳴器作為報(bào)警裝置,蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。 蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。蜂鳴器在電路中用字母“H”或“HA”(舊標(biāo)準(zhǔn)用“FM”、“LB”、“JD”等)表示。

3.8.1蜂鳴器報(bào)警原理及溫度濕度控制模塊原理

本設(shè)計(jì)采用蜂鳴音報(bào)警電路,其工作過程就是把傳感器采集的數(shù)據(jù)通過單片機(jī)處理后,與該參數(shù)上限給定值進(jìn)行比較,如果高于上限值則進(jìn)行報(bào)警。同時(shí)當(dāng)溫度,濕度低于設(shè)計(jì)值時(shí),自動(dòng)啟動(dòng)加溫電、加濕設(shè)置進(jìn)行加溫、加濕工作。
蜂鳴器發(fā)聲原理是電流通過電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)來驅(qū)動(dòng)振動(dòng)膜發(fā)聲的,因此需要一定的電流才能驅(qū)動(dòng)它,單片機(jī)I/O口引腳輸出的電流較小,單片機(jī)輸出的TTL電平基本上驅(qū)動(dòng)不了蜂鳴器,因此需要增加一個(gè)電流放大的電路。所以才用一個(gè)三極管來放大驅(qū)動(dòng)蜂鳴器。在本系統(tǒng)中峰鳴器報(bào)警接口電路的設(shè)計(jì)采用壓電式蜂鳴器,通過AT89C51的1根I/O口線經(jīng)驅(qū)動(dòng)器驅(qū)動(dòng)蜂鳴音發(fā)聲。壓電式蜂鳴器約需10mA的驅(qū)動(dòng)電流,可以用一個(gè)晶體三極管驅(qū)動(dòng),P2.4接晶體管基極輸入端。當(dāng)P2.4輸出高電平“1”時(shí),晶體管導(dǎo)通,壓電蜂鳴器兩端獲得約+5V電壓而鳴叫;當(dāng)P2.4輸出低電平“0”時(shí),三極管截止,蜂鳴器停止發(fā)聲。

3.8.2 報(bào)警電路接口

聲光報(bào)警系統(tǒng)由一個(gè)電阻R2,一個(gè)三極管BG1和一個(gè)蜂鳴器BY以及發(fā)光二極管D5與限流電阻R10組成,三極管用來放大電路中的電流,來驅(qū)動(dòng)蜂鳴器發(fā)聲,在發(fā)聲的同時(shí)發(fā)光二極管D5閃亮。報(bào)警系統(tǒng)連接單片機(jī)的I/O口P2.3,當(dāng)單片機(jī)檢測(cè)到溫度或者濕度超出所設(shè)置的閾值時(shí),就會(huì)給P2.3置低電平0,這時(shí)三極管導(dǎo)通,蜂鳴器報(bào)警,如果沒有超出閾值,P2.3置高電平1,三極管截止。R4與D1組成溫度過低的報(bào)警指示電路及啟動(dòng)加溫控制指示電路,溫度低于溫度設(shè)置下限值時(shí),D1點(diǎn)亮,同時(shí)P1.7腳由高電平變?yōu)榈碗娖,?jīng)R9、BG3驅(qū)動(dòng)繼電器工作,電機(jī)M2轉(zhuǎn)動(dòng)(用來模擬加熱電器及加熱通風(fēng)機(jī)工作),當(dāng)溫度高于下限值時(shí),D1O熄,同時(shí)M2停止工作。R5與D2組成溫度高報(bào)警電路,溫度高于上限值時(shí),D2點(diǎn)亮。R6與D3組成濕度過低的報(bào)警指示電路及啟動(dòng)加濕水泵控制指示電路,R7、D4組成濕度高的報(bào)警指示電路,當(dāng)濕度低于設(shè)置下限值時(shí),D3點(diǎn)亮,同時(shí)P1.6腳由高電平變?yōu)榈碗娖,?jīng)R8、BG2驅(qū)動(dòng)繼電器工作,電機(jī)M1轉(zhuǎn)動(dòng)(用來模擬加濕水泵工作),當(dāng)濕度高于下溫度下限值時(shí),D3熄滅,這時(shí)水泵繼續(xù)工作,當(dāng)濕度高于濕度設(shè)置上限值時(shí),D4點(diǎn)亮,同時(shí)停止加濕水泵工作。報(bào)警模塊及加濕模塊電路圖如圖3.12所示。

圖3.12報(bào)警電路及加濕加溫電路模塊

3.9供電電路

整個(gè)濕度溫度測(cè)量裝置的供電設(shè)計(jì)采用5伏直流電源進(jìn)行供電,圖中C1,C2作為電源濾波電容。供電電源可以直接選用目前市面上比較多的手機(jī)充電電源作為供電電源,這種電源工作可靠,安全適用,成本低。

3.9小結(jié)

本系統(tǒng)設(shè)計(jì)主要有主控模塊、顯示模塊、溫濕度采集模塊、WIFI串口通信模塊、鍵盤模塊、報(bào)警模塊、復(fù)位電路和時(shí)鐘電路八大模塊。其中主控模塊AT89C51的晶振電路采用12MHz的無源晶振,微調(diào)電容大小取22pF。顯示模塊選用LCD1602字符型液晶模塊,是目前工控系統(tǒng)中使用最為廣泛的液晶屏之一。溫濕度采集模塊所采用的DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器,它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與穩(wěn)定性;其單線制串行接口,使系統(tǒng)集成變得簡(jiǎn)易快捷。報(bào)警模塊采用蜂鳴器,采用PNP型晶體管9012放大單片機(jī)I/O口的電流。系統(tǒng)的輸入模塊采用獨(dú)立式鍵盤,操作簡(jiǎn)單,溫濕度檢測(cè)方便準(zhǔn)確。該設(shè)計(jì)最終要實(shí)現(xiàn)的目標(biāo)是,溫濕度采集數(shù)據(jù)并傳輸?shù)絾纹瑱C(jī),單片機(jī)經(jīng)過數(shù)據(jù)處理在發(fā)送到液晶顯示器顯示,同時(shí)單片機(jī)會(huì)將采集到的數(shù)據(jù)同系統(tǒng)設(shè)置溫度、濕度值進(jìn)行比較,如果超過定值,報(bào)警電路就會(huì)發(fā)出報(bào)警聲光信號(hào),如果溫度、濕度在設(shè)置范圍內(nèi),單片機(jī)就會(huì)繼續(xù)采集溫濕度數(shù)據(jù)。            
鍵盤一共有四個(gè)鍵,開關(guān)K1、K2、K3、K4分別接單片機(jī)的I/O口P3.4、P3.5、P3.6 、P3.7。K1是模式選擇鍵,用來選擇溫度、濕度上下限值。K2和K3分別為設(shè)置溫度、濕度上下限值, K4為保存鍵,設(shè)置完成按下該鍵后儲(chǔ)存設(shè)置參數(shù)。顯示器一共是兩行顯示,第一行顯示的是溫度,第二行顯示的是濕度。
在完成了系統(tǒng)硬件的設(shè)計(jì)后,再設(shè)計(jì)系統(tǒng)軟件,首先要建立程序框架的流程圖,對(duì)整個(gè)設(shè)計(jì)劃分模塊,逐個(gè)模塊實(shí)現(xiàn)其功能,最終把各個(gè)子模塊合理的連接起來,構(gòu)成總的程序,這樣能快速準(zhǔn)備的進(jìn)行編程。首先建立主程序框架流程圖,弄明白整個(gè)系統(tǒng)程序設(shè)計(jì),其次再分別設(shè)計(jì)顯示模塊、傳感器模塊和鍵盤模塊的程序,最后在進(jìn)行整合,形成一個(gè)完整的程序。
本系統(tǒng)采用C語言編程。C語言是一種計(jì)算機(jī)程序設(shè)計(jì)語言。它既具有高級(jí)語言的特點(diǎn),又具有匯編語言的特點(diǎn)。
C語言編程的優(yōu)點(diǎn)有:
(1)簡(jiǎn)潔緊湊、靈活方便。C語言一共只有32個(gè)關(guān)鍵字,9種控制語句,程序書寫形式自由,區(qū)分大小寫。把高級(jí)語言的基本結(jié)構(gòu)和語句與低級(jí)語言的實(shí)用性結(jié)合起來。C 語言可以像匯編語言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元。   
(2)運(yùn)算符豐富。C語言的運(yùn)算符包含的范圍很廣泛,共有34種運(yùn)算符。C語言把括號(hào)、賦值、強(qiáng)制類型轉(zhuǎn)換等都作為運(yùn)算符處理。從而使C語言的運(yùn)算類型極其豐富,表達(dá)式類型多樣化。靈活使用各種運(yùn)算符可以實(shí)現(xiàn)在其它高級(jí)語言中難以實(shí)現(xiàn)的運(yùn)算。   
(3)數(shù)據(jù)類型豐富。C語言的數(shù)據(jù)類型有:整型、實(shí)型、字符型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型、共用體類型等。能用來實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的運(yùn)算。并引入了指針概念,使程序效率更高。另外C語言具有強(qiáng)大的圖形功能,支持多種顯示器和驅(qū)動(dòng)器。且計(jì)算功能、邏輯判斷功能強(qiáng)大。
(4)語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。雖然C語言也是強(qiáng)類型語言,但它的語法比較靈活,允許程序編寫者有較大的自由度。   
4.1 主程序模塊程序設(shè)計(jì)
本系統(tǒng)的整個(gè)程序流程是首先上電,系統(tǒng)各部分進(jìn)行初始化,單片機(jī)初始化,液晶顯示器初始化等。初始化完成后進(jìn)行鍵盤掃描,然后再進(jìn)行延時(shí)一段時(shí)間,供傳感器采集數(shù)據(jù),延時(shí)完成后就進(jìn)行數(shù)據(jù)的采集并傳輸?shù)絾纹瑱C(jī),單片機(jī)處理之后傳輸?shù)揭壕э@示器,液晶顯示器顯示溫濕度值。并且判斷溫度和濕度是否超出閾值,如果沒有超過,就繼續(xù)執(zhí)行數(shù)據(jù)采集程序,如果有一個(gè)值超出閾值,則啟動(dòng)報(bào)警系統(tǒng),蜂鳴器發(fā)出聲音,溫濕度檢測(cè)結(jié)束。主程序流程圖如圖4.1所示。


液晶顯示模塊是一個(gè)慢顯示器件,在執(zhí)行每條指令之前要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,則此指令失效,要顯示字符時(shí)要先輸入顯示字符地址,告訴模塊在哪里顯示了字符。1602液晶顯示模塊可與單片機(jī)接口直接連接,無需再加驅(qū)動(dòng)。
LCD1602的顯示數(shù)據(jù)過程是首先液晶初始化,初始化完成后執(zhí)行延時(shí)程序,等待數(shù)據(jù)的采集,延時(shí)完成后LCD會(huì)先寫入一些指令和顯示字符的地址,在這完成后單片機(jī)會(huì)向LCD發(fā)送數(shù)據(jù)即寫數(shù)據(jù),數(shù)據(jù)發(fā)送完LCD就會(huì)讀取寫入的地址并顯示出來,最后返回。軟件流程圖如圖4.2所示。





圖4.3 DHT11傳感器模塊的軟件流程圖

傳感器模塊負(fù)責(zé)溫濕度數(shù)據(jù)源的采集,首先數(shù)據(jù)口連接端P1.0輸出低電平,延時(shí)18ms之后P1.0輸出高電平,延時(shí)40ms之后,讀P1.0引腳是否為低電平,如果不是低電平就繼續(xù)讀,如果是低電平就執(zhí)行判斷從機(jī)80μs高電平是否結(jié)束,如果沒有結(jié)束就繼續(xù)判斷,如果結(jié)束就進(jìn)行單片機(jī)數(shù)據(jù)接收,將接收到的數(shù)據(jù)按十進(jìn)制數(shù)位存入指定的數(shù)組中,數(shù)據(jù)采集結(jié)束并保持?jǐn)?shù)據(jù)采集持續(xù)進(jìn)行。

4.4 鍵盤模塊設(shè)計(jì)

鍵盤模塊是用來設(shè)置系統(tǒng)閾值的,首先通過模式選擇鍵開閾值并選擇溫度和濕度的設(shè)置,加一鍵和減一鍵是對(duì)溫度和濕度的設(shè)置。第一次按模式鍵然后經(jīng)過延時(shí)可以開閾值和進(jìn)行濕度的設(shè)置,第二次按模式鍵并延時(shí)是溫度的設(shè)置,第三次按模式鍵是關(guān)閾值。
鍵盤模塊軟件流程圖如圖4.4所示。







圖4.4 鍵盤模塊軟件流程圖

4.5 小結(jié)

本系統(tǒng)的軟件設(shè)計(jì)采用了C語言編程,只需對(duì)溫度和濕度進(jìn)行相應(yīng)的采集處理后,即可讓液晶實(shí)時(shí)顯示當(dāng)前的溫度與濕度值。報(bào)警模塊只需接上單片機(jī)的I/O 口,并對(duì)其接口線進(jìn)行編程方可,當(dāng)溫度與濕度超過閾值時(shí)報(bào)警模塊就會(huì)報(bào)警。這樣就可以完成環(huán)境中溫濕度的檢測(cè)。
    本設(shè)計(jì)在完成硬件電路設(shè)計(jì)并焊接好電路硬件的基礎(chǔ)上,通過串口模塊將軟件代碼下載至AT89C51單片機(jī)中完成系統(tǒng)集成。由于采用了AT89C51單片機(jī),性能可靠、電路簡(jiǎn)單,系統(tǒng)中還可充分利用AT89C51中先進(jìn)的軟件硬件資源,便于軟件系統(tǒng)的升級(jí),操作方便。


設(shè)計(jì)制作51單片機(jī)DHT11的溫濕度檢測(cè)系統(tǒng),程序設(shè)計(jì)及試工作是一項(xiàng)重要內(nèi)容,所設(shè)計(jì)的程序51單片機(jī)DHT11的溫濕度檢測(cè)系統(tǒng)程序只是在編譯環(huán)境下通過編譯,消除編程工作中產(chǎn)生的語法錯(cuò)誤后,直接將程序?qū)懭雴纹瑱C(jī)中與硬件一起進(jìn)行聯(lián)調(diào),如果這時(shí)硬件設(shè)計(jì)制作是正確的還好說,只需要進(jìn)行軟件的調(diào)試修改,燒寫到硬件環(huán)境中驗(yàn)證直到達(dá)到設(shè)計(jì)要求即可,但這個(gè)工作也是需要反復(fù)不停地修改程序并燒錄到硬件單片機(jī)中進(jìn)行調(diào)試,但如果說硬設(shè)計(jì)、制作及程序設(shè)計(jì)都存在問題,整個(gè)調(diào)試工作就顯得無從下手,給軟件調(diào)試、硬件故障排出帶來非常大的困難,增加不少工作量,甚至造成系統(tǒng)設(shè)計(jì)制作的失敗。有好的解決辦法嗎?回答是肯定的,就是程序仿真,編譯通過的程序,在Proteus環(huán)境下,按設(shè)計(jì)的硬件原理圖,把仿真圖畫好,調(diào)入程序在Proteus仿真環(huán)境下進(jìn)行程序的仿真,來驗(yàn)證程序設(shè)計(jì)的正確性及各項(xiàng)功能是否達(dá)到設(shè)計(jì)要求,在仿真環(huán)境下完成程序的調(diào)試工作。通過仿真調(diào)試滿意后的程序,再燒寫到硬件環(huán)境下調(diào)試,這時(shí),如果硬件工作正常,可以進(jìn)一步的驗(yàn)證程序的功能及正確性,如果工作不正常,這時(shí)可排出軟件設(shè)計(jì)的問題,集中精力排出硬件設(shè)計(jì)、制作的問題,有針對(duì)性的排出,從而可提高設(shè)計(jì)制作過程中的效率,大大減輕制作工作量,使單片機(jī)DHT11的溫濕度檢測(cè)系統(tǒng)制作成功率可以得到100%的保證。下圖是本設(shè)計(jì)的仿真圖。

6  設(shè)計(jì)中遇到的問題及解決方法

6.1 硬件問題及解決方法

   (1)LCD1602不顯示:
    檢查L(zhǎng)CD各個(gè)端口與單片機(jī)的連接是否接通,發(fā)現(xiàn)都通著,又檢查了LCD數(shù)據(jù)口連接順序與單片機(jī)的I/O口順序是否一致,最后發(fā)現(xiàn)LCD的數(shù)據(jù)口順序接反了,最后把LCD的D0-D7接單片機(jī)的I/O口P0.0-P0.7后,工作正常了。。
   (2)蜂鳴器不響:
因?yàn)閯傞_始不知道老師給的三極管是啥型號(hào)的,自己就用萬用表測(cè)試了一下就焊接上了,結(jié)果不響,我就按照三極管的型號(hào)上網(wǎng)查了一下結(jié)果發(fā)現(xiàn)自己檢測(cè)錯(cuò)了,自己的是PNP型的,三個(gè)管腳分別是字面對(duì)著自己ebc。然后卸下來重新焊上去蜂鳴器就響了。
   (3)LCD1602顯示亂碼:
把程序下載到單片機(jī)上,液晶顯示的不是程序要顯示的內(nèi)容。我就用萬用表檢查8根數(shù)據(jù)線是否都接通,結(jié)果發(fā)現(xiàn)都是連通的。然后就考慮是不是數(shù)據(jù)線短路了,用萬用表分別測(cè)量8跟數(shù)據(jù)線有沒有短路的,結(jié)果發(fā)現(xiàn)有一根在焊接的時(shí)候不小心焊到旁邊的焊盤上了,導(dǎo)致數(shù)據(jù)線接到了電源線上,那根數(shù)據(jù)線就會(huì)一直顯示高電平,所以顯示就亂碼了。用烙鐵把連接的焊錫分開以后,重新上電發(fā)現(xiàn)液晶顯示正常了。

6.2 軟件所遇問題及解決方法

   (1)鍵盤問題
按鍵沒有按照程序設(shè)計(jì)的工作,模式鍵沒有起作用,加減鍵也不規(guī)律的進(jìn)行加減。通過仔細(xì)檢查程序,通過檢查按鍵硬件電路發(fā)現(xiàn)按鍵電路都好著呢,然后再檢查程序,發(fā)現(xiàn)程序中按鍵按下之后沒有用延時(shí)程序,就給程序中各個(gè)按鍵后邊加了個(gè)延時(shí)程序,下載程序之后發(fā)現(xiàn)按鍵可以實(shí)現(xiàn)功能了。
   (2)濕度顯示不穩(wěn)定
在數(shù)據(jù)采集完成以后,顯示在顯示器上,發(fā)現(xiàn)濕度顯示不穩(wěn)定,一直在跳動(dòng)。剛開始以為是正常情況,可是最后發(fā)現(xiàn)跳動(dòng)的特別厲害,跳動(dòng)幅度也很大。最后想到可能是單片機(jī)一直在采集數(shù)據(jù)然后顯示數(shù)據(jù),中間沒有停歇才導(dǎo)致顯示不穩(wěn)定,就給數(shù)據(jù)采集前加了個(gè)延時(shí)程序,通過串口下載程序后,發(fā)現(xiàn)濕度顯示穩(wěn)定了。

隨著社會(huì)的發(fā)展,科技越來越越發(fā)達(dá),我們的生活也越來越智能化。溫濕度是我們生活環(huán)境中的兩個(gè)重要的參數(shù),在我們的生活中,我們要時(shí)刻關(guān)心環(huán)境的變化,只有很好的把握好環(huán)境的差異變化,我們才能更好的生存與發(fā)展。
本文設(shè)計(jì)的溫、濕度智能測(cè)控系統(tǒng)主要有以下幾個(gè)各方面:
(1)采用AT89C51單片機(jī)為控制核心;
(2)采用數(shù)字式溫度傳感器DHT11為溫、濕度數(shù)據(jù)采集器件,通過PC機(jī)作為人機(jī)接口,實(shí)現(xiàn)了數(shù)據(jù)采集與測(cè)控指令參數(shù)的設(shè)置;
(3)顯示部分采用已標(biāo)準(zhǔn)的1602液晶為顯示屏,具有顯示質(zhì)量高、體積小、功耗低等優(yōu)點(diǎn)。
本系統(tǒng)整體設(shè)計(jì)具有界面友好、控制靈活、硬件系統(tǒng)集成度高、電路簡(jiǎn)單、功能強(qiáng)、性能可靠、成本低等特點(diǎn)。對(duì)我們的生活特別有幫助 。
在這次設(shè)計(jì)中我也學(xué)到了很多東西主要,原來在課堂上學(xué)習(xí)的單片機(jī)知識(shí)都是理論,從沒有實(shí)踐過,這次設(shè)計(jì)就讓我的理論知識(shí)應(yīng)用到了實(shí)踐中。經(jīng)過近這一段時(shí)間的努力,從拿到題目,到后來查找資料,理論學(xué)習(xí),焊接電路板,實(shí)驗(yàn)編程調(diào)試,這一切都使我的理論知識(shí)和動(dòng)手能力有了很大的提高。了解了單片機(jī)的硬件結(jié)構(gòu)和軟件編程方法,對(duì)單片機(jī)的工作方式有了很大的認(rèn)知。同時(shí),對(duì)一些外圍設(shè)備比如傳感器、液晶屏、鍵盤、蜂鳴器等有了一定的了解。
本系統(tǒng)具有較強(qiáng)的實(shí)用性,具體方面有:
(1)我對(duì)DHT11與DS18B20及一些水銀溫濕度測(cè)量器的測(cè)量數(shù)據(jù)進(jìn)行了比較,驗(yàn)證了DHT11測(cè)量數(shù)據(jù)的準(zhǔn)確性和穩(wěn)定性。低廉的價(jià)格、小巧的體積、準(zhǔn)確穩(wěn)定的測(cè)量數(shù)據(jù)、簡(jiǎn)單的單總線控制方式、簡(jiǎn)潔的電路連接,這些將使DHT11擁有良好的應(yīng)用前景;
(2)LCD1602液晶具有顯示質(zhì)量高、體積小、功耗低等優(yōu)點(diǎn),在以后會(huì)得到更廣泛的應(yīng)用。


附錄1 硬件原理圖




附錄2 PCB圖

附錄3元件布置圖
源程序
  1. #include <REGX51.H>
  2. #include <intrins.h>
  3. #include <math.h>     
  4. #include <stdio.h>      

  5. #define uchar unsigned char
  6. #define uint unsigned int
  7.                         //24c02讀指令
  8. sbit DATA=P1^0;
  9. // AT24C02 數(shù)據(jù)端

  10. sbit k1=P3^4;                               //按鍵
  11. sbit k2=P3^5;                               //按鍵
  12. sbit k3=P3^6;                               //按鍵
  13. sbit k4=P3^7;                               //按鍵
  14. sbit beep=P2^3;
  15. sbit led1=P1^2;
  16. sbit led2=P1^3;
  17. sbit led3=P1^4;
  18. sbit led4=P1^5;
  19. sbit led5=P1^6;
  20. sbit led6=P1^7;

  21. sbit RS  = P2^0;
  22. sbit RW  = P2^1;
  23. sbit E  = P2^2;
  24. sfr DBPort  = 0x80;     //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口



  25. uchar temp,humi;
  26. uchar error;                                //用于檢驗(yàn)是否出現(xiàn)錯(cuò)誤
  27. uchar checksum,nn;                          //CRC                    
  28. uchar nn;                                         //蜂鳴器                    
  29. uchar TEMP_data[6];                         //用于記錄實(shí)測(cè)的溫度
  30. uchar HUMI_data[5];                         //用于記錄實(shí)測(cè)的濕度
  31. uchar set_temp[5];                          //保存設(shè)定的溫度
  32. uchar set_humi[4];                          //保存設(shè)定的濕度
  33. uchar idata temp_humi_cache[8];             //溫濕度設(shè)置緩存
  34. uint temp_high;                                 //溫度上限變量
  35. uint temp_low;                              //溫度下限變量
  36. uint humi_high;                             //濕度上限變量
  37. uint humi_low;                              //濕度下限變量
  38. uchar presskeynum;                          //按鍵次數(shù)變量
  39. uchar  U8FLAG,k;
  40. uchar  U8count,U8temp;
  41. uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  42. uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  43. uchar  U8comdata;
  44. uchar  count, count_r=0;

  45. /********     1602函數(shù)聲明     ********/
  46. void LCD_Initial();
  47. void GotoXY(unsigned char x, unsigned char y);
  48. void Print(unsigned char *str);
  49. void LCD_Write(bit style, unsigned char input);

  50. /*************************************************************************/


  51. void Delay1(uint );
  52. void  Delay_10us(void);
  53. void  COM(void);
  54. uchar RH(void);

  55. //1602程序
  56. //內(nèi)部等待函數(shù)*************************************************************
  57. unsigned char LCD_Wait(void)
  58. {
  59.     RS=0;
  60.     RW=1;    _nop_();
  61.     E=1;    _nop_();           
  62.     E=0;
  63.     return DBPort;  
  64. }
  65. //向LCD寫入命令或數(shù)據(jù)********************************************************
  66. #define LCD_COMMAND         0      // Command
  67. #define LCD_DATA            1      // Data
  68. #define LCD_CLEAR_SCREEN    0x01      // 清屏
  69. #define LCD_HOMING          0x02      // 光標(biāo)返回原點(diǎn)
  70. void LCD_Write(bit style, unsigned char input)
  71. {
  72.     E=0;
  73.     RS=style;
  74.     RW=0;        _nop_();
  75.     DBPort=input;   _nop_();//注意順序
  76.     E=1;        _nop_();//注意順序
  77.     E=0;        _nop_();
  78.     LCD_Wait();
  79. }

  80. //設(shè)置顯示模式************************************************************
  81. #define LCD_SHOW            0x04    //顯示開
  82. #define LCD_HIDE            0x00    //顯示關(guān)

  83. #define LCD_CURSOR          0x02    //顯示光標(biāo)
  84. #define LCD_NO_CURSOR       0x00    //無光標(biāo)        

  85. #define LCD_FLASH           0x01    //光標(biāo)閃動(dòng)
  86. #define LCD_NO_FLASH        0x00    //光標(biāo)不閃動(dòng)

  87. void LCD_SetDisplay(unsigned char DisplayMode)
  88. {
  89.     LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
  90. }

  91. //設(shè)置輸入模式************************************************************
  92. #define LCD_AC_UP       0x02
  93. #define LCD_AC_DOWN         0x00      // default

  94. #define LCD_MOVE            0x01      // 畫面可平移
  95. #define LCD_NO_MOVE         0x00      //default

  96. void LCD_SetInput(unsigned char InputMode)
  97. {
  98.     LCD_Write(LCD_COMMAND, 0x04|InputMode);
  99. }

  100. //初始化LCD************************************************************
  101. void LCD_Initial()
  102. {
  103.     E=0;
  104.     LCD_Write(LCD_COMMAND,0x38);           //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
  105.     LCD_Write(LCD_COMMAND,0x38);
  106.     LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開啟顯示, 無光標(biāo)
  107.     LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  108.     LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC遞增, 畫面不動(dòng)
  109. }

  110. //液晶字符輸入的位置************************
  111. void GotoXY(unsigned char x, unsigned char y)
  112. {
  113.     if(y==0)
  114.         LCD_Write(LCD_COMMAND,0x80|x);
  115.     if(y==1)
  116.         LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  117. }

  118. //將字符輸出到液晶顯示
  119. void Print(unsigned char *str)
  120. {
  121.     while(*str!='\0')
  122.     {
  123.         LCD_Write(LCD_DATA,*str);
  124.         str++;
  125.     }
  126. }


  127. /****************************24C02程序部分******************************************

  128. /**********************************************************************************/

  129. void Delay24(void)
  130. {unsigned char i;
  131.    for(i=0;i<20;i++);

  132. }
  133. //***********************************************************************************
  134. void Delay24_10ms(void)
  135. {unsigned int i;
  136.    for(i=0;i<500;i++);
  137. }

  138. //****讀一字節(jié)************************************

  139. void  Delay_10us(void)
  140. {
  141.     uchar i;
  142.     i--;
  143.     i--;
  144.     i--;
  145.     i--;
  146.     i--;
  147.     i--;
  148. }

  149. void  COM(void)
  150. {
  151.     uchar i;
  152.     for(i=0;i<8;i++)           
  153.     {
  154.               U8FLAG=2;
  155.                    while((!DATA)&&U8FLAG++);
  156.                 Delay_10us();
  157.                 Delay_10us();
  158.                 Delay_10us();
  159.                   U8temp=0;
  160.         if(DATA)U8temp=1;
  161.                 U8FLAG=2;
  162.                 while((DATA)&&U8FLAG++);                  
  163.                    if(U8FLAG==1)break;
  164.                     U8comdata<<=1;
  165.                    U8comdata|=U8temp;        
  166.     }
  167. }

  168. //--------------------------------
  169. //-----溫濕度讀取子程序 ------------
  170. //--------------------------------
  171. //----以下變量均為全局變量--------
  172. //----溫度高8位== U8T_data_H------
  173. //----溫度低8位== U8T_data_L------
  174. //----濕度高8位== U8RH_data_H-----
  175. //----濕度低8位== U8RH_data_L-----
  176. //----校驗(yàn) 8位 == U8checkdata-----
  177. //----調(diào)用相關(guān)子程序如下----------
  178. //---- Delay();, Delay_10us();,COM();
  179. //--------------------------------
  180. uchar RH(void)
  181. {
  182.     DATA=0;                                                  //主機(jī)拉低18ms
  183.         Delay1(180);                                  //原來為5
  184.         DATA=1;                                                //總線由上拉電阻拉高 主機(jī)延時(shí)20us
  185.         Delay_10us();
  186.         Delay_10us();
  187.         Delay_10us();
  188.         Delay_10us();
  189.         DATA=1;                                                   //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
  190.         if(!DATA)                 //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行         
  191.         {
  192.             U8FLAG=2;

  193.             while((!DATA)&&U8FLAG++);        //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束         
  194.             U8FLAG=2;
  195.                   while((DATA)&&U8FLAG++);    //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
  196.             COM();                                                //數(shù)據(jù)接收狀態(tài)
  197.             U8RH_data_H_temp=U8comdata;
  198.             COM();
  199.             U8RH_data_L_temp=U8comdata;
  200.             COM();
  201.             U8T_data_H_temp=U8comdata;
  202.             COM();
  203.             U8T_data_L_temp=U8comdata;
  204.             COM();
  205.             U8checkdata_temp=U8comdata;
  206.             DATA=1;
  207.             U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);        //數(shù)據(jù)校驗(yàn)
  208.             if(U8temp==U8checkdata_temp)
  209.             {
  210.                       U8RH_data_H=U8RH_data_H_temp;
  211.                       U8RH_data_L=U8RH_data_L_temp;
  212.                       U8T_data_H=U8T_data_H_temp;
  213.                       U8T_data_L=U8T_data_L_temp;
  214.                       U8checkdata=U8checkdata_temp;
  215.             }

  216.                 return 1;
  217.         }
  218.         else                                                                           //傳感器不響應(yīng)
  219.         {
  220.            return 0;
  221.         }
  222. }

  223. void delay(uint z)                          //延時(shí)函數(shù)z為毫秒數(shù)
  224. {
  225.    int a,b;
  226.    for(a=z;a>0;a--)
  227.    for(b=120;b>0;b--);
  228. }

  229. void key()
  230. {
  231.    uchar m;
  232.    if (k1==0)                               //調(diào)整按鍵檢測(cè)
  233.    {
  234.       delay(10);
  235.       if (k1==0)
  236.       {
  237.          presskeynum++;
  238.          if(presskeynum==5)
  239.          presskeynum=0;
  240.          while(k1==0);
  241.          LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  242.       }
  243.    }
  244.    if(presskeynum==1)//溫度上限設(shè)置
  245.    {
  246.       if(k2==0)// 加
  247.       {
  248.          delay(300);
  249.          temp_high++;
  250.          if (temp_high>99)
  251.          temp_high=0;
  252.          if (temp_high<0)
  253.          temp_high=99;
  254.          while(k2==0);       //加上此句必須松按鍵才處理
  255.       }
  256.       if(k3==0)//減
  257.       {
  258.          delay(300);
  259.          temp_high--;
  260.          if (temp_high>99)
  261.          temp_high=0;
  262.          if (temp_high<0)
  263.          temp_high=99;
  264.          while(k3==0);       //加上此句必須松按鍵才處理
  265.       }
  266.    }
  267.    if(presskeynum==2)//溫度下限設(shè)置
  268.    {
  269.       if(k2==0)// 加
  270.       {
  271.          delay(300);
  272.          temp_low++;
  273.          if (temp_low>99)
  274.          temp_low=0;
  275.          if (temp_low<0)
  276.          temp_low=99;
  277.          while(k2==0);
  278.       }
  279.       if(k3==0)
  280.       {
  281.          delay(300);
  282.          temp_low--;
  283.          if (temp_low>99)
  284.          temp_low=0;
  285.          if (temp_low<0)
  286.          temp_low=99;
  287.          while(k3==0);
  288.       }
  289.    }
  290.    if(presskeynum==3)//濕度上限設(shè)置
  291.    {
  292.       if(k2==0)// 加
  293.       {
  294.           delay(300);
  295.           humi_high++;
  296.           if (humi_high>99)
  297.           humi_high=0;
  298.           if (humi_high<0)
  299.           humi_high=99;
  300.           while(k2==0);
  301.       }
  302.       if(k3==0)
  303.       {
  304.           delay(300);
  305.           humi_high--;
  306.           if (humi_high>99)
  307.           humi_high=0;
  308.           if (humi_high<0)
  309.           humi_high=99;
  310.           while(k3==0);
  311.       }
  312.    }
  313.    if(presskeynum==4)//濕度下限設(shè)置
  314.    {
  315.       if(k2==0)//加
  316.       {
  317.           delay(300);
  318.           humi_low++;
  319.           if (humi_low>99)
  320.           humi_low=0;
  321.           if (humi_low<0)
  322.           humi_low=99;
  323.           while(k2==0);
  324.       }
  325.       if(k3==0)// 減
  326.       {
  327.           delay(300);
  328.           humi_low--;
  329.           if (humi_low>99)
  330.           humi_low=0;
  331.           if (humi_low<0)
  332.           humi_low=99;
  333.           while(k3==0);
  334.       }
  335.    }
  336.    if(k4==0)// 退出鍵
  337.    {
  338.       delay(10);
  339.       if(k4==0)
  340.       {
  341.           while(k4==0);
  342.           presskeynum=0;

  343.           LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);                           //清屏
  344.        }
  345.    }
  346. }
  347. void main()                                                         //主函數(shù)
  348. {
  349.    uchar t;
  350.    k1=k2=k3=k4=1;
  351.    for (t=0;t<=7;t++)

  352.    LCD_Initial();    //液晶初始化

  353.    while(1)
  354.    {
  355.        key();
  356.        if(presskeynum==0)
  357.        {  
  358.                         RH();                                               //測(cè)量溫濕度
  359.                            temp=U8T_data_H;
  360.                            humi=U8RH_data_H;
  361.                    GotoXY(0,0);                                       //選擇溫度顯示位置
  362.             Print("Temp:     C");                                             //5格空格
  363.             GotoXY(0,1);                                       //選擇濕度顯示位置
  364.             Print("Humi:     %");                                             //5格空格                           
  365.             GotoXY(5,0);                                       //設(shè)置溫度顯示位置
  366.                         if(temp>=10)
  367.                         {
  368.                     TEMP_data[0]=temp/10+'0';                                         //溫度十位      
  369.                     TEMP_data[1]=temp%10+'0';                           //溫度個(gè)位
  370.                         }
  371.                         else
  372.                         {
  373.                     TEMP_data[0]=' ';                                                         //溫度十位      
  374.                     TEMP_data[1]=temp%10+'0';                           //溫度個(gè)位
  375.                         }
  376.             TEMP_data[2]=0x2e;                                  //小數(shù)點(diǎn)
  377.             TEMP_data[3]='0';                               //溫度小數(shù)點(diǎn)后第一位            
  378.             TEMP_data[4]=0xdf;                                  //顯示溫度符號(hào)℃
  379.             TEMP_data[5]='\0';
  380.             Print(TEMP_data);                                   //輸出溫度               
  381.             GotoXY(5,1);
  382.                         if(humi>=10)
  383.                         {
  384.                             HUMI_data[0]=humi/10+'0';                                         //濕度十位      
  385.                     HUMI_data[1]=humi%10+'0';                           //濕度個(gè)位
  386.                         }
  387.                         else
  388.                         {
  389.                             HUMI_data[0]=' ';                                                         //濕度十位      
  390.                     HUMI_data[1]=humi%10+'0';                           //濕度個(gè)位                        
  391.                         }                                                                   //設(shè)置濕度顯示位置                                       
  392.             HUMI_data[2]='.' ;                                  //小數(shù)點(diǎn)
  393.             HUMI_data[3]='0';                               //濕度小數(shù)點(diǎn)后第一位   
  394.             HUMI_data[4]='\0';
  395.             Print(HUMI_data);                                   //輸出濕度         
  396.             if ((temp)<temp_low)
  397.             {
  398.                                 led1=0;
  399.                                 led6=0;
  400.                         }
  401.                         else
  402.                         {
  403.                     led1=1;
  404.                                  led6=1;
  405.                         }
  406.             if ((temp+1)>temp_high)
  407.             led2=0;
  408.             else
  409.             led2=1;
  410.             if ((humi)<humi_low)
  411.             led3=0;
  412.             else
  413.             led3=1;
  414.             if ((humi+1)>humi_high)
  415.             led4=0;
  416.             else
  417.             led4=1;
  418.             if ((humi)<humi_low)                                                  //控制繼電器加濕
  419.             led5=0;
  420.             else if ((humi)>=humi_high)  
  421.             led5=1;
  422.             if (((temp)<temp_low)|((temp+1)>temp_high)|((humi)<humi_low))
  423.             {
  424.                 for (nn=0;nn<50;nn++)
  425.                 {
  426.                     beep=0;
  427.                     delay(1);
  428.                     beep=1;
  429.                     delay(1);
  430.                 }
  431.             }
  432.             if ((humi)>humi_high)
  433.             {
  434.                 for (nn=0;nn<10;nn++)
  435.                 {
  436.                     beep=0;
  437.                     delay(1);
  438.                     beep=1;
  439.                     delay(1);
  440.                 }
  441.             }               
  442.         }
  443.         if(presskeynum==1)                                      //設(shè)定溫度上限時(shí)顯示的內(nèi)容
  444.         {
  445.             set_temp[0]=temp_high/10+0x30;
  446.             set_temp[1]=temp_high%10+0x30;
  447.             set_temp[2]=0xdf;
  448.             set_temp[3]='C';
  449.             set_temp[4]='\0';
  450.             GotoXY (0,0);
  451.             Print("SET TEMP HIGH:");
  452.             GotoXY (0,1);
  453.             Print(set_temp);
  454.         }
  455.         if(presskeynum==2)                                      //設(shè)定溫度下限時(shí)顯示的內(nèi)容
  456.         {
  457.             set_temp[0]=temp_low/10+0x30;
  458.             set_temp[1]=temp_low%10+0x30;
  459.             set_temp[2]=0xdf;
  460.             set_temp[3]='C';
  461.             set_temp[4]='\0';
  462.             GotoXY (0,0);
  463.             Print("SET TEMP LOW:");
  464.             GotoXY (0,1);
  465.             Print(set_temp);
  466.         }
  467.         if(presskeynum==3)                                      //設(shè)定濕度上限時(shí)顯示的內(nèi)容
  468.         {
  469.             set_humi[0]=humi_high/10+0x30;
  470.             set_humi[1]=humi_high%10+0x30;
  471.             set_humi[2]='%';
  472.             set_humi[3]='\0';
  473.             GotoXY (0,0);
  474.             Print("SET HUMI HIGH:");
  475.             GotoXY (0,1);
  476.             Print(set_humi);
  477.         }
  478.         if(presskeynum==4)                                      //設(shè)定濕度下限時(shí)顯示的內(nèi)容
  479.         {
  480.             set_humi[0]=humi_low/10+0x30;
  481.             set_humi[1]=humi_low%10+0x30;
  482.             set_humi[2]='%';
  483.             set_humi[3]='\0';
  484.             GotoXY (0,0);
  485.             Print("SET HUMI LOW:");
  486.             GotoXY (0,1);
  487.             Print(set_humi);
  488.         }      
  489.     }
  490. }

復(fù)制代碼
以上的Word格式文檔51黑下載地址:
源程序.docx (17.1 KB, 下載次數(shù): 22)
SD002_基于DHT11的溫濕度控制系統(tǒng)設(shè)計(jì).doc (4.77 MB, 下載次數(shù): 29)


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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