基于51单片机控制恒压供水系统设计

文章目录

  • 前言
  • 资料获取
  • 设计介绍
  • 功能介绍
  • 设计程序
  • 具体实现截图
  • 文档目录
  • 设计获取


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

恒压供水系统是指用户端不管用水量大小,总保持管网中水压基本恒定。这样,既可满足各部位的用户对用水量的需求。又不会产生电动机空转,造成电能的浪费。为实现上述目标,需要变频器根据给定压力信号和反馈压力信号,调节水泵转速,从而达到控制管网中水压恒定的目的。一般的恒压供水系统是由单片机、变频器、压力传感器等器件组成的压力闭环控制系统。其原理是将压力变成模拟信号,经过一系列的转换最终调解水泵的转速,按实际用水量供水并使压力恒定。随着社会的发展,水在人们生活中越来越重要,随之便是科技的成果——恒压供水系统。现在很多地方面临水资源短缺,水污染严重的威胁,且不同时段对供水压力要求不一,单靠水厂人员根据往常经验进行手动调节很难处理供水问题。但现在国内的一些恒压供水系统存在很多缺点如下:
(1)耗能大,浪费水电资源;
(2)水压不稳,容易发生事故;
(3)供水质量差,影响人体健康;
(4)运行效率低,很难满足供水需求;
(5)自动化程度低,操作麻烦;
因此研究设计恒压供水系统显得非常重要。

功能介绍

了解基于单片机的恒压供水系统的运作,优缺点;对其发展趋势进行认识,为研发生产新型供水系统作好准备。毕业设计的具体内容:
(1)设计通过压力传感器、控制器和变频器组成闭环回路自动调节电机的转速,从而调节水泵 的供水量,确保供水压力恒定。
(2)设计以单片机为主控制器,系统通过压力传感器对压力进行采集,经过A/D转换送入主控制器,变频器控制电机水泵机组。
(3)系统能够实时显示水管的压力值、变频器的频率和各水泵工作的时间及控制参数。
(4)设计键盘模块要求能输入任意设定值。结合上述课题研究的主要内容,预期通过压力传感器,控制器和变频器组成闭环回来路来控制电机水泵组来实现恒压供水,并用显示管显示水管的一些数据。

设计通过控制变频器的输出频率从而自动调节水泵电机的转速,实现管网水压的闭环调节, 使供水系统自动恒压值稳于设定的压力值。

用户可以自行设定水管中的水压,低功耗低噪音高性能高寿命的特点使得本设计在同类产品中脱颖而出。

设计程序

