一.硬件方案
本设计通过光敏电阻检测光照强度,然后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