找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 33982|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)的自動(dòng)澆花器設(shè)計(jì)論文完整版

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:328949 發(fā)表于 2018-5-13 16:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

基于單片機(jī)的自動(dòng)澆花器設(shè)計(jì)

摘 要隨著科技的發(fā)展,人們對(duì)生活水平的要求逐漸提高,智能家居也慢慢潛入人們的生活,自動(dòng)化的興起也是對(duì)科技發(fā)展的肯定,F(xiàn)在很多人都住上了高層,為了凈化室內(nèi)空氣便種植盆栽,一方面是為了凈化空氣,另一方面是為了陶冶情操。然而很多人想精心照顧他們的花花草草,但是又不懂方法與技巧甚至有的人沒時(shí)間去照料,所以這就需要設(shè)計(jì)一款自動(dòng)澆花器。

本設(shè)計(jì)用AT89C51單片機(jī)作為控制中心,YL-69作土壤濕度傳感模塊,光敏電阻作為光照量傳感模塊,LCD1602作為顯示數(shù)據(jù)的模塊,按鍵用來設(shè)定數(shù)值。本系統(tǒng)有三種模式的功能,一是可以通過YL-69濕度傳感器進(jìn)行土壤濕度的采集,利用單片機(jī)AT89C51對(duì)信息進(jìn)行處理,輸出控制信號(hào),控制信號(hào)通過控制繼電器控制水泵電源是否通斷,從而完成自動(dòng)澆水。二是利用單片機(jī)精確控制,在設(shè)定時(shí)間內(nèi)實(shí)施澆水。三是在系統(tǒng)中加入一個(gè)光敏電阻,當(dāng)檢測(cè)到有光照的時(shí)候即白天的時(shí)候系統(tǒng)檢測(cè)到土壤濕度低于設(shè)定值時(shí)才運(yùn)行完成澆水,當(dāng)檢測(cè)到無光照即黑夜時(shí)即使檢測(cè)到土壤濕度低于設(shè)定值系統(tǒng)也不會(huì)運(yùn)行。


目 錄

1 緒論

1.1 研究背景

1.3主要設(shè)計(jì)內(nèi)容

2 系統(tǒng)設(shè)計(jì)

2.1 方案論證

2.1.1 總體方案設(shè)計(jì)

2.1.2 土壤濕度測(cè)量方案

2.2 硬件的選擇

2.3 系統(tǒng)結(jié)構(gòu)

3 系統(tǒng)硬件設(shè)計(jì)

3.1 AT89C51主要性能參數(shù)

3.2 時(shí)鐘電路

3.3 AT89C51的復(fù)位電路

3.4 YL-69土壤濕度傳感器

3.5 SRS-05VDC-SL繼電器

3.6 按鍵電路

3.7 DS1302時(shí)鐘芯片

4 系統(tǒng)軟件設(shè)計(jì)

4.1 系統(tǒng)流程圖

4.2 土壤濕度檢測(cè)程序

4.3 按鍵程序

4.4 LCD1602顯示程序

5 仿真設(shè)計(jì)與硬件調(diào)試

5.1 硬件調(diào)試

結(jié)論

參考文獻(xiàn)

致謝

附錄

附錄A:主程序


1緒論
1.1研究背景
如今,對(duì)于澆灌系統(tǒng)而言,微噴技術(shù)被國(guó)際上許多國(guó)家廣泛采用,該項(xiàng)技術(shù)的工作原理為借助低壓管道讓水快速的射出,并在空氣里分散為細(xì)小的水珠,從而讓這些水霧覆蓋于種植物、農(nóng)作物及周圍的土地表面,使得農(nóng)作物不再缺乏水分。此系統(tǒng)主要應(yīng)用于植物種植密度大,植物柔軟細(xì)嫩的場(chǎng)合。
隨著社會(huì)生產(chǎn)力的發(fā)展,人們的生活水平在不斷提高,更加追求生活環(huán)境健康與舒適,如今千家萬戶都會(huì)在自己的余暇功夫里自己栽培花草,栽培花草不僅可以凈化空氣,還可以陶冶情操。植物的生長(zhǎng)需要定期澆水,有些人可能會(huì)因?yàn)槊Χ浗o植物澆水,或者沒有一定的澆花經(jīng)驗(yàn)甚至?xí)䦟?dǎo)致植物死亡等,這都是不利于植物生長(zhǎng)的。
1.2 國(guó)內(nèi)外的發(fā)展現(xiàn)狀
1.2.1國(guó)外研究現(xiàn)狀
在西方的國(guó)家,智能家用電器的技術(shù)已經(jīng)十分先進(jìn),而站在國(guó)際的層面來看,由于我國(guó)的制造及設(shè)計(jì)產(chǎn)業(yè)在國(guó)際上的關(guān)鍵地位,使得中國(guó)已然發(fā)展成國(guó)際上智能家電的主要市場(chǎng)。如今,智能花盆在全球已經(jīng)受到廣大客戶的青睞,雖然它們的控制及工作原理有著較大的差異,可它們?cè)O(shè)計(jì)的目的都是為了服務(wù)于人類平時(shí)生活中的養(yǎng)花種草等方面。
在英國(guó)有這樣的一類智能花盆,它的設(shè)計(jì)者是瑞貝克皮特森。它能夠隨時(shí)觀察記錄盆栽的生長(zhǎng)情況。“Plantroid”是一個(gè)智能花盆機(jī)器人,它是由東京農(nóng)工大學(xué)副教授水內(nèi)郁夫發(fā)明創(chuàng)造的,“Plantroid”與其它的花盆不同的是,除了有六個(gè)晶硅太陽能以外,在他的底部還裝有四個(gè)可以滾動(dòng)的滑輪,這使得其能夠在地面隨處移動(dòng)。其內(nèi)部裝有光線傳感器,當(dāng)它檢測(cè)到盆栽處于背陰處時(shí),或者曬不到陽光的地方,機(jī)器人會(huì)自動(dòng)下達(dá)指令讓滑輪走到有陽光的地方,因而方便了人們的植物培養(yǎng),并且使得植物充分的享有光照進(jìn)行光合作用,加速植物的健康生長(zhǎng)。
在不久前,英國(guó)學(xué)生娜塔莉・金也創(chuàng)造出了一款智能的花盆機(jī)器人,此機(jī)器人的配套設(shè)施較為齊全,在花盆下面裝有檢測(cè)濕度與溫度的傳感裝置,花盆表面設(shè)有光線傳感器。這些裝置的安裝能夠讓植物在處于不適宜的環(huán)境下自動(dòng)報(bào)警,比如在濕度過大或溫度過強(qiáng)時(shí),花盆都會(huì)自動(dòng)閃光提示,讓主人能夠及時(shí)采取相關(guān)措施。
1.2.2 國(guó)內(nèi)研究現(xiàn)狀
對(duì)于中國(guó)而言,已然出現(xiàn)了許多供植物澆水的器具,然而這些都是傳統(tǒng)的澆水設(shè)施,在智能機(jī)械方面的研究成果較少。目前,在中國(guó)市場(chǎng)上普遍存在大量的自動(dòng)澆水裝置,可是這些澆水的器材都是傳統(tǒng)的定量澆水,很難根據(jù)植物的自身需要進(jìn)行適當(dāng)適量的澆水施肥,這也導(dǎo)致了大面積的水資源浪費(fèi),不僅沒有使得植物得到很好的生長(zhǎng),相反卻讓植物的成長(zhǎng)起到了副作用。
由于全球技術(shù)的高速傳播,如今的中國(guó)也有許多關(guān)于智能花盆方面的研究。楊守建等人于2011年,開始了相關(guān)方面的工作,他們研究的主要任務(wù)是利用裝置檢測(cè)土地的濕度及溫度,參照檢測(cè)裝置反饋的數(shù)據(jù)對(duì)植物進(jìn)行適當(dāng)適量的澆水,整個(gè)科研的經(jīng)費(fèi)花費(fèi)較少,且后期維護(hù)的花銷也不高。
與此同時(shí),王薇等學(xué)者在2011年也開始了相關(guān)智能花盆上的研究,此種智能花盆由多個(gè)部分組成,其中包括:放大電路、比較電路、驅(qū)動(dòng)電路、繼電器、電磁閥等等。工作原理也是能夠自主檢測(cè)植物土壤周圍的濕度,從而根據(jù)實(shí)際情況進(jìn)行澆水。 學(xué)者張兆朋在此方面也有著自己的發(fā)面,他一人設(shè)計(jì)創(chuàng)造了小型的職能家庭澆水儀器,同時(shí)更夠依據(jù)植物的不同種類,運(yùn)行不同的控制程序。在工作原理上也是參照上述幾種智能儀器,實(shí)現(xiàn)自主職能澆水。學(xué)者趙麗也發(fā)明了一類高效智能的植物澆水裝置,在儀器底部裝有傳感裝置,用以檢測(cè)相關(guān)環(huán)境的溫度、濕度,在借助單片機(jī)展開數(shù)據(jù)分析,下達(dá)相關(guān)的執(zhí)行指令,對(duì)澆水器進(jìn)行控制,完成相關(guān)的澆水任務(wù)。
隨著科技的發(fā)展,家用電器的智能化也得到了廣大國(guó)民的青睞,所以,對(duì)于智能花盆的相關(guān)研究還是十分有必要的。
1.3主要設(shè)計(jì)內(nèi)容
此論文是立足于單片機(jī)的自動(dòng)澆花器設(shè)計(jì):
  • 完成整體的規(guī)劃和結(jié)構(gòu)設(shè)計(jì)
  • 圍繞著單片機(jī)展開相關(guān)工作,并對(duì)裝置原件展開處理,讓它們有機(jī)的搭配起來。主要的硬件部分涵蓋有:土壤濕度檢測(cè)電路、光亮度檢測(cè)電路、電源電路、按鍵設(shè)置電路、LCD1602顯示電路繼電器控制水泵電路。以及系統(tǒng)的軟件設(shè)計(jì)及編寫,使其與硬件模塊互相配合。大體涵蓋有以下幾類程序:主要程序、濕度檢測(cè)程序、信息匯總程序、按鍵觸碰程序、運(yùn)行子程序等。
  • 完成硬件模塊和軟件模塊的調(diào)試。

