蜂鸣器是一种电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”表示。
蜂鸣器的结构原理
1、压电式蜂鸣器:
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
压电式蜂鸣器
2、电磁式蜂鸣器:
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
电磁式蜂鸣器
有源蜂鸣器和无源蜂鸣器
1、有源蜂鸣器
有源蜂鸣器直接接上额定电源就可连续发声,有源蜂鸣器工作的理想信号是直流电。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从面实出磁场交变,带动钼片振动发音。但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
有源蜂鸣器
2、无源蜂鸣器
无源蜂鸣器和电磁扬声器一样,需要接在音频输出电路中才能发声,原因在于内部没有驱动电路。无源蜂鸣器工作的理想信号是方波信号。如果直接给予直流信号时,无源蜂鸣器是不发声的。这是因为因为磁路恒定,钼片不能振动发音。
无源蜂鸣器
蜂鸣器播放音乐:
一般说来,单片机用蜂鸣器演奏音乐是单音频率,并不包含相应幅度的谐波频率,也就是说不能发出多种音色的声音。因此单片机用蜂鸣器奏乐只需弄清楚两个概念就可以了:也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
音调的确定
音调就是音高,它由频率确定。我们可以查出各个音符所对应的相应的频率,那么就需要用单片机控制蜂鸣器发出相应频率的声音!在编写相关程序时,我们常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音。为了让单片机控制蜂鸣器发出不同频率的声音,我们只需将定时器置予不同的定时值就可实现。
单片机控制蜂鸣器奏乐程序源代码:
/***********************蜂鸣器播放音乐***********************
* 处理器:STC89C52RC
* 开发环境:KEIL
* 名称:蜂鸣器播放音乐
* 功能:程序运行后,播放音乐
****************************************************************/
#include <reg51.h>
#define uchar unsigned char
sbit BEEP = P2^3;
bit flag;
uchar data_point = 0x00;
uchar high;
uchar low;
uchar code music_data[] =
{
0xFC,0x44,0x7F, 0xFC,0x44,0x7F, 0xFC,0x44,0xFF, 0xFA,0x68,0xFF,
// 3 _ 3 _ 3 1
0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF,
// 1_ 3_ 5 5
0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFD,0x82,0xFF, 0xFD,0x82,0xFF,
// 4_ 3_ 2 -
0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFF,0xFF,0xFF,
// 2_ 3_ 4 4
0xFC,0xAC,0x7F, 0xFD,0x23,0x7F, 0xFD,0x34,0xFF, 0xFD,0x34,0xFF,
// 3_ 2_ 3 1
0xFD,0x23,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF,
// 1_ 3 _ 2 . 5
0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFA,0x68,0xFF,
// .7_ 2_ 1 -
0xFC,0x0C,0x7F, 0xFC,0xAC,0x7F, 0xFC,0x44,0xFF, 0xFF,0xFF,0xFF,
0x00//结束
};
void Init(void);
void DelayMs(unsigned int time);
void Init()
{
TMOD = 0x01; //定时器0 处于计时方式,16 位
EA = 1;
ET0 = 1; //定时器0 溢出中断
}
void DelayMs(unsigned int time)
{
unsigned int i;
unsigned int j;
for (j=0;j<time;j++)
{for(i=0;i< 363;i++){;}}
}
void main()
{
uchar time;
Init();
TH0 = high;
TL0 = low;
while (1)
{
if (music_data[data_point] != 0xFF && music_data[data_point] != 0x00) //判断是否是正常音符
{
TR0 = 0;
BEEP = 1;
DelayMs(10); //间歇
TR0 = 1;
high = music_data[data_point]; //取设置频率数值的高8 位
low = music_data[data_point + 1]; //取设置频率数值的低8 位
time = music_data[data_point + 2]; //取发声时间
DelayMs(time);
data_point += 3;
}
else if (music_data[data_point] == 0xFF) //判断是否是休止符
{
time = music_data[data_point + 2];
DelayMs(time);
data_point += 3;
}
else //结束符,停止2 秒后继续
{
TR0 = 0;
BEEP = 1;
DelayMs(2000);
data_point = 0;
}
}
}
/****************************************************************
* 名称:Count1(void) interrupt 1
* 功能:设置计时器0 溢出中断,每中断一次改变P2_3 引脚电平
****************************************************************/
void Count1(void) interrupt 1
{
TH0 = high;
TL0 = low;
if(flag == 0) //改变P2_3 引脚电平
{BEEP=0;flag=1;}
else
{BEEP=1;flag=0;}
}