实验思路:
蜂鸣器是一体化结构的电子讯响器,采用直流电源供电。根据驱动方式分为“有源蜂鸣器”和“无源蜂鸣器”。“有源蜂鸣器”内部自带振荡源,只需要接通电源即可发声,而“无源蜂鸣器”内部没有振荡源,需要一定频率的脉冲信号,才能驱动它发出声音。本次实验使用的为“无源蜂鸣器”,因为些需要产生一定的脉冲频率,方可使其发声。实验思路如下:
1、重定义P0.0管脚为BEEP,重定义系统数据类型
#include "reg52.h" sbit BEEP=P0^0; //对P0.0管脚重定义 typedef unsigned int U16; //对系统数据类型重定义
2、定义一个延时函数delay_10us,用于产生脉冲信号
void delay_10us(U16 ten_us)
{
while(ten_us--);
}3、主程序大循环开始前,定义一个无符号整型变量“i”。用于循环一定时间后停止。
4、循环中,不断取反蜂鸣器,即可发出一定频率的脉冲信号。
完整代码:
/*****************************程序信息*********************************
* 实验名称:控制蜂鸣器发声后停止
* 文件名称:main.c
* 版 本:V1.00
* 日 期:2021-12-09
* 编 著:gefon
* 说 明:使用普中A7开发版,控制蜂鸣器发声一段时间后停止发声
*******************************声明区*********************************/
#include "reg52.h"
sbit BEEP=P0^0; //对P0.0管脚重定义
typedef unsigned int U16; //对系统数据类型重定义
/*******************************子程序*********************************
* 函 数 名 :delay_10us
* 函数功能 :延时函数,当传入变量ten_us=1时,约延时10us
* 输 入 :ten_us
* 输 出 :无
***********************************************************************/
void delay_10us(U16 ten_us)
{
while(ten_us--);
}
/*******************************主程序*********************************
* 函 数 名 :main
* 函数功能 :主函数
* 输 入 :无
* 输 出 :无
***********************************************************************/
void main()
{
U16 i=4000;
while(1)
{
while(i--)
{
BEEP=!BEEP; //产生一定频率的脉冲信号
delay_10us(10); //延时约1ms(11.0592MHz)
/*下方代码为另一种实现方案,调整高低电平的延时时间,可调整蜂鸣器音量。
调整上方代码的延时时间为调整蜂鸣器音调(即改变发声周期)*/
// BEEP=0;
// delay_10us(30);
// BEEP=1;
// delay_10us(30);
}
i=0; //清零
BEEP=0; //关闭蜂鸣器
}
}实验分析:
在给BEEP取反中,当上一循环BEEP值为“0”,当前循环就会在上一循环BEEP值“0”基础上进行取反,下一循环会又在当前循环的BEEP值基础上进行取反。这样不断取反,且每一次取反后都延迟一定的时间,就可以形成一定频率的脉冲信号,使蜂鸣器发出声音。