一.硬件方案
本設計通過光敏電阻檢測光照強度,然后A/D模塊PCF8591處理后,將光照強度值實時顯示在液晶上,并且可以按鍵控制光照的強度值,當光照低于設定的閾值,1顆白色高亮LED燈亮進行補光,光照高于設定的閾值,就不用管。通過DS18B20檢測溫度值,并且實時顯示在1602液晶上,并且可以通過按鍵設定溫度值,當溫度低于設定值時,通過一顆黃色高亮LED燈模擬。
主要由STC89C52單片機、LCD1602液晶顯示、光照檢測、土壤濕度傳感器、A/D采樣PCF8591、風扇控制、繼電器控制、補光燈、補溫燈、按鍵及電源組成;
二.設計功能
(1)通過光敏電阻檢測光照強度,然后A/D模塊PCF8591處理后,將光照值實時顯示在液晶上,按鍵可以設置光照閾值。當光照低于設定的閾值,高亮LED燈亮進行補光,否則關閉。
(2)通過DS18B20檢測溫度值,實時顯示在1602液晶上,可以通過按鍵設定溫度閾值,當溫度低于設定值時,補溫燈打開,否則關閉;當溫度超過設定值時,風扇旋轉。
(3)通過土壤濕度傳感器檢測土壤的濕度,將濕度值顯示在液晶上,按鍵設置濕度閾值,當土壤濕度小于設定的閾值,繼電器打開,繼電器可以外接水泵;否則繼電器不動作。
三.設計原理圖
(1)原理圖主要采用AD軟件進行設計,如圖:
(2)PCB圖如下:
四.軟件設計
主程序源碼
void main (void)
{ unsigned char midval; Init_Timer0();LCD_Init(); //初始化液晶DelayMs(20); //延時有助于穩定LCD_Clear(); //清屏led_l = 0;relay = 0;led_b = 0;fan = 0; //上電檢測下 方便檢測硬件DelayMs(200); led_l = 1;relay = 1;led_b = 1;fan = 1;sprintf(disdat,"L:%2d R:%2d T:%2d C",Lval,Rval,distem);//打印電壓電流值LCD_Write_String(0,0,disdat);//顯示sprintf(disset," L:%2d R:%2d T:%2d",(unsigned int)setLval,(unsigned int)setRval,(unsigned int)setTval);//打印電壓電流值LCD_Write_String(0,1,disset);while (1) //主循環{ key(); //按鍵處理程序if(readADCFlag == 1) //定時讀取adc{midval=ReadADC(1); //轉換的結果,在下次,才能讀出Lv=5.15-(float)midval*5.15/255; //光照Lval = (unsigned int )(Lv * 100 )/5.16;DelayMs(10); //延時有助于穩定midval=ReadADC(0); //讀取AD檢測到的 光敏地值 Tv=5.15-(float)midval*5.15/255; //光照Rval = (unsigned int )(Tv * 100 )/5.16;sprintf(disdat,"L:%2d R:%2d T:%2d C",Lval,Rval,distem);//打印電壓電流值LCD_Write_String(0,0,disdat);//顯示LCD_Write_Char(14,0,0XDF) ;readADCFlag = 0 ;sprintf(disset," L:%2d R:%2d T:%2d ",(unsigned int)setLval,(unsigned int)setRval,(unsigned int)setTval);//打印電壓電流值LCD_Write_String(0,1,disset);if(SetFlag == 1) //進入設置{LCD_Write_Char(0,1,'S') ; //顯示SLCD_Write_Char(5,1,' ') ;LCD_Write_Char(10,1,' ') ;}else if(SetFlag == 2){LCD_Write_Char(0,1,' ') ;LCD_Write_Char(5,1,'S') ; //顯示SLCD_Write_Char(10,1,' ') ;}else if(SetFlag == 3){LCD_Write_Char(0,1,' ') ;LCD_Write_Char(5,1,' ') ; //顯示SLCD_Write_Char(10,1,'S') ;}else{LCD_Write_Char(0,1,' ') ;LCD_Write_Char(5,1,' ') ; //顯示SLCD_Write_Char(10,1,' ') ;}if(Lval <= setLval) //光照對比{led_l = 0; //打開led}else{led_l = 1; //關閉led}if(Rval <= setRval) //土壤對比{relay = 0; //打開繼電器}else{relay = 1; //關閉繼電器}if(distem <= setTval) //溫度對比{led_b = 0; //led及風扇處理fan = 1;}else{led_b = 1; //led及風扇處理fan = 0;}}if(readTem==1) //定時溫度讀取{temp=ReadTemperature(); //溫度讀取temperature=(float)temp*0.0625; //溫度處理if(temperature >1) //防止溫度讀錯{distem = (unsigned int )temperature;} //溫度處理readTem=0;} }
}
資料鏈接:https://pan.baidu.com/s/1YDpZ7RI3Pm12G_wSlt-Cxw?pwd=q3v3
提取碼:q3v3