求思路 在电路图和代码上添加自动上锁功能。师傅不满足现在的功能,让我们自己钻研,在代码和电路图添加上一旦蜂鸣器警报响起就可以使窗户自动上锁的代码和电路图,这部分师傅没讲过,我是真的没办法了,求各位帮帮忙。
单片机源程序如下:
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
//红外热释电传感器 平时为0 有输出为1
sbit safe_key = P2^3; //安全按钮,应对在家的时候用,按下代表启动安全开关
sbit hw_B = P2^4; //红外热释传感器定义--窗
sbit hw_A = P2^5; //红外热释传感器定义--门
sbit beep = P2^7; //蜂鸣器定义
//指示灯
sbit red = P2^0; //红色发光二极管定义
sbit green = P2^1; //绿色发光二极管定义
sbit yellow = P2^2; //黄灯
bit flag_300ms = 0;
uchar flag_alarm ; //报警标志位
uchar flag_bufang ; //布防标志位
uchar flag_bufang_en ; //布防标志位使能
uint flag_value; //用做定时器的变量
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
void voice() //蜂鸣器报警函数
{
uchar nn;
for(nn=0;nn<50;nn++)
{
beep=0;
delay_1ms(1);
beep=1;
delay_1ms(1);
}
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P1 |= 0x1c;
if((P1 & 0x1c) != 0x1c) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x1c) != 0x1c) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P1 & 0x1c)
{
case 0x18: key_can = 1; break; //得到按键值
case 0x14: key_can = 2; break; //得到按键值
case 0x0c: key_can = 3; break; //得到按键值
// 00011100 P17--P10 0x1c
// 11111011 P12
// 00011000 0x18
}
}
}
else //按键松开
key_new = 1;
}
/******************对应不同按键处理**********************/
void key_with()
{
if(key_can==1) //按键紧急报警
{
flag_alarm = 1; //报警标志位 ;
}
if(key_can==2) //布防按键
{
flag_bufang_en=1;
}
if(key_can==3) //取消报警 把变量清零
{
flag_alarm=0;
flag_bufang=0;
flag_bufang_en=0;
flag_value=0;
beep = 1;
red = 1; //关闭红灯
green = 1; //关闭绿灯
}
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/******************红外报警处理**********************/
void hongwai_dis()
{
if(safe_key==0)
{
yellow=0; //启动在家安全模式
if((hw_A==0)||(hw_B==0))//如果是孩子开门或者窗,红灯亮,且报警
flag_alarm = 1;
}
else yellow = 1;
if(flag_bufang_en == 1) //准备开始布防
{
green = ~green; //绿灯闪
}
if(flag_bufang == 1) //确认布防
{
green=0; //如果延时布防成功 绿灯长亮
if((hw_A==0)||(hw_B==0))//如果是入侵开门或者窗,红灯亮,且报警
flag_alarm = 1;
}
if(flag_alarm==1) //如果是入侵开门,红灯亮,且报警
{
red = ~red; //红灯报警
voice(); //蜂鸣器报警
}
else
{
red = 1;
beep = 1;
}
}
/******************主程序**********************/
void main()
{
time_init(); //定时器初始化程序
beep = 0; //开机叫一声
delay_1ms(200);
P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
while(1)
{
key();
if(key_can < 10)
{
key_with(); //按键设置函数
}
if(flag_300ms == 1)
{
flag_300ms = 0;
hongwai_dis(); //红外报警函数
}
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uint value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 6 == 0)
{
flag_300ms = 1;
}
if(flag_bufang_en == 1)
{
flag_value ++; // 400 * 50ms = 20000ms = 10秒
if(flag_value >= 200) //10秒
{
flag_bufang = 1;
flag_bufang_en = 0;
flag_value = 0;
}
}
}
|