51 单片机 + SHT11+1602 液晶 温湿度采集系统(完整代码 + 详细解析)

✅ 文末提供代码和仿真文件!

在单片机项目开发中,温湿度采集是非常基础且常用的功能场景,比如环境监测、智能家居、工业控制等领域。本文将详细介绍如何基于 51 单片机(REG52 核心)、SHT11 数字温湿度传感器和 1602 液晶显示屏,实现一套完整的温湿度实时采集与显示系统。文中包含完整可运行代码、硬件连接说明、核心函数解析,适合单片机初学者入门学习,也可作为实际项目开发参考。

仿真效果

在这里插入图片描述

硬件组成

主控芯片:51 单片机(如 STC89C52RC)
温湿度传感器:SHT11(数字式,集成温度湿度测量,I2C-like 通信)
显示模块:1602 液晶显示屏(2 行 16 列,用于直观展示温湿度数据)
辅助电路:电源模块、上拉电阻(SHT11 数据线需上拉)

系统工作流程

  1. 单片机上电初始化:初始化 1602 液晶、重置 SHT11 传感器通信状态。
  2. 1602 液晶显示初始界面:第一行显示 “Temp: C”,第二行显示 “Humi: % RH”。
  3. 循环采集温湿度:
    向 SHT11 发送温度 / 湿度测量命令。
    读取 SHT11 返回的 16 位原始数据及 CRC 校验码。
    对原始数据进行校准(非线性补偿、温度依赖性补偿)。
    将校准后的温湿度值格式转换为 ASCII 码,显示到 1602 液晶指定位置。
  4. 异常处理:若通信出错,自动重置 SHT11 传感器,确保系统稳定运行。

代码

在这里插入图片描述

主函数逻辑:

// 延时函数(ms级)
void delay(int z) {
    int x,y;
    for(x=z;x>0;x--)
        for(y=125;y>0;y--);
}

void main() {
    unsigned int temp, humi;
    value humi_val, temp_val;  // 存储温湿度数据的联合体
    uchar error;               // 通信错误标志
    uchar checksum;            // CRC校验码
    uchar TEMP1[7];            // 温度显示缓存
    uchar HUMI1[6];            // 湿度显示缓存
    
    LCD_Initial();  // 初始化液晶
    // 初始化显示界面
    GotoXY(0,0); Print("Temp:      C");  // 第一行:温度标识
    GotoXY(0,1); Print("Humi:     %RH"); // 第二行:湿度标识
    s_connectionreset();  // 复位SHT11通信
    
    while(1) {
        error=0;
        // 测量温度和湿度
        error += s_measure((uchar*)&temp_val.i, &checksum, TEMP);
        error += s_measure((uchar*)&humi_val.i, &checksum, HUMI);
        
        if(error!=0) {
            s_connectionreset();  // 通信错误,复位传感器
        } else {
            // 转换为浮点型并校准
            humi_val.f = (float)humi_val.i;
            temp_val.f = (float)temp_val.i;
            calc_sth10(&humi_val.f, &temp_val.f);
            
            // 数据格式转换(保留1位小数,去除前置零)
            temp = temp_val.f * 10;  // 25.3℃ → 253
            TEMP1[0] = temp/1000+'0';  // 百位
            if(TEMP1[0]=='0') TEMP1[0]=' ';  // 前置零替换为空格
            TEMP1[1] = temp%1000/100+'0';  // 十位
            if(TEMP1[1]=='0' && TEMP1[0]==' ') TEMP1[1]=' ';
            TEMP1[2] = temp%100/10+'0';  // 个位
            TEMP1[3] = '.';  // 小数点
            TEMP1[4] = temp%10+'0';  // 小数位
            TEMP1[5] = 0xdf;  // 摄氏度符号(℃)
            TEMP1[6] = '\0';
            
            humi = humi_val.f * 10;  // 60.5%RH → 605
            HUMI1[0] = humi/1000+'0';
            if(HUMI1[0]=='0') HUMI1[0]=' ';
            HUMI1[1] = humi%1000/100+'0';
            if(HUMI1[1]=='0' && HUMI1[0]==' ') HUMI1[1]=' ';
            HUMI1[2] = humi%100/10+'0';
            HUMI1[3] = '.';
            HUMI1[4] = humi%10+'0';
            HUMI1[5] = '\0';
            
            // 显示到液晶
            GotoXY(5,0); Print(TEMP1);  // 温度显示在第一行第5列
            GotoXY(5,1); Print(HUMI1);  // 湿度显示在第二行第5列
        }
        delay(800);  // 延时800ms,避免测量过于频繁
    }
}

调试与注意事项

  1. 通信稳定性:SHT11 对时序要求较高,若数据显示异常,需检查_nop_()延时是否足够(可适当增加延时次数),或接线是否松动。
  2. 校准参数:代码中校准参数适用于 12 位湿度、14 位温度和 5V 供电,若传感器配置不同(如 8 位精度),需修改calc_sth10()中的参数。
  3. 液晶显示:若液晶无显示,先检查电源和接线,再确认LCD_Initial()函数中的初始化命令是否正确(如 0x38 为 8 位接口,0x28 为 4 位接口)。
  4. CRC 校验:代码中保留了 CRC 校验码读取,但未实现校验逻辑,若需更高可靠性,可添加 CRC 校验函数(参考 SHT11 数据手册)。

完整代码获取

在小程序内复制网盘链接下载后,直接解压即可。
https://www.kdocs.cn/l/cdKOEx0g5dWQ

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值