本帖最后由 jinglixixi 于 2021-7-13 11:17 编辑
蜂鸣器可分为无源蜂鸣器和有源蜂鸣器这2类,其中的有源蜂鸣器因其自身具有信号源,故通电即可工作;而无源蜂鸣器则需要外部提供信号源才能工作。 在开发板上配置的是无源蜂鸣器,因此它可以在外部信号源的控制下产生不同频率的蜂鸣声,甚至可以演奏出MIDI音乐。 蜂鸣器的电路原理图见图1所示: 图1 蜂鸣器原理图
1. 蜂鸣声 在蜂鸣器的输入端,接入不同频率的脉冲信号即可产生蜂鸣声,按照频率与周期呈反比关系的性质,可使用相应的延时函数来产生相应频率的脉冲信号。 延时值越小,则频率值越高,产生的声音也越尖锐。 产生蜂鸣声的程序如图2所示,经程序的编译和上传即可通道弱弱的蜂鸣声。
图2 程序及上传
2.MIDI音乐 通过设置蜂鸣器发声的频率及时长,即可演奏出简单的MIDI音乐。 在例程中,提供了一个演奏“天上星星亮晶晶,满天都是小星星。”的MIDI示例,为便于理解,在所附的程序上添加了相应的注释,具体的内容如下: #define BUZZER_PIN WIO_BUZZER /* sig pin of the buzzer */
int length = 15; /* 音调值 */ char notes[] ="ccggaagffeeddc "; // 音调 int beats[] = { 1, 1, 1, 1,1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }; // 节拍 int tempo = 300; // 速度
voidsetup() { //set buzzer pin as output pinMode(BUZZER_PIN,OUTPUT); }
voidloop() { for(int i = 0; i < length; i++) { if(notes == ' ') { delay(beats* tempo); } else { playNote(notes, beats *tempo); } delay(tempo / 2); /* delay between notes */ }
}
//Play tone void playTone(int tone, intduration) { for (long i = 0; i < duration * 1000L; i+= tone * 2) { digitalWrite(BUZZER_PIN, HIGH); delayMicroseconds(tone); digitalWrite(BUZZER_PIN, LOW); delayMicroseconds(tone); } }
void playNote(char note, int duration) { char names[] = { 'c', 'd', 'e', 'f', 'g','a', 'b', 'C' }; int tones[] = { 1915, 1700, 1519, 1432,1275, 1136, 1014, 956 };
// play the tone corresponding to the notename for (int i = 0; i < 8; i++) { if (names == note) { playTone(tones, duration); } } }
如果感兴趣的话,也可以找到自己喜欢的乐谱,并将其转换成相应的数据来播放。 |