目录
[7 硬件工程师笔试面试相关文章链接(部分链接)](#7 硬件工程师笔试面试相关文章链接(部分链接))
摘要:本文介绍了蜂鸣器的基本原理及多种应用案例。主要内容包括:1.蜂鸣器基础知识,包括压电式和电磁式的工作原理、分类对比及选型参数;2.6个典型应用案例:开关控制报警声、播放不同频率声音、演奏音阶、播放音乐、多段音乐选择播放、与LED组成报警装置;3.每个案例均包含电路原理图、控制程序及源代码实现。这些案例展示了如何通过单片机编程控制蜂鸣器实现不同功能,从简单开关控制到复杂音乐播放,为硬件开发提供了实用参考。
0案例视频效果展示
0.1例子1:开关控制蜂鸣器运行
例子19:开关控制蜂鸣器运行
0.2例子2:蜂鸣器播放不同频率声音
例子20:蜂鸣器播放不同频率声音
0.3例子3:蜂鸣器演奏不同音阶
例子21:蜂鸣器演奏不同音阶
0.4例子4:蜂鸣器播放音乐
例子22:蜂鸣器播放音乐
0.5例子5:蜂鸣器播放多段音乐
例子23:蜂鸣器播放多端音乐
0.6例子6:蜂鸣器和LED灯组成的报警装置
例子24:蜂鸣器和LED灯组成的报警装置
1基础知识补充
1.1蜂鸣器基础知识
蜂鸣器是一种能将电信号转换为声音信号的电声器件。
1.1.1工作原理
蜂鸣器按发声原理主要分为两类:
压电式蜂鸣器(Piezoelectric Buzzer )
利用压电陶瓷材料的压电效应,在施加交变电压时产生机械振动而发声。
特点:结构简单、功耗低、频率高(通常2kHz以上)、声音尖锐,适合报警提示。
需要外部驱动电路(通常是方波信号)。
电磁式蜂鸣器(Electromagnetic Buzzer )
通过电磁线圈驱动金属振膜振动发声。
特点:声音柔和、频率较低(1kHz~3kHz)、功耗稍大,适合语音、音乐播放。
分为有源 (内置振荡电路,直流供电即可发声)和无源(需外部方波驱动)两种。
1.1.2分类对比
|--------|----------|-----------|----------|----------|
| 类型 | 驱动方式 | 电路复杂度 | 声音特点 | 典型应用 |
| 有源电磁式 | 直流供电 | 低 | 单调"嘀"声 | 家电提示音 |
| 无源电磁式 | 外部方波 | 中 | 可调音调 | 音乐播放 |
| 压电式 | 外部方波 | 中 | 高频尖锐 | 报警器、仪表 |
1.1.3选型关键参数
工作电压:常见3V、5V、12V,需与系统匹配。
谐振频率:压电式通常2kHz~6kHz,电磁式1kHz~3kHz。
声压级(dB ):距离10cm处测得,常见80~110dB。
尺寸:直径5mm~30mm,需考虑安装空间。
电流:电磁式静态电流10mA~50mA,压电式仅振动时耗电。
1.1.4常见问题与解决
声音太小:检查电压是否达标,或增加三极管放大电路。
杂音:驱动频率偏离谐振点,需调整PWM频率。
误触发:GPIO上电默认高电平导致,可加下拉电阻或反相器。
2例子1:开关控制蜂鸣器运行
实现功能:用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,模拟很逼真的报警效果
本质 :通过开关的通断改变电路的导通状态,从而控制电能驱动蜂鸣器振动发声。
2.1电路原理图

2.1.1电路组成及接线
|------------|------------------------------------------------------------------|
| 名称 | 接线 |
| AT89C51单片机 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器 P1.7--->切换开关 |
| 复位电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器 P1.7--->切换开关 |
| 晶振电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器 P1.7--->切换开关 |
| 蜂鸣器 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器 P1.7--->切换开关 |
| 切换开关 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器 P1.7--->切换开关 |
2.2控制程序
2.2.1控制程序步骤
库文件和引脚定义
发生函数
主程序
2.2.2源代码
objectivec
//功能:用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,模拟很逼真的报警效果
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit SPK=P1^0;
sbit K1=P1^7;
//发声函数
void Alarm(uchar t)
{
uchar i,j;
for(i=0;i<200;i++)
{
SPK=~SPK;
for(j=0;j<t;j++); //由参数t行成不同的频率
}
}
void main()
{
SPK=0;
while(1)
{
if(K1==1)
{
Alarm(90);
Alarm(120);
}
}
}
3例子2:蜂鸣器播放不同频率声音
实现功能:按下不同的按键会蜂鸣器发出不同频率的声音。
本质:按键切换不同频率的本质,是改变电路输出给蜂鸣器的电信号频率,使其振膜以对应频率振动发声。
3.1电路原理图

3.1.1电路组成及接线
|------------|-------------------------------------------------------------------------|
| 名称 | 接线 |
| AT89C51单片机 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P3.7--->蜂鸣器 P1.4-P1.7--->频率切换按钮 |
| 复位电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P3.7--->蜂鸣器 P1.4-P1.7--->频率切换按钮 |
| 晶振电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P3.7--->蜂鸣器 P1.4-P1.7--->频率切换按钮 |
| 蜂鸣器 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P3.7--->蜂鸣器 P1.4-P1.7--->频率切换按钮 |
| 频率切换按钮 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P3.7--->蜂鸣器 P1.4-P1.7--->频率切换按钮 |
3.2控制程序
3.2.1控制程序步骤
库文件和引脚定义
延时函数
按周期t发音函数
主程序
3.2.2源代码
objectivec
//功能:按下不同的按键会蜂鸣器发出不同频率的声音。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P3^7;
sbit K1=P1^4;
sbit K2=P1^5;
sbit K3=P1^6;
sbit K4=P1^7;
//延时
void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}
//按周期t发音
void Play(uchar t)
{
uchar i;
for(i=0;i<100;i++)
{
BEEP=~BEEP;
DelayMS(t);
}
BEEP=0;
}
void main()
{
P1=0xff;
BEEP=0;
while(1)
{
if(K1==0) Play(1);
if(K2==0) Play(2);
if(K3==0) Play(3);
if(K4==0) Play(4);
}
}
4例子3:蜂鸣器演奏不同音阶
实现功能:使用定时器演奏一段音阶,播放由K1控制。
本质:利用定时器精确控制蜂鸣器电信号频率与时长,按音阶序列依次驱动其振动发声。
4.1电路原理图

