1.设计要求
1.利用红外对管检测是否有人进出
2.在触发红外对管后,使用PWM驱动蜂鸣器,使其发出四个不同频率的声音
2.设计概述
本实验所用芯片为STC89C52,所用硬件是由华清远见基于STC89C52开发的智能小车,该小车具有流水灯模块、蜂鸣器模块、独立键盘模块、矩阵键盘模块等。本实验采用蜂鸣器模拟,通过pwm驱动蜂鸣器来实现不同的音调,采用红外对管检测来模拟感应系统,当有人通过时,指示灯亮(此时返回值为0),门铃发出四种不同的声音。
3、原理图以及线路连接
感应模块
J11-P3.3接C52-P3.3 //当检测到有人通过时,端口返回0,指示灯亮
J11-VCC接电源
J11-GND接地
蜂鸣器模块
4.软件设计
感应模块
当检测到有人时,开启总中断,允许蜂鸣器启动
没人时关闭总中断,不允许蜂鸣器启动,同时关闭正在运行的蜂鸣器
蜂鸣器模块
蜂鸣器控制函数,当函数输入参数BEEPON时,启动蜂鸣器,输入BEEPOFF时关闭蜂鸣器
使用定时器精准控时
如果感应装置检测到有人。打开了总中断,程序就会定时进入中断函数,通过time0控制pwm,已达到不同音调的效果,当i<100时,蜂鸣器发出第一种音调,当i>100时,发出第二种音调,当i == 200时,关闭定时器0,启动定时器1,同时i,time0置0,在定时器1中,i<100时,发出第三种音调,当i>100时发出第四种音调,当i==200时关闭定时器1,启动定时器0,同时i,time0置0。
void inter1(void) interrupt 1 //定时器0中断函数
{
time0++;
if(0 <= i&&100 > i) //0-2s内第一个音调(10/200调)
{
if(10 == time0)
{
beep_ctl(BEEPON);
}
if(200 == time0)
{
beep_ctl(BEEPOFF);
time0 = 0;
i++; //以当前音调响20ms后i++ ,i到100后(即响2s后)下一调
}
}
else //2-4s内第二个音调(150/200调)
{
if(150 == time0)
{
beep_ctl(BEEPON);
}
if(200 == time0)
{
beep_ctl(BEEPOFF);
time0 = 0;
i++; //以当前音调响20ms后i++
}
}
if(200 == i) //当i=200时,关闭中断器0,启动中断器1,i清零
{
i = 0;
ET0 = 0;
ET1 = 1;
}
}
void inter2(void) interrupt 3 //定时器1中断函数
{
time0++; //4-6s内第三个音调(190/200调)
if(0 <= i&&100 > i)
{
if(190 == time0)
{
beep_ctl(BEEPON);
}
if(200 == time0)
{
beep_ctl(BEEPOFF);
time0 = 0;
i++; //以当前音调响20ms后i++ ,i到100后(即响2s后)下一调
}
}
else //6-8s内第四个音调(150/200调)
{
if(30 == time0)
{
beep_ctl(BEEPON);
}
if(200 == time0)
{
beep_ctl(BEEPOFF);
time0 = 0;
i++; //以当前音调响20ms后i++
}
}
if(200 == i) //当i=200时,关闭中断器1,启动中断器0,i清零
{
i = 0;
ET0 = 1;
ET1 = 0;
}
}
void test()
{
if(0 == left_led1) //检测有人,开总中断,启动报警器
EA = 1;
if(1 == left_led1) //没检测到人,关总中断,关闭报警器
{
EA = 0;
beep_ctl(BEEPOFF);
}
}