基于單片機的自動澆花器設計 摘 要:隨著科技的發(fā)展,人們對生活水平的要求逐漸提高,智能家居也慢慢潛入人們的生活,自動化的興起也是對科技發(fā)展的肯定。現(xiàn)在很多人都住上了高層,為了凈化室內(nèi)空氣便種植盆栽,一方面是為了凈化空氣,另一方面是為了陶冶情操。然而很多人想精心照顧他們的花花草草,但是又不懂方法與技巧甚至有的人沒時間去照料,所以這就需要設計一款自動澆花器。 本設計用AT89C51單片機作為控制中心,YL-69作土壤濕度傳感模塊,光敏電阻作為光照量傳感模塊,LCD1602作為顯示數(shù)據(jù)的模塊,按鍵用來設定數(shù)值。本系統(tǒng)有三種模式的功能,一是可以通過YL-69濕度傳感器進行土壤濕度的采集,利用單片機AT89C51對信息進行處理,輸出控制信號,控制信號通過控制繼電器控制水泵電源是否通斷,從而完成自動澆水。二是利用單片機精確控制,在設定時間內(nèi)實施澆水。三是在系統(tǒng)中加入一個光敏電阻,當檢測到有光照的時候即白天的時候系統(tǒng)檢測到土壤濕度低于設定值時才運行完成澆水,當檢測到無光照即黑夜時即使檢測到土壤濕度低于設定值系統(tǒng)也不會運行。
目 錄 1 緒論 1.1 研究背景 1.3主要設計內(nèi)容 2 系統(tǒng)設計 2.1 方案論證 2.1.1 總體方案設計 2.1.2 土壤濕度測量方案 2.2 硬件的選擇 2.3 系統(tǒng)結構 3 系統(tǒng)硬件設計 3.1 AT89C51主要性能參數(shù) 3.2 時鐘電路 3.3 AT89C51的復位電路 3.4 YL-69土壤濕度傳感器 3.5 SRS-05VDC-SL繼電器 3.6 按鍵電路 3.7 DS1302時鐘芯片 4 系統(tǒng)軟件設計 4.1 系統(tǒng)流程圖 4.2 土壤濕度檢測程序 4.3 按鍵程序 4.4 LCD1602顯示程序 5 仿真設計與硬件調(diào)試 5.1 硬件調(diào)試 結論 參考文獻 致謝 附錄 附錄A:主程序
1緒論 1.1研究背景 如今,對于澆灌系統(tǒng)而言,微噴技術被國際上許多國家廣泛采用,該項技術的工作原理為借助低壓管道讓水快速的射出,并在空氣里分散為細小的水珠,從而讓這些水霧覆蓋于種植物、農(nóng)作物及周圍的土地表面,使得農(nóng)作物不再缺乏水分。此系統(tǒng)主要應用于植物種植密度大,植物柔軟細嫩的場合。 隨著社會生產(chǎn)力的發(fā)展,人們的生活水平在不斷提高,更加追求生活環(huán)境健康與舒適,如今千家萬戶都會在自己的余暇功夫里自己栽培花草,栽培花草不僅可以凈化空氣,還可以陶冶情操。植物的生長需要定期澆水,有些人可能會因為忙而忘記給植物澆水,或者沒有一定的澆花經(jīng)驗甚至會導致植物死亡等,這都是不利于植物生長的。 1.2 國內(nèi)外的發(fā)展現(xiàn)狀 1.2.1國外研究現(xiàn)狀 在西方的國家,智能家用電器的技術已經(jīng)十分先進,而站在國際的層面來看,由于我國的制造及設計產(chǎn)業(yè)在國際上的關鍵地位,使得中國已然發(fā)展成國際上智能家電的主要市場。如今,智能花盆在全球已經(jīng)受到廣大客戶的青睞,雖然它們的控制及工作原理有著較大的差異,可它們設計的目的都是為了服務于人類平時生活中的養(yǎng)花種草等方面。 在英國有這樣的一類智能花盆,它的設計者是瑞貝克皮特森。它能夠隨時觀察記錄盆栽的生長情況。“Plantroid”是一個智能花盆機器人,它是由東京農(nóng)工大學副教授水內(nèi)郁夫發(fā)明創(chuàng)造的,“Plantroid”與其它的花盆不同的是,除了有六個晶硅太陽能以外,在他的底部還裝有四個可以滾動的滑輪,這使得其能夠在地面隨處移動。其內(nèi)部裝有光線傳感器,當它檢測到盆栽處于背陰處時,或者曬不到陽光的地方,機器人會自動下達指令讓滑輪走到有陽光的地方,因而方便了人們的植物培養(yǎng),并且使得植物充分的享有光照進行光合作用,加速植物的健康生長。 在不久前,英國學生娜塔莉・金也創(chuàng)造出了一款智能的花盆機器人,此機器人的配套設施較為齊全,在花盆下面裝有檢測濕度與溫度的傳感裝置,花盆表面設有光線傳感器。這些裝置的安裝能夠讓植物在處于不適宜的環(huán)境下自動報警,比如在濕度過大或溫度過強時,花盆都會自動閃光提示,讓主人能夠及時采取相關措施。 1.2.2 國內(nèi)研究現(xiàn)狀 對于中國而言,已然出現(xiàn)了許多供植物澆水的器具,然而這些都是傳統(tǒng)的澆水設施,在智能機械方面的研究成果較少。目前,在中國市場上普遍存在大量的自動澆水裝置,可是這些澆水的器材都是傳統(tǒng)的定量澆水,很難根據(jù)植物的自身需要進行適當適量的澆水施肥,這也導致了大面積的水資源浪費,不僅沒有使得植物得到很好的生長,相反卻讓植物的成長起到了副作用。 由于全球技術的高速傳播,如今的中國也有許多關于智能花盆方面的研究。楊守建等人于2011年,開始了相關方面的工作,他們研究的主要任務是利用裝置檢測土地的濕度及溫度,參照檢測裝置反饋的數(shù)據(jù)對植物進行適當適量的澆水,整個科研的經(jīng)費花費較少,且后期維護的花銷也不高。 與此同時,王薇等學者在2011年也開始了相關智能花盆上的研究,此種智能花盆由多個部分組成,其中包括:放大電路、比較電路、驅(qū)動電路、繼電器、電磁閥等等。工作原理也是能夠自主檢測植物土壤周圍的濕度,從而根據(jù)實際情況進行澆水。 學者張兆朋在此方面也有著自己的發(fā)面,他一人設計創(chuàng)造了小型的職能家庭澆水儀器,同時更夠依據(jù)植物的不同種類,運行不同的控制程序。在工作原理上也是參照上述幾種智能儀器,實現(xiàn)自主職能澆水。學者趙麗也發(fā)明了一類高效智能的植物澆水裝置,在儀器底部裝有傳感裝置,用以檢測相關環(huán)境的溫度、濕度,在借助單片機展開數(shù)據(jù)分析,下達相關的執(zhí)行指令,對澆水器進行控制,完成相關的澆水任務。 隨著科技的發(fā)展,家用電器的智能化也得到了廣大國民的青睞,所以,對于智能花盆的相關研究還是十分有必要的。 1.3主要設計內(nèi)容 此論文是立足于單片機的自動澆花器設計: - 完成整體的規(guī)劃和結構設計
- 圍繞著單片機展開相關工作,并對裝置原件展開處理,讓它們有機的搭配起來。主要的硬件部分涵蓋有:土壤濕度檢測電路、光亮度檢測電路、電源電路、按鍵設置電路、LCD1602顯示電路與繼電器控制水泵電路。以及系統(tǒng)的軟件設計及編寫,使其與硬件模塊互相配合。大體涵蓋有以下幾類程序:主要程序、濕度檢測程序、信息匯總程序、按鍵觸碰程序、運行子程序等。
- 完成硬件模塊和軟件模塊的調(diào)試。
2 系統(tǒng)設計 2.1方案論證 2.1.1 總體方案設計 該方案的系統(tǒng)體系主要由兩部分共同搭建,分別是:硬件方面、軟件方面。硬件模塊方面大體包括了土壤濕度檢測模塊、光亮度檢測模塊、按鍵設置模塊、LCD1602顯示模塊與繼電器控制水泵電路模塊,設計了一種智能澆灌的系統(tǒng)。這個自動澆花系統(tǒng)可以根據(jù)土壤干濕程度以及光照的強度,對植物的澆水進行自動控制。單片機是此方案的控制中心,通過環(huán)境濕度檢測儀展開相關信息的傳遞,繼而使用智能系統(tǒng)規(guī)定其濕度的最大及最小值,然后再借助單片機將傳輸來的相關信息展開分析與整理,從而評估外界環(huán)境的濕度。一旦反饋的濕度值明顯小于規(guī)定的濕度最小值,那么單片機將下達指令至控制水泵,讓其進行澆水行為,當濕度到達設定的最大值時停止?jié)菜@就是整個澆花的工作原理。或在無人的情況下,根據(jù)自己的澆灌經(jīng)驗通過設定時間來進行澆灌,當?shù)竭_設定時間時單片機控制水泵澆水,超過一分鐘后水泵停止?jié)菜1驹O計可以完成以下功能: 1.借助濕度傳感器采集土壤濕度的相關信息; 2.顯示測量的數(shù)據(jù) 3.對最適宜植物成長的土壤進行分析,并規(guī)定其濕度的最大值和最小值; 4.使用光敏電阻測量光照量 5.不同模式的選擇。 2.1.2 土壤濕度測量方案 檢測土壤濕度的相關活動在眾多的部門中都得到了廣泛的應用,其中主要包括:科研單位、工業(yè)制造、氣象監(jiān)測等,然而在一般的情況中,對于土壤水分的檢測并不是唯一的數(shù)據(jù)。因為土壤濕度會受到大氣壓強、溫度或人類甚至無法察覺的因素影響。 如今,對于土壤濕度的測量我們通常有2種方法,分別是干濕球與電子濕度傳感器。下面是對兩種方法展開的對比研究,旨在選擇最佳的檢測方法。對于干濕球方法而言,它屬于非直接的檢測方法,借助對干球與濕球的兩種測量從而了解其濕度。所以,如果在溫度較高或者環(huán)境較為惡劣的情況下,我們會優(yōu)先選擇干濕球法。 隨著科技的不斷進步,電子濕度檢測在這些年得到了廣泛的推崇,由于其測量數(shù)值較為精確,一般可達2%一3%RH,同時在運行的階段對外界的影響有著較強的抗干擾能力。但使用的時間一長,傳感器的精度就會有所下降,因此電子式傳感器比較適用于工作在常溫、穩(wěn)定的環(huán)境中。 2.2硬件的選擇 選取yl-69土壤水分傳感器作為土壤傳感系統(tǒng)模塊,靈敏度可調(diào),數(shù)字輸出簡單,模擬輸出準確,比較器LM393,工作穩(wěn)定可靠。 (2)主控芯片的選擇: 方案一:使用STC89C52系列的單片機,特點是驅(qū)動能力強,運轉(zhuǎn)比較穩(wěn)定,與AT89C51系列相比擬,性價比較高,抗干擾能力強。 方案二:AT89C51單片機由Atmel公司生產(chǎn),主要的特點是低電壓、高性能,同時價格也比較便宜,最主要的是AT89C51單片機和MCS-51系列有很好的兼容性。但缺點是定時器、ROM較少。 AT89C51單片機是我們學習的主要單片機,它的配置已經(jīng)完全可以滿足系統(tǒng)的需求,所以選擇方案二AT89C51單片機。 (3)A/D轉(zhuǎn)換芯片選擇: 第一種方案:通過ADC0832芯片轉(zhuǎn)換,ADC0832轉(zhuǎn)換芯片為雙通道8位分辨率的轉(zhuǎn)換芯片。其最高分辯可達256級。由于其轉(zhuǎn)換速度快、便宜、體積較小、穩(wěn)定性高等特點,因此深受單片機愛好者喜愛,普及率極高。 第二種方案:ADC0809轉(zhuǎn)換芯片ADC0809芯片的使用,是一種并行轉(zhuǎn)換芯片,相比較ADC0832要快得多,但其引腳電路比較復雜,并且價錢是昂貴的。 綜合考慮選用ADC0832可以滿足系統(tǒng)需求,故選用方案一。 (4)繼電器選擇: 在早期設計階段,儀器的運行需要利用小電流實施對大電流的操控,因此我們選擇了繼電器來操控電磁閥。工作電壓在5V左右,并且成本低。綜上所述,本次的系統(tǒng)設計中,選用的是松樂SRS-05VDC-SL型號的繼電器。 (5)顯示器的選擇: 因系統(tǒng)需要必須用到一個顯示系統(tǒng)模式功能和檢測數(shù)據(jù)的顯示器。LCD1602可以用來顯示字母、阿拉伯數(shù)字和符號,按照系統(tǒng)的需求,使用可以同時顯示出16*02即32個字符的16腳(帶背光)模塊。 (6)電源選擇: 系統(tǒng)選用5V電源適配器,考慮到水泵的運行可能會導致屏幕顯示不清,所以給水泵配備3節(jié)干電池。 2.3 系統(tǒng)結構 此系統(tǒng)主要由六個電路組建而成,分別為:土壤濕度檢測電路、光亮度檢測電路、電源電路、按鍵設置電路、LCD1602顯示電路與繼電器控制水泵電路。系統(tǒng)原理圖如圖1所示。
圖1 系統(tǒng)原理圖 3系統(tǒng)硬件設計 3.1AT89C51單片機簡介及設計 3.1.1 AT89C51主要性能參數(shù) AT89C2051是一款極為精簡的51單片機,將P0口和P2口進行了精簡,引腳也僅有20個,然而其內(nèi)部卻安裝了十分實用的模擬比較器,對于開發(fā)研究精簡的51系統(tǒng)而言,其是最好不過的選擇了,因為在大多數(shù)的情況下,我們開發(fā)根本用不到所有的32個I/O口,所以選擇AT89C2051較為適宜,不僅芯片體積更小,同時其工作電壓最低為2.7V,所以用來開發(fā)時能夠用5號電池供電的便攜式產(chǎn)品。其引腳圖如圖2所示。 圖2 AT89C51引腳圖 3.1.2 時鐘電路 單片機AT89C51的內(nèi)部包含了一個輸入端與一個輸出端,分別是以引腳XTAL1與XTAL2的放大器,使其達到搭建自激式振蕩電路的目的,因此需要在XTAL1及XTAL2引腳中裝設晶體振蕩器、陶瓷振蕩器,此電路的輸出能夠傳送到程序內(nèi)部的時序電路。對于單片機的時鐘電路,其重要性不言而喻,它相當于人體的大腦,控制著單片機的運行頻率。而連接單片機的主要形式通常包括以下兩種:外部時鐘形式、內(nèi)部時鐘形式。 之所以選用此方案的內(nèi)部時鐘的理由為:一個高增益放大器和相位平方芯片內(nèi)部外部跳線晶體,調(diào)諧電容時鐘電路生成的結構形式,時鐘電路圖的系統(tǒng)如圖3所示。 圖3 時鐘電路 3.1.3 AT89C51的復位電路 51單片機高電平復位。就現(xiàn)如今使用比較多的AT89系列得單片機來講,在復位腳加上2個高電平機器周期(即24個振蕩周期)就可以使單片機進行復位。復位后,單片機的主要特征是各IO口顯現(xiàn)為高電平,程序計數(shù)器開始從零運行程序。 本系統(tǒng)選用的是手動按鍵復位的模式,采用的措施是接一個按鈕在復位RST端和正電源Vcc之間。當按鈕被按下時,Vcc的+5V電平就會被直接加到RST復位端。由于按鍵閉合的時間非常短,而我們總可以使按鈕保持最起碼十毫秒的接通時間,因此,完全可以符合對復位的時段要求。圖4為按鍵電路圖 圖4 按鍵電路圖 3.2YL-69土壤濕度傳感器該系統(tǒng)設計采用yl-69是一個相對簡單的土壤水分傳感器,當測試土壤水分變化時,通過濕敏電容所處的空間內(nèi)介質(zhì)發(fā)生變化,這也導致了其電容數(shù)值產(chǎn)生改變,并且電容的數(shù)值和濕度值之間呈正比關系。YL-69表面經(jīng)過鍍鎳處理,可以很好的提高導電性,保護傳感器不易被腐蝕。借助電位器掌控有關的閥值,在探查到環(huán)境濕度在最小值以下,DO隨之產(chǎn)生高電平;相反,在探查到的環(huán)境溫度在最大值以上,DO隨之產(chǎn)生一個低電平。本次系統(tǒng)的電路設計為VCC外接一個5V電壓,GND外接數(shù)字地,DO"小板數(shù)字量輸出接口(0和1)”接到單片機。電路原理圖如圖5所示,k1是YL-69探頭。 
圖5 YL-69與AD轉(zhuǎn)化電路 3.3SRS-05VDC-SL繼電器 繼電器(relay)能夠?qū)⒕性變化的輸入量輸出為階躍變化結果。這種特質(zhì)就可以被利用來起到控制的作用,當輸入量達到了一定程度,就可以通過控制階躍變化的結果反過來影響整體電路,在整個電路中,繼電器只需要很小的電流,相當于以弱電流來控制大電流的控制器,而且一定程度上繼電器還可以用來保護電路,防止電壓變化過大,損害電子元件。 當前市場上的繼電器種類有很多,但是經(jīng)過一一對比,本系統(tǒng)選擇電磁繼電器作為整個電路的控制方式。其原理是通過電流變化來改變電磁效應的強弱,從而將電信號轉(zhuǎn)化為磁性強度變化,最終通過接觸點來影響電流的通路還是斷開。 圖7中三級管的b基級處于低電位時,三極管導通,則K1單刀雙擲開關向右邊偏離,電機M水泵通電,水泵開始運行。 
圖7 繼電器控制水泵
3.4按鍵電路 因本系統(tǒng)設計定時電路,需要用按鍵進行設置,所以加入按鍵模塊按鍵:按鍵設計如圖8所示。S1是模式鍵、S2是設置鍵、S是調(diào)整加鍵、S4是調(diào)整減鍵。 
圖8 按鍵電路 3.5光敏電阻及其控制電路光敏電阻的特點在于能夠?qū)⒐鈱W物理信息轉(zhuǎn)化為電信號,這種特質(zhì)也是其命名的來源,這種電阻也可以被簡稱為光電阻,或者可以稱它為光導管。具體來說,這種電阻可以在不同運動狀態(tài)以及電子的光照強度下表現(xiàn)為不同的電阻值,所以用這種材料制成的電阻器也被稱為光電導探測器。當照射光強緩慢增加時,電阻值不斷減小,變化趨勢呈現(xiàn)為負相關,反之亦然。本次系統(tǒng)設計將光敏電阻并聯(lián)在濕度傳感器的電路中。電路圖如圖9所示。 
圖9 光敏電阻電路圖 3.6 DS1302時鐘芯片 DS1302是比日常中比較常用的一種時鐘芯片,它具有計時的功能。在本次系統(tǒng)中,因為要加上定時功能,所以選擇在系統(tǒng)在加入DS1302芯片,它能夠?qū)θ掌凇r間等信息作統(tǒng)計,通過設置鍵來設定時間,也可以將時間顯示在顯示屏上。電路圖如圖10所示。 圖10 DS1302時鐘芯片電路圖 4 系統(tǒng)軟件設計 4.1 系統(tǒng)流程圖 系統(tǒng)軟件設計包括對土壤濕度檢測程序、對采集到的數(shù)據(jù)進行處理的程序、設置濕度上下限的程序、按鍵程序、顯示程序等。主程序流程如圖14所示。   圖14 程序流程圖
4.2 土壤濕度檢測 土壤濕度傳感檢測模塊對土壤的濕度變化特別敏銳,日常用來檢測泥土的濕度。如果土壤濕度傳感器檢測到土壤濕度低于設定值時,DO輸出高電平;當土壤濕度傳感器檢測到土壤濕度高于設定值時,D0輸出低電平。并且D0口能夠與單片機直接相連接,通過單片機來反應高低電平,所以來檢測土壤濕度。 4.3 LCD1602顯示流程圖 液晶顯示器LCD1602是利用液晶的物理特性來實現(xiàn)顯示的,當電路通電時,LCD便可以顯示出來數(shù)字、圖像等。LCD1602液晶顯示流程圖如圖所示:         
5 仿真設計與硬件調(diào)試 5.1 仿真軟件簡介 proteus仿真軟件可以提供對單片機及外圍電路進行仿真,它將電路仿真軟件、PCB設計軟件和虛擬模型仿真軟件三者合一,是目前唯一一款三合一平臺。它可以實現(xiàn)原理布圖、PCB自動或人工布線、SPICE電路仿真,最后達到仿真效果,可以在運行后看到輸入輸出的效果。此軟件提供現(xiàn)成元器件、測試儀器以圖形的方式表示,并可以直接從窗口圖形中調(diào)出,軟件中測試儀器的圖形與實物相似,而且可以儲存實驗測試結果的數(shù)據(jù)、波形、工作狀態(tài)等,并可以打印輸出。 5.2 仿真流程 (1)打開Proteus軟件,會彈出如圖5-1所示的窗口,我們可以看到右邊的大區(qū)域是繪圖窗口,左面的小窗口是視圖小窗口,緊挨著下面分別是元器件列表、控制按鈕。 
圖5-1 Proteus打開界面 (2)在界面視圖小窗口的下面有P L按鈕,點擊P按鈕,便可彈出一個搜素欄,在里面輸入需要的元器件名稱,就會在右邊的繪圖窗口中彈出,雙擊需要的元器件,選擇好之后關閉對話框,之后就可以在剛才的P L按鈕下面點擊最終需要的元器件,用鼠標拖動移到繪圖窗口即可單擊確定位置即可。如圖5-2所示: 
圖5-2搜索添加元器件 (3)將元器件選擇好之后,系統(tǒng)自動布線即可完成電路圖設計,雙擊電路圖中的單片機會出現(xiàn)一個對話框,然后把.hex文件加載進去,如圖5-3所示 
圖5-3 加載.hex文件 - 最后點擊窗口左下角的運行開始鍵,就可以完成仿真過程,如圖5-4所示:

