赞
踩
演示
基于51单片机设计的温湿度采集检测系统仿真&源码&文档视频
目录
该系统通过与AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器的集成,实时读取环境中的温度和湿度数据并在LCD1602上显示这些信息,其中系统初始化LCD1602显示屏、通过DHT11_receive()函数接收并校验DHT11传感器的温湿度数据、使用LCD_ShowNum()函数逐位显示湿度和温度数据并在这些数据后附加相应的单位符号,以便用户可以直观地看到当前环境的温湿度情况。
在现代社会,随着科技的发展和人们生活水平的提高,环境监测变得愈发重要。准确的环境数据对于家庭、办公室、温室以及工业场所的日常运行和健康维护至关重要。其中,温湿度是两项最为基础且重要的环境参数,能够显著影响人类的舒适程度和许多工业过程的效率。因此,设计一个可靠的温湿度检测系统显得尤为必要。
51单片机(Microcontroller Unit, MCU)是一种广泛使用的嵌入式系统核心,它具有简单易用、功能强大、性价比高等优点。51单片机由于其丰富的外围接口容易与其他设备进行集成,开发环境相对成熟,具有丰富的开发资源。此外,其低功耗、稳定性高等特点使得适合各种嵌入式应用中,包括温湿度检测系统。设计基于51单片机的DHT11温湿度检测系统,旨在利用51单片机的强大功能和DHT11的测量能力,实现对环境温湿度的实时监控。实现温湿度数据实时采集,系统能够定时从DHT11传感器读取温湿度数据。数据处理与显示将采集到的数据进行处理,并通过液晶显示屏LCD1602实时显示出来,供用户方便查看。
硬件电路设计采用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 系统仿真图
在主程序设计中,首先,通过包括头文件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");
-
- }
-
- }
在主程序设计中,温湿度采集模块主要用到了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;
- }
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]);
- }
- }
系统上电后,仿真电路中的LCD显示屏会实时显示DHT11温湿度传感器的数据,如下图2所示。
图2 系统上电界面
如下图3所示,当温湿度数据发生变化时,LCD显示屏的数据也会实时发生变化。
图3 温湿度变化
通过本项目的深入研究和系统测试,我们成功地设计并实现了一个基于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温湿度传感器的温湿度数据,当传感器检测到环境温湿度发生变化时,显示屏的数据也会同步更新,证明了系统在数据采集、传输和显示方面的有效性和可靠性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。