【嵌入式】微芯旺KungFu32A156MQT蜂鸣器演奏音乐

#include"system_init.h"
#include"kf32a156_gpio.h"

int main()
{
    SystemInit(120);///<初始化系统时钟为120M
    systick_delay_init(120);///<设置SysTick定时器作为延迟功能,输入频率为120M
    GPIO_InitTypeDef GPIO_InitStructure;///<GPIO结构体
    GPIO_InitStructure.m_Mode = GPIO_MODE_OUT;///<GPIO输出模式
    GPIO_InitStructure.m_OpenDrain = GPIO_POD_PP;///<GPIO开漏控制
    GPIO_InitStructure.m_PullDown = GPIO_NOPULL;///<GPIO下拉配置
    GPIO_InitStructure.m_PullUp = GPIO_NOPULL;///<GPIO上拉配置
    GPIO_InitStructure.m_Speed = GPIO_LOW_SPEED;///<GPIO输出速度

    GPIO_InitStructure.m_Pin = GPIO_PIN_MASK_4;///<GPIO端口掩码为4
    GPIO_Configuration(GPIOD_SFR , &GPIO_InitStructure);///<通用输入输出端口(GPIO)初始化配置,蜂鸣器信号线接PD4

    ///<发出250Hz的声音
    while(1)
    {
        GPIO_Set_Output_Data_Bits(GPIOD_SFR, GPIO_PIN_MASK_4, Bit_SET);///<蜂鸣器高电平
        systick_delay_ms(2);///<延时2ms
        GPIO_Set_Output_Data_Bits(GPIOD_SFR, GPIO_PIN_MASK_4, Bit_RESET);///<蜂鸣器低电平
        systick_delay_ms(2);///<延时2ms
    }        
}

 

以下是演奏"只因你太美"片段程序(图源百度)

 

 曲速:每分钟107拍

 

分解歌词“第一次呀变成这样的我,不管我怎么去否认?”

第      高1

一      75

次   53

呀变  33  

成          高1

这          75

样的      53         

的          半拍3

我         5

,不     03

管我     33

怎么     55

去否     56

认        7

 

代码:

#include"system_init.h"
#include"kf32a156_gpio.h"

#define music_rate         120                        ///<曲速,每分钟节拍数
#define time_beat_us      60*1000*1000/music_rate    ///<每节拍的us数
///<音调
#define m0    1        ///<1Hz  无声音
#define m1    523        ///<523Hz  中1
#define m2    587        ///<587Hz  中2
#define m3    659        ///<659Hz  中3
#define m4    698        ///<698Hz  中4
#define m5    784        ///<784Hz  中5
#define m6    880        ///<880Hz  中6
#define m7    988        ///<988Hz  中7
#define h1    1046    ///<1046Hz 高1
#define h2    1175    ///<1175Hz 高2
#define h3    1318    ///<1318Hz 高3
#define h4    1397    ///<1397Hz 高4
#define h5    1568    ///<1568Hz 高5
#define h6    1760    ///<1760Hz 高6
#define h7    1967    ///<1967Hz 高7

/**
*@prototype:music_sound
*@brief:发出一个音调
*@detail:发出一个音调,并控制音调时间
*@param[in]:hz 发出响应hz的声音,范围为(1-2000)
*@param[in]:time_play 音调占1/time_play拍,范围为(1-8)
*@return:无
*@retval
*par
*- 2023-02-02,首次创建
*/
void music_sound(int hz,int time_play)
{
    int hz_us=1000*1000/hz;///<1次震动占用的us数
    int delay_hz_us=hz_us/2;///<每次震动中单个电平占用的us数
    int sound_time_us=time_beat_us/time_play;///<该音所占用时间
    int sound_time=sound_time_us/hz_us;///<该频率下振动的次数
    if(hz==m0)
    {
        ///<空音节直接跳过
        GPIO_Set_Output_Data_Bits(GPIOD_SFR, GPIO_PIN_MASK_4, Bit_SET);///<蜂鸣器高电平
        systick_delay_us(sound_time_us);
    }else
    {
        ///<播放该音
        for(int i=0;i<sound_time;i++)
        {
            GPIO_Set_Output_Data_Bits(GPIOD_SFR, GPIO_PIN_MASK_4, Bit_RESET);///<蜂鸣器低电平
            systick_delay_us(delay_hz_us);
            GPIO_Set_Output_Data_Bits(GPIOD_SFR, GPIO_PIN_MASK_4, Bit_SET);///<蜂鸣器高电平
            systick_delay_us(delay_hz_us);

        }
    }
}

/**
*@prototype:music_play
*@brief:发出一段音乐
*@detail:发出一段音乐
*@param[in]:music[][2] 是音调数组,为{{音调,time_play},{音调,time_play}}
*@param[in]:sound_num    是music中音调的数量
*@return:无
*@retval
*par
*- 2023-02-02,首次创建
*/
void music_play(int music[][2],int sound_num)
{
    ///<播放所有音调
    for(int i=0;i<sound_num;i++)
    {
        music_sound(music[i][0],music[i][1]);///<播放
    }
}

int main()
{
    SystemInit(120);///<初始化系统时钟为120M
    systick_delay_init(120);///<设置SysTick定时器作为延迟功能,输入频率为120M
    GPIO_InitTypeDef GPIO_InitStructure;///<GPIO结构体
    GPIO_InitStructure.m_Mode = GPIO_MODE_OUT;///<GPIO输出模式
    GPIO_InitStructure.m_OpenDrain = GPIO_POD_PP;///<GPIO开漏控制
    GPIO_InitStructure.m_PullDown = GPIO_NOPULL;///<GPIO下拉配置
    GPIO_InitStructure.m_PullUp = GPIO_NOPULL;///<GPIO上拉配置
    GPIO_InitStructure.m_Speed = GPIO_LOW_SPEED;///<GPIO输出速度

    GPIO_InitStructure.m_Pin = GPIO_PIN_MASK_4;///<GPIO端口掩码为4
    GPIO_Configuration(GPIOD_SFR , &GPIO_InitStructure);///<通用输入输出端口(GPIO)初始化配置,蜂鸣器信号线接PD4

    ///<歌曲
    int my_music[][2]={
            {h1,1},{m0,16},///<第
            {m7,2},{m0,16},///<一
            {m5,2},{m0,16},///<次
            {m3,2},{m0,16},{m3,2},{m0,16},///<呀变
            {h1,1},{m0,16},///<成
            {m7,2},{m0,16},///<这
            {m5,2},{m0,16},///<样
            {m3,1},{m0,16},///<的
            {m5,1},{m0,16},///<我
            {m0,1},
            {m3,2},{m0,16},///<,不
            {m3,2},{m0,16},{m3,2},{m0,16},///<管我
            {m5,2},{m0,16},{m5,2},{m0,16},///<怎么
            {m5,2},{m0,16},{m6,2},{m0,16},///<去否
            {m7,2},{m0,16},///<认
    };
    music_play(my_music,sizeof(my_music)/sizeof(my_music[0]));///<播放歌曲
    while(1)
    {

    }        
}

 

参考:https://www.cnblogs.com/hicjiajia/archive/2012/03/31/2426339.html

posted @ 2023-02-02 12:32  海底淤泥  阅读(783)  评论(2编辑  收藏  举报