1 电路图
GNDVCCOUTP12K1POWER1VCC人体感应模块VCC3131K3K2313531S1424242642531R364210kVCC1234567891011121314151617181920U1P1.0VCCP1.1(AD0)P0.0P1.2(AD1)P0.1P1.3(AD2)P0.2P1.4(AD3)P0.3P1.5(AD4)P0.4P1.6(AD5)P0.5P1.7(AD6)P0.6RST(AD7)P0.7P3.0(RXD)EA/VPPP3.1(TXD)ALE/PROGP3.2(INT0)PSENP3.3(INT1)(A15)P2.7P3.4(T0)(A14)P2.6P3.5(T1)(A13)P2.5P3.6(WR)(A12)P2.4P3.7(RD)(A11)P2.3XTAL2(A10)P2.2XTAL1(A9)P2.1GND(A8)P2.089C51/C52403938373635343332313029282726252423222124KSR42.2kR5220R62.2kD1LEDr+C110uFD2LEDgRESET13D3LEDyR210KC230R12.2K12MHzVCCQ19012C330 2 实物图
3 源程序
5
#include
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#define key_io P1 uchar key_can;
// 红外热释电平时为0 有输出为1
sbit beep = P2^3; //蜂鸣器定义
sbit red = P2^2; //红色发光二极管定义 sbit green = P2^1; //绿色发光二极管定义 sbit yellow = P2^0; //黄色发光二极管定义 sbit hw = P1^3; //红外热释传感器定义 bit flag_300ms = 0;
/****************独立按键处理函数************************/ void key() { static uchar key_new = 0,key_old = 0,key_value = 0; if(key_new == 0) //按键松开 { if((key_io & 0x07) == 0x07) key_value ++; else key_value = 0; if(key_value >= 5) //按键松开松手检测 { key_value = 0; key_new = 1; //按键松开后进入等待按键状态 } } else { if((key_io & 0x07) != 0x07) //按键按下 key_value ++; else key_value =0; if(key_value >= 5) //按键按下消抖 { key_value = 0; key_new = 0; //按键松开后进入等待松开按键状态 } }
6
key_can = 20; if((key_new == 0) && (key_old == 1)) { switch(key_io & 0x07) { case 0x06: key_can = 1; break; //得到按键值 case 0x05: key_can = 2; break; //得到按键值 case 0x03: key_can = 3; break; //得到按键值 } } key_old = key_new; }
/*************定时器0初始化程序***************/ void time_init() { EA = 1; //开总中断 TMOD = 0X01; //定时器0工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 }
uchar flag_alarm ; //报警标志位 uchar flag_bufang ; //布防标志位 uchar flag_bufang_en ; //布防标志位使能 uint flag_value; //用做定时器的变量
/******************红外报警处理**********************/ void hongwai_dis() { if(flag_alarm == 1) //报警 { red = ~red; //红灯报警 beep = ~beep; //蜂鸣器报警 } if(flag_bufang_en == 1) //准备开始布防 { green = ~green; //绿灯闪 } if(flag_bufang == 1) //确认布防 { green = 0; //如果延时布防成功 绿灯长亮 if(hw == 1) //红外有输出
7
{ flag_alarm = 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; P2 = 0xff; } }
/******************主程序**********************/ void main() { time_init(); while(1) { key(); yellow = ~hw; //红外热释电指示灯 有输出就亮黄灯 if(key_can < 10) { key_with(); //按键设置函数 }
8
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 ++; if(flag_value >= 600) //30秒 { flag_bufang = 1; flag_bufang_en = 0; flag_value = 0; } } } 9
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库单片机设计报告 红外热释电家庭防盗报警器(2)在线全文阅读。
相关推荐: