蜂鸣器简单介绍:
1.蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电。
2.蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
3.压电式蜂鸣器发声,需要提供一定频率的脉冲信号;电磁式蜂鸣器发声,只需提供电源即可。
我们开发板上使用的蜂鸣器是无源蜂鸣器,属于压电式蜂鸣器类型。
蜂鸣器实物图,如下:
对于无源蜂鸣器,如果改变频率就可以调节蜂鸣器音调,产生各种不同音色、音调的声音。如果改变输出电平的高低电平占空比,则可以改变蜂鸣器的声音大小。
要实现蜂鸣器的控制,我们能否直接使用单片机的IO口驱动呢?
不能。这是因为51单片机IO口的驱动能力较弱(即使外接上拉电阻),而蜂鸣器驱动需要约30mA,所以非常困难,即使可以驱动,那对于整个芯片的其它IO剩下驱动能力就更加弱甚至无法工作。所以我们不会直接使用IO口驱动蜂鸣器,而是通过三极管把电流放大后再驱动蜂鸣器。
开发板上的蜂鸣器模块电路如下:
从图中可以看出,蜂鸣器控制管脚直接连接到51单片机的P2.5管脚上。图中并没有使用三极管进行电流放大,而是使用ULN2003芯片来驱动,具体大家可以去搜搜。我们只需要知道P25输出高电平,BEEP则输出低电平;当P25输出低电平,BEEP则输出高电平。
开发板上使用的是无源蜂鸣器,它需要一定频率的脉冲才会发声,因此需要让P25脚以一定频率不断输出高低电平信号才能控制蜂鸣器发出声音。
代码如下:
#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;
sbit BEEP=P2^5; //将P2.5管脚定义为BEEP
//延时函数
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; //关闭蜂鸣器
}
}
若修改变量i的值可以改变蜂鸣器发声时间。
若要改变音调可以修改延时时间,但要注意频率不能太大或者太小,具体大家可以试着调试。若要改变音量,可以修改BEEP输出高电平时间,如下:
BEEP=1;
delay_10us(190);
BEEP=0;
delay_10us(10);