【Proteus仿真】【51单片机】自动浇花灌溉系统设计

news2025/1/14 17:57:15

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用LCD1602液晶、按键、DS18B20、PCF8591 ADC、土壤湿度传感器、水位传感器、蜂鸣器模块等。

系统运行后,LCD1602显示传感器检测的温度、湿度及水位值;
默认以自动模式运行,若按下K4键切换为手动模式,此时可以
通过K1和K2控制水泵和水箱开关。当再次按下K4键切换为自动
模式;自动模式下,实时检测温度、湿度及水位值,当温度高于
或低于设定阈值,声光报警。当湿度高于上限声光报警,低于下限
且水箱水位高于30%,则开启水泵浇水。否则水箱开始加水,当水箱
水位高于80%,停止加水。
可通过K3键进入阈值设置,K1和K2调节,设置好后可按下K4键返回主
界面。
主要功能如下:
1、温度/湿度检测
2、LCD1602显示温湿度/水位
3、温湿度阈值设置
4、超限声光报警
5、自动/手动浇花灌溉


二、软件设计

/*
作者:嗨小易(QQ:3443792007)
*/


//系统参数初始化
void sys_parm_init(void)
{
	sys_ctrl.mode=0;
	sys_ctrl.temph=30;
	sys_ctrl.templ=25;
	sys_ctrl.humih=40;
	sys_ctrl.humil=20;
	sys_ctrl.auto_flag=0;	
}

//系统开机界面显示
void sys_open_show(void)
{
	lcd1602_clear();
	lcd1602_show_string(0,0,"Tp:  C");
	lcd1602_show_string(7,0,"  -  ");
	lcd1602_show_string(13,0,"  %");
	lcd1602_show_string(0,1,"Sd:  %");
	lcd1602_show_string(7,1,"  -  %");
	lcd1602_show_string(14,1,"Au");
}

//系统数据获取
void sys_data_get(void)
{
	static u8 i=0;

	while(1)
	{
		//温度获取
		i++;
		if(i%10==0)
			sys_ctrl.temp=ds18b20_read_temperture();
		//湿度获取
		sys_ctrl.humi=pcf8591_read_adcvalue(1);
		sys_ctrl.humi=cal_map(sys_ctrl.humi,0,255,0,99);
		//水位获取
		sys_ctrl.level=pcf8591_read_adcvalue(0);
		sys_ctrl.level=cal_map(sys_ctrl.level,0,255,0,99);	

		break;
	}	
}

