#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) { } }
标签:KungFu32A156MQT,蜂鸣器,system,演奏,微芯旺,kf32a156,gpio,include From: https://www.cnblogs.com/LPworld/p/17084784.html