目錄
一、主要功能
二、使用步驟
三、硬件資源
四、軟件設計
五、實驗現象
一、主要功能
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();//顯示報警值
?? ?}
}
五、實驗現象
演示視頻: