当前位置:   article > 正文

基于51单片机的PM2.5检测系统(粉尘,温湿度)原理图、流程图、物料清单、仿真图、源代码_基于单片机pm2.5采集流程图程序

基于单片机pm2.5采集流程图程序

请添加图片描述

基于51单片机的PM2.5检测系统(粉尘,温湿度)

设计一款低成本,可用于检测空气中PM2.5浓度的测量仪。
PM2.5测量仪主要由微处理器模块、粉尘传感器、A-D转换电路模块、液晶显示模块、报警模块、键盘等组成
1、判断空气质量等级
2、可以查询历史测量结果(PM2.5,温度,湿度)
3、PM2.5浓度过高时报警
4、具有断电保存功能
4、测量范围0~999ug/m^3;请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#include "reg51.h"
#include "intrins.h"
#include"TLC1543.h"
#include "SHT11.h"
#include "lcd1602.h"
#include"i2c.h"
#include"ds1302.h"
sbit beep=P1^7;//蜂鸣器

uint pm25=0;//PM2.5
uint limit=0;//阀值

uchar data1[]="PM:0000 Level:0 ";//PM2.5
uchar data2[]="T:000 C H:00%";//温湿度
/*uchar data3[]="00:00:00";//时间
uchar data4[]="0000 0 000 C 00%";//查询
uchar data5[]="Warning:0000";//阀值	*/

uchar moshi=0;//模式指示
uchar sec=0,miao=0;//定时
uchar cixu=0;//测量存储
uchar number=0;

uchar key_scan()//按键检测
{
	P3=0xfe;
 	switch(P3)//检测第1行
 	{
  		case 0xee:while(P3!=0xfe);return 1;
  		case 0xde:while(P3!=0xfe);return 2;
  		case 0xbe:while(P3!=0xfe);return 3;
  		case 0x7e:while(P3!=0xfe);return 4;
 	}
	P3=0xfd;
 	switch(P3)//检测第2行
 	{
  		case 0xed:while(P3!=0xfd);return 5;
  		case 0xdd:while(P3!=0xfd);return 6;
  		case 0xbd:while(P3!=0xfd);return 7;
  		case 0x7d:while(P3!=0xfd);return 8;
 	}
	P3=0xfb;
 	switch(P3)//检测第3行
 	{
  		case 0xeb:while(P3!=0xfb);return 9;
  		case 0xdb:while(P3!=0xfb);return 10;
  		case 0xbb:while(P3!=0xfb);return 11;
  		case 0x7b:while(P3!=0xfb);return 12;
 	}
	P3=0xf7;
 	switch(P3)//检测第4行
 	{
  		case 0xe7:while(P3!=0xf7);return 13;
  		case 0xd7:while(P3!=0xf7);return 14;
  		case 0xb7:while(P3!=0xf7);return 15;
  		case 0x77:while(P3!=0xf7);return 16;
 	}
	return 0;
}

