基于51单片机的报警器(声音,窗户,热红外,穿越禁区)原理图、流程图、物料清单、仿真图、源代码
基于51单片机的报警器(声音,窗户,热红外,穿越禁区)
家用防盗器
1、具有设防、撤防按键
2、设防时间内自动设防
3、有声响报警、开窗户报警、红外报警、穿越禁区报警。
4、使用开关模拟各个传感器
#include "reg51.h"
#include"ds1302.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;//传感器输入
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4; //设置
sbit k6=P2^3;
sbit beep=P2^4;//蜂鸣器
uchar FRQ=0,buzzer=0;
uchar mode=0,moshi=0;
uchar start1=0,start2=0,start3=0,start4=0;//设防开关
uchar error1=0,error2=0,error3=0,error4=0;//报警标志
uchar shi1=1,fen1=0,shi2=20,fen2=0;
uchar disp1[]=" 00:00:00 ";
uchar disp2[]="00:00 00:00";
uchar disp3[]="1: off 2: off ";
uchar disp4[]="3: off 4: off ";
uchar time1=0,yun=1;
uchar key_scan()//按键检测
{
uchar i,j;
i=0;
j=0;
P3=0x0f;
if(P3!=0x0f) //检测有无按下
{
switch(P3)//检测行
{
case 0x0e:i=0;break;
case 0x0d:i=1;break;
case 0x0b:i=2;break;
case 0x07:i=3;
}
P3=0xf0;
switch(P3)//检测列
{
case 0xe0:j=1;break;
case 0xd0:j=5;break;
case 0xb0:j=9;break;
case 0x70:j=13;
}
while(P3!=0xf0);//等待按键松开
}
return i+j;
}
//延时
void delay_ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<110;j++);
}
}
//主函数
void main()
{
uint key=0,i=0,j=0,k=0;
init_1602();//初始化
Ds1302ReadTime();
TIME[0]=0;
Ds1302Init();
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
TH1=0xfe;
TL1=FRQ;
ET1=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
delay_ms(1);//报警器
FRQ++;
key=key_scan();//按键检测
if(!k6)//关闭报警
{
yun=0;
TR1=0;
}
if(k1 && k2 && k3 && k4)
yun=1;
if(key==1)//声音
{
start1=1;
}
if(key==5)
{
start1=0;
TR1=0;error1=0;
}
if(key==2)//窗户
{
start2=1;
}
if(key==6)
{
start2=0;
TR1=0;error2=0;
}
if(key==3)//红外
{
start3=1;
}
if(key==7)
{
start3=0;
TR1=0;error3=0;
}
if(key==4)//禁区
{
start4=1;
}
if(key==8)
{
start4=0;
TR1=0;error4=0;
}
if(mode==1)//设置时间
{
if(key==9) //上限
{
if(shi2<23)
shi2++;
}
if(key==10)
{
if(shi2>0)
shi2--;
}
if(key==11)
{
if(fen2<59)
fen2++;
}
if(key==12)
{
if(fen2>0)
fen2--;
}
if(key==13)//下限
{
if(shi1<23)
shi1++;
}
if(key==14)
{
if(shi1>0)
shi1--;
}
if(key==15)
{
if(fen1<59)
fen1++;
}
if(key==16)
{
if(fen1>0)
fen1--;
}
}
if(!k5)//设置
{
mode=!mode;
while(!k5);
}
if(start1==1)//声音设防控制
{
if(!k1)
{
error1=1;
if(yun==1)
TR1=1;
}
}
if(start2==1)//窗户设防控制
{
if(!k2)
{
error2=1;
if(yun==1)
TR1=1;
}
}
if(start3==1)//红外设防控制
{
if(!k3)
{
error3=1;
if(yun==1)
TR1=1;
}
}
if(start4==1)//禁区设防控制
{
if(!k4)
{
error4=1;
if(yun==1)
TR1=1;
}
}
//时间区间控制
j=0;
i=(TIME[2]>>4)*10+(TIME[2] & 0X0F);
j=(TIME[1]>>4)*10+(TIME[1] & 0X0F);
k=i*60+j;
i=shi1*60+fen1;//自动设防
j=shi2*60+fen2;
if(i>j)
j=j+1440;
if((k>i)&&(k<j))
{
start1=1;start2=1;start3=1;start4=1;
moshi=0;
}
else//手动控制时间
{
if(moshi==0)
{
start1=0;start2=0;start3=0;start4=0;
TR1=0;
moshi=1;
}
}
}
}
//定时器0中断
void Timer0() interrupt 1
{
if(time1<10)//读取时间
time1++;
else
{
time1=0;
Ds1302ReadTime();
disp1[4]=(TIME[2]>>4)+0X30;//显示
disp1[5]=(TIME[2]&0X0F)+0X30;
disp1[7]=(TIME[1]>>4)+0X30;
disp1[8]=(TIME[1]&0X0F)+0X30;
disp1[10]=(TIME[0]>>4)+0X30;
disp1[11]=(TIME[0]&0X0F)+0X30;
disp2[0]=shi1/10+0x30;
disp2[1]=shi1%10+0x30;
disp2[3]=fen1/10+0x30;
disp2[4]=fen1%10+0x30;
disp2[11]=shi2/10+0x30;
disp2[12]=shi2%10+0x30;
disp2[14]=fen2/10+0x30;
disp2[15]=fen2%10+0x30;
if(mode==1)
{
write_string(1,0,disp1);
write_string(2,0,disp2);
}
else //设防显示
{
if(start1==0)//声音
{
disp3[2]=' ';
disp3[3]='o';
disp3[4]='f';
disp3[5]='f';
disp3[6]=' ';
}
else
{
if(error1==0)
{
disp3[2]=' ';
disp3[3]='o';
disp3[4]='n';
disp3[5]=' ';
disp3[6]=' ';
}
else
{
if(disp3[2]==' ')
{
disp3[2]=(TIME[2]>>4)+0x30;
disp3[3]=(TIME[2]&0x0f)+0x30;
disp3[4]=':';
disp3[5]=(TIME[1]>>4)+0x30;
disp3[6]=(TIME[1]&0x0f)+0x30;
}
}
}
if(start2==0)//窗户
{
disp3[10]=' ';
disp3[11]='o';
disp3[12]='f';
disp3[13]='f';
disp3[14]=' ';
}
else
{
if(error2==0)
{
disp3[10]=' ';
disp3[11]='o';
disp3[12]='n';
disp3[13]=' ';
disp3[14]=' ';
}
else
{
if(disp3[10]==' ')
{
disp3[10]=(TIME[2]>>4)+0x30;
disp3[11]=(TIME[2]&0x0f)+0x30;
disp3[12]=':';
disp3[13]=(TIME[1]>>4)+0x30;
disp3[14]=(TIME[1]&0x0f)+0x30;
}
}
}
if(start3==0)//红外
{
disp4[2]=' ';
disp4[3]='o';
disp4[4]='f';
disp4[5]='f';
disp4[6]=' ';
}
else
{
if(error3==0)
{
disp4[2]=' ';
disp4[3]='o';
disp4[4]='n';
disp4[5]=' ';
disp4[6]=' ';
}
else
{
if(disp4[2]==' ')
{
disp4[2]=(TIME[2]>>4)+0x30;
disp4[3]=(TIME[2]&0x0f)+0x30;
disp4[4]=':';
disp4[5]=(TIME[1]>>4)+0x30;
disp4[6]=(TIME[1]&0x0f)+0x30;
}
}
}
if(start4==0)//禁区
{
disp4[10]=' ';
disp4[11]='o';
disp4[12]='f';
disp4[13]='f';
disp4[14]=' ';
}
else
{
if(error4==0)
{
disp4[10]=' ';
disp4[11]='o';
disp4[12]='n';
disp4[13]=' ';
disp4[14]=' ';
}
else
{
if(disp4[10]==' ')
{
disp4[10]=(TIME[2]>>4)+0x30;
disp4[11]=(TIME[2]&0x0f)+0x30;
disp4[12]=':';
disp4[13]=(TIME[1]>>4)+0x30;
disp4[14]=(TIME[1]&0x0f)+0x30;
}
}
}
write_string(1,0,disp3);
write_string(2,0,disp4);
}
}
TH0=0X3C;
TL0=0XB0;
}
//定时器1中断
void Timer1() interrupt 3
{
TH1=0xfe;
TL1=FRQ;
beep=!beep;
}