基于51单片机的温湿度检测系统Protues仿真设计
目录
1 背景介绍
2 系统功能
3 硬件电路设计
3.1 主控芯片
3.2 液晶显示模块LCD1602
3.3 按键输入模块
3.4 时钟电路和复位电路
4 软件设计
4.1系统软件流程
4.2中断处理模块程序设计
4.3显示模块程序设计
4.4输入处理模块程序设计
5 系统测试
5.1 显示模块功能的实现
5.2 按键检测模块的实现
1 背景介绍
随着科技的不断发展和人们对舒适生活的追求,温湿度传感系统成为了现代家居、工业以及农业领域中必不可少的一部分。在各种应用场景中,对环境温湿度的监测和控制都具有重要的意义。
在家庭生活中,人们对于室内温湿度的舒适度有着较高的要求。过高或过低的温度都会影响人们的生活质量和健康,而过高或过低的湿度则可能导致室内空气质量下降,甚至引发霉菌滋生等问题。因此,通过温湿度传感系统可以及时监测室内环境的变化,使人们能够采取相应的措施来调节室内环境,保持舒适的居住环境。
在工业生产中,温湿度的控制也非常重要。在一些特殊的生产场所,如电子工厂、制药厂等,对于温湿度的要求非常严格。过高或过低的温度湿度都可能导致产品质量下降甚至生产事故发生。因此,通过温湿度传感系统可以实时监测生产场所的环境变化,及时采取措施来确保生产环境的稳定性和产品质量的可控性。
在农业生产中,温湿度传感系统同样具有重要意义。温湿度对于作物生长的影响不可忽视,过高或过低的温度湿度都可能导致作物生长受阻,甚至影响到农作物的产量和质量。因此,通过温湿度传感系统可以及时监测农田的环境变化,帮助农民采取相应的措施来调节农田环境,保障农作物的健康生长和丰收。
基于上述背景,温湿度传感系统的设计是基于现代生活对于舒适环境的追求以及各个领域对于环境变化的实时监测和控制需求。通过这样的系统设计,可以有效地提高生活质量、保障工业生产安全、促进农业生产发展,为人们的生活带来更多的便利和福祉。
2 系统功能
本设计旨在开发一个基于51单片机的温湿度传感系统,采用DHT11作为温湿度数字传感器,实现对周围环境的温度和湿度进行检测,采用LCD1602作为显示器,实时显示温湿度数据在屏幕上,C51单片机作为控制器,按钮作为切换器。上电启动后,单片机每隔一段时间,对传感器信号进行采集一次,进行适当处理后,转换成对应的温度和湿度,LCD1602显示当前的温度,按下切换按钮,屏幕显示当前的湿度。系统框图如图2-1所示。
3 硬件电路设计
基于51单片机的温湿度检测系统的硬件电路设计主要由主控芯片、液晶显示模块、按键输入模块、时钟电路和复位电路等部分构成。主控芯片是系统的核心,通过IO口控制液晶显示模块,同时也可以接收按键输入模块的信号。液晶显示模块LCD1602用于显示温湿度的测量值及相关信息;按键输入模块用于接收用户的操作输入,通过按下按钮,可以实现温湿度显示内容的切换。时钟电路是为主控芯片提供稳定的时钟信号,通过确定的振荡频率,主控芯片可以按照时序进行正常的工作和指令执行;复位电路可以使用复位按钮或者上电复位电路,通过将主控芯片的复位引脚拉低一段时间来实现复位操作。
3.1 主控芯片
主控芯片是系统的核心,常见的系列有STC89C5x、AT89C51等。它通过IO口控制液晶显示模块,实时显示所测量的温湿度的值,同时也可以接收按键输入模块的信号,通过按键按下切换显示的内容。电路原理图如图3-1所示。
3.2 液晶显示模块LCD1602
液晶显示模块用于显示温湿度的测量值和相关信。通过控制芯片的指令和数据,可以实时显示温湿度,为用户提供良好的视觉体验。电路原理图如图3-2所示。
3.3 按键输入模块
按键输入模块用于接收用户的操作输入,通过按下按钮,用户可以实现显示内容的切换。在软件设计中,需要考虑防抖处理,以避免因按键抖动产生误操作。电路原理图如下图2-3所示。
3.4 时钟电路和复位电路
时钟电路是为主控芯片提供稳定的时钟信号,常使用晶体振荡器。通过确定的振荡频率,主控芯片可以按照时序进行正常的工作和指令执行。根据系统需要,可以选择合适的晶体频率,通常使用10MHz或者12MHz晶体。
复位电路用于在系统上电或者复位时将主控芯片初始化为一个已知的状态,以确保系统在启动时正常工作。复位电路可以使用复位按钮或者上电复位电路,通过将主控芯片的复位引脚拉低一段时间来实现复位操作。复位、时钟电路原理图如图3-4所示。
4 软件设计
4.1系统软件流程
基于51单片机的温湿度传感系统的软件部分包括三个个主要模块,分别是中断处理模块、显示模块、按键输入模块。中断处理模块是温湿度传感系统的核心,它负责温湿度数据的读取和处理;显示模块主要负责将处理后的温湿度数据显示在液晶屏上;按键输入模块负责读取用户按键操作的输入,用于切换显示的内容。总体软件流程图如图4-1所示:
4.2中断处理模块程序设计
中断处理模块是温湿度传感系统的核心,它负责读取温湿度数据并处理。在每一个定时器中断中,对进入定时器中断的次数进行累加,当累加次数达到50次时,读取一次温湿度数据,并将处理后的数据放入显示数组里,用于LCD1602实时显示。中断处理模块程序设计流程图如图4-2所示。
4.3显示模块程序设计
显示模块主要负责将温湿度实时显示在液晶屏上。它通过调用液晶屏的相关API显示温湿度数据,显示模块程序设计流程图如图4-3所示:
4.4输入处理模块程序设计
输入处理模块负责读取用户按键操作的输入,实现显示内容的切换,显示模块程序设计流程图如图4-4所示。
main.c程序如下:
#include<reg51.h>
#include "DHT11.h"
#include "lcd1602.h"#define uchar unsigned char
#define uint unsigned intsbit exchange =P3^1;//显示切换bit flag=1;//默认显示温度
uchar wendu=0,shidu=0;//温度,湿度
uint dingshi=0;//定时变量
uchar wen_lim=40,shi_lim=50;//温度阀值
uchar a[]="shi:00% ";//时分秒
uchar b[]="wen:00C ";
uchar c[]="Temp or humidity";
void main()
{init_1602();//初始化LCDTMOD=0x01;//初始化定时器0TH0=0x3c;//定时50msTL0=0xb0;ET0=1; //开中断EA=1;TR0=1; //启动T0while(1){ if(exchange==0){flag=~flag;//显示温度}}
}void time0() interrupt 1//定时器中断
{ if(dingshi<10)//定时0.5s{dingshi++;}else{dingshi=0;dht11_recive(); //测量温湿度wendu=dht11_dat[2];shidu=dht11_dat[0];a[4]=wendu/10+0x30;a[5]=wendu%10+0x30;b[4]=shidu/10+0x30;b[5]=shidu%10+0x30;if(flag==0){write_string(1,0,c);write_string(2,5,a);}else{write_string(1,0,c);write_string(2,5,b);}}TH0=0x3c;//定时50msTL0=0xb0;
}
DTH11.c文件
#include "DHT11.h"unsigned char dht11_dat[5];//湿度高低+温度高低+和校验void delay1ms(unsigned int i) //延时函数
{
unsigned char j; while(i--){for(j=0;j<110;j++);}
}void dht11_recive()//接收
{
unsigned char j,k,m;
unsigned int i;SDA=0;delay1ms(30);//开始信号20msSDA=1;for(i=0;i<1000;i++)//等待响应{if(!SDA)break;}if(i==1000){ SDA=1;return;//如果没有响应,返回}for(i=0;i<1000;i++)//等待响应结束{if(SDA)break;}if(i==1000){SDA=1;return;//如果响应超时,返回}for(i=0;i<1000;i++)//等待开始{if(!SDA)break;}if(i==1000){ SDA=1;return;//如果没有响应,返回}
for(k=0;k<5;k++) //接收5个数据{for(j=0;j<8;j++)//接收8位{ m<<=1;//===========================for(i=0;i<1000;i++)//等待0信号结束{if(SDA)break;}if(i==1000){ SDA=1;return;//如果超时,返回}//===========================for(i=0;i<1000;i++)//等待开始信号{if(!SDA)break;}if(i==1000){SDA=1;return;//如果超时,返回}if(i<5)m++;}dht11_dat[k]=~m;}delay1ms(1);
}
lcd1602.c文件
#include "lcd1602.h"void delay_uint(uint i)
{while(i--);
}
/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{e=0;rs=0;rw=0;P0=com;delay_uint(20);e=1;delay_uint(20);e=0;
}/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{e=0;rs=1;rw=0;P0=dat;delay_uint(20);e=1;delay_uint(20);e=0;
}/********************************************************************
* 名称 : 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)
{uchar i;if(hang==1) write_com(0x80+add);elsewrite_com(0x80+0x40+add);for(i=0;i<16;i++){write_data(*p);p++;}
}/********************************************************************
* 名称 : init_1602()
* 功能 : 初始化1602液晶
* 输入 : 无
* 输出 : 无
***********************************************************************/
void init_1602()
{write_com(0x38); //数据总线为8位,显示2行,5x7点阵write_com(0x0e); //开显示,有光标,光标闪烁write_com(0x06); //光标自动右移delay_uint(1000); //等待设置完成
}
5 系统测试
5.1 显示模块功能的实现
液晶显示模块用于显示温湿度数据和相关信息,上电默认显示温度数据,实现效果如图5-1所示。
5.2 按键检测模块的实现
输入处理模块负责读取用户按键操作的输入,按下按键可以实现温湿度显示的切换,实现效果如图5-2所示。
详细演示请见视频:基于51单片机得温湿度捡测系统演示视频-CSDN直播
仿真源文件、源程序及设计报告百度网盘链接:
链接: https://pan.baidu.com/s/1u7kJhvyUC7a5OsE2Uuvo7A?pwd=xuty 提取码: xuty