【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设计,视频分享,技术交流。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值