圖5-4 運行結果 5.3 仿真結果 在參考電路的運行圖之后,依照其樣式將實物制出,然后把程序燒錄至AT89C51單片機內(nèi)接通電源,將YL-69土壤濕度傳感器探頭放入土壤中,按鍵調(diào)至模式一,調(diào)至濕度值50%,屏幕顯示澆水開始,水泵運行,澆灌到設定濕度值時停止?jié)菜0存I調(diào)至模式二,檢測到濕度值低于設定濕度,水泵開始澆水,將光敏電阻遮蓋住,屏幕顯示為夜間模式,停止?jié)菜⑵浒存I轉(zhuǎn)換到第三種模式,規(guī)定時間并運行澆水,在系統(tǒng)檢測到需要澆水時,水泵便會自動出水,運行60秒后便停止灌溉。之后,看實物能否穩(wěn)定操作。如果一切顯示都正常的話,就無需開展硬件的相關調(diào)整,如果運行的不正常則要分析其原因并開展相關調(diào)試工作。
結論 基于單片機的自動澆花器的設計,利用單片機控制系統(tǒng)對各部分進行控制,使其澆灌模塊是否進行運作。土壤濕度測量的模塊為YL-69,其主要的作用是將測量的濕度信息傳遞至單片機的系統(tǒng)內(nèi)部,同時利用單片機的處理將I/O傳遞至LCD屏幕上。LCD上顯示的值是土壤的含水值,這是判斷灌水是否的數(shù)值。程序的控制部分由自動澆花部分組成,而系統(tǒng)的監(jiān)察部分則是由土壤濕度處理組成。整個系統(tǒng)的為智能化的自動運行,程序的控制主要是通過單片機分析數(shù)據(jù)并處理得來,在濕度監(jiān)測儀檢測到土壤濕度低于規(guī)定的數(shù)值后,那么單片機將下達指令至控制水泵,讓其進行澆水行為,在經(jīng)過一段時間的澆水過后,當濕度達到規(guī)定的最大值時,儀器又將停止運水,這就是整個澆花的工作原理。單片機還可以手動輸入定時時間,時間會通過LCD1602進行顯示,通過程序設計澆灌開始及澆灌結束時間。
致謝 時光即逝,大學四年將至,在這四年中我收獲頗豐,特別是在這幾個月的畢業(yè)設計期間,我特別感謝老師、同學、朋友、家人的精心指導與細心照料。感謝指導老師侯老師對我這次論題寫作方向的確定的幫助,您對我的論文寫作思路進行啟發(fā),重點要點進行指導說明,不厭其煩的幫助對論文進行修改并提出些建議,從論文的選題、開題報告的撰寫、資料的查找,到結構的完善,都給予悉心指導,使我順利成文。授人以魚不如授人以漁,您嚴謹?shù)墓ぷ鲬B(tài)度、精心指導和無私的關懷都是我們學習的榜樣,在此對幫助和指導過我的老師們表示衷心的感謝。感謝我的同學和朋友們,在我寫論文的過程中給予了我很多有用的素材,還在論文的撰寫和排版等過程中提供熱情的幫助。最后要感謝家人對我的支持與鼓勵,有了你們我才可以在不惑之年全身心投入到學習中,順利完成學業(yè)。
單片機源程序如下:
- #include<reg52.h>
- #include<LCD1602.h>
- #include<ADC0832.h>
- #include<INTERRUPT.h>
- #include<math.h>
- #include<stdio.h>
- #include<EEPROM.h>
- #include<DS1302.h>
- sbit jidainqi = P1^4;//自動澆花開關
- sbit jidainqi_led = P1^3;//自動澆花開關指示燈
- sbit key_mode = P3^2;//模式切換按鍵
- sbit key_set = P3^3;//設置
- sbit key_jia = P3^4;//加
- sbit key_jian = P2^0;//減
- sbit guang = P2^2;//光
- uchar temp_ad[6];
- double temp;
- uchar f=0;
- uchar wei;
- uchar mode;
- uchar set_time=0;
- uchar jiaohua_num;//澆花濕度值
- uchar set_shidu=0;//按鍵設置標志位
- uchar T0_num;
- uchar ad;
- char naozhong1[]={0x00,0x00,0x00};
- /********************************************************
- 函數(shù)名稱:void delayms(uint ms)
- 函數(shù)作用:毫秒延時函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void Delay_ms(uint ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- void display(void)//選擇頁面
- {
- lcd1602_write_character(0,1,"Watering System "); //初始化顯示的文字
- lcd1602_write_character(0,2," Choice mode"); //初始化顯示的文字
- }
- void display1(void)//白天自動檢測澆花
- {
- ad=ADC0832_read(0);
- Delay_ms(25);
- temp=(1-(double)ad/255)*100;
- if(temp<=jiaohua_num)
- {
- if(f==0)//清屏標志位
- {
- LCD_write_command(0x01);
- delay_n40us(100);
- f=1;
- }
- lcd1602_write_character(0,1,"Flower is Dying!");
- lcd1602_write_character(0,2," Auto Watering!");
- jidainqi=0;jidainqi_led=0;//自動澆花
- }
- else
- {
- // if(temp<1.5)
- // wei=sprintf(temp_ad,"%0.2f",0);
- // else
- wei=sprintf(temp_ad,"%0.2f",temp);
- if(f==1)
- {
- LCD_write_command(0x01);
- delay_n40us(100);
- f=0;
- }
- lcd1602_write_character(0,1," The mode one:"); //初始化顯示的文字
- lcd1602_write_character(3,2," ");
- lcd1602_write_character(9-wei,2,temp_ad);
- lcd1602_write_character(9,2,"%RH");
- jidainqi=1;jidainqi_led=1;//停止?jié)不?br />
- }
- }
- void display4(void)//澆花濕度設置
- {
- T0_num++;
- if(T0_num==254)
- T0_num=0;
- lcd1602_write_character(0,1," Set water num"); //初始化顯示的文字
- if(T0_num%2==0) //偶數(shù)次顯示
- {
- LCD_disp_char(9,2,ASCII[jiaohua_num/10]); //
- LCD_disp_char(10,2,ASCII[jiaohua_num%10]);
- // Delay_ms(1);
- }
- else
- {
- LCD_disp_char(9,2,ASCII[jiaohua_num/10]);
- LCD_disp_char(10,2,ASCII[jiaohua_num%10]);
-
- }
- }
- void display2(void)//自動澆花加光照
- {
- //lcd1602_write_character(0,1,"mode two:"); //初始化顯示的文字
- ad=ADC0832_read(0);
- Delay_ms(25);
- temp=(1-(double)ad/255)*100;
- if(temp<=jiaohua_num&&guang==1)
- {
- if(f==0)//清屏標志位
- {
- LCD_write_command(0x01);
- delay_n40us(100);
- f=1;
- }
- lcd1602_write_character(0,1,"Flower is Dying!");
- lcd1602_write_character(0,2," Auto Watering!");
- jidainqi=0;jidainqi_led=0;//自動澆花
- }
- else
- {
- // if(temp<1.5)
- // wei=sprintf(temp_ad,"%0.2f",0);
- // else
- wei=sprintf(temp_ad,"%0.2f",temp);
- if(f==1)
- {
- LCD_write_command(0x01);
- delay_n40us(100);
- f=0;
- }
- if(guang==0)
- {
- lcd1602_write_character(0,2,"Night");
- }
- else
- {
- lcd1602_write_character(0,2,"Day! ");
- }
- lcd1602_write_character(0,1," The mode two:"); //初始化顯示的文字
- lcd1602_write_character(6,2," ");
- lcd1602_write_character(12-wei,2,temp_ad);
- lcd1602_write_character(12,2,"%RH");
- jidainqi=1;jidainqi_led=1;//停止?jié)不?br />
- }
- }
- void display3(void)//定時模式
- {
- Read_time(); //讀取時間
- lcd1602_write_character(0,1,"The mode three:"); //初始化顯示的文字
- LCD_disp_char(1,2,ASCII[time[4]/10]);//月
- LCD_disp_char(2,2,ASCII[time[4]%10]);
- LCD_disp_char(3,2,ASCII[11]);
- LCD_disp_char(4,2,ASCII[time[3]/10]);//日
- LCD_disp_char(5,2,ASCII[time[3]%10]);
-
- LCD_disp_char(7,2,ASCII[time[2]/10]);// 時
- LCD_disp_char(8,2,ASCII[time[2]%10]);
- //LCD_disp_char(9,1,ASCII[11]);
- lcd1602_write_character(9,2,":");
- LCD_disp_char(10,2,ASCII[time[1]/10]);//分
- LCD_disp_char(11,2,ASCII[time[1]%10]);
- //LCD_disp_char(12,1,ASCII[11]);
- lcd1602_write_character(12,2,":");
- LCD_disp_char(13,2,ASCII[time[0]/10]);//秒
- LCD_disp_char(14,2,ASCII[time[0]%10]);
-
- if(time[2]==naozhong1[2]&&time[1]==naozhong1[1]&&time[0]==naozhong1[0])
- {
- jidainqi=0;jidainqi_led=0;//自動澆花
- }
- if(time[2]==naozhong1[2]&&(time[1]==(naozhong1[1])+1)&&time[0]==naozhong1[0])
- {
- jidainqi=1;jidainqi_led=1;
- }
- }
- void display5(void)
- {
- T0_num++;
- if(T0_num==254)
- T0_num=0;
-
- LCD_disp_char(3,1,ASCII[11]);
- lcd1602_write_character(9,1,":");
- lcd1602_write_character(12,1,":");
- lcd1602_write_character(7,2,":");
- lcd1602_write_character(10,2,":");
-
- if(T0_num%2==0) //偶數(shù)次顯示
- {
- LCD_disp_char(1,1,ASCII[time[4]/10]);//月
- LCD_disp_char(2,1,ASCII[time[4]%10]);
- LCD_disp_char(4,1,ASCII[time[3]/10]);//日
- LCD_disp_char(5,1,ASCII[time[3]%10]);
-
- LCD_disp_char(7,1,ASCII[time[2]/10]);// 時
- LCD_disp_char(8,1,ASCII[time[2]%10]);
- LCD_disp_char(10,1,ASCII[time[1]/10]);//分
- LCD_disp_char(11,1,ASCII[time[1]%10]);
- LCD_disp_char(13,1,ASCII[time[0]/10]);//秒
- LCD_disp_char(14,1,ASCII[time[0]%10]);
-
- LCD_disp_char(5,2,ASCII[naozhong1[2]/10]);// 時
- LCD_disp_char(6,2,ASCII[naozhong1[2]%10]);
- LCD_disp_char(8,2,ASCII[naozhong1[1]/10]);//分
- LCD_disp_char(9,2,ASCII[naozhong1[1]%10]);
- LCD_disp_char(11,2,ASCII[naozhong1[0]/10]);//秒
- LCD_disp_char(12,2,ASCII[naozhong1[0]%10]);
- Delay_ms(1);
- }
- else //奇數(shù)次時候設置那個量的時候那個量不顯示,以達到閃爍的效果
- {
- if(set_time==1)
- {
- LCD_disp_char(1,1,ASCII[13]);
- LCD_disp_char(2,1,ASCII[13]);
- }
- else
- {
- LCD_disp_char(1,1,ASCII[time[4]/10]);
- LCD_disp_char(2,1,ASCII[time[4]%10]);
- }
- if(set_time==2)
- {
- LCD_disp_char(4,1,ASCII[13]);
- LCD_disp_char(5,1,ASCII[13]);
- }
- else
- {
- LCD_disp_char(4,1,ASCII[time[3]/10]);
- LCD_disp_char(5,1,ASCII[time[3]%10]);
- }
- if(set_time==3)
- {
- LCD_disp_char(7,1,ASCII[13]);
- LCD_disp_char(8,1,ASCII[13]);
- }
- else
- {
- LCD_disp_char(7,1,ASCII[time[2]/10]);
- LCD_disp_char(8,1,ASCII[time[2]%10]);
- }
- if(set_time==4)
- {
- LCD_disp_char(10,1,ASCII[13]);
- LCD_disp_char(11,1,ASCII[13]);
- }
- else
- {
- LCD_disp_char(10,1,ASCII[time[1]/10]);
- LCD_disp_char(11,1,ASCII[time[1]%10]);
- }
- if(set_time==5)
- {
- LCD_disp_char(13,1,ASCII[13]);
- LCD_disp_char(14,1,ASCII[13]);
- }
- else
- {
- LCD_disp_char(13,1,ASCII[time[0]/10]);
- LCD_disp_char(14,1,ASCII[time[0]%10]);
- }
- if(set_time==6)
- {
- LCD_disp_char(5,2,ASCII[13]);
- LCD_disp_char(6,2,ASCII[13]);
- }
- else
- {
- LCD_disp_char(5,2,ASCII[naozhong1[2]/10]);
- LCD_disp_char(6,2,ASCII[naozhong1[2]%10]);
- }
- if(set_time==7)
- {
- LCD_disp_char(8,2,ASCII[13]);
- LCD_disp_char(9,2,ASCII[13]);
- }
- else
- {
- LCD_disp_char(8,2,ASCII[naozhong1[1]/10]);
- LCD_disp_char(9,2,ASCII[naozhong1[1]%10]);
- }
- if(set_time==8)
- {
- LCD_disp_char(11,2,ASCII[13]);
- LCD_disp_char(12,2,ASCII[13]);
- }
- else
- {
- LCD_disp_char(11,2,ASCII[naozhong1[0]/10]);
- LCD_disp_char(12,2,ASCII[naozhong1[0]%10]);
- }
-
- }
- }
- /********************************************************
- 函數(shù)名稱:void scan(void)
- 函數(shù)作用:按鍵檢測函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void scan(void)
- {
- //模式按鍵
- if(key_mode==0)
- {
- Delay_ms(7);
- if(key_mode==0)
- {
- jidainqi=1;jidainqi_led=1;//澆花
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100); //實踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令。
- mode++;set_shidu=0;set_time=0;
- jidainqi=1;jidainqi_led=1;//停止?jié)不?br />
- if(mode==4)
- {
- mode=0;
- EEPROM_delete(0x2202); //擦除扇區(qū)
- EEPROM_write(0x2202,naozhong1[2]);//
- EEPROM_delete(0x2402); //擦除扇區(qū)
- EEPROM_write(0x2402,naozhong1[1]);//
- EEPROM_delete(0x2602); //擦除扇區(qū)
- EEPROM_write(0x2602,naozhong1[0]);//
- display();
- }
- if(mode==2)
- {
- EEPROM_delete(0x2002); //擦除扇區(qū)
- EEPROM_write(0x2002,jiaohua_num);//
- }
- }
- while(!key_mode);//檢測按鍵松開
- }
- //設置鍵,不支持連按
- if(key_set==0)
- {
- Delay_ms(7);
- if(key_set==0&&mode==1)
- {
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100); //實踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令。
- set_shidu++;
- jidainqi=1;jidainqi_led=1;//停止?jié)不?br />
- if(set_shidu==2)
- {
- set_shidu=0;
- EEPROM_delete(0x2002); //擦除扇區(qū)
- EEPROM_write(0x2002,jiaohua_num);//
- display1();
- }
- }
- if(key_set==0&&mode==3)
- {
- set_time++;
- if(set_time==1)
- {
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100); //實踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令?
- }
- if(set_time>8)
- {
- set_time=0;
- EEPROM_delete(0x2202); //擦除扇區(qū)
- EEPROM_write(0x2202,naozhong1[2]);//
- EEPROM_delete(0x2402); //擦除扇區(qū)
- EEPROM_write(0x2402,naozhong1[1]);//
- EEPROM_delete(0x2602); //擦除扇區(qū)
- EEPROM_write(0x2602,naozhong1[0]);//
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100); //實踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令。
- display3();
- }
- }
- while(!key_set);//檢測按鍵松開
- }
- //加
- if(key_jia==0&&mode==1)
- {
- Delay_ms(5);
- if(key_jia==0&&mode==1&&set_shidu==1)//設置上限值
- {
- jiaohua_num++; //上限自加
- if(jiaohua_num==91)
- jiaohua_num=90;
- display4();//顯示
- }
- }
- //減
- if(key_jian==0&&mode==1)
- {
- Delay_ms(5);
- if(key_jian==0&&mode==1&&set_shidu==1)//設置下限
- {
- jiaohua_num--; //
- if(jiaohua_num<6)
- jiaohua_num=5;
- display4();//顯示
- }
- }
- //加值鍵,支持連按
- if(key_jia==0&&mode==3)
- {
- Delay_ms(7);
- if(key_jia==0&&set_time==1)//設置月
- {
- time[4]++;
- if(time[4]>12)
- time[4]=1;
- time1[4]=(time[4]/10)*16+time[4]%10;
- if(time1[4]>0x12)
- time1[4]=0x01;
- Writeds1302 (WRITE_MONTH,time1[4]);
- }
- if(key_jia==0&&set_time==2)//設置日
- {
- time[3]++;
- if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)
- {
- if(time[3]>31)
- time[3]=1;
- }
- else
- {
- if(time[4]==2)
- {
- if(time[6]%4==0)
- {
- if(time[3]>28)
- time[3]=1;
- }
- else
- {
- if(time[3]>29)
- time[3]=1;
- }
- }
- else
- {
- if(time[3]>30)
- time[3]=1;
- }
- }
- time1[3]=(time[3]/10)*16+time[3]%10;
- if(time1[4]==0x01||time1[4]==0x03||time1[4]==0x05||time1[4]==0x07||time1[4]==0x08||time1[4]==0x10||time1[4]==0x12)
- {
- if(time1[3]>0x31)
- time1[3]=0x01;
- }
- else
- {
- if(time1[4]==0x02)
- {
- if(time1[6]%4==0)
- {
- if(time1[3]>0x28)
- time1[3]=0x01;
- }
- else
- {
- if(time1[3]>0x29)
- time1[3]=0x01;
- }
- }
- else
- {
- if(time1[3]>0x30)
- time1[3]=0x01;
- }
- }
- Writeds1302 (WRITE_DAY,time1[3]);
- }
- if(key_jia==0&&set_time==3)//設置時
- {
- time[2]++;
- if(time[2]>23)
- time[2]=0;
- time1[2]=(time[2]/10)*16+time[2]%10;
- if(time1[2]>0x23)
- time1[2]=0x00;
- Writeds1302 (WRITE_HOUR,time1[2]);
- }
- if(key_jia==0&&set_time==4)//設置分
- {
- time[1]++;
- if(time[1]>59)
- time[1]=0;
- time1[1]=(time[1]/10)*16+time[1]%10;
- if(time1[1]>0x59)
- time1[1]=0x00;
- Writeds1302 (WRITE_MINUTE,time1[1]);
- }
- if(key_jia==0&&set_time==5)//設置秒
- {
- time[0]++;
- if(time[0]>59)
- time[0]=0;
- time1[0]=(time[0]/10)*16+time[0]%10;
- if(time1[0]>0x59)
- time1[0]=0x00;
- Writeds1302 (WRITE_SECOND,time1[0]);
- }
- if(key_jia==0&&set_time==6)
- {
- naozhong1[2]++;
- if(naozhong1[2]>23)
- naozhong1[2]=00;
- }
- if(key_jia==0&&set_time==7)
- {
- naozhong1[1]++;
- if(naozhong1[1]>59)
- naozhong1[1]=00;
- }
- if(key_jia==0&&set_time==8)
- {
- naozhong1[0]++;
- if(naozhong1[0]>59)
- naozhong1[0]=00;
- }
- }
- //減值鍵,支持連按
- if(key_jian==0&&mode==3)
- {
- Delay_ms(7);
- if(key_jian==0&&set_time==1)//設置月
- {
- time[4]--;
- if(time[4]<1)
- time[4]=12;
- time1[4]=(time[4]/10)*16+time[4]%10;
- if(time1[4]<0x01)
- time1[4]=0x12;
- Writeds1302 (WRITE_MONTH,time1[4]);
- }
- if(key_jian==0&&set_time==2)//設置日
- {
- time[3]--;
- if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)
- {
- if(time[3]<1)
- time[3]=31;
- }
- else
- {
- if(time[4]==2)
- {
- if(time[6]%4==0)
- {
- if(time[3]<1)
- time[3]=28;
- }
- else
- {
- if(time[3]<1)
- time[3]=29;
- }
- }
- else
- {
- if(time[3]<1)
- time[3]=30;
- }
- }
- time1[3]=(time[3]/10)*16+time[3]%10;
- if(time1[4]==0x01||time1[4]==0x03||time1[4]==0x05||time1[4]==0x07||time1[4]==0x08||time1[4]==0x10||time1[4]==0x12)
- {
- if(time1[3]<0x01)
- time1[3]=0x31;
- }
- else
- {
- if(time1[4]==0x02)
- {
- if(time1[6]%4==0)
- {
- if(time1[3]<0x01)
- time1[3]=0x28;
- }
- else
- {
- if(time1[3]<0x01)
- time1[3]=0x29;
- }
- }
- else
- {
- if(time1[3]<0x01)
- time1[3]=0x30;
- }
- }
- Writeds1302 (WRITE_DAY,time1[3]);
- }
- if(key_jian==0&&set_time==3)//設置時
- {
- time[2]--;
- if(time[2]<00)
- time[2]=23;
- time1[2]=(time[2]/10)*16+time[2]%10;
- if(time1[2]<0x00)
- time1[2]=0x23;
- Writeds1302 (WRITE_HOUR,time1[2]);
- }
- if(key_jian==0&&set_time==4)//設置分
- {
- time[1]--;
- if(time[1]<00)
- time[1]=59;
- time1[1]=(time[1]/10)*16+time[1]%10;
- if(time1[1]<0x00)
- time1[1]=0x59;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址:
基于單片機的自動澆花設計.docx
(769.9 KB, 下載次數(shù): 350)
2018-5-13 16:48 上傳
點擊文件名下載附件
|