当前位置: 首页 > news >正文

Proteus仿真SHT11温湿度传感器,用AT89C52单片机驱动LCD显示(附完整代码和按键校准)

Proteus仿真SHT11温湿度传感器与AT89C52单片机系统开发实战

在嵌入式系统开发中,温湿度监测是一个经典而实用的项目场景。本文将带你从零开始构建一个完整的Proteus仿真系统,使用AT89C52单片机驱动SHT11温湿度传感器,并通过1602 LCD显示屏实时显示测量结果。不同于基础教程,我们将重点探讨传感器校准这一实际开发中的关键问题,提供可直接用于课程设计或毕业项目的完整解决方案。

1. 系统架构设计与环境搭建

1.1 硬件组件选型与连接

本系统核心硬件包括:

  • 主控芯片:AT89C52单片机(8位CPU,8KB Flash ROM)
  • 传感器模块:SHT11数字温湿度传感器(精度±0.4℃@25℃,±3%RH)
  • 显示模块:1602字符型LCD(16x2显示行)
  • 校准输入: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.2

1.2 Proteus仿真环境配置

在Proteus ISIS中搭建电路时需注意:

  1. 添加元件时搜索"AT89C52"、"SHT11"和"LM016L"(1602 LCD模型)
  2. 晶振频率设置为11.0592MHz(确保串口通信准确)
  3. 在SHT11属性中设置初始环境参数:
    Temperature = 25.0 Humidity = 50.0

2. 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_value+1) = 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, C2=+0.0405, C3=-0.0000028; // 湿度补偿系数 const float T1=+0.01, T2=+0.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)*(T1+T2*rh) + rh_lin; *p_temperature = t_C; // 限幅处理 if(*p_humidity>100) *p_humidity=100; if(*p_humidity<0.1) *p_humidity=0.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 i=0; i<4; 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 i=0; i<4; 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仿真注意事项

  1. 时序调试:在Debug菜单中启用逻辑分析仪,监测SCK/DATA信号

    • SCK频率应≤1MHz(建议200-500kHz)
    • 数据建立时间>120ns
  2. 传感器响应设置

    [SHT11] Response Time=20ms Temperature Drift=0.1%/℃
  3. 常见仿真问题处理

现象可能原因解决方案
LCD无显示初始化时序不正确检查ENABLE脉冲宽度(>450ns)
传感器无响应电源电压不足确保VDD=3.3V-5V
数据显示跳变未进行消抖处理增加10-20ms按键延时

5.2 实际硬件调试要点

  1. PCB布局建议

    • SHT11与单片机距离<30cm
    • 避免将传感器靠近发热元件
    • LCD背光串联限流电阻(通常100Ω)
  2. 功耗优化技巧

// 进入空闲模式 void EnterIdleMode() { PCON |= 0x01; // 设置IDL位 _nop_(); } // 定时唤醒 void Timer0_ISR() interrupt 1 { PCON &= ~0x01; // 退出空闲模式 }
  1. 抗干扰措施
    • 在SHT11的DATA线加4.7kΩ上拉电阻
    • 电源端并联100nF去耦电容
    • 避免长距离平行走线

在完成基础功能后,可以进一步扩展以下功能:

  • 通过串口上传数据到上位机
  • 添加声光报警阈值设置
  • 实现数据日志存储功能
  • 开发简单的菜单界面系统
http://www.jsqmd.com/news/693445/

相关文章:

  • 太原市尖草坪区致尚家具维修:口碑好的太原沙发换皮公司 - LYL仔仔
  • 新手别慌!IDA Pro 7.7 保姆级安装与首次启动避坑指南(附常见报错解决)
  • 告别NTP依赖:ESP32手动设置系统时间的3种实战方法(含时区配置避坑)
  • 可以闭眼选的上海留学中介
  • AI Agent Harness Engineering 在金融合规场景的落地:如何通过审计日志实现决策可追溯?
  • PEARL系统:物联网间歇计算的高效解决方案
  • 别再硬调参数了!用MATLAB Fuzzy Toolbox给滑模控制做个‘智能增益’,告别系统抖振
  • 2026年长三角制造业精准获客系统选择指南:GEO AI如何帮助工厂突破获客困局 - 优质企业观察收录
  • ESP32 LVGL字体实战:从LvglFontTool生成到SPIFFS烧录的完整避坑指南
  • 联想拯救者老本福音:用Hackintool搞定HD4600核显HDMI输出(附完整EFI配置)
  • 从开发视角复盘Shiro 550:除了升级版本,你的AES密钥真的安全吗?(附Java代码自查指南)
  • 从“一笔画”游戏到快递路线规划:Hierholzer算法在现实中的5个有趣应用
  • 2026年市面上水产药兽药,兽用原料药,稳定品质治疗有保障 - 品牌推荐师
  • 别再被老视频的‘毛边’困扰了!手把手教你用TW9912芯片搞定去隔行(附配置避坑)
  • 2026年吉林旅游包车出行全攻略:德威等头部品牌深度对标与避坑指南 - 年度推荐企业名录
  • 5分钟快速上手:用LyricsX在Mac上轻松显示桌面歌词的终极指南
  • EMX Modelgen 2.2在Virtuoso中的实战:手把手教你仿真一个片上电感并验证破解
  • HSTracker终极指南:macOS炉石传说玩家的智能数据助手
  • 3步掌握OBS多平台直播:obs-multi-rtmp插件完整操作指南
  • TensorFlow数据管道实战:高效构建与性能优化
  • 南昌雅特机电设备:靠谱做南昌发电机回收的企业 - LYL仔仔
  • 2026上海GEO服务公司看点:从“白帽GEO”到DSS原则 - 速递信息
  • React Native与AI结合打造实时穿搭分析应用
  • 告别硬件限制:用LabVIEW 2023打造你的专属信号分析仪(虚拟示波器进阶指南)
  • TranslucentTB完全指南:让你的Windows任务栏变透明!3种安装方法+5大美化技巧
  • BPE算法解析:从原理到多语言NLP实战
  • 【官方预告】劳力士售后服务中心全国维修地址变迁与服务升级通知 - 速递信息
  • 告别通信失败:手把手教你排查STM32与多摩川编码器RS485连接的那些‘坑’
  • Unity粒子系统实战:5分钟为你的手机游戏打造一个性能友好的卡通风格火焰特效
  • Stable Diffusion【ControlNet】进阶:IP-Adapter预处理器实战指南与场景化应用