单片机——自动浇花系统

article/2025/9/20 0:43:26

目录

1、图片

2、代码 


1、图片

 

2、代码 

#include <reg51.h>           //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义  变量范围0~255
#define uint  unsigned int   //无符号整型 宏定义  变量范围0~65535#include <intrins.h>sbit SCL=P1^4;    //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit DO=P1^5;    //DO定义为P1口的第4位脚,连接ADC0832DO脚
sbit CS=P1^3;    //CS定义为P1口的第4位脚,连接ADC0832CS脚sbit beep = P3^3;   //蜂鸣器IO口定义
uint temperature,s_temp ;  //温度的变量
uchar shidu;     //湿度等级
uchar s_high = 70,s_low = 25;  //湿度报警参数sbit dianji = P1^6;     //电机IO定义bit flag_300ms ;
uchar key_can;     //按键值的变量
uchar menu_1;        //菜单设计的变量//这三个引脚参考资料
sbit rs=P1^0;   //1602数据/命令选择引脚 H:数据        L:命令
sbit rw=P1^1;   //1602读写引脚           H:数据寄存器    L:指令寄存器
sbit e =P1^2;   //1602使能引脚          下降沿触发
uchar code table_num[]="0123456789abcdefg";/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{while(q--);
}/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{e=0;rs=0;rw=0;P0=com;delay_uint(3);e=1;delay_uint(25);e=0;
}/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{e=0;rs=1;rw=0;P0=dat;delay_uint(3);e=1;delay_uint(25);e=0;  
}/********************************************************************
* 名称 : write_sfm2(uchar hang,uchar add,uchar date)
* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下write_sfm1(1,5,23)
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_sfm2(uchar hang,uchar add,uint date)
{if(hang==1)   write_com(0x80+add);elsewrite_com(0x80+0x40+add);write_data(0x30+date/10%10);write_data(0x30+date%10);  
}/********************************************************************
* 名称 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下write_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{if(hang==1)   write_com(0x80+add);elsewrite_com(0x80+0x40+add);while(1){if(*p == '\0')  break;write_data(*p);p++;}  
}/********************************************************************
* 名称 : init_1602()
* 功能 : 初始化1602液晶 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void init_1602()
{write_com(0x38);write_com(0x38);write_com(0x0c);write_com(0x06);delay_uint(1000);write_string(1,0,"   shidu:00%    ");write_string(2,0," SH:00%  SL:00% ");write_sfm2(2,4,s_high);        //显示湿度上限write_sfm2(2,12,s_low);       //显示湿度下限
}/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);
}/***********读数模转换数据********************************************************/  
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的//  1  0  0 通道//  1  1  1 通道 
unsigned char ad0832read(bit SGL,bit ODD)
{unsigned char i=0,value=0,value1=0;    SCL=0;DO=1;CS=0;    //开始SCL=1;    //第一个上升沿  SCL=0;DO=SGL;SCL=1;    //第二个上升沿SCL=0;DO=ODD;SCL=1;      //第三个上升沿SCL=0;      //第三个下降沿DO=1;for(i=0;i<8;i++){SCL=0;SCL=1; //开始从第四个下降沿接收数据value<<=1;if(DO)value++;            }for(i=0;i<8;i++){      //接收校验数据value1>>=1;if(DO)value1+=0x80;SCL=1;SCL=0;}SCL=1;  if(value==value1)        //与校验数据比较,正确就返回数据,否则返回0  return value;return 0;
}/*************定时器0初始化程序***************/
void time_init()    
{EA   = 1;       //开总中断TMOD = 0X01;    //定时器0、定时器1工作方式1ET0  = 1;      //开定时器0中断 TR0  = 1;      //允许定时器0定时
}/********************独立按键程序*****************/
uchar key_can;   //按键值void key()   //独立按键程序
{static uchar key_new;key_can = 20;                   //按键值还原P3 |= 0xf0;if((P3 & 0xf0) != 0xf0)    //按键按下{delay_1ms(1);         //按键消抖动if(((P3 & 0xf0) != 0xf0) && (key_new == 1)){            //确认是按键按下key_new = 0;switch(P3 & 0xf0){case 0xd0: key_can = 3; break;     //得到k2键值case 0xb0: key_can = 2; break;     //得到k3键值case 0x70: key_can = 1; break;     //得到k4键值}          }      }else key_new = 1;  
}/****************按键处理显示函数***************/
void key_with()
{if(key_can == 1)   //设置键{menu_1 ++;if(menu_1 >= 3){menu_1 = 0;init_1602() ;  //初始化显示}}if(menu_1 == 1)      //设置湿度上限{if(key_can == 2){s_high ++ ;    //湿度上限值加1 if(s_high > 99)s_high = 99;}if(key_can == 3){s_high -- ;    //湿度上限值减1 if(s_high <= s_low)s_high = s_low + 1 ;}write_sfm2(2,4,s_high);        //显示湿度上限write_sfm2(2,12,s_low);       //显示湿度下限write_com(0x80+0x40+4);           //将光标移动到第2行第到3位write_com(0x0f);                  //显示光标并且闪烁}  if(menu_1 == 2)      //设置湿度下限{if(key_can == 2){s_low ++ ;    //湿度下限值加1 if(s_low >= s_high)s_low = s_high - 1;}if(key_can == 3){s_low --;    //湿度下限值减1 if(s_low <= 1)s_low = 1;}write_sfm2(2,4,s_high);        //显示湿度上限write_sfm2(2,12,s_low);       //显示湿度下限write_com(0x80+0x40+12);           //将光标移动到第2行第到3位write_com(0x0f);                  //显示光标并且闪烁}  
}  /****************报警函数***************/
void clock_h_l()
{static uchar value,value1;if(shidu <= s_low){value ++;if(value >= 2){value = 10;beep = ~beep;    //蜂鸣器报警dianji = 0;       //打开电机}}else beep = 1;   //关闭蜂鸣器if(shidu >= s_high){value1 ++;if(value1 >= 2){value1 = 10;beep = 1;   //关闭蜂鸣器dianji = 1;       //关机电机}}else value1 = 0;
}/***************主函数*****************/
void main()
{init_1602();         //1602液晶初始化time_init();        //初始化定时器 while(1){key();          //独立按键程序if(key_can < 10){key_with();      //按键按下要执行的程序}if(flag_300ms == 1){    flag_300ms = 0;    clock_h_l();   //报警函数 if(beep == 1){shidu = ad0832read(1,0);  //读出湿度shidu = 99 - shidu * 99 / 255;}if(menu_1 == 0){write_sfm2(1,9,shidu);       //显示湿度等级}} delay_1ms(1);}
}/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{  static uchar value;TH0 = 0x3c;TL0 = 0xb0;     // 50msvalue ++;   if(value % 6 == 0){flag_300ms = 1;     //300msvalue = 0;}
}


http://chatgpt.dhexx.cn/article/QmvocxXl.shtml

相关文章

基于ESP32的开源定时浇花系统

基于ESP32的开源定时浇花系统 文章目录 基于ESP32的开源定时浇花系统前言一、软硬件环境二、模块连接图1.浇花功能说明2.Web界面展示 总结 前言 养了些许花花草草&#xff0c;需要按时浇灌&#xff0c;奈何总是要出差&#xff08;总想出去玩&#xff09;&#xff0c;又怕没人浇…

RISC-V MCU 自动浇花装置设计

第一部分 设计概述 1.设计目的 在家里养养盆花可以陶冶情操&#xff0c;丰富生活&#xff0c;因此&#xff0c;家庭盆栽如今被许多人喜爱。花草生长问题80%以上是由花儿浇灌问题引起的;好不容易种植几个月的花草&#xff0c;因为浇水不及时而缺水死亡。虽然市场上有卖盆花自…

【Proteus仿真】【51单片机】自动浇花灌溉系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602液晶、按键、DS18B20、PCF8591 ADC、土壤湿度传感器、水位传感器、蜂鸣器模块等。 系统运行后&#xff0c;LCD1602显示传感器检测的温度、…

自动浇花系统的电路分析

目录 ​​​电源电路 复位电路和晶振 UCB转TTL ​​​电源电路 首先是电源电路&#xff0c;我们来看电源电路的原理图。 首先忽略D、D-&#xff0c;我们先来看电源本身&#xff0c;除了两头的接地和VCC&#xff08;这是USB接口的特性&#xff09;&#xff0c;我们观察到右…

51单片机wifi物联网的浇花控制系统设计

硬件设计 浇花控制系统采用51单片机与LCD液晶显示屏来实现&#xff0c;利用温度、湿度传感器及相应的显示、驱动执行机构、报警装置等实现温室作物生长环境控制器的设计。 硬件电路主要由51单片机最小系统lcd1602显示屏蜂鸣器报警模块设置按键微型水泵adc0832模数转换模…

毕业设计 远程智能浇花灌溉系统 - stm32 单片机 嵌入式 物联网

文章目录 0 前言1 简介2 主要器件3 实现效果4 设计原理5 部分关键代码5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学…

基于51单片机的智能浇花系统(可做毕设)

基于51单片机的智能浇花系统&#xff08;可做毕设&#xff09; 一、系统介绍二、仿真展示三、实物展示四、仿真过程五、代码1、ADC08322、LCD16023、按键4、水泵5、温湿度6、定时器7、main.c 五、完整工程 对LCD1602原理和操作掌握不好的可以看这篇&#xff1a; 快速掌握——LC…

毕设--自动浇花系统的设计

目录 毕设--自动浇花系统的设计1、作品实物图2、PCB原理图3、元器件清单4、土壤温湿度采集与显示5、硬件电路设计6、程序源码7、资料获取 毕设–自动浇花系统的设计 注&#xff1a;本毕设资源可在微信公众号&#xff1a;“Kevin的学习站” 中获取&#xff01; 1、作品实物图 2、…

单片机毕业设计 自动浇花灌溉系统设计

文章目录 1 简介2 主要器件3 实现效果4 设计原理5 关键代码 1 简介 Hi&#xff0c;大家好&#xff0c;今天向大家介绍一个学长做的单片机项目 基于单片机的自动浇花灌溉系统设计 大家可用于 课程设计 或 毕业设计 选题指导&#xff0c;项目分享&#xff1a; https://gitee…

基于android智能浇花装置,一种基于WiFi通讯远程控制的智能浇花装置的制作方法...

本实用新型涉及自动浇水装置技术领域&#xff0c;具体涉及一种基于WiFi 通讯远程控制的智能浇花装置。 背景技术&#xff1a; 花卉作为一种极具观赏性的植物&#xff0c;在室内和室外广泛种植。上班族工作紧张&#xff0c;空闲时间较少&#xff0c;长期不在家时需要花草被照料。…

基于51单片机的自动浇花系统

目录 一、项目需求 二、仿真 三、程序 四、资料清单 资料下载地址&#xff1a;基于51单片机的自动浇花系统 一、项目需求 1、自动检测土壤湿度、温度、光照强度&#xff1b; 2、土壤湿度过低驱动水泵进行浇花&#xff1b; 3、LCD1602显示当前土壤湿度、温度、光照强度…

【IoT开发】基于机智云物联网的智能浇花教程

摘要:随着近年来物联网技术的发展,相关的技术已经广泛应用于人们的生产和生活中。文章针对长期无人在家时花卉植物的浇水问题,设计了一套基于物联网的智能浇花系统。系统采用STM32与51增强型单片机作为控制器,esp8266物联网模块作为通信设备,底层采用MQTT协议,连接到物联网云平…

条件概率的链式法则

条件概率 条件概率是指事件A在事件B发生的条件下发生的概率。条件概率表示为&#xff1a;P&#xff08;A|B&#xff09;&#xff0c;读作“A在B发生的条件下发生的概率”。若只有两个事件A&#xff0c;B&#xff0c;那么&#xff0c; xx 事件发生时 yy 事件发生的概率: P(yy|x…

链式法则总结

链式法则&#xff08;chain rule&#xff09;微积分中求导法则&#xff0c;用于求复合函数的导数&#xff1b; 链式法则应用广泛&#xff0c;比如神经网络中的反向传播算法就是已链式法则为基础演变的&#xff1b;接下来先说说链式法则的概念然后通过链式法则的两种形式学习链式…

【深度学习数学基础之线性代数】研究使用链式法则进行反向传播的求导算法

链式法则 简单的说链式法则就是原本y对x求偏导&#xff0c;但是由于过程较为复杂&#xff0c;我们需要将函数进行拆分&#xff0c;通过链式进行分别求导&#xff0c;这样会使整个计算更为简单。 假设f k ( a b c ) f k(a bc)fk(abc) 通俗来说&#xff0c;链式法则表明&a…

微积分-链式法则

来看复合函数如何求导&#xff1a; 现实中要解决的问题&#xff0c;大多可以总结为这三种函数的组合 减法可以看做是加上某个函数的-1倍 除法可以转化为乘法 先来看加法 两个函数的和的导数&#xff0c;就是他们导数的和 两个函数sin&#xff08;x&#xff09;和 x 2 x…

求导——链式法则

参考文献&#xff1a;https://www.math.hmc.edu/calculus/tutorials/multichainrule/

【深入浅出】条件概率的链式法则:定义、公式与应用

前言 在概率论的研究中&#xff0c;条件概率是一种非常重要的概念。当多个随机事件发生时&#xff0c;我们有时需要考虑它们同时发生的概率。条件概率的链式法则就是一种用于计算多个随机事件同时发生的概率的方法。本文将会介绍条件概率的链式法则的定义、公式以及应用。 定…

深度学习基础6(微分,偏导,梯度,链式法则)

微积分 如下图所示&#xff0c;内接多边形的等长边越多&#xff0c;就越接近圆。 这个过程也被称为逼近法&#xff08;method of exhaustion&#xff09;。 事实上&#xff0c;逼近法就是**积分&#xff08;integral calculus&#xff09;**的起源 微积分的另一支&#xff0c…