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

2024-06-09 06:44

本文主要是介绍基于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设计资料

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

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

点赞分享一起学习成长。

这篇关于基于51单片机水塔水位控制系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044453

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控制设备,用户可以轻松实现对灯光、空调、门锁等家电的控制,提升生活的便捷性和舒适性。本文将介绍如何构建一个基于人工智能的智能家居语音控制系统,包括环境准备

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是