基于51单片机设计的温湿度采集检测系统仿真源码文档视频——文末资料下载

news2024/9/21 16:34:28

演示

基于51单片机设计的温湿度采集检测系统仿真&源码&文档视频——资料下载见简介

目录

1.系统功能

2.背景介绍

3.硬件电路设计

4.软件设计

4.1 主程序设计

4.2 温湿度采集模块程序设计

 4.3 LCD显示屏程序设计

5.系统测试

6.结束语

源码、仿真、文档视频等资料下载链接

1.系统功能
该系统通过与AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器的集成,实时读取环境中的温度和湿度数据并在LCD1602上显示这些信息,其中系统初始化LCD1602显示屏、通过DHT11_receive()函数接收并校验DHT11传感器的温湿度数据、使用LCD_ShowNum()函数逐位显示湿度和温度数据并在这些数据后附加相应的单位符号,以便用户可以直观地看到当前环境的温湿度情况。

2.背景介绍
在现代社会,随着科技的发展和人们生活水平的提高,环境监测变得愈发重要。准确的环境数据对于家庭、办公室、温室以及工业场所的日常运行和健康维护至关重要。其中,温湿度是两项最为基础且重要的环境参数,能够显著影响人类的舒适程度和许多工业过程的效率。因此,设计一个可靠的温湿度检测系统显得尤为必要。

51单片机(Microcontroller Unit, MCU)是一种广泛使用的嵌入式系统核心,它具有简单易用、功能强大、性价比高等优点。51单片机由于其丰富的外围接口容易与其他设备进行集成,开发环境相对成熟,具有丰富的开发资源。此外,其低功耗、稳定性高等特点使得适合各种嵌入式应用中,包括温湿度检测系统。设计基于51单片机的DHT11温湿度检测系统,旨在利用51单片机的强大功能和DHT11的测量能力,实现对环境温湿度的实时监控。实现温湿度数据实时采集,系统能够定时从DHT11传感器读取温湿度数据。数据处理与显示将采集到的数据进行处理,并通过液晶显示屏LCD1602实时显示出来,供用户方便查看。

3.硬件电路设计
硬件电路设计采用proteus进行仿真电路的设计,如下图1中元件U1为单片机主控AT89C51,是核心控制单元用于处理温湿度数据并控制显示模块,元件U1的引脚P0口连接到LCD的数据引脚(D0-D7);主控的19号引脚和18号引脚连接晶振X1和电容C1、C2,晶振X1用于提供时钟信号,电容C1和C2为33pF的电容保证晶振电路的稳定性,分别连接在XTAL1和XTAL2与地之间;9号引脚为复位引脚,包含有一个复位按键,电阻R1为1kΩ电阻,连接在RST引脚和电源之间,防止复位引脚浮空,电容C3为1uF电容连接在RST引脚和地之间,组合R1形成上电复位电路。电路中的元件RP1为电阻网络,将多个电阻集成在一个封装内,D7配到管脚14,D6配到管脚13,D5配到管脚12,D4配到管脚11,D3配到管脚10,D2配到管脚9,D1配到管脚8,D0配到管脚7。

电路中的元件U2为温湿度传感器采用DHT11传感器,DHT11传感器主要引脚有三个,分别为VDD引脚、DATA引脚和GND引脚,VDD引脚连接系统的电源正极,GND引脚连接电源地,DATA引脚连接单片机的I/O口,连接到引脚P1.1,用于传输温湿度数据。

电路中的元件LCD1为LCD1602显示屏,其数据引脚D0-D7连接到单片机主控的P0口,每个引脚对应同名引脚进行连接。其控制引脚RS连接到单片机控制引脚,用于选择命令/数据寄存器,RW引脚连接到单片机控制引脚,用于选择读/写操作,E引脚是使能引脚,用于使能LCD操作。电源引脚VSS接电源地,VDD引脚连接系统的电源正极,VEE引脚为对比度调节端,通过电位器RV1连接,调节显示对比度。元件RV1为4.7kΩ可调电阻用于调节LCD背光对比度,连接VEE引脚。如下图1为系统仿真电路。

图1 系统仿真图

4.软件设计
4.1 主程序设计
在主程序设计中,首先,通过包括头文件reg51.h、lcd1602.h和dht11.h引入了必要的库文件,其中reg51.h是与8051单片机相关的头文件,lcd1602.h和dht11.h分别是处理LCD1602显示屏和DHT11温湿度传感器的头文件。接着,定义了一个指向无符号整数数组的指针dht,用来存放从DHT11传感器接收到的温度和湿度数据。在main函数中,首先调用LCD_Init()函数对LCD1602显示屏进行初始化配置;在进入无限循环后,代码每次调用DHT11_receive()函数读取DHT11传感器的数据并将其存储在dht数组中,然后调用LCD_ShowNum()函数在LCD1602显示屏的第一行第一列显示读取到的湿度值,其中dht[0]即为湿度数据,高两位,并在湿度值后面加上百分号和“RH”标志;随后在第二行第一列调用LCD_ShowNum()函数显示读取到的温度值,其中dht[1]即为温度数据,并在温度值后面加上摄氏度的符号。该程序不断从DHT11传感器读取实时温湿度数据并更新到LCD1602显示屏上,循环执行这些操作,以达到实时显示环境温湿度变化的效果。

主程序代码如下。

#include "reg51.h"
#include "lcd1602.h"
#include "dht11.h"
 
unsigned int* dht;
 
void main()
{    
    LCD_Init();
    while(1)
    {
        
        dht=DHT11_receive();
        LCD_ShowNum(1,1,dht[0],2);//湿度
        LCD_ShowString(1,3,"%RH");
        LCD_ShowNum(2,1,dht[1],2);//温度
        LCD_ShowString(2,3,"^C");        
 
    }
 
}

4.2 温湿度采集模块程序设计
在主程序设计中,温湿度采集模块主要用到了DHT11_receive()函数,用于接收DHT11传感器发送的40位数据并提取其中的温度和湿度信息。这个函数返回一个指向两个元素的无符号整数数组的指针。定义了无符号字符变量用于存储接收到的湿度和温度数据的高八位和低八位,以及校正位,定义了一个无符号整数数组DHT,初始值为0,用于最后存储湿度和温度。调用DHT11_start()函数开始与DHT11传感器通信。判断Data是否为低电平(0),进入数据接收过程。如果Data为0:等待直到Data拉高,即等待传感器响应。调用延时函数DHT11_delay_us(40)等待80微秒。依次调用DHT11_rec_byte()四次,接收湿度高八位、湿度低八位、温度高八位和温度低八位的数据。调用DHT11_rec_byte()接收校正位数据以用于校正检测。调用DHT11_delay_us(25)延时25微秒表示接收完成。通过校正公式(R_H + R_L + T_H + T_L) == revise进行数据校验。如果校验成功:将湿度高位和低位分别赋值给RH和RL。将温度高位和低位分别赋值给TH和TL。将湿度和温度分别存入DHT数组的第一个和第二个位置。最后,函数返回指向DHT数组的指针,获得温度和湿度数据。

函数代码如下。

unsigned int* DHT11_receive()      //接收40位的数据
{
    unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
      unsigned int DHT[2]=0;
    DHT11_start();
    if(Data==0)
    {
        while(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;
        }
        DHT[0] = RH;
        DHT[1] = TH;
    }
        return DHT;
}

 4.3 LCD显示屏程序设计
LCD显示屏在主函数中首先进行通过调用LCD_Init()函数进行LCD显示屏的初始化,在LCD初始化函数中,首先使用代码LCD_WriteCommand(0x38),设置LCD的工作模式,设置为8位数据接口,显示两行,每行16个字符,并且使用的是5x7像素的字体。然后使用代码LCD_WriteCommand(0x0c)设置LCD的显示状态,在这个状态下,LCD的显示是开启的,光标是关闭的,并且光标不会闪烁。然后使用代码LCD_WriteCommand(0x06)设置LCD的光标和显示的移动方式,在这个设置下,当有数据写入时,光标会自动移动到下一个位置,而不会移动整个显示的内容。然后使用代码LCD_WriteCommand(0x01)清除LCD屏幕上的所有内容,并将光标移动到第一行的开始位置。以上就完成了LCD显示屏的设计。

函数代码如下。

void LCD_Init()
{
    LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
    LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
    LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
    LCD_WriteCommand(0x01);//光标复位,清屏
}
在主程序设计中,还使用了void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)函数,该函数有四个参数,该函数接收四个参数:Line表示起始行位置,范围是1到2;Column表示起始列位置,范围是1到16;Number是要显示的数字,范围是0到65535;Length是要显示数字的长度,范围是1到5。在函数内部,通过调用LCD_SetCursor设置显示位置,然后利用一个循环逐位显示数字的每一位,通过调用LCD_WriteData将每一位数字写入到显示屏上,利用除法和取模操作来提取每一位数字,并通过将其转换为字符显示在LCD1602上。

函数代码如下。