#include <reg52.h>
/*---------------宏定义-----------------*/
#define uint unsigned int 
#define uchar unsigned char
#define PWM_CYC		50		//PWM周期
#define AUTO_SPEED   2000   //数字越大越慢
#define delay(x) {uint i,j;for(i = x;i>0;i--)for(j=50;j>0;j--);}
#define THC0  ((65536 - 10000)/256)			//10ms定时器定时值   
#define TLC0  ((65536 - 10000)%256)
/*--------------引脚定义-----------------*/
/* AD0809引脚 */
sbit OE  = P3^7;
sbit EOC = P3^6;
sbit ST  = P3^5;
sbit CLK = P3^4;
sbit ALE = P3^3;
#define ADCV    P1
/* lcd016 引脚 */
sbit RS = P2^0;
sbit RW = P2^1;
sbit E  = P2^2;
#define LCDData  P0
/* 按键 */
sbit BTN_UP = P2^3;
sbit BTN_DN = P2^4;
sbit BTN_AUTO = P2^5;
/* 电机PWM脚 */
sbit PWM    = P2^7;
/* LED */
sbit LED   = P2^6;
/*---------------全局变量----------------*/
const uchar display1[] = "set pressure    ";
const uchar display2[] = "cur pressure    ";
uchar water_vol=0;		//水压
uchar set_vol = 150;		//设置压力
uchar motor_speed = 6; //电机速度
uchar auto_flag = 0;
/*---------------全局函数----------------*/
void LCD_init();												//LCD初使化
void Display(uchar setv,uchar waterv);  //显示程序
uchar Get_WaterV(void);									//水压获取
void Moter_Drive(void);									//电机驱动
void SetVol_UP(void);										//设定压力加
void SetVol_DN(void);										//设定压力减
void SetMotorSpeed(void);								//电机速度设置
void Key_Scan(void);										//按键扫描
void AutoSpeed(void);										//自动模式
void SetVol_AUTO(void);									//手动 自动 切换
/*---------------------------------
* 函数:SysTemInit 初使化
*----------------------------------*/
void SysTemInit(void)
{TMOD = 0x02;		//定时器0 采用16位定时器TH0 = THC0;			//设定定时值TL0 = TLC0;ET0 = 1;				//定时器T0 溢出中断允许TR0 = 1;				//启动定时器0EA = 1;					//中断总开关开LED = 0;
}
/*---------------------------------
* 函数:main 程序主入口
*----------------------------------*/
void main(void)
{static char showcount=0;PWM = 0;SysTemInit();LCD_init();for(;;){Moter_Drive();				//PWM驱动电机		if(auto_flag==0)water_vol = Get_WaterV();    //手动模式时获取水压else AutoSpeed();				showcount++;Key_Scan();							//扫描按键、if(showcount == 100)			{				Display(set_vol,water_vol);	 //显示				SetMotorSpeed();						 //调整速度showcount = 0;}}
}/*---------------------------------
* 函数:time0 10ms定时器0中断入口  用于ADC时钟
*----------------------------------*/
void time0() interrupt 1
{CLK = ~CLK;
}
/*---------------------------------
* 函数:SetMotorSpeed 设置电机速度
*----------------------------------*/
void SetMotorSpeed(void)
{if(water_vol > set_vol)			//如果测到的水压大于设置压力{if(motor_speed > 4)motor_speed--;			//控制占空比增大 电机减速}else if(water_vol < set_vol){if(motor_speed < 40) motor_speed ++; //控制占空比减小 电机增速}
}
/*---------------------------------
* 函数:AutoSpeed 自动速度
*----------------------------------*/
void AutoSpeed(void)
{static uint auto_speed = 0;    //自动的速度控制auto_speed ++;if(auto_speed == AUTO_SPEED){if(water_vol > set_vol)			//如果测到的水压大于设置压力{water_vol--;			//控制占空比增大 电机减速}else if(water_vol < set_vol){water_vol++; //控制占空比减小 电机增速}auto_speed = 0;}	
}
/*---------------------------------
* 函数:Key_Scan 按键扫描
*----------------------------------*/
void Key_Scan(void)
{static uchar keyupstate = 0;static uchar keydnstate = 0;static uchar keyupcount = 0;static uchar keydncount = 0;static uchar keyautostate = 0;static uchar keyautocount = 0;switch(keyupstate)					//按键加状态{case 0:if(BTN_UP == 0)      		//如果加键按下{keyupcount++;			 		//记录if(keyupcount>1)	 {keyupstate = 1;			//记录超过3次跳转到按下状态keyupcount = 0;}}else keyupcount = 0;				break;case 1:SetVol_UP();						//确认按键已按下运行一次keyupstate = 2;break;case 2:if(BTN_UP)				    	//按键松开恢复状态{keyupstate = 0;keyupcount = 0;				}break;}switch(keydnstate)					//按键减状态{case 0:if(BTN_DN == 0)      		//如果加键按下{keydncount++;			 		//记录if(keydncount>1)	 {keydnstate = 1;			//记录超过3次跳转到按下状态keydncount = 0;}}else keydncount = 0;				break;case 1:SetVol_DN();						//确认按键已按下运行一次keydnstate = 2;break;case 2:if(BTN_DN)				    	//按键松开恢复状态{keydnstate = 0;keydncount = 0;				}break;}switch(keyautostate)					//按键自动控制状态{case 0:if(BTN_AUTO == 0)      		//如果加键按下{keyautocount++;			 		//记录if(keyautocount>1)	 {keyautostate = 1;			//记录超过3次跳转到按下状态keyautocount = 0;}}else keyautocount = 0;				break;case 1:SetVol_AUTO();						//确认按键已按下运行一次keyautostate = 2;break;case 2:if(BTN_AUTO)				    	//按键松开恢复状态{keyautostate = 0;keyautocount = 0;				}break;}
}
/*---------------------------------
* 函数:SetVol_AUTO 自动手动切换
*----------------------------------*/
void SetVol_AUTO(void)
{if(auto_flag == 0) {auto_flag = 1;LED = 1;}else{auto_flag = 0;LED = 0;}
}
/*---------------------------------
* 函数:SetVol_UP 压力加
*----------------------------------*/
void SetVol_UP(void)
{if(set_vol<255)		set_vol+=5;         //设置压力步进5	
}
/*---------------------------------
* 函数:SetVol_Dn 压力减
*----------------------------------*/
void SetVol_Dn(void)
{if(set_vol>0) set_vol-=5;							//设置压力步进5
}
/*---------------------------------
* 函数:Moter_Drive 电机驱动
* 参数:cmd  指令
*----------------------------------*/
void Moter_Drive(void)
{static uchar cnt = 0;	cnt++;if(cnt < motor_speed) PWM = 1;  //通过执行空语句来实现空占比else PWM = 0;if(cnt > PWM_CYC) cnt = 0;
}
/*---------------------------------
* 函数:Get_WaterV 获取水压
* 返回:滑动变阻器电压值 0-255 对应0-5V
*----------------------------------*/
uchar Get_WaterV(void)
{uchar vol = 0;  //定义一个变量来存储获取到的数值ST = OE = 0;   //关闭STE、OE通道ALE = 1;       //开放ALE通道ST = 1;		//启动STARTALE = 0;	//关闭ALE通道ST = 0;		//关闭STARTwhile(EOC == 0);  //读取数值直到停止信号OE = 1;      //数据允许通道打开vol = ADCV;  //将获取到的数值赋值给全局变量ADCVreturn vol;
}
/*---------------------------------
* 函数:Write_cmd LCD写指令
* 参数:cmd  指令
*----------------------------------*/
void Write_cmd(uchar cmd)
{RS=0;RW=0;LCDData=cmd;delay(1);E=1;delay(1);E=0;
}
/*---------------------------------
* 函数:Write_data LCD写数据
* 参数:date  数据
*----------------------------------*/
void Write_data(uchar date)//
{RS=1;RW=0;LCDData=date;delay(1);	E=1;delay(1);E=0;
}
/*---------------------------------
* 函数:LCD_init LCD初使化
*----------------------------------*/
void LCD_init()
{E=0;Write_cmd(0x38); //16*2,5*7,8 位数据Write_cmd(0x0c); // 显示开,光标不显示,不闪烁Write_cmd(0x06); // 地址加1,光标加1,整屏不移动Write_cmd(0x80); // 地址初始
}
/*---------------------------------
* 函数:Display LCD显示
* 参数:setv  设置压力
*       waterv  当前水压
*----------------------------------*/
void Display(uchar setv,uchar waterv)
{uchar i;//Write_cmd(0x01); // 清屏for(i = 0;i < 17;i++)	 //显示第一行{Write_data(display1[i]);}Write_cmd(0x80+0x40);		 //显示第二行for(i = 0;i < 17;i++){Write_data(display2[i]);}Write_cmd(0x80 + 13);						//第一行第13位开始显示设置压力Write_data(0x30 + setv/100);Write_data(0x30 + setv%100/10);Write_data(0x30 + setv%10);				Write_cmd(0x80 + 0x40 + 13);		//第二行第13位开始显示当前压力Write_data(0x30 + waterv/100);Write_data(0x30 + waterv%100/10);Write_data(0x30 + waterv%10);}

具体实现截图

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

文档目录

目录
1引 言 4
1.1 课题研究背景及意义 4
1.2 国内外研究现状 4
1.3 本课题主要研究内容 5
1.4 设计目标 5
2系统总体方案设计 6
2.1 硬件设计方案 6
2.2 软件设计方案 7
3恒压供水系统硬件设计 9
3.1 时钟模块设计 9
3.2 复位电路的设计 10
3.3 按键接口模块设计 11
3.4 转换模块(A/D)选型 11
3.5 显示模块设计及选型 16
3.6 电机控制设计及选型 17
3.7 稳压电源模块 17
4恒压供水系统软件设计 19
4.1 软件设计原理及设计所用工具 19
4.2 主程序流程图 19
4.3 按键扫描程序 20
4.4 获取水压程序 24
4.5 驱动电机程序 24
4.6 动态显示压力程序 26
4.7 系统测试仿真 29
结论 32
谢辞 33
参考文献 34
附 1 系统的原理电路图 35
附 2 系统的相关程序 36

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

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

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

相关文章

手把手教您轻松实现微信/QQ/TIM多开,消息防撤回!

文章目录 📖 介绍 📖🏡 环境 🏡📒 防回撤 📒🚀 自动补丁工具(支持多开,支持微信、QQ、TIM)🚀 最新版手动补丁📝 步骤一📝 步骤二⚓️ 相关链接 ⚓️📖 介绍 📖 在日常聊天中,微信消息被撤回的情况屡见不鲜,总让人心中充满好奇——那些被删去的内容…

【c数据结构】OJ练习篇 帮你更深层次理解链表!(相交链表、相交链表、环形链表、环形链表之寻找环形入口点、判断链表是否是回文结构、 随机链表的复制)

目录 一. 相交链表 二. 环形链表 三. 环形链表之寻找环形入口点 四. 判断链表是否是回文结构 五. 随机链表的复制 一. 相交链表 最简单粗暴的思路&#xff0c;遍历两个链表&#xff0c;分别寻找是否有相同的对应的结点。 我们对两个链表的每个对应的节点进行判断比较&…

量化交易----数据透视表----融资融券优惠代码

我们在制定和执行量化策略的过程中&#xff0c;常常需要快速检查目标因子组合的分组下portfolio的超额收益&#xff0c;我们来提供一个快速的方法&#xff0c;可以实现单因子分组&#xff0c;双因子分组和三因子分组 比如拿到一个分析师预测的数据库&#xff0c;和A股市场政策…

python:django项目知识点02——搭建简易授权码核销系统

前言 如标题所述&#xff0c;本篇博客主要围绕快速搭建业务系统展开&#xff0c;旨在&#xff1a;快速、逻辑分明。 适用对象 djangomysql&#xff0c;实现一套授权码核销功能&#xff0c;包含用户登录和授权码核销两个方面内容 业务代码 前述 基础代码已在上篇博客中讲述&…

Vue3:provide-inject实现组件通信

目录 一.作用 1.跨层级通信 2.避免重复声明 3.封装通用服务 二.性质 1.非响应式 2.不可选项 3.高级用法 三.使用 1.爷组件 2.父组件 3.子组件 四.代码 1.爷组件代码 2.父组件代码 3.子组件代码 五.效果 Vue3中的provide-inject机制是用于在组件树中进行依赖注…

01【MATLAB】最小二乘系统辨识

目录 1.系统辨识的定义及其分类 1.1 系统辨识的定义 1.2 系统辨识的分类 2.参数模型 3.系统辨识的步骤 一、最小二乘法&#xff08;Least Squares Method&#xff09;一般步骤 二、LSM原理及应用 三、LSM在控制系统建模中的应用 1.系统辨识的定义及其分类 1.1 系统辨识的…

有没有适合初学者的 OpenLayers 项目实战案例推荐?

对于初学者来说&#xff0c;OpenLayers 提供了一系列实用的项目实战案例&#xff0c;可以帮助你快速上手并掌握关键的开发技能。以下是一些推荐的入门项目案例&#xff1a; 1.基础地图显示&#xff1a; 学习如何创建一个简单的地图视图&#xff0c;并加载基础的地图图层&…

19个邮件群发小技巧,最大水平充分利用邮件营销

邮件群发在现代通信中占据着非常重要的位置。无论是在商业环境还是个人生活中&#xff0c;它都有着广泛的应用。无论您是公司的市场推广专家&#xff0c;还是社交团体的筹办者&#xff0c;掌握有效的邮件群发技巧会帮助您更好地传递信息、节约时间和提升工作效率。 确定目标受众…

DK5V100R20S双引脚同步整流芯片12V 2.4A封装SM-7

高性能双引脚同步整流芯片 DK5V100R20S是一款简单高效率的同步整流芯片&#xff0c;只有A&#xff0c;K两个引脚&#xff0c;分别对应肖特基二极管PN管脚。芯片内部集成了100V功率NMOS管&#xff0c;可以大幅降低二极管导通损耗&#xff0c;提高整机效率&#xff0c;取代或替换…

Debian安装mysql遇到的问题解决及yum源配置

文章目录 一、安装mysql遇到的问题解决二、Debain系统mysql8.0的安装以及远程连接三、彻底卸载软件四、Python 操作 mysql五、debian软件源source.list文件格式说明1. 第一部分2. 第二部分3. 第三部分4. 第四部分5. 关于源的混用问题6. 按需修改自己的sources.list7. 更新软件包…

详解运行时安全检测神器:Falco

在当今快速发展的云计算和容器技术时代,安全已成为组织面临的一大挑战。随着云原生应用的普及,传统的安全措施已不足以应对复杂的分布式环境。在这样的背景下,Falco应运而生,成为云原生安全领域的一颗新星。目前在github中&#xff0c;该项目已经拥有了7.3k的star&#xff0c;众…

显示和隐藏图片【JavaScript】

使用 JavaScript 来实现显示和隐藏图片。下面是一个简单的示例&#xff0c;展示如何通过按钮点击来切换图片的可见性。 实现效果: 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name&…

Sample Packing:长序列 LLM 训练的 Attention 问题及优化

一、背景 之前看过部分 Megatron-LM 的源码&#xff0c;也详细分析过对应的 Dataset 和 DataLoader&#xff0c;想当然的认为在 LLM 预训练时会使用 Document Level 的 Mask&#xff0c;也就是常说的 Sample Packing 技术。最近我们在做长序列训练相关工作时发现并非如此&…

灰狼算法求解函数,MATLAB代码

目录 程序说明 概述 主要功能 关键函数 结论 程序说明 概述 该程序实现了灰狼优化算法&#xff08;GWO&#xff09;&#xff0c;用于求解优化问题。该算法模拟灰狼的捕猎行为&#xff0c;通过种群搜索找到最优解。程序中定义了种群数量、问题维度、变量上下界和适应度函…

全行业商家0退货0退款一键卖全球,淘天助力卖家拓展海外生意!

今年7月中旬&#xff0c;淘宝推出了“大服饰全球包邮计划”&#xff0c;在服饰行业先行先试&#xff0c;带领商家拓展海外市场。计划推出以来&#xff0c;吸引了数十万服饰商家报名参与&#xff0c;包括天猫商家蕉下、淘宝商家JOC、美洋等。有服饰商家怀着试一试的心态报了名&a…

碳课堂|CBAM的制度及核心内容

引言 全球变暖和气候变化是21世纪面临的最严峻挑战之一。为应对这一全球性问题&#xff0c;各国纷纷采取措施&#xff0c;减少温室气体排放&#xff0c;并推动可持续发展。其中&#xff0c;欧盟提出的碳边界调整机制&#xff08;CBAM, Carbon Border Adjustment Mechanism&…

pr视频剪辑、福昕剪辑……四款剪辑视频大比拼

最近入了视频剪辑的坑&#xff0c;我最近在尝试不同的视频剪辑软件&#xff0c;想找到最适合我的那一款。今天&#xff0c;我就来跟大家分享一下我使用福昕视频剪辑、爱拍视频剪辑、Adobe Premiere&#xff08;简称PR&#xff09;和Shotcut这四款软件时的一些体验和感受。希望我…

FPGA_传递参数的方式

FPGA Verilog 调用模块后带有 “ #()” 的含义 最后4个LED闪烁控制模块的例化,它们的源码都是 led_controller.v 模块&#xff0c;但它们的名称不一样,分别为“uut_led_controller_clk12m5 ”&#xff0c;“uut_led_controller_clk25m”&#xff0c;“uut_ledcontroller clk50…

Pandas -----------------------基础知识(二)

dataframe读写数据操作 import pandas as pd# 准备数据(字典) data [[1, 张三, 1999-3-10, 18],[2, 李四, 2002-3-10, 15],[3, 王五, 1990-3-10, 33],[4, 隔壁老王, 1983-3-10, 40] ]df pd.DataFrame(data, columns[id, name, birthday, age]) df写到csv文件中 &#xff0c;…

Azure Pipeline 常用任务记录

各种任务的查询&#xff1a; 任务查询 下载类 1 DownloadPackage1 从 Azure Artifacts 中的包管理源下载包 2 DownloadSecureFile1 下载安全文件&#xff0c;这里的安全文件在Library中上传&#xff0c;默认的位置会传到$(Agent.TempDirectory) 3 DownloadBuildArtifacts1…