历史上的今天
今天是:2025年07月29日(星期二)
2020年07月29日 | 单片机红外热释报警器
2020-07-29 来源:51hei
#include
#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 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; //蜂鸣器报警
}
}
/******************主程序**********************/
void main()
{
time_init(); //定时器初始化程序
beep = 0; //开机叫一声
delay_1ms(200);
beep = 1; //蜂鸣器关
delay_1ms(200);
beep = 0; //再叫一声
delay_1ms(200);
P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
while(1)
{
key();
yellow = ~hw; //红外热释电指示灯 有输出就亮黄灯
if(key_can < 10)
{
key_with(); //按键设置函数
}
if(flag_500ms == 1)
{
flag_500ms = 0;
hongwai_dis(); //红外报警函数
}
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uint value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 10 == 0)
{
flag_500ms = 1;
}
if(flag_bufang_en == 1)
{
flag_value ++; // 400 * 50ms = 20000ms = 20秒
if(flag_value >= 1200) //20秒
{
flag_bufang = 1;
flag_bufang_en = 0;
flag_value = 0;
}
}
}
史海拾趣
|
2440中UART0寄存器对应的物理地址为 0x50000000,对应的虚拟地址在g_oalAddressTable表中为0x91000000 g_oalAddressTable DCD 0x91000000, 0x50000000, 1 &nb ...… 查看全部问答> |
|
我的机子装不了eVC4,安装到配置wince platform manager 4.0 时,就死机了 重启后就出现未识别的硬件和硬件安装向导, 提示什么虚拟PC的 只要安装也就卡机了. 这是怎么回事? 我电脑是SP3的,台式机一样的系统都安装得好好的… 查看全部问答> |
|
VB中,sItem = Split(s, \",\") CString s; CString sItem[13]; byte pItem; byte p1, p2; s += \",\"; p1 = 0; pItem = 0; for (p2 = 0; p2 < s.GetLength(); p2++) { if (s.GetAt(p2) == \',\') &nb ...… 查看全部问答> |
|
经常会有朋友问到200万高清网络机是多少分辨率,或者1600*1200是多少万像素?今天刚好从网上找到一篇这样的文章,希望对大家有帮助。 1.什么是像素?简单的说,我们通常所说的像素,就是CCD上光电感应元件的数量,一个感光元件经过感光 ...… 查看全部问答> |
|
这组图片是三个星期以前拍的,回来之后就马不停蹄的赶项目进度,推迟到现在才发上来。本人拍照水平很菜,加上展品放在玻璃柜里面,拍出来相片实在一般般,大家将就一下。 对这次展会的总体印象是规格高,规模大,在一定程度上反映出了中国物联网 ...… 查看全部问答> |




