基于51单片机水塔水位控制系统

news2025/1/21 2:58:13

基于51单片机水塔水位控制

(仿真+程序)

功能介绍

具体功能:

1.用滑动变阻器模拟水位,ADC0809将模拟信号转换为数字信号;

2.LCD1602显示当前水位和水位阈值;

3.当水位超过设定阈值,蜂鸣器+LED声光报警,并且电机转动(模拟排水);

4.三个按键可以设定水位阈值;

​演示视频:

基于51单片机水塔水位控制系统 

添加图片注释,不超过 140 字(可选)

程序

//程序头函数
#include <reg52.h>
#include <intrins.h>
/***公众号:木子单片机****/
//宏定义
#define uint unsigned int 
#define uchar unsigned char
#define Data_ADC0809 P1		//定义P1口为Data_ADC0809
 
//管脚声明
sbit LED_R= P2^2;			  //红色指示灯
sbit LED_G= P2^0;			  //绿色指示灯
sbit FENG = P2^5;			  //蜂鸣器
sbit san=P3^4;				  //继电器
//ADC0809
sbit ST=P3^3;
sbit EOC=P3^6;
sbit OE=P3^2;
//按键
sbit Key1=P2^6;
sbit Key2=P2^7;
sbit Key3=P3^7;

bit bdata flag;				  //定义位变量
uchar set;					  //设置变量

sbit RS=P2^3;
sbit RW=P2^1;
sbit EN=P2^4;
//ADC数值
uchar ADC_value=0;

//报警数值
uchar WARNING=25;		//报警值变量

//延时函数
void Delay1ms( int ms)
{                           
  int i;
  while(ms--)
  {
    for(i = 0; i< 250; i++)
    {
      _nop_();
      _nop_();
      _nop_();
      _nop_();
    }
  }
}

//检查忙函数
bit check()
{                         
  bit busy;
  RS=0;
  RW=1;
  EN=1;
  Delay1ms(2);
  EN=0;
  return busy;
}

//写指令函数
write_com(uchar zhi)
{
  while(check());
  RS=0;
  RW=0;
  EN=0;
  _nop_();
  _nop_();
  P0=zhi;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EN=1;	
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EN=0;	 
}

//写数据函数
write_data(uchar shu) 
{
  while(check());
  RS=1;
  RW=0;
  EN=0;
  _nop_();
  _nop_();
  P0=shu;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EN=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EN=0;
}

//初始化LCD函数
void Init1602()
{
  write_com(0x38);
  Delay1ms(1);
  write_com(0x0c);
  Delay1ms(1); 
  write_com(0x06);
  Delay1ms(1);
  write_com(0x01); 
  Delay1ms(1); 
}

//ADC0809读取信息
uchar ADC0809()
{
	uchar temp=0x00;
	//初始化高阻太
	OE=0;
	//转化初始化
	ST=0;
	//开始转换
	ST=1;
	Delay1ms(1);
	ST=0;
	//外部中断等待AD转换结束
	while(EOC==0)
	//读取转换的AD值
	OE=1;
	temp=Data_ADC0809;
	OE=0;
	return temp;
}

void Key()					  //按键函数
{
	if(Key1==0)				  //设置键按下
	{
		while(Key1==0);		  //按键松开
		FENG=0;				  //蜂鸣器响
		set++;				  //设置变量加
		flag=0;				  //关闭报警
		san=1;				  //关闭继电器
		TR0=0;				  //关闭定时器
	}
	if(set==1)				  //设置报警值时
	{
		write_com(0x38);//屏幕初始化
		write_com(0x80+0x40+13);//位置
   		write_com(0x0f);//打开显示 无光标 光标闪烁
   		write_com(0x06);//当读或写一个字符是指针后一一位
		FENG=1;				//关闭蜂鸣器

	}
	else if(set>=2)		//设置完成时
	{
		set=0;			//变量清零
		write_com(0x38);//屏幕初始化 
		write_com(0x80);
		write_com(0x0c);//打开显示 无光标 无光标闪烁
		FENG=1;			//关闭蜂鸣器
		flag=1;			//打开报警
		TR0=1;			//打开定时器
	}
	if(Key2==0&&set!=0)			//设置报警值时加键按下
	{
		while(Key2==0);			//按键松开
		FENG=0;					//打开蜂鸣器
		WARNING++;				//报警值加
		if(WARNING>=255)		//最大加到255
		WARNING=0;				//清零
		write_com(0x80+0x40+11);	   //选中液晶屏上的第二行第十一列
		write_data('0'+WARNING/100);   //开始显示报警值。例如报警值是123,123除以100的商是1,加上‘0’是为了得到液晶中对应1的显示码
		write_data('0'+WARNING%100/10);//123除以100的余数是23,23再除以10得到的商是2
		write_data('0'+WARNING%100%10);//23除以10的余数是3
		write_com(0x80+0x40+13);//位置
		FENG=1;						//关闭蜂鸣器
	}
	if(Key3==0&&set!=0)				//注释同加按键
	{
		while(Key3==0);
		FENG=0;
		WARNING--;
		if(WARNING<=0)
		WARNING=255;
		write_com(0x80+0x40+11);
		write_data('0'+WARNING/100);
		write_data('0'+WARNING/10%10);
		write_data('0'+WARNING%10);
		write_com(0x80+0x40+13);//位置
		FENG=1;
	}
}
//显示AD数值和报警数值
void Display1602(uchar tempADC,uchar tempWaring)
{
  const uchar buf1[]={"Level:"};
  const uchar buf2[]={"Setup:"};
  int i=0x00;
  uchar temp = 0;
  write_com(0x80|0x05); //第一行显示
  while(buf1[i]!=0)
  {
    write_data(buf1[i]);
    i++;
  }	
  temp =  tempADC/100 + '0';
  write_data(temp);
  temp =  tempADC%100/10 + '0';
  write_data(temp);
  temp =  tempADC%10 + '0';
  write_data(temp);
  write_data(' ');
  write_data(' ');


  write_com(0x80|0x45); //第二行显示
  i=0x00;
  while(buf2[i]!=0)
  {
    write_data(buf2[i]);
    i++;
  }
  temp =  tempWaring/100 + '0';
  write_data(temp);
  temp =  tempWaring%100/10 + '0';
  write_data(temp);
  temp =  tempWaring%10 + '0';
  write_data(temp);
}

void init()				//定时器初始化函数
{
	TMOD=0x01;			//定时器工作方式
 	TL0=0xb0;
 	TH0=0x3c;			//赋初值50ms
 	EA=1;				//打开中断总开关
	ET0=1;				//打开定时器0中断允许开关
 	TR0=1;				//打开定时器0定时开关
}

void main()				//主函数
{
	Init1602();						 //初始化液晶函数
	init();							 //初始化定时器
	while(1)						 //进入循环
	{
		ADC_value=ADC0809();				 //读取AD数值
		if(set==0)					 //set为0,说明现在不是设置状态
			Display1602(ADC_value,WARNING);	 //显示AD数值和报警值
		if(ADC_value<WARNING&&set==0)	 //AD数值小于报警值
		{
			flag=0;					 //关闭报警
		}
		else if(ADC_value>WARNING&&set==0)//AD值大于报警值
		{
			flag=1;					 //打开报警
		}
		Key();						 //调用按键函数
	}
}
void  time1_int(void) interrupt 1		  //定时器工作函数
{
	uchar count;						  //定义计时变量
	TL0=0xb0;
 	TH0=0x3c;							  //重新赋初值50ms
  	count++;							  //变量加一次就是50ms
	if(count==10)						  //加到10次就是500ms
	{
		if(flag==0)						  //flag=0时,也就是不开启报警
		{
			LED_G=0;					  //绿灯点亮
			LED_R=1;					  //红灯熄灭
			FENG=1;						  //关闭蜂鸣器
			san=1;						  //关闭继电器
		}
		if(flag==1)						  //flag为1时,也就是打开报警
		{
			LED_G=1;					  //绿灯熄灭
			LED_R=0;					  //红灯点亮
			FENG=0;						  //打开蜂鸣器
			san=0;						  //打开继电器
		}
	}

   	if(count==20)						  //计数20次,就是1s
   	{									  //在1s时,红绿灯都是熄灭状态,蜂鸣器也是关闭状态,装可以达到闪烁的目的
		count=0;						  //变量清零
		if(flag==0)						  //不是报警状态时
		{
			LED_G=1;
			LED_R=1;
			FENG=1;
			san=1;						  //都关闭
		}
		if(flag==1)						  //报警状态时
		{
			LED_G=1;
			LED_R=1;
			FENG=1;
			san=0;						  //继电器一直吸和
		}
	}
} 

