基于 51 单片机的空气浓度检测系统仿真:打造身边的空气卫士
基于51单片机的空气浓度检测系统仿真 可检测温湿度,甲醛,pm2.5等空气质量浓度
在当下,空气质量越来越受到大家的关注,今天咱们就来聊聊基于 51 单片机打造的空气浓度检测系统仿真,它能检测温湿度、甲醛、PM2.5 等空气质量关键指标。
一、系统整体框架
这个系统主要由传感器模块、51 单片机核心处理模块、显示模块构成。传感器模块负责感知空气中的各项参数,51 单片机对收集到的数据进行处理,显示模块则把处理后的空气质量信息呈现给我们。
二、传感器模块
- 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 数组中,最后通过校验和判断数据是否有效。
- 甲醛传感器和 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 单片机的空气浓度检测系统仿真,通过这些模块的协同工作,能实时为我们提供空气质量信息,是不是还挺有趣的?感兴趣的小伙伴可以动手试试哦!

更多推荐


所有评论(0)