void main()
{
	uchar i;
	Ds1302ReadTime();//初始化DS1302
	TIME[0]=0;
	Ds1302Init();
	cixu=At24c02Read(105);//初始化存储变量
	if(cixu>15)
	{
		cixu=1;
		At24c02Write(105,1);
	}
	number=cixu-1;
	limit=At24c02Read(106);//初始化阀值变量
	limit=limit*256+At24c02Read(107);
	if(limit>999)
	{
		limit=600;
		At24c02Write(106,2);
		At24c02Write(107,0x58);
	}
	data2[5]=0xdf;
	//data4[10]=0xdf;
	init_1602();

	TMOD|=0X01;//初始化定时器
	TH0=0X3C;
	TL0=0XB0;	
	ET0=1;
	EA=1;
	TR0=1;
	while(1)
	{
		i=key_scan();
		//模式切换
		if(i==1)
			moshi=0;
		if(i==2)
			moshi=1;
		if(i==3)
			moshi=2;
		if(moshi==2)//设置模式
		{
			 if(i==7)//加
			 {
			 	if(limit<900)
					limit+=10;
				At24c02Write(106,limit/256);
				At24c02Write(107,limit%256);
			 }
			 if(i==11)//减
			 {
			 	if(limit>0)
					limit-=10;
				At24c02Write(106,limit/256);
				At24c02Write(107,limit%256);
			 }
			 if(i==8)//加
			 {
			 	if(limit<900)
					limit++;
				At24c02Write(106,limit/256);
				At24c02Write(107,limit%256);
			 }
			 if(i==12)//减
			 {
			 	if(limit>0)
					limit--;
				At24c02Write(106,limit/256);
				At24c02Write(107,limit%256);
			 }
		}
		if(moshi==1)//查询模式
		{
			if(i==6)//上一个
			{
				if(number>0)
					number--;
			}
			if(i==10)//下一个
			{
				if(number<15)
					number++;
			}
			if(i==14)//删除
			{
				At24c02Write(number*7,0);
				At24c02Write(number*7+1,0);
				At24c02Write(number*7+2,0);
				At24c02Write(number*7+3,0);
				At24c02Write(number*7+4,0);
				At24c02Write(number*7+5,0);
				At24c02Write(number*7+6,0);
			}
		}
	}
}
//定时器中断
void Timer0() interrupt 1
{
	uchar i;
	uint j;
	sec++;
	if(sec==10)	//定时0.5s
	{
		sec=0;
		pm25=TLC1543_read(0);//PM2.5测量
		ReadShtData();//温湿度测量
		pm25=pm25/4;//校准
		if(moshi==0)
		{
		data1[0]='P';
		data1[1]='M';
		data1[2]=':';
		data1[3]=pm25/1000+0x30;
		data1[4]=pm25%1000/100+0x30;
		data1[5]=pm25%100/10+0x30;
		data1[6]=pm25%10+0x30;
		data1[7]=' ';
		data1[8]='L';
		data1[9]='e';
		data1[10]='v';
		data1[11]='e';
		data1[12]='l';
		data1[13]=':';
		data1[14]=pm25/100+0x30;//等级
		data1[15]=' ';
		data2[0]='T';
		data2[1]=':';
		data2[2]=sht_temp/100+0x30;
		data2[3]=sht_temp%100/10+0x30;
		data2[4]=sht_temp%10+0x30;
		data2[5]=0xdf;
		data2[6]='C';
		data2[7]=' ';
		data2[8]='H';
		data2[9]=':';
		data2[10]=sht_humi/10+0x30;
		data2[11]=sht_humi%10+0x30;
		data2[12]='%';
		data2[13]=' ';
		data2[14]=' ';
		data2[15]=' ';
		}
		//存储
		if(miao<10)
			miao++;
		else
		{
			miao=0;
			Ds1302ReadTime();//读取时间
			At24c02Write(cixu*7,TIME[2]);
			At24c02Write(cixu*7+1,TIME[1]);
			At24c02Write(cixu*7+2,TIME[0]);
			At24c02Write(cixu*7+3,pm25/256);
			At24c02Write(cixu*7+4,pm25%256);
			At24c02Write(cixu*7+5,sht_temp);
			At24c02Write(cixu*7+6,sht_humi);			
			if(cixu<15)
				cixu++;
			else
				cixu=0;
			At24c02Write(105,cixu);
		}
		//报警
		if(pm25>limit)
			beep=0;
		else
			beep=1;
		//============================================
		if(moshi==2)//设置模式
		{
		data1[0]='W';
		data1[1]='a';
		data1[2]='r';
		data1[3]='n';
		data1[4]='i';
		data1[5]='n';
		data1[6]='g';
		data1[7]=':';
		data1[8]=limit/1000+0x30;
		data1[9]=limit%1000/100+0x30;
		data1[10]=limit%100/10+0x30;
		data1[11]=limit%10+0x30;
		data1[12]=' ';
		data1[13]=' ';
		data1[14]=' ';
		data1[15]=' ';
		}
		//=============================================
		if(moshi==1)//查询模式
		{
			i=At24c02Read(number*7);//时
			data1[0]=(i>>4)+0x30;
			data1[1]=(i&0x0f)+0x30;
			data1[2]=':';
			i=At24c02Read(number*7+1);//分
			data1[3]=(i>>4)+0x30;
			data1[4]=(i&0x0f)+0x30;
			data1[5]=':';
			i=At24c02Read(number*7+2);//秒
			data1[6]=(i>>4)+0x30;
			data1[7]=(i&0x0f)+0x30;
			data1[8]=' ';
			data1[9]=' ';
			data1[10]=' ';
			data1[11]=' ';
			data1[12]=' ';
			data1[13]=' ';
			data1[14]=' ';
			data1[15]=' ';

			j=At24c02Read(number*7+3);//pm25
			j=j*256+At24c02Read(number*7+4);
			data2[0]=j/1000+0x30;
			data2[1]=j%1000/100+0x30;
			data2[2]=j%100/10+0x30;
			data2[3]=j%10+0x30;
			data2[4]=' ';
			data2[5]=j/100+0x30;
			data2[6]=' ';
			i=At24c02Read(number*7+5);//温度
			data2[7]=i/100+0x30;
			data2[8]=i%100/10+0x30;
			data2[9]=i%10+0x30;
			data2[10]=0xdf;
			data2[11]='C';
			data2[12]=' ';
			i=At24c02Read(number*7+6);//湿度
			data2[13]=i/10+0x30;
			data2[14]=i%10+0x30;
			data2[15]='%';
		}
		//显示
		switch(moshi)
		{
			 case 0://测量模式
			 	write_string(1,0,data1);
				write_string(2,0,data2);
			 	break;
			 case 1://查询模式
			 	write_string(1,0,data1);
				write_string(2,0,data2);
			 	break;
			 case 2://设置模式
			 	write_string(1,0,"                ");
				write_string(2,0,data1);
		}
	}
	TH0=0X3C;
	TL0=0XB0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/554115
推荐阅读
相关标签
  

闽ICP备14008679号