void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
    unsigned char i;
    LCD_SetCursor(Line,Column);
    for(i=Length;i>0;i--)
    {
        LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
    }
}
 在主程序设计中,也使用了void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)函数在LCD1602指定位置开始显示所给字符串。该函数接收三个参数,Line表示起始行位置,范围是1到2;Column表示起始列位置,范围是1到16;String是要显示的字符串。在函数内部,通过调用LCD_SetCursor设置显示位置,然后利用一个循环逐个字符地显示字符串。通过检查字符串中的每一个字符(直到遇到空字符'\0'),调用LCD_WriteData将每个字符写入到显示屏上,从而将整个字符串显示在LCD1602上。

函数代码如下。

void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
    unsigned char i;
    LCD_SetCursor(Line,Column);
    for(i=0;String[i]!='\0';i++)
    {
        LCD_WriteData(String[i]);
    }
}
5.系统测试
系统上电后,仿真电路中的LCD显示屏会实时显示DHT11温湿度传感器的数据,如下图2所示。

图2 系统上电界面

如下图3所示,当温湿度数据发生变化时,LCD显示屏的数据也会实时发生变化。

图3 温湿度变化

6.结束语
通过本项目的深入研究和系统测试,我们成功地设计并实现了一个基于AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器的实时温湿度监测系统,该系统不仅能够准确读取和显示环境温湿度数据,而且具有简单可靠的硬件电路设计,其核心控制单元——AT89C51单片机通过与LCD1602显示屏和DHT11温湿度传感器的集成,利用proteus进行仿真电路设计,确保了系统的高效运行和精确数据展示。

硬件电路设计方面,AT89C51单片机作为系统的核心控制单元,结合晶振和电容组成的时钟信号电路、复位电路、以及连接DHT11传感器和LCD1602显示屏的数据传输电路,确保了数据的准确采集和显示;DHT11传感器的温湿度数据通过单片机的I/O口传输到主控单元,并且LCD1602显示屏通过与单片机的数据、控制引脚直接连接,实现了系统的稳定性和高效性。

在软件设计方面,首先通过包括必要的头文件以及定义指向无符号整数数组的指针,处理温湿度数据的存储和传输,并且在main函数中,通过反复调用LCD_Init()函数初始化LCD1602显示屏、DHT11_receive()函数读取DHT11传感器的数据、LCD_ShowNum()函数和LCD_ShowString()函数在LCD1602显示屏上逐位、逐字符地显示温湿度数据显示,确保了实时环境数据的准确展示;温湿度采集模块设计方面,利用DHT11_receive()函数接收和校验DHT11传感器发送的温湿度数据,保证数据的精确和可靠性;在LCD显示屏的初始化和显示数据操作中,通过一系列设置命令和数据写入操作,实现了数据的直观、清晰显示。

经过系统测试,上电时,LCD1602显示屏能够实时显示来自DHT11温湿度传感器的温湿度数据,当传感器检测到环境温湿度发生变化时,显示屏的数据也会同步更新,证明了系统在数据采集、传输和显示方面的有效性和可靠性。

源码、仿真、文档视频等资料下载链接

基于51单片机设计的温湿度采集检测系统仿真&源码&文档视频.zip(毕设/课设/竞赛/实训/项目开发)资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/m0_61712829/89610881

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

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

相关文章

捉虫笔记(二)之 杀软请你自重点

捉虫笔记(二)之 杀软请你自重点 前一篇文章介绍了如何配置符号,这一篇文章我们来个实战。 1 现象 在我们的程序中利用robocopy进行文件的复制。但是QA反馈,只要进行了备份操作,整个进程就会卡住。但是奇怪的是只有他…

NIO专题学习(一)

一、BIO/NIO/AIO介绍 1. 背景说明 在Java的软件设计开发中,通信架构是不可避免的。我们在进行不同系统或者不同进程之间的数据交互,或者在高并发的通信场景下都需要用到网络通信相关的技术。 对于一些经验丰富的程序员来说,Java早期的网络…

前端 HTML 概述

目录 1. HTML概述 1.1 超文本标记语言 1.2 标签 2. HTML 解析与编辑 2.1 解析与访问 2.2 编辑 html文件 1. HTML概述 HTML( Hyper Text Markup Language:超文本标记语言 ):主要用于网页主体结构的搭建,在网页上…

维修雅萌五代射频仪

维修雅萌五代射频仪,主板进水,看起来有点严重,看看这回能不能把它修好

MySQL--数据库索引

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 MySQL数据库--索引 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可提高数据库中特定数据的查询速度 一、索引简介 1、…

python实现小游戏——植物大战僵尸(魔改版本)

