完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/168AVExFGKe1u35E-ocjZYg?pwd=8888
部分代码展示
void main()
{
uint PM_AD_buf=0;
uint PM_AD_dat=0;
uint AD_dat1=0;
float PM_js=0.0;
bit flag1=0 ;
time_init(); //定时器初始化
init_1602(); //lcd1602初始化
while(1)
{
flag_300ms ++;
if(flag_300ms >= 300)
{
flag_300ms = 0;
PM25_void();
write_sfm_pm(1,6,pm) ; //显示PM
write_sfm_pm(2,2,U8T_data_H);
write_sfm_pm(2,11,U8RH_data_H);
}
}
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X02; //定时器0、定时器1工作方式1
TH0=216; //每40us进一次中断
TL0=216;
ET0 = 1; //开定时器0中断
TR0 = 0; //允许定时器0定时
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1 //定时中断函数 每40us进一次中断
{
time_num1++; //定时计数变量+1
if(time_num1==8)
{
GP2Y_LED=0; //输出低电平,驱动传感器
}
else if(time_num1>250) //10MS后计数器清零,关闭定时器
{
time_num1=0;
TR0=0;
}
}
/****************PM2.5采集函数********************/
void PM25_void()
{
uint PM_AD_buf=0;
uint PM_AD_dat=0;
uint AD_dat1=0;
float PM_js=0.0;
bit flag1=0 ;
GP2Y_LED = 1;
TR0=1; //开启中断
while(1)
{
if(time_num1>5) //大约
break;
}
AD_dat1 = ad0832read(1,0); //模数转换
PM_AD_dat=AD_dat1;
PM_AD_dat=PM_AD_dat*8+AD_dat1;
PM_AD_dat/=9; //模数转换后计算平均值
PM_js=((float)(PM_AD_dat/51.2+0.01))*172-90;//计算PM2.5的值
if(PM_js < 0)
PM_js = 0;
PM_dat=(uint)(PM_js);
b=PM_dat;
if(b>=999) b=99; //数据修正
pm = b;
}