王啟明 郭寧峰 周艷艷
摘要:通過對音樂頻譜儀原理的研究,利用STC8A4K60S2A12單片機(jī)控制技術(shù)、離散傅里葉變換快速算法,通過單片機(jī)內(nèi)置的ADC采集音頻信號,并將采集到的音頻信號轉(zhuǎn)換成數(shù)字信號。設(shè)計(jì)并實(shí)現(xiàn)一個音樂頻譜儀,通過LED點(diǎn)陣將音樂頻譜顯示出來。
關(guān)鍵詞:單片機(jī);傅里葉變換;LED點(diǎn)陣
中圖分類號:TP393? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2019)27-0211-02
時代在不斷發(fā)展,生活水平在不斷提高,人們在解決基本生活所需的同時,也更加注重對生活品質(zhì)的追求,音樂頻譜儀就是在這種追求之下的產(chǎn)物。它促進(jìn)了音樂的可視化,把原本只能“聽”的音樂,變得能夠“看”到,使音樂在給人聽覺享受的同時,也帶來視覺上的享受;幫助錄音師對錄制的音頻進(jìn)行加工處理,使音頻變得更加豐富,有層次感。更廣泛的,是它在家庭影院、卡拉OK等音響系統(tǒng)中,實(shí)時顯示音樂信號的頻譜將為音響系統(tǒng)增添不少色彩。本文設(shè)計(jì)并實(shí)現(xiàn)一個基于STC8A4K60S2A12單片機(jī)的音樂頻譜系統(tǒng),具有電路結(jié)構(gòu)簡單、易開發(fā)、生產(chǎn)成本低等特點(diǎn)。能夠較好地滿足人們在生活中的需求。
1 系統(tǒng)的基本結(jié)構(gòu)
本系統(tǒng)以STC8A4K60S2A12單片機(jī)為控制核心,利用其內(nèi)部集成的一個12位15通道的高速ADC轉(zhuǎn)換器收集來自外界的音頻信號,并將音頻信號(電信號)轉(zhuǎn)化為數(shù)字信號。通過快速傅里葉變換(FFT)對離散后的數(shù)字信號進(jìn)行處理和運(yùn)算。FFT計(jì)算出頻譜值以后,由LED頻譜顯示電路負(fù)責(zé)在單片機(jī)的控制下把頻譜直觀地顯示出來。此外,本系統(tǒng)還包括按鍵控制的開關(guān)和開始動畫等其他功能。
2 硬件設(shè)計(jì)
2.1復(fù)位電路
復(fù)位電路用來將中央處理器及其他功能模塊同時恢復(fù)到一個確切的初始狀態(tài),以備下次運(yùn)行時從該初始狀態(tài)重新開始。復(fù)位方式有手動按鈕復(fù)位、上電復(fù)位、積分型上電復(fù)位、看門狗型復(fù)位電路等。本系統(tǒng)采用的是手動按鈕的復(fù)位方式,并通過六引腳自鎖開關(guān)來作為系統(tǒng)的開關(guān)按鈕,以實(shí)現(xiàn)手動復(fù)位的功能。六引腳自鎖開關(guān)是一種雙刀雙擲開關(guān),引腳有2排,每排3個引腳,中間一根是公共端,對應(yīng)它左右兩個引腳一個常開一個常閉,另一排與此一樣,而且常開對常開,常閉對常閉。值得注意的是如果不把它們連接起來,它們就是完全獨(dú)立的兩組。
六引腳自鎖開關(guān)引腳圖如下:
2.2 STC8A4K60S2A12控制芯片
STC8A4K60S2A12單片機(jī)是一款宏晶科技公司生產(chǎn)的STC8系列單片機(jī),這種系列的單片機(jī)具有不需要外部晶振和外部復(fù)位的特點(diǎn),是以超強(qiáng)抗干擾、超低價、高速、低功耗為目標(biāo)的8051單片機(jī),在相同的工作頻率下,STC8系列單片機(jī)比傳統(tǒng)的8051約快12倍(速度快11.2~13.2倍),依次按順序執(zhí)行全部的111條指令,STC8系列單片機(jī)僅需147個時鐘,而傳統(tǒng)的8051則需要1944個時鐘。STC8系列單片機(jī)是STC8生產(chǎn)的單時鐘/機(jī)械周期(1T)的單片機(jī),是寬電壓、高速、高可靠、低功耗、強(qiáng)抗靜電、較強(qiáng)抗干擾的新一代8051單片機(jī)。它的指令代碼完全兼容傳統(tǒng)8051。因?yàn)镾TC8系列單片機(jī)的眾多優(yōu)點(diǎn),它常被用于學(xué)習(xí)和開發(fā)。
2.3模數(shù)轉(zhuǎn)換電路
STC8A4K60S2A12單片機(jī)內(nèi)置的ADC通過對模擬信號的量化和編碼來實(shí)現(xiàn)模數(shù)轉(zhuǎn)換。量化是將模擬信號(音頻信號)量程分成許多離散量級,并確定輸入信號所處的量級。編碼則是對每一個量級分配一個唯一數(shù)字碼,并確定與輸入信號所對應(yīng)的代碼。ADC轉(zhuǎn)換口位于單片機(jī)P1口,有12位15通道的高速ADC。其輸入電壓量程為0~Vcc,如果被測電壓大于ADC的輸入電壓,則需要在輸入ADC引腳之前加入電阻分壓和放大器電路。ADC的時鐘頻率范圍為SYSclk/2/1~SYSclk/2/16,每固定16個ADC時鐘可完成一次模數(shù)轉(zhuǎn)換。當(dāng)模數(shù)轉(zhuǎn)換完成后,12位的轉(zhuǎn)換結(jié)果會自動保存到寄存器ADC_RES和ADC_RESL中,以備后續(xù)使用。
2.4 LED顯示驅(qū)動
本設(shè)計(jì)采用74HC595芯片作為LED的顯示驅(qū)動。74HC595內(nèi)含8位串入,串/并出位移寄存器和8位三態(tài)輸出鎖存器(即具有高電平、低電平和高阻抗三種輸出狀態(tài))。寄存器和鎖存器分別有各自的時鐘輸入(SCLK和SLCK),都是上升沿有效。當(dāng)SCLK從低到高電平跳變時,串行輸入數(shù)據(jù)(SER)移入寄存器;反之,當(dāng)SLCK從低到高電平跳變時,寄存器的數(shù)據(jù)信息傳入鎖存器。清除端(CLR)的低電平只對寄存器復(fù)位(QS為低電平),而對鎖存器沒有影響。當(dāng)輸出允許控制(OE)為高電平時,并行的輸出(Q0~Q7)為高阻態(tài),而串行的輸出(QS)不受影響。數(shù)據(jù)信息從SER口送入74HC595,在每個SCLK的上升沿,SER口上的數(shù)據(jù)信息移入寄存器,在SCLK的第9個上升沿,數(shù)據(jù)信息開始從QS移出。如果把第1個74HC595的QH和第2個74HC595的SDA相接,數(shù)據(jù)信息就可以移入第2個74HC595中,按照上面的接法一個一個接下去,就可接任意多個(本設(shè)計(jì)接了3個)。數(shù)據(jù)信息全部送完后,會給SLCK一個上升沿,寄存器中的數(shù)據(jù)信息就會置入鎖存器,此時如果OE為低電平,數(shù)據(jù)信息就會從芯片的并口Q0~Q7輸出,把Q0~Q7與LED的8段相連,LED就可以實(shí)現(xiàn)顯示了。
3 軟件設(shè)計(jì)
3.1 開機(jī)動畫
很多電腦和手機(jī)的系統(tǒng)有含有開機(jī)動畫的模塊,它的作用是豐富系統(tǒng)功能、增加系統(tǒng)的娛樂性。擁有一個華麗漂亮的開機(jī)動畫,可以消除用戶在等待系統(tǒng)啟動時產(chǎn)生的焦慮,從而使用戶變得心情舒暢。本系統(tǒng)雖然啟動時間很短,但仍然添加了開機(jī)動畫模塊,以呈現(xiàn)更加炫酷的視覺效果。動畫實(shí)現(xiàn)的原理非常簡單,即利用人眼的余暉效應(yīng),快速顯示動作連續(xù)的“圖片”,就可以達(dá)到動畫的視覺效果。本系統(tǒng)中,利用取模軟件對畫好的圖形進(jìn)行取模,并將結(jié)果傳入代碼定義好的數(shù)組中存儲。通過每組數(shù)據(jù)的顯示和適當(dāng)?shù)难訒r,實(shí)現(xiàn)開機(jī)動畫的功能。
3.2 ACD程序
系統(tǒng)運(yùn)行時,首先是對ADC各寄存器的設(shè)置,對于ADC控制寄存器(符號為ADC_CONTR),它的主要功能是啟動AD轉(zhuǎn)換,遷擇通道,設(shè)置轉(zhuǎn)換頻率 ,查詢是否完成轉(zhuǎn)換等。本系統(tǒng)代碼進(jìn)行對ADC_CONTR中的ADC_START位和ADC_FLAG位的宏定義,以實(shí)現(xiàn)其自動清零和軟件清零的操作。具體代碼為:#define ADC_START (1<<6) //自動清零 #define ADC_FLAG? ?(1<<5) //軟件清零。通過ADC配置寄存器(符號為ADCCFG)中的SPEED位來控制ADC的轉(zhuǎn)換時間,SPEED[3:0]共有16種不同的模式,分別是0000至1111,不同的模式代表著不同的CUP時鐘數(shù)。本系統(tǒng)采用0010即CUP時鐘數(shù)為96就能滿足系統(tǒng)的要求。ADCCFG中的RESFMT位是用來控制ADC轉(zhuǎn)換結(jié)果格式的,本系統(tǒng)中通過將其置0來實(shí)現(xiàn)把轉(zhuǎn)換結(jié)果左對齊的設(shè)置,并由ADC_RES保存結(jié)果的高8位,ADC_RESL保存結(jié)果的低4位(結(jié)果的保存是自動的)。ADC轉(zhuǎn)換結(jié)束后,結(jié)果通過return語句返回給復(fù)數(shù)的實(shí)部,以用于FFT程序的操作。
3.3 FFT算法
FFT算法是離散傅里葉變換(DFT)的快速算法。于1965年由J.W.庫利和T.W.圖基提出。采用這種算法能使計(jì)算機(jī)計(jì)算離散傅里葉變換所需要的乘法次數(shù)大為減少。特別的,被變換的抽樣點(diǎn)數(shù)N越多,F(xiàn)FT算法計(jì)算量的節(jié)省就越顯著。
該算法的核心部分是關(guān)于蝶形算法的運(yùn)算。對于點(diǎn)數(shù)為N = 2^L的FFT運(yùn)算,可以分解為L階蝶形圖級聯(lián),每一階蝶形圖內(nèi)又分為M個蝶形組,每個蝶形組內(nèi)包含K個蝶形。根據(jù)這一點(diǎn)我們就可以構(gòu)造三層循環(huán)來實(shí)現(xiàn)蝶形運(yùn)算。另外,蝶形算法還涉及了復(fù)數(shù)的乘法和加法等運(yùn)算,在編寫程序過程中,需要把復(fù)數(shù)的運(yùn)算轉(zhuǎn)化為實(shí)數(shù)運(yùn)算。
3.4 LED顯示程序
因?yàn)闊o法同時控制所有LED燈的亮滅,所以我們退而求其次,先對第一行的LED燈輸入亮滅數(shù)據(jù)。當(dāng)處于亮狀態(tài)的LED燈保持一定時間后,再對第二行的LED燈傳入控制亮滅的數(shù)據(jù),以此類推,直至對每一行LED燈都傳入了數(shù)據(jù)。當(dāng)最后一行結(jié)束后,就重新回到第一行,重復(fù)循環(huán)上面的操作。根據(jù)人眼的余暉效應(yīng),當(dāng)循環(huán)速度達(dá)到每秒24次及以上時,人們就可以看到連續(xù)的動態(tài)效果。
4 結(jié)束語
本文提出了一種設(shè)計(jì)簡單、應(yīng)用場景廣泛的音樂頻譜儀系統(tǒng),該系統(tǒng)以STC8A4K60S2A12單片機(jī)為控制核心,將原本只能聽的音樂通過生動的影像展現(xiàn)出來,豐富了人們的視聽體驗(yàn)。該設(shè)為物聯(lián)網(wǎng)基礎(chǔ)應(yīng)用實(shí)訓(xùn)項(xiàng)目,通過該項(xiàng)目的設(shè)計(jì),增加了學(xué)生對物聯(lián)網(wǎng)的理解,為進(jìn)進(jìn)入物聯(lián)網(wǎng)領(lǐng)域打開了大門。
參考文獻(xiàn):
[1] 郭天祥51單片機(jī)C語言教程[M].北京:電子工業(yè)出版社,2009.
[2] 李逸家.基于51單片機(jī)的LED點(diǎn)陣音樂頻譜顯示器[J].工業(yè)控制計(jì)算機(jī),2015,28(04):137-138,140.
[3] 陳蘭,江朋友,閃靜潔.基于單片機(jī)的多功能音樂頻譜儀的設(shè)計(jì)與實(shí)現(xiàn)[J].科技視界,2018(7):45-46.
[4] FFT在單片機(jī)上的實(shí)現(xiàn)畢業(yè)設(shè)計(jì)[D].洛陽:河南科技大學(xué),2013.
[5] 陳特放,吳繼發(fā).單片機(jī)實(shí)現(xiàn)音頻頻譜顯示的快速算法研究[J].電子工程設(shè)計(jì),2009,17(11).
【通聯(lián)編輯:唐一東】