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单片机蜂鸣器音乐播放实验、嵌入式入门

cpp 复制代码
#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

音频发声演示项目。

主代码:

cpp 复制代码
#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秒
    }
}
相关推荐
幼儿园蛋小黑2 小时前
单片机数码管LED灯独立按键中断定时器综合实战
单片机·嵌入式硬件
自小吃多3 小时前
PCB Editor软件复制、改变、删除操作笔记
笔记·嵌入式硬件
数字新视界4 小时前
数据中心基础设施管理系统发布新版本,助力企业云化转型
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
SKH.4 小时前
单片机(1)
单片机·嵌入式硬件
llilian_164 小时前
小切口解决大问题:时序校准场景下的标准时间间隔脉冲信号发生器应用方案
功能测试·单片机·嵌入式硬件·51单片机
三块石头1015 小时前
车载ADC避坑:为什么ADC采集值偏低?
经验分享·stm32·单片机·嵌入式硬件·mcu·硬件架构·硬件工程
jianqiang.xue5 小时前
ESP-IDF保姆级入门39|固件安全与安全启动全解:签名校验/Flash加密/防回滚/OTP密钥/知识产权保护,掌握工业级固件安全防护体系
单片机·物联网·esp32
llilian_165 小时前
时间统一系统 高精度时统设备选购避坑指南 授时系统
大数据·网络·人工智能·功能测试·单片机·嵌入式硬件·51单片机
en.en..5 小时前
sizeof与strlen的区别(附UDP网络编程实战坑点)
单片机·嵌入式硬件
AOI小白新手上路5 小时前
韦东山IMX6ULL快速入门路线
嵌入式硬件