基于51单片机智能家居空气质量监控—温湿度PM2.5

基于51单片机智能家居空气质量监控

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

1.检测温度、湿度、PM2.5浓度,并在LCD1602实时显示;

2.可以使用按键设置温湿度上下限、PM2.5浓度上限值。

3.超过设定范围进行对应的声光报警。

#include <reg52.h>
/***΢ÐŹ«ÖںţºÄ¾×Óµ¥Æ¬»ú****/
#include <intrins.h>

#define uchar unsigned char		// ÒÔºóunsigned char¾Í¿ÉÒÔÓÃuchar´úÌæ
#define uint  unsigned int		// ÒÔºóunsigned int ¾Í¿ÉÒÔÓÃuint ´úÌæ

sfr ISP_DATA  = 0xe2;			// Êý¾Ý¼Ä´æÆ÷
sfr ISP_ADDRH = 0xe3;			// µØÖ·¼Ä´æÆ÷¸ß°Ëλ
sfr ISP_ADDRL = 0xe4;			// µØÖ·¼Ä´æÆ÷µÍ°Ëλ
sfr ISP_CMD   = 0xe5;			// ÃüÁî¼Ä´æÆ÷
sfr ISP_TRIG  = 0xe6;			// ÃüÁî´¥·¢¼Ä´æÆ÷
sfr ISP_CONTR = 0xe7;			// ÃüÁî¼Ä´æÆ÷

sbit LcdRs_P   = P1^2;    // 1602Òº¾§µÄRS¹Ü½Å       
sbit LcdRw_P   = P1^3;    // 1602Òº¾§µÄRW¹Ü½Å 
sbit LcdEn_P   = P1^4;    // 1602Òº¾§µÄEN¹Ü½Å
sbit KeySet_P  = P3^2;		// ¡°ÉèÖá±°´¼üµÄ¹Ü½Å
sbit KeyDown_P = P3^3;		// ¡°¼õ¡±°´¼üµÄ¹Ü½Å
sbit KeyUp_P   = P3^4;		// ¡°¼Ó¡±°´¼üµÄ¹Ü½Å 
sbit Buzzer_P  = P1^5;		// ·äÃùÆ÷
sbit DHT11_P   = P1^1;	 	// ÎÂʪ¶È´«¸ÐÆ÷DHT11Êý¾Ý½ÓÈë
sbit LedTH_P   = P2^0;		// ζȹý¸ß±¨¾¯Ö¸Ê¾µÆ
sbit LedTL_P   = P2^1;		// ζȹýµÍ±¨¾¯Ö¸Ê¾µÆ
sbit LedHH_P   = P2^2;		// ʪ¶È¹ý¸ß±¨¾¯Ö¸Ê¾µÆ
sbit LedHL_P   = P2^3;		// ʪ¶È¹ýµÍ±¨¾¯Ö¸Ê¾µÆ
sbit LedPM_P   = P2^4;		// PM2.5¹ý¸ß±¨¾¯Ö¸Ê¾µÆ

uchar temp;								// ±£´æζÈ
uchar humi;								// ±£´æʪ¶È
uint  pm;									// ±£´æPM2.5

uchar gIndex=0;						// ´®¿Ú½ÓÊÕË÷Òý
uint  Value[20]={0};			// ´®¿ÚÊý¾Ý»º´æÇø

uchar AlarmTL;						// ζÈÏÂÏÞ±¨¾¯Öµ
uchar AlarmTH;						// ζÈÉÏÏÞ±¨¾¯Öµ
uchar AlarmHL; 						// ʪ¶ÈÏÂÏÞ±¨¾¯Öµ
uchar AlarmHH;						// ʪ¶ÈÉÏÏÞ±¨¾¯Öµ
uint  AlarmPM;						// PM2.5±¨¾¯Öµ



/*********************************************************/
// µ¥Æ¬»úÄÚ²¿EEPROM²»Ê¹ÄÜ
/*********************************************************/
void ISP_Disable()
{
	ISP_CONTR = 0;
	ISP_ADDRH = 0;
	ISP_ADDRL = 0;
}


/*********************************************************/
// ´Óµ¥Æ¬»úÄÚ²¿EEPROM¶ÁÒ»¸ö×Ö½Ú£¬´Ó0x2000µØÖ·¿ªÊ¼
/*********************************************************/
unsigned char EEPROM_Read(unsigned int add)
{
	ISP_DATA  = 0x00;
	ISP_CONTR = 0x83;
	ISP_CMD   = 0x01;
	ISP_ADDRH = (unsigned char)(add>>8);
	ISP_ADDRL = (unsigned char)(add&0xff);
	// ¶ÔSTC89C51ϵÁÐÀ´Ëµ£¬Ã¿´ÎҪдÈë0x46£¬ÔÙдÈë0xB9,ISP/IAP²Å»áÉúЧ
	ISP_TRIG  = 0x46;	   
	ISP_TRIG  = 0xB9;
	_nop_();
	ISP_Disable();
	return (ISP_DATA);
}


