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

基于 51 单片机的空气浓度检测系统仿真:打造身边的空气卫士

基于51单片机的空气浓度检测系统仿真 可检测温湿度,甲醛,pm2.5等空气质量浓度

在当下,空气质量越来越受到大家的关注,今天咱们就来聊聊基于 51 单片机打造的空气浓度检测系统仿真,它能检测温湿度、甲醛、PM2.5 等空气质量关键指标。

一、系统整体框架

这个系统主要由传感器模块、51 单片机核心处理模块、显示模块构成。传感器模块负责感知空气中的各项参数,51 单片机对收集到的数据进行处理,显示模块则把处理后的空气质量信息呈现给我们。

二、传感器模块

  1. DHT11 温湿度传感器:它能同时检测温度和湿度,使用起来很方便。DHT11 通过单总线与单片机通信,数据格式为一次 40 位的数据传输,包括 8 位湿度整数数据、8 位湿度小数数据、8 位温度整数数据、8 位温度小数数据、8 位校验和。
// 以下为简单读取 DHT11 数据的代码片段 sbit DHT11_PIN = P1^0; // 定义 DHT11 连接的单片机引脚 unsigned char code DHT11_TABLE[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; unsigned char DHT11_Buffer[5]; void DHT11_Read(void) { unsigned char i, j; DHT11_PIN = 0; // 主机拉低总线至少 18ms delay(20); DHT11_PIN = 1; delay_us(30); // 拉高总线 20 - 40us if (!DHT11_PIN) { // 判断从机是否响应 while (!DHT11_PIN); // 等待从机拉高总线 while (DHT11_PIN); // 等待从机拉低总线 for (i = 0; i < 5; i++) { for (j = 0; j < 8; j++) { while (!DHT11_PIN); // 等待数据位开始 delay_us(40); if (DHT11_PIN) { DHT11_Buffer[i] |= DHT11_TABLE[j]; } while (DHT11_PIN); // 等待数据位结束 } } if ((DHT11_Buffer[0] + DHT11_Buffer[1] + DHT11_Buffer[2] + DHT11_Buffer[3]) == DHT11_Buffer[4]) { // 校验和正确,数据有效 } } }

代码分析:这段代码首先通过拉低总线向 DHT11 传感器发送起始信号,然后等待传感器响应。接着按位读取 40 位数据,并存储在DHT11_Buffer数组中,最后通过校验和判断数据是否有效。

  1. 甲醛传感器和 PM2.5 传感器:甲醛传感器通常利用电化学原理,将空气中甲醛浓度转换为电信号输出。PM2.5 传感器如夏普的 GP2Y1010AU0F,通过检测红外线在空气中的散射程度来计算 PM2.5 浓度。这两种传感器输出一般是模拟信号,需要通过 ADC(模拟数字转换器)转换为数字信号供单片机处理。
// 假设使用 ADC0809 进行模拟数字转换 sbit ADC0809_EOC = P3^3; // EOC 转换结束标志引脚 sbit ADC0809_OE = P3^4; // 输出允许引脚 sbit ADC0809_START = P3^5; // 启动转换引脚 unsigned char Read_ADC0809(unsigned char channel) { unsigned char adc_value; ADC0809_START = 0; channel &= 0x07; // 确保通道号在 0 - 7 之间 P2 = (P2 & 0xf8) | channel; // 设置 ADC 通道 ADC0809_START = 1; // 启动转换 _nop_(); _nop_(); ADC0809_START = 0; while (!ADC0809_EOC); // 等待转换结束 ADC0809_OE = 1; // 允许输出 adc_value = P0; ADC0809_OE = 0; return adc_value; }

代码分析:这段代码用于从 ADC0809 读取模拟信号转换后的数字值。首先设置 ADC 通道,然后启动转换,等待转换结束标志EOC置位,最后读取转换后的数字值并返回。

三、51 单片机核心处理模块

51 单片机作为整个系统的大脑,接收传感器传来的数据后,进行数据处理和分析。例如对甲醛和 PM2.5 浓度数据,可能需要根据设定的标准进行超标判断。