2 系統(tǒng)設(shè)計(jì)
2.1方案論證
2.1.1 總體方案設(shè)計(jì)
該方案的系統(tǒng)體系主要由兩部分共同搭建,分別是:硬件方面、軟件方面。硬件模塊方面大體包括了土壤濕度檢測(cè)模塊、光亮度檢測(cè)模塊、按鍵設(shè)置模塊、LCD1602顯示模塊與繼電器控制水泵電路模塊,設(shè)計(jì)了一種智能澆灌的系統(tǒng)。這個(gè)自動(dòng)澆花系統(tǒng)可以根據(jù)土壤干濕程度以及光照的強(qiáng)度,對(duì)植物的澆水進(jìn)行自動(dòng)控制。單片機(jī)是此方案的控制中心,通過環(huán)境濕度檢測(cè)儀展開相關(guān)信息的傳遞,繼而使用智能系統(tǒng)規(guī)定其濕度的最大及最小值,然后再借助單片機(jī)將傳輸來的相關(guān)信息展開分析與整理,從而評(píng)估外界環(huán)境的濕度。一旦反饋的濕度值明顯小于規(guī)定的濕度最小值,那么單片機(jī)將下達(dá)指令至控制水泵,讓其進(jìn)行澆水行為,當(dāng)濕度到達(dá)設(shè)定的最大值時(shí)停止?jié)菜@就是整個(gè)澆花的工作原理;蛟跓o人的情況下,根據(jù)自己的澆灌經(jīng)驗(yàn)通過設(shè)定時(shí)間來進(jìn)行澆灌,當(dāng)?shù)竭_(dá)設(shè)定時(shí)間時(shí)單片機(jī)控制水泵澆水,超過一分鐘后水泵停止?jié)菜。本設(shè)計(jì)可以完成以下功能:
1.借助濕度傳感器采集土壤濕度的相關(guān)信息;
2.顯示測(cè)量的數(shù)據(jù)
3.對(duì)最適宜植物成長(zhǎng)的土壤進(jìn)行分析,并規(guī)定其濕度的最大值和最小值;
4.使用光敏電阻測(cè)量光照量
5.不同模式的選擇。
2.1.2 土壤濕度測(cè)量方案
檢測(cè)土壤濕度的相關(guān)活動(dòng)在眾多的部門中都得到了廣泛的應(yīng)用,其中主要包括:科研單位、工業(yè)制造、氣象監(jiān)測(cè)等,然而在一般的情況中,對(duì)于土壤水分的檢測(cè)并不是唯一的數(shù)據(jù)。因?yàn)橥寥罎穸葧?huì)受到大氣壓強(qiáng)、溫度或人類甚至無法察覺的因素影響。
如今,對(duì)于土壤濕度的測(cè)量我們通常有2種方法,分別是干濕球與電子濕度傳感器。下面是對(duì)兩種方法展開的對(duì)比研究,旨在選擇最佳的檢測(cè)方法。對(duì)于干濕球方法而言,它屬于非直接的檢測(cè)方法,借助對(duì)干球與濕球的兩種測(cè)量從而了解其濕度。所以,如果在溫度較高或者環(huán)境較為惡劣的情況下,我們會(huì)優(yōu)先選擇干濕球法。
隨著科技的不斷進(jìn)步,電子濕度檢測(cè)在這些年得到了廣泛的推崇,由于其測(cè)量數(shù)值較為精確,一般可達(dá)2%一3%RH,同時(shí)在運(yùn)行的階段對(duì)外界的影響有著較強(qiáng)的抗干擾能力。但使用的時(shí)間一長(zhǎng),傳感器的精度就會(huì)有所下降,因此電子式傳感器比較適用于工作在常溫、穩(wěn)定的環(huán)境中。
2.2硬件的選擇
  • 土壤濕度傳感器的選擇:
選取yl-69土壤水分傳感器作為土壤傳感系統(tǒng)模塊,靈敏度可調(diào),數(shù)字輸出簡(jiǎn)單,模擬輸出準(zhǔn)確,比較器LM393,工作穩(wěn)定可靠。
(2)主控芯片的選擇:
方案一:使用STC89C52系列的單片機(jī),特點(diǎn)是驅(qū)動(dòng)能力強(qiáng),運(yùn)轉(zhuǎn)比較穩(wěn)定,與AT89C51系列相比擬,性價(jià)比較高,抗干擾能力強(qiáng)。
方案二:AT89C51單片機(jī)由Atmel公司生產(chǎn),主要的特點(diǎn)是低電壓、高性能,同時(shí)價(jià)格也比較便宜,最主要的是AT89C51單片機(jī)和MCS-51系列有很好的兼容性。但缺點(diǎn)是定時(shí)器、ROM較少。
AT89C51單片機(jī)是我們學(xué)習(xí)的主要單片機(jī),它的配置已經(jīng)完全可以滿足系統(tǒng)的需求,所以選擇方案二AT89C51單片機(jī)。
(3)A/D轉(zhuǎn)換芯片選擇:
第一種方案:通過ADC0832芯片轉(zhuǎn)換,ADC0832轉(zhuǎn)換芯片為雙通道8位分辨率的轉(zhuǎn)換芯片。其最高分辯可達(dá)256級(jí)。由于其轉(zhuǎn)換速度快、便宜、體積較小、穩(wěn)定性高等特點(diǎn),因此深受單片機(jī)愛好者喜愛,普及率極高。
第二種方案:ADC0809轉(zhuǎn)換芯片ADC0809芯片的使用,是一種并行轉(zhuǎn)換芯片,相比較ADC0832要快得多,但其引腳電路比較復(fù)雜,并且價(jià)錢是昂貴的。
綜合考慮選用ADC0832可以滿足系統(tǒng)需求,故選用方案一。
(4)繼電器選擇:
在早期設(shè)計(jì)階段,儀器的運(yùn)行需要利用小電流實(shí)施對(duì)大電流的操控,因此我們選擇了繼電器來操控電磁閥。工作電壓在5V左右,并且成本低。綜上所述,本次的系統(tǒng)設(shè)計(jì)中,選用的是松樂SRS-05VDC-SL型號(hào)的繼電器。
(5)顯示器的選擇:
因系統(tǒng)需要必須用到一個(gè)顯示系統(tǒng)模式功能和檢測(cè)數(shù)據(jù)的顯示器。LCD1602可以用來顯示字母、阿拉伯?dāng)?shù)字和符號(hào),按照系統(tǒng)的需求,使用可以同時(shí)顯示出16*02即32個(gè)字符的16腳(帶背光)模塊。
(6)電源選擇:
系統(tǒng)選用5V電源適配器,考慮到水泵的運(yùn)行可能會(huì)導(dǎo)致屏幕顯示不清,所以給水泵配備3節(jié)干電池。
2.3 系統(tǒng)結(jié)構(gòu)
此系統(tǒng)主要由六個(gè)電路組建而成,分別為:土壤濕度檢測(cè)電路、光亮度檢測(cè)電路、電源電路、按鍵設(shè)置電路、LCD1602顯示電路與繼電器控制水泵電路。系統(tǒng)原理圖如圖1所示。

圖1 系統(tǒng)原理圖
3系統(tǒng)硬件設(shè)計(jì)
3.1AT89C51單片機(jī)簡(jiǎn)介及設(shè)計(jì)
3.1.1 AT89C51主要性能參數(shù)
AT89C2051是一款極為精簡(jiǎn)的51單片機(jī),將P0口和P2口進(jìn)行了精簡(jiǎn),引腳也僅有20個(gè),然而其內(nèi)部卻安裝了十分實(shí)用的模擬比較器,對(duì)于開發(fā)研究精簡(jiǎn)的51系統(tǒng)而言,其是最好不過的選擇了,因?yàn)樵诖蠖鄶?shù)的情況下,我們開發(fā)根本用不到所有的32個(gè)I/O口,所以選擇AT89C2051較為適宜,不僅芯片體積更小,同時(shí)其工作電壓最低為2.7V,所以用來開發(fā)時(shí)能夠用5號(hào)電池供電的便攜式產(chǎn)品。其引腳圖如圖2所示。
圖2 AT89C51引腳圖
3.1.2 時(shí)鐘電路
單片機(jī)AT89C51的內(nèi)部包含了一個(gè)輸入端與一個(gè)輸出端,分別是以引腳XTAL1與XTAL2的放大器,使其達(dá)到搭建自激式振蕩電路的目的,因此需要在XTAL1及XTAL2引腳中裝設(shè)晶體振蕩器、陶瓷振蕩器,此電路的輸出能夠傳送到程序內(nèi)部的時(shí)序電路。對(duì)于單片機(jī)的時(shí)鐘電路,其重要性不言而喻,它相當(dāng)于人體的大腦,控制著單片機(jī)的運(yùn)行頻率。而連接單片機(jī)的主要形式通常包括以下兩種:外部時(shí)鐘形式、內(nèi)部時(shí)鐘形式。
之所以選用此方案的內(nèi)部時(shí)鐘的理由為:一個(gè)高增益放大器和相位平方芯片內(nèi)部外部跳線晶體,調(diào)諧電容時(shí)鐘電路生成的結(jié)構(gòu)形式,時(shí)鐘電路圖的系統(tǒng)如圖3所示。
            
圖3 時(shí)鐘電路
3.1.3 AT89C51的復(fù)位電路
51單片機(jī)高電平復(fù)位。就現(xiàn)如今使用比較多的AT89系列得單片機(jī)來講,在復(fù)位腳加上2個(gè)高電平機(jī)器周期(即24個(gè)振蕩周期)就可以使單片機(jī)進(jìn)行復(fù)位。復(fù)位后,單片機(jī)的主要特征是各IO口顯現(xiàn)為高電平,程序計(jì)數(shù)器開始從零運(yùn)行程序。
本系統(tǒng)選用的是手動(dòng)按鍵復(fù)位的模式,采用的措施是接一個(gè)按鈕在復(fù)位RST端和正電源Vcc之間。當(dāng)按鈕被按下時(shí),Vcc的+5V電平就會(huì)被直接加到RST復(fù)位端。由于按鍵閉合的時(shí)間非常短,而我們總可以使按鈕保持最起碼十毫秒的接通時(shí)間,因此,完全可以符合對(duì)復(fù)位的時(shí)段要求。圖4為按鍵電路圖

圖4 按鍵電路圖

3.2YL-69土壤濕度傳感器
該系統(tǒng)設(shè)計(jì)采用yl-69是一個(gè)相對(duì)簡(jiǎn)單的土壤水分傳感器,當(dāng)測(cè)試土壤水分變化時(shí),通過濕敏電容所處的空間內(nèi)介質(zhì)發(fā)生變化,這也導(dǎo)致了其電容數(shù)值產(chǎn)生改變,并且電容的數(shù)值和濕度值之間呈正比關(guān)系。YL-69表面經(jīng)過鍍鎳處理,可以很好的提高導(dǎo)電性,保護(hù)傳感器不易被腐蝕。借助電位器掌控有關(guān)的閥值,在探查到環(huán)境濕度在最小值以下,DO隨之產(chǎn)生高電平;相反,在探查到的環(huán)境溫度在最大值以上,DO隨之產(chǎn)生一個(gè)低電平。本次系統(tǒng)的電路設(shè)計(jì)為VCC外接一個(gè)5V電壓,GND外接數(shù)字地,DO"小板數(shù)字量輸出接口(0和1)”接到單片機(jī)。電路原理圖如圖5所示,k1是YL-69探頭。

圖5 YL-69與AD轉(zhuǎn)化電路

3.3SRS-05VDC-SL繼電器
繼電器(relay)能夠?qū)⒕性變化的輸入量輸出為階躍變化結(jié)果。這種特質(zhì)就可以被利用來起到控制的作用,當(dāng)輸入量達(dá)到了一定程度,就可以通過控制階躍變化的結(jié)果反過來影響整體電路,在整個(gè)電路中,繼電器只需要很小的電流,相當(dāng)于以弱電流來控制大電流的控制器,而且一定程度上繼電器還可以用來保護(hù)電路,防止電壓變化過大,損害電子元件。
當(dāng)前市場(chǎng)上的繼電器種類有很多,但是經(jīng)過一一對(duì)比,本系統(tǒng)選擇電磁繼電器作為整個(gè)電路的控制方式。其原理是通過電流變化來改變電磁效應(yīng)的強(qiáng)弱,從而將電信號(hào)轉(zhuǎn)化為磁性強(qiáng)度變化,最終通過接觸點(diǎn)來影響電流的通路還是斷開。
圖7中三級(jí)管的b基級(jí)處于低電位時(shí),三極管導(dǎo)通,則K1單刀雙擲開關(guān)向右邊偏離,電機(jī)M水泵通電,水泵開始運(yùn)行。


圖7 繼電器控制水泵

3.4按鍵電路
因本系統(tǒng)設(shè)計(jì)定時(shí)電路,需要用按鍵進(jìn)行設(shè)置,所以加入按鍵模塊按鍵:按鍵設(shè)計(jì)如圖8所示。S1是模式鍵、S2是設(shè)置鍵、S是調(diào)整加鍵、S4是調(diào)整減鍵。