硬件设计

使用元器件:

单片机:AT89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用proteus7.8和proteus8.9两个版本设计!具体如图!

添加图片注释,不超过 140 字(可选)

02程序

本设计使用软件keil4和keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

03设计资料

         资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)等。具体内容如下,全网最全! !

资料获取请观看前面演示视频!

点赞分享一起学习成长。

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

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

相关文章

STM32智能小车学习笔记(避障、循迹、跟随)

我们使用的是STM32CubeMX软件和MDK5 芯片使用的是STM32F103C8T6 完成对STM32CubeMX的初始化后开始我们的第一步点亮一个LED灯 一、点亮LED灯 点亮PC13连接的灯 打开STM32CubeMX软件&#xff0c;pc13设置为输出模式 然后按照这样配置&#xff0c;user label 设置成这个IO口代…

Go微服务: 关于消息队列的选择和分类以及使用场景

消息队列概述 在分布式系统和微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是一个核心组件&#xff0c;用于在不同的应用程序或服务之间异步传递消息在 Go 语言中&#xff0c;有多种实现消息队列的方式&#xff0c;包括使用开源的消息队列服务&…

2024 年最全的 21 款数据恢复工具软件汇总

使用其中任何一款免费数据恢复工具&#xff0c;您都可以找回那些您认为已经永远消失的文件。我根据这些程序对我而言的易用性和它们提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者都安装…

附录二-nmap基本用法

参考 黑客工具—Nmap的使用_哔哩哔哩_bilibili nmap是扫描IP和端口的&#xff0c;相当于攻击前的索敌步骤。不止网络安全方面会用到&#xff0c;平时运维的时候也会用到nmap 1 下载nmap nmap官网 https://nmap.org/ 点击下载&#xff0c;然后点你用的平台就行了 往下滚可以…

[职场] 硬件研发是什么职业 #职场发展#其他

硬件研发是什么职业 硬件研发工程师需要具备丰富的电子电路知识、熟练掌握各种电子元器件的性能及应用、具备一定的机械结构设计能力&#xff0c;同时还要具备良好的团队协作和沟通能力。本文会进行详细介绍。 一、硬件研发是什么 硬件研发&#xff0c;全称硬件研发工程师&am…

一文搞懂Python的异常

人生之事,不如意者十之有九。 在编程中亦是如此。异常(Exception),遍布于程序各个角落,开发工作的大部分coding,都是为了应对和解决它。 概念 异常,简而言之,是程序在执行期间发生的非预期的、非正常的事件或情况。 举个实际生活的例子: 你周末出门买大龙虾,但当你…

Vue-App桌面程序列表

Vue-App桌面程序列表 文章说明讲解视频核心代码效果展示项目链接 文章说明 采用Vue实现PC端的桌面程序列表&#xff0c;采用HBuilderX将程序转化为5App&#xff0c;实现移动端的适配&#xff1b;支持桌面打开新应用&#xff0c;底部导航展示当前应用列表&#xff0c;可切换或关…

用你熟悉的语言就能开发智能合约,Vara Network 以 WASM 解锁未来应用创新

Vara Network 自推出以来&#xff0c;凭借其基于 Gear Protocol 的独特架构和强大的开发工具&#xff0c;为开发者提供了一个高效、安全的智能合约构建平台。Vara Network 通过采用先进的 Actor 模型、持久内存概念和 WebAssembly 技术&#xff0c;实现了异步消息处理、并行计算…

在线OJ项目测试(selenium+Junit5)

目录 在线OJ项目测试的思维导图 在线OJ的UI自动化测试 测试一&#xff1a;检查未登录时的页面访问以及一些未登录时的非法操作 测试二&#xff1a;测试注册界面 测试三&#xff1a;测试登录界面 测试四&#xff1a;测试题目列表界面 测试五&#xff1a;测试题目详情界面…

Android Kotlin 异步操作回调转换为挂起函数

异步接口回调是一种通过接口将任务的执行和结果处理分离开来的编程设计模式。通常用于网络请求、数据库查询等耗时操作。 挂起函数是 Kotlin 中的一个特性&#xff0c;用于简化异步编程。挂起函数是可以在协程中暂停执行并恢复的函数&#xff0c;避免了回调地狱问题&#xff0…

php质量工具系列之PHPCPD

PHPCPD 用于检测重复代码&#xff0c;直观的说就是复制粘贴再稍微改改 该工具作者已经 停止维护 安装 composer global require --dev sebastian/phpcpd执行 phpcpd --log-pmd phpcpd_result.xml ./app参数介绍 --log-pmd 将结果保存在phpcpd_result.xml 中 ./app 是phpcpd扫…

linux系统PXE自动装机和无人值守

一、PXE 1.PXE&#xff1a;c/s模式&#xff0c;允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像&#xff0c;加载安装文件&#xff0c;实现自动化安装操作系统。&#xff08;c/s客户端和服务端都可以是多台&#xff09; 2.PXE优点&#xff1a;规模…

【机器学习基础】Python编程08:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

基于STM32开发的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现&#xff1a;实现智能家居监控系统 4.1 传感器数据读取4.2 电器设备控制4.3 实时数据监控与分析4.4 用户界面与数据可视化应用场景&#xff1a;家庭安全监控与管理问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的发…

AI绘画中的图像格式技术

在数字艺术的广阔天地里&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;正在逐渐占据一席之地。不同于传统绘画&#xff0c;AI绘画依赖于复杂的算法和机器学习模型来生成图像&#xff0c;而这一切的背后&#xff0c;图像格式技术发挥着至关重要的作用。图像格式不仅关系…

23 二叉搜索树

本节目标 1.内容安排说明 2.二叉搜索树实现 3.应用分析 4.进阶题 1. 内容安排说明 二叉树在c数据结构已经说过了&#xff0c;本节内容是因为&#xff1a; map和set特性需要先铺垫二叉搜索树&#xff0c;而二叉搜索树也是一种树形结构二叉搜索树的特性了解&#xff0c;有助于…

LNMP与动静态网站介绍

Nginx发展 Nginx nginx http server Nginx是俄罗斯人 Igor Sysoev(伊戈尔.塞索耶夫)开发的一款高性能的HTTP和反向代理服务器。 Nginx以高效的epoll.kqueue,eventport作为网络IO模型&#xff0c;在高并发场景下&#xff0c;Nginx能够轻松支持5w并发连接数的响应&#xff0c;并…

OrangePi AIpro Ubuntu 22.04 aarch64 安装MySql 8.0

查看MySQL安装包 接下来可以使用以下命令安装MySQL服务器&#xff1a; 安装MySQL 8.0 # 安装最新版本 sudo apt install -y mysql-server # 安装指定版本 sudo apt install -y mysql-server-8.0初始化配置信息 sudo mysql_secure_installationVALIDATE PASSWORD COMPONENT ca…

算法分析与设计期末考试复习(更新ing)

重点内容&#xff1a; 绪论&#xff1a; 简单的递推方程求解 1.19(1)(2) 、 教材例题 多个函数按照阶的大小排序 1.18 分治法&#xff1a; 分治法解决芯片测试问题 计算a^n的复杂度为logn的算法&#xff08;快速幂&#xff09; 分治法解决平面最近点对问…

SecureCRT[po破] for Mac SSH终端操作工具[解] 安装教程

文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、 应用程序显示软件图标&#xff0c;表示安装成功 三、输入对应参数1、解决“软件已损坏&#xff0c;无法打开&#xff0c;要移到废纸篓”问题解决步骤…