找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 24643|回復(fù): 8
收起左側(cè)

基于單片機(jī)空氣質(zhì)量檢測儀畢業(yè)設(shè)計(jì)論文下載 含源碼 原理圖等

  [復(fù)制鏈接]
ID:187231 發(fā)表于 2017-4-7 19:21 | 顯示全部樓層 |閱讀模式
完整的論文及源碼下載(word格式可編輯):
基于單片機(jī)空氣質(zhì)量檢測儀設(shè)計(jì).doc (3.94 MB, 下載次數(shù): 382)


下面是論文的部分內(nèi)容預(yù)覽:


1.028.jpg
圖4-1 硬件實(shí)物圖


基于單片機(jī)空氣質(zhì)量檢測儀設(shè)計(jì)

摘  要

隨著我國經(jīng)濟(jì)的發(fā)展,人民生活水平的提高,人們對環(huán)境問題及健康問題日益重視,室內(nèi)空氣品質(zhì)(IAQ)狀況受到越來越多的關(guān)注。人的一生中有三分之二的時(shí)間是在居室內(nèi)度過的。本文研究的室內(nèi)便攜式智能空氣品質(zhì)監(jiān)測儀是以室內(nèi)空氣中有毒有害氣體的監(jiān)測監(jiān)控為背景,是以STC工公司的一款8位超低功耗單片機(jī)STC90C51為控制核心,能夠?qū)崿F(xiàn)對室內(nèi)溫度,濕度,VOC氣體的實(shí)時(shí)采集處理、顯示、報(bào)警等功能。儀器采用鋰電池供電,具有良好的便攜性和通用性,并且使用LCD1602點(diǎn)陣式液晶屏顯示菜單,有良好的人機(jī)對話界面。同時(shí)設(shè)計(jì)了聲光報(bào)警系統(tǒng),實(shí)現(xiàn)在參數(shù)超標(biāo)時(shí)及時(shí)的報(bào)警。室內(nèi)智能空氣品質(zhì)監(jiān)測儀體積小,功耗低,操作簡單,適合應(yīng)用于家庭和社區(qū)的醫(yī)療健康保健,能夠?qū)崟r(shí)知道室內(nèi)空氣的質(zhì)量。


目  錄

前  言
第1章              本課題的主要研究內(nèi)容、方法及總體設(shè)計(jì)
§1.1 課題設(shè)計(jì)的內(nèi)容
§1.2課題設(shè)計(jì)的方法
第2章 空氣質(zhì)量檢測儀的硬件設(shè)計(jì)
§2.1 空氣質(zhì)量檢測儀系統(tǒng)簡介
§2.1.1 系統(tǒng)硬件結(jié)構(gòu)及原理
§2.2 STC90C51單片機(jī)簡介
§2.2.1STC90C51主要性能參數(shù):
§2.2.2時(shí)鐘電路模塊
§2.2.3復(fù)位電路模塊
§2.3傳感器的選用
§2.3.1氣體傳感器
§2.3.2溫濕度傳感器
§2.4模數(shù)轉(zhuǎn)換電路設(shè)計(jì)
§2.5聲光報(bào)警電路設(shè)計(jì)
§2.6液晶顯示電路設(shè)計(jì)
§2.6.1LCD1602的基本參數(shù)及引腳功能
§2.6.2LCD1602的指令說明及時(shí)序
§2.6.31602LCD的RAM地址映射及標(biāo)準(zhǔn)字庫表
§2.6.4LCD1602的一般初始化過程
§2.7按鍵電路設(shè)計(jì)
§2.8電路電源設(shè)計(jì)
§2.9本章小結(jié)
第3章 空氣質(zhì)量檢測儀的軟件設(shè)計(jì)
§3.1 系統(tǒng)軟件設(shè)計(jì)思路
§3.1.1 編程語言的選擇
§3.1.2 軟件功能需求
§3.2軟件模塊設(shè)計(jì)
§3.2.1主程序模塊
§3.2.2AD轉(zhuǎn)換模塊
§3.2.3液晶顯示模塊
§3.2.4聲光報(bào)警模塊
§3.2.5按鍵模塊
§3.3本章小結(jié)
第4章 仿真調(diào)試
§4.1系統(tǒng)硬件調(diào)試
§4.1.1 常見的硬件故障
§4.1.2硬件調(diào)試方法
§4.2 系統(tǒng)軟件調(diào)試
§4.3本章小結(jié)
結(jié)  論            
§1主要結(jié)論
§2展望
參考文獻(xiàn)
致 謝
附 錄
附錄一
附錄二




河南科技大學(xué)畢業(yè)設(shè)計(jì)(論文)
前  言

一、課題研究的目的及意義
空氣質(zhì)量的好壞反映了空氣污染程度,它是依據(jù)空氣中污染物濃度的高低來判斷的。來自固定和流動污染源的人為污染物排放大小是影響空氣質(zhì)量的最主要因素之一?諝赓|(zhì)量檢測種類包括裝修污染、辦公室內(nèi)空氣檢測、作業(yè)場所有害物質(zhì)檢測、食堂油煙檢測、鍋爐大氣及工業(yè)窯爐檢測及工廠排放工業(yè)廢氣檢測。
當(dāng)今,人類正面臨“煤煙污染”、“光化學(xué)煙霧污染”之后,又出現(xiàn)了“室內(nèi)空氣污染”為主的第三次環(huán)境污染。美國專家檢測發(fā)現(xiàn),在室內(nèi)空氣中存在500多種揮發(fā)性有機(jī)物,其中致癌物質(zhì)就有20多種,致病病毒200多種。危害較大的主要有:氡、甲醛、苯、氨以及酯、三氯乙烯等。大量觸目驚心的事實(shí)證實(shí),室內(nèi)空氣污染已成為危害人類健康的“隱形殺手”,也成為全世界各國共同關(guān)注的問題。據(jù)統(tǒng)計(jì),全球近一半的人處于室內(nèi)空氣污染中,室內(nèi)環(huán)境污染已經(jīng)引起35.7%的呼吸道疾病,22%的慢性肺病和15%的氣管炎、支氣管炎和肺癌。
本課題主要研究設(shè)計(jì)基于量化檢測的“空氣質(zhì)量檢測儀”系統(tǒng),此系統(tǒng)旨在實(shí)現(xiàn)室內(nèi)空氣溫度、濕度、有害氣體的預(yù)警監(jiān)測,有利于進(jìn)行全方位的評價(jià)室內(nèi)空氣質(zhì)量,為人類營造一個(gè)健康的室內(nèi)生存空間?諝赓|(zhì)量檢測儀體積小,功耗低,操作簡單,適合應(yīng)用于家庭和社區(qū)的醫(yī)療健康保健,能夠?qū)崟r(shí)知道室內(nèi)空氣的質(zhì)量。
二、國內(nèi)外的研究狀況
氣體傳感器測定甲醛成為近年來甲醛檢測研究的新熱點(diǎn)。早在1983年,壓電類甲醛傳感器就已問世。這種傳感器可以不需要對樣品進(jìn)行任何處理就可以測定,但易受水分子的影響而使晶體震動頻率發(fā)生漂移,故基本無實(shí)用性。為適應(yīng)室內(nèi)空氣甲醛現(xiàn)場快速檢測的要求,目前已開發(fā)出不少甲醛快速測定儀,這些儀器可直接在現(xiàn)場測定甲醛濃度,操作方便,適用于室內(nèi)和公共場所空氣中甲醛濃度的現(xiàn)場測定,也適用于環(huán)境測試艙法測定木質(zhì)板材中的甲醛釋放量。但這些儀器的工作原理、響應(yīng)性能、適應(yīng)范圍等都不同。
在測試甲醛、苯等害氣體方面,國外比較出名的有:美國ESC公司生產(chǎn)的Z一300甲醛檢測儀、英國PPM公司生產(chǎn)的PPM-400甲醛檢測儀;國內(nèi)的有:江蘇安普電子工程有限公司生產(chǎn)的400型甲醛分析儀、北京賓達(dá)綠創(chuàng)科技有限公司生產(chǎn)的甲醛測定儀抑一308等。
這些儀器可實(shí)現(xiàn)對有害氣體的檢測功能,適用于專業(yè)檢測機(jī)構(gòu)或?qū)嶒?yàn)研究機(jī)構(gòu)。準(zhǔn)確測定甲醛、苯、氨等有害氣體的設(shè)備昂貴(如英國PPM公司生產(chǎn)的PPM400甲醛儀約兩萬多元),測定時(shí)間較長,每隔一段時(shí)間就需進(jìn)行重新標(biāo)定,需要專業(yè)人員進(jìn)行操作,很難連續(xù)測定;目前國內(nèi)外產(chǎn)品的設(shè)計(jì)差異主要集中在監(jiān)測傳感器和控制單片機(jī)芯片的選用,操作方面國外的產(chǎn)品操作界面方便,功能加完備。



  •          本課題的主要研究內(nèi)容、方法及總體設(shè)計(jì)


§1.1 課題設(shè)計(jì)的內(nèi)容

以單片機(jī)為核心,選擇合適的傳感器,實(shí)現(xiàn)對空氣質(zhì)量的檢測。

§1.2課題設(shè)計(jì)的方法

查閱相關(guān)資料,應(yīng)用電腦軟件進(jìn)行仿真、調(diào)試,制作硬件設(shè)備,在實(shí)際環(huán)境中測試并進(jìn)行修改、調(diào)試,直至達(dá)到課題要求。

§1.3總體方案設(shè)計(jì)
本設(shè)計(jì)集VOC氣體及溫濕度監(jiān)測,顯示與報(bào)警于一體,利用MCU進(jìn)行數(shù)據(jù)采集保證了前臺數(shù)據(jù)的及時(shí)、準(zhǔn)確,有利于進(jìn)行全方位的評價(jià)。儀器采用鋰電池供電,具有良好的便攜性和通用性,并且使用LCD點(diǎn)陣式液晶屏顯示菜單,有良好的人機(jī)對話界面。
§1.3.1系統(tǒng)框圖
1.001.jpg


圖1-1 系統(tǒng)總框圖
§1.3.2功能設(shè)定
  • 顯示部分采用LCD1602顯示屏,循環(huán)顯示各項(xiàng)測量的上下限及實(shí)際濃度、實(shí)際溫度、濕度。并在按鍵選擇情況下連續(xù)顯示一個(gè)測量值的變化。
  • 當(dāng)有害氣體濃度超出安全范圍時(shí)進(jìn)行聲光報(bào)警。
  • 按鍵操作可進(jìn)行測量范圍的調(diào)整,及手動和自動測量的轉(zhuǎn)換。


第2章 空氣質(zhì)量檢測儀的硬件設(shè)計(jì)


§2.1 空氣質(zhì)量檢測儀系統(tǒng)簡介

基于STC90C51的室內(nèi)便攜式智能空氣質(zhì)量監(jiān)測儀是以室內(nèi)空氣中有毒有害氣體的監(jiān)測監(jiān)控為背景,能夠?qū)崿F(xiàn)對室內(nèi)溫度,濕度,VOC氣體的實(shí)時(shí)采集處理、顯示、報(bào)警等功能。儀器采用鋰電池供電,具有良好的便攜性和通用性,并且使用LCD點(diǎn)陣式液晶屏顯示菜單,有良好的人機(jī)對話界面。同時(shí)設(shè)計(jì)了聲光報(bào)警系統(tǒng),實(shí)現(xiàn)在參數(shù)超標(biāo)時(shí)及時(shí)的報(bào)警。室內(nèi)智能空氣品質(zhì)監(jiān)測儀體積小,功耗低,操作簡單,適合應(yīng)用于家庭和社區(qū)的醫(yī)療健康保健,能夠?qū)崟r(shí)知道室內(nèi)空氣的質(zhì)量。
§2.1.1 系統(tǒng)硬件結(jié)構(gòu)及原理
本文研究的室內(nèi)便攜式智能空氣品質(zhì)監(jiān)測儀是以STC工公司的一款8位超低功耗單片機(jī)STC90C51為控制核心。室內(nèi)空氣中有害氣體通過傳感器輸出一個(gè)與氣體濃度相對應(yīng)的電壓信號,該信號經(jīng)過A/D轉(zhuǎn)換電路按一定得采樣頻率將模擬信號轉(zhuǎn)換為數(shù)字信號送入單片機(jī)進(jìn)行數(shù)據(jù)采集以便進(jìn)行顯示處理,溫濕傳感器直接與單片機(jī)相連。單片機(jī)對采樣值進(jìn)行數(shù)字處理后驅(qū)動液晶顯示器分別顯示出被測室內(nèi)空氣中的VOC氣體濃度值及溫濕度。若被測室內(nèi)空氣中VOC氣體的濃度有超過國家標(biāo)準(zhǔn)或設(shè)定的危險(xiǎn)值或溫濕度超出設(shè)定范圍時(shí)報(bào)警電路對應(yīng)的發(fā)出聲光報(bào)警信號。

§2.2 STC90C51單片機(jī)簡介

隨著計(jì)算機(jī)技術(shù)的發(fā)展,單片機(jī)因具有集成度高、體積小、速度快、價(jià)格低等特點(diǎn)而在許多領(lǐng)域如過程控制、數(shù)據(jù)采集、機(jī)電一體化、智能化儀表、家用電器以及網(wǎng)絡(luò)技術(shù)等方面得到廣泛應(yīng)用,從而使這些領(lǐng)域的技術(shù)水平、自動化程度大大提高。根據(jù)上述幾方面及本課題的實(shí)際情況,單片機(jī)型號的選擇主要從以下兩點(diǎn)考慮:
一是要有較強(qiáng)的抗干擾能力。由于一般室內(nèi)電子電器產(chǎn)品比較多,這對單片機(jī)的干擾較大,所以應(yīng)采用抗干擾性能較好的單片機(jī)機(jī)型。
二是要有較高的性價(jià)比。由于高度的通用性和出色的穩(wěn)定性,本系統(tǒng)采用宏晶公司產(chǎn)的低功耗,高性能CMOS 8位單片機(jī)的STC90C51作為控制器。片內(nèi)含4k bytes的可系統(tǒng)編程的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)8051指令系統(tǒng)及引腳。它集Flash程序存儲器既可在線編程(ISP)也可用傳統(tǒng)方法進(jìn)行編程及通用8位微處理器于單片芯片中,可提供許多高性價(jià)比的應(yīng)用場合,可靈活應(yīng)用于各種控制領(lǐng)域。
§2.2.1STC90C51主要性能參數(shù):







    • MCS.51產(chǎn)品指令系統(tǒng)完全兼容
    • 4k字節(jié)在系統(tǒng)編程(ISP)Flash閃速存儲器
    • 1000次擦寫周期
    • 4.0-5.5V的工作電壓范圍
    • 全境態(tài)工作模式:0Hz-33MHz
    • 三級程序加密鎖
    • 128×8字節(jié)內(nèi)部RAM
    • 32個(gè)可編程IO口線
    • 2個(gè)16位定時(shí)器計(jì)數(shù)器
10、6個(gè)中斷源
11、全雙工串行UART通道
12、低功耗空閑和掉電模式
13、中斷可從空閑模喚醒系統(tǒng)
14、看門狗(wDT)及雙數(shù)據(jù)指針
15、掉電標(biāo)識和快速編程特性
16、靈活的在線系統(tǒng)編程
STC90C51芯片管腳如圖2-1。
    1.002.jpg
圖2-1 STC90C51引腳布置
§2.2.2時(shí)鐘電路模塊
時(shí)鐘電路由一個(gè)晶體振蕩器12MHZ和兩個(gè)30pF的瓷片電容組成。時(shí)鐘電路用于產(chǎn)生單片機(jī)工作所需要的時(shí)鐘信號,而時(shí)序所研究的是指令執(zhí)行中各信號之間的相互關(guān)系。單片機(jī)本身就如一個(gè)復(fù)雜的同步時(shí)序電路,為了保證同步工作方式的實(shí)現(xiàn),電路應(yīng)在唯一的時(shí)鐘信號控制下嚴(yán)格地工作。其電路如圖2-2所示:
1.003.jpg
圖2-2 時(shí)鐘電路模塊
§2.2.3復(fù)位電路模塊
復(fù)位電路是使單片機(jī)的CPU或系統(tǒng)中的其他部件處于某一確定的初始狀態(tài),并從這狀態(tài)開始工作,除了進(jìn)入系統(tǒng)的正常初始化之外,當(dāng)由于程序運(yùn)行出錯(cuò)或操作錯(cuò)誤使系統(tǒng)處于死鎖狀態(tài)時(shí),為擺脫困境,也需按復(fù)位電路以重新啟動。本設(shè)計(jì)采用的是按鍵復(fù)位電路。其電路如圖2-3所示:
1.004.jpg
圖2-3 復(fù)位電路模塊

§2.3傳感器的選用

§2.3.1氣體傳感器
1.氣體傳感器基礎(chǔ)知識
按照氣敏特性來分,氣體傳感器主要分為:半導(dǎo)體型、電化學(xué)型、固體電解質(zhì)型、接觸燃燒型、光化學(xué)型等氣體傳感器,又以前兩種最為普遍。
    (1)半導(dǎo)體型氣體傳感器的優(yōu)缺點(diǎn)
半導(dǎo)體氣體傳感器具有成本低廉、制造簡單、靈敏度高、響應(yīng)速度快、壽命長、對濕度敏感低和電路簡單等優(yōu)點(diǎn)。不足之處是必須在高溫下工作、對氣體或氣味的選擇性差、元件參數(shù)分散、穩(wěn)定性不理想、功率高等方面。
(2)半導(dǎo)體傳感器需要加熱的原因
半導(dǎo)體傳感器是利用一種金屬氧化物薄膜制成的阻抗器件,其電阻隨著氣體含量不同而變化。氣體分子在薄膜表面進(jìn)行還原反應(yīng)以引起傳感器電導(dǎo)率的變化。為了消除氣體分子達(dá)到初始狀態(tài)就必須發(fā)生一次氧化反應(yīng)。傳感器內(nèi)的加熱器可以加速氧化過程,這也是為什么有些低端傳感器總是不穩(wěn)定,其原因就是沒有加熱或加熱電壓過低導(dǎo)致溫度太低反應(yīng)不充分。
(3)電化學(xué)氣體傳感器的工作原理
電化學(xué)氣體傳感器是通過監(jiān)測電流來監(jiān)測氣體的濃度,分為不需供電的原電池式以及需要供電的可控電位電解式,目前可以監(jiān)測許多有毒氣體和氧氣,后者還能監(jiān)測血液中的氧濃度。電化學(xué)傳感器的主要優(yōu)點(diǎn)是氣體的高靈敏度以及良好的選擇性。不足之處是有壽命的限制一般為兩年。
(4)半導(dǎo)體傳感器和電化學(xué)傳感器的區(qū)別
半導(dǎo)體傳感器因其簡單低價(jià)已經(jīng)得到廣泛應(yīng)用,但是又因?yàn)樗倪x擇性差和穩(wěn)定性不理想目前還只是在民用級別使用。而電化學(xué)傳感器因其良好的選擇性和高靈敏度被廣泛應(yīng)用在幾乎所有工業(yè)場合。
(5)固態(tài)電解質(zhì)氣體傳感器
顧名思義,固態(tài)電解質(zhì)就是以固體離子導(dǎo)電為電解質(zhì)的化學(xué)電池。它介于半導(dǎo)體和電化學(xué)之間。選擇性,靈敏度高于半導(dǎo)體而壽命又長于電化學(xué),所以也得到了很多的應(yīng)用,不足之處就是響應(yīng)時(shí)間過長。
(6)接觸燃燒式氣體傳感器
接觸燃燒式氣體傳感器只能測量可燃?xì)怏w。又分為直接接觸燃燒式和催化接觸燃燒式,原理是氣敏材料在通電狀態(tài)下,可燃?xì)怏w在表面或者在催化劑作用下燃燒,由于燃燒使氣敏材料溫度升高從而電阻發(fā)生變化。后者因?yàn)榇呋瘎┑年P(guān)系具有廣普特性應(yīng)用更廣。
(7)光學(xué)式氣體傳感器
光學(xué)式氣體傳感器主要包括紅外吸收型、光譜吸收型、熒光型等等,主要以紅外吸收型為主。由于不同氣體對紅外波吸收程度不同,通過測量紅外吸收波長來監(jiān)測氣體。目前因?yàn)樗慕Y(jié)構(gòu)關(guān)系一般造價(jià)頗高。基于本文的實(shí)時(shí)要求和性價(jià)比等方面的原因,本系統(tǒng)選用電化學(xué)傳感器中的定電位電解式氣體傳感器。
本設(shè)計(jì)針對VOC氣體選用能夠偵測0.1ppm以上的氣體的空氣質(zhì)量VOC氣體濃度傳感器MS1100用于檢測空氣中的甲醛、苯、二甲苯等檢測空氣中的甲醛、苯、二甲苯等多種有機(jī)揮發(fā)成分,具有極高的靈敏度和穩(wěn)定性,體積小巧。實(shí)物如圖2-4,使用時(shí)的連接電路如圖2-5。
1.005.jpg        1.006.jpg
   圖2-4 VOC傳感器實(shí)物圖      圖2-5 VOC傳感器接線圖