/*********************************************************/
// Íùµ¥Æ¬»úÄÚ²¿EEPROMдһ¸ö×Ö½Ú£¬´Ó0x2000µØÖ·¿ªÊ¼
/*********************************************************/
void EEPROM_Write(unsigned int add,unsigned char ch)
{
	ISP_CONTR = 0x83;
	ISP_CMD   = 0x02;
	ISP_ADDRH = (unsigned char)(add>>8);
	ISP_ADDRL = (unsigned char)(add&0xff);
	ISP_DATA  = ch;
	ISP_TRIG  = 0x46;
	ISP_TRIG  = 0xB9;
	_nop_();
	ISP_Disable();
}


/*********************************************************/
// ²Á³ýµ¥Æ¬»úÄÚ²¿EEPROMµÄÒ»¸öÉÈÇø
// д8¸öÉÈÇøÖÐËæ±ãÒ»¸öµÄµØÖ·£¬±ã²Á³ý¸ÃÉÈÇø£¬Ð´ÈëÇ°ÒªÏȲÁ³ý
/*********************************************************/
void Sector_Erase(unsigned int add)	  
{
	ISP_CONTR = 0x83;
	ISP_CMD   = 0x03;
	ISP_ADDRH = (unsigned char)(add>>8);
	ISP_ADDRL = (unsigned char)(add&0xff);
	ISP_TRIG  = 0x46;
	ISP_TRIG  = 0xB9;
	_nop_();
	ISP_Disable();
}


/*********************************************************/
// ºÁÃ뼶µÄÑÓʱº¯Êý£¬timeÊÇÒªÑÓʱµÄºÁÃëÊý
/*********************************************************/
void DelayMs(uint time)
{
	uint i,j;
	for(i=0;i<time;i++)
		for(j=0;j<112;j++);
}


/*********************************************************/
// 10us¼¶ÑÓʱ³ÌÐò
/*********************************************************/
void Delay10us()
{
	_nop_();	// Ö´ÐÐÒ»ÌõÖ¸ÁÑÓʱ1΢Ãë
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}


/*********************************************************/
// ¶ÁÈ¡DHT11µ¥×ÜÏßÉϵÄÒ»¸ö×Ö½Ú
/*********************************************************/
uchar DhtReadByte(void)
{   
	bit bit_i; 
	uchar j;
	uchar dat=0;

	for(j=0;j<8;j++)    
	{
		while(!DHT11_P);	// µÈ´ýµÍµçƽ½áÊø	
		Delay10us();			// ÑÓʱ
		Delay10us();
		Delay10us();
		if(DHT11_P==1)		// ÅжÏÊý¾ÝÏßÊǸߵçƽ»¹Êǵ͵çƽ
		{
			bit_i=1; 
			while(DHT11_P);
		} 
		else
		{
			bit_i=0;
		}
		dat<<=1;		   		// ½«¸ÃλÒÆλ±£´æµ½dat±äÁ¿ÖÐ
		dat|=bit_i;    
	}
	return(dat);  
}


/*********************************************************/
// ¶ÁÈ¡DHT11µÄÒ»Ö¡Êý¾Ý£¬Êª¸ß¡¢ÊªµÍ(0)¡¢Î¸ߡ¢ÎµÍ(0)¡¢Ð£ÑéÂë
/*********************************************************/
void ReadDhtData()
{    	 
	uchar HumiHig;		// ʪ¶È¸ß¼ì²âÖµ
	uchar HumiLow;		// ʪ¶ÈµÍ¼ì²âÖµ 
	uchar TemHig;			// ζȸ߼ì²âÖµ
	uchar TemLow;			// ζȵͼì²âÖµ
	uchar check;			// УÑé×Ö½Ú 
	
	DHT11_P=0;				// Ö÷»úÀ­µÍ
	DelayMs(20);			// ±£³Ö20ºÁÃë
	DHT11_P=1;				// DATA×ÜÏßÓÉÉÏÀ­µç×èÀ­¸ß

	Delay10us();	 		// ÑÓʱµÈ´ý30us
	Delay10us();
	Delay10us();

	while(!DHT11_P);	// µÈ´ýDHTµÄµÍµçƽ½áÊø
	while(DHT11_P);		// µÈ´ýDHTµÄ¸ßµçƽ½áÊø

	//½øÈëÊý¾Ý½ÓÊÕ״̬
	HumiHig = DhtReadByte(); 	// ʪ¶È¸ß8λ
	HumiLow = DhtReadByte(); 	// ʪ¶ÈµÍ8Ϊ£¬×ÜΪ0
	TemHig  = DhtReadByte(); 	// ζȸß8λ 
	TemLow  = DhtReadByte(); 	// ζȵÍ8Ϊ£¬×ÜΪ0 
	check   = DhtReadByte();	// 8λУÑéÂ룬ÆäÖµµÈÓÚ¶Á³öµÄËĸö×Ö½ÚÏà¼ÓÖ®ºÍµÄµÍ8λ

	DHT11_P=1;				// À­¸ß×ÜÏß

	if(check==HumiHig + HumiLow + TemHig + TemLow) 		// Èç¹ûÊÕµ½µÄÊý¾ÝÎÞÎó
	{
		temp=TemHig; 			// ½«Î¶ȵļì²â½á¹û¸³Öµ¸øÈ«¾Ö±äÁ¿temp
		humi=HumiHig;			// ½«Êª¶ÈµÄ¼ì²â½á¹û¸³Öµ¸øÈ«¾Ö±äÁ¿humi
	}
}



