【51单片机】【protues仿真】基于51单片机PM2.5空气质量检测系统
目录
一、主要功能
二、使用步骤
三、硬件资源
四、软件设计
五、实验现象
一、主要功能
1、LCD1602液晶显示
2、按键设置阈值
3、PM2.5大于阈值时启动声光警报
二、使用步骤
基于51单片机的PM2.5空气质量检测系统通常采用STC89C51/52作为核心控制器,结合GP2Y1010AU0F粉尘传感器实现颗粒物浓度检测,并通过LCD1602显示实时数据及报警阈值。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、PM2.5传感器模块
4、蜂鸣器模块
5、数模转换模块
6、LCD1602显示模块
四、软件设计
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char //宏定义
sbit RS=P2^2;//液晶接口
sbit EN=P2^3;
sbit LED = P2^0;//led接口
sbit ADCS = P3^7;//AD0832接口
sbit ADCLK =P3^5;
sbit ADDI = P3^6;
sbit ADDO = P3^6;
sbit SET= P1^1;//按键接口
sbit ADD= P1^2;
sbit DEC= P1^3;
sbit BEEP=P2^1;//蜂鸣器接口
uchar set_st;
uchar tab[5];
uint DUST_SET=150; //固体颗粒的阈值
//bit shanshuo_st; //闪烁间隔标志
bit beep_st; //蜂鸣器间隔标志
uchar x=4; //计数器
//定义标识
uchar FlagStart = 0;
float DUST_Value;
uint DUST;
uchar num=0;
uchar mm;
uchar abc;
uchar ADC_Get[10]={0}; //定义AD采样数组
uchar str[5]={0};
/*****初始化定时器0*****/
void InitTimer(void)
{
TMOD = 0x01;
TL0 = (65536-10000)/256; //定时10ms
TH0 = (65536-10000)%256;
TR0 = 1;
ET0 = 1;
EA = 1;
}
/*************************lcd1602程序**************************/
void delay1ms(uint ms)//延时1毫秒
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void wr_com(uchar com)//写指令//
{
delay1ms(1);
RS=0;
// RW=0;
EN=0;
P0=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(uchar dat)//写数据//
{
delay1ms(1);;
RS=1;
// RW=0;
EN=0;
P0=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
/************************报警值显示************************************/
void baojing()
{
wr_com(0xc6);
wr_dat(tab[0]+0x30);
wr_com(0xc7);
wr_dat(tab[1]);
wr_com(0xc8);
wr_dat(tab[2]+0x30);
wr_com(0xc9);
wr_dat(tab[3]+0x30);
wr_com(0xca);
wr_dat(tab[4]+0x30);
}
/*****延时子程序*****/
void Delay(uint num)
{
while( --num );
}
/*****主函数*****/
void main(void)
{
InitTimer(); //初始化定时器
BEEP=1;
lcd_init();//初始化显示
delay1ms(500);
while(1)
{
checkkey();//按键检测
if(set_st==0)
{
//wr_com(0x0c);
if(FlagStart==1) //1次数据采集完成
{
num++;
ADC_Get[num]=abc;
if(num>9)
{
num=0;
// DUST=Error_Correct(ADC_Get,10); //求取10次AD采样的值
// DUST_Value=(DUST/256.0)*5000; //转化成电压值MV
// DUST_Value=DUST_Value*0.17-100; //固体悬浮颗粒浓度计算 Y=0.17*X-0.1 X--采样电压V
DUST=Error_Correct(ADC_Get,10);
DUST_Value=(DUST/256.0)*5;//转化成电压值
DUST_Value=(DUST_Value*0.17-0.1)*1000;//固体悬浮颗粒浓度计
if(DUST_Value<0) DUST_Value=0;
if(DUST_Value>760) DUST_Value=760; //限位
DUST=(uint)DUST_Value;
}
TL0 = (65536-10000)/256;
TH0 = (65536-10000)%256;
TR0 = 1; //开启定时器0
EA = 1;
FlagStart=0;
}
Alarm(); //报警检测
}
disp(DUST);//显示粉尘浓度值
baojing();//显示报警值
}
}
五、实验现象
演示视频: