当前位置: 首页 > news >正文

【Proteus仿真】蜂鸣器控制系列仿真——蜂鸣器控制/蜂鸣器播放音乐/蜂鸣器播放多种音乐/蜂鸣器和LED组成报警装置

目录

0案例视频效果展示

0.1例子1:开关控制蜂鸣器运行

0.2例子2:蜂鸣器播放不同频率声音

0.3例子3:蜂鸣器演奏不同音阶

0.4例子4:蜂鸣器播放音乐

0.5例子5:蜂鸣器播放多段音乐

0.6例子6:蜂鸣器和LED灯组成的报警装置

1基础知识补充

1.1蜂鸣器基础知识

1.1.1工作原理

1.1.2分类对比

1.1.3选型关键参数

1.1.4常见问题与解决

2例子1:开关控制蜂鸣器运行

2.1电路原理图

2.1.1电路组成及接线

2.2控制程序

2.2.1控制程序步骤

2.2.2源代码

3例子2:蜂鸣器播放不同频率声音

3.1电路原理图

3.1.1电路组成及接线

3.2控制程序

3.2.1控制程序步骤

3.2.2源代码

4例子3:蜂鸣器演奏不同音阶

4.1电路原理图

4.1.1电路组成及接线

4.2控制程序

4.2.1控制程序步骤

4.2.2源代码

5例子4:蜂鸣器播放音乐

5.1电路原理图

5.1.1电路组成及接线

5.2控制程序

5.2.1控制程序步骤

5.2.2源代码

6例子5:蜂鸣器播放多段音乐

6.1电路原理图

6.1.1电路组成及接线

6.2控制程序

6.2.1控制程序步骤

6.2.2源代码

7例子6:蜂鸣器和LED灯组成的报警装置

7.1电路原理图

7.1.1电路组成及接线

7.2控制程序

7.2.1控制程序步骤

7.2.2源代码

  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—>切换开关

复位电路

晶振电路

蜂鸣器

切换开关

2.2控制程序

2.2.1控制程序步骤

库文件和引脚定义

发生函数

主程序

2.2.2源代码

//功能:用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,模拟很逼真的报警效果#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit 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—>频率切换按钮

复位电路

晶振电路

蜂鸣器

频率切换按钮

3.2控制程序

3.2.1控制程序步骤

库文件和引脚定义

延时函数

按周期t发音函数

主程序

3.2.2源代码

//功能:按下不同的按键会蜂鸣器发出不同频率的声音。#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit 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—>控制开关

复位电路

晶振电路

蜂鸣器

控制开关

示波器

4.2控制程序

4.2.1控制程序步骤

库文件和引脚定义

定时器中断函数

延时函数

主程序

4.2.2源代码

如上图所示,不同音阶的模拟信号示波器图

//音阶演奏:使用定时器演奏一段音阶,播放由K1控制。#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit 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方式0IE=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—>控制开关

复位电路

晶振电路

蜂鸣器

控制开关

5.2控制程序

5.2.1控制程序步骤

库文件和引脚定义

音符频率表

节拍表

延时函数

播放函数

主程序

5.2.2源代码

//功能:播放生日快乐歌,所有频率完全用延时实现,通过开关实现播放启停#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit 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

复位电路

晶振电路

数码管

蜂鸣器

按键开关

示波器

6.2控制程序

6.2.1控制程序步骤

库文件和引脚定义

数码管段码表

标准音符频率对应的延时表

三段音乐的音符

三段音乐的节拍

中断INT0

延时函数

主程序

6.2.2源代码

//功能:内置3段音乐,K1可启动停止音乐播放,K2用于选择音乐段。#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit 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}};//外部中断0void 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方式0IE=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

复位电路

晶振电路

旋转灯

蜂鸣器

按键

7.2控制程序

7.2.1控制程序步骤

库文件和引脚定义

延时函数

INTO中断函数

定时器0中断函数

定时器1中断函数

主程序

7.2.2源代码

//功能:定时器控制报警灯旋转显示,并发出仿真警报声。#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit 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个旋转灯elseP2=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方式1TH0=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

http://www.dtcms.com/a/361106.html

相关文章:

  • UE5 C++ 第三方动态库的使用
  • 【数据库】openGauss 6.0 单机自动化安装最佳实践
  • MTK-Android13-实现拷贝预置资源到vendor分区下
  • Java全栈学习笔记27
  • 深度解析条件编译:#ifdef与#ifndef的本质区别与应用实践
  • Dify中使用SearXNG
  • 子串:滑动窗口最大值
  • Macbook Air M4 笔记本 ChatTTS 初体验
  • 总线矩阵的原理
  • 番外篇 | YOLO-FireAD:通过注意力逆残差模块与双池化模块融合实现高精度火灾检测
  • GitHub CLI (gh) 全面指南:终端中的 GitHub 工作流革命
  • 前端页面性能优化
  • JavaScript 性能优化实战技术
  • 99、23种设计模式之组合模式(8/23)
  • Map + 函数式接口的策略模式
  • 控制系统仿真之PID校正-利用PID控制器、PID调节器实现(九)
  • Coze源码分析-工作空间-项目开发-后端源码
  • Python爬虫实战:研究 Lines, bars and markers 模块,构建电商平台数据采集和分析系统
  • 【软件开发工程师の校招秘籍】
  • nginx-realip问题解决方案
  • AI 智能体架构中的协议设计三部曲:MCP → A2A → AG-UI
  • 基于单片机宠物项圈/宠物防丢失设计
  • VMware pro16(许可证)+centos 7超详细安装教程
  • Go语言入门学习笔记
  • 如何将照片从电脑传输到安卓设备
  • GitHub 宕机自救指南:应急解决方案与替代平台
  • LeetCode 165. 比较版本号 - 优雅Java解决方案
  • 【JavaScript】async/await 与 Fetch 传参,PUT,PATCH,文件上传,批量删除等前端案例
  • 《WINDOWS 环境下32位汇编语言程序设计》第10章 内存管理和文件操作(1)
  • 在Lumerical FDTD中,磁偶极子通常用于激发TE模式,而电偶极子用于激发TM模式(文心一言)