基于51单片机的自动浇花器电路
一、系统概述
自动浇水灌溉系统设计方案,以AT89C51单片机为控制核心,采用模块化的设计方法。
组成部分为:5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块,结构如下。

工作原理为:土壤湿度传感器测出土壤湿度模拟信号,经AD转换器将模拟信号转换成数字信号后传输到51单片机,单片机将土壤湿度数据与设定的上下限值进行比较。

当土壤湿度低于下限时,驱动水泵工作进行灌溉浇水,并提供声光报警。设计获取,蒋宇智QQ(2327603104)。
当土壤湿度增加至超过下限时,声光报警关闭,但水泵会继续工作,直到土壤湿度继续增加并超过设定的上限值为止。
用户可通过按键设定湿度上下限值,土壤湿度数据和上下限值数据均通过LCD显示屏实时显示。

二、土壤湿度传感器

Proteus仿真电路

三、原理图

仿真结果分析
打开Proteus仿真文件,其后缀名为.DSN。双击单片机,加载AutoWater.hex文件(位于Keil C程序文件夹内),运行仿真,结果如下。

由图可知,LCD显示当前测量的土壤湿度(Humidity)为53%,系统预设的湿度上限(H:High的缩写)为60%,下限(L:Low的缩写)为30%,土壤湿度正常,在上下限范围之内。资源获取,蒋宇智QQ(2327603104)。
此时,湿度低报警灯和蜂鸣器处于关闭状态,继电器RL1开关打至下方,水泵处于断电状态。
通过调节滑动变阻器RV2(鼠标点击上下两个红色箭头),改变输入到ADC0832采样通道0的电压大小来模拟土壤湿度的变化。
点击RV2向下的红色箭头,模拟土壤湿度的降低。例如,当土壤湿度从53%降低至23%,低于下限值30%时,红色LED报警灯点亮,蜂鸣器发声,继电器RL1开关打至上方,水泵通电,开始自动浇水,绿色的水泵工作指示灯也被点亮。

点击RV2向上的红色箭头,模拟土壤湿度的增加。
当土壤湿度从23%增加至37%,超过下限时,声光报警停止工作,但水泵会继续工作,直到土壤湿度继续增加到高于上限值为止,过程如下所示。


需要说明的是,水泵停止工作(即:土壤湿度超过上限)后,调节RV2模拟土壤湿度的下降,在下降到上下限范围内时,水泵不会启动,只有土壤湿度继续下降至低于下限时才会启动。
通过按键可以预设湿度的上下限值。
点击“设定”键,进入上下限设置模式,首先是H上限值光标闪烁,此时可以点击加/减键,改变上限值大小。

上限值设置完成后,点击“设定”键,L下限值光标闪烁,同理,点击加/减键,改变下限值大小。

上下限值都设置完成后,再次点击“设定”键,退出上下限设置模式。例如,我们设置湿度上限值H为75%,下限值L为25%,结果如下图所示。

综上所述,仿真运行效果满足设计要求。
四、C代码
void main()//主函数
{Init1602();//初始化液晶函数init(); //初始化定时器init_eeprom(); //开始初始化保存的数据while(1)//进入循环{for(m=0;m<50;m++)//读50次AD值sum = adc0832(0)+sum; //读到的AD值,将读到的数据累加到sumtemp=sum/50;//跳出上面的for循环后,将累加的总数除以50得到平均值tempsum=0; //平均值计算完成后,将总数清零temp = temp*0.390625; //ADC0832存储数据为1个字节,湿度显示范围为0~100,因此1单位湿度=100/256=0.390625
// if(temp<=full_range)
// temp=(temp*100)/full_range;
// else
// temp=100;if(set==0)//set为0,说明现在不是设置状态Display_1602(temp,MH,ML);//显示AD数值和报警值if(temp<ML&&set==0)//湿度值小于报警值{//资源获取,蒋宇智QQ(2327603104)flag=1;//打开报警Relay=0;//继电器触点闭合,水泵工作LED_R=0; //红灯点亮}else if(temp>MH&&set==0) //湿度值大于报警值{flag=0;//关闭报警Relay=1;//继电器触点打开,水泵停止LED_R=1; //红灯熄灭}else{flag=0;LED_R=1; //红灯熄灭}Key(); //调用按键函数}
}
#include <reg51.H>#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define ulong unsigned long#define LCDIO P0 //液晶屏数据口//ADC0832的引脚sbit ADCLK =P1^1; //ADC0832 clock signalsbit ADDIO =P1^3; //ADC0832 k insbit ADCS =P1^4; //ADC0832 chip seclectsbit rs=P1^0; //定义1602 RSsbit lcden=P1^2; //定义1602 ENsbit key1=P3^0; //设定sbit key2=P3^1; //加sbit key3=P3^2; //减sbit motor=P3^7; //继电器接口sbit speak=P1^5; //蜂鸣器接口uchar key; //设定指针uint RH=400,RL=200;//水位上下限float temp_f;ulong temp;uchar v;uchar count,s1num;uchar code table[]= " moisture: ";uchar code table1[]="RH: % ";uchar getdata; //获取ADC转换回来的值/*********************************************/void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/**********************************************/void write_com(uchar com){rs=0;// rd=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0; }/*********************************************/void write_date(uchar date){rs=1;// rd=0;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0; }void lcdinit(){lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}/***********************************************/void init(){uchar num;for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<15;num++){write_date(table1[num]);delay(5);}}//****************************************************************************//************读ADC0832函数************///采集并返回/****************************************************************************函数功能:AD转换子程序入口参数:CH(如果读取CH0,channel的值为0x01,如果读取CH1则channel的值为0x03)出口参数:adval****************************************************************************/uchar Adc0832() //AD转换,返回结果{uchar i;uchar dat=0;ADCLK=0;ADDIO=1;ADCS=0; //拉低CS端ADCLK=1; ADCLK=0; //拉低CLK端,形成下降沿1ADDIO=1;//指定转换通道是CH1还是CH2,指定值位与0x1,取最后一位的值ADCLK=1; ADCLK=0; //拉低CLK端,形成下降沿2ADDIO=0;//指定值右移一位,再取最后一位的值ADCLK=1;ADCLK=0; //拉低CLK端,形成下降沿3ADDIO=1; for(i=0;i<8;i++){ADCLK=1;ADCLK=0; //形成一次时钟脉冲if(ADDIO)dat|= 0x80>>i; //收数据}ADCS=1; //拉低CS端ADCLK=1;ADDIO=1; //拉高数据端,回到初始状态return(dat); //return dat}/***************************************************************************//********************************************************/void displayRH() //下限显示{write_com(0xc0+3);write_date(RH/100%10+0x30);//上限百位write_date(RH/10%10+0x30);//上限十位//write_date('.');//write_date(RH%10+0x30);}void displayRL() //下限显示{write_com(0xca);write_date('R');write_date('L');write_date(':');write_date(RL/100%10+0x30);//下限百位write_date(RL/10%10+0x30);//下限十位write_date('%');}/**************************************************//********************************************************/void keyscan() //按键处理{bit kk1=0,kk2=0;if(key1==0){delay(30);while(key1==0);if(key>=2){key=0;}else{key++;}switch(key){speak=1;kk2=motor;motor=1;case 1:{write_com(0x0f);write_com(0xce); //光标闪烁while(key1!=0) //等待按键松开{if(key2==0) //key2按键下{delay(30); //按键延时消抖if(key2==0) //确定key2按下{while(key2==0); //等待松开if(RL>=998){RL=999; //RL下限最大设置为99}else{RL+=10; //RL加1} }displayRL(); //调用RL下限显示函数write_com(0xce);} if(key3==0) //key3按下{delay(30); //按键延时消抖if(key3==0) //确定key3按下{while(key3==0); //等待key3按键松开if(RL<=1) //RL最小设置为1{RL=0;}else{RL-=10; //RL下限减1}}displayRL(); //调用RL下限显示函数write_com(0xce);}}while(key1==0); }case 2:{write_com(0x0f);write_com(0xc4); //RH设置数据,光标闪烁while(key1==1){if(key2==0) //key2按下{delay(30); //按键延时消抖if(key2==0) //确定key2按下{while(key2==0); //等待松开if(RH>=998) //RH最大设置为99{RH=999;}else{RH+=10; //RH加1}}displayRH(); //RH上限显示函数write_com(0xc4);}if(key3==0) //key3按下{delay(30); //按键延时消抖if(key3==0) //确定按下{while(key3==0);//等待松开if(RH<=1) //RH最小设置为1{RH=0;}else{RH-=10; //RH减1}}displayRH(); //调用RH显示函数write_com(0xc4);}}while(key1==0);}case 0:{write_com(0x0c);motor=kk2;break;}}}}/**************************************************/void Conut(void) //土壤检测数据转换{ v=Adc0832();temp=v;temp_f=temp*9.90/2.55;temp=temp_f;temp=1000-temp; write_com(0x80+10);write_date(temp/100%10+0x30);//千位write_date(temp/10%10+0x30);//百位write_date('.');write_date(temp%10+0x30);write_date('%');//显示符号位}/********************************************************/void main(void){lcdinit();init();displayRH(); //显示上限displayRL(); //显示下限delay(50); //启动等待,等LCD讲入工作状态delay(50); //延时片刻(可不要)delay(50); //延时delay(50);Conut(); //显示函数delay(150); while(1){ Conut(); //显示当前湿度keyscan();if(temp>RH) //如果湿度大于上限停止浇水{motor=1; //关闭继电器}else if(temp<RL) //如果湿度小于RL下限启动浇水{motor=0; //启动继电器}if(temp<RL) //小于下限启动报警并浇水{speak=0; //启动报警delay(150); //延时speak=1;}keyscan(); //按键检测delay(150); //延时50MS}}
相关文章:
基于51单片机的自动浇花器电路
一、系统概述 自动浇水灌溉系统设计方案,以AT89C51单片机为控制核心,采用模块化的设计方法。 组成部分为:5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块,结构如…...
2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办
2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 展会背景: 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办ÿ…...
MacOS docker 安装与配置
orbstack 安装 官网: https://orbstack.dev 下载链接:Download OrbStack Fast, light, simple Docker Desktop alternative 选择是Apple M系列处理器, 或 Intel系列处理器 到这里就安装好了Orbstack软件,下面开始配置docker 下…...
【嵌入式大赛应用赛道】机械手臂
电机 进步电机:它的转动是以确定的步数进行的,只要计算好脉冲数量和频率,就可以准确预测和控制电机的转动角度、速度以及停止的位置 伺服电机:将输入的电信号(如电压或电流指令)转换成轴上的精确旋转运动…...
MES系统主要包括那些功能?
一开始接触MES系统,对MES细条的功能不清楚,这样很正常,因为MES系统相对于其他系统来讲,功能有多又复杂! 作为曾参与200企业MES系统架构的资深从业人员,我给大家选出了一款优秀模板——简道云MES系统,给大家…...
git 合并commit
操作步骤 合并commit cd xxx/ git checkout a8c0efegfwgtw # 最新commit git reset rhgertheryhg --soft # 最初的commit git status git checkout -b test1 git commit -m "test1" git branch git push origin test1 git tag test1_v0.0.1 git push origin test1_…...
【ARMv8/v9 系统寄存器 5 -- CPU ID 判断寄存器 MPIDR_EL1 使用详细介绍】
文章目录 寄存器名称: MPIDR_EL1寄存器结构:主要功能和用途亲和级别(Affinity Levels)简介CORE ID 获取函数 在ARMv8-A架构中, MPIDR_EL1寄存器是一个非常重要的系统寄存器,它提供了关于处理器在其物理和逻辑配置中的位置的信息。…...
软件工程课程设计之酒店管理系统的设计与实现
这是一个简化的酒店管理系统的需求分析文档、系统设计文档、测试文档的结构概述,以及部分实现阶段的代码示例。详细设计阶段的数据字典、ER图、模块分类图将以文字描述形式给出,而完整的代码未完全实现。这里只做软件工程部分的设计需求说明哈࿵…...
函数递归练习
目录 1.分析下面选择题 2.实现求第n个斐波那契数 3.编写一个函数实现n的k次方,使用递归实现。 4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和 5.递归方式实现打印一个整数的每一位 6.实现求n的阶乘 1.分析下面选择…...
公有云Linux模拟TCP三次挥手与四次握手(Wireshark抓包验证版)
目录 写在前面环境准备实验步骤1. 安装nc工具2. 使用nc打开一个连接2.1 公有云-安全组放行对应端口(可选) 3. 打开Wireshark抓包工具4. 新开终端,进行连接5. 查看抓包文件,验证TCP三次握手与四次挥手TCP三次握手数据传输TCP四次挥…...
【Day3:JAVA运算符、方法的介绍】
目录 1、运算符1.1 赋值运算符1.2 比较运算符1.3 逻辑运算符1.3.1 逻辑运算符概述1.3.2 逻辑运算符分类1.3.3 短路的逻辑运算符 1.4 三元运算符1.5 运算符优先级 2、方法2.1 方法介绍2.2 方法的定义和调用格式2.2.1 方法的调用2.2.2 带参数方法的调用2.2.3 带返回值方法的调用2…...
Chrome查看User Agent的实战教程
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
Linux 第三十四章
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…...
国际化日期(inti)
我们可以使用国际化API自动的格式化数字或者日期,并且格式化日期或数字的时候是按照各个国家的习惯来进行格式化的,非常的简单; const now new Date(); labelDate.textContent new Intl.DateTimeFormat(zh-CN).format(now);比如说这是按照…...
【论文阅读笔记】jTrans(ISSTA 22)
个人博客地址 [ISSTA 22] jTrans(个人阅读笔记) 论文:《jTrans: Jump-Aware Transformer for Binary Code Similarity》 仓库:https://github.com/vul337/jTrans 提出的问题 二进制代码相似性检测(BCSD࿰…...
单位个人如何向期刊投稿发表文章?
在单位担任信息宣传员一职以来,我深感肩上的责任重大。每月的对外信息宣传投稿不仅是工作的核心,更是衡量我们部门成效的重要指标。起初,我满腔热血,以为只要勤勉努力,将精心撰写的稿件投至各大报社、报纸期刊的官方邮箱,就能顺利登上版面,赢得读者的青睐。然而,现实远比理想骨…...
Redis数据结构-RedisObject
1.7 Redis数据结构-RedisObject Redis中的任意数据类型的键和值都会被封装为一个RedisObject,也叫做Redis对象,源码如下: 1、什么是redisObject: 从Redis的使用者的角度来看,⼀个Redis节点包含多个databaseÿ…...
Vue 中使用 el-date-picker 限制只能选择当天、当天之前或当天之后日期的方法详解
网上很多都是不完整的,我这里发布一个完整的 - 8.64e7 表示可选择当天时间(注:小于当前时间,- 8.64e7 则是禁用日期不包含当前日,若大于当前日期, 8.64e7 则是禁用日期包含当前日) time.getTi…...
系列介绍:《创意代码:Processing艺术编程之旅》
系列介绍:《创意代码:Processing艺术编程之旅》 标题创意: “代码绘梦:Processing艺术编程入门”“数字画布:用Processing创造视觉奇迹”“编程美学:Processing艺术创作指南”“创意编程:Proc…...
深度学习设计模式之抽象工厂模式
文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 本文主要学习抽象工厂模式,抽象工厂模式创建的是对象家族,比如:苹果是一个产品,但是他不单单只生产手机,还…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...
