利用蜂鸣器播放音乐
????????我們知道,蜂鳴器可分為有源蜂鳴器和無源蜂鳴器,有源蜂鳴器內(nèi)置了頻率發(fā)生電路,因此其通電就能夠發(fā)出聲音,但是其頻率是固定的,而無源蜂鳴器內(nèi)部沒有頻率發(fā)生電路,需要外界給予頻率,因此適用于單片機(jī)控制使其發(fā)出不同的音調(diào)頻率。在這一點(diǎn)有源蜂鳴器是做不到的。現(xiàn)在就利用無源蜂鳴器播放不同的音樂。
無源蜂鳴器的原理圖:
?蜂鳴器發(fā)聲原理是電流通過電磁線圈,使電磁圈產(chǎn)生磁場來驅(qū)動(dòng)振動(dòng)膜發(fā)聲的。因此需要一定的電流才能驅(qū)動(dòng)它,而單片機(jī)I/O引腳輸出的電壓較小。單片機(jī)輸出的TTL電平基本驅(qū)動(dòng)不了蜂鳴器,因需要增加一個(gè)放大電路。這里用三極管作為放大電路。
由原理圖分析知:通過控制晶體三極管的導(dǎo)通和截止就可以控制蜂鳴器的開關(guān),因此通過控制GPIO_PB5引腳的高低電平的變化就可以控制三極管的導(dǎo)通截止。但是需要注意的是,在使用無源蜂鳴器時(shí),單純地給它高電平是不能使其導(dǎo)通的,這反而會(huì)時(shí)蜂鳴器中的項(xiàng)圈持續(xù)發(fā)熱,長時(shí)間甚至可能損壞蜂鳴器,因此我們必須保證在空閑的狀態(tài)下引腳的電平是高電平,使三極管截止。原理圖中加入了上拉電阻正是防止在空閑狀態(tài)下?lián)p壞蜂鳴器。
那么蜂鳴器能夠發(fā)出不同的聲音的原理是通過PWM波來驅(qū)動(dòng)實(shí)現(xiàn)的,通過調(diào)節(jié)PWM波的頻率就可以輸出不同的聲音。即引腳高低電平的變化,來產(chǎn)生頻率一定的方波進(jìn)而驅(qū)動(dòng)蜂鳴器,而通過延時(shí)長度就可控制其節(jié)奏。假設(shè)要產(chǎn)生1kHz的頻率,即每秒產(chǎn)生1000個(gè)振動(dòng)周期,也就是一個(gè)頻率周期就是1000us,所以通過控制方波高低電平的占空比就可以發(fā)出1kHz的音調(diào)頻率。
軟件實(shí)現(xiàn):
基于STM32固件庫函數(shù)控制蜂鳴器播放音樂
部分主要程序:
?
????????第一個(gè)枚舉用于定義各個(gè)音階對(duì)應(yīng)的頻率值,這樣封裝的目的是可以讓簡譜數(shù)組更易維護(hù),接下來就是定義的簡譜數(shù)組,只要按照簡譜結(jié)構(gòu)編寫數(shù)組,就可以讓單片機(jī)彈奏你的音樂。該數(shù)組有三部分組成,第一部分就是音調(diào),第二部分就是數(shù)字表示的延時(shí)節(jié)奏,最后是兩個(gè) 0,用于告訴單片機(jī),此時(shí)演奏完畢,退出演奏循環(huán)。用兩個(gè) 0 的目 的是,如果簡譜是一個(gè)節(jié)奏對(duì)應(yīng)一個(gè)延時(shí)的話,那么它是偶數(shù)個(gè)演奏單元,所以會(huì)用到最后 一個(gè)零,如果是奇數(shù)個(gè)演奏單元,就用到第一個(gè) 0 來標(biāo)識(shí)結(jié)束。結(jié)束狀態(tài)的控制也可以通過for循環(huán)控制。
通過下載調(diào)試最后能夠達(dá)到很好的效果,如果想要達(dá)到更佳的效果可以通過調(diào)試延時(shí)長度達(dá)到自己想要的效果。
?
?
?
總結(jié)
- 上一篇: 幽默:程序员10大口头禅,你都听过吗?
- 下一篇: python+html语音人物交互_将H