STM32 控制蜂鸣器播放音乐的原理和实例

本文介绍了如何使用STM32单片机通过C语言控制蜂鸣器播放音乐,包括理解音乐播放原理,如乐谱对应音频和节拍,以及具体实现步骤,如使用TIM4实现毫秒延时和Systick中断控制蜂鸣器输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32 控制蜂鸣器播放音乐的原理和实例

本文通过将乐谱里的每个音符的声音频率和声音时长保存在两个数组里面。
1.使用通用定时器TIM4实现无中断的微秒级延时函数,控制每个音符的发声时长。
2.使用系统滴答时钟Systick实现带有中断的输出控制,在中断函数里实现蜂鸣器端口输出电平反转,并且根据当前播放音符的频率重新设置中断产生时间。

一、播放的原理

播放的乐谱:
在这里插入图片描述

1.1 C音调乐谱对应的音频(Hz):

在这里插入图片描述
根据乐谱的基础知识可知,低音的下面加点,高音的上面加点,普通的不加点。

//用枚举定义,记录所有的音频。
	   enum  Low_frequency{
   l_dao=262,l_re=286,l_mi=311,l_fa=349,l_sao=392,l_la=440,l_xi=494};
       enum  Normal_frequency{
   dao=523,re=587,mi=659,fa=698,sao=784,la=880,xi=987};
       enum  High_frequency{
   h_dao=1046,h_re=1174,h_mi=1318,h_fa=1396,h_sao=1567,h_la=1760,h_xi=1975};

1.2 乐谱对应的节拍-音长:

本次乐谱的节拍为每分钟72拍,可以算出每个节拍的时长:

然后看乐谱的第一小节:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
最后将整个乐谱的音频和音长记录在两个数组里。

二、播放音乐的具体实现

2.1 无中断的毫秒延时函数

//TIM_4初始化函数
void TIM_4(void)
{
   
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
    TIM_TimeBaseStructure.TIM_Period = 1;	
    TIM_TimeBaseStructure.TIM_Prescaler=(72-1);
	  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Down;
	  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
}

//延时n个us
void delay_us(unsigned int nus)
{
   
	TIM4->CNT=nus-1;
	TIM4->CR1|=TIM_CR1_CEN;
	while((TIM4->SR & TIM_FLAG_Update) != SET)
		;
	TIM4->CR1&=(~TIM_CR1_CEN);
	TIM4->SR &
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值