基于51单片机的温湿度监测系统设计

第一章 绪论

温湿度监测是农业大棚、仓储环境、智能家居、工业车间等场景的基础需求,51单片机(以STC89C52为代表)凭借成本低廉、编程简单、外设适配性强的特点,成为中小型温湿度监测系统的首选主控单元。传统温湿度监测多依赖人工记录或单一显示仪表,存在数据滞后、无预警、无法追溯的问题,而基于51单片机的监测系统可实现温湿度实时采集、数字化显示、超限告警,兼顾实用性与易用性,适配低成本、小范围的温湿度管控需求。本设计以STC89C52单片机为核心,结合DHT11温湿度传感器构建一套简易且稳定的温湿度监测系统,实现0-50℃、20%-90%RH范围内的精准监测与超限声光告警,满足基础场景的温湿度管理需求。

第二章 系统核心原理与硬件架构

本系统硬件架构以STC89C52单片机为核心,分为核心控制模块、温湿度采集模块、显示模块、告警模块、电源模块五部分,结构简洁且易搭建:

  1. 核心控制模块:选用STC89C52单片机,其内置定时器/计数器、通用I/O口可满足传感器数据读取、显示驱动、告警控制需求;最小系统包含5V稳压供电、11.0592MHz晶振、复位电路,支持USB/电池双供电,适配便携/固定部署场景。
  2. 温湿度采集模块(核心):采用DHT11数字温湿度传感器,通过单总线协议与单片机GPIO口通信,无需额外ADC转换;DHT11测温范围0-50℃(精度±2℃),测湿范围20%-90%RH(精度±5%RH),采样周期设为2秒,兼顾实时性与功耗。
  3. 显示模块:选用LCD1602字符显示屏,通过并行I/O口与单片机连接,实时显示“Temp: XX℃ Hum: XX%RH”,直观呈现温湿度数据;LCD1602自带背光,适配暗光环境查看。
  4. 告警模块:采用蜂鸣器+双色LED灯实现超限告警——
    • 正常状态:绿色LED常亮,蜂鸣器静音;
    • 超限状态:红色LED闪烁(1Hz),蜂鸣器间断鸣响(1Hz),提示温湿度超出预设阈值;
      阈值可通过代码预设(如温度≥30℃/≤10℃、湿度≥80%/≤30%),也可扩展按键实现自定义修改。
  5. 电源模块:采用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 代码关键说明
  1. DHT11通信:通过单总线协议实现,核心是严格的时序控制(起始信号、响应信号、数据位读取),代码中延时函数需根据实际单片机主频微调;
  2. LCD1602驱动:采用并行方式驱动,指令简单,重点是光标定位(0x80对应第一行,0xC0对应第二行);
  3. 告警逻辑:判断温湿度是否超出预设阈值,超限则触发红LED闪烁+蜂鸣器鸣响,正常则绿灯常亮;
  4. 采样周期:设置为2秒,避免频繁采样导致传感器数据不稳定。

第四章 系统测试与验证

4.1 测试环境与步骤
  1. 硬件搭建:按电路图连接51单片机、DHT11、LCD1602、LED、蜂鸣器,确保接线无误(尤其DHT11的VCC接5V,GND接地,DATA接P1^0);
  2. 程序下载:通过ISP下载器将编译后的hex文件写入STC89C52;
  3. 功能测试
    • 正常环境:LCD显示当前温湿度,绿灯常亮,无告警;
    • 超限测试:用手捂住DHT11(升温增湿),当温度≥30℃或湿度≥80%时,红灯闪烁+蜂鸣器鸣响;
    • 恢复测试:移开手,温湿度回落至阈值内,系统恢复绿灯常亮,告警停止。
4.2 测试结果
  • 温湿度采集误差:温度±1℃,湿度±3%RH,符合DHT11的标称精度;
  • 显示效果:LCD1602数据刷新稳定,无乱码;
  • 告警响应:超限后1秒内触发告警,恢复后立即停止,逻辑准确;
  • 功耗:5V供电时整机电流≤50mA,4节5号电池可连续工作≥8小时。

总结

  1. 本设计基于51单片机+DHT11实现了温湿度的实时采集、显示与超限告警,硬件电路简洁,代码易理解,适合新手入门;
  2. DHT11采用单总线通信,无需ADC,大幅简化硬件设计,LCD1602直观展示数据,分级告警提升实用性;
  3. 系统成本≤30元,可通过扩展按键(修改阈值)、EEPROM(保存历史数据)、串口(数据上传)实现功能升级,适配更多场景。在这里插入图片描述
    在这里插入图片描述
    文章底部可以获取博主的联系方式,获取源码、查看详细的视频演示,或者了解其他版本的信息。
    所有项目都经过了严格的测试和完善。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