51单片机开发板实验:蜂鸣器实验
- 物联网-嵌入式工程师
- 19小时前
- 13热度
- 0评论

一、实验目标
本实验通过简单的编程实现蜂鸣器发声,通过调整延时参数,可以进一步探索不同频率下的发声效果,加深对微控制器编程的理解。
二、蜂鸣器介绍
蜂鸣器是一种采用直流电压供电的一体化电子讯响器,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机及定时器等电子产品中,作为发声器件。它主要分为压电式和电磁式两种类型。
压电式蜂鸣器(也称为无源蜂鸣器)由多谐振荡器(由晶体管或集成电路构成)、压电蜂鸣片、阻抗匹配器、共鸣箱及外壳等部件组成。当接通1.5~15V的直流电源后,多谐振荡器开始工作,输出1.5~5kHz的音频信号,经阻抗匹配器推动压电蜂鸣片发声。
电磁式蜂鸣器(也称为有源蜂鸣器)则包含振荡器、电磁线圈、磁铁、振动膜片及外壳等部分。接通电源后,振荡器产生的音频信号电流流经电磁线圈,产生磁场,进而使振动膜片在电磁线圈与磁铁的相互作用下周期性地振动,从而发出声音。
两者发声原理的主要区别在于:压电式蜂鸣器需要一定频率的脉冲信号来驱动发声,而电磁式蜂鸣器则仅需提供电源即可工作发声。
本实验开发板上的蜂鸣器是无源蜂鸣器,属于压电式蜂鸣器,让无源蜂鸣器发出声音,需要提供一定频率的脉冲信号。蜂鸣器实物如下图所示:

三、硬件设计
使用51单片机的IO口不能直接驱动蜂鸣器工作,因为 51 单片机 IO 口的驱动能力较弱(即使外接上拉电阻),输出电流不超过1mA,而蜂鸣器的工作电流大约需要30mA。需要在单片机IO口和蜂鸣器之间接入一个ULN2003D驱动芯片,ULN2003D 是一种常用的达林顿晶体管阵列(Darlington Transistor Array),被广泛应用于电子控制系统中,特别是那些需要驱动高电流负载(如继电器、LED阵列、蜂鸣器、步进电机等)的场景。ULN2003D 提供了七个独立的达林顿对,每个达林顿对都能承受高达500mA的电流,并且内部集成了反向二极管,用于保护电路免受感应负载产生的反向电压的影响。
达林顿晶体管其实是由两个或更多的晶体管“手拉手”连接在一起组成的。它们的工作方式就像是团队合作,一个晶体管帮助另一个晶体管工作,使得整个组合能够承受更大的电流和压力。达林顿晶体管对示意图如下:

当输入信号(通常是电压信号)施加到第一个晶体管的基极时,该晶体管会将其放大,并输出到其集电极。这个放大的信号随后作为第二个晶体管的输入信号,进一步被放大。在达林顿晶体管对中,第一个晶体管的集电极直接连接到第二个晶体管的基极,形成信号的级联放大。由于每个晶体管都具有一定的放大倍数,因此整个达林顿晶体管对的放大倍数就是各个晶体管放大倍数的乘积。这种级联放大的方式使得达林顿晶体管对能够实现非常高的电流增益。
实验开发板蜂鸣器模块电路如下图所示:

蜂鸣器的一个管脚通过100R的电阻接到电源,另外一个管脚BEEP接到ULN2003D驱动芯片的OUT5管脚,OUT5管脚对应芯片的IN5管脚,因此51单片机通过P1.5来控制蜂鸣器。蜂鸣器的另一个管脚接地,图中没有列出。
四、软件设计
本实验开发板使用的是无源蜂鸣器,要让蜂鸣器发出声音,需要P1.5管脚输出一定频率的脉冲信号。脉冲信号是高低电平周期性变化的电信号,如下图所示:

让P1.5间隔一段时间输出高低电平,就会输出脉冲信号,调整间隔时间长短,可以改变脉冲信号的频率。无源蜂鸣器发声的脉冲频率通常在通常在 1.5-5KHz 之间。
包含的头文件
#include "reg52.h": 包含8051微控制器的特殊功能寄存器定义。
数据类型定义
typedef unsigned int u16;:定义无符号16位整型,用于延时函数中的计数器。
typedef unsigned char u8;:定义无符号8位整型,用于表示单个字节的数据,如IO端口的状态。
变量与位定义
sbit beep=P2^5;:定义P2端口的第5位为蜂鸣器控制引脚。
sbit led=P2^1;:定义P2端口的第1位为LED控制引脚。
延时函数
void delay(u16 i):一个简单的延时函数,通过空循环实现。注意,此延时函数的实际延时时间取决于微控制器的时钟频率。
主函数
void main():程序的主入口点。
使用while(1)循环实现无限循环,确保程序持续运行。在循环体内,通过beep=~beep;语句交替改变P2.5输出高低电平。调用delay(200);函数实现延时,控制蜂鸣器发声的频率。通过调整延时参数,可以改变脉冲频率,让蜂鸣器发出不同的声音。
五、编写程序
启动Keil软件后,创建一个新项目,选择单片机型号STC89C52RC。在项目中添加C语言源文件main.c。
在main.c文件内输入下面的源代码:
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit beep=P2^5;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep;
delay(200); //延时大约1ms 通过修改此延时时间达到不同的发声效果
}
}
六、实验现象
使用 USB 线将开发板和电脑连接成功后,把编写好的程序编译后将编译产生的.hex 文件烧入到芯片内,开发板会自动运行下载的程序,蜂鸣器发出声音。