4.1.1电路组成及接线
|------------|----------------------------------------------------------------------|
| 名称 | 接线 |
| AT89C51单片机 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 复位电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 晶振电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 蜂鸣器 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 控制开关 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 示波器 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
4.2控制程序
4.2.1控制程序步骤
库文件和引脚定义
定时器中断函数
延时函数
主程序
4.2.2源代码

如上图所示,不同音阶的模拟信号示波器图
objectivec
//音阶演奏:使用定时器演奏一段音阶,播放由K1控制。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P1^7;
sbit SPK=P1^0;
uint i=0; //音符索引
//14个音符放在方式2下的定时寄存器(TH0,TL0)
uchar code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};
uchar code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};
//定时器0中断函数
void T0_INT() interrupt 1
{
TL0=LO_LIST[i];
TH0=HI_LIST[i];
SPK=~SPK;
}
//延时
void DelayMS(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
//主程序
void main()
{
TMOD=0x00; //T0方式0
IE=0x82;
SPK=0;
while(1)
{
while(K1==1); //未按键等待
while(K1==0); //等待释放
for(i=1;i<15;i++)
{
TR0=1; //播放一个音符
DelayMS(500); //播放延时
TR0=0;
DelayMS(50);
}
}
}
5例子4:蜂鸣器播放音乐
实现功能:播放生日快乐歌,所有频率完全用延时实现,通过开关实现播放启停
本质:以延时循环产生各音频率,开关仅控制该循环是否驱动蜂鸣器发声。
5.1电路原理图

5.1.1电路组成及接线
|------------|----------------------------------------------------------------------|
| 名称 | 接线 |
| AT89C51单片机 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 复位电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 晶振电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 蜂鸣器 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
| 控制开关 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P1.0--->蜂鸣器/示波器 P1.7--->控制开关 |
5.2控制程序
5.2.1控制程序步骤
库文件和引脚定义
音符频率表
节拍表
延时函数
播放函数
主程序
5.2.2源代码
objectivec
//功能:播放生日快乐歌,所有频率完全用延时实现,通过开关实现播放启停
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P1^0;
sbit K1=P1^7;
//生日快乐歌的音符频率表,不同频率由不同的延时来决定
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
//生日快乐歌节拍表,节拍决定每个音符的演奏长短
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
//延时
void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}
//播放函数
void PlayMusic()
{
uint i=0,j,k;
while((SONG_LONG[i]!=0||SONG_TONE[i]!=0)&&(K1==0))
{ //播放各个音符,SONG_LONG为拍子长度
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP=~BEEP;
//SONG_TONE延时表决定了每个音符的频率
for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10);
i++;
}
}
void main()
{
BEEP=0;
while(1)
{
PlayMusic(); //播放生日快乐
}
}
6例子5:蜂鸣器播放多段音乐
实现功能:内置3段音乐,K1可启动停止音乐播放,K2用于选择音乐段。
本质:K2选曲存入数组,K1启停控制定时器按逐音延时输出对应频率驱动蜂鸣器。
6.1电路原理图

6.1.1电路组成及接线
|------------|------------------------------------------------------------------------------------------------|
| 名称 | 接线 |
| AT89C51单片机 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.6--->数码管 P3.7--->蜂鸣器/示波器 P3.2/P1.0--->按键K3/K4 |
| 复位电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.6--->数码管 P3.7--->蜂鸣器/示波器 P3.2/P1.0--->按键K3/K4 |
| 晶振电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.6--->数码管 P3.7--->蜂鸣器/示波器 P3.2/P1.0--->按键K3/K4 |
| 数码管 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.6--->数码管 P3.7--->蜂鸣器/示波器 P3.2/P1.0--->按键K3/K4 |
| 蜂鸣器 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.6--->数码管 P3.7--->蜂鸣器/示波器 P3.2/P1.0--->按键K3/K4 |
| 按键开关 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.6--->数码管 P3.7--->蜂鸣器/示波器 P3.2/P1.0--->按键K3/K4 |
| 示波器 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.6--->数码管 P3.7--->蜂鸣器/示波器 P3.2/P1.0--->按键K3/K4 |
6.2控制程序
6.2.1控制程序步骤
库文件和引脚定义
数码管段码表
标准音符频率对应的延时表
三段音乐的音符
三段音乐的节拍
中断INT0
延时函数
主程序
6.2.2源代码
objectivec
//功能:内置3段音乐,K1可启动停止音乐播放,K2用于选择音乐段。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P1^0; //播放和停止键
sbit SPK=P3^7; //蜂鸣器
uchar Song_Index=0,Tone_Index=0; //当前音乐段索引,音符索引
//数码管段码表
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//标准音符频率对应的延时表
uchar code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};
uchar code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};
//三段音乐的音符
uchar code Song[][50]=
{
{1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},
{3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1},
{3,2,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1}
};
//三段音乐的节拍
uchar code Len[][50]=
{
{1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1},
{1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1},
{1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1}
};
//外部中断0
void EX0_INT() interrupt 0
{
TR0=0; //播放结束或者播放中途切换歌曲时停止播放
Song_Index=(Song_Index+1)%3; //跳到下一首的开头
Tone_Index=0;
P2=DSY_CODE[Song_Index]; //数码管显示当前音乐段号
}
//定时器0中断函数
void T0_INT() interrupt 1
{
TL0=LO_LIST[Song[Song_Index][Tone_Index]];
TH0=HI_LIST[Song[Song_Index][Tone_Index]];
SPK=~SPK;
}
//延时
void DelayMS(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
//主程序
void main()
{
P2=0xc0;
SPK=0;
TMOD=0x00; //T0方式0
IE=0x83;
IT0=1;
IP=0x02;
while(1)
{
while(K1==1); //未按键等待
while(K1==0); //等待释放
TR0=1; //开始播放
Tone_Index=0; //从第0个音符开始
//播放过程中按下K1可提前停止播放(K1=0)。
//若切换音乐段会触发外部中断,导致TR0=0,播放也会停止
while(Song[Song_Index][Tone_Index]!=-1&&K1==1&&TR0==1)
{
DelayMS(300*Len[Song_Index][Tone_Index]); //播放延时(节拍)
Tone_Index++; //当前音乐段的下一音符索引
}
TR0=0; //停止播放
while(K1==0); //若提前停止播放,按键未释放时等待
}
}
7例子6:蜂鸣器和LED灯组成的报警装置
实现功能:控制报警灯旋转显示,并发出仿真警报声。
本质:单片机定时器同步产生旋转灯PWM扫描信号与警报声频率信号,驱动灯环旋转并推动蜂鸣器发声。
7.1电路原理图

7.1.1电路组成及接线
|------------|------------------------------------------------------------------------------------|
| 名称 | 接线 |
| AT89C51单片机 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.7--->旋转灯 P3.7--->蜂鸣器 P3.2--->按键K1 |
| 复位电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.7--->旋转灯 P3.7--->蜂鸣器 P3.2--->按键K1 |
| 晶振电路 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.7--->旋转灯 P3.7--->蜂鸣器 P3.2--->按键K1 |
| 旋转灯 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.7--->旋转灯 P3.7--->蜂鸣器 P3.2--->按键K1 |
| 蜂鸣器 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.7--->旋转灯 P3.7--->蜂鸣器 P3.2--->按键K1 |
| 按键 | XTAL1/XTAL2--->连接晶振电路 RST--->连接复位电路 P2.0-P2.7--->旋转灯 P3.7--->蜂鸣器 P3.2--->按键K1 |
7.2控制程序
7.2.1控制程序步骤
库文件和引脚定义
延时函数
INTO中断函数
定时器0中断函数
定时器1中断函数
主程序
7.2.2源代码
objectivec
//功能:定时器控制报警灯旋转显示,并发出仿真警报声。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SPK=P3^7;
uchar FRQ=0x00;
//延时
void DelayMS(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
//INT0中断函数
void EX0_INT() interrupt 0
{
TR0=~TR0; //开启或停止两定时器,分别控制报警器的声音和LED旋转
TR1=~TR1;
if(P2==0x00)
P2=0xe0; //开3个旋转灯
else
P2=0x00; //关闭所有LED
}
//定时器0中断
void T0_INT() interrupt 1
{
TH0=0xfe;
TL0=FRQ;
SPK=~SPK;
}
//定时器1中断
void T1_INT() interrupt 3
{
TH1=-45000/256;
TL1=-45000%256;
P2=_crol_(P2,1);
}
//主程序
void main()
{
P2=0x00;
SPK=0x00;
TMOD=0x11; //T0、T1方式1
TH0=0x00;
TL0=0xff;
IT0=1;
IE=0x8b; //开启0,1,3号中断
IP=0x01; //INT0设为最高优先
TR0=0;
TR1=0; //定时器启停由INT0控制,初始关闭
while(1)
{
FRQ++;
DelayMS(1);
}
}
7 硬件工程师笔试面试相关文章链接(部分链接)
更多文章可前往主页观看
1、硬件工程师笔面试真题汇总(2025版本)_硬件工程师面试题-CSDN博客https://blog.csdn.net/XU157303764/article/details/140742900?spm=1011.2415.3001.5331硬件工程师笔试面试高频考点汇总------(2025版)_电容或者电感对锁存器的影响-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1488349782、硬件工程师笔试面试汇总(2025版本)_硬件工程师面试题-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1419048583、硬件工程师笔试面试学习汇总------器件篇目录(2025版本)_【【硬件工程师炼成之路】器件篇(更新中。。。)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/142316204
硬件工程师笔记------电子器件汇总大全-CSDN博客https://blog.csdn.net/XU157303764/article/details/147342935?spm=1011.2415.3001.5331Multisim14使用教程详尽版--(2025最新版)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/147197406?spm=1011.2415.3001.5331