版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
傳感器與檢測技術(shù)課程設(shè)計緒論1.1目的及意義在工農(nóng)業(yè)生產(chǎn)和日常生活中,對濕度的測量及控制始終占據(jù)著重要地位。在現(xiàn)代農(nóng)業(yè)大棚種植或是室內(nèi)畜牧業(yè)、氣象、環(huán)保、國防、科研、航天以及現(xiàn)代生活的各個方面,經(jīng)常需要對環(huán)境濕度進行測量及控制。本設(shè)計就在此基礎(chǔ)上,設(shè)計一種基于STC89C52單片機控制的智能濕度檢測系統(tǒng)。1.2發(fā)展?fàn)顩r進入21世紀(jì)后,特別在我國加入WTO后,國內(nèi)產(chǎn)品面臨巨大挑戰(zhàn)。各行業(yè)特別是傳統(tǒng)產(chǎn)業(yè)都急切需要應(yīng)用電子技術(shù)、自動控制技術(shù)進行改造和提升。例如紡織行業(yè),溫濕度是影響紡織品質(zhì)量的重要因素,但紡織企業(yè)對溫濕度的測控手段仍很粗糙,十分落后,絕大多數(shù)仍在使用干濕球濕度計,采用人工觀測,人工調(diào)節(jié)閥門、風(fēng)機的方法,其控制效果可想而知。制藥行業(yè)里也基本如此。而在食品行業(yè)里,則基本上憑經(jīng)驗,很少有人使用濕度傳感器。值得一提的是,隨著農(nóng)業(yè)向產(chǎn)業(yè)化發(fā)展,許多農(nóng)民意識到必需擺脫落后的傳統(tǒng)耕作、養(yǎng)殖方式,采用現(xiàn)代科學(xué)技術(shù)來應(yīng)付進口農(nóng)產(chǎn)品的挑戰(zhàn),并打進國外市場。各地建立了越來越多的新型溫室大棚,種植反季節(jié)蔬菜,花卉;養(yǎng)殖業(yè)對環(huán)境的測控也日感迫切。但目前,在濕度測試領(lǐng)域大部分濕敏元件性能還只能使用在通常溫度環(huán)境下。在需要特殊環(huán)境下測濕的應(yīng)用場合大部分國內(nèi)包括許多國外濕度傳感器都會“皺起眉頭”!例如在上面提到紡織印染行業(yè),食品行業(yè),耐高溫材料行業(yè)等,都需要在高溫情況下測量濕度。一般情況下,印染行業(yè)在紗錠烘干中,溫度能達到120攝氏度或更高溫度;在食品行業(yè)中,食物的烘烤溫度能達到80-200攝氏度左右;耐高溫材料,如陶瓷過濾器的烘干等能達到200攝氏度以上。在這些情況下,普通的濕度傳感器是很難測量的。2系統(tǒng)的整體設(shè)計2.1設(shè)計內(nèi)容本次設(shè)計分為兩個內(nèi)容:硬件部分、軟件部分。硬件以單片機為核心,配以濕度模塊電路、鍵盤電路、數(shù)模轉(zhuǎn)換電路、顯示電路和報警電路。主要實現(xiàn)以下功能:(1)通過濕度模塊電路對環(huán)境的濕度進行數(shù)據(jù)采集;(2)通過單片機對采集的數(shù)據(jù)進行處理;(3)當(dāng)環(huán)境濕度低于或者高于設(shè)置濕度時啟動報警。濕度檢測系統(tǒng)是一個智能化的系統(tǒng),它的軟件主要實現(xiàn)功能:(1)單片機能夠控制濕度模塊對空氣的濕度進行采樣;(2)把采集的數(shù)據(jù)通過單片機處理,再以十進制的形式顯示出來;(3)按鍵和顯示電路可對設(shè)置的報警上下限值進行更改,并通過顯示電路顯示出來。2.2系統(tǒng)完成的技術(shù)指標(biāo)(1)實時顯示絕對濕度,系統(tǒng)的精度為10mg/L;(2)采用3位數(shù)碼管進行濕度顯示;(3)顯示報警上限值為180mg/L,下限值為90mg/L;(4)濕度超過上下限濕度時進行報警;(5)數(shù)碼管采用動態(tài)顯示方式。2.3系統(tǒng)構(gòu)成與框圖本次設(shè)計的系統(tǒng)框圖見圖1.1所示。圖1.1系統(tǒng)框圖單片機控制濕度模塊AM1001對環(huán)境的濕度進行檢測并通過單片機處理用數(shù)碼管顯示出來,鍵盤電路可設(shè)置報警的上下限值,當(dāng)環(huán)境濕度高于上限或者低于下限報警值時,啟動報警電路,即蜂鳴器響。2.4系統(tǒng)設(shè)計(1)設(shè)計之前,查找資料。先對濕度的概念進行了解,并了解一些濕度傳感器的工作原理??諝鉂穸仁侵缚諝獬睗竦某潭?,可用相對濕度(RH)表示。相對濕度是指空氣實際所含水蒸氣密度和同溫下飽和水蒸氣密度的百分比值。人體在室內(nèi)感覺舒適的最佳相對濕度是,49%~5l%,相對濕度過低或過高,對人體都不適甚至有害。絕對濕度是一定體積的空氣中含有的水蒸氣的質(zhì)量,一般其單位是克/立方米。絕對濕度的最大限度是飽和狀態(tài)下的最高濕度。絕對濕度只有與溫度一起才有意義,因為空氣中能夠含有的濕度的量隨溫度而變化,在不同的溫度中絕對濕度也不同,因為隨著溫度的變化空氣的體積也要發(fā)生變化。但絕對濕度越靠近最高濕度,它隨溫度的變化就越小。(2)分析系統(tǒng)的主要性能;(3)對整個電路的流程進行分析;(4)硬件的準(zhǔn)備以及焊接;(5)用c語言進行軟件的編寫并仿真;(6)將硬件和軟件進行系統(tǒng)仿真直至完成設(shè)計。3硬件設(shè)計3.1STC89C52簡介圖1.2STC89C52本次設(shè)計所使用的單片機如圖1.2所示。STC89C52是一個低電壓,高性能CMOS8位單片機,片內(nèi)含8kbytes的可反復(fù)擦寫的Flash只讀程序存儲器和256bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,功能強大的STC89C52單片機可為您提供許多較復(fù)雜系統(tǒng)控制應(yīng)用場合。STC89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,2個讀寫口線。STC89C52有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。主要功能特性 (1)兼容MCS51指令系統(tǒng) (2)8k可反復(fù)擦寫(>1000次)FlashROM (3)32個雙向I/O口(4)256x8bit內(nèi)部RAM (5)3個16位可編程定時/計數(shù)器中斷(6)時鐘頻率0-24MHz (7)2個串行中斷 (8)可編程UART串行通道 (9)2個外部中斷源 (10)共8個中斷源 (11)2個讀寫中斷口線 (12)3級加密位 (13)低功耗空閑和掉電模式(14)軟件設(shè)置睡眠和喚醒功能引腳簡介:(1)VCC(40腳),接+5V電源正端GND(20腳),接+5V電源地端(2)XTAL1(19腳),接外部晶振的一個引腳。在單片機內(nèi)部,它是一個反相放大器的輸入端。當(dāng)采用外部振蕩器時,此引腳應(yīng)接地。XTAL2(18腳),接外部晶振的另一個引腳。在片內(nèi)接至反相放大器的輸出端和內(nèi)部時鐘電路的輸入端。當(dāng)采用外部振蕩器時,此腳接外部振蕩器的輸出端。(3)控制信號線RESET(9腳):復(fù)位信號輸入端,復(fù)位/掉電時內(nèi)部RAM的備用電源輸入端。ALE(30腳):地址鎖存允許/編程脈沖輸入,用ALE鎖存從P0口輸出的低8位地址。在對片內(nèi)EPROM編程時,編程脈沖由此輸入。PSEN(29腳):外部程序存儲器讀選通信號,低電平有效。EA(31腳):訪問外部存儲器允許/編程電壓輸入。EA為高電平時,訪問內(nèi)部存儲器;低電平時,訪問外部存儲器。3.2DHT11濕度檢測模塊圖1.3DHT11濕度模塊檢測模塊如圖1.3所示。3.2.1濕度檢測模塊選擇思路要對當(dāng)前環(huán)境濕度進行檢測,并且需要和單片機結(jié)合,最好便是用傳感器來檢測環(huán)境濕度,通過單片機進行數(shù)據(jù)處理后顯示出來。傳感器的選擇需要精度高,而且便于單片機控制。3.2.2DHT11濕度模塊本次設(shè)計使用DHT11濕度傳感器。DHT11濕度模塊,是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強、性價比極高等優(yōu)點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場合的最佳選則。引腳說明:(1)Pin1:(VDD),電源引腳,供電電壓為3-5.5V。(2)Pin2:(DATA),串行數(shù)據(jù),單總線。(3)Pin3:(NC),空腳,懸浮。(4)Pin4(VDD),接地端,電源負(fù)極。3.3液晶顯示模塊圖1.4液晶模塊本系統(tǒng)顯示采用了工業(yè)字符型液晶模塊1602,如圖1.4所示??娠@示2行16個字符,能方便顯示英文字母大小寫、阿拉伯?dāng)?shù)字、常用符號等。通過自定義還可顯示簡單的漢字。本液晶模塊的電路的連接圖如圖3-3所示,第1腳和第2腳分別接到了電路的GND和VCC,這2個腳是液晶工作的電源輸入腳。第3腳通過一個10K的電位器連接到地端,可通過調(diào)節(jié)該電位器來調(diào)節(jié)液晶的對比度。第4腳是液晶的寄存器控制腳,接到了單片機的P12腳上。第5腳是液晶的讀寫控制腳,接到了單片機的P13腳上。第6腳是液晶的使能腳,接到了單片機的P14腳上。第7腳到第14腳是液晶的數(shù)據(jù)/地址8位總線,接到了單片機的P0口上。最后第15腳和第16腳是液晶的背光電源腳,直接連接系統(tǒng)VCC和GND。1602LCD主要技術(shù)參數(shù):(1)顯示容量:16×2個字符(2)芯片工作電壓:4.5—5.5V(3)工作電流:2.0mA(5.0V)(4)模塊最佳工作電壓:5.0V(5)字符尺寸:2.95×4.35(W×H)mm引腳說明:VSS:接地VDD:接5V正電源VL:VL為液晶顯示器對比度調(diào)整的端口,對比度的強弱由接電源的不同決定,對比度的調(diào)整可以通過一個10k的電位器RS:RS是寄存器選擇R/W:R/W的讀和寫信號線,高水平低的讀操作,寫操作E:使能端E,當(dāng)E端由1至0時,液晶模塊中的命令開始被運行至(14)D0-D7:位雙向數(shù)據(jù)線BLA:背光源正極BLK:背光源負(fù)極3.4報警模塊圖1.5蜂鳴器模塊蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計算機、打印機、復(fù)印機、報警器、電子玩具、汽車電子設(shè)備、電話機、定時器等電子產(chǎn)品中作發(fā)聲器件。報警電路的要求是電路器件簡單,易于控制。所以報警模塊選擇單片機設(shè)計中最常使用的有源蜂鳴器。本設(shè)計利用單片機的I/O控制三極管的開關(guān)狀態(tài),進而達到控制蜂鳴器的報警。由于蜂鳴器工作時,需要的電流比較大,單片機的IO口輸出的電流又比較小,所以這里利用三極管的開關(guān)管功能來控制蜂鳴器發(fā)音,本設(shè)計選用的三極管型號是PNP三極管S8550,而且本設(shè)計選用的蜂鳴器屬于有源蜂鳴器,即在蜂鳴器內(nèi)部已經(jīng)內(nèi)置了震蕩電路,單片機無需連續(xù)發(fā)出高低電平來驅(qū)動它,而只要輸出高(或低)電平即可,這大大簡化了單片機程序的設(shè)計。由于選用的是PNP型而單片機上電IO口默認(rèn)是高電平的,所以上電時蜂鳴器是不會發(fā)出鳴叫的。3.5按鍵輸入模塊圖1.6按鍵輸入模塊在單片機應(yīng)用中鍵盤用得最多的形式是獨立鍵盤及矩陣鍵盤。它們各有自己的特點,其中獨立鍵盤硬件電路簡單,而且在程序設(shè)計上也不復(fù)雜,一般用在對硬件電路要求不高的簡單電路中;矩陣鍵盤與獨立鍵盤有很大區(qū)別,首先在硬件電路上它要比獨立鍵盤復(fù)雜得多,而且在程序算法上比它要煩瑣,但它在節(jié)省端口資源上有優(yōu)勢得多,因此它更適合于多按鍵電路。本設(shè)計中由于采用的按鍵數(shù)量較少,只有3個按鍵,分別是“設(shè)置”、“減”、“加”,故采用了獨立鍵盤的方式。3.6電路的排版連線設(shè)計電路元器件的排版和連線影響到電路的美觀和功能的實現(xiàn),本設(shè)計采用protel軟件進行排版設(shè)計。制作流程:(1)將生成的pcb圖打??;(2)按照打印的圖紙在板子上進行刻錄聯(lián)系;(3)將刻錄的連線部分用錫進行覆蓋;(4)用蝕銅液把多余的銅腐蝕掉;(5)打孔,焊接。4軟件設(shè)計4.1總程序流程圖圖1.7程序流程圖程序流程圖實現(xiàn)步驟:本系統(tǒng)的軟件流程圖如圖1.8所示,最開始先進行液晶的初始化,包括液晶功能初始化和液晶顯示內(nèi)容初始化,接著就開始進行溫濕度的檢測,然后判斷讀取到的溫濕度是否在報警的范圍之內(nèi),如果超出范圍,則蜂鳴器鳴叫,且對應(yīng)的指示燈亮。檢測完溫濕度數(shù)據(jù)后,就判斷是否有按鍵被按下(第一個),有的話,則進入了報警范圍設(shè)置界面,否則進行一段時間的延時后,就進入下一個循環(huán),從新檢測溫濕度數(shù)據(jù)。4.1.1溫濕度DHT11程序圖1.8溫濕度DHT11程序流程圖該軟件部分的實現(xiàn)步驟為:(1)DHT11發(fā)出讀取命令,讀取濕度和溫度數(shù)據(jù)以及校驗和;(2)檢測數(shù)據(jù)是否出錯;(3)若數(shù)據(jù)出錯,則丟棄當(dāng)前數(shù)據(jù);若數(shù)據(jù)符合,則數(shù)據(jù)被采用,進行下一個程序。4.1.2LCD1602液晶程序圖1.9LCD1602液晶程序該程序的實現(xiàn)步驟為:(1)液晶進行初始化后,對行列坐標(biāo)進行定位;(2)顯示一個字符;(3)數(shù)據(jù)是否顯示完成,若否,則重新顯示字符;若是,則進行下一個程序。4.2程序設(shè)計利用C51語言進行編程可以把程序進行模塊化編寫,然后在主函數(shù)里進行調(diào)用即可,這樣分工明確,框架清晰,給人一目了然的感覺。程序詳見附錄一。4.3串口通信串口程序如附錄三所示。單片機要與計算機通信,必須通過MAX232(或其他)芯片。這是因為計算機串口上的電平執(zhí)行的是RS-232標(biāo)準(zhǔn),它定義的高低電平和單片機的TTL邏輯電平不兼容。而MAX232芯片加上幾個電解電容,能完成電壓的加倍和反相,實現(xiàn)TTL電平和RS-232電平的轉(zhuǎn)換。單片機的串行口TXD與MAX232的一組電平轉(zhuǎn)換器的TTL輸入端(管腳12)相連,經(jīng)過MAX232轉(zhuǎn)換后,RS-232標(biāo)準(zhǔn)輸出端(管腳14)輸出的信號進入計算機串口的RXD。同樣計算機串口的TXD與MAX232的RS-232標(biāo)準(zhǔn)輸入端(管腳13)相連,經(jīng)過電平轉(zhuǎn)換后,由TTL輸出端(管腳11)輸出到單片機的RXD上DHT11的供電電壓為3-5.5V。傳感器上電后,要等待1s以越過不穩(wěn)定狀態(tài)在此期間無需發(fā)送任何指令。電源引腳(VDD,GND)之間可增加一個100nF的電容,用以去耦濾波。DATA用于微處理器與DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明,當(dāng)前小數(shù)部分用于以后擴展,現(xiàn)讀出為零.操作流程如下:一次完整的數(shù)據(jù)傳輸40bit,高位先出。數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗和用戶MCU發(fā)送一次開始信號后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機開始信號結(jié)束后,DHT11發(fā)送響應(yīng)信號,送出40bit的數(shù)據(jù),并觸發(fā)一次信號采集,用戶可選擇讀取部分?jǐn)?shù)據(jù).從模式下,DHT11接收到開始信號觸發(fā)一次溫濕度采集,如果沒有接收到主機發(fā)送開始信號,DHT11不會主動進行溫濕度采集.采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。4.4上位機的程序設(shè)計4.4.1面向?qū)ο蟮木幊堂嫦驅(qū)ο?ObjectOriented,OO)是軟件開發(fā)方法。面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計和軟件開發(fā),擴展到如數(shù)據(jù)庫系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺、分布式系統(tǒng)、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)、人工智能等領(lǐng)域。面向?qū)ο笫且环N對現(xiàn)實世界理解和抽象的方法,是計算機編程技術(shù)發(fā)展到一定階段后的產(chǎn)物。4.4.2上位機圖形窗口上位機是一臺可以發(fā)出特定操控命令的計算機,通過操作預(yù)先設(shè)定好的命令,將命令傳遞給下位機,通過下位機來控制設(shè)備完成各項操作。圖形窗口見附錄六。4.4.3上位機流程圖2.0主線程流程圖4.4.4主要程序代碼程序代碼詳見附錄二5系統(tǒng)調(diào)試5.1硬件調(diào)試(1)在焊接之前對各元器件的好壞進行測試,用萬用表進行測量。(2)檢測電路焊接的正確性,是否存在漏焊等。(3)用萬用表的電阻檔測量各焊點是否存在虛焊。5.2軟件調(diào)試軟件采用keilc51軟件進行編寫程序并進行仿真運行,如圖2.2所示。圖2.1軟件編譯圖(1)在軟件中編輯程序。(2)編輯結(jié)束后對軟件的正確性進行仿真。(3)直至出現(xiàn)以上的結(jié)果即沒有錯誤,沒有警告。參考文獻[1]董慧敏.溫濕度控制系統(tǒng)設(shè)計[J].實驗科學(xué)與技術(shù),2008,(05):24~27
[2]PIC單片機與單片機入門[J].電子制作,2005,(10):10~15[3]劉守義.單片機技術(shù)基礎(chǔ)[M].西安電子科技大學(xué)出版社,2007.[4]牛余朋,牛傲其.51單片機C語言的編程技巧[J].電子制作,2007.[5]王東峰.單片機C語言應(yīng)用100例[M].電子工業(yè)出版社,2009.(04):22~27
[6]周韌研,商斌.VisualC++串口通信開發(fā)入門與編程實踐,2009.(05):33~37[7]李江全,張榮華,李偉等.VisualStudio串口通信與測控應(yīng)用編程實踐.[8]李朝青.PC機及單片機數(shù)據(jù)通信技術(shù).附錄附錄一程序#include<reg51.h> #include<intrins.h>typedefunsignedcharuchar;typedefunsignedintuint;sfrISP_DATA=0xe2; //數(shù)據(jù)寄存器sfrISP_ADDRH=0xe3; //地址寄存器高八位sfrISP_ADDRL=0xe4; //地址寄存器低八位sfrISP_CMD=0xe5; //命令寄存器sfrISP_TRIG=0xe6; //命令觸發(fā)寄存器sfrISP_CONTR=0xe7; //命令寄存器sbitLCD_RS=P1^2; //LCD1602液晶的RS管腳sbitLCD_RW=P1^3; //LCD1602液晶的RW管腳sbitLCD_EN=P1^4; //LCD1602液晶的EN管腳sbitDHT11_D=P1^0; //溫濕度傳感器DHT11數(shù)據(jù)接入sbitLED_HL=P3^6; //濕度過低報警指示燈sbitLED_HH=P3^7; //濕度過高報警指示燈sbitBuzzer_D=P1^1; //蜂鳴器sbitKey_Set=P1^5; //設(shè)置按鍵的管腳sbitKey_Down=P1^6; //減按鍵的管腳sbitKey_Up=P1^7; //加按鍵的管腳ucharSHIDU; //保存濕度ucharT;//保存溫度ucharAlarm_HL; //濕度下限報警值ucharAlarm_HH; //濕度上限報警值/***************************關(guān)閉ISP&IAP****************************/voidISP_Disable(){ ISP_CONTR=0x00; ISP_CMD=0x00; ISP_TRIG=0x00;}/**************************************************從單片機內(nèi)部EEPROM讀一個字節(jié),從0x2000地址開始***************************************************/ucharEEPROM_Read(uintadd){ EA=0; ISP_CONTR=0x81; ISP_CMD=0x01; ISP_ADDRH=(uchar)(add>>8); ISP_ADDRL=(uchar)(add&0xff); //對STC89C52系列來說,每次要寫入0x46,再寫入0xB9,ISP/IAP才會生效 ISP_TRIG=0x46; ISP_TRIG=0xB9; _nop_(); ISP_Disable(); EA=1; returnISP_DATA;}/**************************************************往單片機內(nèi)部EEPROM寫一個字節(jié),從0x2000地址開始***************************************************/voidEEPROM_Write(uintadd,ucharch){ EA=0; ISP_CONTR=0x81; ISP_CMD=0x02; ISP_ADDRH=(uchar)(add>>8); ISP_ADDRL=(uchar)(add&0xff); ISP_DATA=ch; ISP_TRIG=0x46; ISP_TRIG=0xB9; _nop_(); ISP_Disable(); EA=1;}/*********************************************************擦除單片機內(nèi)部EEPROM的一個扇區(qū)寫8個扇區(qū)中隨便一個的地址,便擦除該扇區(qū),寫入前要先擦除**********************************************************/voidSector_Erase(uintadd) { EA=0; ISP_CONTR=0x81; ISP_CMD=0x03; ISP_ADDRH=(uchar)(add>>8); ISP_ADDRL=(uchar)(add&0xff); ISP_TRIG=0x46; ISP_TRIG=0xB9; _nop_(); ISP_Disable(); EA=1;}/****************************毫秒級延時函數(shù)*****************************/voidDelay_Ms(uinttime){ uinti,j; for(i=0;i<time;i++) { for(j=0;j<112;j++); }}/*******************************************LCD1602液晶寫指令函數(shù)********************************************/voidLcd_Write_Cmd(ucharcmd){LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd; Delay_Ms(2);LCD_EN=1; Delay_Ms(2);LCD_EN=0; }/*******************************************LCD1602液晶寫數(shù)據(jù)函數(shù)********************************************/voidLcd_Write_Data(uchardat){LCD_RS=1;LCD_RW=0;LCD_EN=0; P0=dat; Delay_Ms(2);LCD_EN=1; Delay_Ms(2);LCD_EN=0;}/*****************************LCD1602液晶初始化函數(shù)******************************/voidLcd_Init(){Lcd_Write_Cmd(0x38);//16*2顯示,5*7點陣,8位數(shù)據(jù)口Lcd_Write_Cmd(0x0C);//開顯示,不顯示光標(biāo)Lcd_Write_Cmd(0x06);//地址加1,當(dāng)寫入數(shù)據(jù)后光標(biāo)右移Lcd_Write_Cmd(0x01);//清屏}/***************************************LCD1602液晶輸出字符串函數(shù)****************************************/voidLcd_Show_String(uchar*str){while(*str!='\0') //判斷當(dāng)前字符是否為空字符{ Lcd_Write_Data(*str++); }}/***********************************LCD1602液晶輸出數(shù)字************************************/voidLcd_Show_Num(ucharnum){ Lcd_Write_Data(num/10+48); //十位 Lcd_Write_Data(num%10+48); //個位}/*******************************************LCD1602液晶顯示內(nèi)容的初始化********************************************/voidLcd_Show_Init(){ Lcd_Write_Cmd(0x80); Lcd_Show_String("DHT11SYSTEM"); //第1行的顯示內(nèi)容 Lcd_Write_Cmd(0xC0); Lcd_Show_String("SHIDU=%RH");//第2行的顯示內(nèi)容 }/********************************10us級延時程序*********************************/voidDelay_10us(){ _nop_(); //執(zhí)行一條指令,延時1微秒 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}/***************************************讀取DHT11單總線上的一個字節(jié)****************************************/ucharRead_Dht_Byte(){ ucharj; uchardat=0; for(j=0;j<8;j++) { while(!DHT11_D); //等待低電平結(jié)束 Delay_10us(); //延時等待30us Delay_10us(); Delay_10us(); if(DHT11_D) //判斷數(shù)據(jù)線是高電平還是低電平 { dat=dat|0x01; while(DHT11_D); } else { dat=dat|0x00; } dat=dat<<1;//循環(huán)左移一位 }returndat; }/*******************************************************讀取DHT11的一幀數(shù)據(jù),濕度高、濕度低、校驗碼********************************************************/voidRead_Dht_Data(){ ucharShidu_H; //濕度高檢測值 ucharShidu_L; //濕度低檢測值 ucharTem_H; //溫度高檢測值 ucharTem_L; //溫度低檢測值ucharcheck; //校驗字節(jié) DHT11_D=0; //主機拉低20ms Delay_Ms(20); DHT11_D=1; //DATA總線由上拉電阻拉高主機延時40us Delay_10us(); //延時等待30us Delay_10us(); Delay_10us(); while(!DHT11_D); //等待DHT的低電平結(jié)束 while(DHT11_D); //等待DHT的高電平結(jié)束 //進入數(shù)據(jù)接收狀態(tài) Shidu_H=Read_Dht_Byte(); //濕度高8位 Shidu_L=Read_Dht_Byte(); //濕度低8位,總為0 Tem_H=Read_Dht_Byte(); //溫度高8位 Tem_L=Read_Dht_Byte(); //溫度低8位,總為0 check=Read_Dht_Byte(); //8位校驗碼,其值等于讀出的四個字節(jié)相加之和的低8位 DHT11_D=1; //拉高總線 if(check==Shidu_H+Shidu_L+Tem_H+Tem_L) //如果收到的數(shù)據(jù)無誤 { SHIDU=Shidu_H; //將濕度的檢測結(jié)果賦值給全局變量SHIDU }}/****************************************報警判斷*****************************************/voidAlarm_Judge(){ uchari; if(SHIDU>Alarm_HH) //濕度過高,低電平顯示 { LED_HH=0; LED_HL=1; } elseif(SHIDU<Alarm_HL) //濕度過低,低電平顯示 { LED_HL=0; LED_HH=1; } else //濕度正常,都為高電平 { LED_HH=1; LED_HL=1; } if((!LED_HH)||(!LED_HL)) //蜂鳴器判斷,只要至少1個報警燈亮,蜂鳴器就報警 { for(i=0;i<3;i++) { Buzzer_D=0; Delay_Ms(100); Buzzer_D=1; Delay_Ms(100); } }}/************************************************按鍵掃描,用于設(shè)置濕度報警范圍*************************************************/voidKey_Scan(){ if(!Key_Set) //判斷設(shè)置按鍵是否被按下 { /*將液晶顯示改為設(shè)置頁面的*/ Lcd_Write_Cmd(0x80); Lcd_Show_String("AlarmSet");//第一行顯示內(nèi)容 Lcd_Write_Cmd(0xC0); Lcd_Show_String("-");//第二行顯示內(nèi)容 Lcd_Write_Cmd(0xC0+5); //在液晶上填充濕度的下限值 Lcd_Show_Num(Alarm_HL); Lcd_Write_Cmd(0xC0+8); //在液晶上填充濕度的上限值 Lcd_Show_Num(Alarm_HH); Lcd_Write_Cmd(0xC0+6); //光標(biāo)定位到第2行第7列 Lcd_Write_Cmd(0x0F); //光標(biāo)閃爍 Delay_Ms(10); //去除按鍵按下的抖動 while(!Key_Set); //等待按鍵釋放 Delay_Ms(10); //去除按鍵松開的抖動 /*設(shè)置濕度的下限值*/ while(Key_Set) //“設(shè)置鍵”沒有被按下,則一直處于濕度下限的設(shè)置 { if(!Key_Down) //判斷“減按鍵“是否被按下 { if(Alarm_HL>0) //當(dāng)濕度下限值大于0時,自減 { Alarm_HL--; } Lcd_Write_Cmd(0xC0+5); //重新刷新顯示更改后的濕度下限值 Lcd_Show_Num(Alarm_HL); Lcd_Write_Cmd(0xC0+6); //重新定位閃爍的光標(biāo)位置 Delay_Ms(350); } if(!Key_Up) //判斷“加按鍵“是否被按下 { if(Alarm_HL<99) //當(dāng)濕度下限值小于99時,自加 { Alarm_HL++; } Lcd_Write_Cmd(0xC0+5); //重新刷新顯示更改后的濕度下限值 Lcd_Show_Num(Alarm_HL); Lcd_Write_Cmd(0xC0+6); //重新定位閃爍的光標(biāo)位置 Delay_Ms(350); //延時 } } Lcd_Write_Cmd(0xC0+9); //定位到濕度上限的位置閃爍 Delay_Ms(10); //去除按鍵按下的抖動 while(!Key_Set); //等待按鍵釋放 Delay_Ms(10); //去除按鍵松開的抖動 /*設(shè)置濕度的上限值*/ while(Key_Set) //“設(shè)置鍵”沒有被按下,則一直處于濕度上限的設(shè)置 { if(!Key_Down) //判斷“減按鍵”是否被按下 { if(Alarm_HH>0) //當(dāng)濕度上限值大于0時,自減 { Alarm_HH--; } Lcd_Write_Cmd(0xC0+8); //重新刷新顯示更改后的濕度上限值 Lcd_Show_Num(Alarm_HH); Lcd_Write_Cmd(0xC0+9); //重新定位閃爍的光標(biāo)位置 Delay_Ms(350); } if(!Key_Up) //判斷“加按鍵“是否被按下 { if(Alarm_HH<99) //當(dāng)濕度上限值小于99時,自加 { Alarm_HH++; } Lcd_Write_Cmd(0xC0+8); //重新刷新顯示更改后的濕度上限值 Lcd_Show_Num(Alarm_HH); Lcd_Write_Cmd(0xC0+9); //重新定位閃爍的光標(biāo)位置 Delay_Ms(350); //延時 } } Lcd_Write_Cmd(0x0C); //取消光標(biāo)閃爍 Lcd_Show_Init(); //液晶顯示為檢測界面的 Delay_Ms(10); //去除按鍵按下的抖動 while(!Key_Set); //等待按鍵釋放 Delay_Ms(10); //去除按鍵松開的抖動 Sector_Erase(0x2000); //存儲之前必須先擦除 EEPROM_Write(0x2000,Alarm_HL); //把濕度下限存入到EEPROM的0x2000這個地址 EEPROM_Write(0x2001,Alarm_HH); //把濕度上限存入到EEPROM的0x2001這個地址 } }/**************************主函數(shù)***************************/intmain(){ uchari; Lcd_Init(); //LCD1602初始化 Lcd_Show_Init(); //LCD1602顯示的初始化 Alarm_HL=EEPROM_Read(0x2000); //從EEPROM的0x2002這個地址讀取濕度的報警下限 Alarm_HH=EEPROM_Read(0x2001); //從EEPROM的0x2003這個地址讀取濕度的報警上限 while(1) { Read_Dht_Data(); //檢測濕度數(shù)據(jù) Lcd_Write_Cmd(0xC0+8); //定位到要顯示濕度的地方 Lcd_Show_Num(SHIDU); //顯示濕度值 Alarm_Judge(); //判斷并根據(jù)需要報警 for(i=0;i<25;i++) { Key_Scan(); //按鍵掃描 Delay_Ms(20); //延時 } } return0;}附錄二上位機程序BOOLCommCommunicateThread::ConnectComm(intnPort){// BYTEbSet; DCBdcb; BOOLfRetVal; COMMTIMEOUTSCommTimeOuts; CStringszCom; szCom.Format(_T("\\\\.\\COM%d"),nPort); COMFile=CreateFile(szCom.GetBuffer(50),GENERIC_READ|GENERIC_WRITE,//可讀、可寫 FILE_SHARE_READ|FILE_SHARE_WRITE,//不共享FILE_SHARE_READ,FILE_SHARE_WRITE,FILE_SHARE_DELETE NULL,//無安全描 OPEN_EXISTING,//打開已存在文件 /*FILE_ATTRIBUTE_NORMAL|*/FILE_FLAG_OVERLAPPED,//文件屬性 NULL//一個有效的句柄,已存在的設(shè)備句柄AvalidhandletoatemplatefilewiththeGENERIC_READaccessright ); intnError=GetLastError(); if(INVALID_HANDLE_VALUE==COMFile/*COMFileTemp*/){ charchError[256];memset(chError,0,256); intnBuffLen=256; if(GetErrorString((PBYTE)chError,&nBuffLen,GetLastError())){ AfxMessageBox(chError); } return(FALSE); } //設(shè)置緩沖區(qū),輸入/輸出大小(字節(jié)數(shù)) SetupComm(/*COMFileTemp*/COMFile,4096,4096); //指定監(jiān)視事件_收到字符放入緩沖區(qū) SetCommMask(/*COMFileTemp*/COMFile,EV_RXCHAR); CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier=0; CommTimeOuts.ReadTotalTimeoutConstant=1000; CommTimeOuts.WriteTotalTimeoutMultiplier=2*CBR_9600/9600; CommTimeOuts.WriteTotalTimeoutConstant=0; //給定串口讀與操作限時 SetCommTimeouts(/*COMFileTemp*/COMFile,&CommTimeOuts); //設(shè)置串口參數(shù):波特率=9600;停止位1個;無校驗;8位 dcb.DCBlength=sizeof(DCB); GetCommState(/*COMFileTemp*/COMFile,&dcb); dcb.BaudRate=CBR_9600; dcb.StopBits=ONESTOPBIT; dcb.Parity=NOPARITY; dcb.ByteSize=8; dcb.fBinary=TRUE;//二進制通信,非字符通信 dcb.fOutxDsrFlow=0; dcb.fDtrControl=DTR_CONTROL_ENABLE; dcb.fOutxCtsFlow=0; dcb.fRtsControl=RTS_CONTROL_ENABLE; dcb.fInX=dcb.fOutX=1; dcb.XonChar=0X11; dcb.XoffChar=0X13; dcb.XonLim=100; dcb.XoffLim=100; dcb.fParity=TRUE; //根據(jù)設(shè)備控制塊配置通信設(shè)備 fRetVal=SetCommState(/*COMFileTemp*/COMFile,&dcb); if(!fRetVal)returnFALSE; //刷清緩沖區(qū) PurgeComm(/*COMFileTemp*/COMFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //指定串口執(zhí)行擴展功能 EscapeCommFunction(/*COMFileTemp*/COMFile,SETDTR);// //設(shè)置串口“收到字符放入緩沖區(qū)”事件// if(!SetCommMask(COMFile,EV_RXCHAR))return(FALSE); returnTRUE;}BOOLCommCommunicateThread::CloseComm(intnPort){ //禁止串行端口所有事件 SetCommMask(COMFile,0); //清除數(shù)據(jù)終端就緒信號 EscapeCommFunction(COMFile,CLRDTR); //丟棄通信資源的輸出或輸入緩沖區(qū)字符并終止在通信資源上掛起的讀、寫操//場作 PurgeComm(COMFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); CloseHandle(COMFile); COMFile=NULL;// CloseHandle(osRead.hEvent);// memset(&osRead,0,sizeof(osRead));;// CloseHandle(osWrite.hEvent);// memset(&osWrite,0,sizeof(osWrite));// CloseHandle(ShareEvent.hEvent);// memset(&ShareEvent,0,sizeof(ShareEvent)); returnTRUE;}intCommCommunicateThread::WriteCommBlock(PBYTEpOutData,intnDataLen){ if(NULL==pOutData||nDataLen<1) returnFALSE; //while(nDataLen>0){ DWORDnLen=0; if(!WriteFile(COMFile,(LPCVOID)pOutData,nDataLen,&nLen,&/*ShareEvent*/osWrite)){ if(WAIT_OBJECT_0==WaitForSingleObject(osWrite.hEvent,0xFFFFFF)) ResetEvent(osWrite.hEvent); else ResetEvent(osWrite.hEvent); DWORDnError=GetLastError(); if(997!=nError){//997異步?jīng)]完成 charchError[256];memset(chError,0,256); intnBuffLen=256; if(GetErrorString((PBYTE)chError,&nBuffLen,nError)){ AfxMessageBox(chError); } } } //} returnTRUE;}附錄三串口通信程序/**************************************************
往串口發(fā)送一個字節(jié)的數(shù)據(jù)
***************************************************/
void
Send_Byte(uchar
dat)
{
SBUF
=
dat;
while(!TI);
TI
=
0;
}
/*************************************************
將測得的濕度送往串口顯示
**************************************************/
void
Send_Data(uchar
dat)
{
Send_Byte(dat/10+48);
//
十位
Send_Byte(dat%10+48);
//
個位
Send_Byte('\n');
}
/********************************************
串口初始化
*********************************************/
void
Com_Init()
{
TMOD
=
0x20;
SCON
=
0x50;
TH1
=
0xF3;
TL1
=
0xF3;
TR1
=
1;
REN
=
1;
EA
=
1;
ES
=
1;
}
/**********************************************
串口中斷服務(wù)程序
***********************************************/
void
Ser()
interrupt
4
{
if(RI==1)
{
RI=0;
}
}附錄四元器件清單元器件名稱數(shù)量AT89C521個ADC08321個數(shù)碼管3個按鍵開關(guān)4個蜂鳴器1個濕度傳感器1個100Ω電阻8個1K電阻4個10uF電容1個三極管4個附錄五硬件原理圖附錄六仿真圖附錄七PCB版圖附錄八上位機圖形窗口基于C8051F單片機直流電動機反饋控制系統(tǒng)的設(shè)計與研究基于單片機的嵌入式Web服務(wù)器的研究MOTOROLA單片機MC68HC(8)05PV8/A內(nèi)嵌EEPROM的工藝和制程方法及對良率的影響研究基于模糊控制的電阻釬焊單片機溫度控制系統(tǒng)的研制基于MCS-51系列單片機的通用控制模塊的研究基于單片機實現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調(diào)節(jié)器單片機控制的二級倒立擺系統(tǒng)的研究基于增強型51系列單片機的TCP/IP協(xié)議棧的實現(xiàn)基于單片機的蓄電池自動監(jiān)測系統(tǒng)基于32位嵌入式單片機系統(tǒng)的圖像采集與處理技術(shù)的研究基于單片機的作物營養(yǎng)診斷專家系統(tǒng)的研究基于單片機的交流伺服電機運動控制系統(tǒng)研究與開發(fā)基于單片機的泵管內(nèi)壁硬度測試儀的研制基于單片機的自動找平控制系統(tǒng)研究基于C8051F040單片機的嵌入式系統(tǒng)開發(fā)基于單片機的液壓動力系統(tǒng)狀態(tài)監(jiān)測儀開發(fā)模糊Smith智能控制方法的研究及其單片機實現(xiàn)一種基于單片機的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機沖床數(shù)控系統(tǒng)的研究基于CYGNAL單片機的在線間歇式濁度儀的研制基于單片機的噴油泵試驗臺控制器的研制基于單片機的軟起動器的研究和設(shè)計基于單片機控制的高速快走絲電火花線切割機床短循環(huán)走絲方式研究基于單片機的機電產(chǎn)品控制系統(tǒng)開發(fā)基于PIC單片機的智能手機充電器基于單片機的實時內(nèi)核設(shè)計及其應(yīng)用研究基于單片機的遠(yuǎn)程抄表系統(tǒng)的設(shè)計與研究基于單片機的煙氣二氧化硫濃度檢測儀的研制基于微型光譜儀的單片機系統(tǒng)單片機系統(tǒng)軟件構(gòu)件開發(fā)的技術(shù)研究基于單片機的液體點滴速度自動檢測儀的研制基于單片機系統(tǒng)的多功能溫度測量儀的研制基于PIC單片機的電能采集終端的設(shè)計和應(yīng)用基于單片機的光纖光柵解調(diào)儀的研制氣壓式線性摩擦焊機單片機控制系統(tǒng)的研制基于單片機的數(shù)字磁通門傳感器基于單片機的旋轉(zhuǎn)變壓器-數(shù)字轉(zhuǎn)換器的研究基于單片機的光纖Bragg光柵解調(diào)系統(tǒng)的研究單片機控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機的多生理信號檢測儀基于單片機的電機運動控制系統(tǒng)設(shè)計Pico專用單片機核的可測性設(shè)計研究基于MCS-51單片機的熱量計基于雙單片機的智能遙測微型氣象站MCS-51單片機構(gòu)建機器人的實踐研究基于單片機的輪軌力檢測基于單片機的GPS定位儀的研究與實現(xiàn)基于單片機的電液伺服控制系統(tǒng)用于單片機系統(tǒng)的MMC卡文件系統(tǒng)研制基于單片機的時控和計數(shù)系統(tǒng)性能優(yōu)化的研究基于單片機和CPLD的粗光柵位移測量系統(tǒng)研究單片機控制的后備式方波UPS提升高職學(xué)生單片機應(yīng)用能力的探究基于單片機控制的自動低頻減載裝置研究基于單片機控制的水下焊接電源的研究基于單片機的多通道數(shù)據(jù)采集系統(tǒng)基于uPSD3234單片機的氚表面污染測量儀的研制基于單片機的紅外測油儀的研究96系列單片機仿真器研究與設(shè)計基于單片機的單晶金剛石刀具刃磨設(shè)備的數(shù)控改造基于單片機的溫度智能控制系統(tǒng)的設(shè)計與實現(xiàn)基于MSP430單片機的電梯門機控制器的研制基于單片機的氣體測漏儀的研究基于三菱M16C/6N系列單片機的CAN/USB協(xié)議轉(zhuǎn)換器基于單片機和DSP的變壓器油色譜在線監(jiān)測技術(shù)研究基于單片機的膛壁溫度報警系統(tǒng)設(shè)計基于AVR單片機的低壓無功補償控制器的設(shè)計基于單片機船舶電力推進電機監(jiān)測系統(tǒng)基于單片機網(wǎng)絡(luò)的振動信號的采集系統(tǒng)基于單片機的大容量數(shù)據(jù)存儲技術(shù)的應(yīng)用研究基于單片機的疊圖機研究與教學(xué)方法實踐基于單片機嵌入式Web服務(wù)器技術(shù)的研究及實現(xiàn)基于AT89S52單片機的通用數(shù)據(jù)采集系統(tǒng)基于單片機的多道脈沖幅度分析儀研究機器人旋轉(zhuǎn)電弧傳感角焊縫跟蹤單片機控制
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024簡單個人房屋租賃合同書
- 2025個人房屋租賃合同樣書
- 標(biāo)準(zhǔn)二手寫字樓買賣合同6篇
- 精準(zhǔn)醫(yī)療的基石實時超聲科案例分析
- 視頻編輯初級教程制作專業(yè)影音作品
- 課題申報參考:可行能力視角下進城農(nóng)民農(nóng)村集體經(jīng)濟組織權(quán)益的保障機制重構(gòu)研究
- 2024年AB膠項目資金需求報告
- 科技產(chǎn)品在小紅書的營銷策略研究
- 二零二五年度工業(yè)廠房租賃安全風(fēng)險評估與管理合同3篇
- 二零二五年度電子商務(wù)平臺交易催收保密合同2篇
- 圖像識別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 個體戶店鋪租賃合同
- 禮盒業(yè)務(wù)銷售方案
- 二十屆三中全會精神學(xué)習(xí)試題及答案(100題)
- 小學(xué)五年級英語閱讀理解(帶答案)
- 仁愛版初中英語單詞(按字母順序排版)
- (正式版)YS∕T 5040-2024 有色金屬礦山工程項目可行性研究報告編制標(biāo)準(zhǔn)
- 小學(xué)一年級拼音天天練
- 新概念英語第二冊考評試卷含答案(第49-56課)
- 【奧運會獎牌榜預(yù)測建模實證探析12000字(論文)】
- 保安部工作計劃
評論
0/150
提交評論