基于单片机的智能浇花系统

news2024/11/27 1:37:46

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,采样DHT11温湿度传感器检测温湿度,通过LCD1602显示
4*4按键矩阵可以设置温度湿度阈值,温度大于阈值则开启水泵,湿度大于阈值则开启风扇
并且通过串口实时打印温湿度信息。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、程序编程

#include <REGX52.H>
#include<intrins.h>
#include<stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
#define uchar unsigned char
#define uint unsigned  int
sbit Temp_data=P2^6;  //DHT11
sbit beep = P3^4;
sbit out1 = P2^7;
sbit out2 = P3^7;
sbit out3 = P3^2;
sbit out4 = P3^3;


unsigned char KeyNum;
unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];
unsigned int rec_dat[4];
unsigned int password,count; //
static int wdyz=50,sdyz=800;//温度、湿度、气压
static uchar wd,sd;
static int moshi=0;

void ajpd();
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void DHT11_start();
unsigned char DHT11_rec_byte();
void DHT11_receive();
void beep_warning();


//延时ms
void DHT11_delay_ms(unsigned int z)
{
    unsigned int i,j;
    for(i=z; i>0; i--)
        for(j=110; j>0; j--);
}

//延时us   --2*n+5us
void DHT11_delay_us(unsigned char n)
{
    while(--n);
}

//DHT11起始信号
void DHT11_start()
{
    Temp_data=1;

    DHT11_delay_us(10);

    Temp_data=0;

    DHT11_delay_ms(50);//这个延时不能过短,18ms以上,实际在仿真当中要想读到数据延时要在延时参数要在40以上才能出数据

    Temp_data=1;

    DHT11_delay_us(30);//这个延时不能过短


}

//接收一个字节

unsigned char DHT11_rec_byte()
{
    unsigned char i,dat=0;
    for(i=0; i<8; i++)
    {
        while(!Temp_data);
        DHT11_delay_us(8);
        dat <<=1;
        if(Temp_data==1)
        {
            dat +=1;
        }
        while(Temp_data);
    }
    return dat;
}



//接收温湿度数据
void DHT11_receive()
{
    unsigned int R_H,R_L,T_H,T_L;
    unsigned char RH,RL,TH,TL,revise;

    DHT11_start();
    Temp_data=1;
    if(Temp_data==0)
    {
        while(Temp_data==0);   //等待拉高
        DHT11_delay_us(40);  //拉高后延时80us

        R_H=DHT11_rec_byte();    //接收湿度高八位
        R_L=DHT11_rec_byte();    //接收湿度低八位
        T_H=DHT11_rec_byte();    //接收温度高八位
        T_L=DHT11_rec_byte();    //接收温度低八位
        revise=DHT11_rec_byte(); //接收校正位

        DHT11_delay_us(25);    //结束

        if((R_H+R_L+T_H+T_L)==revise)      //校正
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;

        }
        /*数据处理,方便显示*/
        rec_dat[0]=RH;
        rec_dat[1]=RL;
        rec_dat[2]=TH;
        rec_dat[3]=TL;

    }

}

void dht11()
{
	      DHT11_delay_ms(150);
        DHT11_receive();
	      sprintf(rec_dat_lcd0,"%d",rec_dat[0]);
        sprintf(rec_dat_lcd1,"%d",rec_dat[1]);
        sprintf(rec_dat_lcd2,"%d",rec_dat[2]);
        sprintf(rec_dat_lcd3,"%d",rec_dat[3]);
        DHT11_delay_ms(100);
//	     //湿度
       LCD_ShowString(2,5,rec_dat_lcd0);  //湿度低位
	     LCD_ShowString(2,4,rec_dat_lcd1);   //湿度高位
	    
	
        //温度
        LCD_ShowString(2,1,rec_dat_lcd2); //温度低位
	      LCD_ShowString(2,0,rec_dat_lcd3); //温度高位
	
	      wd = rec_dat[3]*10 + rec_dat[2];
				sd = rec_dat[1]*10 + rec_dat[0];

}

void beep_warning()//蜂鸣器警报并且电机转动
{
	  if(wd>wdyz)
		{
		out1= 1;
		out2= 0;
		beep = 1;
		printf("温度异常,请维修人员来查看\r\n");	
		}	
    else 
		{
		out1= 0;
		out2= 0;
		}		
		
    if(sd > sdyz)
	  {
					beep = 1;
		out3 = 1;
		out4= 0;
		printf("湿度异常,请维修人员来查看\r\n");	
		}		
    else
		{
		out3 = 0;
		out4 = 0;
		}	
		
	
	  if(wd>wdyz || sd>sdyz )
		{			
			beep = 1;
		}
		else if(wd < wdyz && sd <sdyz)
		{
			beep = 0;
		}
}
//串口初始化
void init_com(void)
{
 	TMOD =0x20;		   //设T0为方式1,GATE=1;
	SCON=0x50;        //开启串口
	TH1=0xFD;          //波特率是9600bps
	TL1=0xFD;
	TR1=1;			   //开启定时器
	TI=1;
	EA=1;
}



