【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战

发布时间:2026/10/25 23:33:38

【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战 一、蜂鸣器应用场景蜂鸣器把电信号转换成声音信号电子产品用来做状态提示按键滴声、报警、故障提醒。空调、电水壶、风扇、单片机开发板上都可以见到蜂鸣器。二、有源蜂鸣器 vs 无源蜂鸣器⚠️这里的“源”指振荡源不是电源类型有源蜂鸣器Active无源蜂鸣器Passive内部结构自带振荡电路无振荡源类似小喇叭驱动条件施加直流电压就发声必须输入一定频率的方波脉冲才发声音调频率固定不能变调修改脉冲频率输出不同音调可以播放音乐识别引脚顶部印有标识长引脚为正极同样长脚正极外观很难区分只能看手册有源蜂鸣器IO直接输出高低电平控制通电断电即可响代码简单只能一种音调。无源蜂鸣器需要单片机输出高低交替方波可以演奏音乐是本章实验对象。想让单片机“唱歌”必须使用无源蜂鸣器。三、硬件驱动电路解析STC89C51单片机IO口驱动电流很小不足以直接驱动蜂鸣器开发板使用NPN三极管做开关放大电流配合续流二极管保护器件。开发板硬件蜂鸣器控制引脚BUZZE → P2.1三极管FMMT491做开关R48、R47基极限流电阻D25为续流二极管吸收关断瞬间反向电动势保护三极管。电路逻辑P2.1输出高电平三极管导通无源蜂鸣器得到脉冲信号发声。P2.1输出低电平三极管截止蜂鸣器停止。注意无源蜂鸣器只给恒定高电平是不会响的需要不断翻转IO输出方波。四、基础代码实验示例1软件延时翻转IO无源蜂鸣器发声12M晶振循环翻转P2.1引脚生成方波蜂鸣器发出滴滴声。#includereg52.h sbit speak P2^1; //蜂鸣器控制引脚P2.1 //毫秒延时函数 12MHz void delay_ms(unsigned int xms) { unsigned int i, j; for(ixms;i0;i--) { for(j124;j0;j--); } } void main(void) { while(1) { speak 1; delay_ms(1); speak 0; delay_ms(1); } }缺点软件延时占用CPU程序卡在延时中无法处理其他业务实际项目优先用定时器中断翻转IO。示例2有源蜂鸣器简单提示音如果你硬件是有源蜂鸣器不需要方波直接控制电平持续时间#includereg52.h sbit speak P2^1; void delay_ms(unsigned int xms) { unsigned int i, j; for(ixms;i0;i--) for(j124;j0;j--); } void main(void) { while(1) { speak 1; //响 delay_ms(500); speak 0; //停 delay_ms(500); } }五、进阶实战无源蜂鸣器定时器中断播放音乐《Happy New Year》原理使用定时器0中断定时翻转蜂鸣器IO产生不同频率方波数组存储每一个音符对应的定时器初值与节拍时长主循环遍历乐曲数组播放歌曲。#include reg52.h #define uchar unsigned char sbit speak P2 ^ 1; bit flag 0; //电平翻转标志 uchar ptr 0x00; //歌曲数组索引 uchar high; //定时器初值高8位 uchar low; //定时器初值低8位 //乐曲数组Happy New Year //格式[TH0,TL0,节拍时长]0xff休止符0x00歌曲结束 uchar code music[] { 0xfc, 0x44, 0x7f, 0xfc, 0x44, 0x7f, 0xfc, 0x44, 0xff, 0xfa, 0x68, 0xff, 0xfd, 0x23, 0x7f, 0xfd, 0x23, 0x7f, 0xfd, 0x23, 0xff, 0xfc, 0x44, 0xff, 0xfc, 0x44, 0x7f, 0xfd, 0x23, 0x7f, 0xfd, 0x82, 0xff, 0xfd, 0x82, 0xff, 0xfd, 0x23, 0x7f, 0xfd, 0x23, 0x7f, 0xfc, 0xac, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xac, 0x7f, 0xfd, 0x23, 0x7f, 0xfd, 0x34, 0xff, 0xfd, 0x34, 0xff, 0xfd, 0x23, 0x7f, 0xfc, 0xac, 0x7f, 0xfd, 0x23, 0xff, 0xfc, 0x44, 0xff, 0xfc, 0x44, 0x7f, 0xfd, 0x23, 0x7f, 0xfc, 0xac, 0xff, 0xfa, 0x68, 0xff, 0xfc, 0x0c, 0x7f, 0xfc, 0xac, 0x7f, 0xfc, 0x44, 0xff, 0xff, 0xff, 0xff, 0x00 }; //毫秒延时 12MHz void delay_ms(unsigned int xms) { unsigned int i, j; for (i xms; i 0; i--) { for (j 124; j 0; j--) { } } } //定时器0中断翻转蜂鸣器IO产生方波 void Count1(void) interrupt 1 { TH0 high; TL0 low; if (flag 0) { speak 0; flag 1; } else { speak 1; flag 0; } } //定时器初始化 void Init(void) { TMOD 0x01; //定时器0模式1 16位 EA 1; //总中断打开 ET0 1; //开启定时器0中断 } void main(void) { uchar time; Init(); TH0 high; TL0 low; while (1) { if (music[ptr] ! 0xff music[ptr] ! 0x00) { TR0 0; //关闭定时器停止发声 speak 1; delay_ms(10); high music[ptr]; //取出音符TH0 low music[ptr 1]; //取出音符TL0 time music[ptr 2]; //取出节拍时长 TR0 1; //开启定时器播放当前音符 delay_ms(time); ptr 3; } else if (music[ptr] 0xff) //休止符静音 { time music[ptr 2]; delay_ms(time); ptr 3; } else //0x00歌曲播放完毕停顿2秒从头循环 { TR0 0; speak 1; delay_ms(2000); ptr 0; } } }代码逻辑说明定时器0中断负责定时翻转P2.1引脚电平生成方波信号不同初值对应不同频率对应不同音符。music[]数组存储整首歌每3个字节一组TH0初值、TL0初值、节拍时间。0xff代表休止符不发声0x00代表歌曲结束停顿2秒索引置0循环重播。播放音符时打开定时器休止/结束关闭定时器。六、开发踩坑总结有源无源千万不要搞混无源蜂鸣器恒定高电平不会响必须输入方波有源蜂鸣器给方波声音异常。单片机IO不能直接驱动蜂鸣器必须依靠三极管放大电流开发板已经做好外围电路直接操作IO引脚。续流二极管不能省略感性负载关断会产生反向高压容易损坏三极管和单片机。软件延时生成方波会阻塞CPU音乐项目推荐定时器中断翻转IO。晶振改变定时器初值需要重新调整音调才准确。七、本章小结有源蜂鸣器直流电平控制音调固定无源蜂鸣器需要方波脉冲可以播放音乐。三极管做开关放大电流解决单片机IO驱动能力不足的问题。无源蜂鸣器可以软件延时翻转IO发声高级用法使用定时器中断生成不同频率方波播放乐曲。乐曲数组保存音符定时器初值与节拍实现循环播放歌曲。
延伸阅读

更多相关文章

2026/10/24 5:13:02

美团Agent实践手册解析:从复杂任务拆解到系统集成的工程指南

这次我们来看一个来自美团技术团队的开源项目—— 《Agent 实践手册》 。这不是一个概念性的框架,而是一本完全基于美团在外卖、酒店、打车等核心业务一线实战经验总结的“操作指南”。它的核心价值在于,回答了在真实、复杂的业务系统中,如…

2026/10/25 5:59:07

千牛店群自动化管理系统:系统级防风控,不是打补丁是重构地基

千牛店群自动化管理系统:系统级防风控,不是打补丁是重构地基 店群运营的本质不是开多少店,而是单店运营成本能不能压到零。千牛的自动回复与客服,是店群运营中最耗人力也最容易出错的环节。 店群客服是纯人力消耗战。一个店日均…

2026/10/25 23:30:45

Java Swing高校教材管理系统实战指南

简介:这是一套面向高校计算机专业教学与课程设计实践的Java桌面应用系统,基于Swing图形界面与MySQL数据库开发,专为解决高校教材全流程管理需求而设计。系统覆盖出版社与教材类型维护、订购、入库、领用四大核心业务,并内置ISBN书…

2026/10/25 23:30:45

Matlab实现深度学习波前重建:从Shack-Hartmann光斑图到Zernike系数

简介:面向计算机、电子信息与数学类专业学生,这套基于深度学习和Shack-Hartmann波前传感器的Matlab仿真资源,提供了从传感器光斑检测到深度网络波前重建的完整实现方案。内容涵盖Shack-Hartmann传感器原理仿真、ResUNet深度学习模型演示、降噪…

2026/10/25 23:30:45

菜鸟驿站快递分发系统毕业设计:状态机、Spring Boot与避坑指南

简介:一套基于Java技术实现的菜鸟驿站快递分发管理系统,面向计算机专业毕业设计或课程设计人群,可用于快速搭建演示项目或作为二次开发基线。资源围绕用户下单、快件入库、取件、物流跟踪等典型业务场景,完整覆盖了需求分析、总体…

2026/10/25 23:30:45

FusionCompute 6.5实验手册:CNA/VRM部署与迁移运维

简介:FusionCompute实验手册1是华为HCIP-Cloud Computing V4.0认证培训的官方实验指导材料,面向备考该认证的学员,以及希望系统掌握华为服务器虚拟化平台FusionCompute运营与运维技能的工程师。手册围绕7个实验、四个部分展开:先在…

2026/10/25 23:25:45

基于 WebGPU 与数字孪生的智慧餐饮中央厨房三维可视化管控平台

一、项目背景与整体架构 传统中央厨房存在「数据分散、看不见、管不住」三大痛点:IoT 传感器数据停留在二维表格,产线状态靠人工巡检,食安风险事后才发现。本平台以 WebGPU 实时渲染 数字孪生 AI 分析 为核心,把厨房的物理空间与…

2026/10/25 0:02:22

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/25 0:02:23

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/25 0:02:23

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/25 0:02:22

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/25 0:02:23

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/25 0:02:23

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