基于STM32的有源蜂鸣器乐谱编写与音乐播放指南
1,什么是有源蜂鸣器
有源蜂鸣器:有源蜂鸣器和无源蜂鸣器的根本区别是产品对输入信号的要求不一样;有源蜂鸣器工作的理想信号是直流电,通常标示为VDC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从而实现磁场交变,带动铝片振动发音。
2,有源蜂鸣器电路:
一般有三极管控制,分两种(一种为高电平有效,一种为低电平有效)。
以下为低电平有效的电路原理图:
3,是怎样获取不同音调
-
振荡器电路:有源蜂鸣器内部包含一个振荡器电路。这个振荡器电路可以产生可变频率的信号。频率决定了蜂鸣器发出的声音的音调。
-
控制输入:有源蜂鸣器通常具有一个控制输入引脚,可以通过该引脚输入电压信号以改变音调。通常,输入电压的变化会导致振荡器电路内部的频率发生变化,从而改变发出的声音的音调。
-
音调计算:有源蜂鸣器的音调是根据振荡器电路的设计和控制电压的输入来计算的。通常,音调是以赫兹(Hz)为单位的频率。较高的频率会产生高音,而较低的频率会产生低音。
-
音调范围:不同型号的有源蜂鸣器具有不同的音调范围。音调范围是指它可以产生的音符频率的范围。一般来说,有源蜂鸣器可以覆盖从几百赫兹到几千赫兹的频率范围。
-
控制方式:有源蜂鸣器的音调可以通过不同的方式控制。例如,可以使用微控制器的数字输出引脚来生成控制信号,也可以通过模拟电压来调整音调。
以下为函数实例:
/*----------------------------------------------------------------------------------*/
void MIDI_PLAY(int num,uc16 music[]){//第一个参数为行数,第二个参数为一个数组(包含频率和持续时间)
u16 i,e;
for (i=1;i<num;i++){//音符个数
for(e=0;e<music[i*2]*music[i*2+1]/1000;e++){//计算持续时间
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1));//进行频率计算,不同于pwm
Delay_us(500000/music[i*2]);
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0));
Delay_us(500000/music[i*2]);
}
}
}
4,音调划分
以下为总结的划分区间:
/*低音部分*/
#define l1 262
#define l2 294
#define l3 330
#define l4 349
#define l5 392
#define l6 440
#define l7 494
/*中音部分*/
#define m1 523
#define m2 587
#define m3 659
#define m4 694
#define m5 784
#define m6 880
#define m7 988
/*高音部分*/
#define h1 1046
#define h2 1175
#define h3 1318
#define h4 1397
#define h5 1568
#define h6 1760
#define h7 1976
5,进行时间的计算
比如4/4拍
一拍为800个单位时间,那么这里就可以写作:
music1[22]={
/*一组为一拍,一道下划线为1/2拍,两道下划线为1/4拍*/
/*上点为重音,下点为低音*/
l5,200,
l6,200,
m1,400,
m1,400,
l5,200,
l6,200,
m1,400 ,
m1,400,
l5,200,
l6,200,
m1,400
}
6,实例
以下为一个实例(好想爱这个世界啊–华晨宇):
函数部分:
void love_world(uc16 music[]){
u16 i,e;
for (i=1;i<248;i++){
for(e=0;e<music[i*2]*music[i*2+1]/1000;e++){
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1));
Delay_us(500000/music[i*2]);
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0));
Delay_us(500000/music[i*2]);
}
}
for (i=1;i<208;i++){
for(e=0;e<music[i*2]*music[i*2+1]/1000;e++){
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1));
Delay_us(500000/music[i*2]);
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0));
Delay_us(500000/music[i*2]);
}
}
for (i=249;i<435;i++){
for(e=0;e<music[i*2]*music[i*2+1]/1000;e++){
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1));
Delay_us(500000/music[i*2]);
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0));
Delay_us(500000/music[i*2]);
}
}
}
乐谱数组部分:
uc16 love_the_world[870]={ m5 , 400 , m3 , 200 , h1 , 400 , m5 , 400 , m3 , 200 , m6 , 400 , m5 , 400 , h2 , 800 , h1 , 400 , m5 , 200 , h3 , 400 , h1 , 400 , m5 , 200 , h3 , 400 , h1 , 400 , m5 , 800 , m5 , 400 , m3 , 200 , h1 , 400 , m5 , 400 , m3 , 200 , m6 , 400 , m5 , 400 , h2 , 800 , h1 , 400 , m5 , 200 , h3 , 400 , h1 , 400 , m5 , 200 , h3 , 400 , h1 , 400 , m5 , 800 , m5 , 200 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 400 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 400 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 800 , 1 , 600 , m1 , 200 , m2 , 200 , m1 , 400 , m3 , 600 , m1 , 400 , m3 , 1200, m2 , 200 , m4 , 600 , m3 , 400 , m2 , 400 , l7 , 200 , m1 , 200 , m1 , 3200, l5 , 200 , l6 , 200 , m1 , 400 , m1 , 400 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 400 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 800 , 1 , 600 , m1 , 200 , m2 , 200 , m1 , 400 , m3 , 600 , m1 , 400 , m3 , 1200, m2 , 200 , m4 , 600 , m3 , 400 , m2 , 400 , l7 , 200 , m1 , 3400, m5 , 200 , m3 , 200 , m3 , 200 , m2 , 200 , m2 , 400 , m5 , 200 , m3 , 200 , m3 , 200 , m2 , 200 , m2 , 400 , m5 , 200 , m3 , 200 , m3 , 200 , m1 , 200 , m1 , 1200, m1 , 200 , m2 , 200 , m3 , 400 , m2 , 400 , m1 , 200 , l7 , 200 , m1 , 800 , l5 , 200 , l6 , 200 , m1 , 400 , m3 , 400 , m2 , 400 , m1 , 200 , m4 , 200 , m4 , 200 , m3 , 200 , m3 , 400 , m3 , 800 , m2 , 400 , m2 , 400 , m1 , 200 , l5 , 200 , l5 , 1200, l5 , 200 , m3 , 200 , m3 , 200 , m2 , 200 , m2 , 400 , m5 , 200 , m3 , 200 , m3 , 200 , m2 , 200 , m2 , 400 , m5 , 200 , m3 , 200 , m3 , 200 , m1 , 200 , m1 , 1200, m1 , 200 , m2 , 200 , m3 , 400 , m2 , 400 , m1 , 200 , l7 , 200 , m1 , 800 , l5 , 200 , l6 , 200 , m1 , 400 , m3 , 400 , m2 , 400 , 1 , 400 , 1 , 800 , m5 , 800 , m5 , 800 , m3 , 400 , m5 , 400 , m7 , 400 , h1 , 400 , h1 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , l7 , 400 , m1 , 400 , m2 , 400 , m3 , 400 , m3 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , m1 , 400 , l5 , 400 , m3 , 400 , m2 , 400 , m2 , 400 , l5 , 400 , m4 , 400 , m3 , 400 , m3 , 400 , m2 , 400 , m6 , 400 , m5 , 200 , m6 , 200 , m6 , 200 , m5 , 600 , m5 , 800 , m3 , 400 , m5 , 400 , m7 , 400 , h1 , 400 , h1 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , l7 , 400 , m1 , 400 , m2 , 400 , m3 , 400 , m3 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , m1 , 400 , l5 , 400 , m3 , 400 , m2 , 200 , m3 , 400 , m2 , 1200, m1 , 400 , //end 208 416 m1 , 800 , m1 , 800 , m1 , 800 , m1 , 800 , l6 , 400 , m2 , 200 , m3 , 200 , m5 , 200 , m6 , 200 , h1 , 200 , h2 , 200 , h3 , 400 , h1 , 400 , h3 , 800 , l4 , 400 , m5 , 200 , m6 , 200 , h1 , 200 , h2 , 200 , h3 , 200 , h1 , 200 , h1 , 200 , h2 , 200 , h2 , 200 , h3 , 200 , h5 , 200 , h3 , 200 , h2 , 200 , h1 , 200 , l6 , 400 , m2 , 200 , m3 , 200 , m5 , 200 , m6 , 200 , h1 , 200 , h2 , 200 , h3 , 400 , h1 , 400 , h5 , 400 , h3 , 400 , //结束1 248 496 m5 , 3200, m5 , 1200, m6 , 200 , m5 , 200 , m5 , 400 , m3 , 400 , m2 , 400 , m4 , 200 , m3 , 200 , m3 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , 1 , 400 , m1 , 400 , m5 , 800 , m5 , 800 , m5 , 800 , m5 , 800 , m5 , 1200, m6 , 200 , m5 , 200 , m5 , 400 , m3 , 400 , m2 , 400 , m4 , 200 , m3 , 200 , m3 , 1200, m2 , 200 , m3 , 200 , m3 , 1200, m2 , 200 , m3 , 200 , m3 , 200 , m2 , 600 , m2 , 800 , m2 , 800 , m2 , 800 , 1 , 800 , 1 , 800 , 1 , 800 , 1 , 800 , m3 , 400 , m5 , 400 , m7 , 400 , h1 , 400 , h1 , 400 , m5 , 400 , m3 , 400 , l7 , 400 , m1 , 400 , m2 , 400 , m3 , 400 , m3 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , m1 , 400 , l5 , 400 , m3 , 400 , m2 , 400 , m2 , 400 , l5 , 400 , m4 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , 1 , 400 , m1 , 400 , m3 , 400 , m5 , 400 , m7 , 400 , h1 , 400 , h1 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , l7 , 400 , m1 , 400 , m2 , 400 , m3 , 400 , m3 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , m1 , 400 , l5 , 400 , m3 , 400 , m2 , 400 , m2 , 400 , l5 , 400 , m4 , 400 , m3 , 400 , m3 , 400 , m2 , 400 , m6 , 400 , m5 , 200 , m6 , 200 , m6 , 200 , m5 , 600 , m5 , 800 , m3 , 400 , m5 , 400 , m7 , 400 , h1 , 400 , h1 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , l7 , 400 , m1 , 400 , m2 , 400 , m3 , 400 , m3 , 400 , m5 , 400 , m3 , 400 , m1 , 400 , m1 , 400 , l5 , 400 , m3 , 400 , m2 , 400 , m2 , 1200, m1 , 400 , m5 , 800 , m5 , 800 , m5 , 800 , m5 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , m3 , 800 , h1 , 400 , m7 , 400 , m6 , 400 , m5 , 400 , m3 , 800 , m3 , 800 , m7 , 800 , h1 , 800 , m5 , 800 , m5 , 800 , h1 , 400 , h7 , 400 , h6 , 400 , h5 , 400 , h3 , 800 , h3 , 800 , m7 , 800 , h1 , 800 , m5 , 800 , m5 , 800 , h1 , 400 , h7 , 400 , h6 , 400 , h5 , 400 , 1 , 800 , 1 , 800 , 1 , 800 , 1 , 800 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 400 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 400 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 3200, l5 , 200 , l6 , 200 , m1 , 400 , m1 , 400 , l5 , 200 , l6 , 200 , m1 , 400 , m1 , 400 , l5 , 200 , l6 , 600 , m1 , 3200 //435 870 };
作者:Healer Shang