功能要求:
1.当检测时,数码管会倒计时60
2.当有人靠近时,会报警
原理图:
部分程序:
#include <STC15F2K60S2.H>
#define key1 P37
#define key2 P41
#define key3 P42
#define key4 P43
#define IR P10
#define FMQ P54
#define u8 unsigned char
#define u16 unsigned int
u8 table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//数码管段码
u8 disbuf[]={0,0,0,0};//数码管显示缓冲区
u8 min=0;
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //定时器0打开
EA = 1; //定时器总开关
}
void timer0()interrupt 1
{
static u16 min_count=0,fmq_count=0,led_count=0,ir_flag=0;//静态局部变量 分计数、蜂鸣器间隔响计数、人体红外标志位
if(IR==1)ir_flag=1;//当检测到物体经过 标志位置1
if(ir_flag==1) //当标志位为1 执行以下程序
{
if(++fmq_count==500)//每500毫秒响一次
{
fmq_count=0;
FMQ=!FMQ;
}
/*********流水灯**********/
led_count++;
if(led_count==100)P14=!P14;
if(led_count==200)P15=!P15;
if(led_count==300)P16=!P16;
if(led_count==400)P17=!P17;
if(led_count==401)led_count=0;
/*************************/
if(++min_count==100)//时间到结束报警 正常速度为1000 当前为100
{
min_count=0;
if(++min==60)
{
min=0;
ir_flag=0;
}
}
}
disbuf[2]=min/10; //将值传入显示缓冲区
disbuf[3]=min%10;
if(ir_flag==0)
{
P14=1;
P15=1;
P16=1;