制作一款DIY的‘植物大战僵尸’游戏引起了很多人的兴趣。在这里,我将分享一个使用Python语言在PyCharm环境中开发的初始状态版本。这个版本主要应用了pygame库来完成,是一个充满创意和趣味的魔改版本。 文章目录 前言一、开发环境准备二、代码1.main方法…

Unbuntu 服务器- Anaconda安装激活 + GPU配置

一、Anaconda安装激活 1.更新 sudo apt-get update 2.安装wget、vim sudo apt-get install wget sudo apt-get install vim 3.安装Anaconda 进入这个网址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 点这里&#x…

【每日一题】【技巧】【LeetCode热题 100】【力扣】75. 颜色分类 C++

力扣75. 颜色分类 75. 颜色分类 题目描述 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 …

永久旋转 PDF 文件的 2 种简便方法

PDF 文件通常由扫描仪创建,用于呈现文档或书籍。当您输出 PDF 作品时,打开它,会发现有几页是颠倒的。 你该怎么办? 将这些页面倒置扫描,按顺序排列,最后创建正确的 PDF 文件? 当然&#xff0…

暑假第三周任务——天气预报

暑假第三周任务——天气预报 文章目录 暑假第三周任务——天气预报前言URL与APIAPI与URL的关系 获取网络请求首页搜索界面详情界面添加功能 浏览界面总结 前言 这个天气预报主要是通过申请网络请求来获取实时数据,来实现一个天气预报的功能,在这里主要是…

对优先级队列(堆)的理解

目录: 一. 优先级队列: 二. 优先级队列的模拟实现: 三.常用接口介绍: 一. 优先级队列: 1 概念: 队列是一种先进先出的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时…

红酒与爱情:浪漫时刻的佳酿

在爱情的世界里,红酒如同一首温柔的诗篇,轻轻诉说着浪漫与甜蜜。当定制红酒洒派红酒(Bold & Generous)与爱情相遇,它们共同绘制出一幅幅令人心醉的浪漫画卷,让每一刻都充满了无尽的柔情与温暖。 一、爱…

MLOPS工具集教程-快速入门MLflow

文章目录 一、什么是 MLOps?二、MLOps 工具有什么作用?三、免费开源 MLOps 工具和平台——MLflow3.1 MLflow介绍3.2 安装MLflow3.3启动MLflow3.4 API文档3.5 训练模型演示实例 MLOps 策略越来越多地应用于机器学习模型以及构建这些模型的团队中&#xff…

webpack打包发布~

1、安装webpack(局部安装webpack)。 npm i webpack webpack-cli -D 2、安装成功之后,你会在package.json文件中看到这个。 3、新建webpack.config.js文件,里面写配置编译模式,入口出口等(这里演示的是单入…

任务管理器中的CompatTelRunner进程是做什么的?我该怎样把它关闭

一、问题描述 当我们打开电脑使用时候会发现系统反应较慢,使用起来没有那么流畅;此时我们打开任务管理器后发现是一个名为【CompatTelRunner】的进程占用大量的CPU资源导致(点击任务管理器的CPU字样即可对使用资源进行排序)&#…

【靶场实操】sql-labs通关详解----第二节:前端页面相关(Less-11-Less-17)

SQL注入攻击是一种针对Web应用程序的安全漏洞,那么自然,SQL注入攻击也和前端页面息息相关,用户输入未被正确处理、动态查询的构建、前端JavaScript代码错误,等等我问题都可能造成安全威胁。 在上一节,我们了解了基础的…

23届24届均可投!Engineering Star Program火热进行中

Hi 大家好,我是Chowley,我们组现在还有个青年工程师的HC(23-24届均可),正在寻找QA队友,有兴趣用我内推码官网投递,简历直接发我ld 我是今年校招进入的虾皮,现在full-time两个月了&a…

互联网十万个为什么之什么是负载均衡?

负载均衡是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务器来扩展应用系统的吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。 为什么需要负载均衡? 负载均衡的出现主要是为了解决用户在网络服务…

【Godot4自学手册】第四十三用着色器(shader)给纹理描边

这一节我们学一下用着色器(shader)描边效果。来看看最终效果: 一、进行shader初始设置 首先我们进入NPC场景,选择Sprite2D节点,在检查器中中岛CanvasItem属性,并在Material->Material后方选择下拉按钮…

如何从智联招聘网站快速抓取职位详情?两大技巧揭秘

摘要: 本文将揭秘如何利用Python爬虫技术,高效且合法地从智联招聘网站抓取职位详情信息。通过实战示例,展现两大核心技巧,助你在大数据时代抢占先机,为你的市场分析、人才研究提供强大支持。 一、引言:数据…