在 Keil5 中,我们可以使用 GPIO 库来控制蜂鸣器发声,并通过按键切换播放不同的音乐。以下步骤将详细介绍如何实现这个功能:

  1. 蜂鸣器控制基础

    • 首先,需要初始化 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); // 延迟半个周期
      
  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 的范围和切换逻辑。
  • 为了使音乐更加悦耳,您可以尝试使用更复杂的频率变化和音符组合。
  • 以上代码仅供参考,您可能需要根据实际情况进行修改。
Keil5 蜂鸣器演奏多首音乐 - 按键切换歌曲

原文地址: https://www.cveoy.top/t/topic/owJ7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录