圖8 按鍵電路
3.5光敏電阻及其控制電路
光敏電阻的特點(diǎn)在于能夠?qū)⒐鈱W(xué)物理信息轉(zhuǎn)化為電信號(hào),這種特質(zhì)也是其命名的來源,這種電阻也可以被簡(jiǎn)稱為光電阻,或者可以稱它為光導(dǎo)管。具體來說,這種電阻可以在不同運(yùn)動(dòng)狀態(tài)以及電子的光照強(qiáng)度下表現(xiàn)為不同的電阻值,所以用這種材料制成的電阻器也被稱為光電導(dǎo)探測(cè)器。當(dāng)照射光強(qiáng)緩慢增加時(shí),電阻值不斷減小,變化趨勢(shì)呈現(xiàn)為負(fù)相關(guān),反之亦然。本次系統(tǒng)設(shè)計(jì)將光敏電阻并聯(lián)在濕度傳感器的電路中。電路圖如圖9所示。

圖9 光敏電阻電路圖
3.6 DS1302時(shí)鐘芯片
DS1302是比日常中比較常用的一種時(shí)鐘芯片,它具有計(jì)時(shí)的功能。在本次系統(tǒng)中,因?yàn)橐由隙〞r(shí)功能,所以選擇在系統(tǒng)在加入DS1302芯片,它能夠?qū)θ掌、時(shí)間等信息作統(tǒng)計(jì),通過設(shè)置鍵來設(shè)定時(shí)間,也可以將時(shí)間顯示在顯示屏上。電路圖如圖10所示。
      
圖10 DS1302時(shí)鐘芯片電路圖
4 系統(tǒng)軟件設(shè)計(jì)
4.1 系統(tǒng)流程圖
系統(tǒng)軟件設(shè)計(jì)包括對(duì)土壤濕度檢測(cè)程序、對(duì)采集到的數(shù)據(jù)進(jìn)行處理的程序、設(shè)置濕度上下限的程序、按鍵程序、顯示程序等。主程序流程如圖14所示。

圖14 程序流程圖

4.2 土壤濕度檢測(cè)
土壤濕度傳感檢測(cè)模塊對(duì)土壤的濕度變化特別敏銳,日常用來檢測(cè)泥土的濕度。如果土壤濕度傳感器檢測(cè)到土壤濕度低于設(shè)定值時(shí),DO輸出高電平;當(dāng)土壤濕度傳感器檢測(cè)到土壤濕度高于設(shè)定值時(shí),D0輸出低電平。并且D0口能夠與單片機(jī)直接相連接,通過單片機(jī)來反應(yīng)高低電平,所以來檢測(cè)土壤濕度。
4.3 LCD1602顯示流程圖
液晶顯示器LCD1602是利用液晶的物理特性來實(shí)現(xiàn)顯示的,當(dāng)電路通電時(shí),LCD便可以顯示出來數(shù)字、圖像等。LCD1602液晶顯示流程圖如圖所示:


5 仿真設(shè)計(jì)與硬件調(diào)試

5.1 仿真軟件簡(jiǎn)介

proteus仿真軟件可以提供對(duì)單片機(jī)及外圍電路進(jìn)行仿真,它將電路仿真軟件、PCB設(shè)計(jì)軟件和虛擬模型仿真軟件三者合一,是目前唯一一款三合一平臺(tái)。它可以實(shí)現(xiàn)原理布圖、PCB自動(dòng)或人工布線、SPICE電路仿真,最后達(dá)到仿真效果,可以在運(yùn)行后看到輸入輸出的效果。此軟件提供現(xiàn)成元器件、測(cè)試儀器以圖形的方式表示,并可以直接從窗口圖形中調(diào)出,軟件中測(cè)試儀器的圖形與實(shí)物相似,而且可以儲(chǔ)存實(shí)驗(yàn)測(cè)試結(jié)果的數(shù)據(jù)、波形、工作狀態(tài)等,并可以打印輸出。

5.2  仿真流程

(1)打開Proteus軟件,會(huì)彈出如圖5-1所示的窗口,我們可以看到右邊的大區(qū)域是繪圖窗口,左面的小窗口是視圖小窗口,緊挨著下面分別是元器件列表、控制按鈕。

圖5-1 Proteus打開界面

(2)在界面視圖小窗口的下面有P L按鈕,點(diǎn)擊P按鈕,便可彈出一個(gè)搜素欄,在里面輸入需要的元器件名稱,就會(huì)在右邊的繪圖窗口中彈出,雙擊需要的元器件,選擇好之后關(guān)閉對(duì)話框,之后就可以在剛才的P L按鈕下面點(diǎn)擊最終需要的元器件,用鼠標(biāo)拖動(dòng)移到繪圖窗口即可單擊確定位置即可。如圖5-2所示:

圖5-2搜索添加元器件

(3)將元器件選擇好之后,系統(tǒng)自動(dòng)布線即可完成電路圖設(shè)計(jì),雙擊電路圖中的單片機(jī)會(huì)出現(xiàn)一個(gè)對(duì)話框,然后把.hex文件加載進(jìn)去,如圖5-3所示

圖5-3 加載.hex文件

  • 最后點(diǎn)擊窗口左下角的運(yùn)行開始鍵,就可以完成仿真過程,如圖5-4所示:

圖5-4 運(yùn)行結(jié)果

5.3  仿真結(jié)果

在參考電路的運(yùn)行圖之后,依照其樣式將實(shí)物制出,然后把程序燒錄至AT89C51單片機(jī)內(nèi)接通電源,將YL-69土壤濕度傳感器探頭放入土壤中,按鍵調(diào)至模式一,調(diào)至濕度值50%,屏幕顯示澆水開始,水泵運(yùn)行,澆灌到設(shè)定濕度值時(shí)停止?jié)菜。按鍵調(diào)至模式二,檢測(cè)到濕度值低于設(shè)定濕度,水泵開始澆水,將光敏電阻遮蓋住,屏幕顯示為夜間模式,停止?jié)菜。將其按鍵轉(zhuǎn)換到第三種模式,規(guī)定時(shí)間并運(yùn)行澆水,在系統(tǒng)檢測(cè)到需要澆水時(shí),水泵便會(huì)自動(dòng)出水,運(yùn)行60秒后便停止灌溉。之后,看實(shí)物能否穩(wěn)定操作。如果一切顯示都正常的話,就無需開展硬件的相關(guān)調(diào)整,如果運(yùn)行的不正常則要分析其原因并開展相關(guān)調(diào)試工作。


結(jié)論
基于單片機(jī)的自動(dòng)澆花器的設(shè)計(jì),利用單片機(jī)控制系統(tǒng)對(duì)各部分進(jìn)行控制,使其澆灌模塊是否進(jìn)行運(yùn)作。土壤濕度測(cè)量的模塊為YL-69,其主要的作用是將測(cè)量的濕度信息傳遞至單片機(jī)的系統(tǒng)內(nèi)部,同時(shí)利用單片機(jī)的處理將I/O傳遞至LCD屏幕上。LCD上顯示的值是土壤的含水值,這是判斷灌水是否的數(shù)值。程序的控制部分由自動(dòng)澆花部分組成,而系統(tǒng)的監(jiān)察部分則是由土壤濕度處理組成。整個(gè)系統(tǒng)的為智能化的自動(dòng)運(yùn)行,程序的控制主要是通過單片機(jī)分析數(shù)據(jù)并處理得來,在濕度監(jiān)測(cè)儀檢測(cè)到土壤濕度低于規(guī)定的數(shù)值后,那么單片機(jī)將下達(dá)指令至控制水泵,讓其進(jìn)行澆水行為,在經(jīng)過一段時(shí)間的澆水過后,當(dāng)濕度達(dá)到規(guī)定的最大值時(shí),儀器又將停止運(yùn)水,這就是整個(gè)澆花的工作原理。單片機(jī)還可以手動(dòng)輸入定時(shí)時(shí)間,時(shí)間會(huì)通過LCD1602進(jìn)行顯示,通過程序設(shè)計(jì)澆灌開始及澆灌結(jié)束時(shí)間。

