通過開發(fā)板的蜂鳴器播放歌曲在實(shí)際產(chǎn)品設(shè)計(jì)中可能用處不大,但是在一些開發(fā)板中非常常見,其實(shí)看似簡(jiǎn)單的功能涉及到的知識(shí)點(diǎn)還比較多。
本文對(duì)蜂鳴器播放音樂涉及到的知識(shí)點(diǎn)進(jìn)行重點(diǎn)說明。
一:硬件電路
如上圖所示,是非常常用的三極管驅(qū)動(dòng)蜂鳴器的電路:
當(dāng)P12輸出低電平時(shí),三極管Q1不導(dǎo)通,此時(shí)無電流流過蜂鳴器,蜂鳴器不發(fā)聲。當(dāng)P12輸出高電平時(shí),Q1導(dǎo)通,此時(shí)有電流流過蜂鳴器,蜂鳴器發(fā)聲。
R26是限流電阻,保證流過蜂鳴器的電流不會(huì)超過允許值。
關(guān)于三極管驅(qū)動(dòng)電路的原理講解及更多的優(yōu)化設(shè)計(jì),可在本公眾號(hào)內(nèi)搜索相關(guān)文章自行學(xué)習(xí)。
注意:想要進(jìn)行音樂播放需要使用無源蜂鳴器;關(guān)于無源蜂鳴器與有源蜂鳴器的區(qū)別,可在本公眾號(hào)內(nèi)搜索蜂鳴器相關(guān)的文章進(jìn)行學(xué)習(xí)。
二:有源蜂鳴器與無源蜂鳴器
注意:這里的“源”不是指電源,而是指震蕩源。也就是說,有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會(huì)叫;而無源內(nèi)部不帶震蕩源,所以如果用直流信號(hào)無法令其鳴叫。必須用 2K-5K 的方波去驅(qū)動(dòng)它。
有源蜂鳴器往往比無源的貴,就是因?yàn)槔锩娑鄠€(gè)震蕩電路。
無源蜂鳴器的優(yōu)點(diǎn)是:
便宜
聲音頻率可控,可以做出“多來米發(fā)索拉西”的效果
在一些特例中,可以和 LED 復(fù)用一個(gè)控制口
有源蜂鳴器的優(yōu)點(diǎn)是:
程序控制方便。
三:蜂鳴器發(fā)聲原理
單片機(jī)驅(qū)動(dòng)無源蜂鳴器的方式有兩種:一種是 PWM 輸出口直接驅(qū)動(dòng),另一種是利用 I/O 定時(shí)翻轉(zhuǎn)電平產(chǎn)生驅(qū)動(dòng)波形對(duì)蜂鳴器進(jìn)行驅(qū)動(dòng)。
PWM 輸出口直接驅(qū)動(dòng)是利用PWM輸出口本身可以輸出一定的方波來直接驅(qū)動(dòng)蜂鳴器。在單片機(jī)的軟件設(shè)置中有幾個(gè)系統(tǒng)寄存器是用來設(shè)置 PWM 口的輸出的,可以設(shè)置占空比、周期等等,通過設(shè)置這些寄存器產(chǎn)生符合蜂鳴器要求的頻率的波形之后,只要打開 PWM 輸出, PWM 輸出口就能輸出該頻率的方波,這個(gè)時(shí)候利用這個(gè)波形就可以驅(qū)動(dòng)蜂鳴器了。
比如頻率為 2000Hz 的蜂鳴器的驅(qū)動(dòng),可以知道周期為 500μs,這樣只需要把 PWM 的周期設(shè)置為 500μs,占空比電平設(shè)置為 250μs,就能產(chǎn)生一個(gè)頻率為 2000Hz 的方波,通過這個(gè)方波再利用三極管就可以去驅(qū)動(dòng)這個(gè)蜂鳴器了。
而利用 I/O 定時(shí)翻轉(zhuǎn)電平來產(chǎn)生驅(qū)動(dòng)波形的方式會(huì)比較麻煩一點(diǎn),必須利用定時(shí)器來做定時(shí),通過定時(shí)翻轉(zhuǎn)電平產(chǎn)生符合蜂鳴器要求的頻率的波形,這個(gè)波形就可以用來驅(qū)動(dòng)蜂鳴器了。
比如為 2500Hz 的蜂鳴器的驅(qū)動(dòng),可以知道周期為 400μs,這樣只需要驅(qū)動(dòng)蜂鳴器的 I/O 口每 200μs 翻轉(zhuǎn)一次電平就可以產(chǎn)生一個(gè)頻率為 2500Hz,占空比為/2 的方波,再通過三極管放大就可以驅(qū)動(dòng)這個(gè)蜂鳴器了。
其實(shí)兩種驅(qū)動(dòng)方式本質(zhì)上都是給蜂鳴器一定頻率的信號(hào),蜂鳴器的發(fā)聲頻率等于驅(qū)動(dòng)方波的頻率。
下面貼出來蜂鳴器發(fā)聲的相關(guān)函數(shù)。
//Buzzer初始化 void buzzerInit(void) { TR0 = 0; TF0 = 0; TMOD |= 0x01; // 設(shè)置新模式:16位定時(shí)模式 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; // 計(jì)算Timer0裝載值 TL0_Load = LOW_BYTE(65536UL - CPUCLK / (uiFreq * 2)); TH0_Load = HIGH_BYTE(65536UL - CPUCLK / (uiFreq * 2)); // 啟動(dòng)Timer TL0 = 0xF0; TH0 = 0xFF; TR0 = 1; } // 蜂鳴器停止發(fā)聲 void buzzerQuiet(void) { TR0 = 0; TF0 = 0; BUZZ = 1; }
四:蜂鳴器演奏樂曲
上圖是《化蝶》的樂譜。
簡(jiǎn)譜是大眾化的音樂記譜方式,比較容易理解和掌握。我們可以把一首樂譜(score)看成是由若干個(gè)基本的音符(note)單元組成。
一個(gè)音符由音名和時(shí)值組成。音名就是低音、中音、高音的 1234567(唱作 do re mi fa sol la si),其本質(zhì)是音符的發(fā)聲頻率。
可以在程序中用L1~L7、M1~M7、H1~H7 定義低音、中音、高音所對(duì)應(yīng)的發(fā)聲頻率。
時(shí)值是音符的發(fā)聲時(shí)間長(zhǎng)短,有全音符、二分音符、四分音符……等等。
音符可以后綴一個(gè)“符點(diǎn)”,表示時(shí)值增加 1/2,特殊地,二分音符加符點(diǎn)時(shí)用“-”代替圓點(diǎn)。參見下表的描述。
在程序中定義一個(gè)音符結(jié)構(gòu)體tNote,有兩個(gè)數(shù)據(jù)成員:音名mName和時(shí)值mTime。
再使用該結(jié)構(gòu)體定義一個(gè)tNote型常量數(shù)表MyScore[ ],用來保存實(shí)際樂譜轉(zhuǎn)換成tNote格式的數(shù)據(jù)。
有了上述一點(diǎn)點(diǎn)樂譜基礎(chǔ)知識(shí),我們就可以很方便地編輯這個(gè)數(shù)表了。比如音符“3-”轉(zhuǎn)換為“{L3, T/2}”,音符“3.”轉(zhuǎn)換為“{M3, T/4+T/8}”,等等。感興趣的同學(xué)可以自行補(bǔ)充上面簡(jiǎn)譜中的內(nèi)容。
審核編輯:劉清
-
三極管
+關(guān)注
關(guān)注
143文章
3622瀏覽量
122246 -
驅(qū)動(dòng)電路
+關(guān)注
關(guān)注
153文章
1533瀏覽量
108679 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
893瀏覽量
46050
原文標(biāo)題:想用蜂鳴器聽個(gè)曲兒,你至少需要掌握這些知識(shí)!不來聽聽開發(fā)板播放的《梁祝》?
文章出處:【微信號(hào):精通單片機(jī)與嵌入式,微信公眾號(hào):精通單片機(jī)與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論