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

硬件组成
主控芯片:51 单片机(如 STC89C52RC)
温湿度传感器:SHT11(数字式,集成温度湿度测量,I2C-like 通信)
显示模块:1602 液晶显示屏(2 行 16 列,用于直观展示温湿度数据)
辅助电路:电源模块、上拉电阻(SHT11 数据线需上拉)
系统工作流程
- 单片机上电初始化:初始化 1602 液晶、重置 SHT11 传感器通信状态。
- 1602 液晶显示初始界面:第一行显示 “Temp: C”,第二行显示 “Humi: % RH”。
- 循环采集温湿度:
向 SHT11 发送温度 / 湿度测量命令。
读取 SHT11 返回的 16 位原始数据及 CRC 校验码。
对原始数据进行校准(非线性补偿、温度依赖性补偿)。
将校准后的温湿度值格式转换为 ASCII 码,显示到 1602 液晶指定位置。 - 异常处理:若通信出错,自动重置 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,避免测量过于频繁
}
}
调试与注意事项
- 通信稳定性:SHT11 对时序要求较高,若数据显示异常,需检查_nop_()延时是否足够(可适当增加延时次数),或接线是否松动。
- 校准参数:代码中校准参数适用于 12 位湿度、14 位温度和 5V 供电,若传感器配置不同(如 8 位精度),需修改calc_sth10()中的参数。
- 液晶显示:若液晶无显示,先检查电源和接线,再确认LCD_Initial()函数中的初始化命令是否正确(如 0x38 为 8 位接口,0x28 为 4 位接口)。
- CRC 校验:代码中保留了 CRC 校验码读取,但未实现校验逻辑,若需更高可靠性,可添加 CRC 校验函数(参考 SHT11 数据手册)。
完整代码获取
在小程序内复制网盘链接下载后,直接解压即可。
https://www.kdocs.cn/l/cdKOEx0g5dWQ

1467

被折叠的 条评论
为什么被折叠?



