
硬件系统架构粮仓温湿度检测控制系统以单片机为核心搭配外围功能模块实现数据采集、显示、存储及控制。系统硬件构成如下主控单元单片机如STC89C52及最小系统含晶振、复位电路显示模块LCD1602液晶屏支持两行16字符英文显示传感器模块DHT11数字温湿度传感器温度范围0-60℃湿度范围5%-99%RH存储模块AT24C02 EEPROM用于保存用户设置的阈值参数报警模块蜂鸣器四路LED指示灯高/低温、高/低湿控制模块继电器驱动风扇模拟抽湿设备交互模块四个按键设置、加减功能关键功能实现代码温湿度数据采集DHT11// DHT11数据读取函数 U8 DHT11_ReadData(U8 *temp, U8 *humi) { U8 buf[5] {0}; P2_0 0; // 拉低总线启动信号 delay_ms(18); P2_0 1; delay_us(30); if(!P2_0) { while(!P2_0); // 等待响应 while(P2_0); for(U8 i0; i5; i) { for(U8 j0; j8; j) { while(!P2_0); delay_us(40); buf[i] 1; if(P2_0) buf[i] | 1; while(P2_0); } } if(buf[0]buf[1]buf[2]buf[3]buf[4]) { *humi buf[0]; *temp buf[2]; return 1; } } return 0; }阈值存储AT24C02// AT24C02写入函数 void AT24C02_Write(U8 addr, U8 dat) { I2C_Start(); I2C_SendByte(0xA0); I2C_SendByte(addr); I2C_SendByte(dat); I2C_Stop(); delay_ms(5); } // AT24C02读取函数 U8 AT24C02_Read(U8 addr) { U8 dat; I2C_Start(); I2C_SendByte(0xA0); I2C_SendByte(addr); I2C_Start(); I2C_SendByte(0xA1); dat I2C_RecvByte(); I2C_Stop(); return dat; }报警控制逻辑void Alarm_Check(U8 temp, U8 humi) { // 温度报警判断 LedTH_P (temp AlarmTH) ? 0 : 1; LedTL_P (temp AlarmTL) ? 0 : 1; // 湿度报警判断 LedHH_P (humi AlarmHH) ? 0 : 1; LedHL_P (humi AlarmHL) ? 0 : 1; // 继电器控制示例控制风扇 if(humi AlarmHH || temp AlarmTH) { Relay_P 0; // 吸合继电器 Buzzer_P 0; // 触发蜂鸣器 } else { Relay_P 1; Buzzer_P 1; } }参数设置流程按键检测通过扫描方式检测按键动作阈值修改在设置模式下通过加减键调整数值存储生效退出设置时自动保存至AT24C02void Key_Process() { static U8 set_mode 0; if(!Key1_P) { // 设置键按下 delay_ms(10); set_mode (set_mode 1) % 5; while(!Key1_P); } if(set_mode) { switch(set_mode) { case 1: if(!Key2_P) AlarmTH--; if(!Key3_P) AlarmTH; break; case 2: if(!Key2_P) AlarmTL--; if(!Key3_P) AlarmTL; break; case 3: if(!Key2_P) AlarmHH--; if(!Key3_P) AlarmHH; break; case 4: if(!Key2_P) AlarmHL--; if(!Key3_P) AlarmHL; break; } // 边界检查 if(set_mode 0) AT24C02_SaveParams(); // 退出时保存 } }LCD显示优化采用自定义字符设计提升可读性void LCD_ShowTempHumi(U8 temp, U8 humi) { LCD_WriteCmd(0x80); LCD_ShowStr(Temp: ); LCD_ShowNum(temp); LCD_ShowChar(0xDF); // 显示°符号 LCD_ShowChar(C); LCD_WriteCmd(0xC0); LCD_ShowStr(Humi: ); LCD_ShowNum(humi); LCD_ShowStr(%RH); }系统初始化顺序单片机端口模式配置推挽输出/准双向口LCD1602初始化8位模式显示开AT24C02读取历史阈值DHT11传感器预热关闭所有报警输出继电器/指示灯初始状态【资源下载】下载地址如下https://docs.qq.com/doc/p/afddc1a75331badc9b4617638a2da89a35d7bfd5硬件构成单片机最小系统LCD1602液晶显示模块温湿度采集模块继电器驱动模块风扇模块LED指示灯模块按键模块AT24C02存储模块蜂鸣器报警模块1.采用AT24c02芯片实现掉电存储设置的上限值。2.LCD1602液晶显示当前温度和湿度液晶显示比数码管的显示效果要好有英文提示。3.配用全数字型温湿度传感器DHT11温度测量范围0℃--60℃湿度测量范围5%RH—99%RH可以满足一般需要。4.温湿度限值可以通过四个按键加减修改。当温度或湿度超限后报警信号灯点亮同时相应的继电器吸合。继电器可以驱动打开或切断通风机抽湿机报警器等外部设备。本设计只模拟一个抽湿风扇通过继电器控制。#define uchar unsigned char // 以后unsigned char就可以用uchar代替 #define uint unsigned int // 以后unsigned int 就可以用uint 代替 typedef unsigned char U8; typedef unsigned int U16; sfr ISP_DATA 0xe2; // 数据寄存器 sfr ISP_ADDRH 0xe3; // 地址寄存器高八位 sfr ISP_ADDRL 0xe4; // 地址寄存器低八位 sfr ISP_CMD 0xe5; // 命令寄存器 sfr ISP_TRIG 0xe6; // 命令触发寄存器 sfr ISP_CONTR 0xe7; // 命令寄存器 sbit P2_0 P3^3; // 温湿度传感器DHT11数据接入 sbit Buzzer_P P3^4; // 蜂鸣器 sbit LedTH_P P1^3; // 温度过高报警指示灯 sbit LedTL_P P1^4; // 温度过低报警指示灯 sbit LedHH_P P1^5; // 湿度过高报警指示灯 sbit LedHL_P P1^6; // 湿度过低报警指示灯 sbit Key1_P P3^7; // 按键1“设置” sbit Key2_P P3^5; // 按键2“减” sbit Key3_P P3^6; // 按键3“加” sbit LcdRs_P P1^0; // 1602液晶的RS管脚 sbit LcdRw_P P1^1; // 1602液晶的RW管脚 sbit LcdEn_P P1^2; // 1602液晶的EN管脚 uchar AlarmTH; // 温度上限报警值 uchar AlarmTL; // 温度下限报警值 uchar AlarmHH; // 湿度上限报警值 uchar AlarmHL; // 湿度下限报警值