§2.3.2溫濕度傳感器
溫濕度傳感器是指能將溫度量和濕度量轉(zhuǎn)換成容易被測量處理的電信號的設(shè)備或裝置。溫濕度傳感器一般是測量溫度量和相對濕度量。
鑒于測量溫濕度的范圍不大,精度要求不高故采用數(shù)字溫濕度傳感器DHT11。實(shí)物如圖2-6。
1.007.jpg
圖2-6 DHT11實(shí)物圖
具有的特性:相對濕度和溫度測量、全部校準(zhǔn),數(shù)字輸出、卓越的長期穩(wěn)定性、無需額外部件、超長的信號傳輸距離、超低能耗、4引腳安裝、完全互換。
DHT11產(chǎn)品概述
DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達(dá)20米以上,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場合的最佳選則。產(chǎn)品為4針單排引腳封裝。連接方便,特殊封裝形式可根據(jù)用戶需求而提供。
應(yīng)用領(lǐng)域:
暖通空調(diào)、測試及檢測設(shè)備、汽車、數(shù)據(jù)記錄器、消費(fèi)品、自動控制、氣象站、家電、濕度調(diào)節(jié)器、醫(yī)療、除濕器。
傳感器信息見表2-1。
表2-1 DHT11傳感器信息
型號
測量范圍
測濕精度
測溫精度
分辨力
封裝
DHT11
20-90%RH 0-50℃
±5%RH
±2℃
1
4針單排直插

  • 傳感器性能說明見表2-2。
表2-2 傳感器性能說明
參數(shù)
條件
Min
Typ
Max
單位
濕度
分辨率


1
1
1
%RH


16


Bit
重復(fù)性




±1


%RH
精度
25℃


±4


%RH
0-50℃




±5
%RH
互換性
可完全互換
量程范圍
0℃
30


90
%RH
25℃
20


90
%RH
50℃
20


80
%RH
響應(yīng)時(shí)間
1/e(63%)25℃,1m/s空氣
6
10
15
S
遲滯




±1


%RH
長期穩(wěn)定性
典型值


±1


%RH/yr
溫度
分辨率



1
1
1
16
16
16
Bit
重復(fù)性




±1


精度


±1


±2
量程范圍


0


50
響應(yīng)時(shí)間
1/e(63%)
6


30
S

2、 接口說明  
建議連接線長度短于20米時(shí)用5K上拉電阻,大于20米時(shí)根據(jù)實(shí)際情況使用合適的上拉電阻接線方式如圖2-7。
1.008.jpg
圖2-7 典型接線電路
3、電源引腳
DHT11的供電電壓為              3-5.5V。傳感器上電后,要等待 1s 以越過不穩(wěn)定狀態(tài)在此期間無需發(fā)送任何指令。電源引腳(VDD,GND)之間可增加一個(gè)100nF 的電容,用以去耦濾波。
4、串行接口  (單線雙向)
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時(shí)間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明,當(dāng)前小數(shù)部分用于以后擴(kuò)展,現(xiàn)讀出為零.操作流程如下:
一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和
數(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位。
用戶MCU發(fā)送一次開始信號后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機(jī)開始信號結(jié)束后,DHT11發(fā)送響應(yīng)信號,送出40bit的數(shù)據(jù),并觸發(fā)一次信號采集,用戶可選擇讀取部分?jǐn)?shù)據(jù)。從模式下,DHT11接收到開始信號觸發(fā)一次溫濕度采集,如果沒有接收到主機(jī)發(fā)送開始信號,DHT11不會主動進(jìn)行溫濕度采集,采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。
(1).通訊過程如圖2-8所示
1.009.jpg
圖2-8 通訊過程
操作時(shí)序如圖2-9,總線空閑狀態(tài)為高電平,主機(jī)把總線拉低等待DHT11響應(yīng),主機(jī)把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機(jī)的開始信號后,等待主機(jī)開始信號結(jié)束,然后發(fā)送80us低電平響應(yīng)信號。主機(jī)發(fā)送開始信號結(jié)束后,延時(shí)等待20-40us后,讀取DHT11的響應(yīng)信號,主機(jī)發(fā)送開始信號后,可以切換到輸入模式,或者輸出高電平均可,總線由上拉電阻拉高。
1.010.jpg 圖2-9 操作時(shí)序
總線為低電平,說明DHT11發(fā)送響應(yīng)信號,DHT11發(fā)送響應(yīng)信號后,再把總線拉高80us,準(zhǔn)備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時(shí)隙開始,高電平的長短定了數(shù)據(jù)位是0還是1。格式見下面圖示,如果讀取響應(yīng)信號為高電平,則DHT11沒有響應(yīng),請檢查線路是否連接正常。當(dāng)最后一bit數(shù)據(jù)傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進(jìn)入空閑狀態(tài)。            
數(shù)字0信號表示方法如圖2-10所示
1.011.jpg 圖2-10 數(shù)字0信號表示方法
數(shù)字1信號表示方法如圖2-11所示
1.012.jpg
圖2-11 數(shù)字1信號表示方法
5、測量分辨率
測量分辨率分別為 8bit(溫度)、8bit(濕度)。
6、電氣特性如表2-3
表2-3 電氣特性
參數(shù)
條件
min
typ
max
單位
供電
DC
3
5
5.5
V

供電電流

測量
0.5


2.5
mA
平均
0.2


1
mA
待機(jī)
100


150
uA
采樣周期
1





注:采樣周期間隔不得低于1秒鐘。
7、應(yīng)用信息
7.1工作與貯存條件
超出建議的工作范圍可能導(dǎo)致高達(dá)3%RH的臨時(shí)性漂移信號。返回正常工作條后,傳感器會緩慢地向校準(zhǔn)狀態(tài)恢復(fù)。要加速恢復(fù)進(jìn)程/可參閱7.3小節(jié)的“恢復(fù)處理”。在非正常工作條件下長時(shí)間使用會加速產(chǎn)品的老化過程。
7.2暴露在化學(xué)物質(zhì)中
電阻式濕度傳感器的感應(yīng)層會受到化學(xué)蒸汽的干擾,化學(xué)物質(zhì)在感應(yīng)層中的擴(kuò)散可能導(dǎo)致測量值漂移和靈敏度下降。在一個(gè)純凈的環(huán)境中,污染物質(zhì)會緩慢地釋放出去。下文所述的恢復(fù)處理將加速實(shí)現(xiàn)這一過程。高濃度的化學(xué)污染會導(dǎo)致傳感器感應(yīng)層的徹底損壞。
7.3恢復(fù)處理
置于極限工作條件下或化學(xué)蒸汽中的傳感器,通過如下處理程序,可使其恢復(fù)到校準(zhǔn)時(shí)的狀態(tài)。在50-60℃和< 10%RH的濕度條件下保持2小時(shí)(烘干);隨后在20-30℃和>70%RH的濕度條件下保持5小時(shí)以上。
7.4溫度影響
氣體的相對濕度,在很大程度上依賴于溫度。因此在測量濕度時(shí),應(yīng)盡可能保證濕度傳感器在同一溫度下工作。如果與釋放熱量的電子元件共用一個(gè)印刷線路板,在安裝時(shí)應(yīng)盡可能將DHT11遠(yuǎn)離電子元件,并安裝在熱源下方,同時(shí)保持外殼的良好通風(fēng)。為降低熱傳導(dǎo),DHT11與印刷電路板其它部分的銅鍍層應(yīng)盡可能最小,并在兩者之間留出一道縫隙。
7.5光線
長時(shí)間暴露在太陽光下或強(qiáng)烈的紫外線輻射中,會使性能降低。
7.6配線注意事項(xiàng)
DATA信號線材質(zhì)量會影響通訊距離和通訊質(zhì)量,推薦使用高質(zhì)量屏蔽線。
8、封裝信息如圖2-12,
1.013.jpg
圖2-12 DHT11封裝圖
  • DHT11引腳說明見表2-4。


表2-4 引腳說明
Pin
名稱
注釋
1
VDD
供電 3-5.5VDC
2
DATA
串行數(shù)據(jù),單總線
3
NC
空腳,請懸空
4
GND
接地,電源負(fù)極

本設(shè)計(jì)采用的為DHT11模塊,原理圖為圖2-13:
1.014.jpg
圖2-13 DHT11模塊接線圖

§2.4模數(shù)轉(zhuǎn)換電路設(shè)計(jì)

氣體傳感器出來的信號是模擬信號,而微處理器STC90C51只能處理數(shù)字信號,故需要對模擬信號信號進(jìn)行轉(zhuǎn)換,將其轉(zhuǎn)換為處理器能識別的數(shù)字信號,由于測試電路出來的模擬電壓變化范圍在0~5V,故選擇性價(jià)比比較合適的ADC0809進(jìn)行模數(shù)轉(zhuǎn)換。其管腳定義如圖2-14所示。
1.015.jpg
圖2-14 ADC0809管腳示意圖
ADC0809各腳功能如表2-5:
表2-5 ADC0809各腳功能
引腳
功能介紹
D7-D0
IN0-IN7
8位數(shù)字量輸出引腳
8位模擬量輸入引腳
VCC
+5V工作電壓
REF(+)
參考電壓正端
REF(-)
參考電壓負(fù)端
START
A/D轉(zhuǎn)換啟動信號輸入端
ALE
地址鎖存允許信號輸入端
EOC
轉(zhuǎn)換結(jié)束信號輸出引腳,開始轉(zhuǎn)換時(shí)為低電平,當(dāng)轉(zhuǎn)換結(jié)束時(shí)為高電平
OE
輸出允許控制端,用以打開三態(tài)數(shù)據(jù)輸出鎖存器。
CLK
時(shí)鐘信號輸入端(一般為500KHz)。
A、B、C
地址輸入線
ADC0809對輸入模擬量要求:信號單極性,電壓范圍是0-5V,若信號太小,必須進(jìn)行放大;輸入的模擬量在轉(zhuǎn)換過程中應(yīng)該保持不變,如若模擬量變化太快,則需在輸入前增加采樣保持電路。ADC0809的時(shí)序接口為51系列單片機(jī)的標(biāo)準(zhǔn)總線接口,操作方便,如同對存儲器或I/O操作一樣,A/D轉(zhuǎn)換精度為8比特,滿足本課題要求。輸入的模擬電壓為0~5V,一次A/D轉(zhuǎn)換時(shí)間為100μS。
ADC0809與單片機(jī)及VOC傳感器的接線方式如圖2-15:
1.016.jpg
圖2-15 ADC0809接線原理圖

