标题:
基于51单片机的热释电红外检测报警器程序
[打印本页]
作者:
qween
时间:
2020-12-6 12:20
标题:
基于51单片机的热释电红外检测报警器程序
两种模式:一种紧急报警模式,另一种布防报警模式。
三个LED指示灯:红色为报警指示灯(检测到有人报警时闪亮)、绿色为布防指示灯(等待布防时1s一闪、进入布防状态时常亮)、黄色为传感器信号指示灯(有信号就亮,否则灭)。
按下布防键,系统计时20秒进入布防状态(此时绿色的led灯闪烁),20秒后系统进入布防状态(此时绿色的led亮长亮),此时当有人靠近时,黄色信号灯亮,红外热释电传感器将信号输送给单片机,单片机接收到信号蜂鸣器响,红色led灯亮,实现声光报警。
当遇到特殊情况时,按下按键1(紧急报警键),系统马上报警。
红外热释电传感器感应人体,当感应到人输出高电平,没感应到人输出低电平。
四个按键:按键1紧急报警按键、按键2布防按键、按键3撤防按键、单独的是复位按键
单片机源程序如下:
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
// 红外热释电传感器 平时为0 有输出为1
sbit beep = P2^5; //蜂鸣器定义
sbit red = P0^1; //红色发光二极管定义
sbit green = P0^4; //绿色发光二极管定义
sbit yellow = P0^7; //黄色发光二极管定义
sbit hw = P0^0; //红外热释传感器定义
bit flag_500ms = 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++);
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P1 |= 0xff;
if((P1 & 0xff) != 0xff) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0xff) != 0xff) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P1 & 0xff)
{
case 0xfb: key_can = 1; break; //得到按键值
case 0xf7: key_can = 2; break; //得到按键值
case 0x7f: key_can = 3; break; //得到按键值
}
}
}
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; //关闭绿灯
yellow = 1; //关闭黄灯
}
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/******************红外报警处理**********************/
void hongwai_dis()
{
if(flag_bufang_en == 1) //准备开始布防
{
green = ~green; //绿灯闪
}
if(flag_bufang == 1) //确认布防
{
green = 0; //如果延时布防成功 绿灯长亮
if(hw == 1) //红外有输出
{
flag_alarm = 1;
}
}
if(flag_alarm == 1) //报警
{
red = ~red; //红灯报警
beep = ~beep; //蜂鸣器报警
}
}
复制代码
作者:
1905260157
时间:
2022-6-19 09:56
那四个按键接哪,程序里没有分配引脚
作者:
heicad
时间:
2022-6-19 13:13
1905260157 发表于 2022-6-19 09:56
那四个按键接哪,程序里没有分配引脚
看这3行就明白了
case 0xfb: key_can = 1; break; //得到按键值
case 0xf7: key_can = 2; break; //得到按键值
case 0x7f: key_can = 3; break; //得到按键值
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1