keli音乐生日单片机
时间: 2025-05-02 11:25:25 浏览: 19
### 音乐生日单片机项目教程
#### 使用STM32F103控制无源蜂鸣器播放生日快乐歌
为了实现一个基于STM32F103的音乐生日贺卡项目,可以通过编程使STM32F103控制无源蜂鸣器来演奏《生日快乐》歌曲。环境准备方面,建议使用Keil uVision或STM32CubeIDE等支持STM32的集成开发环境,并准备好STM32F103系列开发板以及连接的无源蜂鸣器[^3]。
以下是具体的代码示例:
```c
#include "stm32f1xx_hal.h"
// 定义音符频率表
const uint16_t note_freq[] = {
0, /* Rest */
392, /* G4 */
784, /* G5 */
523, /* C5 */
587, /* D5 */
};
void play_note(uint16_t freq, uint32_t duration_ms) {
TIM_HandleTypeDef htim;
// 初始化定时器用于PWM输出
__HAL_RCC_TIM2_CLK_ENABLE();
htim.Instance = TIM2;
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
if (freq != 0) { // 如果不是静音,则设置PWM波形
__HAL_TIM_SET_AUTORELOAD(&htim, SystemCoreClock / freq);
__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, SystemCoreClock / (2 * freq));
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);
} else { // 否则关闭PWM信号
HAL_TIM_PWM_Stop(&htim, TIM_CHANNEL_1);
}
HAL_Delay(duration_ms); // 延迟指定时间
HAL_TIM_PWM_Stop(&htim, TIM_CHANNEL_1); // 结束后停止PWM
}
int main(void) {
// 系统初始化省略...
while (1) {
// 播放生日快乐曲谱简化版
const int song[] = {3, 3, 4, 5, 3, 2, 2};
const int durations[] = {500, 500, 500, 500, 500, 500, 1000};
for(int i=0; i<sizeof(song)/sizeof(*song); ++i){
play_note(note_freq[song[i]], durations[i]);
HAL_Delay(200); // 添加间隔
}
HAL_Delay(5000); // 循环等待一段时间再重播
}
}
```
这段程序通过定义一系列代表不同音高的数值,在`main()`函数中循环调用`play_note()`函数以发出相应的声音序列,从而实现了简单的《生日快乐》旋律播放功能。
阅读全文
相关推荐