§2.5聲光報(bào)警電路設(shè)計(jì)

為了使本系統(tǒng)對室內(nèi)空氣品質(zhì)的監(jiān)測更為直觀,采用了如圖2-16由2個(gè)發(fā)光二極管和一個(gè)蜂鳴器構(gòu)成的聲光報(bào)警電路。其中VOC氣體含量超標(biāo)時(shí)雙燈閃爍蜂鳴器報(bào)警,溫度超標(biāo)時(shí)D1燈亮蜂鳴器報(bào)警,濕度超標(biāo)時(shí)D2燈亮蜂鳴器報(bào)警。
1.017.jpg
圖2-16 聲光報(bào)警電路

§2.6液晶顯示電路設(shè)計(jì)

本課題所要顯示的數(shù)據(jù)一共有6個(gè),分別是有毒氣體的濃度和室內(nèi)的溫度、濕度的范圍和測量值,故選用2行16個(gè)字符的LCD1602作為顯示模塊,滿足顯示要求。液晶顯示模塊具有體積小、功耗低、顯示內(nèi)容豐富等特點(diǎn),現(xiàn)在字符型液晶顯示模塊已經(jīng)是單片機(jī)應(yīng)用設(shè)計(jì)中最常用的信息顯示器件了。
    字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號等點(diǎn)陣式LCD,目前常用16*1,16*2,20*2和40*2行等的模塊。下面以長沙太陽人電子有限公司的1602字符型液晶顯示器為例,介紹其用法。一般1602字符型液晶顯示器實(shí)物如圖2-17:
1.018.jpg
1.019.jpg
圖2-17 1602字符型液晶顯示器實(shí)物圖
§2.6.1LCD1602的基本參數(shù)及引腳功能
1602LCD分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應(yīng)用中并無差別,兩者尺寸差別如下圖2-18所示:
1.020.jpg
圖2-18 1602LCD尺寸圖
1602LCD主要技術(shù)參數(shù):
顯示容量:16x2個(gè)字符芯片
工作電壓:4.5V—5.5V
工作電流:2.0Ma(5V)
模塊兒最佳工作電壓:5.0V
字符尺寸:2.95×4.35(W×H)mm
引腳功能說明:
1602LCD采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(有背光)接口,各引腳說明如表2-6所示:
表2-6  1602引腳說明
編號
符號
引腳說明
編號
符號
引腳說明
1
VSS
電源地
9
D2
數(shù)據(jù)
2
VDD
電源正極
10
D3
數(shù)據(jù)
3
VL
液晶顯示偏壓
11
D4
數(shù)據(jù)
4
RS
數(shù)據(jù)/命令選擇
12
D5
數(shù)據(jù)
5
R/W
讀/寫選擇
13
D6
數(shù)據(jù)
6
E
使能信號
14
D7
數(shù)據(jù)
7
D0
數(shù)據(jù)
15
BLA
背光源正極
8
D1
數(shù)據(jù)
16
BLK
背光源負(fù)極

第1腳:VSS為地電源。
第2腳:VDD接+5V正電源。
第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時(shí)對比度最弱,接地時(shí)對比度最高,對比度過高時(shí)會產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對比度。
第4腳:PS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號,當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),夜景模塊執(zhí)行命令。
第7~14腳:D0~D7為八位雙向數(shù)據(jù)線。
第15腳:背光源正極。
第16腳:背光源負(fù)極。
§2.6.2LCD1602的指令說明及時(shí)序
1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表2-7所示:


表2-7 控制命令表
序號
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清顯示
0
0
0
0
0
0
0
0
0
1
2
光標(biāo)返回
0
0
0
0
0
0
0
0
1
*
3
置輸入模式
0
0
0
0
0
0
0
1
I/D
S
4
顯示開/關(guān)控制
0
0
0
0
0
0
1
D
C
B
5
光標(biāo)或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符發(fā)生存貯器地址
0
0
0
1
字符發(fā)生存貯器地址
8
置數(shù)據(jù)存貯器地址
0
0
1
顯示數(shù)據(jù)存貯器地址
9
讀忙標(biāo)志或地址
0
1
BF
計(jì)數(shù)器地址
10
寫數(shù)到CGRAM或DDRAM
1
0
要寫的數(shù)據(jù)內(nèi)容
11
從CGRAM或DDRAM讀數(shù)
1
1
讀出的數(shù)據(jù)內(nèi)容

1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實(shí)現(xiàn)的。(說明:1為高電平、0為低電平)
指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。
指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。
指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。
指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。
指令5:光標(biāo)或顯示移位 S/C:高電平時(shí)移動顯示的文字,低電平時(shí)移動光標(biāo)。
指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線 N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F: 低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。
指令7:字符發(fā)生器RAM地址設(shè)置。
指令8:DDRAM地址設(shè)置。
指令9:讀忙信號和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。
指令10:寫數(shù)據(jù)。
指令11:讀數(shù)據(jù)。
與HD44780相兼容的芯片時(shí)序如表2-8:
表2-8 基本操作時(shí)序表
讀狀態(tài)
輸入
RS=L,R/W=H,E=H
輸出
D0—D7=狀態(tài)字
寫指令
輸入
RS=L,R/W=L,D0—D7=指令碼,E=高脈沖
輸出
讀數(shù)據(jù)
輸入
RS=H,R/W=H,E=H
輸出
D0—D7=數(shù)據(jù)
寫數(shù)據(jù)
輸入
RS=H,R/W=L,D0—D7=數(shù)據(jù),E=高脈沖
輸出

讀寫操作時(shí)序如圖2-19和2-20所示:
1.021.jpg
圖2-19 讀操作時(shí)序
1.022.jpg
圖2-20 寫操作時(shí)序
§2.6.31602LCD的RAM地址映射及標(biāo)準(zhǔn)字庫表
液晶顯示模塊是一個(gè)慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時(shí)要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖2-21是1602的內(nèi)部顯示地址。
1.023.jpg
圖2-21 1602LCD內(nèi)部顯示地址
第二行第一個(gè)字符的地址是40H,寫入顯示地址時(shí)要求最高位D7恒定為高電平1所以實(shí)際寫入的數(shù)據(jù)應(yīng)該是:
01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在對液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時(shí)光標(biāo)是自動右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。
1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個(gè)不同的點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼。
§2.6.4LCD1602的一般初始化過程
延時(shí)15mS
寫指令38H(不檢測忙信號)
延時(shí)5mS
寫指令38H(不檢測忙信號)
延時(shí)5mS
寫指令38H(不檢測忙信號)
以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢測忙信號
寫指令38H:顯示模式設(shè)置
寫指令08H:顯示關(guān)閉
寫指令01H:顯示清屏
寫指令06H:顯示光標(biāo)移動設(shè)置
寫指令0CH:顯示開及光標(biāo)設(shè)置
LCD1602的具體接線路圖如圖2-22所示。
1.024.jpg
圖2-22 LCD1602接線電路圖


§2.7按鍵電路設(shè)計(jì)

考慮到整個(gè)測量系統(tǒng)中不同環(huán)境對氣體濃度及溫濕度范圍要求不同,故設(shè)置了按鍵功能,用于實(shí)現(xiàn)測量范圍的調(diào)整,參考單片機(jī)引腳使用情況,共設(shè)置五個(gè)獨(dú)立按鍵如圖2-23,實(shí)現(xiàn)功能為設(shè)定鍵可進(jìn)行設(shè)定的進(jìn)入與退出,同時(shí)可實(shí)現(xiàn)三種范圍的切換,另設(shè)左右移位鍵、上下調(diào)值鍵各兩個(gè),與此同時(shí)考慮到用戶可能需要在一定時(shí)間內(nèi)連續(xù)測量一種量,故設(shè)計(jì)了上調(diào)鍵的第二功能:當(dāng)只有上調(diào)鍵按下時(shí)完成顯示的自動與手動的切換以實(shí)現(xiàn)良好的人機(jī)對話。
1.025.jpg
圖2-23 按鍵電路
§2.8電路電源設(shè)計(jì)

本設(shè)計(jì)采用集成穩(wěn)壓器7805,C29、C30分別為輸入端和輸出端濾波電容,D1為續(xù)流二極管。當(dāng)輸出電流較大時(shí),7805應(yīng)配上散熱板。電源電路如圖2-24所示:
1.026.jpg
圖2-24 電源電路

§2.9本章小結(jié)

本章首先介紹了便攜式室內(nèi)空氣質(zhì)量監(jiān)測儀的硬件結(jié)構(gòu)以及系統(tǒng)功能,該儀器以8位單片機(jī)STC90C51作為控制核心,設(shè)計(jì)并構(gòu)建了系統(tǒng)的硬件平臺,完成了有毒氣體濃度信號的采集轉(zhuǎn)換電路、液晶顯示電路、聲光報(bào)警電路等的設(shè)計(jì)。該儀器能夠?qū)崿F(xiàn)有毒氣體濃度信號和溫濕度信號采集與顯示及超標(biāo)聲光報(bào)警等功能。本章重點(diǎn)介紹了信號采集模擬電路和以主控制器為中心的數(shù)字電路的設(shè)計(jì)與工作原理。首先討論了有毒氣體采集模塊中傳感器選擇問題,最后討論了系統(tǒng)的外圍接口電路模塊,包括液晶顯示,聲光報(bào)警等,實(shí)現(xiàn)了各外圍接口電路模塊與STC90C51的硬件接口設(shè)計(jì)。
這一章比較具體的說明了系統(tǒng)硬件設(shè)計(jì)的內(nèi)容,通過模塊化的設(shè)計(jì)思想,把一個(gè)復(fù)雜的單片機(jī)系統(tǒng)按照功能劃分成一個(gè)個(gè)單獨(dú)的電路模型,分別進(jìn)行設(shè)計(jì),最后在集成到一起。這種方法對于設(shè)計(jì)復(fù)雜的單片機(jī)系統(tǒng)很有效。大大提高系統(tǒng)設(shè)計(jì)的效率與質(zhì)量。(說明:系統(tǒng)硬件設(shè)計(jì)的電路原理圖附在論文的附錄里面。)