//系统数据显示
void sys_data_show(void)
{
	static u8 i=0;
	while(1)
	{
		//温度显示
		lcd1602_show_nums(3,0,sys_ctrl.temp,2,0);
		//湿度显示
		lcd1602_show_nums(3,1,sys_ctrl.humi,2,0);
		//水位显示
		lcd1602_show_nums(13,0,sys_ctrl.level,2,0);

		
		//温度阈值显示
		lcd1602_show_nums(7,0,sys_ctrl.templ,2,0);
		lcd1602_show_nums(10,0,sys_ctrl.temph,2,0);
		//湿度阈值显示
		lcd1602_show_nums(7,1,sys_ctrl.humil,2,0);
		lcd1602_show_nums(10,1,sys_ctrl.humih,2,0);	
		
		//温度下限闪烁显示
		if(sys_ctrl.mode==1)
		{
			i++;
			if(i%100!=0)lcd1602_show_string(7,0,"  ");			
		}
		//温度上限闪烁显示
		else if(sys_ctrl.mode==2)
		{
			i++;
			if(i%100!=0)lcd1602_show_string(10,0,"  ");			
		}
		//湿度下限闪烁显示
		else if(sys_ctrl.mode==3)
		{
			i++;
			if(i%100!=0)lcd1602_show_string(7,1,"  ");			
		}
		//湿度上限闪烁显示
		else if(sys_ctrl.mode==4)
		{
			i++;
			if(i%100!=0)lcd1602_show_string(10,1,"  ");			
		}
		delay_ms(1);
		//手动状态显示
		if(sys_ctrl.auto_flag)lcd1602_show_string(14,1,"SD");
		else lcd1602_show_string(14,1,"Au");

		break;			
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	key=key_scan(0);
	//模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>=5)sys_ctrl.mode=0;
	}
	//在设置模式下,加
	else if(key==KEY1_PRESS)
	{
		switch(sys_ctrl.mode)
		{
			case 1://温度下限 
				sys_ctrl.templ++;
				if(sys_ctrl.templ>99)sys_ctrl.templ=0;
				break;
			case 2://温度上限 
				sys_ctrl.temph++;
				if(sys_ctrl.temph>99)sys_ctrl.temph=0;
				break;
			case 3://湿度下限 
				sys_ctrl.humil++;
				if(sys_ctrl.humil>99)sys_ctrl.humil=0;
				break;
			case 4://湿度上限 
				sys_ctrl.humih++;
				if(sys_ctrl.humih>99)sys_ctrl.humih=0;
				break;
		}
		//手动模式,开关水泵
		if(sys_ctrl.auto_flag==1)
			SB_PIN=!SB_PIN;	
			
	}
	//在设置模式下,减
	else if(key==KEY2_PRESS)
	{
		switch(sys_ctrl.mode)
		{
			case 1://温度下限 
				sys_ctrl.templ--;
				if(sys_ctrl.templ<0)sys_ctrl.templ=99;
				break;
			case 2://温度上限 
				sys_ctrl.temph--;
				if(sys_ctrl.temph<0)sys_ctrl.temph=99;
				break;
			case 3://湿度下限 
				sys_ctrl.humil--;
				if(sys_ctrl.humil<0)sys_ctrl.humil=99;
				break;
			case 4://湿度上限 
				sys_ctrl.humih--;
				if(sys_ctrl.humih<0)sys_ctrl.humih=99;
				break;
		}
		//手动模式,开关水箱
		if(sys_ctrl.auto_flag==1)
			SX_PIN=!SX_PIN;	
	}
	else if(key==KEY4_PRESS)
	{
		if(sys_ctrl.mode!=0)//确定
			sys_ctrl.mode=0;
		else//自动/手动切换
		{
			sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
			//自动模式下,关闭水箱水泵
			if(sys_ctrl.auto_flag==0)
			{
				SX_PIN=1;SB_PIN=1;	
			}		
		}	
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//自动模式下控制
	if(sys_ctrl.auto_flag==0)
	{
		//如果温度高于上限或低于下限,声光报警
		if(sys_ctrl.temp>sys_ctrl.temph || sys_ctrl.temp<sys_ctrl.templ)
		{
			LED=0;beep_alarm(100,20);
		}
		//温度正常,声光报警取消
		else
			LED=1;		
		
		//如果湿度高于上限,声光报警
		if(sys_ctrl.humi>sys_ctrl.humih)
		{
			LED=0;beep_alarm(100,20);		
		}
		//如果湿度低于下限,声光报警
		else if(sys_ctrl.humi<sys_ctrl.humil)
		{
			LED=0;beep_alarm(100,20);
			//当水箱有水,水泵打开浇水,关闭水箱加水
			if(sys_ctrl.level>LEVEL_MIN_VALUE)
			{
				SB_PIN=0;SX_PIN=1;	
			}
			//当水箱水不够,水泵停止浇水,开启水箱加水
			else
			{
				SB_PIN=1;SX_PIN=0;	
			} 
		}
		//如果湿度正常,声光报警关闭,水泵停止浇水
		else 
		{
			LED=1;SB_PIN=1;			
		}
		//如果水箱水不够,开始加水
		if(sys_ctrl.level<LEVEL_MIN_VALUE)SX_PIN=0;
		//如果水箱水足够,停止加水
		else if(sys_ctrl.level>LEVEL_MAX_VALUE)SX_PIN=1;	
	}
		
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	lcd1602_init();
	ds18b20_init();
	//读取温度数据,等待稳定
	while(i--)
	{
		sys_ctrl.temp=ds18b20_read_temperture();
		//湿度获取
		sys_ctrl.humi=pcf8591_read_adcvalue(1);
		sys_ctrl.humi=cal_map(sys_ctrl.humi,0,255,0,99);
		//水位获取
		sys_ctrl.level=pcf8591_read_adcvalue(0);
		sys_ctrl.level=cal_map(sys_ctrl.level,0,255,0,99);
		delay_ms(100);	
	}
	sys_open_show();//系统开机界面显示

	while(1)
	{	
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制
	}
}



三、实验现象

演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux操作系统】多线程(一)

文章目录1. 线程概念2. 线程控制2.1 创建线程2.2 线程ID2.3 线程等待2.4 线程终止2.5 线程分离3. 线程同互斥与同步3.1 互斥量3.2 死锁3.3 同步-条件变量3.4 生产者消费者模型3.5 POSIX信号量3.6 基于环形队列的生产消费者模型1. 线程概念 线程&#xff1a;是在进程内部运行的…

解决资源消耗,top的运用记录

第一条命令uptime load average 后面的三个数字&#xff0c;分别代表1分钟、5分钟和15分钟内机器的平均负载 使用top命令解决负载问题 Cpu(s)这一行提供了CPU运行情况信息 这些缩写分别代表了不同含义 (1)us&#xff1a;用户CPU时间 运行非优雅的用户进程所占CPU时间的百…

离线下载NLTK依赖包([WinError 10061] 由于目标计算机积极拒绝,无法连接)的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

房产管理系统CAD图形管理应用有哪些?

数图互通房产管理 数图互通房产管理系统建设涵盖学校所有房屋资源管理业务以及CAD图纸的管理&#xff0c;对不同类型的房屋实现相应的业务子系统&#xff0c;实现完善、高效、可溯的房屋资源业务管理&#xff0c;保证数据的完整性、一致性和精确性&#xff0c;及业务的。 通过…

向内而生 向远而行 | 希尔贝壳荣获“2022年度最具投资价值创新企业”奖

12月22日&#xff0c;以“向内而生 向远而行”为主题的2022年度猎云网创投奖项评选正式落下帷幕&#xff0c;各项榜单评选结果正式发布。希尔贝壳凭借先进的技术创新能力获评“2022年度最具投资价值创新企业”奖。 获奖理由 北京希尔贝壳科技有限公司成立于2017年&#xff0c;…

可视化 相机pose或者 pose视锥

可视化 相机pose或者 pose视锥 https://www.camcalib.io/post/visualizing-camera-calibration-results https://bitbucket.org/iviso/camcalib_multiview_pointcloud_example/src/master/ https://bitbucket.org/iviso/ 其他&#xff1a; https://towardsdatascience.com/c…

快速部署PHP Web环境(nginx php mysql redis)

先看最终效果&#xff0c;如下&#xff1a; 它是什么&#xff1f; 它是 docker 容器虚拟化技术。总共只有几KB大小的描述文件&#xff0c;文件里定义了要安装什么、配置什么&#xff0c;一执行就全自动处理好了。 它有什么用&#xff1f; 解决新来同事搭环境搭半天的问题解…

矽昌-- Station 模式支持

Station 模式支持 1. 修改配置 ​ 在/etc/config/wireless中增加一段即可&#xff0c;实例如下&#xff1a; config wifi-ifaceoption key 12345678option ifname sfi0option network wwanoption encryption psk2ccmpoption device radio0option mode staoption bssid A8:5A:…

玩以太坊链上项目的必备技能(修改器 [modifier]-Solidity之旅十五)

修改器&#xff08;modifier&#xff09; 在讲修改器&#xff08;modifier&#xff09;之前&#xff0c;我们使用前面几篇文章所学到的知识来实现一个简单的 token 类合约。 // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0;contract InheritanceModifierExampl…

Python获取与处理文件路径/目录路径

这里写目录标题文件目录结构说明一、路径获取1.1 获取当前文件的绝对路径1.2.1 获取当前文件的所在目录1.2.2 获取当前文件的所在目录的上一级目录1.3 获取当前文件名1.4 获取当前文件对于基准路径的相对路径二、路径判断2.1 判断路径是否存在2.2 判断路径是否为绝对路径2.3 判…

【Python】matplotlib.axes.Axes.pie()实例讲解

目录&#xff1a;matplotlib.axes.Axes.pie函数实力讲解一、前言二、matplotlib.axes.Axes.pie()函数三、代码示例四、get_cmap函数一、前言 本文章向大家介绍Python matplotlib.axes.Axes.pie()实例讲解&#xff0c;主要分析其语法、参数、返回值和注意事项&#xff0c;并结合…

WorkPlus助力中交四航局打造数字化管理新模式,释放企业生产力

企业简介 中交四航局正式创立于1951年&#xff0c;集团主要从事海内外港口、公路、桥梁、铁路、市政工程、水利工程等大型基础设施建设&#xff0c;以及相关的投资、勘察设计、科研、工业造船和房地产业务。始终致力于“让世界更畅通&#xff0c;让城市更宜居&#xff0c;让生…

logger记录在控制台显示,但是在日志输出文件中不显示问题排查

场景&#xff1a; 代码中存在使用logger.info输出数据到指定的文件中&#xff0c;然后用logstash去收集需要的数据插入到es中。 现象&#xff1a; logger.info输出的记录打断点在控制台上显示&#xff0c;但是在配置的日志输出文件中却找不到日志输出的内容。 log4j配置 如下…

ELK搜索学习笔记--Day1

ELK搜索学习笔记–Day1 1&#xff0e; 课程简介 1.1 课程内容 ELK是包含但不限于Elasticsearch&#xff08;简称es&#xff09;、Logstash、Kibana 三个开源软件的组成的一个整体。这三个软件合成ELK。是用于数据抽取&#xff08;Logstash&#xff09;、搜索分析&#xff08…

Freemodbus启动流程分析

近项目有用到modbus协议,于是在网上找了些资料成功将freemodbus移植到m3,由于移植过程较简单,网上教程也很多,这里我们就不再赘述.我用到的freemodbus版本是V1.5,下面附上新的源码下载地址:http://www.freemodbus.org/index.php?idx5 下面开始分析下freemodbus得启动流程,老规…

Android设计模式详解之解释器模式

前言 解释器模式是一种使用较少的行为型模式&#xff1b; 提供了一种解释语言的语法或表达式的方式&#xff0c;通过该接口解释一个特定的上下文。 定义&#xff1a;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表…

MySQL面试常问问题(高可用/性能 + 运维) —— 赶快收藏

1.数据库读写分离了解吗&#xff1f; 读写分离的基本原理是将数据库读写操作分散到不同的节点上&#xff0c;下面是基本架构图&#xff1a; 读写分离 读写分离的基本实现是: 数据库服务器搭建主从集群&#xff0c;一主一从、一主多从都可以。 数据库主机负责读写操作&#x…

洛谷——P1573 栈的操作

文章目录栈的操作题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示AC代码栈的操作 题目描述 现在有四个栈&#xff0c;其中前三个为空&#xff0c;第四个栈从栈顶到栈底分别为 1,2,3,⋯,n1,2,3,\cdots ,n1,2,3,⋯,n。每一个栈只支持一种操作&#xff1a;弹出并压入…

当云原生成为一种显学,对象存储和数据湖如何顺势而为

前言&#xff1a; 已经成为数字化时代显学的云原生并非单项技术&#xff0c;而是一种重塑了软件开发和和业务运行应用的设计思想&#xff0c;是一套技术体系和方法论。云原生“Cloud Native”的Cloud 是指云平台&#xff0c;Native则表示应用程序从设计之初即使用云环境、天生…

MyBatis学习 | SQL映射文件

文章目录一、简介二、insert、update和delete标签2.1 关于增删改2.2 获取自增主键的值三、参数处理3.1 获取不同形式的参数3.1.1 获取单个参数3.1.2 获取多个参数3.2 #{Key}3.2.1 #{}&#x1f19a;${}3.2.2 #{}中设置参数规则四、select标签4.1 select标签的主要属性4.2 关于返…