历史上的今天
今天是:2024年09月30日(星期一)
2021年09月30日 | 基于51单片机智能大棚浇花花盆浇水灌溉补光散热设计
2021-09-30 来源:eefocus
一.硬件方案
本设计通过光敏电阻检测光照强度,然后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图如下:

四.软件设计
(1)程序流程图

(2)主程序源码
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') ; //显示S
LCD_Write_Char(5,1,' ') ;
LCD_Write_Char(10,1,' ') ;
}
else if(SetFlag == 2)
{
LCD_Write_Char(0,1,' ') ;
LCD_Write_Char(5,1,'S') ; //显示S
LCD_Write_Char(10,1,' ') ;
}
else if(SetFlag == 3)
{
LCD_Write_Char(0,1,' ') ;
LCD_Write_Char(5,1,' ') ; //显示S
LCD_Write_Char(10,1,'S') ;
}
else
{
LCD_Write_Char(0,1,' ') ;
LCD_Write_Char(5,1,' ') ; //显示S
LCD_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;
}
}
}
上一篇:基于51单片机的全自动洗衣机设计
史海拾趣
|
各位朋友好,我遇到的问题是:我在wince5.0中用ado访问sql ce数据库,平时连接数据库、读写数据库都没问题,我的程序是定时3秒写一个70个字段的数据,当我反复开关设备时(我们的设备是硬关机,即直接关电源,没有关机键),在一定次数后再打开程序 ...… 查看全部问答> |
|
在单片机中,程序设定一个输出引脚的为高电平3v,用这个高电平通过三极管的基极到电源负极去驱动负载, 我们知道三极管的基极的电阻很小,也就是三极管上的基极管压降只有0.4V左右,根据电路定律,那么是不是输出引脚对地的电压也只有0.4v,变成 ...… 查看全部问答> |
|
请教各位大神: 我现在都是通过烧写程序时直接在f8wConfig.cfg文件里修改自己需要的参数,实际应用时需要可以灵活的修改这些参数,总不能 每次都重新烧录程序吧。 请教有什么方法可以通过串口或者RF在程序运行中来实现f8wConfig.cfg文件中某些参 ...… 查看全部问答> |
|
BBB 入门基础之针对Angstrom系统的OpenCV交叉编译 本帖最后由 lonerzf 于 2014-8-3 18:16 编辑 有个论坛的朋友遇到了点困难,原因很简单,我之前有个地方没讲明白。活动虽然结束了,但是这个缺少的工作还得补上呀。 上正题。 一、宿主机编译Opencv实际上是为了能添加一些目录啥的,不进 ...… 查看全部问答> |
|
C2000学习之[2]:导入controlSUITE的示例工程 本帖最后由 nemo1991 于 2015-3-16 17:01 编辑 TI为C2000系列DSP创建的controlSUITE组件包包含了丰富的技术资源。对于入门学习而言,示例程序是非常重要的学习资料。以下,将介绍如何使用controlsuite的示例工程。注意:示例中使用的是自制的TMS3 ...… 查看全部问答> |