void main() { unsigned char temp, humi, formaldehyde, pm25; while (1) { DHT11_Read(); temp = DHT11_Buffer[2]; humi = DHT11_Buffer[0]; formaldehyde = Read_ADC0809(0); // 假设甲醛传感器接在 ADC0 通道 pm25 = Read_ADC0809(1); // 假设 PM2.5 传感器接在 ADC1 通道 // 这里可以添加数据处理代码,比如根据标准判断是否超标等 display(temp, humi, formaldehyde, pm25); // 调用显示函数 delay(1000); // 延迟 1 秒,控制数据读取频率 } }

代码分析:在主函数中,不断循环读取温湿度、甲醛和 PM2.5 数据,然后调用显示函数将数据展示出来,同时设置了 1 秒的延迟,避免数据读取过于频繁。

四、显示模块

常见的显示模块如 LCD1602,可以直观地显示空气质量数据。通过向 LCD1602 发送命令和数据,将温湿度、甲醛、PM2.5 等信息呈现出来。

// LCD1602 相关代码 sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2; unsigned char code LCD_LINE1[] = "Temp: Humi: "; unsigned char code LCD_LINE2[] = "Formal: PM2.5: "; void LCD_Command(unsigned char cmd) { P0 = cmd; LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; _nop_(); _nop_(); LCD_EN = 0; delay(2); } void LCD_Data(unsigned char dat) { P0 = dat; LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; _nop_(); _nop_(); LCD_EN = 0; delay(2); } void LCD_Init() { LCD_Command(0x38); // 8 位模式,2 行显示,5x7 点阵 delay(5); LCD_Command(0x0C); // 开显示,关光标 delay(5); LCD_Command(0x06); // 输入模式,光标右移 delay(5); LCD_Command(0x01); // 清屏 delay(5); } void display(unsigned char temp, unsigned char humi, unsigned char formaldehyde, unsigned char pm25) { unsigned char temp_str[4], humi_str[4], formaldehyde_str[4], pm25_str[4]; itoa(temp, temp_str, 10); itoa(humi, humi_str, 10); itoa(formaldehyde, formaldehyde_str, 10); itoa(pm25, pm25_str, 10); LCD_Init(); LCD_String(LCD_LINE1); LCD_Command(0xC0); LCD_String(LCD_LINE2); LCD_Command(0x86); LCD_String(temp_str); LCD_Command(0x8B); LCD_String(humi_str); LCD_Command(0xC6); LCD_String(formaldehyde_str); LCD_Command(0xCB); LCD_String(pm25_str); }

代码分析:这段代码定义了 LCD1602 的初始化、命令发送、数据发送以及显示函数。通过向 LCD1602 发送特定命令和数据,将空气质量数据按格式显示在屏幕上。

基于51单片机的空气浓度检测系统仿真 可检测温湿度,甲醛,pm2.5等空气质量浓度

基于 51 单片机的空气浓度检测系统仿真,通过这些模块的协同工作,能实时为我们提供空气质量信息,是不是还挺有趣的?感兴趣的小伙伴可以动手试试哦!

http://www.jsqmd.com/news/478023/

相关文章:

  • ESP8684-WROOM-04C射频特性深度解析与工程落地指南
  • Linux网络驱动开发:PHY状态机与链路检测机制详解(附实战代码分析)
  • 进程资源限制与性能优化实践
  • 【生产实践】基于Docker Compose的StarRocks高可用集群部署与调优指南
  • Spring Boot 3.5.x 实战:SpringDoc 2 与 Swagger3 的深度集成与配置优化
  • 次元画室教程:锁定“风格密码”,批量产出AE可用素材(附案例)
  • 微前端架构实战:从原理到框架选型
  • C语言快速入门10-结构体
  • Cockpit实战指南:如何通过Web界面高效管理Linux服务器集群
  • 【国家级等保2.0强制要求】:MCP 2.0消息完整性校验必须满足的4项密码学硬指标(附国密SM4-GMAC审计清单)
  • Open3DSG复现实战:从数据裁剪到模型调试的完整避坑指南
  • Nunchaku FLUX.1-dev多场景落地:政府宣传图/党建素材/公益广告生成
  • 妈妈级教程:Python 全栈企业实战体系
  • 【硬核预测】AI连Verilog都能写了,FPGA工程师的铁饭碗还能端多久?
  • RK3588嵌入式Linux开发环境搭建避坑指南:从SDK解压到repo同步全流程
  • GAMES101作业7-路径追踪核心算法与性能优化全解析
  • UNIT-00:Berserk Interface 在网络安全领域的应用:威胁情报分析与代码审计
  • uniapp集成leaflet地图实战:移动端开发避坑指南
  • BeeWorks+OpenClaw=“企业专属的虾塘”:养一只听话又能干的“数字员工”
  • YOLO12模型训练全攻略:从数据标注到模型调优
  • ollama+Phi-4-mini-reasoning开源方案:可私有化部署的数学AI推理服务
  • 从零构建ArduPilot全栈仿真:Gazebo、MAVROS与QGC的协同实战
  • Fish Speech 1.5问题解决指南:WebUI无法访问、生成超时怎么办?
  • StructBERT零样本分类-中文-base精彩案例分享:10个真实业务场景分类效果对比
  • 全国路网数据深度解析:从OSM到可视化应用
  • 高通跃龙QCS9100平台上工业缺陷检测实战(2): 安装 QAIRT/QNN,并把 ONNX 跑到 HTP/NPU
  • GTE文本向量-large效果实测:中文命名实体识别准确率超92%
  • 【AI+教育】我用OpenClaw栽了5次跟头后,总结出这10个避坑干货(新手直接抄)
  • STM32 RTC权限控制与写保护机制深度解析
  • 从“山”到“矩阵”:拆解蓝桥杯Java B组真题中的算法思维跃迁