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

news2024/11/24 19:28:27

基于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电路图、开题报告、参考论文、流程图、任务书、仿真视频等。具体内容如下,全网最全! !

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

点赞分享一起学习成长。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【php开发工程师系统性教学】——laravel中自动验证的实现教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

下载好了annaconda,但是在创建一个新的Conda虚拟环境报错

文章目录 问题描述&#xff1a;解决方案1.生成一个配置文件 问题总结 问题描述&#xff1a; ProxyError(MaxRetryError(“HTTPSConnectionPool(host‘repo.anaconda.com’, port443): Max retries exceeded with url: /pkgs/pro/win-64/repodata.json.bz2 (Caused by ProxyErr…

高抗干扰/抗静电液晶屏驱动IC-VK2C24笔段液晶控制器

VK2C24是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大288点&#xff08;72SEGx4COM&#xff09;或者最大544点&#xff08;68SEGx8COM&#xff09;或者最大960点&#xff08;60SEGx16COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#xff…

记录一下MySQL8版本更改密码规则

#查看当前密码策略 show variables like validate_password%;#修改密码等级为low set global validate_password.policy LOW; #注意MySQL8版本这是点&#xff0c;不是_#修改密码长度为6 set global validate_password.length 6;#查询我的数据库中user表host和user select host,…

(笔记)KEIL经常碰到的错误(持续整理)

KEIL常碰到的错误 一、ERROR报错1、Build时报错 Error: L6218E2、Build时报错 error 653、Default Compiler Version 54、core_cm3.h(1213): error: unknown type name inline 二、调试与仿真1、keil5软件仿真没有实时波形2、调试模式时&#xff0c;程序前没有灰块3、Periphera…

如何学习VBA_3.2.20:DTP与Datepicker实现日期的输入

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

cesium 平滑显示billboard 透明度

描述&#xff1a;加载billboard的时候&#xff0c;要么是显示&#xff0c;要么是隐藏&#xff0c;不能平滑的显示&#xff0c;有个从不显示到显示的过程 解决方案&#xff1a;创建billboard的时候给一个color&#xff0c;颜色为(255,255,255)&#xff0c;透明度从0-1 let opaci…

Proteus 8 的使用记录

创建仿真文件 新建文件&#xff1a;默认下一步&#xff0c;至完成创建。 功能选择如图&#xff1a; 放置器件 常用元器件名称 keywords 常用51单片机 AT89C52 晶振 CRYSTAL 电阻 RES 排阻 RESPACK-8 瓷片电容 CAP 电解电容 CAP-ELEC 单刀单掷开关 S…

基于SSM+Jsp+Mysql的大学生校园兼职系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

TQZC706开发板教程:在ZC706上运行ADRV9371(vivado2018.3)

首先需要在github上下载两个文件&#xff0c;本例程用到的文件以及最终文件&#xff0c;我都会放在网盘里面&#xff0c;地址在本文的末尾&#xff0c;需要自行提取 在github上搜索hdl选择第一个-->选择版本-->我所使用的vivado是2018.3版本&#xff0c;所以这里我下载的…

什么场景适合使用Traefik?

Traefik 作为一款现代的反向代理和负载均衡器&#xff0c;已经成为云原生环境中的热门选择。它提供的动态配置能力和强大的自动化功能使其在多种场景中非常有用。本文将详细探讨适合使用 Traefik 的几种关键场景&#xff0c;并解释为何在这些情况下它特别有用 &#x1f30d;&am…

Spring Boot 统一功能处理(二)

本篇主要介绍Spring Boot统一功能处理中的统一数据返回格式。 目录 一、定义统一的返回类 二、配置统一数据格式 三、测试配置效果 四、统一格式返回的优点 五、源码角度解析String问题 一、定义统一的返回类 在我们的接口在处理请求时&#xff0c;返回的结果可以说是参…

UE C++ 学习

UBT&#xff08;虚幻编译工具&#xff08;UnrealBuildTool&#xff09;&#xff09;和UHT虚幻头工具&#xff08;UnrealHeaderTool&#xff09; UE有一组用于自动执行编译虚幻引擎过程的工具&#xff0c;包括 UBT和UHT&#xff08;以及其他工具&#xff09;。实现这一套工具的目…

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

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

CSS3 立体 3D 变换

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍CSS3 立体 3D 变换&#x1f48e;1 坐标轴&#x1f48e;2 perspective 透视视…

Vue(二):报错调试,vue3响应式原理、computed和watch,ref,props,接口

一、准备工作调试 跟着张天禹老师看前几集的时候可能会遇到如下问题&#xff1a; 1.下载插件&#xff1a;Vue Language Features (Volar)或者直接下载vue-offical 2.npm run serve时运行时出现错误&#xff1a;Error: vitejs/plugin-vue requires vue (&#xff1e;3.2.13) …

Flutter仿Boss-7.首页列表

效果 考察使用 Flutter Model的创建TabBar及TabBarView 的使用标签Wrap控件的使用列表ListView的使用 具体实现 今天懒的写文字了&#xff0c;想看具体实现的可以直接去我的github上&#xff1a; github&#xff1a;github.com/yixiaolunhui/flutter_project

PostgreSQL入门到实战-第二十四弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(八)官网地址PostgreSQL概述PostgreSQL中CROSS JOIN命令理论PostgreSQL中CROSS JOIN命令实战更新计划 PostgreSQL中表连接操作(八) 使用PostgreSQL CROSS JOIN从连接的表中生成行的笛卡尔乘积。 官网地址 声明: 由于操作系统, 版…

Xcode 15.0 新 #Preview 预览让 SwiftUI 界面调试更加悠然自得

概览 从 Xcode 15 开始&#xff0c;苹果推出了新的 #Preview 宏预览机制&#xff0c;它无论从语法还是灵活性上都远远超过之前的预览方式。#Preview 不但可以实时预览 SwiftUI 视图&#xff0c;而且对 UIKit 的界面预览也是信手拈来。 想学习新 #Preview 预览的一些超实用调试…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒解密步骤

网络技术的不断应用与发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;利用网络可以开展各项工作业务&#xff0c;可以大大提高企业的生产效率&#xff0c;然而&#xff0c;网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业的数据安全带来…