標(biāo)題: 51單片機(jī)+DHT11的恒溫控制系統(tǒng)資料+程序 [打印本頁]

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

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

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

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

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

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

特點:
內(nèi)建128x8存儲序列
2線制串行接口
雙向數(shù)據(jù)傳送協(xié)議
100kHz(1.8V,2.5V,2.7V) 和400kHz(5V)兼容
寫同步時鐘(最大10ms)
高可靠性
-極限:1M寫時鐘周期
-數(shù)據(jù)保存:100年
AT24C01提供電可擦除的串行1024位存儲或可編程只讀存儲器(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高期間改變定義為一個開始或停止信號。
開始狀態(tài):在任何操作之前必須有一個開始信號----在SCL為高時SDA上產(chǎn)生一個下降沿。
停止?fàn)顟B(tài): SCL為高時SDA產(chǎn)生一個上升沿是停止信號,停止信號后將停止所有通信。
在一個讀的序列之后,停止信號將讓EEPROM進(jìn)入備用電源模式。

3.8報警模塊及溫度濕度控制模塊

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

3.8.1蜂鳴器報警原理及溫度濕度控制模塊原理

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

3.8.2 報警電路接口

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

圖3.12報警電路及加濕加溫電路模塊

3.9供電電路

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

3.9小結(jié)

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


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





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

傳感器模塊負(fù)責(zé)溫濕度數(shù)據(jù)源的采集,首先數(shù)據(jù)口連接端P1.0輸出低電平,延時18ms之后P1.0輸出高電平,延時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è)計

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







圖4.4 鍵盤模塊軟件流程圖

4.5 小結(jié)

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


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

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

6.1 硬件問題及解決方法

   (1)LCD1602不顯示:
    檢查LCD各個端口與單片機(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)蜂鳴器不響:
因為剛開始不知道老師給的三極管是啥型號的,自己就用萬用表測試了一下就焊接上了,結(jié)果不響,我就按照三極管的型號上網(wǎng)查了一下結(jié)果發(fā)現(xiàn)自己檢測錯了,自己的是PNP型的,三個管腳分別是字面對著自己ebc。然后卸下來重新焊上去蜂鳴器就響了。
   (3)LCD1602顯示亂碼:
把程序下載到單片機(jī)上,液晶顯示的不是程序要顯示的內(nèi)容。我就用萬用表檢查8根數(shù)據(jù)線是否都接通,結(jié)果發(fā)現(xiàn)都是連通的。然后就考慮是不是數(shù)據(jù)線短路了,用萬用表分別測量8跟數(shù)據(jù)線有沒有短路的,結(jié)果發(fā)現(xiàn)有一根在焊接的時候不小心焊到旁邊的焊盤上了,導(dǎo)致數(shù)據(jù)線接到了電源線上,那根數(shù)據(jù)線就會一直顯示高電平,所以顯示就亂碼了。用烙鐵把連接的焊錫分開以后,重新上電發(fā)現(xiàn)液晶顯示正常了。

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

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

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

  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點陣
  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遞增, 畫面不動
  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. //----校驗 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ī)延時20us
  185.         Delay_10us();
  186.         Delay_10us();
  187.         Delay_10us();
  188.         Delay_10us();
  189.         DATA=1;                                                   //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號
  190.         if(!DATA)                 //判斷從機(jī)是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運行         
  191.         {
  192.             U8FLAG=2;

  193.             while((!DATA)&&U8FLAG++);        //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號是否結(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ù)校驗
  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ù)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)整按鍵檢測
  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();                                               //測量溫濕度
  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';                           //溫度個位
  370.                         }
  371.                         else
  372.                         {
  373.                     TEMP_data[0]=' ';                                                         //溫度十位      
  374.                     TEMP_data[1]=temp%10+'0';                           //溫度個位
  375.                         }
  376.             TEMP_data[2]=0x2e;                                  //小數(shù)點
  377.             TEMP_data[3]='0';                               //溫度小數(shù)點后第一位            
  378.             TEMP_data[4]=0xdf;                                  //顯示溫度符號℃
  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';                           //濕度個位
  386.                         }
  387.                         else
  388.                         {
  389.                             HUMI_data[0]=' ';                                                         //濕度十位      
  390.                     HUMI_data[1]=humi%10+'0';                           //濕度個位                        
  391.                         }                                                                   //設(shè)置濕度顯示位置                                       
  392.             HUMI_data[2]='.' ;                                  //小數(shù)點
  393.             HUMI_data[3]='0';                               //濕度小數(shù)點后第一位   
  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è)定溫度上限時顯示的內(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è)定溫度下限時顯示的內(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è)定濕度上限時顯示的內(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è)定濕度下限時顯示的內(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è)計.doc (4.77 MB, 下載次數(shù): 29)







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