stm32f103c8t6,用蜂鸣器实现两只老虎
时间: 2025-06-14 19:47:22 浏览: 8
### STM32F103C8T6 蜂鸣器播放《两只老虎》的实现教程
要使用 STM32F103C8T6 单片机通过蜂鸣器实现播放《两只老虎》的功能,需要完成以下配置和代码编写。以下是详细的实现方法:
#### 1. 硬件连接
STM32F103C8T6 的蜂鸣器通常连接到一个 GPIO 引脚,并通过 PWM 信号驱动无源蜂鸣器。确保蜂鸣器的正极连接到指定的 GPIO 引脚,负极接地。
#### 2. 配置 CubeMX
在 STM32CubeMX 中进行如下配置:
- **GPIO 配置**:选择一个 GPIO 引脚作为 PWM 输出引脚。
- **定时器配置**:启用一个定时器(例如 TIM2),用于生成 PWM 波形。设置分频系数为 9,主频为 72MHz,因此 PWM 频率最大为 8MHz[^4]。
- **PWM 模式**:将定时器通道配置为 PWM 输出模式。
#### 3. 定义音符频率
根据音乐理论,每个音符对应一个特定的频率。以下是《两只老虎》中使用的音符频率表(单位:Hz)[^3]:
```c
#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 523
#define NOTE_REST 0 // 表示静音
```
#### 4. 编写歌曲数据结构
为了播放《两只老虎》,需要定义歌曲的音符序列和对应的持续时间。以下是一个简单的歌曲数据结构:
```c
typedef struct {
uint16_t tone; // 音符频率 (Hz)
uint16_t duration; // 持续时间 (毫秒)
} MusicNote;
MusicNote tiger_notation[] = {
{NOTE_C4, 500}, {NOTE_D4, 500}, {NOTE_E4, 500}, {NOTE_C4, 500},
{NOTE_C4, 500}, {NOTE_D4, 500}, {NOTE_E4, 500}, {NOTE_C4, 500},
{NOTE_E4, 500}, {NOTE_F4, 500}, {NOTE_G4, 500}, {NOTE_E4, 500},
{NOTE_C4, 500}, {NOTE_D4, 500}, {NOTE_C4, 1000}
};
const uint8_t ARRAY_SIZE = sizeof(tiger_notation) / sizeof(MusicNote);
```
#### 5. 实现播放函数
编写一个函数 `play_tone` 用于生成指定频率的音调,并结合延时函数控制音符的持续时间:
```c
void play_tone(uint16_t frequency, uint16_t duration_ms) {
if (frequency == 0) { // 如果是静音
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1); // 停止 PWM 输出
HAL_Delay(duration_ms);
} else {
uint16_t prescaler = 9; // 分频系数
uint32_t period = (SystemCoreClock / (prescaler + 1)) / frequency;
__HAL_TIM_SET_AUTORELOAD(&htim2, period - 1); // 设置自动重装载值
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, period / 2); // 设置占空比为 50%
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // 启动 PWM 输出
HAL_Delay(duration_ms);
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1); // 停止 PWM 输出
}
}
```
#### 6. 主循环播放歌曲
在主函数中调用 `play_tiger` 函数来播放《两只老虎》:
```c
void play_tiger(void) {
for (uint8_t i = 0; i < ARRAY_SIZE; i++) {
play_tone(tiger_notation[i].tone, tiger_notation[i].duration);
HAL_Delay(30); // 添加短暂停顿以避免音符间过渡过于紧凑
}
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
while (1) {
play_tiger(); // 播放《两只老虎》
HAL_Delay(2000); // 播放完成后等待 2 秒再重复
}
}
```
#### 7. 测试与调试
将程序下载到 STM32F103C8T6 开发板上,连接蜂鸣器并运行程序。如果音调不准确,检查定时器的分频系数和重装载值是否正确[^4]。
---
### 注意事项
- 确保蜂鸣器为无源蜂鸣器,因为有源蜂鸣器无法通过改变频率来播放音乐[^3]。
- 如果需要播放其他歌曲,只需修改 `tiger_notation` 数组中的音符频率和持续时间即可[^1]。
---
阅读全文
相关推荐














