通過開發(fā)板的蜂鳴器播放歌曲在實際產(chǎn)品設計中可能用處不大,但是在一些開發(fā)板中非常常見,其實看似簡單的功能涉及到的知識點還比較多。
本文對蜂鳴器播放音樂涉及到的知識點進行重點說明。
一:硬件電路

如上圖所示,是非常常用的三極管驅動蜂鳴器的電路:
當P12輸出低電平時,三極管Q1不導通,此時無電流流過蜂鳴器,蜂鳴器不發(fā)聲。當P12輸出高電平時,Q1導通,此時有電流流過蜂鳴器,蜂鳴器發(fā)聲。
R26是限流電阻,保證流過蜂鳴器的電流不會超過允許值。
關于三極管驅動電路的原理講解及更多的優(yōu)化設計,可在本公眾號內搜索相關文章自行學習。
注意:想要進行音樂播放需要使用無源蜂鳴器;關于無源蜂鳴器與有源蜂鳴器的區(qū)別,可在本公眾號內搜索蜂鳴器相關的文章進行學習。
二:有源蜂鳴器與無源蜂鳴器
注意:這里的“源”不是指電源,而是指震蕩源。也就是說,有源蜂鳴器內部帶震蕩源,所以只要一通電就會叫;而無源內部不帶震蕩源,所以如果用直流信號無法令其鳴叫。必須用 2K-5K 的方波去驅動它。
有源蜂鳴器往往比無源的貴,就是因為里面多個震蕩電路。
無源蜂鳴器的優(yōu)點是:
便宜
聲音頻率可控,可以做出“多來米發(fā)索拉西”的效果
在一些特例中,可以和 LED 復用一個控制口
有源蜂鳴器的優(yōu)點是:
程序控制方便。
三:蜂鳴器發(fā)聲原理
單片機驅動無源蜂鳴器的方式有兩種:一種是 PWM 輸出口直接驅動,另一種是利用 I/O 定時翻轉電平產(chǎn)生驅動波形對蜂鳴器進行驅動。
PWM 輸出口直接驅動是利用PWM輸出口本身可以輸出一定的方波來直接驅動蜂鳴器。在單片機的軟件設置中有幾個系統(tǒng)寄存器是用來設置 PWM 口的輸出的,可以設置占空比、周期等等,通過設置這些寄存器產(chǎn)生符合蜂鳴器要求的頻率的波形之后,只要打開 PWM 輸出, PWM 輸出口就能輸出該頻率的方波,這個時候利用這個波形就可以驅動蜂鳴器了。
比如頻率為 2000Hz 的蜂鳴器的驅動,可以知道周期為 500μs,這樣只需要把 PWM 的周期設置為 500μs,占空比電平設置為 250μs,就能產(chǎn)生一個頻率為 2000Hz 的方波,通過這個方波再利用三極管就可以去驅動這個蜂鳴器了。
而利用 I/O 定時翻轉電平來產(chǎn)生驅動波形的方式會比較麻煩一點,必須利用定時器來做定時,通過定時翻轉電平產(chǎn)生符合蜂鳴器要求的頻率的波形,這個波形就可以用來驅動蜂鳴器了。
比如為 2500Hz 的蜂鳴器的驅動,可以知道周期為 400μs,這樣只需要驅動蜂鳴器的 I/O 口每 200μs 翻轉一次電平就可以產(chǎn)生一個頻率為 2500Hz,占空比為/2 的方波,再通過三極管放大就可以驅動這個蜂鳴器了。
其實兩種驅動方式本質上都是給蜂鳴器一定頻率的信號,蜂鳴器的發(fā)聲頻率等于驅動方波的頻率。
下面貼出來蜂鳴器發(fā)聲的相關函數(shù)。
//Buzzer初始化
void buzzerInit(void)
{
TR0 = 0;
TF0 = 0;
TMOD |= 0x01; // 設置新模式:16位定時模式
BUZZ = 1;
ET0 = 1;
EA = 1;
}
// Buzzer發(fā)出指定頻率的聲音
// uiFreq是發(fā)聲頻率,單位:Hz
void buzzerSound(unsigned int uiFreq)
{
// 限定頻率范圍在20~20000Hz之間
if (uiFreq < 20) {
buzzerQuiet();
return;
}
if (uiFreq > 20000) uiFreq = 20000;
// 計算Timer0裝載值
TL0_Load = LOW_BYTE(65536UL - CPUCLK / (uiFreq * 2));
TH0_Load = HIGH_BYTE(65536UL - CPUCLK / (uiFreq * 2));
// 啟動Timer
TL0 = 0xF0;
TH0 = 0xFF;
TR0 = 1;
}
// 蜂鳴器停止發(fā)聲
void buzzerQuiet(void)
{
TR0 = 0;
TF0 = 0;
BUZZ = 1;
}
四:蜂鳴器演奏樂曲

上圖是《化蝶》的樂譜。
簡譜是大眾化的音樂記譜方式,比較容易理解和掌握。我們可以把一首樂譜(score)看成是由若干個基本的音符(note)單元組成。
一個音符由音名和時值組成。音名就是低音、中音、高音的 1234567(唱作 do re mi fa sol la si),其本質是音符的發(fā)聲頻率。
可以在程序中用L1~L7、M1~M7、H1~H7 定義低音、中音、高音所對應的發(fā)聲頻率。
時值是音符的發(fā)聲時間長短,有全音符、二分音符、四分音符……等等。
音符可以后綴一個“符點”,表示時值增加 1/2,特殊地,二分音符加符點時用“-”代替圓點。參見下表的描述。

在程序中定義一個音符結構體tNote,有兩個數(shù)據(jù)成員:音名mName和時值mTime。
再使用該結構體定義一個tNote型常量數(shù)表MyScore[ ],用來保存實際樂譜轉換成tNote格式的數(shù)據(jù)。
有了上述一點點樂譜基礎知識,我們就可以很方便地編輯這個數(shù)表了。比如音符“3-”轉換為“{L3, T/2}”,音符“3.”轉換為“{M3, T/4+T/8}”,等等。感興趣的同學可以自行補充上面簡譜中的內容。
審核編輯:劉清
-
三極管
+關注
關注
145文章
3719瀏覽量
127955 -
驅動電路
+關注
關注
158文章
1622瀏覽量
111630 -
蜂鳴器
+關注
關注
12文章
900瀏覽量
47761
原文標題:想用蜂鳴器聽個曲兒,你至少需要掌握這些知識!不來聽聽開發(fā)板播放的《梁?!罚?/p>
文章出處:【微信號:精通單片機與嵌入式,微信公眾號:精通單片機與嵌入式】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
STM32控制蜂鳴器播放音樂的原理是什么?
使用51單片機進行播放音樂蜂鳴器的詳細資料合集免費下載
51單片機(二十七)—— 蜂鳴器播放音樂
【學習心得】蜂鳴器播放音樂
STM32 控制蜂鳴器播放音樂的原理和實例
對蜂鳴器播放音樂涉及到的知識點進行重點說明
評論