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

STC8 单片机蜂鸣器播放音乐

# STC8单片机蜂鸣器播放《东风破》项目功能描述 ## 一、项目整体功能 本项目基于**STC8系列51单片机**,利用无源蜂鸣器+定时器中断产生不同频率方波,实现循环播放周杰伦《东风破》简谱旋律,乐曲播放完毕后停顿1秒自动重播,全程通过定时器精准控制音符音高与节拍时长。 ## 二、核心硬件逻辑 1. **发声硬件**:无源蜂鸣器连接单片机P1.0引脚(BEEP),准双向IO口输出高低电平交替方波驱动发声; 2. **定时器资源**:使用定时器1工作在16位定时模式,配合中断翻转IO电平,不同定时初值对应不同音调(低音L、中音M、高音H); 3. **静音处理**:休止符(REST)时关闭定时器、拉高蜂鸣器引脚,实现停顿效果。 ## 三、程序模块功能拆解 ### 1. 乐谱数据存储模块 - 二维数组 `music_star` 存储《东风破》完整简谱,存储格式:`{音调定时初值, 节拍时长}`; - 区分低音L、中音M、高音H音符,搭配4分拍、2分拍节拍BEAT常量; - 数组末尾标记 `{REST,0}` 作为乐曲结束识别标志。 ### 2. 基础延时模块 `DelayMs` 毫秒级软件延时函数,用于控制每个音符持续播放时长、歌曲循环间隔。 ### 3. 定时器驱动模块 1. `Timer1_Init`:定时器1初始化,开启总中断、定时器1中断,配置16位定时模式,默认关闭定时器; 2. `Timer1_ISR`:定时器1中断服务函数,重装音调定时初值,翻转蜂鸣器引脚电平生成音频方波。 ### 4. 音符播放模块 `PlayNote` 单音符播放核心函数: - 传入音调与节拍参数,若为休止符直接关闭定时器,延时静音; - 有效音符装载对应音调定时初值,启动定时器发声,延时对应节拍时长后关闭定时器静音。 ### 5. 乐曲循环播放模块 `PlayMusic` 遍历乐谱二维数组,依次读取每一组音调+节拍数据,循环调用单音符播放函数,读到结束标记后退出播放流程。 ### 6. 主函数逻辑 1. IO初始化:配置蜂鸣器引脚为准双向模式,默认关闭蜂鸣器; 2. 定时器初始化,开启中断; 3. 死循环:完整播放一遍《东风破》→延时1秒间隔→重新播放,实现无限循环放歌。 ## 四、项目特色与亮点 1. 音调分层:支持低音、中音、高音三种音域,完整还原歌曲旋律; 2. 节拍可控:标准化节拍常量区分长短音,贴合原曲节奏; 3. 中断发声分离:定时器中断负责生成音频,主程序延时控制节拍,互不干扰; 4. 乐谱易修改:数组结构化存储简谱,可直接替换数组内容播放其他乐曲; 5. 无限循环播放:歌曲结束自动延时重播,无需外部按键触发。 ## 五、适用场景 STC8单片机课程实训、51单片机蜂鸣器音乐播放实验、嵌入式入门

#ifndef __MUSIC_H #define __MUSIC_H sbit BEEP = P3^6; // 低音 #define L1 64580 #define L2 64684 #define L3 64767 #define L4 64820 #define L5 64867 #define L6 64908 #define L7 64944 // 中音 #define M1 64968 #define M2 64994 #define M3 65015 #define M4 65030 #define M5 65043 #define M6 65055 #define M7 65065 // 高音 #define H1 65072 #define H2 65079 #define H3 65085 #define H4 65090 #define H5 65094 #define H6 65098 #define H7 65101 #define REST 0 // 休止符 // 节拍 ms #define BEAT_1 400 #define BEAT_2 200 #define BEAT_4 100 #define BEAT_8 50 #endif

音频发声演示项目。

主代码:

#include "STC8.H" #include "music.h" typedef unsigned char uchar; typedef unsigned int uint; // 东风破简谱 中音+高音组合 uint code music_star[][2] = { {M3,BEAT_4},{M5,BEAT_4},{M6,BEAT_2},{M6,BEAT_4},{M5,BEAT_4}, {M3,BEAT_2},{M2,BEAT_4},{M3,BEAT_4}, {M5,BEAT_2},{M3,BEAT_4},{M2,BEAT_4},{M1,BEAT_2}, {L6,BEAT_4},{M1,BEAT_4},{M2,BEAT_2}, {M3,BEAT_4},{M5,BEAT_4},{M6,BEAT_2},{M6,BEAT_4},{M5,BEAT_4}, {M3,BEAT_2},{M2,BEAT_4},{M3,BEAT_4}, {M5,BEAT_2},{M3,BEAT_4},{M2,BEAT_4},{M1,BEAT_2}, {L6,BEAT_4},{M1,BEAT_4},{M1,BEAT_2}, {M5,BEAT_4},{M6,BEAT_4},{H1,BEAT_2},{H1,BEAT_4},{M6,BEAT_4}, {M5,BEAT_2},{M3,BEAT_4},{M5,BEAT_4}, {M5,BEAT_2},{M3,BEAT_4},{M2,BEAT_4},{M1,BEAT_2}, {L6,BEAT_4},{M1,BEAT_4},{M2,BEAT_2}, {M3,BEAT_4},{M5,BEAT_4},{M6,BEAT_2},{M6,BEAT_4},{M5,BEAT_4}, {M3,BEAT_2},{M2,BEAT_4},{M3,BEAT_4}, {M5,BEAT_2},{M3,BEAT_4},{M2,BEAT_4},{M1,BEAT_2}, {L6,BEAT_4},{M1,BEAT_4},{M1,BEAT_2}, {REST,0} }; uint timer_val; // 音符定时初值 uint beat_delay; // 当前音符持续节拍 bit play_flag = 0; // 发声标志 // 毫秒级延时 void DelayMs(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=1100;j>0;j--); } // 定时器1初始化 16位模式,产生方波 void Timer1_Init(void) { TMOD |= 0x10; ET1 = 1; TR1 = 0; EA = 1; } // 定时器1中断服务函数,翻转蜂鸣器输出 void Timer1_ISR(void) interrupt 3 { TH1 = timer_val >> 8; TL1 = timer_val; BEEP = ~BEEP; } // 播放单音符 void PlayNote(uint note, uint beat) { beat_delay = beat; if(note == REST) { TR1 = 0; BEEP = 1; DelayMs(beat_delay); return; } timer_val = note; TH1 = timer_val >> 8; TL1 = timer_val; TR1 = 1; DelayMs(beat_delay); TR1 = 0; BEEP = 1; } // 【修复警告】去掉形参前面的code修饰符 void PlayMusic(uint music[][2]) { uchar i = 0; while(music[i][0] != REST || music[i][1] != 0) { PlayNote(music[i][0], music[i][1]); i++; } } void main(void) { P3M0 = 0x00; P3M1 = 0x00; // BEEP接P1.0,配置P1口准双向 Timer1_Init(); BEEP = 1; // 蜂鸣器默认关闭 while(1) { PlayMusic(music_star); DelayMs(1000); // 歌曲循环间隔1秒 } }
http://www.jsqmd.com/news/1164457/

相关文章:

  • 破解PET/CT肿瘤分割模态失衡与小病灶漏检问题
  • GRPO强化学习与LoRA微调:提升Gemma-3数学推理能力实践
  • AssetStudio:Unity资源查看与提取工具的核心原理与实战指南
  • # 2026银川离婚律师怎么挑?5个选律师标准防踩雷推荐 - 本地品牌推荐
  • A3910与PIC18F25K50电机控制方案解析
  • 【一线大厂Java面试题合集】第05篇-反射机制与动态代理
  • syscontainer-tools 网络管理指南:轻松添加和移除容器网络接口的终极教程
  • 2026年7月最新东莞萧邦官方售后客服电话及服务网点地址查询 - 萧邦中国官方服务中心
  • 多旋翼无人机安全操控实战:基于UOM法规的10个关键场景与应对方案
  • 离线版设备故障诊断智能体——基于国产麒麟系统的文本数据诊断方案
  • 3D Transformer实战:解决PET/CT大病灶边界模糊与全局特征缺失问题
  • 2026年7月最新徐州帝舵官方售后服务热线与网点地址查询 - 帝舵中国官方服务中心
  • about learning English (2026.07.10)
  • DHT11 温湿度传感器 3 种主流库对比:Adafruit vs markruys vs DFRobot 实测
  • 智能体平台提供单元测试和集成测试工具吗?——2026年企业级Agent测试能力深度解析与方案对比
  • Runway Agent Skills:AI编程助手集成媒体生成能力的技术解析
  • 2026年山东市场高性价比自动售卖机厂家综合推荐指南 - 品牌鉴赏官2026
  • STM32F042K6与ADS131M02高精度ADC数据采集方案详解
  • 蓝牙5.4音频传输方案:IDC777-1模块与PIC18F4610实战
  • 使用 Java Project Manager 扩展快速创建 Maven 或 Gradle 项目
  • 免费数字人平台一个月到底要花多少钱?老板IP、门店短视频、跨境团队三种场景算一笔账
  • FPG财盛国际:长期一致性的细节盘点
  • 2026年玉溪别墅装修优质企业甄选与推荐 - 品牌鉴赏官2026
  • 从 iPSC 到脑类器官,纳米材料与生长因子如何配合
  • 5台Mac部署MLX-LM API集群——完整技术方案
  • Meta承包商伪装未成年人向竞品发送4.5万有害提示测试安全护栏
  • 暑假学习第一天
  • 生成式 AI 曝光怎么做?豆顶顶 GEO 本地内容分发技术解析
  • ESP8266/32 Tuyalink 连接实战:3个关键步骤解决 TLS 与 HMAC-SHA256 认证
  • fatal error C1189: #error: WinSock.h has already been included 的解决方案