功能描述:
(红外对管)检测到有人超过一定时间,门铃(蜂鸣器)自动响起,门铃有四种频率的声音(通过PWM实现),门铃可通过人手动关闭(外部中断),也可响过一定时间后自动停止(定时器计时)。
beep.h:
#ifndef __BEEP_H
#define __BEEP_H
#include<reg52.h>
#define BEEPON 0
#define BEEPOFF 1
sbit BEEP =P2^3;
//控制蜂鸣器开还是关
//成功返回0,否则返回-1
char beep_ctl(unsigned char flag);
#endif
beep.c:
#include "beep.h"
char beep_ctl(unsigned char flag)
{
if(BEEPON != flag && BEEPOFF != flag)
return -1;
BEEP=flag;
return 0;
}
main.c:
#include <reg52.h>
#include "beep.h"
sbit left_led1=P3^3;
sbit right_led1=P3^2;
unsigned int flag=0,i=0,n=0,m=0,k=0;
unsigned int F[4]={1,30,60,90};
void stop0() interrupt 0 //外部中断0,利用按钮关闭蜂鸣器
{
flag=0;
beep_ctl(1);
}
void time0() interrupt 1
{
if(flag!=0)
{
n++;
if(n==F[flag-1])
{
beep_ctl(0);
}
else if(n==100)
{
beep_ctl(1);
n=0;
i++;
if(i==50)
{
i=0;
}
}
}
}
void time1() interrupt 3 //为每一种频率分配一样的时长
{
if(flag!=0)
{
m++;
if(m==3000)
{
flag++;
if(flag==5)
{
flag=1;
k++;
if(k==3) //响过三轮就停
{
flag=0;
beep_ctl(1);
}
}
m=0;
}
}
}
void main()
{
unsigned int s=0;
IT0=0;//中断触发方式为低电平触发
EX0=1;//打开外部中断
EA=1;//打开总中断
TMOD=0x22;//定时器0工作模式2,定时器1工作模式2
EA=1;
ET0=1;
TH0=156;
TL0=156;
TR0=1;
ET1=1;
TH1=56;
TL1=56;
TR1=1;
while(1)
{
if(left_led1==0 || right_led1==0)
{
if(s>=3000) //检测到人超过一定时间,才自动响铃
{
flag=1;
s=0;
}
else
s++;
}
}
}
|