当前位置: 首页 > 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.xdnf.cn/news/1416295.html

相关文章:

  • 如何在Github中创建仓库?如何将本地项目上传到GitHub中?
  • 【HTML】draggable 属性:解锁网页交互新维度
  • 深入探讨Java异常处理:受检异常与非受检异常的最佳实践
  • 领码方案:低代码平台前端缓存与 IndexedDB 智能组件深度实战
  • Eclipse Compiler for Java (ECJ):安装指南与高效快捷键全解析
  • 玩转OurBMC第二十一期:前端页面仪表盘的设计与使用实践
  • Trae x MCP:一键打造品牌专属高质量SVG封面
  • CompletableFuture初体验
  • (9.1)Python测试之记录
  • Shell 编程 —— 正则表达式与文本处理器
  • 函数,数组与正则表达式
  • Android原生HttpURLConnection上传图片方案
  • 打造智能写作工作流:n8n + 蓝耘MaaS平台完整实战指南
  • Apollo学习之决策模块
  • 【Linux手册】Unix/Linux 信号:原理、触发与响应机制实战
  • Ajax笔记(下)
  • 在.NET标准库中进行数据验证的方法
  • Java视觉跟踪入门:使用OpenCV实现实时对象追踪
  • 【开题答辩全过程】以 基于php的校园兼职求职网站为例,包含答辩的问题和答案
  • 【Android】使用Handler做多个线程之间的通信
  • 【Flask】测试平台开发,应用管理模块实现-第十一篇
  • 【lucene核心】impacts的由来
  • 旧物回收小程序:科技赋能,开启旧物新生之旅
  • 山东省信息技术应用创新开展进程(一)
  • 《C++进阶之STL》【红黑树】
  • OS+MySQL+(其他)八股小记
  • 【macOS】垃圾箱中文件无法清理的常规方法
  • 应用平台更新:可定制目录、基于Git的密钥管理与K8s项目自动化管理
  • Qt中的信号与槽机制的主要优点
  • LeetCode 142. 环形链表 II - 最优雅解法详解