致謝

時(shí)光即逝,大學(xué)四年將至,在這四年中我收獲頗豐,特別是在這幾個(gè)月的畢業(yè)設(shè)計(jì)期間,我特別感謝老師、同學(xué)、朋友、家人的精心指導(dǎo)與細(xì)心照料。感謝指導(dǎo)老師侯老師對(duì)我這次論題寫作方向的確定的幫助,您對(duì)我的論文寫作思路進(jìn)行啟發(fā),重點(diǎn)要點(diǎn)進(jìn)行指導(dǎo)說明,不厭其煩的幫助對(duì)論文進(jìn)行修改并提出些建議,從論文的選題、開題報(bào)告的撰寫、資料的查找,到結(jié)構(gòu)的完善,都給予悉心指導(dǎo),使我順利成文。授人以魚不如授人以漁,您嚴(yán)謹(jǐn)?shù)墓ぷ鲬B(tài)度、精心指導(dǎo)和無私的關(guān)懷都是我們學(xué)習(xí)的榜樣,在此對(duì)幫助和指導(dǎo)過我的老師們表示衷心的感謝。感謝我的同學(xué)和朋友們,在我寫論文的過程中給予了我很多有用的素材,還在論文的撰寫和排版等過程中提供熱情的幫助。最后要感謝家人對(duì)我的支持與鼓勵(lì),有了你們我才可以在不惑之年全身心投入到學(xué)習(xí)中,順利完成學(xué)業(yè)。

