Keil5 蜂鸣器演奏多首音乐 - 按键切换歌曲
在 Keil5 中,我们可以使用 GPIO 库来控制蜂鸣器发声,并通过按键切换播放不同的音乐。以下步骤将详细介绍如何实现这个功能:
-
蜂鸣器控制基础
-
首先,需要初始化 GPIO 口,例如使用 PA8 口:
GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); -
通过
HAL_GPIO_WritePin函数控制 GPIO 口输出高低电平,实现蜂鸣器发声。例如,要发出 440Hz 的声音:const int period = 1000000 / 440; // 计算出周期 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // 输出高电平 HAL_Delay(period / 2); // 延迟半个周期 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); // 输出低电平 HAL_Delay(period / 2); // 延迟半个周期
-
-
按键切换歌曲
-
定义两个音乐的频率数组,例如:
const int song1[] = {440, 494, 523, 587, 659, 698, 784, 880}; const int song2[] = {262, 294, 330, 349, 392, 440, 494, 523}; -
使用
songIndex变量记录当前播放的音乐索引,初始值为 0。 -
在
main函数中,循环检测按键是否按下,按下则切换歌曲:int songIndex = 0; while (1) { if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) // 判断按键是否按下 { songIndex++; // 切换歌曲 if (songIndex >= 2) // 如果切换到了最后一首歌,就从头开始 { songIndex = 0; } HAL_Delay(500); // 延迟一段时间,避免按键抖动 } // 根据当前的 songIndex 播放对应的音乐 if (songIndex == 0) { playSong(song1, sizeof(song1) / sizeof(int)); } else if (songIndex == 1) { playSong(song2, sizeof(song2) / sizeof(int)); } } -
实现
playSong函数,用于播放音乐,输入参数为频率数组和长度:void playSong(const int* freq, int length) { for (int i = 0; i < length; i++) { const int period = 1000000 / freq[i]; // 计算出周期 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // 输出高电平 HAL_Delay(period / 2); // 延迟半个周期 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); // 输出低电平 HAL_Delay(period / 2); // 延迟半个周期 } }
-
通过以上代码,您就可以在 Keil5 中使用蜂鸣器演奏两首以上的音乐,并通过按键切换歌曲了。您可以根据自己的需求调整音乐频率数组、按键引脚、以及延迟时间等参数。
注意:
- 请确保您的硬件电路连接正确,并将按键连接到合适的 GPIO 口。
- 您可以根据需要添加更多音乐,并调整
songIndex的范围和切换逻辑。 - 为了使音乐更加悦耳,您可以尝试使用更复杂的频率变化和音符组合。
- 以上代码仅供参考,您可能需要根据实际情况进行修改。
原文地址: https://www.cveoy.top/t/topic/owJ7 著作权归作者所有。请勿转载和采集!