/*********************************************************/
// 1602Òº¾§Ð´ÃüÁÊý£¬cmd¾ÍÊÇҪдÈëµÄÃüÁî
/*********************************************************/
void LcdWriteCmd(uchar cmd)
{ 
	LcdRs_P = 0;
	LcdRw_P = 0;
	LcdEn_P = 0;
	P0=cmd;
	DelayMs(2);
	LcdEn_P = 1;    
	DelayMs(2);
	LcdEn_P = 0;	
}


/*********************************************************/
// 1602Òº¾§Ð´Êý¾Ýº¯Êý£¬dat¾ÍÊÇҪдÈëµÄÊý¾Ý
/*********************************************************/
void LcdWriteData(uchar dat)
{
	LcdRs_P = 1; 
	LcdRw_P = 0;
	LcdEn_P = 0;
	P0=dat;
	DelayMs(2);
	LcdEn_P = 1;    
	DelayMs(2);
	LcdEn_P = 0;
}


/*********************************************************/
// 1602Òº¾§³õʼ»¯º¯Êý
/*********************************************************/
void LcdInit()
{
	LcdWriteCmd(0x38);        // 16*2ÏÔʾ£¬5*7µãÕó£¬8λÊý¾Ý¿Ú
	LcdWriteCmd(0x0C);        // ¿ªÏÔʾ£¬²»ÏÔʾ¹â±ê
	LcdWriteCmd(0x06);        // µØÖ·¼Ó1£¬µ±Ð´ÈëÊý¾Ýºó¹â±êÓÒÒÆ
	LcdWriteCmd(0x01);        // ÇåÆÁ
}


/*********************************************************/
// Òº¾§¹â±ê¶¨Î»º¯Êý
/*********************************************************/
void LcdGotoXY(uchar line,uchar column)
{
	// µÚÒ»ÐÐ
	if(line==0)        
		LcdWriteCmd(0x80+column); 
	 // µÚ¶þÐÐ
	if(line==1)        
		LcdWriteCmd(0x80+0x40+column); 
}


/*********************************************************/
// Òº¾§Êä³öÊý×Ö£¨PM2.5µÄ£©
/*********************************************************/
void LcdPrintNum1(uint num)
{
	LcdWriteData(num/100+48);					// °Ùλ
	LcdWriteData(num%100/10+48);			// ʮλ
	LcdWriteData(num%10+48); 					// ¸öλ
}


/*********************************************************/
// Òº¾§Êä³öÊý×Ö£¨ÎÂʪ¶ÈµÄ£©
/*********************************************************/
void LcdPrintNum2(uchar num)
{
	LcdWriteData(num/10+48);					// ʮλ
	LcdWriteData(num%10+48); 					// ¸öλ
}



/*********************************************************/
// Òº¾§Êä³ö×Ö·û´®º¯Êý
/*********************************************************/
void LcdPrintStr(uchar *str)
{
	while(*str!='\0')
		LcdWriteData(*str++);
}


/*********************************************************/
// Òº¾§ÏÔʾÄÚÈݳõʼ»¯
/*********************************************************/
void LcdShowInit()
{
	LcdGotoXY(0,0);										// Òº¾§¹â±ê¶¨Î»µ½µÚ0ÐеÚ0ÁÐ
	LcdPrintStr(" PM2.5:   ug/m3 ");	// ÏÔʾÄÚÈÝ
	LcdGotoXY(1,0);										// Òº¾§¹â±ê¶¨Î»µ½µÚ1ÐеÚ0ÁÐ
	LcdPrintStr("T:   C   H:  %RH");	// ÏÔʾÄÚÈÝ
	LcdGotoXY(1,4);										// ζȵ¥Î»ÉãÊ϶ÈÉÏÃæµÄԲȦ·ûºÅ
	LcdWriteData(0xdf);	
}


/*********************************************************/
// ´®¿Ú³õʼ»¯
/*********************************************************/
void UartInit()
{
	SCON = 0x50;		// ÅäÖô®¿Ú¼Ä´æÆ÷
	TMOD = 0x20;		// ÅäÖö¨Ê±Æ÷¼Ä´æÆ÷
	TH1  = 0xf4;		// ¼ÆË㲨ÌØÂʵÄֵΪ2400
	TL1  = 0xf4;		// ¼ÆË㲨ÌØÂʵÄֵΪ2400
	EA   = 1;				// ´ò¿ª×ÜÖжÏ
	ES   = 1;				// ´ò¿ª´®¿ÚÖжÏ
	TR1  = 1;				// Æô¶¯¶¨Ê±Æ÷
}