void main()					  //主函数
{	
	init_com();
	LCD_Init();         //显示屏初始化
 beep = 0;

	do
	{
		dht11(); //温湿度获取
		ajpd();  //按键判断
	  beep_warning();    //状态判断
	}  while(1);
}



void ajpd()//按键判断
{
	KeyNum = MatrixKey();//键盘输入的值进行传递
	
	if(KeyNum){
			
	if(moshi == 0)
	{
	if(KeyNum <= 10) //把按键的范围定义在0~9
	{			
	  if(count < 3)
		{
			password*=10; //出水量左移一位
			password += KeyNum % 10; //获取一位出水量
			count++;    //计次++,对应出水量位数
		}
			LCD_ShowNum(1,1,password,3); //LCD更新显示
	}	
	//确认键
	  if(KeyNum == 11) //把11表示确认,对阈值进行确认
		{
		 LCD_ShowNum(1,1,password,3); //LCD更新显示
     wdyz = password; //温度阈值
		}		
		//取消键
		if(KeyNum == 12)
			{
				password = 0;
				count = 0;
				LCD_ShowNum(1,1,password,3); //LCD更新显示
			}
			
			if(KeyNum == 13)  //q切换
			{
				moshi++;
				password = 0;
				count = 0;
				if(moshi>1)
				{
					moshi = 0;
				}
			}
		} 
	else if(moshi == 1)
	{
		if(KeyNum <= 10) //把按键的范围定义在0~9
	{			
	  if(count < 3)
		{
			password*=10; //出水量左移一位
			password += KeyNum % 10; //获取一位出水量
			count++;    //计次++,对应出水量位数
		}
			LCD_ShowNum(1,5,password,3); //LCD更新显示
	}	
	//确认键
	  if(KeyNum == 11) //把11表示确认,对阈值进行确认
		{
		 LCD_ShowNum(1,5,password,3); //LCD更新显示
		  sdyz = password;
		}		
		//取消键
		if(KeyNum == 12)
			{
				password = 0;
				count = 0;
				LCD_ShowNum(1,5,password,3); //LCD更新显示
			}
			
			if(KeyNum == 13)  //q切换
			{
				moshi++;
				password = 0;
				count = 0;
				if(moshi>1)
				{
					moshi = 0;
				}
			}
	}
	
}		

}

四、实现现象

具体动态效果看B站演示视频:

基于单片机的智能浇花系统

全部资料(源程序、仿真文件、安装包、演示视频、串口演示视频):

百度网盘资料下载icon-default.png?t=O83Ahttps://pan.baidu.com/s/1Oenm7MTkS9fApPHFD9tyqw?pwd=dvcy

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

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

相关文章

从零开始讲PCIe(6)——PCI-X概述

一、概述 PCI-X 在硬件和软件上与 PCI 具有向后兼容性&#xff0c;同时提供了更高的性能和效率。它使用与 PCI 相同的连接器格式&#xff0c;因此 PCI-X 设备可以插入 PCI 插槽&#xff0c;反之亦然。而且&#xff0c;PCI-X 采用相同的配置模型&#xff0c;因此在 PCI 系统上运…

Apollo9.0 Planning2.0决策规划算法代码详细解析 (4): PlanningComponent::Proc()

&#x1f31f; 面向自动驾驶规划算法工程师的专属指南 &#x1f31f; 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏&#xff01;本专栏专为自动驾驶规划算法工程师量身打造&#xff0c;旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…

webpack插件 --- webpack-bundle-analyzer【查看包体积】

const UglifyJsPlugin require(uglifyjs-webpack-plugin) // 清除注释 const CompressionWebpackPlugin require(compression-webpack-plugin); // 开启压缩// 是否为生产环境 const isProduction process.env.NODE_ENV production; const { BundleAnalyzerPlugin } requi…

大数据可视化分析建模论

大数据可视化分析建模论 前言大数据可视化分析建模 前言 在这个信息爆炸的时代&#xff0c;数据如同潮水般涌来&#xff0c;我们每天都在与海量的数据打交道。数据已经成为了企业决策、科研创新以及社会发展的核心要素。如何从这些纷繁复杂的数据中提取有价值的信息&#xff0…

C++多态、虚函数以及抽象类

