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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