基于51单片机土壤湿度检测及自动浇花
(仿真+程序+原理图+设计报告)
功能介绍
具体功能:
1.LCD1602实时显示湿度、湿度上下限;
2.可用按键设置湿度、湿度上下限;
3.当湿度低于下限值时,蜂鸣器+LED声光报警,打开水泵抽水,当湿度高于设定上限值,自动关闭抽水;
4.上电不需要重新设置,具有掉电保存功能;
演示视频:
基于51单片机土壤湿度检测及自动浇花系统
/*
功能:土嚷湿度检测与自动浇花#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535#include <intrins.h>sbit SCL=P1^4; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit DO=P1^5; //DO定义为P1口的第4位脚,连接ADC0832DO脚
sbit CS=P1^3; //CS定义为P1口的第4位脚,连接ADC0832CS脚sbit beep = P3^3; //蜂鸣器IO口定义
uint temperature,s_temp ; //温度的变量
uchar shidu; //湿度等级
uchar s_high = 70,s_low = 25; //湿度报警参数sbit dianji = P1^6; //电机IO定义bit flag_300ms ;
uchar key_can; //按键值的变量
uchar menu_1; //菜单设计的变量//这三个引脚参考资料
sbit rs=P1^0; //1602数据/命令选择引脚 H:数据 L:命令
sbit rw=P1^1; //1602读写引脚 H:数据寄存器 L:指令寄存器
sbit e =P1^2; //1602使能引脚 下降沿触发
uchar code table_num[]="0123456789abcdefg";/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{while(q--);
}/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{e=0;rs=0;rw=0;P0=com;delay_uint(3);e=1;delay_uint(25);e=0;
}/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{e=0;rs=1;rw=0;P0=dat;delay_uint(3);e=1;delay_uint(25);e=0;
}/********************************************************************
* 名称 : write_sfm2(uchar hang,uchar add,uchar date)
* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下write_sfm1(1,5,23)
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_sfm2(uchar hang,uchar add,uint date)
{if(hang==1) write_com(0x80+add);elsewrite_com(0x80+0x40+add);write_data(0x30+date/10%10);write_data(0x30+date%10);
}/********************************************************************
* 名称 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下write_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{if(hang==1) write_com(0x80+add);elsewrite_com(0x80+0x40+add);while(1){if(*p == '\0') break;write_data(*p);p++;}
}/********************************************************************
* 名称 : init_1602()
* 功能 : 初始化1602液晶
* 输入 : 无
* 输出 : 无
***********************************************************************/
void init_1602()
{write_com(0x38);write_com(0x38);write_com(0x0c);write_com(0x06);delay_uint(1000);write_string(1,0," shidu:00% ");write_string(2,0," SH:00% SL:00% ");write_sfm2(2,4,s_high); //显示湿度上限write_sfm2(2,12,s_low); //显示湿度下限
}/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);
}/***********读数模转换数据********************************************************/
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的// 1 0 0 通道// 1 1 1 通道
unsigned int Adc0832(unsigned char channel)
{uchar i=0;uchar j;uint dat=0;uchar ndat=0;uchar Vot=0;if(channel==0)channel=2;if(channel==1)channel=3;DO=1;_nop_();_nop_();CS=0;//拉低CS端_nop_();_nop_();SCL=1;//拉高CLK端_nop_();_nop_();SCL=0;//拉低CLK端,形成下降沿1_nop_();_nop_();SCL=1;//拉高CLK端DO=channel&0x1;_nop_();_nop_();SCL=0;//拉低CLK端,形成下降沿2_nop_();_nop_();SCL=1;//拉高CLK端DO=(channel>>1)&0x1;_nop_();_nop_();SCL=0;//拉低CLK端,形成下降沿3DO=1;//控制命令结束_nop_();_nop_();dat=0;for(i=0;i<8;i++){dat|=DO;//收数据SCL=1;_nop_();_nop_();SCL=0;//形成一次时钟脉冲_nop_();_nop_();dat<<=1;if(i==7)dat|=DO;}for(i=0;i<8;i++){j=0;j=j|DO;//收数据SCL=1;_nop_();_nop_();SCL=0;//形成一次时钟脉冲_nop_();_nop_();j=j<<7;ndat=ndat|j;if(i<7)ndat>>=1;}CS=1;//拉低CS端SCL=0;//拉低CLK端DO=1;//拉高数据端,回到初始状态dat<<=8;dat|=ndat;return(dat); //return ad data
}/*************定时器0初始化程序***************/
void time_init()
{EA = 1; //开总中断TMOD = 0X01; //定时器0、定时器1工作方式1ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时
}/********************独立按键程序*****************/
uchar key_can; //按键值void key() //独立按键程序
{static uchar key_new;key_can = 20; //按键值还原P3 |= 0xf0;if((P3 & 0xf0) != 0xf0) //按键按下{delay_1ms(1); //按键消抖动if(((P3 & 0xf0) != 0xf0) && (key_new == 1)){ //确认是按键按下key_new = 0;switch(P3 & 0xf0){case 0xd0: key_can = 3; break; //得到k2键值case 0xb0: key_can = 2; break; //得到k3键值case 0x70: key_can = 1; break; //得到k4键值} } }else key_new = 1;
}/****************按键处理显示函数***************/
void key_with()
{if(key_can == 1) //设置键{menu_1 ++;if(menu_1 >= 3){menu_1 = 0;init_1602() ; //初始化显示}}if(menu_1 == 1) //设置湿度上限{if(key_can == 2){s_high ++ ; //湿度上限值加1 if(s_high > 99)s_high = 99;}if(key_can == 3){s_high -- ; //湿度上限值减1 if(s_high <= s_low)s_high = s_low + 1 ;}write_sfm2(2,4,s_high); //显示湿度上限write_sfm2(2,12,s_low); //显示湿度下限write_com(0x80+0x40+4); //将光标移动到第2行第到3位write_com(0x0f); //显示光标并且闪烁} if(menu_1 == 2) //设置湿度下限{if(key_can == 2){s_low ++ ; //湿度下限值加1 if(s_low >= s_high)s_low = s_high - 1;}if(key_can == 3){s_low --; //湿度下限值减1 if(s_low <= 1)s_low = 1;}write_sfm2(2,4,s_high); //显示湿度上限write_sfm2(2,12,s_low); //显示湿度下限write_com(0x80+0x40+12); //将光标移动到第2行第到3位write_com(0x0f); //显示光标并且闪烁}
} /****************报警函数***************/
void clock_h_l()
{static uchar value,value1;if(shidu <= s_low){value ++;if(value >= 2){value = 10;beep = ~beep; //蜂鸣器报警dianji = 0; //打开电机}}else beep = 1; //关闭蜂鸣器if(shidu >= s_high){value1 ++;if(value1 >= 2){value1 = 10;beep = 1; //关闭蜂鸣器dianji = 1; //关机电机}}else value1 = 0;
}
硬件设计
使用元器件:
单片机:STC89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
ADC0832;蜂鸣器;
电容:10uF、20pf;
发光二极管;LCD1602;
土壤湿度传感器:yl-69;
三极管:9012;按键;
电阻:2K、10K;2.7K;
电源开关;晶振:12M;
抽水电机:5V小水泵;
电源插头:DC插头直流电源;
导线:若干;
流程图:
设计资料
01 仿真图
本设计使用proteus8.9版本设计,资料里有安装教程,无需担心!具体如图!
02 原理图
本系统原理图采用Altium Designer19设计,具体如图!
03 程序
本设计使用软件keil5版本编程设计,资料里有安装教程,无需担心!具体如图!
04 设计报告
五千字设计报告,具体如下!
05 设计资料
资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、AD原理图、参考论文、流程图、任务书、元件清单、视频讲解等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。