STC12C5A60S2单片机驱动DHT11和0.96寸OLED,手把手教你做个桌面温湿度计(附完整代码)
STC12C5A60S2单片机驱动DHT11和0.96寸OLED,手把手教你做个桌面温湿度计(附完整代码)
在智能家居和物联网应用中,温湿度监测是最基础的功能之一。本文将带你用STC12C5A60S2单片机和0.96寸OLED屏幕,配合DHT11温湿度传感器,打造一个实用又美观的桌面温湿度计。这个项目不仅适合51单片机初学者练手,也能为你的工作台增添科技感。
1. 硬件选型与准备
1.1 核心器件介绍
STC12C5A60S2单片机是STC12系列中的增强型51单片机,相比传统89C52有以下优势:
- 工作频率更高(最高35MHz)
- 内置60KB Flash和1280B RAM
- 完全兼容传统51指令集
- 支持ISP在线编程
DHT11温湿度传感器特性参数:
| 参数 | 数值范围 | 精度 |
|---|---|---|
| 温度测量范围 | 0-50℃ | ±2℃ |
| 湿度测量范围 | 20-90%RH | ±5%RH |
| 供电电压 | 3.3-5.5V | 单总线通信 |
0.96寸OLED屏幕选用I2C接口版本,主要特点:
- 分辨率:128×64
- 驱动芯片:SSD1306
- 可视角度:>160度
- 无需背光,自发光
- 超薄设计(仅0.96mm)
1.2 物料清单
- STC12C5A60S2开发板 ×1
- DHT11温湿度模块 ×1
- 0.96寸OLED屏幕(I2C接口)×1
- 面包板/洞洞板 ×1
- 杜邦线若干
- USB供电线 ×1
2. 硬件连接与电路设计
2.1 引脚分配方案
STC12引脚 外设连接 P1.1 DHT11数据线 P2.0 OLED_SCL P2.1 OLED_SDA VCC 5V供电 GND 共地2.2 实际接线示意图
注意:DHT11和OLED都需要上拉电阻(4.7K-10K),如果模块已内置则可省略
[VCC]----[5V电源] | | | [4.7K] | | [DHT11] [OLED] | | [P1.1] [P2.0/P2.1] | [GND]----[共地]2.3 供电方案选择
- USB供电:最简便的方案,直接使用手机充电器
- 电池供电:可选用3.7V锂电池+升压模块
- 建议:初期开发使用USB供电,成品可考虑电池方案
3. 软件实现与代码解析
3.1 DHT11驱动实现
DHT11采用单总线协议,时序要求严格。以下是关键代码:
// DHT11起始信号 void DHT11_start() { DHT11_IO = 1; Delaynus(2); DHT11_IO = 0; Delaynms(20); DHT11_IO = 1; Delaynus(13); } // 接收一个字节 unsigned char DHT11_rec_byte() { unsigned char i, dat = 0; for(i=0; i<8; i++) { while(!DHT11_IO); // 等待低电平结束 Delaynus(16); // 延时判断高低电平 dat <<= 1; if(DHT11_IO == 1) dat += 1; while(DHT11_IO); // 等待高电平结束 } return dat; }调试技巧:用示波器观察时序波形,确保高低电平持续时间符合规格书要求
3.2 OLED显示驱动
OLED驱动主要包含初始化、清屏和显示函数:
// OLED初始化序列 void OLED_Init(void) { Delayms(50); Write_IIC_Command(0xAE); // 关闭显示 Write_IIC_Command(0x20); // 设置内存寻址模式 Write_IIC_Command(0x10); // 水平寻址模式 // ...更多初始化命令 Write_IIC_Command(0xAF); // 开启显示 } // 显示中文字符 void OLED_ShowCHinese(unsigned char x, unsigned char y, unsigned char no) { unsigned char t, adder=0; OLED_SetPos(x,y); for(t=0;t<16;t++) Write_IIC_Data(F16x16[2*no][t]); OLED_SetPos(x,y+1); for(t=0;t<16;t++) Write_IIC_Data(F16x16[2*no+1][t]); }3.3 主程序逻辑
主程序实现数据采集与显示的完整流程:
void main() { Delaynms(1000); // 上电延时 OLED_Init(); // 屏幕初始化 OLED_CLEAR(); // 清屏 while(1) { DHT11_get_Data(); // 获取温湿度 // 显示温度 OLED_ShowCHinese(0,0,0); // "温" OLED_ShowCHinese(18,0,1); // "度" OLED_ShowNum(50,0,RH,2,15); // 显示湿度 OLED_ShowCHinese(0,3,2); // "湿" OLED_ShowCHinese(18,3,3); // "度" OLED_ShowNum(50,3,TH,2,15); Delaynms(1000); // 1秒刷新 } }4. 项目优化与扩展
4.1 显示效果优化
界面布局建议:
+---------------------+ | 温度: 25℃ | | | | 湿度: 60%RH | +---------------------+可通过以下代码实现更美观的显示:
// 添加单位显示 OLED_ShowString(70, 0, "℃"); OLED_ShowString(70, 3, "%RH"); // 添加边框 OLED_DrawBMP(0, 0, 128, 8, border_top); OLED_DrawBMP(0, 56, 128, 64, border_bottom);4.2 功能扩展建议
增加时间显示:
- 加入DS1302时钟模块
- 在OLED上显示实时时间
数据记录功能:
- 添加SD卡模块
- 定时记录温湿度数据
报警功能:
- 设置温湿度阈值
- 超过阈值时蜂鸣器报警
无线传输:
- 加入ESP8266 WiFi模块
- 将数据上传到物联网平台
4.3 常见问题解决
问题1:DHT11读取失败
- 检查接线是否正确
- 确保上拉电阻已接
- 调整延时参数(不同单片机频率需微调)
问题2:OLED显示乱码
- 确认字库数据正确
- 检查初始化序列是否完整
- 确保I2C时序符合规格
问题3:内存不足
- 优化字库存储(只保留必要字符)
- 使用STC12的扩展RAM
- 启用内存压缩选项(Keil中设置)
5. 完整工程代码获取
本项目的完整代码包含:
- 主程序框架
- DHT11驱动
- OLED显示驱动
- 字库文件
- 延时函数库
代码已托管在GitHub,可通过以下链接获取: [项目仓库链接]
在实际调试中发现,DHT11对时序要求严格,建议首次使用时先用示波器验证波形。OLED显示部分,如果出现残影问题,可以尝试在清屏后增加短暂延时。