第3章 空氣質(zhì)量檢測儀的軟件設(shè)計(jì)


§3.1 系統(tǒng)軟件設(shè)計(jì)思路

§3.1.1 編程語言的選擇
在系統(tǒng)硬件電路確定以后,其主要功能的實(shí)現(xiàn)將依賴于軟件來實(shí)現(xiàn)。對同一硬件電路,配以不同的軟件,它所實(shí)現(xiàn)的功能也就不同,其設(shè)計(jì)軟件基本要求:
1.可靠性?煽啃允擒浖O(shè)計(jì)的重要指標(biāo),具有較強(qiáng)的抗干擾能力。
2.易理解性、易維護(hù)性。編制的軟件要求易閱讀,容易發(fā)現(xiàn)和糾正錯(cuò)誤,容易修改和補(bǔ)充。
3.實(shí)時(shí)性。系統(tǒng)能夠及時(shí)響應(yīng)外部事件的發(fā)生并能及時(shí)做出處理結(jié)果。
4.準(zhǔn)確性。保證系統(tǒng)進(jìn)行計(jì)算數(shù)據(jù)的精度。
目前存在有4種編程語言支持單片機(jī),即匯編語言、PL/M51語言、C語言和BASI語言。其中匯編語言和C語言應(yīng)用的較多,匯編語言的機(jī)器代碼生成效率高,控制性好,但就是移植性不高。結(jié)合本系統(tǒng)的特點(diǎn),這里選用了功能強(qiáng)、效率高的C語言。C語言主要有以下特點(diǎn):用C語言編制的程序效率高,占用存儲空間小,運(yùn)行速度快。C語言能寫出最優(yōu)化程序,且能反映出計(jì)算機(jī)的實(shí)際運(yùn)行情況。C語言能直接與存儲器、接口電路打交道,也能申請中斷。具有良好的模塊化、容易閱讀、維護(hù)等優(yōu)點(diǎn),且編寫的模塊程序易于移植;贑語言和匯編語言的優(yōu)缺點(diǎn),本系統(tǒng)采用C語言編寫方法。
§3.1.2 軟件功能需求
室內(nèi)空氣質(zhì)量檢測儀系統(tǒng)軟件主要由溫濕傳感器采集模塊、AD轉(zhuǎn)換模塊、人機(jī)接口模塊、聲光報(bào)警模塊、核心控制器模塊構(gòu)成,各模塊功能概述如表3-1所示。


表3-1 各功能模塊功能描述
功能模塊
功能描述
溫濕傳感器采集模塊
對室內(nèi)溫濕度測點(diǎn)進(jìn)行實(shí)時(shí)監(jiān)測
AD轉(zhuǎn)換模塊
1.完成信號采樣
2.完成與核心處理器間的數(shù)據(jù)傳輸
核心控制器模塊
1.系統(tǒng)時(shí)基分配
2.人機(jī)接口控制
3.各模塊協(xié)調(diào)工作
人機(jī)接口模塊
1.按鍵控制
2.動態(tài)信息顯示
根據(jù)軟件設(shè)計(jì)的基本要求,采取了如下的措施:
1.程序模塊化。軟件設(shè)計(jì)中包含有:主程序模塊、顯示模塊、DHT11傳感器檢測函數(shù)、A/D數(shù)據(jù)轉(zhuǎn)換子模塊、聲光報(bào)警模塊、數(shù)據(jù)轉(zhuǎn)換模塊、按鍵函數(shù)。
2.軟件設(shè)計(jì)采用C語言編程。
3.中斷響應(yīng)外部事件,提高了系統(tǒng)的實(shí)時(shí)處理事件能力。
4.軟、硬件抗干擾。軟件抗干擾措施提高了系統(tǒng)的可靠性。
以下就對一些主要模塊進(jìn)行詳細(xì)的闡述。

§3.2軟件模塊設(shè)計(jì)

§3.2.1主程序模塊
主程序運(yùn)行流程圖如圖3-1所示。由主程序流程圖可以看出,軟件要實(shí)現(xiàn)的主要功能是實(shí)現(xiàn)對傳感器信號的數(shù)據(jù)采集,然后進(jìn)行數(shù)據(jù)的計(jì)算、分析、送液晶進(jìn)行顯示及報(bào)警功能。程序開始時(shí),對系統(tǒng)進(jìn)行初始化,包括單片機(jī)的各寄存器、RAM、定時(shí)器裝載初值、中斷設(shè)置及各模塊初始化等。完成初始化后,CPU等待傳感器傳入信號及AD轉(zhuǎn)換結(jié)束,從而完成當(dāng)前監(jiān)測參數(shù)的正確顯示。


1.027.jpg



圖3-1 主程序流程圖
§3.2.2AD轉(zhuǎn)換模塊
AD完成轉(zhuǎn)換需要一定的時(shí)間,AD應(yīng)用中我們可以有兩種方法來:
1.中斷查詢法,AD完成模數(shù)轉(zhuǎn)換后會向中斷輸出端輸出一個(gè)中斷請求信號,告訴CPU轉(zhuǎn)換已經(jīng)完成,CPU可以讀取數(shù)據(jù)。
2.延時(shí)等待法,設(shè)定一定的時(shí)間讓CPU處于等待狀態(tài),此時(shí)間足夠AD完成轉(zhuǎn)換,過了等待時(shí)間CPU再去讀取數(shù)據(jù)。
綜合考慮各方面的因素,本研究采用第一種方法:延時(shí)等待法。所用的芯片為AD0809,根據(jù)所需的要求。
§3.2.3液晶顯示模塊
本設(shè)計(jì)所用的顯示器件為1602液晶面板,該液晶能顯示32個(gè)字符,滿足顯示要求。1602液晶與CPU是并口通信,由單片機(jī)的P2.5、P2.6、P2.7引腳來控制1602的讀寫數(shù)據(jù)命令功能,單片機(jī)P0口傳輸數(shù)據(jù)到1602進(jìn)行顯示。
系統(tǒng)上電LCD初始化,液晶顯示首先需要要按照時(shí)序給定顯示地址,然后傳送數(shù)據(jù)。上電后液晶顯示開始循環(huán)顯示三個(gè)被測量的范圍和測量結(jié)果。
§3.2.4聲光報(bào)警模塊
聲音報(bào)警采用的是蜂鳴器,光報(bào)警是通過6個(gè)發(fā)光二極管來顯示,3個(gè)綠色和三個(gè)紅色的,當(dāng)毒氣含量沒超標(biāo)時(shí)顯示綠色,超標(biāo)時(shí)顯示紅色并啟動蜂鳴器,報(bào)警子程序執(zhí)行之前,設(shè)定的報(bào)警閾值存放在兩個(gè)變量中,傳感器輸入AD轉(zhuǎn)換值后,調(diào)用比較程序,小于閾值則執(zhí)行顯示程序,若大于閾值進(jìn)行聲光報(bào)警。。
§3.2.5按鍵模塊
本設(shè)計(jì)設(shè)定按鍵功能為調(diào)整測量數(shù)據(jù)的安全范圍并可進(jìn)行手動和自動的切換考慮到實(shí)現(xiàn)按鍵功能所用按鍵數(shù)目不多及單片機(jī)引腳數(shù)量決定選用五個(gè)獨(dú)立式按鍵,其中設(shè)定鍵用于進(jìn)入和退出上下限的調(diào)整,上下左右四個(gè)鍵在設(shè)定鍵被按下的情況下可以對數(shù)值進(jìn)行調(diào)整;同時(shí),當(dāng)設(shè)定鍵未按下且上調(diào)鍵被按下時(shí)進(jìn)入上調(diào)鍵的第二功能,實(shí)現(xiàn)用戶手動控制和自動控制的切換。已滿足用戶對環(huán)境條件檢測要求的不同,實(shí)現(xiàn)良好的人機(jī)交流。

§3.3本章小結(jié)

在這一章里對室內(nèi)便攜式只能空氣品質(zhì)監(jiān)測儀的軟件設(shè)計(jì)進(jìn)行了較詳細(xì)的介紹。軟件采用了模塊化設(shè)計(jì)的思路,以單片機(jī)高級語言C51編程。在本章開始給出了主程序結(jié)構(gòu)流程圖,然后分別對各個(gè)子模塊的軟件流程進(jìn)行介紹。(說明:程序見附錄二)

1


河南科技大學(xué)畢業(yè)設(shè)計(jì)(論文)


第4章 仿真調(diào)試


§4.1系統(tǒng)硬件調(diào)試

§4.1.1 常見的硬件故障
(1)邏輯錯(cuò)誤:硬件的邏輯錯(cuò)誤是由于設(shè)計(jì)錯(cuò)誤和加工過程中的工藝性錯(cuò)誤所造成的,主要包括:錯(cuò)線、開路、短路等,其中短路最為常見,在印刷電路板布線密度高的情況下,極易因工藝原因造成短路。
(2)器件失效:元器件失效主要是因?yàn)槠骷旧硪褤p壞或性能不符合要求,或者是由于組裝錯(cuò)誤造成的元器件失效,如電解電容、二極管的極性錯(cuò)誤,集成塊安裝方向錯(cuò)誤等。
(3)可靠性差:系統(tǒng)不可靠可能受多種因素影響,如金屬化孔、接插件接觸不良會造成系統(tǒng)時(shí)好時(shí)壞;內(nèi)部和外部的干擾、器件負(fù)載過大等造成邏輯電平不穩(wěn)定;另外,走線和布局的不合理等也是系統(tǒng)可靠性差的重要因素之一。
(4)電源故障:若系統(tǒng)中存在電源故障,則加電后將造成器件損壞。
§4.1.2硬件調(diào)試方法
拿到印刷電路板后,用萬用表直接檢查線路板各處是否有明顯短路、斷路的地方,尤其是電源是否短路。接著,焊接各元器件及插座,在焊接過程中要對各元件做逐一檢查,比如二極管極性、電容容量及耐壓、電阻值大小等。在插座、元件焊接完畢后,仔細(xì)檢查元件面各元件之間裸露部分有無相互接觸現(xiàn)象,焊接面的各焊點(diǎn)間、焊點(diǎn)和近鄰線有無連接。最后,再給電路板空載上電(未插芯片),檢查線路板各管腳及插件上的電位是否正確,特別是單片機(jī)管腳上的各點(diǎn)電壓。若上述的一切都正常,則硬件調(diào)試的準(zhǔn)備工作完成。
硬件實(shí)物如圖4-1。

