功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示当前设定的布防状态
2.按键可切换布防设定
3.支持手动报警功能
4.支持一键布防,一键撤防
5.分别采用震动传感器模块和SR501红外模块来检测
原理图:
PCB:
主程序:
#include "main.h"
bit refreshFlag = 1;
char dis0[16]; //定义显示区域临时存储数组
bit monitorFlag1 = 0; //红外热电偶检测
bit monitorFlag2 = 0; //门窗异常监测
bit monitorFlag3 = 0; //玻璃破碎监测
bit mAlarmFlag = 0; //手动报警标志
bit alarmFlag1 = 0; //红外热电偶监测报警
bit alarmFlag2 = 0; //门窗异常监测报警
bit alarmFlag3 = 0; //玻璃破碎监测报警
unsigned char alarmFlagDelay = 0;
void main(void)
{
BUZZER = OFF;
Timer0_Init();
LCD_Init(); //初始化液晶
DelayMs(200); //延时有助于稳定
LCD_Clear(); //清屏
LCD_DispStr(0, 0, " M1 M2 M3 ");
while (1) //主循环
{
if (monitorFlag1 == 1)
{
if (MONITOR1 == YES) //监测到窗外有人
{
alarmFlag1 = 1;
}
else
{
alarmFlag1 = 0;
}
}
if (monitorFlag2 == 1)
{
if (MONITOR2 == YES) //监测到门窗异常
{
alarmFlagDelay = 5;
alarmFlag2 = 1;
}
else
{
if (alarmFlagDelay == 0)
{
alarmFlag2 = 0;
}
}
}
if (monitorFlag3 == 1)
{
if (MONITOR3 == YES) //监测到玻璃破碎
{
alarmFlag3 = 1;
}
else
{
alarmFlag3 = 0;
}
}
if (mAlarmFlag == 1) //手动报警
{
BUZZER = ON;
}
else
{
if ((monitorFlag1 == 1 && alarmFlag1 == 1) || (monitorFlag2 == 1 && alarmFlag2 == 1) || (monitorFlag3 == 1 && alarmFlag3 == 1)) //设防的情况下
{
BUZZER = ON;
}
else
{
BUZZER = OFF;
}
}
if (refreshFlag == 1) //500ms获取数据并发送
{
refreshFlag = 0;
if (alarmFlagDelay > 0)
{
alarmFlagDelay--;
}
if (alarmFlag1 == 0)
{
if (monitorFlag1 == 0)
{
LCD_DispStr(0, 1, " OFF");
}
else
{
LCD_DispStr(0, 1, " ON ");
}
}
else
{
LCD_DispStr(0, 1, " Ala");
}
if (alarmFlag2 == 0)
{
if (monitorFlag2 == 0)
{
LCD_DispStr(5, 1, " OFF");
}
else
{
LCD_DispStr(5, 1, " ON ");
}
}
else
{
LCD_DispStr(5, 1, " Ala");
}
if (alarmFlag3 == 0)
{
if (monitorFlag3 == 0)
{
LCD_DispStr(10, 1, " OFF");
}
else
{
LCD_DispStr(10, 1, " ON ");
}
}
else
{
LCD_DispStr(10, 1, " Ala");
}
}
KeyProcess();
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Timer0_Init(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = (65536 - 10000) / 256; //重新赋值 10ms
TL0 = (65536 - 10000) % 256;
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_Interrupt(void) interrupt 1
{
static unsigned char time10ms = 0;
TH0 = (65536 - 10000) / 256; //重新赋值 10ms
TL0 = (65536 - 10000) % 256;
time10ms++;
if (time10ms >= 50) // 0.5s
{
time10ms = 0;
refreshFlag = 1;
}
}