51单片机烟雾温湿度检测系统设计
基于51单片机的烟雾温湿度检测控制系统设计与仿真系统概述该系统以51单片机为核心控制器结合MQ-2烟雾传感器、DHT11温湿度传感器和LCD1602显示屏实现环境参数的实时监测与报警功能。通过Protues软件完成硬件电路仿真Keil C51编写控制程序。系统可广泛应用于智能家居、工业环境监控等领域。硬件设计主控芯片选用STC89C52单片机工作频率11.0592MHz。MQ-2传感器通过ADC0832模数转换芯片与单片机连接DHT11采用单总线协议直接连接P2.0口。LCD1602显示屏采用4位数据模式连接P0口蜂鸣器报警模块连接P1.0口。Protues仿真电路包含以下关键元件单片机最小系统晶振、复位电路MQ-2传感器及ADC0832转换电路DHT11温湿度传感器LCD1602显示模块按键设置模块3个独立按键LED报警指示灯和蜂鸣器软件设计程序采用模块化设计包含主控程序、传感器驱动、数据显示和报警处理四个模块。系统初始化后进入主循环定期采集各传感器数据并更新显示。ADC0832读取MQ-2数据的函数示例unsigned char ADC0832_Read(unsigned char channel) { unsigned char i, dat1 0, dat2 0; CS 0; // 启动ADC0832 _nop_(); _nop_(); CLK 0; // 第一个时钟下降沿 _nop_(); _nop_(); DI 1; // 起始位 CLK 1; _nop_(); _nop_(); CLK 0; DI channel ? 1 : 0; // 选择通道 CLK 1; _nop_(); _nop_(); CLK 0; DI !channel ? 1 : 0; // 通道取反 CLK 1; _nop_(); _nop_(); CLK 0; DI 1; // 结束配置 for(i0; i8; i) { // 读取8位数据 CLK 1; _nop_(); _nop_(); CLK 0; dat1 1; if(DO) dat1 | 0x01; } for(i0; i8; i) { // 校验读取 dat2 1; if(DO) dat2 | 0x80; CLK 1; _nop_(); _nop_(); CLK 0; } CS 1; // 停止ADC0832 return (dat1 dat2) ? dat1 : 0; }DHT11温湿度读取函数示例void DHT11_Read(float *temp, float *humi) { unsigned char buf[5] {0}; unsigned char i, j; DHT11 0; // 主机拉低18ms delay_ms(18); DHT11 1; // 主机拉高20-40us delay_us(30); while(DHT11); // 等待DHT11响应 while(!DHT11); // 等待DHT11拉高 while(DHT11); // 等待DHT11拉低 for(i0; i5; i) { // 读取5字节数据 for(j0; j8; j) { while(!DHT11); // 等待50us低电平结束 delay_us(30); // 判断高电平持续时间 buf[i] 1; if(DHT11) buf[i] | 1; while(DHT11); // 等待高电平结束 } } if(buf[0] buf[1] buf[2] buf[3] buf[4]) { *humi buf[0] buf[1]*0.1; *temp buf[2] buf[3]*0.1; } }阈值报警处理系统设置烟雾浓度和温湿度阈值当检测值超过设定范围时触发声光报警。报警逻辑采用软件消抖处理防止误触发。报警处理代码片段void Alarm_Check(void) { static unsigned char alarm_cnt 0; if(smoke_value SMOKE_THRESHOLD || temperature TEMP_THRESHOLD || humidity HUMI_THRESHOLD) { alarm_cnt; if(alarm_cnt 5) { // 连续5次超限才报警 Buzzer 0; // 开启蜂鸣器 LED 0; // 点亮报警灯 } } else { alarm_cnt 0; Buzzer 1; // 关闭蜂鸣器 LED 1; // 熄灭报警灯 } }数据显示模块LCD1602显示采用4位数据模式第一行显示烟雾浓度和温度第二行显示湿度和报警状态。LCD显示更新函数void LCD_Update(void) { char disp_buf[16]; sprintf(disp_buf, S:%3d T:%2.1fC, smoke_value, temperature); LCD_Write_String(0, 0, disp_buf); sprintf(disp_buf, H:%2.1f%% %s, humidity, (Buzzer 0) ? ALARM : NORMAL); LCD_Write_String(0, 1, disp_buf); }系统优化措施传感器数据采用滑动平均滤波算法消除随机干扰设置看门狗定时器防止程序跑飞采用低功耗模式设计空闲时降低主频增加EEPROM存储功能保存阈值设置滤波算法实现示例#define FILTER_LEN 5 unsigned int filter_buf[FILTER_LEN]; unsigned int Moving_Average_Filter(unsigned int new_val) { unsigned int sum 0; unsigned char i; // 滑动窗口更新 for(iFILTER_LEN-1; i0; i--) { filter_buf[i] filter_buf[i-1]; } filter_buf[0] new_val; // 计算平均值 for(i0; iFILTER_LEN; i) { sum filter_buf[i]; } return sum / FILTER_LEN; }Protues仿真要点ADC0832模型需正确配置参考电压DHT11仿真模型需设置响应时间参数LCD1602需注意对比度调节电压仿真时适当降低主频以提高运行速度实际应用扩展增加GSM模块实现远程报警添加数据存储功能记录历史数据设计上位机软件实现数据可视化结合继电器模块实现自动排风控制该系统完整代码包含以下文件main.c主程序逻辑lcd1602.c显示屏驱动dht11.c温湿度传感器驱动adc0832.cAD转换驱动delay.c精确延时函数人生是一场没有终点的旅行重要的是在每一步都保持热情与期待才能在旅途中发现更多的美好。坚持是通往梦想的桥梁勇敢面对挑战让每一个努力都有机会成为成功故事的一部分。永远不要低估自己的能力勇敢追求梦想保持对生活的热爱才能让未来更加光明与辉煌。把握机会让自己在挑战中蜕变生活的精彩在于不断追求与创新让梦想照亮生命的旅程。用心去生活让简单的日子绽放出美好让每一刻都有独特的意义与生活的热情彼此交织。https://github.com/yorkah/5dt_dtsu/issues/8https://github.com/rokesing34/b98_xhqe/issues/9https://github.com/mswblbous/n1e_o9p9/issues/7https://github.com/e-andro195/ltx_t95v/issues/8https://github.com/yorkah/5dt_dtsu/issues/9