我的WAV播放器 自己可以說是一個資深的、水平十分有限的真正音樂愛好者,尤其對古典音樂以及國內經典歌曲和樂曲十分喜愛,對于目前流行歌壇則比較陌生。憑借自己的自控專業,從80年代的單板機(現在好多人沒見過和聽說過)、8位單片機、PLC、到現在的DCS都開發過,因此動手制作WAV播放器的想法由來已久。雖說原先使用過單片機編程,對C語言也比較熟悉,但比較論壇中的各種方案,認為一般的單片機難以處理和傳送WAV的龐大數據量。因此,選用了STM32F103RBT6為主控芯片、VS1053B作為解碼芯片、LCD1602為顯示器、SD卡(8G)。 為加快項目的進度,先采用模塊拼接,在春節后開始動工,終于在“五一”前夕初步完成各項軟件的調試。 下圖為各個模塊: 下圖為各模塊之間的接線表 各個模塊組裝后放入機箱中,接線比較亂。因第一階段的工作主要是軟件調試,因此未安裝DA解碼板(采用與VS1053B的I2S接口匹配的PCM1793解碼器和運放組成)。 面板按上、下、左、右、中布置了5個按鍵,這5個按鍵的功能在不同的界面上是不同的。 下圖為VS1053B的測試畫面。 各項功能測試完成后,表明模塊功能完好。RAM測試結果為“0x83ff”,確定了解碼芯片確實是VS1053B。為減少程序的字節數,測試完成后,將今后編程不再需要的測試函數和定義全部刪除(當然要做好備份)。 進行完整的程序設計……,最終完成。 下圖為開機畫面。 按下中間按鍵后,進入“菜單”界面,有3個選項: 1、next:進入下一級畫面; 2、音效調整:默認關閉; 3、高低音調整:默認高低音增益均為最大值。 采用按動左按鍵,閃爍光標在3個選項上循環移動。按下中間按鍵后,選定光標所在的選項。 采用默認值,可直接進入下一級畫面。 下圖為“音效調整”畫面。共有“關閉、最小、中等和最大”4個選項,通過左右按鍵,各個選項分別顯示,按下中間按鍵后進行確認,回到“菜單”界面。 下圖為“音調調整”畫面。通過按動左右鍵,閃爍光標在“低音”和“高音”之間移動,按上下鍵可以改變光標坐在選項的數值,按下中間按鍵后進行確認,回到“菜單”界面。 在“菜單”界面中,按下中間按鍵后進入到“選曲”界面。顯示SD卡的根目錄中存放的可播放的WAN文件總數。在設計上,最大數目為99首。通過上下按鍵可快速(±10)循環選曲,左右按鍵可逐個(±1)循環選曲,按下中間按鍵后進行確認,進入到“播放”界面 下圖為“播放”界面。 1、界面第一行分別顯示的是:正在播放的曲號、播放的剩余時間以及當前的音量值。在播放時按動上下鍵可改變音量(音量值為0~30),按動左右按鍵可進行前后換曲。 2、界面第二行分別顯示“傳輸速率”和“采樣頻率”。因1602的顯示量有限,程序設計時這些數據均使用整數定義,顯示中未包含小數。如下圖中的“采樣頻率”實際值應為“44.1kHz”。 播放時,從VS1053B模塊的耳機插孔傳出的聲音十分流暢,沒有卡頓現象。主要在播放程序上開辟了4096字節的緩沖區。首先從SD卡中一次讀出4096個字節的數據,存放在緩沖區中;再由緩沖區向VS1053B傳送數據,按照要求每次傳送32個字節。詳細指令網上都有。注意:SPI的讀寫操作一定要采用寄存器指令方式進行,生成的代碼量小,可加快程序的實時性;如果采用庫函數指令方式操作,由于代碼量較大,非常容易出現卡頓現象。 在程序設計中,為方便編寫,對大部分實時性要求不高的代碼,應采用庫函數指令。 在播放當中,按下中間按鍵時,退出播放。在畫面上閃爍的“>”的字符,提示關閉電源。 主要功能就介紹到這里。項目中使用程序大部分借鑒網上,自己主要在菜單和畫面顯示上進行了程序設計。 說實在的,第一次使用STM32,程序調試中出現了不少問題,逐一解決,終于完成全部程序的編寫和調試。 下一步,自己設計電路,將各個模塊(包含DA和功放)設計在一塊線路板上,電源部分為±15V,最終實現用高保真耳機欣賞無損WAV音樂。 |