/*********************************************************/
// °´¼üɨÃè
/*********************************************************/
void KeyScanf()
{
	if(KeySet_P==0)		// ÅжÏÉèÖð´¼üÊÇ·ñ±»°´ÏÂ
	{
		EA=0;
		
		/*½«Òº¾§ÏÔʾ¸ÄΪÉèÖÃζȵÄÒ³Ãæ****************************************************/
		LcdWriteCmd(0x01);				  	
		LcdGotoXY(0,0);
		LcdPrintStr("Temperature Set ");
		LcdGotoXY(1,0);
		LcdPrintStr("      -    C    ");
		LcdGotoXY(1,10);	 					
		LcdWriteData(0xdf);			

		LcdGotoXY(1,4);	 					// ÔÚÒº¾§ÉÏÌî³äζȵÄÏÂÏÞÖµ	
		LcdPrintNum2(AlarmTL);	
		LcdGotoXY(1,7);	 					// ÔÚÒº¾§ÉÏÌî³äζȵÄÉÏÏÞÖµ
		LcdPrintNum2(AlarmTH);

		LcdGotoXY(1,5);	 					// ¹â±ê¶¨Î»µ½µÚ1ÐеÚ5ÁÐ
		LcdWriteCmd(0x0f);				// ¹â±êÉÁ˸
		
		DelayMs(10);	  					// È¥³ý°´¼ü°´ÏµĶ¶¶¯
		while(!KeySet_P);	 				// µÈ´ý°´¼üÊÍ·Å
		DelayMs(10);					  	// È¥³ý°´¼üËÉ¿ªµÄ¶¶¶¯

		/*ÉèÖÃζȵÄÏÂÏÞÖµ****************************************************************/
		while(KeySet_P)						// ¡°ÉèÖüü¡±Ã»Óб»°´Ï£¬ÔòÒ»Ö±´¦ÓÚζÈÏÂÏÞµÄÉèÖÃ
		{
			if(KeyDown_P==0)				// ÅÐ¶Ï ¡°¼õ°´¼ü¡° ÊÇ·ñ±»°´ÏÂ		
			{
				if(AlarmTL>0)					// Ö»Óе±Î¶ÈÏÂÏÞÖµ´óÓÚ0ʱ£¬²ÅÄܼõ1
					AlarmTL--;
				LcdGotoXY(1,4);	 			// ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄζÈÏÂÏÞÖµ	
				LcdPrintNum2(AlarmTL);  		
				LcdGotoXY(1,5);				// ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃ
				DelayMs(350);					// ÑÓʱ
			}
			if(KeyUp_P==0)		  		// ÅÐ¶Ï ¡°¼Ó°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
				if(AlarmTL<99)	   		// Ö»Óе±Î¶ÈÏÂÏÞֵСÓÚ99ʱ£¬²ÅÄܼÓ1
					AlarmTL++;
				LcdGotoXY(1,4);	 	 		// ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄζÈÏÂÏÞÖµ
				LcdPrintNum2(AlarmTL);
				LcdGotoXY(1,5);				// ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃ
				DelayMs(350);					// ÑÓʱ
			}	
		}

		LcdGotoXY(1,8);
		DelayMs(10);	  					// È¥³ý°´¼ü°´ÏµĶ¶¶¯
		while(!KeySet_P);	 				// µÈ´ý°´¼üÊÍ·Å
		DelayMs(10);					  	// È¥³ý°´¼üËÉ¿ªµÄ¶¶¶¯

		/*ÉèÖÃζȵÄÉÏÏÞÖµ****************************************************************/	
		while(KeySet_P)	  				// ¡°ÉèÖüü¡±Ã»Óб»°´Ï£¬ÔòÒ»Ö±´¦ÓÚζÈÉÏÏÞµÄÉèÖÃ
		{
			if(KeyDown_P==0)				// ÅÐ¶Ï ¡°¼õ°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
				if(AlarmTH>0)  				// Ö»Óе±Î¶ÈÉÏÏÞÖµ´óÓÚ0ʱ£¬²ÅÄܼõ1			
					AlarmTH--;
				LcdGotoXY(1,7);	 	  	// ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄζÈÉÏÏÞÖµ
				LcdPrintNum2(AlarmTH);
				LcdGotoXY(1,8);				// ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃ
				DelayMs(350);					// ÑÓʱ
			}
			if(KeyUp_P==0)			   	// ÅÐ¶Ï ¡°¼Ó°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
				if(AlarmTH<99)	 			// Ö»Óе±Î¶ÈÉÏÏÞֵСÓÚ99ʱ£¬²ÅÄܼÓ1
					AlarmTH++;
				LcdGotoXY(1,7);				// ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄζÈÉÏÏÞÖµ 	
				LcdPrintNum2(AlarmTH);
				LcdGotoXY(1,8);				// ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃ
				DelayMs(350);					// ÑÓʱ
			}								 
		}

		/*½«Òº¾§ÏÔʾ¸ÄΪÉèÖÃʪ¶ÈµÄÒ³Ãæ****************************************************/
		LcdWriteCmd(0x01);				  	
		LcdGotoXY(0,0);
		LcdPrintStr("  Humidity Set  ");
		LcdGotoXY(1,0);
		LcdPrintStr("      -   %RH   ");		

		LcdGotoXY(1,4);	 					// ÔÚÒº¾§ÉÏÌî³äʪ¶ÈµÄÏÂÏÞÖµ	
		LcdPrintNum2(AlarmHL);	
		LcdGotoXY(1,7);	 					// ÔÚÒº¾§ÉÏÌî³äʪ¶ÈµÄÉÏÏÞÖµ
		LcdPrintNum2(AlarmHH);

		LcdGotoXY(1,5);	 					// ¹â±ê¶¨Î»µ½µÚ1ÐеÚ5ÁÐ
		
		DelayMs(10);	  					// È¥³ý°´¼ü°´ÏµĶ¶¶¯
		while(!KeySet_P);	 				// µÈ´ý°´¼üÊÍ·Å
		DelayMs(10);
		
		/*ÉèÖÃʪ¶ÈµÄÏÂÏÞÖµ****************************************************************/
		while(KeySet_P)				 		// ¡°ÉèÖüü¡±Ã»Óб»°´Ï£¬ÔòÒ»Ö±´¦ÓÚʪ¶ÈÏÂÏÞµÄÉèÖÃ
		{
			if(KeyDown_P==0)				// ÅÐ¶Ï ¡°¼õ°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
				if(AlarmHL>0)	 				// Ö»Óе±Êª¶ÈÏÂÏÞÖµ´óÓÚ0ʱ£¬²ÅÄܼõ1
					AlarmHL--;
				LcdGotoXY(1,4);				// ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄʪ¶ÈÏÂÏÞÖµ 	
				LcdPrintNum2(AlarmHL);
				LcdGotoXY(1,5);				// ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃ
				DelayMs(350);
			}
			if(KeyUp_P==0)			  	// ÅÐ¶Ï ¡°¼Ó°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
				if(AlarmHL<99)	  		// Ö»Óе±Êª¶ÈÏÂÏÞֵСÓÚ99ʱ£¬²ÅÄܼÓ1
					AlarmHL++;
				LcdGotoXY(1,4);	 		 	// ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄʪ¶ÈÏÂÏÞÖµ
				LcdPrintNum2(AlarmHL);
				LcdGotoXY(1,5);	  		// ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃ
				DelayMs(350);					// ÑÓʱ
			}	
		}

		LcdGotoXY(1,8);
		DelayMs(10);	  					// È¥³ý°´¼ü°´ÏµĶ¶¶¯
		while(!KeySet_P);	 				// µÈ´ý°´¼üÊÍ·Å
		DelayMs(10);					  	// È¥³ý°´¼üËÉ¿ªµÄ¶¶¶¯
		
		/*ÉèÖÃʪ¶ÈµÄÉÏÏÞÖµ****************************************************************/
		while(KeySet_P)				   	// ¡°ÉèÖüü¡±Ã»Óб»°´Ï£¬ÔòÒ»Ö±´¦ÓÚʪ¶ÈÉÏÏÞµÄÉèÖÃ
		{
			if(KeyDown_P==0)		 		// ÅÐ¶Ï ¡°¼õ°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
				if(AlarmHH>0)			  	// Ö»Óе±Êª¶ÈÉÏÏÞÖµ´óÓÚ0ʱ£¬²ÅÄܼõ1
					AlarmHH--;
				LcdGotoXY(1,7);	 		 	// ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄʪ¶ÈÉÏÏÞÖµ
				LcdPrintNum2(AlarmHH);
				LcdGotoXY(1,8);		   	// ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃ
				DelayMs(350);
			}
			if(KeyUp_P==0)				 	// ÅÐ¶Ï ¡°¼Ó°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
				if(AlarmHH<99)				// Ö»Óе±Êª¶ÈÉÏÏÞֵСÓÚ99ʱ£¬²ÅÄܼÓ1
					AlarmHH++;
				LcdGotoXY(1,7);	 			// ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄʪ¶ÈÉÏÏÞÖµ	
				LcdPrintNum2(AlarmHH);
				LcdGotoXY(1,8);	 			// ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃ
				DelayMs(350);					// ÑÓʱ
			}	
		}

		/*½«Òº¾§ÏÔʾ¸ÄΪÉèÖÃPM2.5µÄÒ³Ãæ****************************************************/
		LcdWriteCmd(0x01);				  	// ÉèÖýçÃæµÄÏÔʾ¿ò¼Ü
		LcdGotoXY(0,0);
		LcdPrintStr("   PM2.5 Set    ");
		LcdGotoXY(1,0);
		LcdPrintStr("        ug/m3   ");
		LcdGotoXY(1,4);								// ÏÔʾµ±Ç°µÄ±¨¾¯Öµ
		LcdPrintNum1(AlarmPM);				

		LcdGotoXY(1,6);	 							// ¹â±ê¶¨Î»µ½µÚ1ÐеÚ6ÁÐ
		DelayMs(10);	  							// È¥³ý°´¼ü°´ÏµĶ¶¶¯
		while(!KeySet_P);	 						// µÈ´ý°´¼üÊÍ·Å
		DelayMs(10);
		
		while(KeySet_P)				 				// ¡°ÉèÖüü¡±Ã»Óб»°´Ï£¬ÔòÒ»Ö±´¦ÓÚ¹âÇ¿ÏÂÏÞµÄÉèÖÃ
		{
			if(KeyDown_P==0)						// ÅÐ¶Ï ¡°¼õ°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
				if(AlarmPM>1)							// Ö»ÓÐgAlarmPM´óÓÚ1²ÅÄܼõ1								
					AlarmPM--;				
				LcdGotoXY(1,4);						// Òº¾§¹â±ê¶¨Î»
				LcdPrintNum1(AlarmPM);		// ˢиıäºóµÄ±¨¾¯Öµ
				LcdGotoXY(1,6);
				DelayMs(200);							// ÑÓʱһÏÂ
			}
			if(KeyUp_P==0)			  			// ÅÐ¶Ï ¡°¼Ó°´¼ü¡° ÊÇ·ñ±»°´ÏÂ
			{
			if(AlarmPM<999)							// Ö»ÓÐgAlarmPMСÓÚ999²ÅÄܼÓ1
					AlarmPM++;				
				LcdGotoXY(1,4);						// Òº¾§¹â±ê¶¨Î»
				LcdPrintNum1(AlarmPM);		// ˢиıäºóµÄ±¨¾¯Öµ
				LcdGotoXY(1,6);
				DelayMs(200);							// ÑÓʱһÏÂ
			}	
		}

		/*Íê³ÉÉèÖã¬Í˳öÇ°µÄ´¦Àí**********************************************************/
		LcdWriteCmd(0x0C);	  						// È¡Ïû¹â±êÉÁ˸
		LcdShowInit();										// Òº¾§ÏÔʾΪ¼ì²â½çÃæµÄ

		DelayMs(10);	  									// È¥³ý°´¼ü°´ÏµĶ¶¶¯
		while(!KeySet_P);	 								// µÈ´ý°´¼üÊÍ·Å
		DelayMs(10);					  					// È¥³ý°´¼üËÉ¿ªµÄ¶¶¶¯

		Sector_Erase(0x2000);			 				// ´æ´¢Ö®Ç°±ØÐëÏȲÁ³ý
		EEPROM_Write(0x2000,AlarmTL);			// °ÑζÈÏÂÏÞ´æÈëµ½EEPROMµÄ0x2000Õâ¸öµØÖ·
		EEPROM_Write(0x2001,AlarmTH);			// °ÑζÈÉÏÏÞ´æÈëµ½EEPROMµÄ0x2001Õâ¸öµØÖ·
		EEPROM_Write(0x2002,AlarmHL);			// °Ñʪ¶ÈÏÂÏÞ´æÈëµ½EEPROMµÄ0x2002Õâ¸öµØÖ·
		EEPROM_Write(0x2003,AlarmHH);			// °Ñʪ¶ÈÉÏÏÞ´æÈëµ½EEPROMµÄ0x2003Õâ¸öµØÖ·
		EEPROM_Write(0x2004,AlarmPM/100);	// °ÑPM2.5´æÈëµ½EEPROMµÄ0x2004ºÍ0x2005ÕâÁ½¸öµØÖ·
		EEPROM_Write(0x2005,AlarmPM%100);
		
		EA=1;
	}	
}


