基于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

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

STM32单片机PWR电源控制详解

文章目录 1. PWR概述 2. 电源结构框图 3. 上电复位和掉电复位 4. 可编程电压监测器 5. 低功耗模式 6. 模式选择 6.1 睡眠模式 6.2 停止模式 6.3 待机模式 7. 代码示例 1. PWR概述 PWR(Power Control)电源控制,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 可编程电压监测器

【单片机毕业设计选题24024】-房间自动除湿控制系统

系统功能: 系统分为手动和自动模式,上电默认为自动模式。自动模式下如果获取到湿度 值大于设定的湿度值则自动打开风扇,手动模式下手动开关风扇。 系统上电后显示“欢迎使用除湿控制系统请稍后”,两秒钟后进入主页面显示。 第一行显示系统模式,手动或自动模式 第二行显示获取到的温湿度 第三行显示设置的湿度阈值 第四行显示风扇状态和系统报警状态,风扇状态有开关状态,系统状态和OK和 NG状态。

基于51单片机抽奖系统

基于51单片机抽奖系统 (仿真+程序) 功能介绍 具体功能: 1.利用5片74HC495对单片机的IO进行串并转换,进而控制5个1位数码管; 2.采用一个独立按键用于抽奖系统的启停控制; 3.8位拨码开关是用于设定随机数发生器的“种子值”(初始值); ​演示视频: 基于51单片机抽奖系统  添加图片注释,不超过 140 字(可选) 程序 #inclu

江协科技51单片机学习- p16 矩阵键盘

🚀write in front🚀   🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​  💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚  前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习

基于S7-200PLC的全自动洗衣机控制系统设计

wx供重浩:创享日记 那边对话框发送:plc洗衣 获取完整无水印设计说明报告(含程序梯形图) 1.自动洗衣机PLC控制的控制要求 1.1全自动洗衣机的基本结构、工作流程和工作原理 1.自动洗衣机的基本结构 2.自动洗衣机的工作流程 自动洗衣机的单循环工作流程示意图: 3.自动洗衣机的工作原理: 洗衣机的进水和排水分别有进水电磁阀和排水电磁阀控制。进水时,控制系统使进水电磁阀打开,将水

【深海王国】小学生都能玩的单片机?零基础入门单片机Arduino带你打开嵌入式的大门!(8)

Hi٩(๑o๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督继续为大家带来系列——小学生都能玩的单片机!带你一周内快速走进嵌入式的大门,let’s go! (8)软串口与SoftwareSerial库使用 在第六节中我们提到了,如果我们Arduino开发板的0、1号引脚接线了,即硬件串口被占用了,想给Arduino下载程序,就需要先

江协科技51单片机学习- p11 Proteus安装模拟51单片机

前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用: Proteus快速入门(最详细教程)-CSDN博客  数码管显示: 【51单片机实验笔记】LED篇(三) 数码管的基本控制_51单片机数码管-CSDN博客 https

51单片机STC89C52RC——6.1 中断系统

一,文字层面理解          反正我看下面的几段文字时脑壳没有正常运转。一个头几个大         中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。         当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件