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

基于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)		//最大加到255WARNING=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得到的商是2write_data('0'+WARNING%100%10);//23除以10的余数是3write_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;			//赋初值50msEA=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;							  //重新赋初值50mscount++;							  //变量加一次就是50msif(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.mzph.cn/bicheng/24855.shtml

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

相关文章

MySQL基础_10.约束

文章目录 第一章、约束1.1 约束的定义1.2 非空约束1.3 唯一性约束1.4 主键约束1.5 自增列1.6 外键约束1.7 CHECK约束1.8 DEFAULT约束 第一章、约束 1.1 约束的定义 约束是对表中字段的限制。 约束按照作用范围可以分为&#xff1a;列级约束和表级约束 列级约束&#xff1a;声…

【二进制部署k8s-1.29.4】十二、ingress-nginx的安装部署

文章目录 简介 一.ingress的安装一.验证安装 简介 本章节主要讲解安装ingress-nginx-v1.10.1的安装&#xff0c;ingress的安装比较简单&#xff0c;只需要下载yaml文件&#xff0c;修改一下镜像地址&#xff0c;原本的镜像地址由于墙的原因&#xff0c;没法直接下载&#xff0c…

C++网络编程——多路IO复用 重点epoll

前言补充 阻塞与非阻塞 同步阻塞IO &#xff08;Blocking IO) : 传统IO模型 同步非阻塞IO &#xff08;Non-blocking IO)&#xff1a; 默认创建的socket都是阻塞的&#xff0c;若是要设置成非阻塞IO需要socket被设置成NONBLOCK。 IO多路复用&#xff08;IO Multiplexing&…

微软 Windows 10 22H2 发布可选更新 19045.4474,修复窗口显示问题等

微软今天面向 Windows 10 22H2 版本&#xff0c;发布了 KB5037849 非安全可选更新&#xff0c;用户安装后版本号升至 Build 19045.4474。 IT之家 5 月 30 日消息&#xff0c;微软今天面向 Windows 10 22H2 版本&#xff0c;发布了 KB5037849 非安全可选更新&#xff0c;用户安…

内部资料13000+变现资源,写作副业项目,找灵感就用它!

很多刚学在公众号&#xff0c;或是在其他自媒体平台写副业项目的朋友&#xff0c;写一段时间后会发现找不到写的内容。于是&#xff0c;每天都会为写什么而苦恼&#xff0c;找不到素材&#xff0c;没有灵感。 关注富哥资源站的朋友都知道&#xff0c;咱们的资源站已经更新了内…

2024 Jiangsu Collegiate Programming Contest E. Divide 题解 主席树

Divide 题目描述 Given an integer sequence a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​ of length n n n. For an interval a l , … , a r a_l,\ldots,a_r al​,…,ar​ in this sequence, a Reduce operation divides the maximum value of the inter…

【NI国产替代】产线测试:数字万用表(DMM),功率分析仪,支持定制

数字万用表&#xff08;DMM&#xff09; • 6 位数字表显示 • 24 位分辨率 • 5S/s-250KS/s 采样率 • 电源和数字 I/O 均采用隔离抗噪技术 • 电压、电流、电阻、电感、电容的高精度测量 • 二极管/三极管测试 功率分析仪 0.8V-14V 的可调输出电压&#xff0c;最大连…

[Cloud Networking] Layer Protocol (continue)

文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP 攻击 4. IPSEC / MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路&#xff1a;通过阻断冗余…

shell脚本基础教程

快捷目录 1、解释器2、shell脚本调用方式3、变量自定义变量环境变量特殊变量变量的默认值declare 命令readonly命令let命令 4、数据类型字符串 5、字符串操作6、数组定义数组读取数组修改数组删除数组获取数组长度 7、运算符算术运算符关系运算符布尔运算符逻辑运算符 要在[[ ]…

求极差(range)

题目描述 小红拿到了一个数组&#xff0c;其中每个元素都是素数。小红准备进行若干次以下操作&#xff1a; 选择两个素数元素&#xff0c;将他们合并&#xff0c;生成的新元素为原来两个素数的乘积。 现在小红希望操作到不能再操作为止&#xff0c;然后使得最终的极差&#…

王道408数据结构CH4_串

概述 4 串 4.1 串的实现 4.1.1 存储结构 定长顺序存储 #define Maxsize 255typedef struct{char *ch[Maxsize];int length; }SString;堆分配存储 typedef struct{char *ch;int length; }HString;块链存储 4.1.2 基本操作 4.2 模式匹配&#xff08;子串定位&#xff09; 4.2.…

Docker面试整理-Docker Swarm是什么?

Docker Swarm 是 Docker 的原生集群管理和编排工具,用于将多个 Docker 主机集合成一个虚拟的 Docker 主机。它允许你在多台机器上部署、管理和扩展容器化应用,是构建和管理容器化应用的高可用集群的一种方式。 Docker Swarm 的核心特性包括: 1. 集群管理: ● Docker Swarm…

RaspAP:轻松实现树莓派无线 AP

RaspAP 是一个可以将树莓派轻松部署成无线 AP&#xff08;Access Point&#xff09;的软件方案&#xff0c;具有一套响应式的 WebUI 来控制 WiFi&#xff0c;用起来和家用路由器一样方便。RaspAP 可以运行在 Raspbian 上&#xff0c;只需要先给树莓派安装好 Raspbian 系统&…

12寸晶圆厂建设概述

1、关键步骤 半导体12英寸&#xff08;12吋&#xff09;晶圆厂的建厂过程是一个复杂且耗时的工程&#xff0c;涉及到多个阶段&#xff0c;包括但不限于以下几个关键步骤&#xff1a; 1. **项目规划与设计**&#xff1a;首先需要进行项目的可行性研究&#xff0c;确定产品定位…

docker和docker-compose的安装

docker的安装 1.安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun2.设置开机自启动 systemctl start docker #启动docker systemctl enable docker3.配置阿里云镜像 不配置镜像的话&#xff0c;进行 docker pull 等操作会比较慢。进入阿里云&…

Hudi Spark Sql Procedures 回滚 Hudi 表数据

前言 因为有 Hudi Rollback 的需求,所以单独总结 Hudi Spark Sql Procedures Rollback。 版本 Hudi 0.13.0(发现有bug)、(然后升级)0.14.1Spark 3.2.3Procedures 官方文档:https://hudi.apache.org/docs/procedures 相关阅读:Hudi Spark SQL Call Procedures学习总结…

【NI国产替代】电池模拟器,快速模拟 3C 产品电池的充放电功能

电池模拟器 快速模拟 3C 产品电池的充放电功能输出灵活可调节的电压/电流内置双向 DC-DC 降压变换器为 3C 产品提供漏电检测 电池模拟器系列包含单节双通道&#xff08;1S&#xff09;、双节双通道&#xff08;2S&#xff09;、三节单通道&#xff08;3S&#xff09;三种规格&…

C++基础与深度解析 | 异常处理 | 枚举与联合 | 嵌套类与局部类 | 嵌套名字空间与匿名名字空间 | 位域与volatile关键字

文章目录 一、异常处理二、枚举与联合三、嵌套类与局部类四、嵌套名字空间与匿名名字空间五、位域与volatile关键字 一、异常处理 异常处理用于处理程序在调用过程中的非正常行为。 传统的处理方法&#xff1a;传返回值表示函数调用是否正常结束。 例如&#xff0c;返回 0 表示…

中介子方程七

X$XFX$XEXyXαXiX$XαX$XiXαXyXEX$XFX$XEXyXαXiX$XαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαX$XiXαXyXEX$XαXeXyX$XdX$XpX$XdX$XhXαXeX$XηXqXαXpX$XWXyX$XyXWX$XαXtXηXαXpX$XEX$XZX$XpXαXηXtXαX$XWXyX$…

SpringBoot+Vue教师工作量管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 教师管理员 功能截图