本文主要是介绍基于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.5uchar 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(); // ÑÓʱµÈ´ý30usDelay10us();Delay10us();while(!DHT11_P); // µÈ´ýDHTµÄµÍµçƽ½áÊøwhile(DHT11_P); // µÈ´ýDHTµÄ¸ßµçƽ½áÊø//½øÈëÊý¾Ý½ÓÊÕ״̬HumiHig = DhtReadByte(); // ʪ¶È¸ß8λHumiLow = DhtReadByte(); // ʪ¶ÈµÍ8Ϊ£¬×ÜΪ0TemHig = DhtReadByte(); // ζȸß8λ TemLow = DhtReadByte(); // ζȵÍ8Ϊ£¬×ÜΪ0 check = DhtReadByte(); // 8λУÑéÂ룬ÆäÖµµÈÓÚ¶Á³öµÄËĸö×Ö½ÚÏà¼ÓÖ®ºÍµÄµÍ8λDHT11_P=1; // À¸ß×ÜÏßif(check==HumiHig + HumiLow + TemHig + TemLow) // Èç¹ûÊÕµ½µÄÊý¾ÝÎÞÎó{temp=TemHig; // ½«Î¶ȵļì²â½á¹û¸³Öµ¸øÈ«¾Ö±äÁ¿temphumi=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; // ¼ÆË㲨ÌØÂʵÄֵΪ2400TL1 = 0xf4; // ¼ÆË㲨ÌØÂʵÄֵΪ2400EA = 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ʱ£¬²ÅÄܼõ1AlarmTL--;LcdGotoXY(1,4); // ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄζÈÏÂÏÞÖµ LcdPrintNum2(AlarmTL); LcdGotoXY(1,5); // ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃDelayMs(350); // ÑÓʱ}if(KeyUp_P==0) // ÅÐ¶Ï ¡°¼Ó°´¼ü¡° ÊÇ·ñ±»°´ÏÂ{if(AlarmTL<99) // Ö»Óе±Î¶ÈÏÂÏÞֵСÓÚ99ʱ£¬²ÅÄܼÓ1AlarmTL++;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ʱ£¬²ÅÄܼÓ1AlarmTH++;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ʱ£¬²ÅÄܼõ1AlarmHL--;LcdGotoXY(1,4); // ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄʪ¶ÈÏÂÏÞÖµ LcdPrintNum2(AlarmHL);LcdGotoXY(1,5); // ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃDelayMs(350);}if(KeyUp_P==0) // ÅÐ¶Ï ¡°¼Ó°´¼ü¡° ÊÇ·ñ±»°´ÏÂ{if(AlarmHL<99) // Ö»Óе±Êª¶ÈÏÂÏÞֵСÓÚ99ʱ£¬²ÅÄܼÓ1AlarmHL++;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ʱ£¬²ÅÄܼõ1AlarmHH--;LcdGotoXY(1,7); // ÖØÐÂË¢ÐÂÏÔʾ¸ü¸ÄºóµÄʪ¶ÈÉÏÏÞÖµLcdPrintNum2(AlarmHH);LcdGotoXY(1,8); // ÖØж¨Î»ÉÁ˸µÄ¹â±êλÖÃDelayMs(350);}if(KeyUp_P==0) // ÅÐ¶Ï ¡°¼Ó°´¼ü¡° ÊÇ·ñ±»°´ÏÂ{if(AlarmHH<99) // Ö»Óе±Êª¶ÈÉÏÏÞֵСÓÚ99ʱ£¬²ÅÄܼÓ1AlarmHH++;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²ÅÄܼÓ1AlarmPM++; 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;elseLedPM_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电路图、开题报告、参考论文、流程图、任务书、仿真视频等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。
这篇关于基于51单片机智能家居空气质量监控—温湿度PM2.5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!