那么,今天分享的是利用蜂鳴器來演奏一些簡單的樂譜。
實驗平臺為stm32,當然51也完全可以做,其核心思想是相似的。
首先是對蜂鳴器的介紹。蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。
蜂鳴器包括有源蜂鳴器和無源蜂鳴器,有源蜂鳴器只要通上電就可以發聲,而無源蜂鳴器需要有一定頻率的脈沖才能發聲。
上圖為無源蜂鳴器電路,下圖為有源蜂鳴器電路。因為單片機的輸出電流很小,不能直接驅動蜂鳴器,所以用了三極管來放大電流。在上邊的電路中,當輸入高電平時,三極管導通,電流可以由3.3V電源流向蜂鳴器,當輸入低電平時,三極管截止,蜂鳴器與GND相連。通過單片機管腳輸出一段脈沖,即可讓蜂鳴器發聲。在下邊的電路中,只要輸入為低電平,三極管導通,蜂鳴器就可以發聲。
那么,蜂鳴器發出的聲音大小、音調高低和什么有關呢?聲音大小和輸入脈沖的占空比有關,占空比越大,聲音越大,而音調的高低和脈沖頻率有關,頻率越高,音調也就越高,通常讓輸出頻率為1.5~5kHZ。
接下來講解具體如何實現讓蜂鳴器演奏樂譜。
首先得對音樂簡譜有一定了解。本人對音樂簡譜也并不算很了解,如果要深入了解,請自行百度搜索。下面是我的一些粗略見解。
一首曲子包含音調和節拍。音調也就是平常我們說的音調,比如1,2,3,4,5,6,7。音調越來越高,音調還包括低音、中音、高音。而節拍就是一個調子唱多久,有的音拖的長一些,有的音就比較短。這兩個要素是今天編程的核心。
首先說音調,前面講到,音調的高低是和脈沖的頻率有關系的,這個關系已經有人將它做成了表格,下面截取一部分:
頻率與周期成倒數,在一個脈沖里面,讓一半為高電平,一半為低電平,而脈沖周期可以通過延時函數來確定,于是,編寫頻率發生函數。
while(1)
{
beep=!beep;
led1=0;
delay_us(music[k]);
}
其中在delay_us()這個函數里的輸入參數就可以根據樂譜然后查表得到,就是上面的半周期。 由于這個參數是隨著樂譜變化的,因此,我們可以把樂譜轉化之后的數據放到一個數組里面,持續地調用數組里的數據。
這樣,音調就解決了。 接下來解決節拍的問題。 其實要解決節拍的問題,無非就是要考慮music[k]多久刷新一次。 我們可以想象一下,如果music[k]是每隔固定的一段時間跳到下一個,那么造成的后果就是兩個音調之間的時間是一樣的,這樣聽起來肯定是非常怪的。 假設music[k]刷新的特別快,beep剛好發生一次翻轉,music[k]就發生了改變,這樣也是不行的,因為如果刷新這么快的話,它連一個完整的脈沖周期都沒有走完。 因此,music[k]應該要刷新慢一些,并且是隨著樂譜改變的。 刷新的慢,聽起來就會比較舒緩而已。
所以,我們可以采用定時器中斷來實現。 每次發生中斷,就讓數組里的數據跳到下一個,實現數據的刷新,同時,改變定時器裝載值,讓每次發生中斷所需的時間不一樣,這個時間就是由樂譜的節拍決定的。
實現函數
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update))
{
if(k
這樣也就完美解決了節拍的問題。 解決了這兩個問題,理論上我們可以把任何一首簡譜轉化為頻率(周期)和節拍(間隔時間)這兩個量,然后用數組保存好,這樣就可以通過蜂鳴器演奏出來了,當然,這需要花費很多的時間和精力,而且對于很多人來說,并不是很容易看懂簡譜。
于是,有了一款軟件可以比較方便的獲取這些數據,軟件截圖如下
曲譜存貯格式 unsigned char code MusicName{音高,音長,音高,音長...., 0,0}; 末尾:0,0 表示結束(Important)
音高由三位數字組成:
個位是表示 1~7 這七個音符
十位是表示音符所在的音區:1-低音,2-中音,3-高音;
百位表示這個音符是否要升半音: 0-不升,1-升半音。
音長最多由三位數字組成:
個位表示音符的時值,其對應關系是:
|數值(n): |0 |1 |2 |3 | 4 | 5 | 6
|幾分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-連音,2-頓音
百位是符點位: 0-無符點,1-有符點
調用演奏子程序的格式
Play(樂曲名,調號,升降八度,演奏速度);
|樂曲名 : 要播放的樂曲指針,結尾以(0,0)結束;
|調號(0-11) :是指樂曲升多少個半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
|演奏速度(1-12000):值越大速度越快;
這款軟件提取的信息比較豐富,如果要求不高的話,只要能夠大概使用一下就好。比如它生成的音高,如果我們只是用來延時的話,那么只要把它擴大或者縮小一定倍數,使它落在頻率(周期)區間(前面講到是1.5~5kHZ,換算成半周期就是100us~500us左右),這樣就可以比較簡單的利用了。
總結:用蜂鳴器演奏樂曲,主要是要把握住兩個核心。 一個是音調 ,這個通過改變脈沖頻率來實現,其實就是通過精確延時來改變脈沖周期。 另一個是節拍 ,節拍可以簡單理解為兩個音調之間的時間間隔,要控制不同的節拍,其實就是隔多長的時間去刷新前面的音調,那么可以通過定時器中斷來實現,定時的時間就是節拍長度,一旦發生中斷,就刷新前面的音調,同時,給定時器裝載一個新的值。
-
三極管
+關注
關注
142文章
3600瀏覽量
121649 -
報警器
+關注
關注
12文章
919瀏覽量
108715 -
蜂鳴器
+關注
關注
12文章
889瀏覽量
45869 -
有源蜂鳴器
+關注
關注
0文章
30瀏覽量
11607
發布評論請先 登錄
相關推薦
評論