【補檔_C51單片機】基於C51的蜂鳴器音樂盒工程源碼解析(可播放《打上花火》)


項目地址:https://gitee.com/daycen/c51-music-box
通過Keil uVision3打開即可使用
以前做的一些小硬件,現補檔至博客

1 功能及總體方案

1.1 功能描述

​ 一個可通過無源蜂鳴器播放任意預先編碼好的歌曲的基於51單片機設計的音樂盒。

​ 最小系統部分:由STC89S52單片機X接口連接晶振電路,RESET連接復位電路所構成的滿足最簡單應用的單片機系統。

​ 無源蜂鳴器驅動電路:由一個1K的分壓電阻與無源蜂鳴器串聯組成,作為系統的發聲源。

​ 軟件模塊:由計算得出的每個聲調的頻率數據數組、歌曲編碼數組、延時函數、定時器中斷函數以及主循環函數構成,用於改變無源蜂鳴器的發聲聲調。

1.2 系統組成及工作過程

系統組成框圖如下:

image-20210531191232675

2 硬件設計

2.1 硬件電路總體設計

image-20210531191222654

​ 單片機最小系統包括單片機、時鍾電路、復位電路與5V電源構成,時鍾電路提供的時鍾信號給單片機提供了一個時間基准。復位電路則是讓單片機回到原始狀態重新執行程序。

實物圖如下:

image-20210531191610728

image-20210531191623023

image-20210531191631723

image-20210531191641518

2.2 模塊電路設計

​ 播放一段音樂需要的是兩個元素,一個是音調,另一個是音符。首先要了解對應的音調,音調主要由聲音的頻率決定,同時也與聲音強度有關。對一定強度的純音,音調隨頻率的升降而升降;對一定頻率的純音、低頻純音的音調隨聲強增加而下降,高頻純音的音調卻隨強度增加而上升。另外,音符的頻率有所不同。音符的發音主要靠不同的音頻脈沖。利用單片機的內部定時器/計數器0,使其工作在模式1,定時中斷,然后控制P2.0引腳的輸出音樂。只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時間,利用定時器計時這個半周期時間,每當計時到后就將輸出脈沖的I/O反相,然后重復計時此半周期時間再對I/O反相,就可在I/O腳上得到此頻率的脈沖。

​ 音樂盒的設計采用STC89C52作為主控芯片,利用單片機內部定時器產生特定的音符頻率,控制節拍。

​ 音頻模塊選用無源蜂鳴器作為發聲源,因為它制作成本低,聲音頻率范圍寬,可高分貝的發出某些頻率的超聲波以及可以做出音符的效果。

PCB圖:

image-20210531191724878

image-20210531191746945

3 軟件設計

3.1 軟件總體設計

軟件的總流程圖如下

image-20210531191349797

3.2 主程序設計

​ 主程序的設計思路就是將一首樂曲分成三個變量來控制,分別是曲調、所在音區、時長。而控制曲調的因素即頻率又分成高八位和第八位兩個表,每演奏一個曲調,就根據該曲調的三個變量來取值。此外,x變量用於定義休止符,控制歌曲的不演奏(間斷)延時

3.3 各模塊程序設計

①音調頻率換算

​ 要想產生音頻脈沖信號,需要算出某音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時間。利用單片機定時器計時這個半周期的時間,每當計時到后就輸出脈沖的I/O口反相,這樣就在此I/O口上得到此脈沖的頻率。

​ 例如,若要產生C大調中的Re(頻率為587Hzs)的音頻脈沖,其音頻信號的脈沖周期T=1/587=1703.5775us,半周期時間為852us,因此總要令計時器計數=852us/1us=852,在每計數852時將I/O口反相,就可以得到Re這個音。按照這種方式可得到一張音符頻率對應的半周期數值表,如下圖

image-20210531191403281

②歌曲編碼

​ 為了能夠讓程序按照樂譜調用相應的音調數據發聲,於是這里我定義了一種編碼方式對樂譜進行轉換,每個音符的對應的編碼包含四個數字:第一個數代表第幾個音符(對應簡譜中的1234567);第二個數代表第幾個八度(音高);第三個數代表時長(以半拍為單位,在鋼琴簡譜中,音符的右邊有一個點代表1.5倍時長);第四個數僅定義為1或0,1表示休止符,間斷延時一個節拍而0則不進行任何操作(統一以1121編碼代表休止符);

​ 在本程序中,我一共寫入了兩首歌,分別是《打上花火》和《aLIEz》,在第一首歌播放完畢后會間隔3個節拍的時間播放下一首。特別說明的是,由於編碼參考的是鋼琴簡譜,故編碼表中部分時長為3的音符調整為了2目的是讓歌曲節奏快一些,且對我對雙手譜的復彈做了一定刪減以保證聽感。

③休止符間斷延時函數

​ 該函數由一組雙重循環構成,當數組遍歷到編碼為1121的休止符時,程序會延時a個半拍,模擬出樂譜上休止符的功能。

image-20210531191421791

④主延時函數

與休止符函數類似,主延時函數也由一組雙重循環構成,共延時t/2個節拍以控制蜂鳴器發聲的時長。此處僅延時t/2個節拍是為了加快歌曲節奏。

image-20210531191430065

⑤定時器中斷函數

該函數為T0中斷函數。根據圖3數值表找到的定時器的初始值被送入這里,無源蜂鳴器被驅動而發聲

image-20210531191442411

⑥音樂播放函數

該函數啟動T0, 由T0輸出方波去發音,並傳遞參數給圖5中的主延時函數,對節拍時長進行控制。

image-20210531191455882

⑦主函數

主程序流程圖如下

image-20210531191515812


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM