【Proteus仿真】【51单片机】水箱液位检测控制装置设计_Hai小易的博客-程序员秘密

技术标签: 51单片机  c语言  proteus  嵌入式硬件  【Proteus仿真】【51单片机】趣味项目设计  


一、主要功能

1、压力液位检测
2、阈值设定,超限报警
3、压力液位显示
4、补排水自动控制

二、硬件资源

1、51单片机核心模块
2、PCF8591 AD/DA模块
3、LCD1602液晶模块
4、蜂鸣器模块
5、排水、补水控制电路
6、按键模块

三、软件设计

#include "appdemo.h"
#include "lcd1602.h"
#include "key.h"
#include "beep.h"
#include "pcf8591.h"
#include "exti.h"


//定义补水控制脚
sbit MOTOR_BS=P1^0;
//定义排水控制脚
sbit MOTOR_PS=P1^1;


//定义结构体
_sys_ctrl sys_ctrl;


//阈值设定
void key_set_threshold(void)
{
    
	u8 key=0;

   	key=key_scan(0);
	//模式设定显示
	if(key==KEY3_PRESS)
	{
    
		sys_ctrl.mode++;
		if(sys_ctrl.mode>=3)sys_ctrl.mode=1;
		lcd1602_clear();
		switch(sys_ctrl.mode)
		{
    
			case 1://液位上限设置显示界面 
				lcd1602_show_string(0,0,"LevelH Set:");
				break;
			case 2://液位下限设置显示界面 
				lcd1602_show_string(0,0,"LevelL Set:");
				break;
			default : 
				lcd1602_show_string(0,0,"Display Error");
				break;
		}	
	}
	//确定,返回主界面
	else if(key==KEY4_PRESS)
	{
    
		sys_ctrl.mode=0;
		lcd1602_clear();
		lcd1602_show_string(0,0," Current Level  ");
		lcd1602_show_string(0,1,"    mm");
	}

	//液位上限设置
	if(sys_ctrl.mode==1)
	{
      	
		if(key==KEY1_PRESS)//加
		{
    
			sys_ctrl.levelh+=THRESHOLD_STEP;
			if(sys_ctrl.levelh>MAX_VALUE)sys_ctrl.levelh=0;		
		}
		else if(key==KEY2_PRESS)//减
		{
    
			sys_ctrl.levelh-=THRESHOLD_STEP;
			if(sys_ctrl.levelh<0)sys_ctrl.levelh=MAX_VALUE;				
		}
		lcd1602_show_nums(0,1,sys_ctrl.levelh,4,0);					
	}
	//液位下限设置
	else if(sys_ctrl.mode==2)
	{
      	
		if(key==KEY1_PRESS)//加
		{
    
			sys_ctrl.levell+=THRESHOLD_STEP;
			if(sys_ctrl.levell>MAX_VALUE)sys_ctrl.levell=0;			
		}
		else if(key==KEY2_PRESS)//减
		{
    
			sys_ctrl.levell-=THRESHOLD_STEP;
			if(sys_ctrl.levell<0)sys_ctrl.levell=MAX_VALUE;				
		}
		lcd1602_show_nums(0,1,sys_ctrl.levell,4,0);			
	}
}
 
//参数初始化
void sys_para_init(void)
{
    
	sys_ctrl.mode=0;
	sys_ctrl.levelh=80;
	sys_ctrl.levell=20;	
}

//数据采集
void sys_get_data(void)
{
    
	u8 i=0;
	u8 ad_value=0;
	float vol=0;

	while(sys_ctrl.mode==0)
	{
    
		i++;
		if(i%200==0)
		{
    
			//读取压力AD值
			ad_value=pcf8591_read_adcvalue(0);
			//计算电压
			vol=(float)ad_value*5.0/256;
			//计算液位高度VO=K*H+∮=0.038*H+1.105(V)	//H单位mm
			sys_ctrl.level=(vol-1.105)/0.038;
			if(sys_ctrl.level<=0)sys_ctrl.level=0;
			break;				
		}
		delay_ms(1);			
	}			
}

//采集数据显示
void sys_data_show(void)
{
    
	while(sys_ctrl.mode==0)
	{
    
		lcd1602_show_nums(0,1,sys_ctrl.level,4,0);
		break;				
	}
}

//液位自动控制
void auto_control(void)
{
    
	while(sys_ctrl.mode==0)
	{
    
		//上限阈值,排水开启,补水关闭,蜂鸣器报警
		if(sys_ctrl.level>sys_ctrl.levelh)
		{
    
			MOTOR_PS=0;
			MOTOR_BS=1;
			beep_alarm(100,20);			
		}
		//下限阈值,排水关闭,补水开启,蜂鸣器报警
		else if(sys_ctrl.level<sys_ctrl.levell)
		{
    
			MOTOR_PS=1;
			MOTOR_BS=0;
			beep_alarm(100,20);			
		}
		//正常液位,排水关闭,补水关闭
		else
		{
    
			MOTOR_PS=1;
			MOTOR_BS=1;	
		}

		break;				
	}	
}

//智能温湿度大棚控制系统
void appdemo_show(void)
{
    
	lcd1602_init();
	//初始界面
	lcd1602_show_string(0,0," Current Level  ");
	lcd1602_show_string(0,1,"    mm");
	
	sys_para_init();//系统参数初始化
	sys_get_data();

	while(1)
	{
    
		key_set_threshold();//阈值设定
		sys_get_data();//数据采集
		sys_data_show();//采集数据显示
		auto_control();//温湿度自动控制
	}
}

四、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Hello_Muyi/article/details/124310546

智能推荐

学习总结(第十一周)_Gorgous—l的博客-程序员秘密

本周codeforces比赛感受:最近这一周打了大概有三四场左右比赛吧,本以为之前自己在1100分左右稳定就算掉到了底了,就因该开始涨分了(也确实涨过一次,涨了3分,笑哭跟没涨一样),结果昨天那一场比赛打的不是很如意,掉了挺多分的,而且我感觉第一和第二道,不应该难住我的,这只能说明自己对比赛的一些反应还不够快,不能够快准狠的解决自己能力范围内的题,而且对一些题的思路,开始想的不是很准确,容易在错误的方向回不了头,没办法快速解决一些超时问题。本周新知识的学习:引入了数论,首先这是一个新的方向,但仍有接触过的

oracle min(date),Oracle / PLSQL MIN函数_西西nayss的博客-程序员秘密

这个Oracle教程解释了如何使用Oracle / PLSQL MIN函数。Oracle / PLSQL MIN函数返回表达式的最小值。MIN 函数对一组行进行操作,并返回一行输出。您可以使用MIN具有任何有效表达式的函数。例如,您可以使用MIN()数字,字符串和数据时间。空值将被MIN函数忽略。您可以使用DISTINCT关键字排除重复条目。语法Oracle / PLSQL MIN函数的语法是:S...

windows密码_利用Frida重建著名的Windows通用密码后门_weixin_39725193的博客-程序员秘密

在本文中,我们将以重建著名的本地Windows密码后门为例,为读者演示如何利用Frida,通过动态插桩技术实现软件的快速探查与原型构建。 搭建Frida环境首先,我们来介绍如何安装和配置Frida。本文中,我们将使用基于Python的标准Frida环境,因为它提供了许多简单易用的工具,非常便于上手。为此,只需在Windows上安装好Python,然后,在命令行环境中执行pip install fr...

layui修改单元格数据_Sunlalalla的博客-程序员秘密_layui 修改单元格内容

参考:layui官网:https://www.layui.com/demo/table/cellEdit.htmlhttps://www.layui.com/demo/table/cellEvent.html修改单元格的js方法 //监听单元格编辑 table.on('edit(levelTableFilter)', function (obj) { ...

综合处理 'conda' 不是内部或外部命令,也不是可运行的程序 或批处理文件。_yelly0的博客-程序员秘密_conda list不是内部或外部命令

问题描述:cmd中输入python正确,输入conda错误。电脑之前有python3.7的配置环境,一直用IDLE编程,后面安装Anaconda时,默认安装并没有手动添加path。使用Spyder编程时导入库一直出现ModuleNotFoundError: No module named 'XXX' ,而这些库是已经pip安装好并且在IDLE中可以正常import的。考虑这个问题应该还是由环境变量...

一个 Bug 引发的思考(超赞的文章)_非著名程序员_的博客-程序员秘密

【回复“1024”,送你一个特别推送】原文作者:董庆明原文地址:https://zhuanlan.zhihu.com/p/30576566特别声明:本文为董庆明原创并授权发布,未经原作者允许请勿转载,转载请联系原作者写在最前面~这篇文章是对前端定位方案的一篇总结,平日我们在前端开发过程中针对定位问题不会专门专注内部的实现原理,会直接调用封装好的库去实现定

随便推点

基于javaWeb的精品课程网站_qq_1262330535的博客-程序员秘密

在线精品课程学习网站,主要实现了课程简介,课程大纲,在线课件,教学视频,分为教师,学生,管理员三个用户,是基于SSH框架开发的,数据库采用了MYSQL数据库,编程语言java是一款原创的毕业设计精品题目。学生输入网址进入主页面,通过导航栏搜索自己想要查看的信息。学生可以点击“课程简介”、“课程大纲”、“演示课件”、“教学录像”跳转到相应的子页面;如:通过点击“单元习题”参加每单元知识的习题练习;通过点击“教师资料”来了解师资;还可以点击“电子邮件”对每个老师进行提问、交流学习心得等。不同的用户对系统的使

python导入mongodb_python 中导入mongodb 问题 报错_小6加油的博客-程序员秘密

raceback (most recent call last):File "/home/shenjianlin/.local/lib/python3.4/site-packages/twisted/internet/defer.py", line 653, in _runCallbackscurrent.result = callback(current.result, *args, **kw)...

MFC之套接字发送最简单例子_大树学长的博客-程序员秘密_mfc套接字实例

按钮事件中响应:CSocket m_sockRecv; m_sockRecv.Create(67, SOCK_DGRAM, "本地IP"); //绑定本地套接口 m_sockRecv.Bind(67, "本地IP"); char szRecv[100]; szRecv[0] = '1'; szRecv[1] = '2'; szRecv[2] = '3'; szRecv[3]

oracle returning into,PL/SQL 中Returning Into的用法_李小压的博客-程序员秘密

ORACLE的DML语句中可以指定RETURNING INTO语句。RETURNING INTO语句的使用在很多情况下可以简化PL/SQL编程,少一次select into语句。DELETE操作:RETURNING返回的是DELETE之前的结果;INSERT操作:RETURNING返回的是INSERT之后的结果;UPDATE操作:的RETURNING语句是返回UPDATE操作之后的结果。-- Cr...

牛客网-2018 美团 CodeM 编程大赛-初赛 B 轮-3-低位值_f_zyj的博客-程序员秘密

ACM模版描述题解一个规律题。默认,lll 取 000,考虑取 rrr,首先,如果有非最高位 111 存在 xxx 个,有第二个部分公式得答案加上 xxx,然后根据第三个公式得答案加 111 并且获取一个新的二进制串 r′r′r'(全是 111),以此类推,直到 r=0r=0r = 0。对于 rrr 我们需要考虑两种情况,因为上述循环的第一次取的 rrr 不一定全是 111...