§4.2 系統(tǒng)軟件調(diào)試

對系統(tǒng)軟件編寫完成之后,可以利用Keil C51仿真軟件進(jìn)行仿真運(yùn)行調(diào)試,其調(diào)試界面如圖4-2所示。
1.029.jpg
圖4-2 KeilC51軟件調(diào)試截面圖
在具體的調(diào)試過程中,采取以下方法進(jìn)行調(diào)試:在Keil C51編譯環(huán)境中編寫、編譯軟件模塊,進(jìn)行軟件仿真調(diào)試,對功能模塊的軟件仿真。通過Keil C51的調(diào)試窗口觀察各個(gè)寄存器、變量以及并行口輸出的結(jié)果,監(jiān)測軟件模塊運(yùn)行的狀態(tài),在調(diào)試過程中不斷地調(diào)整修改系統(tǒng)的軟件程序,使系統(tǒng)實(shí)現(xiàn)預(yù)定功能。
調(diào)試過程中單步運(yùn)行和斷點(diǎn)運(yùn)行調(diào)試只能驗(yàn)證程序正確與否,而不能確定定時(shí)精度、CPU的實(shí)時(shí)響應(yīng)等問題,故在單步和斷點(diǎn)調(diào)試之后,又進(jìn)行了連續(xù)調(diào)試。待全部完成后,應(yīng)反復(fù)運(yùn)行調(diào)試多次,對系統(tǒng)的穩(wěn)定性和操作是否符合原始設(shè)計(jì)要求、安排的操作是否合理等都要進(jìn)行詳細(xì)的觀察,必要時(shí)作適當(dāng)?shù)男拚?/div>
調(diào)試完成后將程序?qū)雙rotues中進(jìn)行仿真,觀察系統(tǒng)運(yùn)行結(jié)果如圖4-3。通過調(diào)試,確定基本可行后,將程序燒寫單片機(jī)進(jìn)行實(shí)物調(diào)整,通過不斷燒寫、試驗(yàn),最終完成整個(gè)軟件,準(zhǔn)確實(shí)現(xiàn)要求的功能如圖4-4。
1.030.jpg


圖4-3 protues仿真調(diào)試
1.031.jpg


圖4-4 實(shí)物調(diào)試

§4.3本章小結(jié)

本章首先詳細(xì)描述用Keil C51對軟件進(jìn)行調(diào)試的過程以及其方法,通過輸入不同的數(shù)據(jù)對系統(tǒng)進(jìn)行調(diào)試,以確定本設(shè)計(jì)方案的正確性。本章工作內(nèi)容使得硬件部分與軟件部分結(jié)合實(shí)現(xiàn)預(yù)定的功能。

結(jié)  論


§1主要結(jié)論

    1.本系統(tǒng)綜合利用傳感器技術(shù),自動監(jiān)測技術(shù),和微控制器技術(shù),開發(fā)了一套對室內(nèi)的空氣質(zhì)量進(jìn)行監(jiān)控的操作方便、簡潔實(shí)用的自動監(jiān)測系統(tǒng)。
2.系統(tǒng)軟硬件設(shè)計(jì)合理,其中單片機(jī)軟件采用模塊化的程序設(shè)計(jì)方法,各模塊相互獨(dú)立,提高了系統(tǒng)的可靠性和可擴(kuò)展性,整個(gè)系統(tǒng)具有較高的性能價(jià)格比。
3.系統(tǒng)C51語言編程,程序結(jié)構(gòu)清晰,顯示板界面非常友好,使得操作者在使用該系統(tǒng)時(shí)就像是在操作一臺實(shí)際的控制儀器一樣。
4.系統(tǒng)功能獨(dú)立,配置合理。鍵盤設(shè)置為不同的用戶提供了一定的選擇空間。
5.經(jīng)運(yùn)行驗(yàn)證,系統(tǒng)具有響應(yīng)速度快,操作簡便,工作可靠等特點(diǎn)。

§2展望

1.本系統(tǒng)選用了集傳感器,轉(zhuǎn)換器于一體,能直接輸出標(biāo)準(zhǔn)模擬信號的傳感器,這無疑會增加系統(tǒng)的成本,今后可選用能達(dá)到要求的價(jià)格低廉的傳感器,而信號的放大和調(diào)理電路部分可自行設(shè)計(jì)。
2.由于室內(nèi)各種環(huán)境因子相互影響,而本系統(tǒng)的控制輸出僅為簡單的百分比信號量,這顯然不能滿足高精度的控制要求,應(yīng)引入模糊算法,專家系統(tǒng)等技術(shù)以進(jìn)一步提高系統(tǒng)的智能決策水平。
3.系統(tǒng)可以開發(fā)成多機(jī)監(jiān)控模式,這就能同時(shí)監(jiān)測多個(gè)環(huán)境室內(nèi)的空氣品質(zhì),通過串行通信傳到上位機(jī)進(jìn)行綜合處理。
5.可通過網(wǎng)絡(luò)與其他家電相聯(lián)系,將把家庭中原來孤立、各不相關(guān)的設(shè)備統(tǒng)一起來。
6. 本設(shè)計(jì)可改為多路氣體檢測,未來可以實(shí)現(xiàn)更多的檢測功能。
7. 本設(shè)計(jì)的主要強(qiáng)調(diào)智能化和人性化,例如可以適用于特殊人群——病人,他們可以把舒適的環(huán)境的指標(biāo)通過相應(yīng)的按鍵來控制,按下按鍵后,通過本系統(tǒng)控制相應(yīng)的設(shè)備調(diào)節(jié)來達(dá)到是以病人的環(huán)境。
8.可以用來開發(fā)新型空調(diào),現(xiàn)代空調(diào)都是針對空氣溫濕進(jìn)行調(diào)節(jié),可以將本設(shè)計(jì)加入空調(diào)內(nèi)部,使其既能控制溫濕度,還可以對空氣中的各種氣體進(jìn)行檢測,并通過控制“新風(fēng)系統(tǒng)”改善空氣各方面的質(zhì)量。


參考文獻(xiàn)

[1] 余永權(quán).單片機(jī)原理及應(yīng)用[M].北京:電子工業(yè)出版社,1998.12
[2] 余錫存、曹國華.單片機(jī)原理及接口技術(shù)[M].第二版.西安:西安電子科技大學(xué)出版社,2007.12
[3] 諸邦田.電子電路實(shí)用抗干擾技術(shù)[M].北京:人民郵電出版社,1994.5
[4] 曲喜新.電子元件材料手冊[M].北京:電子工業(yè)出版社,1989.4
[5] 汪吉鵬、馬云峰.微機(jī)原理與接口技術(shù)[M].北京:高等教育出版社,2001.7
[6] 田崴.電工技術(shù)(電工學(xué)1)[M].北京:高等教育出版社,2010.12
[7] 孫立功.電子技術(shù)(電工學(xué)2)[M].北京:高等教育出版社,2010.12
[8] 馬玉春.串行通信協(xié)議的研究及應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究.2004
[9] 胡漢才.單片機(jī)原理及其接口技術(shù)[M].清華大學(xué)出版社,1996.
[10] 樓然苗,李光飛.51系列單片機(jī)設(shè)計(jì)實(shí)例[M].北京航空航天大學(xué)出版社,2003.
[11] 趙亮,侯國銳.單片機(jī)C語言編程與實(shí)例[M].人民郵電出版社,2003.
[12] 張毅剛.單片機(jī)原理及應(yīng)用[M].北京:高等教育出版社,2003.
[13] 何立民.單片機(jī)與嵌入式系統(tǒng)應(yīng)用[M].北京航空航天出版社,2003.
[14]譚浩強(qiáng).C程序設(shè)計(jì)(第三版)[M].清華大學(xué)出版社,2005.
[15]清源科技.Protel 99 SE電路原理圖與PCB設(shè)計(jì)及仿真[M].機(jī)械工業(yè)出版社,2007.


致 謝

為期兩個(gè)多月的畢業(yè)設(shè)計(jì)終于完成了,對我個(gè)人而言,凝聚了許多努力和汗水,也經(jīng)受住了嚴(yán)峻的考驗(yàn)。和普通的課程設(shè)計(jì)不同,由于畢業(yè)設(shè)計(jì)的綜合性,幾乎用到所學(xué)的全部知識,而且是我第一次接觸傳感器的使用,對我來說這是一個(gè)全新的任務(wù)。由于基礎(chǔ)過于薄弱,專業(yè)知識有限,浮躁的心理讓我一開始舉步維艱,滿腦子想的就是放棄。在心理最為脆弱的時(shí)候,黃老師耐心地開導(dǎo)我,給我鼓勵(lì)和信心,畢業(yè)設(shè)計(jì)才得以步入正軌。
    萬事開頭難,從研究課題,搜集材料,到正式投入設(shè)計(jì),我花費(fèi)了很多時(shí)間和精力。對于這次全新的設(shè)計(jì),老師給了我很大的自由空間,可以充分發(fā)揮自己的創(chuàng)造思維。但是,對于很多新的嘗試,我還是有所拘束?赡苁切愿袷谷话,每當(dāng)遇到問題,設(shè)計(jì)處于混沌狀態(tài)時(shí),煩躁焦慮接踵而來,讓我迷失了方向。又是黃老師在最繁忙的時(shí)候,給我做細(xì)致的分析指導(dǎo),讓我茅塞頓開,使設(shè)計(jì)得以延續(xù)直至順利完成。所以,在這次畢業(yè)設(shè)計(jì)中,我最感謝的是黃曉東老師,他給我們提供一流的設(shè)計(jì)場所,還提供了許多實(shí)用的設(shè)計(jì)資料,為我們的設(shè)計(jì)提供了保障。
