蜂鸣器介绍

  蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

  • 压电式蜂鸣器: 主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器 由晶体管或集成电路构成,当接通电源后(1.5-15V直流工作电压),多谐振荡器起振,输出1.5-5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
  • 电磁式蜂鸣器:由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

压电式蜂鸣器发声,需提供一定频率的脉冲信号;电磁式蜂鸣器发声只需提供电源即可

  当前开发板上使用的蜂鸣器是无源蜂鸣器,属于压电式蜂鸣器类型。**这里说的有源和无源,并不是指电源的意思,而是指蜂鸣器内部是否含有振荡电路,有源蜂鸣器内部自带振荡电路,只需提供电源即可发声,而无源蜂鸣器则需提供一定频率的脉冲信号才能发声,频率大小通常在 1.5-5KHz 之间。**蜂鸣器实物图如下图所示

  • 无源蜂鸣器: 如果改变频率就可以调节蜂鸣器音调,产生各种不同音色、音调的声音。如果改变输出电平的高低电平占空比,则可以改变蜂鸣器的声音大小
  • 有源蜂鸣器: 通常内部已经固定了频率,对于调节频率或占空比可能改变不了蜂鸣器的音调和音量,当然也有的有源蜂鸣器可以实现和无源蜂鸣器一样的效果

硬件设计

  我们不能直接使用51单片机IO口驱动蜂鸣器,因为51单片机IO口的驱动能力较弱(即使外接上拉电阻),而蜂鸣器驱动需要约30mA,所以非常困难,即使可以驱动,那对于整个芯片的其它IO剩下驱动能力就更加弱甚至无法工作。所以我们不会直接使用 IO 口驱动蜂鸣器,而是通过三极管把电流放大后再驱动所以我们也经常说到51单片机是用来做控制的,而不是驱动。蜂鸣器,这样51单片机的 IO 口只需要提供不到1mA 的电流就可控制蜂鸣器。

单片机是用来控制的,而不是驱动

蜂鸣器模块电路

  从图中可以看出,蜂鸣器模块独立,J7端子可接任意IO控制,因此可直接连接到51单片机的P2.5管脚上。图中使用三极管进行电流放大,从而驱动蜂鸣器,当P25输出高电平,三极管截止,蜂鸣器不得电;当P25输出低电平,三极管导通,蜂鸣器得电

  开发板上使用的是无源蜂鸣器,它需要一定频率的脉冲(高低电平)才会发声,因此需要让P25脚以一定频率不断输出高低电平信号才能控制蜂鸣器发出声音。

软件设计

  本章所要实现的功能是:让蜂鸣器发出声音,一段时间后再关闭,即让P2.5管脚输出一定频率的脉冲信号(高低电平)控制无源蜂鸣器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "reg52.h"

// 将P2.5管脚定义为BEEP
sbit BEEP = P2^5;

// 对系统默认数据类型进行重命名
typedef unsigned int u16;
typedef unsigned char u8;

void delay_10us(u16 ten_us)
{
while(ten_us--);
}

void main()
{
u16 i = 2000;
while(1)
{
while(i--) // 循环2000次
{
BEEP = !BEEP; // 产生一定频率的脉冲信号
delay_10us(100);
}
i = 0;
BEEP = 0; // 关闭蜂鸣器
}
}

若要改变音调可以修改延时时间,但要注意频率不能太大或大小;若要改变音量,可以修改BEEP输出高电平时间