/*********************************************************/
// ±¨¾¯ÅжÏ
/*********************************************************/
void AlarmJudge(void)
{
	/*ζÈ*/
	if(temp>AlarmTH)				// ζÈÊÇ·ñ¹ý¸ß
	{
		LedTH_P=0;
		LedTL_P=1;
	}
	else if(temp<AlarmTL)		// ζÈÊÇ·ñ¹ýµÍ
	{
		LedTL_P=0;
		LedTH_P=1;
	}
	else										// ζÈÕý³£
	{
		LedTH_P=1;
		LedTL_P=1;
	}

	/*ʪ¶È*/
	if(humi>AlarmHH)	   		// ʪ¶ÈÊÇ·ñ¹ý¸ß
	{
		LedHH_P=0;
	  LedHL_P=1;
	}
	else if(humi<AlarmHL)		// ʪ¶ÈÊÇ·ñ¹ýµÍ
	{
		LedHL_P=0;
		LedHH_P=1;
	}
	else				   					// ʪ¶ÈÕý³£
	{
		LedHH_P=1;
		LedHL_P=1;
	}
	
	/*PM2.5*/
	if(pm>AlarmPM)
		LedPM_P=0;
	else
		LedPM_P=1;

	/*·äÃùÆ÷*/
	if((LedHH_P==0)||(LedHL_P==0)||(LedTH_P==0)||(LedTL_P==0)||(LedPM_P==0)) 	// ·äÃùÆ÷Åжϣ¬Ö»ÒªÖÁÉÙ1¸ö±¨¾¯µÆÁÁ£¬·äÃùÆ÷¾Í±¨¾¯
		Buzzer_P=0;
	else	
		Buzzer_P=1;
}


/*********************************************************/
// ±¨¾¯Öµ³õʼ»¯
/*********************************************************/
void AlarmInit(void)
{
	AlarmTL=EEPROM_Read(0x2000);	// ´ÓEEPROMµÄ0x2000Õâ¸öµØÖ·¶Áȡζȵı¨¾¯ÏÂÏÞ
	AlarmTH=EEPROM_Read(0x2001);	// ´ÓEEPROMµÄ0x2001Õâ¸öµØÖ·¶Áȡζȵı¨¾¯ÉÏÏÞ
	AlarmHL=EEPROM_Read(0x2002);	// ´ÓEEPROMµÄ0x2002Õâ¸öµØÖ·¶Áȡʪ¶ÈµÄ±¨¾¯ÏÂÏÞ	
	AlarmHH=EEPROM_Read(0x2003);	// ´ÓEEPROMµÄ0x2003Õâ¸öµØÖ·¶Áȡʪ¶ÈµÄ±¨¾¯ÉÏÏÞ
	AlarmPM=EEPROM_Read(0x2004)*100+EEPROM_Read(0x2005);		// ¶ÁÈ¡PM2.5±¨¾¯Öµ
	
	if((AlarmTL==0)||(AlarmTL>100))	// Èç¹ûζÈÏÂÏÞ±¨¾¯Öµ¶Á³öÀ´Òì³££¨µÈÓÚ0»ò´óÓÚ100£©£¬ÔòÖØи³Öµ
		AlarmTL=20;
	if((AlarmTH==0)||(AlarmTH>100))	// Èç¹ûζÈÉÏÏÞ±¨¾¯Öµ¶Á³öÀ´Òì³££¨µÈÓÚ0»ò´óÓÚ100£©£¬ÔòÖØи³Öµ
		AlarmTH=35;
	if((AlarmHL==0)||(AlarmHL>100))	// Èç¹ûζÈÏÂÏÞ±¨¾¯Öµ¶Á³öÀ´Òì³££¨µÈÓÚ0»ò´óÓÚ100£©£¬ÔòÖØи³Öµ
		AlarmHL=40;
	if((AlarmHH==0)||(AlarmHH>100))	// Èç¹ûζÈÉÏÏÞ±¨¾¯Öµ¶Á³öÀ´Òì³££¨µÈÓÚ0»ò´óÓÚ100£©£¬ÔòÖØи³Öµ
		AlarmHH=85;
	if((AlarmPM==0)||(AlarmPM>1300))	// Èç¹û¶ÁÈ¡µ½µÄ±¨¾¯ÖµÒì³££¬ÔòÖØи³Öµ
		AlarmPM=200;
}


