Proteus仿真SHT11温湿度传感器,用AT89C52单片机驱动LCD显示(附完整代码和按键校准)
Proteus仿真SHT11温湿度传感器与AT89C52单片机系统开发实战在嵌入式系统开发中温湿度监测是一个经典而实用的项目场景。本文将带你从零开始构建一个完整的Proteus仿真系统使用AT89C52单片机驱动SHT11温湿度传感器并通过1602 LCD显示屏实时显示测量结果。不同于基础教程我们将重点探讨传感器校准这一实际开发中的关键问题提供可直接用于课程设计或毕业项目的完整解决方案。1. 系统架构设计与环境搭建1.1 硬件组件选型与连接本系统核心硬件包括主控芯片AT89C52单片机8位CPU8KB Flash ROM传感器模块SHT11数字温湿度传感器精度±0.4℃25℃±3%RH显示模块1602字符型LCD16x2显示行校准输入4个轻触按键P1.2-P1.5硬件连接示意图SHT11 AT89C52 1602 LCD ----- ------- ------- DATA ---- P1.1 DB0-DB7 -- P0 SCK ---- P1.0 RS ---- P2.0 RW ---- P2.1 E ---- P2.21.2 Proteus仿真环境配置在Proteus ISIS中搭建电路时需注意添加元件时搜索AT89C52、SHT11和LM016L1602 LCD模型晶振频率设置为11.0592MHz确保串口通信准确在SHT11属性中设置初始环境参数Temperature 25.0 Humidity 50.02. SHT11传感器驱动开发2.1 通信协议实现SHT11采用二线制串行接口SCK时钟线DATA数据线需严格遵循其时序要求。关键函数实现如下// 启动传输时序 void s_transstart(void) { DATA 1; SCK 0; _nop_(); SCK 1; _nop_(); DATA 0; _nop_(); SCK 0; _nop_(); _nop_(); _nop_(); SCK 1; _nop_(); DATA 1; _nop_(); SCK 0; } // 读取传感器数据 char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) { unsigned error 0; s_transstart(); switch(mode) { case TEMP: error s_write_byte(MEASURE_TEMP); break; case HUMI: error s_write_byte(MEASURE_HUMI); break; } while(DATA i 65535); // 等待测量完成 *(p_value) s_read_byte(ACK); // 高字节 *(p_value1) s_read_byte(ACK); // 低字节 *p_checksum s_read_byte(noACK); return error; }2.2 温湿度值补偿计算SHT11原始数据需进行非线性补偿和温度补偿void calc_sth10(float *p_humidity, float *p_temperature) { const float C1-4.0, C20.0405, C3-0.0000028; // 湿度补偿系数 const float T10.01, T20.00008; // 温度补偿系数 float rh *p_humidity; float t *p_temperature; float t_C t*0.01 - 40; // 转换为摄氏度 // 非线性补偿 float rh_lin C3*rh*rh C2*rh C1; // 温度依赖性补偿 *p_humidity (t_C-25)*(T1T2*rh) rh_lin; *p_temperature t_C; // 限幅处理 if(*p_humidity100) *p_humidity100; if(*p_humidity0.1) *p_humidity0.1; }3. LCD显示系统实现3.1 1602 LCD驱动开发LCD控制器采用HD44780兼容芯片需实现以下基本操作// LCD初始化序列 void LCD_Initial() { E 0; LCD_Write(LCD_COMMAND, 0x38); // 8位模式2行显示 LCD_Write(LCD_COMMAND, 0x0C); // 显示开无光标 LCD_Write(LCD_COMMAND, 0x06); // 增量模式不移位 LCD_Write(LCD_COMMAND, 0x01); // 清屏 delay(5); } // 字符显示函数 void Print(unsigned char *str) { while(*str ! \0) { LCD_Write(LCD_DATA, *str); str; } }3.2 温湿度数据显示优化为提升显示效果我们实现以下功能自动隐藏前导零显示小数位添加单位符号温度显示代码示例TEMP1[0] temp/1000 0; // 百位 if (TEMP1[0] 0) TEMP1[0] ; // 隐藏前导零 TEMP1[1] temp%1000/100 0; // 十位 TEMP1[2] temp%100/10 0; // 个位 TEMP1[3] .; // 小数点 TEMP1[4] temp%10 0; // 小数位 TEMP1[5] 0xDF; // ℃符号 Print(TEMP1);4. 传感器校准系统设计4.1 按键校准原理针对传感器可能出现的漂移问题设计四按键校准方案按键功能调节幅度KEY1温度增加1%KEY2温度减少-1%KEY3湿度增加1%KEY4湿度减少-1%校准算法实现if(key_1 0) { // 温度 delay(10); // 消抖 if(key_1 0) { temp temp * 1.01f; // 上调1% } } if(key_2 0) { // 温度- delay(10); if(key_2 0) { temp temp * 0.99f; // 下调1% } }4.2 校准数据持久化为保存校准参数可使用AT89C52内部EEPROM// 保存校准系数 void SaveCalibration(float temp_factor, float humi_factor) { unsigned char *p (unsigned char *)temp_factor; for(int i0; i4; i) { IAP_CONTR 0x80; // 使能IAP IAP_CMD 0x02; // 写命令 IAP_ADDRH 0x00; // 地址高位 IAP_ADDRL i; // 地址低位 IAP_DATA *p; // 写入数据 IAP_TRIG 0x5A; // 触发命令 IAP_TRIG 0xA5; _nop_(); } // 同理保存humi_factor... } // 上电时读取校准值 float LoadCalibration() { float factor 1.0; unsigned char *p (unsigned char *)factor; for(int i0; i4; i) { IAP_CONTR 0x80; IAP_CMD 0x01; // 读命令 IAP_ADDRH 0x00; IAP_ADDRL i; IAP_TRIG 0x5A; IAP_TRIG 0xA5; *p IAP_DATA; _nop_(); } return factor; }5. 系统集成与调试技巧5.1 Proteus仿真注意事项时序调试在Debug菜单中启用逻辑分析仪监测SCK/DATA信号SCK频率应≤1MHz建议200-500kHz数据建立时间120ns传感器响应设置[SHT11] Response Time20ms Temperature Drift0.1%/℃常见仿真问题处理现象可能原因解决方案LCD无显示初始化时序不正确检查ENABLE脉冲宽度(450ns)传感器无响应电源电压不足确保VDD3.3V-5V数据显示跳变未进行消抖处理增加10-20ms按键延时5.2 实际硬件调试要点PCB布局建议SHT11与单片机距离30cm避免将传感器靠近发热元件LCD背光串联限流电阻通常100Ω功耗优化技巧// 进入空闲模式 void EnterIdleMode() { PCON | 0x01; // 设置IDL位 _nop_(); } // 定时唤醒 void Timer0_ISR() interrupt 1 { PCON ~0x01; // 退出空闲模式 }抗干扰措施在SHT11的DATA线加4.7kΩ上拉电阻电源端并联100nF去耦电容避免长距离平行走线在完成基础功能后可以进一步扩展以下功能通过串口上传数据到上位机添加声光报警阈值设置实现数据日志存储功能开发简单的菜单界面系统