




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
傳感器與檢測技術課程設計緒論1.1目的及意義在工農業生產和日常生活中,對濕度的測量及控制始終占據著重要地位。在現代農業大棚種植或是室內畜牧業、氣象、環保、國防、科研、航天以及現代生活的各個方面,經常需要對環境濕度進行測量及控制。本設計就在此基礎上,設計一種基于STC89C52單片機控制的智能濕度檢測系統。1.2發展狀況進入21世紀后,特別在我國加入WTO后,國內產品面臨巨大挑戰。各行業特別是傳統產業都急切需要應用電子技術、自動控制技術進行改造和提升。例如紡織行業,溫濕度是影響紡織品質量的重要因素,但紡織企業對溫濕度的測控手段仍很粗糙,十分落后,絕大多數仍在使用干濕球濕度計,采用人工觀測,人工調節閥門、風機的方法,其控制效果可想而知。制藥行業里也基本如此。而在食品行業里,則基本上憑經驗,很少有人使用濕度傳感器。值得一提的是,隨著農業向產業化發展,許多農民意識到必需擺脫落后的傳統耕作、養殖方式,采用現代科學技術來應付進口農產品的挑戰,并打進國外市場。各地建立了越來越多的新型溫室大棚,種植反季節蔬菜,花卉;養殖業對環境的測控也日感迫切。但目前,在濕度測試領域大部分濕敏元件性能還只能使用在通常溫度環境下。在需要特殊環境下測濕的應用場合大部分國內包括許多國外濕度傳感器都會“皺起眉頭”!例如在上面提到紡織印染行業,食品行業,耐高溫材料行業等,都需要在高溫情況下測量濕度。一般情況下,印染行業在紗錠烘干中,溫度能達到120攝氏度或更高溫度;在食品行業中,食物的烘烤溫度能達到80-200攝氏度左右;耐高溫材料,如陶瓷過濾器的烘干等能達到200攝氏度以上。在這些情況下,普通的濕度傳感器是很難測量的。2系統的整體設計2.1設計內容本次設計分為兩個內容:硬件部分、軟件部分。硬件以單片機為核心,配以濕度模塊電路、鍵盤電路、數模轉換電路、顯示電路和報警電路。主要實現以下功能:(1)通過濕度模塊電路對環境的濕度進行數據采集;(2)通過單片機對采集的數據進行處理;(3)當環境濕度低于或者高于設置濕度時啟動報警。濕度檢測系統是一個智能化的系統,它的軟件主要實現功能:(1)單片機能夠控制濕度模塊對空氣的濕度進行采樣;(2)把采集的數據通過單片機處理,再以十進制的形式顯示出來;(3)按鍵和顯示電路可對設置的報警上下限值進行更改,并通過顯示電路顯示出來。2.2系統完成的技術指標(1)實時顯示絕對濕度,系統的精度為10mg/L;(2)采用3位數碼管進行濕度顯示;(3)顯示報警上限值為180mg/L,下限值為90mg/L;(4)濕度超過上下限濕度時進行報警;(5)數碼管采用動態顯示方式。2.3系統構成與框圖本次設計的系統框圖見圖1.1所示。圖1.1系統框圖單片機控制濕度模塊AM1001對環境的濕度進行檢測并通過單片機處理用數碼管顯示出來,鍵盤電路可設置報警的上下限值,當環境濕度高于上限或者低于下限報警值時,啟動報警電路,即蜂鳴器響。2.4系統設計(1)設計之前,查找資料。先對濕度的概念進行了解,并了解一些濕度傳感器的工作原理。空氣濕度是指空氣潮濕的程度,可用相對濕度(RH)表示。相對濕度是指空氣實際所含水蒸氣密度和同溫下飽和水蒸氣密度的百分比值。人體在室內感覺舒適的最佳相對濕度是,49%~5l%,相對濕度過低或過高,對人體都不適甚至有害。絕對濕度是一定體積的空氣中含有的水蒸氣的質量,一般其單位是克/立方米。絕對濕度的最大限度是飽和狀態下的最高濕度。絕對濕度只有與溫度一起才有意義,因為空氣中能夠含有的濕度的量隨溫度而變化,在不同的溫度中絕對濕度也不同,因為隨著溫度的變化空氣的體積也要發生變化。但絕對濕度越靠近最高濕度,它隨溫度的變化就越小。(2)分析系統的主要性能;(3)對整個電路的流程進行分析;(4)硬件的準備以及焊接;(5)用c語言進行軟件的編寫并仿真;(6)將硬件和軟件進行系統仿真直至完成設計。3硬件設計3.1STC89C52簡介圖1.2STC89C52本次設計所使用的單片機如圖1.2所示。STC89C52是一個低電壓,高性能CMOS8位單片機,片內含8kbytes的可反復擦寫的Flash只讀程序存儲器和256bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,功能強大的STC89C52單片機可為您提供許多較復雜系統控制應用場合。STC89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2個讀寫口線。STC89C52有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應不同產品的需求。主要功能特性 (1)兼容MCS51指令系統 (2)8k可反復擦寫(>1000次)FlashROM (3)32個雙向I/O口(4)256x8bit內部RAM (5)3個16位可編程定時/計數器中斷(6)時鐘頻率0-24MHz (7)2個串行中斷 (8)可編程UART串行通道 (9)2個外部中斷源 (10)共8個中斷源 (11)2個讀寫中斷口線 (12)3級加密位 (13)低功耗空閑和掉電模式(14)軟件設置睡眠和喚醒功能引腳簡介:(1)VCC(40腳),接+5V電源正端GND(20腳),接+5V電源地端(2)XTAL1(19腳),接外部晶振的一個引腳。在單片機內部,它是一個反相放大器的輸入端。當采用外部振蕩器時,此引腳應接地。XTAL2(18腳),接外部晶振的另一個引腳。在片內接至反相放大器的輸出端和內部時鐘電路的輸入端。當采用外部振蕩器時,此腳接外部振蕩器的輸出端。(3)控制信號線RESET(9腳):復位信號輸入端,復位/掉電時內部RAM的備用電源輸入端。ALE(30腳):地址鎖存允許/編程脈沖輸入,用ALE鎖存從P0口輸出的低8位地址。在對片內EPROM編程時,編程脈沖由此輸入。PSEN(29腳):外部程序存儲器讀選通信號,低電平有效。EA(31腳):訪問外部存儲器允許/編程電壓輸入。EA為高電平時,訪問內部存儲器;低電平時,訪問外部存儲器。3.2DHT11濕度檢測模塊圖1.3DHT11濕度模塊檢測模塊如圖1.3所示。3.2.1濕度檢測模塊選擇思路要對當前環境濕度進行檢測,并且需要和單片機結合,最好便是用傳感器來檢測環境濕度,通過單片機進行數據處理后顯示出來。傳感器的選擇需要精度高,而且便于單片機控制。3.2.2DHT11濕度模塊本次設計使用DHT11濕度傳感器。DHT11濕度模塊,是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。引腳說明:(1)Pin1:(VDD),電源引腳,供電電壓為3-5.5V。(2)Pin2:(DATA),串行數據,單總線。(3)Pin3:(NC),空腳,懸浮。(4)Pin4(VDD),接地端,電源負極。3.3液晶顯示模塊圖1.4液晶模塊本系統顯示采用了工業字符型液晶模塊1602,如圖1.4所示。可顯示2行16個字符,能方便顯示英文字母大小寫、阿拉伯數字、常用符號等。通過自定義還可顯示簡單的漢字。本液晶模塊的電路的連接圖如圖3-3所示,第1腳和第2腳分別接到了電路的GND和VCC,這2個腳是液晶工作的電源輸入腳。第3腳通過一個10K的電位器連接到地端,可通過調節該電位器來調節液晶的對比度。第4腳是液晶的寄存器控制腳,接到了單片機的P12腳上。第5腳是液晶的讀寫控制腳,接到了單片機的P13腳上。第6腳是液晶的使能腳,接到了單片機的P14腳上。第7腳到第14腳是液晶的數據/地址8位總線,接到了單片機的P0口上。最后第15腳和第16腳是液晶的背光電源腳,直接連接系統VCC和GND。1602LCD主要技術參數:(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為液晶顯示器對比度調整的端口,對比度的強弱由接電源的不同決定,對比度的調整可以通過一個10k的電位器RS:RS是寄存器選擇R/W:R/W的讀和寫信號線,高水平低的讀操作,寫操作E:使能端E,當E端由1至0時,液晶模塊中的命令開始被運行至(14)D0-D7:位雙向數據線BLA:背光源正極BLK:背光源負極3.4報警模塊圖1.5蜂鳴器模塊蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。報警電路的要求是電路器件簡單,易于控制。所以報警模塊選擇單片機設計中最常使用的有源蜂鳴器。本設計利用單片機的I/O控制三極管的開關狀態,進而達到控制蜂鳴器的報警。由于蜂鳴器工作時,需要的電流比較大,單片機的IO口輸出的電流又比較小,所以這里利用三極管的開關管功能來控制蜂鳴器發音,本設計選用的三極管型號是PNP三極管S8550,而且本設計選用的蜂鳴器屬于有源蜂鳴器,即在蜂鳴器內部已經內置了震蕩電路,單片機無需連續發出高低電平來驅動它,而只要輸出高(或低)電平即可,這大大簡化了單片機程序的設計。由于選用的是PNP型而單片機上電IO口默認是高電平的,所以上電時蜂鳴器是不會發出鳴叫的。3.5按鍵輸入模塊圖1.6按鍵輸入模塊在單片機應用中鍵盤用得最多的形式是獨立鍵盤及矩陣鍵盤。它們各有自己的特點,其中獨立鍵盤硬件電路簡單,而且在程序設計上也不復雜,一般用在對硬件電路要求不高的簡單電路中;矩陣鍵盤與獨立鍵盤有很大區別,首先在硬件電路上它要比獨立鍵盤復雜得多,而且在程序算法上比它要煩瑣,但它在節省端口資源上有優勢得多,因此它更適合于多按鍵電路。本設計中由于采用的按鍵數量較少,只有3個按鍵,分別是“設置”、“減”、“加”,故采用了獨立鍵盤的方式。3.6電路的排版連線設計電路元器件的排版和連線影響到電路的美觀和功能的實現,本設計采用protel軟件進行排版設計。制作流程:(1)將生成的pcb圖打印;(2)按照打印的圖紙在板子上進行刻錄聯系;(3)將刻錄的連線部分用錫進行覆蓋;(4)用蝕銅液把多余的銅腐蝕掉;(5)打孔,焊接。4軟件設計4.1總程序流程圖圖1.7程序流程圖程序流程圖實現步驟:本系統的軟件流程圖如圖1.8所示,最開始先進行液晶的初始化,包括液晶功能初始化和液晶顯示內容初始化,接著就開始進行溫濕度的檢測,然后判斷讀取到的溫濕度是否在報警的范圍之內,如果超出范圍,則蜂鳴器鳴叫,且對應的指示燈亮。檢測完溫濕度數據后,就判斷是否有按鍵被按下(第一個),有的話,則進入了報警范圍設置界面,否則進行一段時間的延時后,就進入下一個循環,從新檢測溫濕度數據。4.1.1溫濕度DHT11程序圖1.8溫濕度DHT11程序流程圖該軟件部分的實現步驟為:(1)DHT11發出讀取命令,讀取濕度和溫度數據以及校驗和;(2)檢測數據是否出錯;(3)若數據出錯,則丟棄當前數據;若數據符合,則數據被采用,進行下一個程序。4.1.2LCD1602液晶程序圖1.9LCD1602液晶程序該程序的實現步驟為:(1)液晶進行初始化后,對行列坐標進行定位;(2)顯示一個字符;(3)數據是否顯示完成,若否,則重新顯示字符;若是,則進行下一個程序。4.2程序設計利用C51語言進行編程可以把程序進行模塊化編寫,然后在主函數里進行調用即可,這樣分工明確,框架清晰,給人一目了然的感覺。程序詳見附錄一。4.3串口通信串口程序如附錄三所示。單片機要與計算機通信,必須通過MAX232(或其他)芯片。這是因為計算機串口上的電平執行的是RS-232標準,它定義的高低電平和單片機的TTL邏輯電平不兼容。而MAX232芯片加上幾個電解電容,能完成電壓的加倍和反相,實現TTL電平和RS-232電平的轉換。單片機的串行口TXD與MAX232的一組電平轉換器的TTL輸入端(管腳12)相連,經過MAX232轉換后,RS-232標準輸出端(管腳14)輸出的信號進入計算機串口的RXD。同樣計算機串口的TXD與MAX232的RS-232標準輸入端(管腳13)相連,經過電平轉換后,由TTL輸出端(管腳11)輸出到單片機的RXD上DHT11的供電電壓為3-5.5V。傳感器上電后,要等待1s以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間可增加一個100nF的電容,用以去耦濾波。DATA用于微處理器與DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右,數據分小數部分和整數部分,具體格式在下面說明,當前小數部分用于以后擴展,現讀出為零.操作流程如下:一次完整的數據傳輸40bit,高位先出。數據格式:8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據+8bit校驗和用戶MCU發送一次開始信號后,DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束后,DHT11發送響應信號,送出40bit的數據,并觸發一次信號采集,用戶可選擇讀取部分數據.從模式下,DHT11接收到開始信號觸發一次溫濕度采集,如果沒有接收到主機發送開始信號,DHT11不會主動進行溫濕度采集.采集數據后轉換到低速模式。4.4上位機的程序設計4.4.1面向對象的編程面向對象(ObjectOriented,OO)是軟件開發方法。面向對象的概念和應用已超越了程序設計和軟件開發,擴展到如數據庫系統、交互式界面、應用結構、應用平臺、分布式系統、網絡管理結構、CAD技術、人工智能等領域。面向對象是一種對現實世界理解和抽象的方法,是計算機編程技術發展到一定階段后的產物。4.4.2上位機圖形窗口上位機是一臺可以發出特定操控命令的計算機,通過操作預先設定好的命令,將命令傳遞給下位機,通過下位機來控制設備完成各項操作。圖形窗口見附錄六。4.4.3上位機流程圖2.0主線程流程圖4.4.4主要程序代碼程序代碼詳見附錄二5系統調試5.1硬件調試(1)在焊接之前對各元器件的好壞進行測試,用萬用表進行測量。(2)檢測電路焊接的正確性,是否存在漏焊等。(3)用萬用表的電阻檔測量各焊點是否存在虛焊。5.2軟件調試軟件采用keilc51軟件進行編寫程序并進行仿真運行,如圖2.2所示。圖2.1軟件編譯圖(1)在軟件中編輯程序。(2)編輯結束后對軟件的正確性進行仿真。(3)直至出現以上的結果即沒有錯誤,沒有警告。參考文獻[1]董慧敏.溫濕度控制系統設計[J].實驗科學與技術,2008,(05):24~27
[2]PIC單片機與單片機入門[J].電子制作,2005,(10):10~15[3]劉守義.單片機技術基礎[M].西安電子科技大學出版社,2007.[4]牛余朋,牛傲其.51單片機C語言的編程技巧[J].電子制作,2007.[5]王東峰.單片機C語言應用100例[M].電子工業出版社,2009.(04):22~27
[6]周韌研,商斌.VisualC++串口通信開發入門與編程實踐,2009.(05):33~37[7]李江全,張榮華,李偉等.VisualStudio串口通信與測控應用編程實踐.[8]李朝青.PC機及單片機數據通信技術.附錄附錄一程序#include<reg51.h> #include<intrins.h>typedefunsignedcharuchar;typedefunsignedintuint;sfrISP_DATA=0xe2; //數據寄存器sfrISP_ADDRH=0xe3; //地址寄存器高八位sfrISP_ADDRL=0xe4; //地址寄存器低八位sfrISP_CMD=0xe5; //命令寄存器sfrISP_TRIG=0xe6; //命令觸發寄存器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數據接入sbitLED_HL=P3^6; //濕度過低報警指示燈sbitLED_HH=P3^7; //濕度過高報警指示燈sbitBuzzer_D=P1^1; //蜂鳴器sbitKey_Set=P1^5; //設置按鍵的管腳sbitKey_Down=P1^6; //減按鍵的管腳sbitKey_Up=P1^7; //加按鍵的管腳ucharSHIDU; //保存濕度ucharT;//保存溫度ucharAlarm_HL; //濕度下限報警值ucharAlarm_HH; //濕度上限報警值/***************************關閉ISP&IAP****************************/voidISP_Disable(){ ISP_CONTR=0x00; ISP_CMD=0x00; ISP_TRIG=0x00;}/**************************************************從單片機內部EEPROM讀一個字節,從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;}/**************************************************往單片機內部EEPROM寫一個字節,從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;}/*********************************************************擦除單片機內部EEPROM的一個扇區寫8個扇區中隨便一個的地址,便擦除該扇區,寫入前要先擦除**********************************************************/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;}/****************************毫秒級延時函數*****************************/voidDelay_Ms(uinttime){ uinti,j; for(i=0;i<time;i++) { for(j=0;j<112;j++); }}/*******************************************LCD1602液晶寫指令函數********************************************/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液晶寫數據函數********************************************/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液晶初始化函數******************************/voidLcd_Init(){Lcd_Write_Cmd(0x38);//16*2顯示,5*7點陣,8位數據口Lcd_Write_Cmd(0x0C);//開顯示,不顯示光標Lcd_Write_Cmd(0x06);//地址加1,當寫入數據后光標右移Lcd_Write_Cmd(0x01);//清屏}/***************************************LCD1602液晶輸出字符串函數****************************************/voidLcd_Show_String(uchar*str){while(*str!='\0') //判斷當前字符是否為空字符{ Lcd_Write_Data(*str++); }}/***********************************LCD1602液晶輸出數字************************************/voidLcd_Show_Num(ucharnum){ Lcd_Write_Data(num/10+48); //十位 Lcd_Write_Data(num%10+48); //個位}/*******************************************LCD1602液晶顯示內容的初始化********************************************/voidLcd_Show_Init(){ Lcd_Write_Cmd(0x80); Lcd_Show_String("DHT11SYSTEM"); //第1行的顯示內容 Lcd_Write_Cmd(0xC0); Lcd_Show_String("SHIDU=%RH");//第2行的顯示內容 }/********************************10us級延時程序*********************************/voidDelay_10us(){ _nop_(); //執行一條指令,延時1微秒 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}/***************************************讀取DHT11單總線上的一個字節****************************************/ucharRead_Dht_Byte(){ ucharj; uchardat=0; for(j=0;j<8;j++) { while(!DHT11_D); //等待低電平結束 Delay_10us(); //延時等待30us Delay_10us(); Delay_10us(); if(DHT11_D) //判斷數據線是高電平還是低電平 { dat=dat|0x01; while(DHT11_D); } else { dat=dat|0x00; } dat=dat<<1;//循環左移一位 }returndat; }/*******************************************************讀取DHT11的一幀數據,濕度高、濕度低、校驗碼********************************************************/voidRead_Dht_Data(){ ucharShidu_H; //濕度高檢測值 ucharShidu_L; //濕度低檢測值 ucharTem_H; //溫度高檢測值 ucharTem_L; //溫度低檢測值ucharcheck; //校驗字節 DHT11_D=0; //主機拉低20ms Delay_Ms(20); DHT11_D=1; //DATA總線由上拉電阻拉高主機延時40us Delay_10us(); //延時等待30us Delay_10us(); Delay_10us(); while(!DHT11_D); //等待DHT的低電平結束 while(DHT11_D); //等待DHT的高電平結束 //進入數據接收狀態 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位校驗碼,其值等于讀出的四個字節相加之和的低8位 DHT11_D=1; //拉高總線 if(check==Shidu_H+Shidu_L+Tem_H+Tem_L) //如果收到的數據無誤 { SHIDU=Shidu_H; //將濕度的檢測結果賦值給全局變量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); } }}/************************************************按鍵掃描,用于設置濕度報警范圍*************************************************/voidKey_Scan(){ if(!Key_Set) //判斷設置按鍵是否被按下 { /*將液晶顯示改為設置頁面的*/ Lcd_Write_Cmd(0x80); Lcd_Show_String("AlarmSet");//第一行顯示內容 Lcd_Write_Cmd(0xC0); Lcd_Show_String("-");//第二行顯示內容 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); //光標定位到第2行第7列 Lcd_Write_Cmd(0x0F); //光標閃爍 Delay_Ms(10); //去除按鍵按下的抖動 while(!Key_Set); //等待按鍵釋放 Delay_Ms(10); //去除按鍵松開的抖動 /*設置濕度的下限值*/ while(Key_Set) //“設置鍵”沒有被按下,則一直處于濕度下限的設置 { if(!Key_Down) //判斷“減按鍵“是否被按下 { if(Alarm_HL>0) //當濕度下限值大于0時,自減 { Alarm_HL--; } Lcd_Write_Cmd(0xC0+5); //重新刷新顯示更改后的濕度下限值 Lcd_Show_Num(Alarm_HL); Lcd_Write_Cmd(0xC0+6); //重新定位閃爍的光標位置 Delay_Ms(350); } if(!Key_Up) //判斷“加按鍵“是否被按下 { if(Alarm_HL<99) //當濕度下限值小于99時,自加 { Alarm_HL++; } Lcd_Write_Cmd(0xC0+5); //重新刷新顯示更改后的濕度下限值 Lcd_Show_Num(Alarm_HL); Lcd_Write_Cmd(0xC0+6); //重新定位閃爍的光標位置 Delay_Ms(350); //延時 } } Lcd_Write_Cmd(0xC0+9); //定位到濕度上限的位置閃爍 Delay_Ms(10); //去除按鍵按下的抖動 while(!Key_Set); //等待按鍵釋放 Delay_Ms(10); //去除按鍵松開的抖動 /*設置濕度的上限值*/ while(Key_Set) //“設置鍵”沒有被按下,則一直處于濕度上限的設置 { if(!Key_Down) //判斷“減按鍵”是否被按下 { if(Alarm_HH>0) //當濕度上限值大于0時,自減 { Alarm_HH--; } Lcd_Write_Cmd(0xC0+8); //重新刷新顯示更改后的濕度上限值 Lcd_Show_Num(Alarm_HH); Lcd_Write_Cmd(0xC0+9); //重新定位閃爍的光標位置 Delay_Ms(350); } if(!Key_Up) //判斷“加按鍵“是否被按下 { if(Alarm_HH<99) //當濕度上限值小于99時,自加 { Alarm_HH++; } Lcd_Write_Cmd(0xC0+8); //重新刷新顯示更改后的濕度上限值 Lcd_Show_Num(Alarm_HH); Lcd_Write_Cmd(0xC0+9); //重新定位閃爍的光標位置 Delay_Ms(350); //延時 } } Lcd_Write_Cmd(0x0C); //取消光標閃爍 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這個地址 } }/**************************主函數***************************/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(); //檢測濕度數據 Lcd_Write_Cmd(0xC0+8); //定位到要顯示濕度的地方 Lcd_Show_Num(SHIDU); //顯示濕度值 Alarm_Judge(); //判斷并根據需要報警 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//一個有效的句柄,已存在的設備句柄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); } //設置緩沖區,輸入/輸出大小(字節數) SetupComm(/*COMFileTemp*/COMFile,4096,4096); //指定監視事件_收到字符放入緩沖區 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); //設置串口參數:波特率=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; //根據設備控制塊配置通信設備 fRetVal=SetCommState(/*COMFileTemp*/COMFile,&dcb); if(!fRetVal)returnFALSE; //刷清緩沖區 PurgeComm(/*COMFileTemp*/COMFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //指定串口執行擴展功能 EscapeCommFunction(/*COMFileTemp*/COMFile,SETDTR);// //設置串口“收到字符放入緩沖區”事件// if(!SetCommMask(COMFile,EV_RXCHAR))return(FALSE); returnTRUE;}BOOLCommCommunicateThread::CloseComm(intnPort){ //禁止串行端口所有事件 SetCommMask(COMFile,0); //清除數據終端就緒信號 EscapeCommFunction(COMFile,CLRDTR); //丟棄通信資源的輸出或輸入緩沖區字符并終止在通信資源上掛起的讀、寫操//場作 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異步沒完成 charchError[256];memset(chError,0,256); intnBuffLen=256; if(GetErrorString((PBYTE)chError,&nBuffLen,nError)){ AfxMessageBox(chError); } } } //} returnTRUE;}附錄三串口通信程序/**************************************************
往串口發送一個字節的數據
***************************************************/
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;
}
/**********************************************
串口中斷服務程序
***********************************************/
void
Ser()
interrupt
4
{
if(RI==1)
{
RI=0;
}
}附錄四元器件清單元器件名稱數量AT89C521個ADC08321個數碼管3個按鍵開關4個蜂鳴器1個濕度傳感器1個100Ω電阻8個1K電阻4個10uF電容1個三極管4個附錄五硬件原理圖附錄六仿真圖附錄七PCB版圖附錄八上位機圖形窗口基于C8051F單片機直流電動機反饋控制系統的設計與研究基于單片機的嵌入式Web服務器的研究MOTOROLA單片機MC68HC(8)05PV8/A內嵌EEPROM的工藝和制程方法及對良率的影響研究基于模糊控制的電阻釬焊單片機溫度控制系統的研制基于MCS-51系列單片機的通用控制模塊的研究基于單片機實現的供暖系統最佳啟停自校正(STR)調節器單片機控制的二級倒立擺系統的研究基于增強型51系列單片機的TCP/IP協議棧的實現基于單片機的蓄電池自動監測系統基于32位嵌入式單片機系統的圖像采集與處理技術的研究基于單片機的作物營養診斷專家系統的研究基于單片機的交流伺服電機運動控制系統研究與開發基于單片機的泵管內壁硬度測試儀的研制基于單片機的自動找平控制系統研究基于C8051F040單片機的嵌入式系統開發基于單片機的液壓動力系統狀態監測儀開發模糊Smith智能控制方法的研究及其單片機實現一種基于單片機的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機沖床數控系統的研究基于CYGNAL單片機的在線間歇式濁度儀的研制基于單片機的噴油泵試驗臺控制器的研制基于單片機的軟起動器的研究和設計基于單片機控制的高速快走絲電火花線切割機床短循環走絲方式研究基于單片機的機電產品控制系統開發基于PIC單片機的智能手機充電器基于單片機的實時內核設計及其應用研究基于單片機的遠程抄表系統的設計與研究基于單片機的煙氣二氧化硫濃度檢測儀的研制基于微型光譜儀的單片機系統單片機系統軟件構件開發的技術研究基于單片機的液體點滴速度自動檢測儀的研制基于單片機系統的多功能溫度測量儀的研制基于PIC單片機的電能采集終端的設計和應用基于單片機的光纖光柵解調儀的研制氣壓式線性摩擦焊機單片機控制系統的研制基于單片機的數字磁通門傳感器基于單片機的旋轉變壓器-數字轉換器的研究基于單片機的光纖Bragg光柵解調系統的研究單片機控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機的多生理信號檢測儀基于單片機的電機運動控制系統設計Pico專用單片機核的可測性設計研究基于MCS-51單片機的熱量計基于雙單片機的智能遙測微型氣象站MCS-51單片機構建機器人的實踐研究基于單片機的輪軌力檢測基于單片機的GPS定位儀的研究與實現基于單片機的電液伺服控制系統用于單片機系統的MMC卡文件系統研制基于單片機的時控和計數系統性能優化的研究基于單片機和CPLD的粗光柵位移測量系統研究單片機控制的后備式方波UPS提升高職學生單片機應用能力的探究基于單片機控制的自動低頻減載裝置研究基于單片機控制的水下焊接電源的研究基于單片機的多通道數據采集系統基于uPSD3234單片機的氚表面污染測量儀的研制基于單片機的紅外測油儀的研究96系列單片機仿真器研究與設計基于單片機的單晶金剛石刀具刃磨設備的數控改造基于單片機的溫度智能控制系統的設計與實現基于MSP430單片機的電梯門機控制器的研制基于單片機的氣體測漏儀的研究基于三菱M16C/6N系列單片機的CAN/USB協議轉換器基于單片機和DSP的變壓器油色譜在線監測技術研究基于單片機的膛壁溫度報警系統設計基于AVR單片機的低壓無功補償控制器的設計基于單片機船舶電力推進電機監測系統基于單片機網絡的振動信號的采集系統基于單片機的大容量數據存儲技術的應用研究基于單片機的疊圖機研究與教學方法實踐基于單片機嵌入式Web服務器技術的研究及實現基于AT89S52單片機的通用數據采集系統基于單片機的多道脈沖幅度分析儀研究機器人旋轉電弧傳感角焊縫跟蹤單片機控制
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年商法課程考試題及答案
- 2025年軟件測試工程師考試題及答案
- 2025年健康教育與推廣試題及答案
- 2025年口腔醫學專業考試試卷及答案
- 成都某老年公寓商業計劃書
- 七級歷史試題及答案
- 再談圖書館崗位設置
- 室內人像照片的調色技巧及案例分析
- 世界經濟概論(中)
- 2025年核磁共振巖心測試儀項目發展計劃
- (高清版)DG∕TJ 08-7-2021 建筑工程交通設計及停車庫(場)設置標準
- 無房無車離婚協議書
- 南師附中高三數學備忘錄及答案詳解
- 2025-2030年中國甲巰咪唑片行業市場現狀供需分析及投資評估規劃分析研究報告
- 史明清時期社會經濟的發展課件++2024-2025學年統編版七年級歷史下冊
- 2025年安徽國控資產管理有限公司第二季度社會招聘5人筆試參考題庫附帶答案詳解
- 2025中考語文7-9年級總復習古詩詞默寫
- 國家職業標準 4-11-01-01 供電服務員 (2025年版)
- 中國特色社會主義+綜合練習(三)-2025屆中職高考政治一輪復習高教版(2023版)
- 情境+任務驅動作文(兼審“情境”與“任務”)-2024年中考語文重難點復習專練(江蘇)學生版
- (二模)臨沂市2025年高三高考模擬考試地理試題卷(含答案)
評論
0/150
提交評論