/*********************************************************/
// Ö÷º¯Êý
/*********************************************************/



硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

单片机座子;

11.0592M晶振;30pF独石电容;

电解电容10uF;电解电容 220uF;

电阻1K;电阻4.7K;

电阻10K;排阻10K;

轻触开关;1602液晶;

1602液晶座子;10K电位器;

DHT11传感器;DHT11座子;

PM2.5传感器;有源蜂鸣器;

S8550(PNP)三极管;

绿色led灯;红色led灯;

黄色led灯;电源开关;

DC3.5电源座;洞洞板;

电源线;导线:若干;

流程图:

设计资料

01 仿真图

本设计使用proteus8.9版本设计,资料中有软件链接,无需担心!具体如图!

02 原理图

本系统原理图采用Altium Designer19和proteul99SE设计,无需担心!具体如图!

03 程序

本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!

04 设计报告

一万六千字设计报告,具体如下!

05 设计资料

        资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、AD原理图、pcb电路图、开题报告、参考论文、流程图、任务书、仿真视频等。具体内容如下,全网最全! !

资料获取请观看前面演示视频!

点赞分享一起学习成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/540598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rabbitmq安装rabbitmq-delayed-message-exchange插件

下载地址&#xff1a;Community Plugins | RabbitMQ 上传到rabbitmq安装目录的/plugins目录下 我的是/usr/lcoal/rabbitmq/plugins/ 直接安装 [rootk8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [rootk8s-node1 rabbitmq]# rabbitmq-pl…

UE源码编译报了403之后

今天编译一个早期版本的ue引擎&#xff0c;发现报了一个错误&#xff0c;如下图&#xff1a; 如上图所示。 第一反应是被墙了&#xff0c;然后发现并不是。查了下官方文档&#xff0c;发现是更新了一个下载检测。更新地址https://github.com/EpicGames/UnrealEngine/releases/t…

图片壁纸社区app前后端开源小程序源码

图片壁纸社区APP前后端开源小程序源码&#xff0c;修改了开源版的前端样式&#xff0c;变成图片社区&#xff0c;也可以用来作为壁纸 源码下载地址抄笔记 (chaobiji.cn)

信号完整性的常见术语概念(面试常用)

目录 术语 概念一览 1&#xff0e;信号完整性&#xff08;Signal Integrity&#xff09; 2&#xff0e;传输线&#xff08;Transmission Line&#xff09; 3&#xff0e;特性阻抗&#xff08;Characteristic Impedance&#xff09; 4&#xff0e;反射&#xff08;Reflecti…