單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include<LCD1602.h>
  3. #include<ADC0832.h>
  4. #include<INTERRUPT.h>
  5. #include<math.h>
  6. #include<stdio.h>
  7. #include<EEPROM.h>
  8. #include<DS1302.h>
  9. sbit jidainqi  = P1^4;//自動(dòng)澆花開關(guān)
  10. sbit jidainqi_led  = P1^3;//自動(dòng)澆花開關(guān)指示燈
  11. sbit key_mode  = P3^2;//模式切換按鍵
  12. sbit key_set  = P3^3;//設(shè)置
  13. sbit key_jia  = P3^4;//加
  14. sbit key_jian  = P2^0;//減
  15. sbit guang  = P2^2;//光
  16. uchar temp_ad[6];
  17. double temp;
  18. uchar f=0;
  19. uchar wei;
  20. uchar mode;
  21. uchar set_time=0;
  22. uchar jiaohua_num;//澆花濕度值
  23. uchar set_shidu=0;//按鍵設(shè)置標(biāo)志位
  24. uchar T0_num;
  25. uchar ad;
  26. char naozhong1[]={0x00,0x00,0x00};
  27. /********************************************************
  28. 函數(shù)名稱:void delayms(uint ms)
  29. 函數(shù)作用:毫秒延時(shí)函數(shù)
  30. 參數(shù)說明:
  31. ********************************************************/
  32. void Delay_ms(uint ms)
  33. {
  34.               unsigned char i=100,j;
  35.               for(;ms;ms--)
  36.               {
  37.                             while(--i)
  38.                             {
  39.                                           j=10;
  40.                                           while(--j);
  41.                             }
  42.               }
  43. }
  44. void display(void)//選擇頁面
  45. {
  46.               lcd1602_write_character(0,1,"Watering System ");                 //初始化顯示的文字
  47.               lcd1602_write_character(0,2,"  Choice mode");                 //初始化顯示的文字                           
  48. }
  49. void display1(void)//白天自動(dòng)檢測(cè)澆花
  50. {  
  51.                             ad=ADC0832_read(0);
  52.                             Delay_ms(25);
  53.                             temp=(1-(double)ad/255)*100;
  54.                             if(temp<=jiaohua_num)
  55.                             {            
  56.                                           if(f==0)//清屏標(biāo)志位
  57.                                           {
  58.                                                         LCD_write_command(0x01);
  59.                                                         delay_n40us(100);
  60.                                                         f=1;
  61.                                           }            
  62.                                           lcd1602_write_character(0,1,"Flower is Dying!");
  63.                                           lcd1602_write_character(0,2," Auto Watering!");
  64.                                           jidainqi=0;jidainqi_led=0;//自動(dòng)澆花
  65.                             }
  66.                             else
  67.                             {            
  68. //                                          if(temp<1.5)
  69. //                                                        wei=sprintf(temp_ad,"%0.2f",0);
  70. //                                          else
  71.                                           wei=sprintf(temp_ad,"%0.2f",temp);
  72.                                           if(f==1)
  73.                                           {
  74.                                                         LCD_write_command(0x01);
  75.                                                         delay_n40us(100);
  76.                                                         f=0;
  77.                                           }                           
  78.                                           lcd1602_write_character(0,1,"  The mode one:");                 //初始化顯示的文字            
  79.                                           lcd1602_write_character(3,2,"         ");
  80.                                           lcd1602_write_character(9-wei,2,temp_ad);
  81.                                           lcd1602_write_character(9,2,"%RH");
  82.                                           jidainqi=1;jidainqi_led=1;//停止?jié)不?br />
  83.                             }            
  84. }
  85. void display4(void)//澆花濕度設(shè)置
  86. {  
  87.               T0_num++;
  88.               if(T0_num==254)
  89.                             T0_num=0;
  90.     lcd1602_write_character(0,1," Set water num");                 //初始化顯示的文字            
  91.               if(T0_num%2==0)              //偶數(shù)次顯示
  92.               {                           
  93.                             LCD_disp_char(9,2,ASCII[jiaohua_num/10]);                 //
  94.                             LCD_disp_char(10,2,ASCII[jiaohua_num%10]);                           
  95. //                Delay_ms(1);
  96.               }
  97.               else
  98.               {
  99.                             LCD_disp_char(9,2,ASCII[jiaohua_num/10]);               
  100.                             LCD_disp_char(10,2,ASCII[jiaohua_num%10]);
  101.             
  102.               }            
  103. }
  104. void display2(void)//自動(dòng)澆花加光照
  105. {  
  106.     //lcd1602_write_character(0,1,"mode two:");                 //初始化顯示的文字            
  107.                             ad=ADC0832_read(0);
  108.                             Delay_ms(25);
  109.                             temp=(1-(double)ad/255)*100;
  110.                             if(temp<=jiaohua_num&&guang==1)
  111.                             {            
  112.                                           if(f==0)//清屏標(biāo)志位
  113.                                           {
  114.                                                         LCD_write_command(0x01);
  115.                                                         delay_n40us(100);
  116.                                                         f=1;
  117.                                           }            
  118.                                           lcd1602_write_character(0,1,"Flower is Dying!");
  119.                                           lcd1602_write_character(0,2," Auto Watering!");
  120.                                           jidainqi=0;jidainqi_led=0;//自動(dòng)澆花
  121.                             }
  122.                             else
  123.                             {            
  124. //                                          if(temp<1.5)
  125. //                                                        wei=sprintf(temp_ad,"%0.2f",0);
  126. //                                          else
  127.                                                         wei=sprintf(temp_ad,"%0.2f",temp);
  128.                                           if(f==1)
  129.                                           {
  130.                                                         LCD_write_command(0x01);
  131.                                                         delay_n40us(100);
  132.                                                         f=0;
  133.                                           }
  134.                                                         if(guang==0)
  135.                                                                       {
  136.                                                                                       lcd1602_write_character(0,2,"Night");
  137.                                                                       }
  138.                                                                       else
  139.                                                                       {
  140.                                                                                                   lcd1602_write_character(0,2,"Day! ");
  141.                                                                       }
  142.                                           lcd1602_write_character(0,1,"  The mode two:");                               //初始化顯示的文字            
  143.                                           lcd1602_write_character(6,2,"      ");
  144.                                           lcd1602_write_character(12-wei,2,temp_ad);
  145.                                           lcd1602_write_character(12,2,"%RH");
  146.                                           jidainqi=1;jidainqi_led=1;//停止?jié)不?br />
  147.                             }            
  148. }
  149. void display3(void)//定時(shí)模式
  150. {  
  151.    Read_time();                                   //讀取時(shí)間
  152.               lcd1602_write_character(0,1,"The mode three:");                 //初始化顯示的文字            
  153.               LCD_disp_char(1,2,ASCII[time[4]/10]);//月               
  154.               LCD_disp_char(2,2,ASCII[time[4]%10]);               
  155.               LCD_disp_char(3,2,ASCII[11]);
  156.               LCD_disp_char(4,2,ASCII[time[3]/10]);//日
  157.               LCD_disp_char(5,2,ASCII[time[3]%10]);

  158.               LCD_disp_char(7,2,ASCII[time[2]/10]);//              時(shí)  
  159.               LCD_disp_char(8,2,ASCII[time[2]%10]);               
  160.               //LCD_disp_char(9,1,ASCII[11]);
  161.               lcd1602_write_character(9,2,":");
  162.               LCD_disp_char(10,2,ASCII[time[1]/10]);//分
  163.               LCD_disp_char(11,2,ASCII[time[1]%10]);
  164.               //LCD_disp_char(12,1,ASCII[11]);
  165.               lcd1602_write_character(12,2,":");
  166.               LCD_disp_char(13,2,ASCII[time[0]/10]);//秒
  167.               LCD_disp_char(14,2,ASCII[time[0]%10]);            
  168.             
  169.   if(time[2]==naozhong1[2]&&time[1]==naozhong1[1]&&time[0]==naozhong1[0])
  170.               {
  171.                               jidainqi=0;jidainqi_led=0;//自動(dòng)澆花            
  172.               }            
  173.   if(time[2]==naozhong1[2]&&(time[1]==(naozhong1[1])+1)&&time[0]==naozhong1[0])
  174.               {
  175.                               jidainqi=1;jidainqi_led=1;
  176.               }            
  177. }
  178. void display5(void)
  179. {
  180.               T0_num++;
  181.               if(T0_num==254)
  182.                             T0_num=0;

  183.               LCD_disp_char(3,1,ASCII[11]);
  184.               lcd1602_write_character(9,1,":");
  185.               lcd1602_write_character(12,1,":");
  186.               lcd1602_write_character(7,2,":");
  187.               lcd1602_write_character(10,2,":");            

  188.               if(T0_num%2==0)              //偶數(shù)次顯示
  189.               {                           
  190.                             LCD_disp_char(1,1,ASCII[time[4]/10]);//月               
  191.                             LCD_disp_char(2,1,ASCII[time[4]%10]);               
  192.                             LCD_disp_char(4,1,ASCII[time[3]/10]);//日
  193.                             LCD_disp_char(5,1,ASCII[time[3]%10]);
  194.             
  195.                             LCD_disp_char(7,1,ASCII[time[2]/10]);//              時(shí)  
  196.                             LCD_disp_char(8,1,ASCII[time[2]%10]);               
  197.                             LCD_disp_char(10,1,ASCII[time[1]/10]);//分
  198.                             LCD_disp_char(11,1,ASCII[time[1]%10]);
  199.                             LCD_disp_char(13,1,ASCII[time[0]/10]);//秒
  200.                             LCD_disp_char(14,1,ASCII[time[0]%10]);
  201.                            
  202.                             LCD_disp_char(5,2,ASCII[naozhong1[2]/10]);//              時(shí)  
  203.                             LCD_disp_char(6,2,ASCII[naozhong1[2]%10]);               
  204.                             LCD_disp_char(8,2,ASCII[naozhong1[1]/10]);//分
  205.                             LCD_disp_char(9,2,ASCII[naozhong1[1]%10]);
  206.                             LCD_disp_char(11,2,ASCII[naozhong1[0]/10]);//秒
  207.                             LCD_disp_char(12,2,ASCII[naozhong1[0]%10]);
  208.                             Delay_ms(1);
  209.               }
  210.               else                                          //奇數(shù)次時(shí)候設(shè)置那個(gè)量的時(shí)候那個(gè)量不顯示,以達(dá)到閃爍的效果
  211.               {
  212.                             if(set_time==1)
  213.                             {
  214.                                           LCD_disp_char(1,1,ASCII[13]);               
  215.                                           LCD_disp_char(2,1,ASCII[13]);
  216.                             }
  217.                             else
  218.                             {
  219.                                           LCD_disp_char(1,1,ASCII[time[4]/10]);
  220.                                           LCD_disp_char(2,1,ASCII[time[4]%10]);
  221.                             }
  222.                             if(set_time==2)
  223.                             {
  224.                                           LCD_disp_char(4,1,ASCII[13]);            
  225.                                           LCD_disp_char(5,1,ASCII[13]);
  226.                             }
  227.                             else
  228.                             {
  229.                                           LCD_disp_char(4,1,ASCII[time[3]/10]);
  230.                                           LCD_disp_char(5,1,ASCII[time[3]%10]);
  231.                             }            
  232.                             if(set_time==3)
  233.                             {
  234.                                           LCD_disp_char(7,1,ASCII[13]);
  235.                                           LCD_disp_char(8,1,ASCII[13]);
  236.                             }
  237.                             else
  238.                             {
  239.                                           LCD_disp_char(7,1,ASCII[time[2]/10]);
  240.                                           LCD_disp_char(8,1,ASCII[time[2]%10]);
  241.                             }
  242.                             if(set_time==4)
  243.                             {
  244.                                           LCD_disp_char(10,1,ASCII[13]);
  245.                                           LCD_disp_char(11,1,ASCII[13]);
  246.                             }
  247.                             else
  248.                             {
  249.                                           LCD_disp_char(10,1,ASCII[time[1]/10]);
  250.                                           LCD_disp_char(11,1,ASCII[time[1]%10]);
  251.                             }
  252.                             if(set_time==5)
  253.                             {
  254.                                           LCD_disp_char(13,1,ASCII[13]);
  255.                                           LCD_disp_char(14,1,ASCII[13]);
  256.                             }
  257.                             else
  258.                             {
  259.                                           LCD_disp_char(13,1,ASCII[time[0]/10]);
  260.                                           LCD_disp_char(14,1,ASCII[time[0]%10]);
  261.                             }
  262.                             if(set_time==6)
  263.                             {
  264.                                           LCD_disp_char(5,2,ASCII[13]);
  265.                                           LCD_disp_char(6,2,ASCII[13]);
  266.                             }
  267.                             else
  268.                             {
  269.                                           LCD_disp_char(5,2,ASCII[naozhong1[2]/10]);
  270.                                           LCD_disp_char(6,2,ASCII[naozhong1[2]%10]);
  271.                             }
  272.                             if(set_time==7)
  273.                             {
  274.                                           LCD_disp_char(8,2,ASCII[13]);
  275.                                           LCD_disp_char(9,2,ASCII[13]);
  276.                             }
  277.                             else
  278.                             {
  279.                                           LCD_disp_char(8,2,ASCII[naozhong1[1]/10]);
  280.                                           LCD_disp_char(9,2,ASCII[naozhong1[1]%10]);
  281.                             }                           
  282.                             if(set_time==8)
  283.                             {
  284.                                           LCD_disp_char(11,2,ASCII[13]);
  285.                                           LCD_disp_char(12,2,ASCII[13]);
  286.                             }
  287.                             else
  288.                             {
  289.                                           LCD_disp_char(11,2,ASCII[naozhong1[0]/10]);
  290.                                           LCD_disp_char(12,2,ASCII[naozhong1[0]%10]);
  291.                             }            

  292.               }
  293. }
  294. /********************************************************
  295. 函數(shù)名稱:void scan(void)
  296. 函數(shù)作用:按鍵檢測(cè)函數(shù)
  297. 參數(shù)說明:
  298. ********************************************************/
  299. void scan(void)
  300. {            
  301.               //模式按鍵
  302.               if(key_mode==0)
  303.               {
  304.                             Delay_ms(7);
  305.                             if(key_mode==0)
  306.                             {                           
  307.       jidainqi=1;jidainqi_led=1;//澆花                                         
  308.                                           LCD_write_command(0x01);//清除屏幕顯示
  309.                                           delay_n40us(100);                            //實(shí)踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令。                                                      
  310.                                           mode++;set_shidu=0;set_time=0;            
  311.                                           jidainqi=1;jidainqi_led=1;//停止?jié)不?br />
  312.                                           if(mode==4)
  313.                                           {
  314.                                                         mode=0;
  315.                                                         EEPROM_delete(0x2202);                                                        //擦除扇區(qū)
  316.                                                         EEPROM_write(0x2202,naozhong1[2]);//            
  317.                                                         EEPROM_delete(0x2402);                                                        //擦除扇區(qū)
  318.                                                         EEPROM_write(0x2402,naozhong1[1]);//                           
  319.                                                         EEPROM_delete(0x2602);                                                        //擦除扇區(qū)
  320.                                                         EEPROM_write(0x2602,naozhong1[0]);//                                                                                   
  321.                                             display();
  322.                                           }
  323.                                           if(mode==2)
  324.                                           {
  325.                                                         EEPROM_delete(0x2002);                                                        //擦除扇區(qū)
  326.                                                         EEPROM_write(0x2002,jiaohua_num);//            
  327.                                           }                                         
  328.                             }
  329.                             while(!key_mode);//檢測(cè)按鍵松開
  330.               }
  331.               //設(shè)置鍵,不支持連按
  332.               if(key_set==0)
  333.               {
  334.                             Delay_ms(7);
  335.                             if(key_set==0&&mode==1)
  336.                             {                                         
  337.                                           LCD_write_command(0x01);//清除屏幕顯示
  338.                                           delay_n40us(100);                            //實(shí)踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令。                                         
  339.       set_shidu++;
  340.                                           jidainqi=1;jidainqi_led=1;//停止?jié)不?br />
  341.       if(set_shidu==2)            
  342.       {
  343.                                                         set_shidu=0;
  344.                                                         EEPROM_delete(0x2002);                                                        //擦除扇區(qū)
  345.                                                         EEPROM_write(0x2002,jiaohua_num);//                                                      
  346.                                                         display1();
  347.                                           }                                                      
  348.                             }
  349.                             if(key_set==0&&mode==3)
  350.                             {                           
  351.       set_time++;
  352.       if(set_time==1)            
  353.                                           {
  354.                                                         LCD_write_command(0x01);//清除屏幕顯示
  355.                                              delay_n40us(100);                            //實(shí)踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令?
  356.                                           }                                                      
  357.       if(set_time>8)            
  358.       {
  359.                                                         set_time=0;
  360.                                                                       EEPROM_delete(0x2202);                                                        //擦除扇區(qū)
  361.                                                                       EEPROM_write(0x2202,naozhong1[2]);//            
  362.                                                                       EEPROM_delete(0x2402);                                                        //擦除扇區(qū)
  363.                                                                       EEPROM_write(0x2402,naozhong1[1]);//                           
  364.                                                                       EEPROM_delete(0x2602);                                                        //擦除扇區(qū)
  365.                                                                       EEPROM_write(0x2602,naozhong1[0]);//                                                                     
  366.                                                         LCD_write_command(0x01);//清除屏幕顯示
  367.                                              delay_n40us(100);                            //實(shí)踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令。            
  368.                                              display3();
  369.                                           }                                                      
  370.                             }                           
  371.                             while(!key_set);//檢測(cè)按鍵松開
  372.               }            
  373.               //加
  374.               if(key_jia==0&&mode==1)
  375.               {
  376.                             Delay_ms(5);
  377.                             if(key_jia==0&&mode==1&&set_shidu==1)//設(shè)置上限值
  378.                             {
  379.                                           jiaohua_num++;                 //上限自加
  380.                                           if(jiaohua_num==91)
  381.                                                         jiaohua_num=90;                                                                                   
  382.                                           display4();//顯示
  383.                             }            
  384.               }
  385.               //減
  386.               if(key_jian==0&&mode==1)
  387.               {
  388.                             Delay_ms(5);
  389.                             if(key_jian==0&&mode==1&&set_shidu==1)//設(shè)置下限
  390.                             {
  391.                                           jiaohua_num--;                 //
  392.                                           if(jiaohua_num<6)
  393.                                                         jiaohua_num=5;                                                                                   
  394.                                           display4();//顯示
  395.                             }            
  396.               }
  397.               //加值鍵,支持連按
  398.               if(key_jia==0&&mode==3)
  399.               {
  400.                             Delay_ms(7);
  401.                             if(key_jia==0&&set_time==1)//設(shè)置月
  402.                             {
  403.                                           time[4]++;
  404.                                           if(time[4]>12)
  405.                                                         time[4]=1;
  406.                                           time1[4]=(time[4]/10)*16+time[4]%10;
  407.                                           if(time1[4]>0x12)
  408.                                                         time1[4]=0x01;
  409.                                           Writeds1302 (WRITE_MONTH,time1[4]);                                                      
  410.                             }
  411.                             if(key_jia==0&&set_time==2)//設(shè)置日
  412.                             {
  413.                                           time[3]++;
  414.                                           if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)
  415.                                           {
  416.                                                         if(time[3]>31)
  417.                                                         time[3]=1;
  418.                                           }
  419.                                           else
  420.                                           {
  421.                                                         if(time[4]==2)
  422.                                                         {
  423.                                                                       if(time[6]%4==0)
  424.                                                                       {
  425.                                                                                     if(time[3]>28)
  426.                                                                                     time[3]=1;
  427.                                                                       }
  428.                                                                       else
  429.                                                                       {
  430.                                                                                     if(time[3]>29)
  431.                                                                                     time[3]=1;
  432.                                                                       }
  433.                                                         }
  434.                                                         else
  435.                                                         {
  436.                                                                       if(time[3]>30)
  437.                                                                       time[3]=1;
  438.                                                         }
  439.                                           }
  440.                                           time1[3]=(time[3]/10)*16+time[3]%10;
  441.                                           if(time1[4]==0x01||time1[4]==0x03||time1[4]==0x05||time1[4]==0x07||time1[4]==0x08||time1[4]==0x10||time1[4]==0x12)
  442.                                           {
  443.                                                         if(time1[3]>0x31)
  444.                                                         time1[3]=0x01;
  445.                                           }
  446.                                           else
  447.                                           {
  448.                                                         if(time1[4]==0x02)
  449.                                                         {
  450.                                                                       if(time1[6]%4==0)
  451.                                                                       {
  452.                                                                                     if(time1[3]>0x28)
  453.                                                                                     time1[3]=0x01;
  454.                                                                       }
  455.                                                                       else
  456.                                                                       {
  457.                                                                                     if(time1[3]>0x29)
  458.                                                                                     time1[3]=0x01;
  459.                                                                       }
  460.                                                         }
  461.                                                         else
  462.                                                         {
  463.                                                                       if(time1[3]>0x30)
  464.                                                                       time1[3]=0x01;
  465.                                                         }
  466.                                           }            
  467.                                           Writeds1302 (WRITE_DAY,time1[3]);                                         
  468.                             }
  469.                             if(key_jia==0&&set_time==3)//設(shè)置時(shí)
  470.                             {
  471.                                           time[2]++;
  472.                                           if(time[2]>23)
  473.                                                         time[2]=0;
  474.                                           time1[2]=(time[2]/10)*16+time[2]%10;
  475.                                           if(time1[2]>0x23)
  476.                                                         time1[2]=0x00;
  477.                                           Writeds1302 (WRITE_HOUR,time1[2]);                                         
  478.                             }
  479.                             if(key_jia==0&&set_time==4)//設(shè)置分
  480.                             {
  481.                                           time[1]++;
  482.                                           if(time[1]>59)
  483.                                                         time[1]=0;
  484.                                           time1[1]=(time[1]/10)*16+time[1]%10;
  485.                                           if(time1[1]>0x59)
  486.                                                         time1[1]=0x00;
  487.                                           Writeds1302 (WRITE_MINUTE,time1[1]);                                                      
  488.                             }
  489.                             if(key_jia==0&&set_time==5)//設(shè)置秒
  490.                             {
  491.                                           time[0]++;
  492.                                           if(time[0]>59)
  493.                                                         time[0]=0;
  494.                                           time1[0]=(time[0]/10)*16+time[0]%10;
  495.                                           if(time1[0]>0x59)
  496.                                                         time1[0]=0x00;
  497.                                           Writeds1302 (WRITE_SECOND,time1[0]);                                                      
  498.                             }
  499.                             if(key_jia==0&&set_time==6)
  500.                             {
  501.                                           naozhong1[2]++;
  502.                                           if(naozhong1[2]>23)
  503.                                                         naozhong1[2]=00;
  504.                             }
  505.                             if(key_jia==0&&set_time==7)
  506.                             {
  507.                                           naozhong1[1]++;
  508.                                           if(naozhong1[1]>59)
  509.                                                         naozhong1[1]=00;            
  510.                             }
  511.                             if(key_jia==0&&set_time==8)
  512.                             {
  513.                                           naozhong1[0]++;
  514.                                           if(naozhong1[0]>59)
  515.                                                         naozhong1[0]=00;
  516.                             }                           
  517.   }                           
  518.               //減值鍵,支持連按
  519.               if(key_jian==0&&mode==3)
  520.               {
  521.                                           Delay_ms(7);            
  522.     if(key_jian==0&&set_time==1)//設(shè)置月
  523.                             {
  524.                                           time[4]--;
  525.                                           if(time[4]<1)
  526.                                                         time[4]=12;
  527.                                           time1[4]=(time[4]/10)*16+time[4]%10;
  528.                                           if(time1[4]<0x01)
  529.                                                         time1[4]=0x12;
  530.                                           Writeds1302 (WRITE_MONTH,time1[4]);                           
  531.                             }
  532.                 if(key_jian==0&&set_time==2)//設(shè)置日
  533.                             {
  534.                                           time[3]--;
  535.                                           if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)
  536.                                           {
  537.                                                         if(time[3]<1)
  538.                                                         time[3]=31;
  539.                                           }
  540.                                           else
  541.                                           {
  542.                                                         if(time[4]==2)
  543.                                                         {
  544.                                                                       if(time[6]%4==0)
  545.                                                                       {
  546.                                                                                     if(time[3]<1)
  547.                                                                                     time[3]=28;
  548.                                                                       }
  549.                                                                       else
  550.                                                                       {
  551.                                                                                     if(time[3]<1)
  552.                                                                                     time[3]=29;
  553.                                                                       }
  554.                                                         }
  555.                                                         else
  556.                                                         {
  557.                                                                       if(time[3]<1)
  558.                                                                       time[3]=30;
  559.                                                         }
  560.                                           }            
  561.                                           time1[3]=(time[3]/10)*16+time[3]%10;
  562.                                           if(time1[4]==0x01||time1[4]==0x03||time1[4]==0x05||time1[4]==0x07||time1[4]==0x08||time1[4]==0x10||time1[4]==0x12)
  563.                                           {
  564.                                                         if(time1[3]<0x01)
  565.                                                         time1[3]=0x31;
  566.                                           }
  567.                                           else
  568.                                           {
  569.                                                         if(time1[4]==0x02)
  570.                                                         {
  571.                                                                       if(time1[6]%4==0)
  572.                                                                       {
  573.                                                                                     if(time1[3]<0x01)
  574.                                                                                     time1[3]=0x28;
  575.                                                                       }
  576.                                                                       else
  577.                                                                       {
  578.                                                                                     if(time1[3]<0x01)
  579.                                                                                     time1[3]=0x29;
  580.                                                                       }
  581.                                                         }
  582.                                                         else
  583.                                                         {
  584.                                                                       if(time1[3]<0x01)
  585.                                                                       time1[3]=0x30;
  586.                                                         }
  587.                                           }            
  588.                                           Writeds1302 (WRITE_DAY,time1[3]);            
  589.                             }
  590.                 if(key_jian==0&&set_time==3)//設(shè)置時(shí)
  591.                             {
  592.                                           time[2]--;
  593.                                           if(time[2]<00)
  594.                                                         time[2]=23;
  595.                                           time1[2]=(time[2]/10)*16+time[2]%10;
  596.                                           if(time1[2]<0x00)
  597.                                                         time1[2]=0x23;
  598.                                           Writeds1302 (WRITE_HOUR,time1[2]);
  599.                             }
  600.                             if(key_jian==0&&set_time==4)//設(shè)置分
  601.                             {
  602.                                           time[1]--;
  603.                                           if(time[1]<00)
  604.                                                         time[1]=59;
  605.                                           time1[1]=(time[1]/10)*16+time[1]%10;
  606.                                           if(time1[1]<0x00)
  607.                                                         time1[1]=0x59;
  608. ……………………

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


完整的Word格式文檔51黑下載地址:
基于單片機(jī)的自動(dòng)澆花設(shè)計(jì).docx (769.9 KB, 下載次數(shù): 350)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:326586 發(fā)表于 2018-5-16 16:30 | 只看該作者
謝謝大大。正好要用到可以參考!
回復(fù)

使用道具 舉報(bào)

板凳
ID:478397 發(fā)表于 2019-2-20 10:58 | 只看該作者
真好 可以以借鑒一下
回復(fù)

使用道具 舉報(bào)

地板
ID:638566 發(fā)表于 2019-11-9 12:03 | 只看該作者
可以65555555
回復(fù)

使用道具 舉報(bào)

5#
ID:664645 發(fā)表于 2019-12-18 23:30 | 只看該作者
這個(gè)只有文檔嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:664645 發(fā)表于 2019-12-28 12:23 | 只看該作者
沒有原理圖誒
回復(fù)

使用道具 舉報(bào)

7#
ID:664645 發(fā)表于 2019-12-28 12:23 | 只看該作者
只是文檔,大佬求問原理圖怎么搞?
回復(fù)

使用道具 舉報(bào)

8#
ID:664645 發(fā)表于 2019-12-28 12:27 | 只看該作者
沒有原理圖誒?
回復(fù)

使用道具 舉報(bào)

9#
ID:708344 發(fā)表于 2020-3-14 15:51 | 只看該作者
可以參考
回復(fù)

使用道具 舉報(bào)

10#
ID:716851 發(fā)表于 2020-3-27 15:01 | 只看該作者
真好,可以用來借鑒
回復(fù)

使用道具 舉報(bào)

11#
ID:752684 發(fā)表于 2020-5-16 09:03 | 只看該作者
你的圖14那個(gè)流程圖沒看懂,沒傳上?
回復(fù)

使用道具 舉報(bào)

12#
ID:841300 發(fā)表于 2020-11-19 10:08 | 只看該作者
沒有原理圖嗎
回復(fù)

使用道具 舉報(bào)

13#
ID:853928 發(fā)表于 2020-12-3 17:58 | 只看該作者
感謝大佬,可以借鑒,感謝
回復(fù)

使用道具 舉報(bào)

14#
ID:1050605 發(fā)表于 2023-12-15 15:08 來自手機(jī) | 只看該作者
大佬頭自定義的文件可以發(fā)出來參考下嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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