基于51单片机的温湿度监测
·
基于51单片机的温湿度监测系统设计
第一章 绪论
温湿度监测是农业大棚、仓储环境、智能家居、工业车间等场景的基础需求,51单片机(以STC89C52为代表)凭借成本低廉、编程简单、外设适配性强的特点,成为中小型温湿度监测系统的首选主控单元。传统温湿度监测多依赖人工记录或单一显示仪表,存在数据滞后、无预警、无法追溯的问题,而基于51单片机的监测系统可实现温湿度实时采集、数字化显示、超限告警,兼顾实用性与易用性,适配低成本、小范围的温湿度管控需求。本设计以STC89C52单片机为核心,结合DHT11温湿度传感器构建一套简易且稳定的温湿度监测系统,实现0-50℃、20%-90%RH范围内的精准监测与超限声光告警,满足基础场景的温湿度管理需求。
第二章 系统核心原理与硬件架构
本系统硬件架构以STC89C52单片机为核心,分为核心控制模块、温湿度采集模块、显示模块、告警模块、电源模块五部分,结构简洁且易搭建:
- 核心控制模块:选用STC89C52单片机,其内置定时器/计数器、通用I/O口可满足传感器数据读取、显示驱动、告警控制需求;最小系统包含5V稳压供电、11.0592MHz晶振、复位电路,支持USB/电池双供电,适配便携/固定部署场景。
- 温湿度采集模块(核心):采用DHT11数字温湿度传感器,通过单总线协议与单片机GPIO口通信,无需额外ADC转换;DHT11测温范围0-50℃(精度±2℃),测湿范围20%-90%RH(精度±5%RH),采样周期设为2秒,兼顾实时性与功耗。
- 显示模块:选用LCD1602字符显示屏,通过并行I/O口与单片机连接,实时显示“Temp: XX℃ Hum: XX%RH”,直观呈现温湿度数据;LCD1602自带背光,适配暗光环境查看。
- 告警模块:采用蜂鸣器+双色LED灯实现超限告警——
- 正常状态:绿色LED常亮,蜂鸣器静音;
- 超限状态:红色LED闪烁(1Hz),蜂鸣器间断鸣响(1Hz),提示温湿度超出预设阈值;
阈值可通过代码预设(如温度≥30℃/≤10℃、湿度≥80%/≤30%),也可扩展按键实现自定义修改。
- 电源模块:采用5V USB供电(兼容手机充电器/移动电源),或4节5号电池(6V转5V稳压),加入防反接保护,输出纹波≤100mV,保障传感器与单片机稳定工作。
第三章 系统软件设计与功能实现
系统软件基于Keil C51编译器开发,采用模块化编程思路,核心流程为“初始化→传感器数据读取→数据处理→显示→超限判断→告警”,代码简洁易理解,适合新手学习与调试:
3.1 核心代码实现
#include <reg52.h>
#include <intrins.h>
// 端口定义
sbit DHT11_DQ = P1^0; // DHT11数据引脚
sbit LCD_RS = P2^0; // LCD1602寄存器选择
sbit LCD_RW = P2^1; // LCD1602读写控制
sbit LCD_EN = P2^2; // LCD1602使能
sbit LED_GREEN = P3^0; // 绿色LED
sbit LED_RED = P3^1; // 红色LED
sbit BUZZER = P3^2; // 蜂鸣器
// 温湿度存储变量
unsigned char hum_high, hum_low, temp_high, temp_low;
// 告警阈值(可自定义)
#define TEMP_MAX 30 // 温度上限
#define TEMP_MIN 10 // 温度下限
#define HUM_MAX 80 // 湿度上限
#define HUM_MIN 30 // 湿度下限
// 延时函数(DHT11通信专用)
void delay_us(unsigned int us) {
while(us--);
}
void delay_ms(unsigned int ms) {
unsigned int i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
// LCD1602写命令
void LCD_WriteCmd(unsigned char cmd) {
LCD_RS = 0;
LCD_RW = 0;
P0 = cmd;
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
}
// LCD1602写数据
void LCD_WriteData(unsigned char dat) {
LCD_RS = 1;
LCD_RW = 0;
P0 = dat;
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
}
// LCD1602初始化
void LCD_Init() {
LCD_WriteCmd(0x38); // 8位接口,2行显示,5*7点阵
LCD_WriteCmd(0x0c); // 开显示,关光标
LCD_WriteCmd(0x06); // 光标右移,不刷屏
LCD_WriteCmd(0x01); // 清屏
delay_ms(2);
}
// DHT11读取温湿度数据
bit DHT11_ReadData() {
unsigned char i, buf[5];
// 主机发送起始信号
DHT11_DQ = 0;
delay_ms(20);
DHT11_DQ = 1;
delay_us(30);
// 等待DHT11响应
if(DHT11_DQ == 0) {
while(DHT11_DQ == 0); // 等待响应低电平结束
while(DHT11_DQ == 1); // 等待准备低电平开始
// 读取40位数据
for(i=0;i<5;i++) {
buf[i] = 0;
for(unsigned char j=8;j>0;j--) {
while(DHT11_DQ == 0); // 等待数据位低电平结束
delay_us(40); // 判定高电平时长
if(DHT11_DQ == 1) buf[i] |= (1<<(j-1));
while(DHT11_DQ == 1); // 等待数据位高电平结束
}
}
// 校验(字节0+1+2+3=字节4)
if(buf[0]+buf[1]+buf[2]+buf[3] == buf[4]) {
hum_high = buf[0]; // 湿度整数部分
hum_low = buf[1]; // 湿度小数部分(DHT11恒为0)
temp_high = buf[2]; // 温度整数部分
temp_low = buf[3]; // 温度小数部分(DHT11恒为0)
return 1;
}
}
return 0;
}
// 温湿度显示
void Display_Data() {
// 第一行显示温度
LCD_WriteCmd(0x80); // 光标定位到第一行第1列
LCD_WriteData('T');
LCD_WriteData('e');
LCD_WriteData('m');
LCD_WriteData('p');
LCD_WriteData(':');
LCD_WriteData(temp_high/10 + '0');
LCD_WriteData(temp_high%10 + '0');
LCD_WriteData('C');
// 第二行显示湿度
LCD_WriteCmd(0xC0); // 光标定位到第二行第1列
LCD_WriteData('H');
LCD_WriteData('u');
LCD_WriteData('m');
LCD_WriteData(':');
LCD_WriteData(hum_high/10 + '0');
LCD_WriteData(hum_high%10 + '0');
LCD_WriteData('%');
LCD_WriteData('R');
LCD_WriteData('H');
}
// 超限告警判断
void Alarm_Check() {
if(temp_high > TEMP_MAX || temp_high < TEMP_MIN || hum_high > HUM_MAX || hum_high < HUM_MIN) {
LED_GREEN = 1; // 关闭绿灯
LED_RED = 0; // 红灯闪烁
BUZZER = 0; // 蜂鸣器响
delay_ms(500);
LED_RED = 1;
BUZZER = 1;
delay_ms(500);
} else {
LED_GREEN = 0; // 绿灯常亮
LED_RED = 1; // 关闭红灯
BUZZER = 1; // 关闭蜂鸣器
}
}
// 主函数
void main() {
LCD_Init();
LED_GREEN = 0; // 初始绿灯常亮
LED_RED = 1;
BUZZER = 1;
while(1) {
if(DHT11_ReadData()) { // 成功读取数据
Display_Data(); // 显示温湿度
Alarm_Check(); // 告警判断
}
delay_ms(2000); // 2秒采样一次
}
}
3.2 代码关键说明
- DHT11通信:通过单总线协议实现,核心是严格的时序控制(起始信号、响应信号、数据位读取),代码中延时函数需根据实际单片机主频微调;
- LCD1602驱动:采用并行方式驱动,指令简单,重点是光标定位(0x80对应第一行,0xC0对应第二行);
- 告警逻辑:判断温湿度是否超出预设阈值,超限则触发红LED闪烁+蜂鸣器鸣响,正常则绿灯常亮;
- 采样周期:设置为2秒,避免频繁采样导致传感器数据不稳定。
第四章 系统测试与验证
4.1 测试环境与步骤
- 硬件搭建:按电路图连接51单片机、DHT11、LCD1602、LED、蜂鸣器,确保接线无误(尤其DHT11的VCC接5V,GND接地,DATA接P1^0);
- 程序下载:通过ISP下载器将编译后的hex文件写入STC89C52;
- 功能测试:
- 正常环境:LCD显示当前温湿度,绿灯常亮,无告警;
- 超限测试:用手捂住DHT11(升温增湿),当温度≥30℃或湿度≥80%时,红灯闪烁+蜂鸣器鸣响;
- 恢复测试:移开手,温湿度回落至阈值内,系统恢复绿灯常亮,告警停止。
4.2 测试结果
- 温湿度采集误差:温度±1℃,湿度±3%RH,符合DHT11的标称精度;
- 显示效果:LCD1602数据刷新稳定,无乱码;
- 告警响应:超限后1秒内触发告警,恢复后立即停止,逻辑准确;
- 功耗:5V供电时整机电流≤50mA,4节5号电池可连续工作≥8小时。
总结
- 本设计基于51单片机+DHT11实现了温湿度的实时采集、显示与超限告警,硬件电路简洁,代码易理解,适合新手入门;
- DHT11采用单总线通信,无需ADC,大幅简化硬件设计,LCD1602直观展示数据,分级告警提升实用性;
- 系统成本≤30元,可通过扩展按键(修改阈值)、EEPROM(保存历史数据)、串口(数据上传)实现功能升级,适配更多场景。


文章底部可以获取博主的联系方式,获取源码、查看详细的视频演示,或者了解其他版本的信息。
所有项目都经过了严格的测试和完善。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。
更多推荐
所有评论(0)