要求:
1.当检测时,数码管会倒计时60
2.当有人靠近时,会报警
3.当倒计时时,报警器会报警并且led灯会闪烁提示
资料包括:
原理图:
PCB:
程序运行图:
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;
P17=1;
}
}
void Delay10ms() //@11.0592MHz 10毫秒延时
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
void smg()//数码管显示程序
{
static int i=0;
P24=1;
P25=1;
P26=1;
P27=1;
switch(i)
{
case 0:P24=0;P0=table[d