基于51单片机的自动浇花器电路

一、系统概述

自动浇水灌溉系统设计方案,以AT89C51单片机为控制核心,采用模块化的设计方法。

组成部分为:5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块,结构如下。

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

当土壤湿度低于下限时,驱动水泵工作进行灌溉浇水,并提供声光报警。设计获取,蒋宇智QQ(2327603104)。

当土壤湿度增加至超过下限时,声光报警关闭,但水泵会继续工作,直到土壤湿度继续增加并超过设定的上限值为止。

用户可通过按键设定湿度上下限值,土壤湿度数据和上下限值数据均通过LCD显示屏实时显示。

二、土壤湿度传感器

Proteus仿真电路

三、原理图

原理图.jpg

仿真结果分析

打开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}}

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

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

相关文章

垃圾分类管理系统java项目

文章目录 垃圾分类管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 垃圾分类管理系统 一、项目演示 垃圾分类管理系统 二、项目介绍 系统角色&#xff1a;管理员、用户 1、登录、注册功能…

机器人非线性系统反馈线性化与解耦

机器人非线性系统的反馈线性化和解耦是控制理论中的两个重要概念&#xff0c;它们分别用于简化系统分析和设计过程&#xff0c;提高控制系统的性能。 首先&#xff0c;反馈线性化是一种将非线性系统转化为线性系统的技术。在机器人控制中&#xff0c;由于机器人本身是一个强耦…

​python使用selenium进行Web自动化测试​

什么是selenium Selenium 是 ThoughtWorks 提供的一个强大的基于浏览器的 Selenium 是一个用于 Web 应用程序测试的工具&#xff0c;测试直接自动运行在浏览器中&#xff0c;就像真正的用户在手工操作一样。支持的浏览器包括 IE、Chrome 和 Firefox 等。这个工具的主要功能包…

2024042001-计算机网络 - 物理层

计算机网络 - 物理层 计算机网络 - 物理层 通信方式带通调制 通信方式 根据信息在传输线上的传送方向&#xff0c;分为以下三种通信方式&#xff1a; 单工通信&#xff1a;单向传输半双工通信&#xff1a;双向交替传输全双工通信&#xff1a;双向同时传输 带通调制 模拟信号…

C++基础——继承(下)

一、继承与静态成员 基类定义了static 静态成员&#xff0c;则整个继承体系里面只有一个这样的成员。无论派生出多少个子 类&#xff0c;都只有一个 static 成员实例 。 class person { public:person(const char* name "lisi"):_name(name){} public:string _name;…

那些年我与c++的叫板(一)--string类自实现

引子&#xff1a;我们学习了c中的string类&#xff0c;那我们能不能像以前数据结构一样自己实现string类呢&#xff1f;以下是cplusplus下的string类&#xff0c;我们参考参考&#xff01; 废话不多说&#xff0c;直接代码实现&#xff1a;&#xff08;注意函数之间的复用&…

Nacos+GateWay 搭建微服务架构

文章目录 1.当前项目架构分析1.请求多个模块的方式1.请求renren-fast模块开发环境生产环境 2.请求sunliving-commodity模块1.使用环境变量资源路径的方式2.开发环境 dev.env.js3.生产环境 prod.env.js 3.文件上传请求 sunliving-service模块1.请求后端接口&#xff08;开发环境…

汇聚荣科技:拼多多上架商品后需要做页面推广吗?

在电商平台上&#xff0c;商品的曝光率和销量往往成正比。那么&#xff0c;当您在拼多多上架了新品&#xff0c;是不是就意味着坐等订单呢?答案显然是否定的。商品一旦上架&#xff0c;接下来需要做的就是通过有效的页面推广来增加商品的可见度&#xff0c;吸引潜在买家的注意…

html基础(全)

html简介 目录 什么是网页 什么是 HTML 常用浏览器 WebE标准的构成 基本语法概述 第一个HTML页面 文档类型声明标签 lang 语言种类 字符集 标题标签 段落和换行标签 文本格式化标签 div和span标签 图像标签和路径 超链接标签 表格的主要作用 表头单元格标签 列…

纯血鸿蒙APP实战开发——Web获取相机拍照图片案例

介绍 本示例介绍如何在HTML页面中拉起原生相机进行拍照&#xff0c;并获取返回的图片。 效果预览图 使用说明 点击HTML页面中的选择文件按钮&#xff0c;拉起原生相机进行拍照。完成拍照后&#xff0c;将图片在HTML的img标签中显示。 实现思路 添加Web组件&#xff0c;设置…

【SpringBoot】SpringBoot整合jasypt进行重要数据加密

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f4d5;jasypt简介 &#x1f525;SpringBoot使用jasypt &#x1f4c2;创建我需要的数据库文件 &#x1f4d5;引入依赖 &#x1f513;配置数据库文件&#xff08;先不进行加密&#xff09; &#x1f319;创…

Anaconda安装-超详细版(2024)

扫盲&#xff1a;先装Python还是先装anaconda? 安装anaconda即可&#xff0c;不需要单独装python anaconda 是一个python的发行版&#xff0c;包括了python和很多常见的软件库, 和一个包管理器conda。 一、下载Anaconda 安装包&#xff08;官网和国内镜像资源&#xff09; …

【深度学习】SDXL中的Offset Noise,Diffusion with Offset Noise,带偏移噪声的扩散

https://www.crosslabs.org//blog/diffusion-with-offset-noise 带有偏移噪声的扩散 针对修改后的噪声进行微调&#xff0c;使得稳定扩散能够轻松生成非常暗或非常亮的图像。 作者&#xff1a;尼古拉斯古藤伯格 | 2023年1月30日 马里奥兄弟使用稳定扩散挖掘隧道。左图显示了未…

Springboot+Vue项目-基于Java+MySQL的高校专业实习管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Linux文件:重定向底层实现原理(输入重定向、输出重定向、追加重定向)

Linux文件&#xff1a;重定向底层实现原理&#xff08;输入重定向、输出重定向、追加重定向&#xff09; 前言一、文件描述符fd的分配规则二、输出重定向&#xff08;>&#xff09;三、输出重定向底层实现原理四、追加重定向&#xff08;>>&#xff09;五、输入重定向…

关于 vs2019 c++20 规范里的 STL 库里模板 decay_t<T>

&#xff08;1&#xff09; 这个模板&#xff0c;在库代码里非常常见。 decay 英文是“衰弱&#xff0c;消减” 的意思&#xff0c;大概能感觉到就是要简化模板参数 T 的类型&#xff0c;去掉其上的修饰符。因为常用且复杂&#xff0c;故单独列出其源码和注释。先举例其应用场景…

基于Springboot的学生心理压力咨询评判(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的学生心理压力咨询评判&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

Yalmip使用教程(8)-常见报错及调试方法

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍使用yalmip工具箱编程过程中的常见错误和相应的解决办法。 1.optimize的输出参数 众所周知&#xff0c;optimize是yalmip用来求…

PS滤镜插件Camera Raw 15.4升级,开启智能修图

前段时间Adobe 更新了photoshop 的智能AI填充功能&#xff0c;深受很多设计师朋友的喜爱。Camera Raw作为PS的一个滤镜插件对RAW图片的处理上面有一定的优势&#xff0c;Camera Raw 15.4升级了&#xff0c;开启智能修图木事&#xff0c;一起来看看吧&#xff01; Camera Raw滤镜…