目录 1.多态的概念 2.多态的定义及实现 2.1多态的构成条件 2.1.1实现多态还有两个必要条件 2.1.2虚函数 2.1.3虚函数的重写/覆盖 2.1.4多态场景的题目 2.1.5虚函数重写的一些其他问题 2.1.5.1协变(了解) 2.1.5.2析构函数的重写 2.1.6override和final关键字 2.…

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言&#xff0c;广泛应用于多个领域。Java的编程思想&#xff0c;包括面向过程和面向对象编程&#xff0c;Java的发展历史&#xff0c;各版本的特点&#xff0c;JVM原理&#xff0c;数据类型&#xff0c;Java SE与Java EE的区别&#xff0c;应用场景&…

《业务三板斧:定目标、抓过程、拿结果》读书笔记2

为什么要看懂“目标全景图”&#xff1f; 很多管理者在定目标时缺乏全局思维&#xff0c;“只见树木&#xff0c;不见森林”&#xff0c;导 致定出来的目标短浅&#xff0c;管理者如井底之蛙。“目标全景图”是企业的 整个目标体系&#xff0c;如图1-1所示。管理者看懂“目标全…

Pikachu- Over Permission-垂直越权

以admin 账号登陆&#xff0c;添加一个用户&#xff1b; 把添加用户的这个请求发送到 repeater&#xff1b; 退出admin&#xff0c;使用普通用户pikachu登陆&#xff1b; 只有查看权限&#xff1b; 使用pikachu 用户的认证信息&#xff0c;替换repeater处管理员创建用户请求的…

【电力系统】配电网前推后带法求电力系统潮流

摘要 在配电网潮流计算中&#xff0c;前推后带法是一种常用的算法&#xff0c;适用于径向结构配电网。本文通过详细介绍前推后带法的基本原理和计算流程&#xff0c;并结合实际实验结果展示了该方法在电力系统中的应用。实验结果表明&#xff0c;该方法在潮流计算中具有较高的…

Android Framework AMS(02)AMS启动及相关初始化5-8

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第二章节&…

CSS元素显示类型

display 属性是 CSS 中最重要的属性之一&#xff0c;主要用来控制元素的布局&#xff0c;通过 display 属性您可以设置元素是否显示以及如何显示。 根据元素类型的不同&#xff0c;每个元素都有一个默认的 display 属性值&#xff0c;例如<div>默认的 display 属性值为 …

Pandas基础学习

导入 导入pandas一般是这样导入的 import pandas as pdSeries 创建 s1 pd.Series([5, 17, 3, 26, 31])注意Series的第一个字母要大写&#xff0c;表明这其实是Series类的构建函数, 返回的是Series类的实例 获得元素或者索引 单独获得元素 s1.values单独获得索引值 s…

基于springboot的校园物流管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的校园物流管理系统1拥有两种角色 管理员&#xff1a;物流管理&#xff08;揽件、寄出&#xff09;、用户管理等 用户&#xff1a;收件、寄件、个人物流信息管理等 1.1 …

proto3语法

文章目录 字段规则消息类型定义与使用序列化写入文件hexdump工具反序列化读取文件decode命令选项enum类型设置电话类型 Any类型设置地址信息 oneof类型设置其他联系人信息 map类型添加备注信息 默认值更新消息更新规则 未知字段输出未知字段消息 option选项常用选项 本章代码仓…

Leetcode 剑指 Offer II 097.不同的子序列

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列…

NVIDIA网卡系列之ConnectX-5规格信息(100G-PCIe 3.0x16-8PF512VF-2016年发布)

背景 NVIDIA ConnectX-5系列的网卡&#xff0c;早期还在Mellanox未被NVIDIA收购的时候就发布了&#xff0c;主流支持100G&#xff0c;主要用在PCIe3.0&#xff0c;最大支持200G的产品。虽然已经发布多年&#xff0c;但是目前还是在大量使用。100Gbps的速率对比普通网卡来讲&am…

基于SSM的电影院售票系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 前言 近些年的电影在人们文娱活动中占据重要地位&#xff0c;另外&#xff0c;由于人们的生活越来越富有&#xff0c;越来越多的人们不再选择在家里看电影&#xff0c;而是选择去电影院看电影。但是&#xff0c;以往的售票方式是…

在Visual Studio中使用CMakeLists.txt集成EasyX库的详细指南

EasyX库是一款专为Windows平台设计的轻量级C图形库&#xff0c;适合初学者和教育领域使用。结合Visual Studio和CMake工具链&#xff0c;用户可以轻松创建C项目&#xff0c;并集成EasyX库&#xff0c;实现丰富的图形编程效果。本文将详细介绍如何在Visual Studio中通过CMakeLis…

分布式事务(Seata-AT模式)

角色说明 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - 资源管理器 管理分…

macOS编译和运行prometheus2.54

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文详述了在macOS(M2芯片)上编译和运行prometheus2.54版本的过程&#xff0c;以及安装node_exporter和grafana并使用prometheus指标进行展示 本地…