基于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电路图、开题报告、参考论文、流程图、任务书、仿真视频等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。