小白跟做江科大51单片机之蜂鸣器播放音乐

原理部分

最初频率对应图

通过上面这个频率对应表计算每个音中断时长

运算得到中断时长


代码部分

1.引入Delay及Timer0相关文件

2.编写main.c代码

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"

//定义蜂鸣器接口

sbit Buzzer=P2^5;

//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#

后面那个数字就代表其在freq中对应的值,最终用来控制中断器时长
#define P      0
#define L1    1
#define L1_    2
#define L2    3
#define L2_    4
#define L3    5
#define L4    6
#define L4_    7
#define L5    8
#define L5_    9
#define L6    10
#define L6_    11
#define L7    12
#define M1    13
#define M1_    14
#define M2    15
#define M2_    16
#define M3    17
#define M4    18
#define M4_    19
#define M5    20
#define M5_    21
#define M6    22
#define M6_    23
#define M7    24
#define H1    25
#define H1_    26
#define H2    27
#define H2_    28
#define H3    29
#define H4    30
#define H4_    31
#define H5    32
#define H5_    33
#define H6    34
#define H6_    35
#define H7    36

//此数组是取到全部的音
unsigned int FreqTable[]={
    0,
    63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
    64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
    65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
};

//乐谱,必须使用code,RAM最大128字节
unsigned char code Music[]={
    //音符,时值,
    
    //1
    P,    4,
    P,    4,
    P,    4,
    M6,    2,
    M7,    2,
    
    H1,    4+2,
    M7,    2,
    H1,    4,
    H3,    4,
    
    M7,    4+4+4,
    M3,    2,
    M3,    2,
    
    //2
    M6,    4+2,
    M5,    2,
    M6, 4,
    H1,    4,
    
    M5,    4+4+4,
    M3,    4,
    
    M4,    4+2,
    M3,    2,
    M4,    4,
    H1,    4,
    
    //3
    M3,    4+4,
    P,    2,
    H1,    2,
    H1,    2,
    H1,    2,
    
    M7,    4+2,
    M4_,2,
    M4_,4,
    M7,    4,
    
    M7,    8,
    P,    4,
    M6,    2,
    M7,    2,
    
    //4
    H1,    4+2,
    M7,    2,
    H1,    4,
    H3,    4,
    
    M7,    4+4+4,
    M3,    2,
    M3,    2,
    
    M6,    4+2,
    M5,    2,
    M6, 4,
    H1,    4,
    
    //5
    M5,    4+4+4,
    M2,    2,
    M3,    2,
    
    M4,    4,
    H1,    2,
    M7,    2+2,
    H1,    2+4,
    
    H2,    2,
    H2,    2,
    H3,    2,
    H1,    2+4+4,
    
    //6
    H1,    2,
    M7,    2,
    M6,    2,
    M6,    2,
    M7,    4,
    M5_,4,
    
    
    M6,    4+4+4,
    H1,    2,
    H2,    2,
    
    H3,    4+2,
    H2,    2,
    H3,    4,
    H5,    4,
    
    //7
    H2,    4+4+4,
    M5,    2,
    M5,    2,
    
    H1,    4+2,
    M7,    2,
    H1,    4,
    H3,    4,
    
    H3,    4+4+4+4,
    
    //8
    M6,    2,
    M7,    2,
    H1,    4,
    M7,    4,
    H2,    2,
    H2,    2,
    
    H1,    4+2,
    M5,    2+4+4,
    
    H4,    4,
    H3,    4,
    H3,    4,
    H1,    4,
    
    //9
    H3,    4+4+4,
    H3,    4,
    
    H6,    4+4,
    H5,    4,
    H5,    4,
    
    H3,    2,
    H2,    2,
    H1,    4+4,
    P,    2,
    H1,    2,
    
    //10
    H2,    4,
    H1,    2,
    H2,    2,
    H2,    4,
    H5,    4,
    
    H3,    4+4+4,
    H3,    4,
    
    H6,    4+4,
    H5,    4+4,
    
    //11
    H3,    2,
    H2,    2,
    H1,    4+4,
    P,    2,
    H1,    2,
    
    H2,    4,
    H1,    2,
    H2,    2+4,
    M7,    4,
    
    M6,    4+4+4,
    P,    4,
    
    0xFF    //终止标志
};

unsigned char freselect,Musicselect;
void main()
{
    
    Timer0Init();
    while(1)
    {
        if(Music[Musicselect]!=0xFF)
        { 

        //选择第几个音
            freselect=Music[Musicselect];
            Musicselect++;

      //选择时长并延时实现
            Delay(500/4*Music[Musicselect]);
            Musicselect++;

           //下面这三行是为了体现抬手的功能,否则声音太密集
            TR0=0;       //关闭定时器
            Delay(5);    //音符间短暂停顿
            TR0=1;      //打开定时器
        }
        else
        {
            TR0=0;
            while(1);
        }
    }
}

//刚开始1ms会有一次中断
//产生500HZ的频率
void Timer0_Routine() interrupt 1
{
    if(FreqTable[freselect])
    {
        TL0 = FreqTable[freselect]%256;        //设置定时初值
      TH0 = FreqTable[freselect]/256;        //设置定时初值
      Buzzer=!Buzzer;
    }
}

3.结果

蜂鸣器之天空之城

在STM32单片机上使用PWM驱动蜂鸣器播放音乐是可行的。首先,你需要在代码中包含PWM.h头文件,并调用PWM_Init()函数进行PWM的初始化。然后,你可以使用PWM_SetCompare3()函数来设置PWM的占空比,从而控制蜂鸣器的声音。\[1\]另外,如果你需要使用RTC功能,你还需要连接一个32.768KHz的晶振,并将其接在3、4号引脚上。这个晶振会被用来生成1秒的时间信号。\[2\]最后,STM32是ST公司推出的一款32位单片机,它的性能相比于8位的51单片机更加强大。所以,你可以使用STM32单片机来实现蜂鸣器播放音乐的功能。\[3\] #### 引用[.reference_title] - *1* [【跟着江科大学Stm32】STM32F103C6T6_PWM控制直流电机_代码](https://blog.csdn.net/m0_55251293/article/details/125638227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32单片机(一)STM32简介](https://blog.csdn.net/AnChenliang_1002/article/details/130828528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值