在我看來,黃老師不僅是一位態(tài)度嚴(yán)謹(jǐn),學(xué)識淵博的優(yōu)秀教師,也是一位心理調(diào)節(jié)師,他總是能在設(shè)計(jì)氛圍緊張的時(shí)候,給同學(xué)們帶來歡樂,緩解同學(xué)們的壓力。他那自信樂觀的生活態(tài)度,也值得我們學(xué)習(xí)。從黃老師那里,我不僅學(xué)到了許多專業(yè)知識和實(shí)踐經(jīng)驗(yàn),而且懂得許多做人的道理和生活的真諦,這些都是一輩子受用的財(cái)富,讓我受益匪淺,終生難忘。
最后,再次對黃老師表示真誠的謝意和崇高的敬意。同時(shí)也對同組同學(xué)的幫助表示衷心的感謝。

附 錄

附錄一
硬件電氣原理圖
1.032.jpg


  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define Data  P0    //數(shù)據(jù)端口
  6. /*****1602管腳定義*****/
  7. sbit RS=P2^6;
  8. sbit RW=P2^5;
  9. sbit E=P2^7;
  10. /******AD管腳定義*****/
  11. sbit STA=P3^0;
  12. sbit OE=P3^1;
  13. sbit EOC=P3^2;
  14. sbit CLK=P3^3;
  15. /*****按鍵管腳定義******/
  16. sbit key_U=P2^0;
  17. sbit key_D=P2^1;
  18. sbit key_L=P2^2;
  19. sbit key_R=P2^3;
  20. sbit key_S=P2^4;
  21. /******報(bào)警用管腳******/
  22. sbit beep=P3^4;
  23. sbit led1=P3^5;
  24. sbit led2=P3^6;
  25. unsigned char num=0;//記錄設(shè)定鍵按下次數(shù)
  26. unsigned char k_flag=0;//記錄設(shè)置鍵按下次數(shù)(用于調(diào)用)
  27. unsigned char wei=0;//光標(biāo)位置
  28. unsigned char c_num=0;//記錄切換鍵按下次數(shù)
  29. unsigned char c_flag=0;//記錄切換鍵按下次數(shù)(用于調(diào)用)
  30. unsigned char voc_ad;//AD讀取數(shù)據(jù)
  31. unsigned char flag;//DHT11函數(shù)用到
  32. /****************************/
  33. sbit DHT=P3^7;
  34. uchar  WEN1[]="wen:16.00-28.00";              //溫度第一行數(shù)據(jù)
  35. uchar  WEN2[]="      20.00    ";   //溫度第二行數(shù)據(jù)
  36. uchar  SHI1[]="shi:30.00-70.00";              //濕度第一行數(shù)據(jù)
  37. uchar  SHI2[]="      20.00    ";   //濕度第二行數(shù)據(jù)
  38. uchar  VOC1[]="voc:0.00-2.70  ";              //濕度第一行數(shù)據(jù)
  39. uchar  VOC2[]="      0.00    ";   //濕度第二行數(shù)據(jù)
  40. unsigned char shiZ,shiX,wenZ,wenX,check;
  41. unsigned char tr_shiZ,tr_shiX,tr_wenZ,tr_wenX;
  42. /*********延時(shí)*******************************/
  43. void delay_1ms(uint x)
  44.   {
  45.     uchar i;
  46.     while(x--)
  47.     for(i=0;i<120;i++);
  48.   }
  49. void delay_10us()
  50.   {
  51.                             unsigned char i;
  52.                             i--;
  53.                             i--;
  54.                             i--;
  55.                             i--;
  56.                             i--;
  57.                             i--;
  58.   }
  59. void DelayUs(unsigned char us)                            //--延時(shí)函數(shù)
  60.   {
  61.                             unsigned char uscnt;
  62.                             uscnt=us>>1;        /*12MHz頻率*/
  63.                             while(--uscnt);
  64.   }
  65. /*******1602顯示*******************************************/
  66. /**********寫命令**********/
  67. void lcd_write_com(uchar c)               
  68.   {
  69.     delay_1ms(5);//操作前短暫延時(shí),保證信號穩(wěn)定
  70.     E=0;
  71.     RS=0;
  72.     RW=0;
  73.     _nop_();
  74.     E=1;
  75.     Data=c;
  76.     E=0;
  77.   }
  78. /**********寫數(shù)據(jù)*************/
  79. void lcd_write_dat(uchar c)                           
  80.   {
  81.     delay_1ms(5);  //操作前短暫延時(shí),保證信號穩(wěn)定
  82.     E=0;
  83.     RS=1;
  84.     RW=0;
  85.     _nop_();
  86.     E=1;
  87.     Data=c;
  88.     E=0;
  89.     RS=0;
  90.   }
  91. /**********LCD初始化********/
  92. void lcd_init()               
  93.   {
  94.     delay_1ms(15);
  95.     lcd_write_com(0x38); //display mode
  96.     lcd_write_com(0x38); //display mode
  97.     lcd_write_com(0x38); //display mode
  98.     lcd_write_com(0x06); //顯示光標(biāo)移動位置
  99.     lcd_write_com(0x0c); //顯示開及光標(biāo)設(shè)置
  100.     lcd_write_com(0x01); //顯示清屏
  101.   }
  102. /*********顯示單個(gè)字符**********/
  103. void ShowChar(uchar pos,uchar c)
  104.   {
  105.     unsigned char p;
  106.      if (pos>=0x10)
  107.        p=pos+0xb0; //是第二行則命令代碼高4位為0xc
  108.      else
  109.        p=pos+0x80; //是第二行則命令代碼高4位為0x8
  110.     lcd_write_com(p);//寫命令
  111.     lcd_write_dat(c);   //寫數(shù)據(jù)
  112.   }
  113. /*********顯示字符串**********/
  114. void ShowString (uchar line,char *ptr)               
  115.   {
  116.     unsigned char l,*p;
  117.     p=ptr;
  118.     l=line<<4;
  119.      while((*p)!='\0')
  120.        {
  121.           ShowChar(l++,*(p));
  122.                                                               p++;
  123.         }
  124.   }
  125. /*********溫度顯示函數(shù)***********/
  126. void WENdisp(void)               
  127.   {
  128.                             ShowString(0,WEN1);
  129.                             _nop_();  
  130.                             ShowString(1,WEN2);
  131.   }
  132. /*********濕度顯示函數(shù)***********/
  133. void SHIdisp(void)               
  134.   {
  135.     ShowString(0,SHI1);
  136.     _nop_();
  137.     ShowString(1,SHI2);
  138.   }
  139. /*********VOC調(diào)用的顯示函數(shù)***********/
  140. void VOCdisp(void)               
  141.   {
  142.     ShowString(0,VOC1);
  143.     _nop_();
  144.     ShowString(1,VOC2);
  145.   }
  146. /***********報(bào)警用函數(shù)************/
  147. void Beep(unsigned char i,j)//i用于確定亮燈方式,j用于確定蜂鳴器是否報(bào)警
  148.   {
  149.     unsigned char m;
  150.     led1=led2=1;
  151.     for(m=0; m<250; m++)
  152.                                 {
  153.                                switch(i)
  154.                                               {
  155.                                                         case 0:break;
  156.                                                         case 1:led1=led2=0;break;//低電平點(diǎn)亮
  157.                                                         case 2:led1=0;break;
  158.                                                         case 3:led2=0;break;
  159.                        }
  160.         beep = j;
  161.         delay_1ms(2);
  162.                                           led1=led2=1;
  163.         beep = 0;
  164.         delay_1ms(2);
  165.                                 }
  166.   }
  167. void voc_warning()
  168.   {
  169.                               unsigned char voc_t;            
  170.                               unsigned char voc_h;
  171.       voc_t=('0'+VOC2[6])*10+('0'+VOC2[8]);
  172.       voc_h=('0'+VOC1[9])*10+('0'+VOC1[11]);
  173.                             if(voc_t>voc_h)
  174.                                           {
  175.                                             Beep(1,1);
  176.         }
  177.                   else Beep(0,0);
  178.   }
  179. void wen_warning()
  180.   {
  181.                 unsigned char wen_t;            
  182.                 unsigned char wen_h;
  183.                 unsigned char wen_l;
  184.       wen_t=('0'+WEN2[6])*10+('0'+WEN2[7]);
  185.       wen_l=('0'+WEN1[4])*10+('0'+WEN1[5]);
  186.       wen_h=('0'+WEN1[10])*10+('0'+WEN1[11]);
  187.                             if(wen_t>wen_h||wen_t<wen_l)
  188.                                           {
  189.                                               Beep(2,1);
  190.         }
  191.                             else Beep(0,0);
  192.   }
  193. void shi_warning()
  194.   {
  195.                               unsigned char shi_t;            
  196.                               unsigned char shi_h;
  197.                               unsigned char shi_l;
  198.       shi_t=('0'+SHI2[6])*10+('0'+SHI2[7]);
  199.       shi_l=('0'+SHI1[4])*10+('0'+SHI1[5]);
  200.       shi_h=('0'+SHI1[10])*10+('0'+SHI1[11]);
  201.                             if(shi_t>shi_h||shi_t<shi_l)
  202.                                           {
  203.                                              Beep(3,1);
  204.                                           }
  205.                   else Beep(0,0);
  206.   }
  207. /*******************按鍵***************************/
  208. /*************進(jìn)入設(shè)定功能***************/
  209. unsigned char key_set(void)
  210.   {
  211.      if(key_S==0)
  212.        {
  213.                                                           delay_1ms(10);
  214.                                                           if(key_S==0)
  215.             {
  216.                                                  while(!key_S);
  217.               num++;
  218.                                                               k_flag=num%4;
  219.                                                   }
  220.                                                            else k_flag=num%4;
  221.         }
  222.       else k_flag=num%4;
  223.    return k_flag;            
  224.   }
  225. /********************調(diào)整數(shù)據(jù)******************/
  226. unsigned char key_adddec(unsigned char dat)
  227.   {
  228.    if(key_U==0)
  229.      {
  230.                                 delay_1ms(10);
  231.                                              if(key_U==0)
  232.           {
  233.                                                              while(!key_U);
  234.                                                                       if(dat<'9')
  235.                   dat++;
  236.                            else
  237.                               dat='9';
  238.                                                }
  239.       }
  240.     if(key_D==0)
  241.       {
  242.                                                         delay_1ms(10);
  243.                                               if(key_D==0)
  244.                          {
  245.                                                                            while(!key_D);
  246.                                                                if(dat>'0')
  247.                                                         dat--;
  248.                                          else
  249.                                             dat='0';
  250.                          }
  251.                                           }
  252.    return dat;            
  253.   }
  254. /***************左右移位*******************/
  255. unsigned char key_LR()
  256.   {
  257.                  if(key_L==0)
  258.       {
  259.                                           delay_1ms(10);
  260.                                           if(key_L==0)
  261.            {
  262.                                                             while(!key_L);
  263.                                                              if(wei==0)
  264.                                         wei=3;
  265.                                                             else wei--;
  266.             }
  267.        }
  268.     if(key_R==0)
  269.       {
  270.                                           delay_1ms(10);
  271.                                           if(key_R==0)
  272.           {
  273.             while(!key_R);
  274.                                               if(wei==3)
  275.                 wei=0;
  276.                                               else wei++;
  277.            }
  278.        }
  279.     return wei;
  280.   }
  281. /*********主函數(shù)調(diào)用的按鍵函數(shù)*********/
  282. void set_updn_dat(void)
  283.   {
  284.                             while(key_set())
  285.        {
  286.         unsigned j=key_LR();      
  287.             if(key_set()==1)
  288.               {
  289.                                                                          switch(j>0)
  290.                                                                                                      {
  291.                                                                                                                    case 1:j=2;break;
  292.                                                                                                                    case 0:j=0;break;
  293.                                                                                                   }
  294.                             VOCdisp();
  295.                                                                   VOC1[j+9]=key_adddec(VOC1[j+9]);
  296.                                                      lcd_write_com(0x80+j+9);
  297.                                                                   lcd_write_dat(VOC1[j+9]);        
  298.                           }
  299.                         else                       
  300.               if(key_set()==2)
  301.                 {
  302.                                                                                       switch(j)
  303.                                                                                                   {
  304.                                                                                                                    case 2:j=6;break;
  305.                                                                                                                    case 3:j=7;break;
  306.                                                                                                   }
  307.                                WENdisp();
  308.                                                      WEN1[j+4]=key_adddec(WEN1[j+4]);
  309.                                                      lcd_write_com(0x80+j+4);
  310.                                                                   lcd_write_dat(WEN1[j+4]);
  311.                                                  }
  312.             else                       
  313.               if(key_set()==3)
  314.                 {
  315.                                                                                       switch(j)
  316.                                                                                                   {
  317.                                                                                                                    case 2:j=6;break;
  318.                                                                                                                    case 3:j=7;break;
  319.                                                                                                   }
  320.                   SHIdisp();
  321.                                           SHI1[j+4]=key_adddec(SHI1[j+4]);
  322.                                                      lcd_write_com(0x80+j+4);
  323.                                                                   lcd_write_dat(SHI1[j+4]);
  324.                                                  }            
  325.                               }                           
  326.   }
  327. /*************手動自動切換功能**************/
  328. unsigned char key_change(void)
  329.   {
  330.      if(key_U==0)
  331.        {
  332.                                                             delay_1ms(10);
  333.                                                if(key_U==0)
  334.                                      {
  335.                                                                   while(!key_U);
  336.                                c_num++;
  337.                                                      c_flag=c_num%4;
  338.                                                   }
  339.                                                         else c_flag=c_num%4;
  340.         }
  341.      else c_flag=c_num%4;
  342.    return c_flag;            
  343.   }
  344. /*************************傳感器函數(shù)************************/
  345. /**************DHT測試**************/
  346. /******溫濕度讀取函數(shù)*******/
  347. char DHTread_data()
  348.   {
  349.                             unsigned char i,num,temp;
  350.                             num=0;
  351.                             for(i=0;i<8;i++)
  352.                                             {
  353.                                                         flag=2;
  354.                                                         while((!DHT)&&flag++);
  355.                                                         delay_10us();
  356.                                                         delay_10us();
  357.                                                         delay_10us();
  358.                                                         if(DHT==1)
  359.                                                                         {
  360.                                                                                     temp=1;
  361.                                                                                     flag=2;
  362.                                                                                     while(DHT&&flag++);                                                      
  363.                                                                         }
  364.                                                         else
  365.                                                                       temp=0;
  366.                                                                       num<<=1;
  367.                                                                       num|=temp;
  368.                                             }
  369.                             return(num);
  370.   }
  371. /********初始化及采集程序*********/
  372. void DHTread_init()
  373.   {
  374.     DHT=0;                              //主機(jī)使DHT11低電平并延時(shí)至少18ms
  375.     delay_1ms(21);
  376.     DHT=1;                              //主機(jī)置DHT11高電平20~40us,并等待從機(jī)相應(yīng)
  377.     delay_10us();
  378.     delay_10us();
  379.     delay_10us();
  380.     DHT=1;
  381.     if(!DHT)  //從機(jī)發(fā)出相應(yīng)信號
  382.       {
  383.                                                         flag=2;
  384.                                                         while((!DHT)&&flag++);
  385.                                                         flag=2;
  386.                                                         while(DHT&&flag++);              //開始采集數(shù)據(jù)
  387.                                                         tr_shiZ=DHTread_data();//采集濕度整數(shù)部分
  388.                                                         tr_shiX=DHTread_data();//采集濕度小數(shù)部分
  389.                                                         tr_wenZ=DHTread_data();//采集溫度整數(shù)部分
  390.                                                         tr_wenX=DHTread_data();//采集溫度小數(shù)部分
  391.                                                         check=DHTread_data();              //采集校驗(yàn)位
  392.                                                         DHT=1;
  393.       }                                                         
  394.   }
  395. /*********顯示測試結(jié)果*********/
  396. void DHT11()
  397.   {
  398.                  unsigned char temp;
  399.                   {
  400.                                    DHTread_init();
  401.                                   temp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX;
  402.                                               if(check==temp)
  403.                                                  {
  404.                                                                  shiZ=tr_shiZ;
  405.                                          shiX=tr_shiX;
  406.                                          wenZ=tr_wenZ;
  407.                                          wenX=tr_wenX;
  408.                          }
  409.            WEN2[6]='0'+wenZ/10;
  410.            WEN2[7]='0'+wenZ%10;            
  411.            WEN2[9]='0'+wenX/10;
  412.            WEN2[10]='0'+wenX%10;
  413.            SHI2[6]='0'+shiZ/10;
  414.            SHI2[7]='0'+shiZ%10;
  415.            SHI2[9]='0'+shiX/10;
  416.            SHI2[10]='0'+shiX%10;
  417.                   }
  418.   }
  419. /****************氣體濃度檢測************/
  420. /*********系統(tǒng)初始化***********/
  421. void init()
  422.   {
  423.                             TMOD = 0x01; //設(shè)定定時(shí)器T0工作方式
  424.                             TH0=(65536-2)%256;
  425.                             TL0=(65536-2)/256;
  426.                             ET0=1;  //允許T0中斷
  427.                             EA=1; //開總中斷
  428.                             TR0=1; //啟動定時(shí)器T0
  429.   }
  430. /**********T0中斷服務(wù)程序***********/
  431. void t0(void) interrupt 1 //using 1
  432.   {
  433.                             TH0=(65536-2)%256;
  434.                             TL0=(65536-2)/256;
  435.                             CLK=~CLK;
  436.   }  
  437. /**********AD轉(zhuǎn)換函數(shù)**********/
  438. void AD()
  439.   {
  440.                             STA=0;
  441.     OE=0;
  442.                             STA=1; //啟動AD轉(zhuǎn)換
  443.                             _nop_();
  444.                             STA=0;
  445.     while(EOC==1);
  446.     OE=1;
  447.     voc_ad=P1;
  448.   }
  449. /*******數(shù)據(jù)處理********/
  450. void VOC()
  451.   {
  452.                             AD();
  453.                             VOC2[6]='0'+voc_ad/51;
  454.                             VOC2[8]='0'+voc_ad%51*10/51;
  455.                             VOC2[9]='0'+voc_ad%51*10%51*10/51;
  456.   }
  457. /************切換程序*************/
  458. void change(void)
  459.   {
  460.     while(!key_set() && key_change())
  461.        {
  462.                                                           unsigned k=key_change();
  463.             switch(k)
  464.                {
  465.                  case 1:
  466.                                                      VOC();
  467.                                                      VOCdisp();
  468.                                                                                                   voc_warning();
  469.                                                                                                   break;
  470.                  case 2:
  471.                                                      DHT11();
  472.                                                      WENdisp();
  473.                                                                                                   wen_warning();
  474.                                                                                                   break;
  475.                  case 3:
  476.                                                      DHT11();
  477.                                                      SHIdisp();
  478.                                                                                                   shi_warning();
  479.                                                                                                   break;
  480.                  }
  481.                                           }        
  482.   }
  483. /**********************主函數(shù)**************************/
  484. void main()
  485.   {
  486.                             lcd_init();
  487.     delay_1ms(50);
  488.                             init();
  489.     num=0;
  490.                             while(1)

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2017-6-3 03:58 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:264022 發(fā)表于 2017-12-19 23:12 | 顯示全部樓層
帖主,能把資料發(fā)給我嗎
回復(fù)

使用道具 舉報(bào)

ID:518760 發(fā)表于 2019-4-22 16:58 | 顯示全部樓層
我也想要附件
回復(fù)

使用道具 舉報(bào)

ID:729397 發(fā)表于 2020-4-15 00:44 | 顯示全部樓層
帖主附件有嗎
回復(fù)

使用道具 舉報(bào)

ID:484435 發(fā)表于 2020-6-6 20:00 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:484435 發(fā)表于 2020-6-9 09:52 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:484435 發(fā)表于 2020-6-9 09:55 | 顯示全部樓層
謝謝大佬
回復(fù)

使用道具 舉報(bào)

ID:936286 發(fā)表于 2021-6-16 10:54 | 顯示全部樓層
大佬有完整附件嗎?
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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