久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 33839|回復: 13
收起左側(cè)

基于單片機的自動澆花器設計論文完整版

  [復制鏈接]
ID:328949 發(fā)表于 2018-5-13 16:49 | 顯示全部樓層 |閱讀模式

基于單片機的自動澆花器設計

摘 要隨著科技的發(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è)。

單片機源程序如下:
  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;//自動澆花開關
  10. sbit jidainqi_led  = P1^3;//自動澆花開關指示燈
  11. sbit key_mode  = P3^2;//模式切換按鍵
  12. sbit key_set  = P3^3;//設置
  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;//按鍵設置標志位
  24. uchar T0_num;
  25. uchar ad;
  26. char naozhong1[]={0x00,0x00,0x00};
  27. /********************************************************
  28. 函數(shù)名稱:void delayms(uint ms)
  29. 函數(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)//白天自動檢測澆花
  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)//清屏標志位
  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;//自動澆花
  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)//澆花濕度設置
  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)//自動澆花加光照
  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)//清屏標志位
  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;//自動澆花
  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)//定時模式
  150. {  
  151.    Read_time();                                   //讀取時間
  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]);//              時  
  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;//自動澆花            
  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]);//              時  
  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]);//              時  
  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ù)次時候設置那個量的時候那個量不顯示,以達到閃爍的效果
  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ù)作用:按鍵檢測函數(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);                            //實踐證明,我的 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);//檢測按鍵松開
  330.               }
  331.               //設置鍵,不支持連按
  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);                            //實踐證明,我的 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);                            //實踐證明,我的 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);                            //實踐證明,我的 LCD1602 上,用 for 循環(huán) 200 次就能可靠完成清屏指令。            
  368.                                              display3();
  369.                                           }                                                      
  370.                             }                           
  371.                             while(!key_set);//檢測按鍵松開
  372.               }            
  373.               //加
  374.               if(key_jia==0&&mode==1)
  375.               {
  376.                             Delay_ms(5);
  377.                             if(key_jia==0&&mode==1&&set_shidu==1)//設置上限值
  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)//設置下限
  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)//設置月
  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)//設置日
  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)//設置時
  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)//設置分
  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)//設置秒
  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)//設置月
  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)//設置日
  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)//設置時
  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)//設置分
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


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

使用道具 舉報

ID:1050605 發(fā)表于 2023-12-15 15:08 來自手機 | 顯示全部樓層
大佬頭自定義的文件可以發(fā)出來參考下嗎
回復

使用道具 舉報

ID:853928 發(fā)表于 2020-12-3 17:58 | 顯示全部樓層
感謝大佬,可以借鑒,感謝
回復

使用道具 舉報

ID:841300 發(fā)表于 2020-11-19 10:08 | 顯示全部樓層
沒有原理圖嗎
回復

使用道具 舉報

ID:752684 發(fā)表于 2020-5-16 09:03 | 顯示全部樓層
你的圖14那個流程圖沒看懂,沒傳上?
回復

使用道具 舉報

ID:716851 發(fā)表于 2020-3-27 15:01 | 顯示全部樓層
真好,可以用來借鑒
回復

使用道具 舉報

ID:708344 發(fā)表于 2020-3-14 15:51 | 顯示全部樓層
可以參考
回復

使用道具 舉報

ID:664645 發(fā)表于 2019-12-28 12:27 | 顯示全部樓層
沒有原理圖誒?
回復

使用道具 舉報

ID:664645 發(fā)表于 2019-12-28 12:23 | 顯示全部樓層
只是文檔,大佬求問原理圖怎么搞?
回復

使用道具 舉報

ID:664645 發(fā)表于 2019-12-28 12:23 | 顯示全部樓層
沒有原理圖誒
回復

使用道具 舉報

ID:664645 發(fā)表于 2019-12-18 23:30 | 顯示全部樓層
這個只有文檔嗎?
回復

使用道具 舉報

ID:638566 發(fā)表于 2019-11-9 12:03 | 顯示全部樓層
可以65555555
回復

使用道具 舉報

ID:478397 發(fā)表于 2019-2-20 10:58 | 顯示全部樓層
真好 可以以借鑒一下
回復

使用道具 舉報

ID:326586 發(fā)表于 2018-5-16 16:30 | 顯示全部樓層
謝謝大大。正好要用到可以參考!
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清在线精品一区二区三区 | 成年视频在线观看 | 精精国产xxxx视频在线野外 | 成人亚洲视频 | 亚洲人成一区二区三区性色 | 亚洲国产精品久久 | 精品国产伦一区二区三区观看方式 | 国产yw851.c免费观看网站 | 视频一区中文字幕 | 亚洲人成人一区二区在线观看 | 人人干天天干 | 国产激情自拍视频 | 91婷婷韩国欧美一区二区 | 亚洲一区二区三区四区五区中文 | 欧美日韩不卡合集视频 | 欧美国产日韩在线观看 | 亚洲毛片在线观看 | 午夜成人免费视频 | 91视频电影 | 成人免费视频7777777 | 91久久久www播放日本观看 | 天堂成人av | 亚洲麻豆 | 成人久久久 | 中文字幕一区二区三区不卡在线 | 在线观看精品视频网站 | 国产精品久久久久久高潮 | 成人三级视频在线观看 | 免费成人高清在线视频 | 中文一区二区 | 一区二区精品电影 | 不卡欧美 | 亚洲区视频| 99精品免费视频 | 免费av直接看| 嫩草视频网 | 日韩欧美国产精品一区 | 亚洲不卡在线视频 | 日韩av一区二区在线观看 | 一区二区三区久久久 | 成人影音 |