本文主要是根据光学测尘原理--朗伯特-比尔定律测量光透过被测物质后,由于散射吸收而使光强减弱,通过测定光束通过被测介质前后的光强比之来定量粉尘浓度。将粉尘浓度转换为电信号,然后通过信号放大器将电信号转换为0~5V的电压信号。
该设计主要是将光学测尘原理所得的0~5V的电压模拟信号通过ADC0809转换成八位二进制数字信号,并将数字信号送到单片机STC12C5A60S2中经过处理后将数字信号动态显示在数LED1602液晶显示上,通过键盘来设定粉尘浓度限定值,如果超过限定值单片机驱动蜂鸣器报警以及启动换风机,同时可以通过独立按键控制当前粉尘浓度和设定限定值时的显示切换。看门狗可以根据程序要求实施复位;同时还要将12V开关电源转换成5V给各器件供电。我主要根据系统要求完成数据的采集、显示、参数设置及报警等系统各模块的程序设计,然后再结合各部分的硬件电路完成各模块的功能,从而完成整个系统的功能
- 系统功能:
单片机PM2.5粉尘检测仪采用51单片机+按键+LCD1602+蜂鸣器+换风机+粉尘传感器设计而成。
1.主控芯片采用增强型51单片机STC12C5A60S2(和51单片机一样),自带AD转换,使用更加方便。
2.使用夏普的GP2Y1010AUOF粉尘传感器,每间隔10S更换一次采集浓度值检测更加准确。
3.有2个按键可以调整报警值,可操作性增强。
4.外接AT24C02,有掉电保存数据功能。
5.当粉尘浓度小于设定值,绿色指示灯会亮,表示当前空气质量良好。
6.当粉尘浓度高于设定值,会自动开启声光报警,换风机人性化工作。
7.LCD1602实时显示粉尘浓度和设定报警浓度,清晰直观。
(2) 主要技术指标:
1、电源电压:5-7V
2、工作温度:-10-65摄氏度
3、消耗电流:20mA最大
4、最小粒子检出值:0.8微米
5、灵敏度:0.5V/(0.1mg/m3)
6、清洁空气中电压:0.9V 典型值
7、工作温度:-10~65℃
8、存储温度:-20~80℃
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1khmTie-sB6GEh4FVo60DWA?pwd=8888
部分代码展示
/*************************************************************************
*工程名称:基于单片机室内空气检测系统 *
*单片机型号:STC89C52RC *
*晶振频率:12MHz *
*一、主要功能: *
*(1)采集PM2.5浓度 *
*(2)采集浓度范围为0~650 ug/m3(主要取决于传感器的特性 *
*(3)自定义报警限值 *
*(4)声光报警 * * *
*************************************************************************/
#include<reg52.h>
#include<intrins.h>
#include"LCD1602.h" //LCD1602液晶头文件
#include"EEPROM.h"
#define uint unsigned int
#define uchar unsigned char
#define EEPROM_start_addr 0x2000 //STC89C52RC EEPROM起始地址
/*********端口定义************************/
//AD转换芯片端口定义
sbit CS = P1^0; //ADC0832片选
sbit CLK = P1^1; //ADC0832时钟
sbit DIO = P1^2; //输入输出
//PM2.5传感器端口定义
sbit PM2_5_LED=P1^4; //粉尘传感器控制接口
sbit beep=P3^6; //蜂鸣器
sbit SET_key=P1^5; //设置键
sbit ADD_key=P1^6; //加键
sbit DEC_key=P1^7; //减键
/*****************************************/
/*********寄存器定义**********************/
//以下为串口用到的寄存器
bit busy; //串口忙检测
bit uart_R_flag; //串口数据接收完毕标志
uchar uart_buf; //串口数据寄存器
uchar time_count; //定时采样计数
//以下为PM2_5相关寄存器定义
bit PM2_5_flag;
bit time0_f; //280us延时标志
float DUST_Value;
uint DUST; //PM2.5最终值 取整
uint Alarm_DUST; //报警值
uchar PM2_5_num=0;
uchar ADC_Get[10]; //A/D采样数组
//以下为PM2_5值和显示缓存
uchar PM_buf[6]; //PM2.5值显示缓存
uint DUST;
//蜂鸣器
bit alarm_flag; //报警标志
bit beep_flag; //蜂鸣标志
uchar beep_cnt; //蜂鸣计数
//按键相关寄存器定义
bit set_flag; //设置标志
//EEPROM相关寄存器定义
uint EEPROM_addr_dat; //EEPROM地址寄存器
uchar value_dat;
/*****************************************/
/*********延时函数************************/
void Delay1ms(uint t) //1ms延时程序
{
uchar j;
while(t--)
{
for(j=0;j<125;j++)
{ ; }
}
}
/*****************************************/
/********40us延时*************************/
void Delay40us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 17;
while (--i);
}
/*****************************************/
/**********EEPROM地址扇区寻址*******************/
uint EEPROM_addr_set(uchar value) //地址扇区寻址 value 要大于等于1
{
uchar c;
uint add;
add=EEPROM_start_addr-0x200;
for(c=0;c<value;c++) //寻址到第value个扇区
{
add=add+0x200;
}
return (add);
}
/**********************************************/
/*******保存数据到EEPROM***********************/
void storage_dat(void)
{
EEPROM_addr_dat=EEPROM_addr_set(1); //EEPROM扇区寻址
Sector_Erase(EEPROM_addr_dat); //先擦除扇区
value_dat=Alarm_DUST>>8;
Byte_Program(EEPROM_addr_dat,value_dat); //保存报警值高位
EEPROM_addr_dat++;
value_dat=(uchar)Alarm_DUST;
Byte_Program(EEPROM_addr_dat,value_dat); //保存报警值低位
}
/*******初始化EEPROM数据***********************/
void Init_EEPROM_dat() //初始化数据
{
Alarm_DUST=0;
EEPROM_addr_dat=EEPROM_addr_set(1); //EEPROM扇区寻址
value_dat=Byte_Read(EEPROM_addr_dat);
Alarm_DUST=value_dat*256; //报警值 高位
EEPROM_addr_dat++;
value_dat=Byte_Read(EEPROM_addr_dat);
Alarm_DUST=Alarm_DUST+value_dat; //报警值
}
/*****************************************/
/*********初始化定时器0*******************/
void InitTimer0(void)
{
TMOD=0x21;
TH0=0xDA;//定时9.68ms 12MHz
TL0=0x30;
time0_f=0;
TR0=1;
ET0=1;
EA=1;
}
/*****************************************/
/*****中值滤波函数************************/
uchar median(uchar *dat,uchar num_d) //需要排序的数组
完整版 电路图和程序代码 下载地址