【分享】跨境虾皮Shopee各区域商品详情API返回值(商品,订单,面单等)♥

虾皮(shopee)是一个亚洲区域的电商平台&#xff0c;主要在东南亚地区提供电商服务。虾皮提供了丰富的电商数据&#xff0c;包括商品数据、订单数据、会员数据、评价数据等。 虾皮Shopee♥♥​​​​​​​♥​​​​​​​♥​​​​​​​♥​​​​​​​♥ 1.授权 ​ 接口…

SpringBoo利用 MDC 机制过滤出单次请求相关的日志

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.MDC 是什么 3.代码实战 4.总结 1.前言 在服务出现故障时&#xff…

动态规划-简单多状态dp问题1

文章目录 1. 按摩师&#xff08;面试题 17.16&#xff09;2. 打家劫舍 II&#xff08;213&#xff09;3. 删除并获得点数&#xff08;740&#xff09;4. 粉刷房子&#xff08;LCR 091&#xff09; 1. 按摩师&#xff08;面试题 17.16&#xff09; 题目描述&#xff1a; 状态表…

字节码文件的组成

字节码文件的组成 字节码文件的组成1 以正确的姿势打开文件2 字节码文件的组成2.1 基本信息2.2 常量池2.3 字段2.4 方法2.5 属性 3 字节码常用工具3.1 javap3.2 jclasslib插件3.3 Arthas 4 字节码常见指令 字节码文件的组成 1 以正确的姿势打开文件 字节码文件中保存了源代码…

【数据结构】习题之链表的回文结构和相交链表

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;前路漫漫亦灿灿 前言 今日的习题是关于链表的&#xff0c;分别是链表的回文结构和相交链表的判断。 链表的回文结构 题目为&#xff1a;链表的回文结…

校园通用型发生网络安全事件解决方案

已知校园多教学楼、多教学机房、非标网络机房缺乏防护设备、检测设备、安全保护软件(杀软) 切断所有外网&#xff0c;断网处理!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 部署路由系统可选择爱快、routeros、openwrt。等。可将日志上传到日志分析系统。《这项非必要的》 部署开源防火…

JVM—对象的创建流程与内存分配

JVM—对象的创建流程与内存分配 创建流程 对象创建的流程图如下&#xff1a; 对象的内存分配方式 内存分配的方式有两种&#xff1a; 指针碰撞&#xff08;Bump the Pointer&#xff09;空闲列表&#xff08;Free List&#xff09; 分配方式说明收集器指针碰撞&#xff08…

Aritest+python+Jenkins解放双手iOS/Android自动化

ARITest、Python 和 Jenkins 可以结合在一起创建一个自动化测试解决方案&#xff0c;实现持续集成和持续测试的目标。以下是三者如何协同工作的基本概念&#xff1a; 1. **ARITest**&#xff1a; ARITest 是一款功能全面的自动化测试工具&#xff0c;提供 UI 自动化、接口自…

加强金融行业关键信息基础设施安全保护,有效防范网络安全风险

当前&#xff0c;随着数字化发展的不断深入&#xff0c;关键信息基础设施作为国家的重要战略资源&#xff0c;面临着国内外严峻的网络安全风险。为了确保国家安全&#xff0c;在国家发展各领域和全过程中&#xff0c;需要将安全发展贯穿始终&#xff0c;筑牢国家安全屏障。金融…

C++从入门到精通——类和对象(下篇)

1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…

【CSS疑难点汇总】1.bor-box失效情况总结以及高宽设置为auto的情况

1. box-sizing box-sizing是改变盒子宽高的计算方式&#xff0c;一般使用bor-box&#xff0c;消除padding和border对整个盒子的影响&#xff0c;但在没有明确给出宽高的情况下&#xff0c;box-sizing是没有效果的 1.1 box-sizing不生效的情况 1.1.1块级盒子嵌套 ​ 宽度继承…

使用快捷回复软件的好处

在现代的客服工作中&#xff0c;尤其是店铺大促期间&#xff0c;咨询量的激增往往让客服人员应接不暇。即使打字速度再快&#xff0c;也难以跟上源源不断的客流。想应对这样的情况&#xff0c;快捷回复软件就非常适合客服人员了。 以我个人正在使用的客服宝为例&#xff0c;我想…

2024年阿里云优惠合集:2核2G3M云服务器61元/年起

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

Unity中图片和Base64字符串之间的转换

大家好&#xff0c;我是阿赵。   这次来讲一下在unity引擎里面&#xff0c;图片和base64字符串的互相转换问题。 一、图片传输的多种方式 有时候我们需要把图片通过网络传输发送。   在Unity里面&#xff0c;有不止一种方式可以实现&#xff0c;比如说&#xff0c;把图片的…

Python+Requests模拟发送GET请求

模拟发送GET请求 前置条件&#xff1a;导入requests库 一、发送不带参数的get请求 代码如下&#xff1a; 以百度首页为例 import requests# 发送get请求 response requests.get(url"http://www.baidu.com") print(response.content.decode("utf-8"))…

数据结构之单链表的相关知识点及应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点 单链表中尾插数据 打印单链…