版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第11章聲音及其控制11.1發(fā)聲器件及其驅(qū)動(dòng)11.2音調(diào)與節(jié)拍11.3單片機(jī)音樂設(shè)計(jì)11.4設(shè)計(jì)課目與演練——演奏《兩只老虎》小結(jié)習(xí)題
本章首先介紹蜂鳴器發(fā)聲驅(qū)動(dòng)電路,然后從單片機(jī)的角度把音樂的控制拆分成音調(diào)和節(jié)拍的控制,而后給出的電子琴設(shè)計(jì)和音樂演奏則是從不同的角度來應(yīng)用音調(diào)發(fā)聲方案,并給出實(shí)例設(shè)計(jì)。11.1發(fā)聲器件及其驅(qū)動(dòng)聲音是一種音頻振動(dòng)的效果,振動(dòng)的頻率高則為高音,振動(dòng)的頻率低則為低音。音頻的范圍為20Hz~200kHz,人耳容易辨識(shí)的聲音的頻率大概是200Hz~20kHz。11.1.1發(fā)聲器件及其分類方式
1.發(fā)聲器件單片機(jī)控制的常見的發(fā)聲器件是蜂鳴器。常見的蜂鳴器如圖11-1所示。
2.分類方式
(1)蜂鳴器按動(dòng)作原理分為電磁式蜂鳴器和壓電式蜂鳴器兩種類型。
電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動(dòng)膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過電磁線圈,使電磁線圈產(chǎn)生磁場,振動(dòng)膜片在電磁線圈和磁鐵的相互作用下,周期性地振動(dòng)發(fā)聲。
壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。多諧振蕩器由晶體管或集成電路構(gòu)成。接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHz的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。壓電式蜂鳴器需要較高的電壓,但是功耗低;電磁式蜂鳴器在1.5V就可以達(dá)到85dB以上的音壓,但是電流較大。
(2)蜂鳴器按驅(qū)動(dòng)原理又分為自激和他激兩種方式:自激式只需要通直流電即響;他激式則需要提供脈沖電壓驅(qū)動(dòng)發(fā)聲。圖11-1常見的蜂鳴器11.1.2發(fā)聲驅(qū)動(dòng)電路及程序
1.自激驅(qū)動(dòng)電路自激式蜂鳴器驅(qū)動(dòng)電路如圖11-2所示。這種電路只需要由P1.0的高、低電平來控制發(fā)聲和停止,P1.0置高,則蜂鳴器通電并以固有頻率發(fā)聲;否則停止。讓蜂鳴器連續(xù)發(fā)出“滴滴”聲的程序如下:
LOOP:SETB P1.0
;發(fā)聲
ACALL DELAY ;延時(shí)程序
CLR P1.0
;取反輸出,關(guān)閉聲音
ACALL DELAY ;延時(shí)程序
SJMP LOOP ;返回繼續(xù)驅(qū)動(dòng)發(fā)聲雖然蜂鳴器具有固有頻率,但也可以加載不同頻率的方波以產(chǎn)生不同的音調(diào),從而編制一些簡單的音樂。圖11-2自激式蜂鳴器驅(qū)動(dòng)電路
2.他激驅(qū)動(dòng)電路他激式蜂鳴器驅(qū)動(dòng)電路如圖11-3所示。這種電路需要P1.0輸出方波控制,通過調(diào)節(jié)方波的頻率可以調(diào)節(jié)音調(diào),而調(diào)節(jié)方波的占空比則可以調(diào)節(jié)音量。通常使用定時(shí)中斷產(chǎn)生驅(qū)動(dòng)聲音的方波,每次中斷取反喇叭控制端,這里是取反P1.0。例如:
T0_ISR: CLRTR0 ;關(guān)定時(shí)器
CPLP1.0 ;取反,所以兩次中斷對(duì)應(yīng)一個(gè)周期
MOVTH0,#DATAH ;高8位重載
MOVTL0,#DATAL ;低8位重載
SETBTR0 ;重啟定時(shí)器
RETI ;中斷返回圖11-3他激式蜂鳴器驅(qū)動(dòng)電路11.2音?調(diào)?與?節(jié)?拍利用單片機(jī)演奏的音樂基本上都是單音頻率,它不包含相應(yīng)幅度的諧波頻率,也就是說不能像電子琴那樣能奏出多種音色的聲音。因此,單片機(jī)奏樂只需弄清楚兩個(gè)概念,就是“音調(diào)”和“節(jié)拍”。
音調(diào)表示一個(gè)音符唱多高的頻率。
節(jié)拍表示一個(gè)音符唱多長的時(shí)間。11.2.1音調(diào)及其控制
1.音調(diào)在音樂中所謂的“音調(diào)”,其實(shí)就是我們常說的“音高”。在音樂中常把中音C上方的A音定為標(biāo)準(zhǔn)音高,其頻率f?=?440Hz。當(dāng)兩個(gè)聲音信號(hào)的頻率相差一倍時(shí),也即f2=2f1時(shí),稱f2比f1高一個(gè)倍頻程。在音樂中,1(do)與,2(來)與,…,正好相差一個(gè)倍頻程,在音樂學(xué)中稱為相差一個(gè)八度音。在一個(gè)八度音內(nèi),有12個(gè)半音。以1~八音區(qū)為例,12個(gè)半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4、#4—5、5—#5、#5—6、6—#6、#6—7、7—。由于人耳的聽覺效果,這12個(gè)音階的分度基本上是以對(duì)數(shù)關(guān)系來劃分的,只要知道了這12個(gè)音符的音高,也就是其基本音調(diào)的頻率,我們就可根據(jù)倍頻程的關(guān)系得到其他音符基本音調(diào)的頻率。知道了一個(gè)音符的頻率后,怎樣讓單片機(jī)發(fā)出相應(yīng)頻率的聲音呢?常采用的方法就是通過單片機(jī)的定時(shí)器定時(shí)中斷,將單片機(jī)上對(duì)應(yīng)蜂鳴器的I/O口反復(fù)取反,或者說反復(fù)按規(guī)律清零、置位,從而讓蜂鳴器發(fā)出聲音。為了讓單片機(jī)發(fā)出不同頻率的聲音,只需將定時(shí)器預(yù)置不同的定時(shí)值就可實(shí)現(xiàn)。
2.音調(diào)的產(chǎn)生與控制那么,怎樣確定一個(gè)頻率所對(duì)應(yīng)的定時(shí)器的定時(shí)值呢?以標(biāo)準(zhǔn)音高A為例。
A的頻率fA=440Hz,其對(duì)應(yīng)的周期為
如圖11-4所示,單片機(jī)上對(duì)應(yīng)蜂鳴器的I/O口來回取反的時(shí)間應(yīng)為 ①②圖11-4標(biāo)準(zhǔn)音高波形分析這個(gè)時(shí)間t也就是單片機(jī)定時(shí)器應(yīng)有的中斷觸發(fā)時(shí)間。一般情況下,單片機(jī)奏樂時(shí),其定時(shí)器為工作方式1,它以振蕩器的十二分頻信號(hào)為計(jì)數(shù)脈沖。設(shè)單片機(jī)振蕩器頻率為fosc,則定時(shí)器的預(yù)置初值可由下式來確定:
將式①、②代入式③,得:變形得:③式中,N為定時(shí)器待確定的計(jì)數(shù)初值。因此,定時(shí)器的高、低計(jì)數(shù)器的初值為:
已知fA?=?440Hz,假設(shè)fosc?=?12MHz,則可求出標(biāo)準(zhǔn)音高A在單片機(jī)晶振頻率f0?=?12MHz、定時(shí)器在工作方式1下的定時(shí)器高、低計(jì)數(shù)器的預(yù)置初值為:(“/”表示整除,取高8位)(“%”表示求余,取低8位)根據(jù)上面的求解方法,我們就可求出其他音調(diào)相應(yīng)的計(jì)數(shù)器的預(yù)置初值。這里給出部分音符的頻率以及單片機(jī)晶振fosc=12MHz、定時(shí)器工作在方式1時(shí)計(jì)數(shù)器的初值設(shè)置,如表11-1所示。表11-1音調(diào)、頻率和計(jì)數(shù)器初值對(duì)照表
3.音調(diào)實(shí)例如要控制某一個(gè)音調(diào)發(fā)聲,只需設(shè)置該音調(diào)對(duì)應(yīng)的定時(shí)器初值,然后啟動(dòng)定時(shí)器即可,這里采用的是中斷模式。當(dāng)然也可以采用延時(shí)方式,但是該方式會(huì)占用大量的MCU資源,讀者可以自己嘗試使用延時(shí)方式。下面這段程序可以產(chǎn)生中音Do:
ORG0000H LJMPSTART ORG000BH LJMPT0_ISR
DO_H EQU 0FCH ;Do音對(duì)應(yīng)定時(shí)器初值的高8位
DO_L EQU 43H ;Do音對(duì)應(yīng)定時(shí)器初值的低8位
SPK BITP1.0 ;對(duì)應(yīng)喇叭控制端
START: MOVSP,#60H
MOVTMOD,#01H ;T0方式1,16位
MOVTH0,#DO_H ;裝載高8位初值
MOVTL0,#DO_L ;裝載低8位初值
MOVIE,#82H ;開定時(shí)器T0中斷,開中斷
SETBTR0 ;啟動(dòng)定時(shí)器
JMP$
T0_ISR: CLRTR0 ;關(guān)定時(shí)器
CPLSPK ;取反喇叭控制腳
MOVTH0,#DO_H ;重載定時(shí)器初值
MOVTL0,#DO_L SETBTR0 ;重新啟動(dòng)定時(shí)器
RETI END在程序運(yùn)行過程中,只需改變定時(shí)器的初值,就可以改變音調(diào)。如果需要設(shè)置的音調(diào)較多,則可把音調(diào)對(duì)應(yīng)的初值按照一定的順序放入一個(gè)表格中,然后在程序中執(zhí)行查表操作,動(dòng)態(tài)地裝載初值。下面這個(gè)程序完成的功能是:間隔0.5秒,依次產(chǎn)生中音里面的Do,Re,…,Si。
ORG0000H LJMPSTART ORG000BH ;?T0中斷入口
LJMPT0_ISR ORG001BH ;?T1中斷入口
LJMPT1_ISR ORG0100H
SPK EQU P1.0
;用于喇叭電平信號(hào)控制
TONESTOPEQU 00H
;音調(diào)結(jié)束標(biāo)志
S005H EQU 15H
;?T1定時(shí)0.05秒初值高8位
S005L EQU 0A0H
;?T1定時(shí)0.05秒初值低8位
S005CT EQU 0AH
;?T1中斷10次即0.5秒
START: MOVSP,#60H
;初始化程序段
MOVTMOD,#11H
;都設(shè)置為方式1,16位計(jì)數(shù)器
MOVTH1,#S005H
;初始化T1 MOVTL1,#S005L MOVR3,#S005CT CLRA ;初始化T0 MOVR2,A MOVDPTR,#TONE MOVCA,@A+DPTR ;第一次取數(shù)
MOVTH0,A ;先高8位
MOV20H,A ;同時(shí)保存
INCR2 MOVA,R2 MOVCA,@A+DPTR ;第二次取數(shù)
MOVTL0,A ;后低8位
MOV21H,A ;同時(shí)保存
MOVIE,#8AH ;允許T0、T1的中斷,開中斷
MOVTCON,#50H ;同時(shí)啟動(dòng)T0、T1 SJMP$
T0_ISR: ;用于產(chǎn)生音調(diào)方波
CLRTR0 CPLSPK MOVA,20H ;至于是哪一個(gè)音調(diào)的波形
MOVTH0,A ;則決定于20H21H單元中的值
MOVA,21H MOVTL0,A SETBTR0 RETI
T1_ISR: ;用于0.5秒的定時(shí),每次中斷0.05秒
CLRTR1 DJNZR3,OUT ;所以需要中斷10次
MOVR3,#S005CT;時(shí)間到后,重新修改R3計(jì)數(shù)值
INCR2 ;并且也需要重新修改音調(diào)
MOVA,R2 ;對(duì)應(yīng)的T0計(jì)數(shù)器初值
MOVCA,@A+DPTR JNZCONTINUE ;判斷音調(diào)是否已經(jīng)全部讀完
MOVR2,#00H ;如果是,則重新初始化音調(diào)指針
SJMPOUT
CONTINUE:MOV20H,A ;當(dāng)前音調(diào)對(duì)應(yīng)初值的高8位
INCR2 MOVA,R2 MOVCA,@A+DPTR MOV21H,A ;當(dāng)前音調(diào)對(duì)應(yīng)初值的低8位
OUT: SETBTR1 ;重新啟動(dòng)T1 RETI
TONE:
;=======================================================
DB
0FCH,43H,
0FCH,78H,
0FCH,0ABH,
0FCH,0DBH
; Do
Do#
Re
Re#
;================================================
=======
DB
0FDH,08H,
0FDH,33H,
0FDH,5BH, 0FDH,81H
; Mi Fa
Fa#
So
;=======================================================
DB
0FDH,0A5H,
0FDH,0C7H,
0FDH,0E7H,
0FEH,05H
; So# La La# Si
;================================================
=======
DBTONESTOP ;停止位
;======================================================= END進(jìn)一步:
T0中斷只是負(fù)責(zé)依據(jù)20H21H的值產(chǎn)生中斷,在P1.0上生成驅(qū)動(dòng)音調(diào)的方波。
T1每隔0.05秒中斷一次,所以中斷10次為0.5秒。
每隔0.5秒都要修改音調(diào)參數(shù)指針,指向下一個(gè)音調(diào),并且重新加載產(chǎn)生該音調(diào)需要的初值。
對(duì)于0.5秒的控制,也可以采用延時(shí)方式,這里不給出實(shí)例,請(qǐng)讀者繼續(xù)發(fā)揮。
思考:①T0和T1的中斷里面,指令CLRTRx(TR0、TR1)是必需的嗎?試作出分析。②在處理T1的isr過程中,會(huì)不會(huì)影響T0的計(jì)數(shù)?會(huì)不會(huì)影響T0的isr?對(duì)于產(chǎn)生頻率的精度會(huì)產(chǎn)生影響嗎?③如果在修改20H或者21H單元的過程中發(fā)生T0中斷,則有可能導(dǎo)致初值賦值錯(cuò)誤,從而會(huì)使發(fā)聲系統(tǒng)混亂。分析本程序的安全性。11.2.2節(jié)拍及其控制
1.節(jié)拍在一張樂譜中,我們經(jīng)常會(huì)看到這樣的表達(dá)式,如1?=?C、1?=?G等。這里,1?=?C,1?=?G表示樂譜的曲調(diào),和我們前面所談的音調(diào)有很大的關(guān)聯(lián);、則用來表示節(jié)拍。以為例加以說明,它表示樂譜中以四分音符為節(jié)拍,每一小節(jié)有三拍。比如:其中,1、2為一拍,3、4、5為一拍,6為一拍,共三拍。1、2的時(shí)長分別為四分音符的一半,即為八分音符長;3、4的時(shí)長分別為八分音符的一半,即為十六分音符長;5的時(shí)長為四分音符的一半,即為八分音符長;6的時(shí)長為四分音符長。
2.節(jié)拍的產(chǎn)生與控制那么一拍到底該唱多長時(shí)間呢?一般說來,如果樂曲沒有特殊說明,則一拍的時(shí)長大約為400~500ms。以一拍的時(shí)長為400ms為例,當(dāng)以四分音符為節(jié)拍時(shí),四分音符的時(shí)長就為400ms,八分音符的時(shí)長就為200ms,十六分音符的時(shí)長就為100ms??梢?,在單片機(jī)上控制一個(gè)音符唱多長可采用循環(huán)延時(shí)的方法來實(shí)現(xiàn)。首先,我們確定一個(gè)基本時(shí)長的延時(shí)程序,比如說以十六分音符的時(shí)長為基本延時(shí)時(shí)間。那么,對(duì)于一個(gè)音符,如果它為十六分音符,則只需調(diào)用一次延時(shí)程序;如果它為八分音符,則只需調(diào)用二次延時(shí)程序;如果它為四分音符,則只需調(diào)用四次延時(shí)程序,依次類推。這種控制方法比較簡單,不再單獨(dú)給出實(shí)例,在下面的應(yīng)用中會(huì)有介紹。注:在上一節(jié)的音調(diào)產(chǎn)生實(shí)例中,我們使用定時(shí)器1產(chǎn)生0.05秒的控制時(shí)間。如果把每次中斷的時(shí)間修改為整首音樂中的最小音符時(shí)長,那么控制其它音符節(jié)拍的方法就變成了控制中斷次數(shù)的問題。因此,這里沒有單獨(dú)安排節(jié)拍的實(shí)例。11.3單片機(jī)音樂設(shè)計(jì)根據(jù)上面關(guān)于音符的音調(diào)和節(jié)拍的確定方法,我們只要把音調(diào)和節(jié)拍數(shù)據(jù)輸入給單片機(jī),就可以在單片機(jī)上演奏音樂了。11.3.1單片機(jī)演奏音樂的方法單片機(jī)演奏音樂的具體實(shí)現(xiàn)方法為:將樂譜中的每個(gè)音符的音調(diào)及節(jié)拍變換成相應(yīng)的音調(diào)參數(shù)和節(jié)拍參數(shù),將這些參數(shù)作為音符參數(shù)做成數(shù)據(jù)表格,存放在存儲(chǔ)器中;通過程序取出一個(gè)音符的相關(guān)參數(shù),播放該音符;該音符唱完后,接著取出下一個(gè)音符的相關(guān)參數(shù),……,如此直到播放完畢最后一個(gè)音符(根據(jù)需要也可循環(huán)不停地播放整個(gè)樂曲)。對(duì)于樂曲中的休止符,一般將其音調(diào)參數(shù)設(shè)為FFH,其節(jié)拍參數(shù)與其他音符的節(jié)拍參數(shù)確定方法一致;樂曲結(jié)束用節(jié)拍參數(shù)為00H來表示。這一節(jié),我們利用簡譜編程實(shí)現(xiàn)一個(gè)音樂演奏程序,使用的電路仍如圖11-2所示,用P1.0驅(qū)動(dòng)發(fā)聲。由于用到的音符較少,因此干脆把音調(diào)和節(jié)拍的定義放到了一個(gè)字節(jié)中:高4位表示音調(diào)碼,用于索引TONE地址處的音調(diào)設(shè)置初值;低4位代表節(jié)拍碼,用于表示基準(zhǔn)延時(shí)(八分之一拍)的倍數(shù)。我們研究的重點(diǎn)是在程序中如何配合使用音調(diào)和節(jié)拍。程序如下:
ORG0000H LJMPSTART ORG000BH ;T0中斷入口地址
LJMPT0_ISR ;跳至T0中斷子程序 ORG0100H
START: MOVSP,#60H MOVTMOD,#01H ;T0定時(shí)方式1,16位
MOVIE,#82H
;中斷使能,定時(shí)器0開中斷
GOON: MOV30H,#00 ;取簡譜碼指針初始化
NEXT: MOVA,30H ;簡譜碼指針載入A MOVDPTR,#MUSIC ;取簡譜碼
MOVCA,@A+DPTR; MOVR2,A ;簡譜碼暫存于R2 JZSTP ;是否結(jié)束碼00 ANLA,#0FH ;不是,則取低4位(節(jié)拍碼) MOVR5,A ;將節(jié)拍碼存入R5 MOVA,R2
;將取到的簡譜碼再載入A
SWAPA ;高低4位交換
ANLA,#0FH ;取出高4位(音調(diào)碼) JNZSONG ;取到的音符碼是否為0?
CLRTR0 ;為零,則不發(fā)音
SJMPD1 ;跳至D1
SONG: DECA ;取到的音調(diào)碼減1 ;因?yàn)橐粽{(diào)碼從1開始,
;而存放音調(diào)的地址偏移量是從0開始
MOV22H,A ;存入(22H),?Temp單元
RLA ;乘2 MOVDPTR,#TONE ;至TABLE1取相對(duì)的高位字節(jié)計(jì)數(shù)值
MOVCA,@A+DPTR
MOVTH0,A ;取到的高位字節(jié)存入TH0 MOV21H,A ;取到的高位字節(jié)存入(21H) MOVA,22H ;再載入取到的音符碼
RLA ;乘2 INCA ;加1 MOVCA,@A+DPTR ;至TABLE1取相對(duì)的低位字節(jié)計(jì)數(shù)值
MOVTL0,A ;取到的低位字節(jié)存入TL0 MOV20H,A ;取到的低位字節(jié)存入(20H) SETBTR0 ;啟動(dòng)TIMER0D1: LCALLDELAY ;基本單位時(shí)間1/4拍125ms DJNZR5,D1 ;節(jié)拍控制
INC30H ;取簡譜碼指針加1 JMPNEXT ;取下一個(gè)簡譜碼
STP: CLRTR0 ;停止T0 JMPGOON ;重復(fù)循環(huán)
T0_ISR: PUSHACC ;保護(hù)現(xiàn)場
PUSHPSW MOVTL0,20H ;重設(shè)計(jì)數(shù)值
MOVTH0,21H CPL P1.0 ;控制蜂鳴器發(fā)聲
POP PSW POPACC ;恢復(fù)現(xiàn)場
RETI
DELAY: MOVR7,#02H ;?1μs
D2: MOVR4,#7DH ;?1μs
D3: MOVR3,#0F8H ;?1μs DJNZR3,$ ;?2μs
DJNZR4,D3 ;?2μs DJNZR7,D2 ;?2μs RET ;?2μs
;所以這段延時(shí)程序的延時(shí)時(shí)間為
;?1+(1+(1+2*R3+2)*R4+2)*R7
;?1+(1+(1+2*0F8H+2)*7DH+2)*02H
;約為125ms,即0.125s
TONE: ;決定音調(diào)
DW0FB04H,0FB90H,0FC09H,0FC44H
DW0FCACH,0FD08H,0FD33H,0FD81H
DW0FDC8H,0FE06H,0FB22H,0FE56H
DW0FE85H,0FE9AH,0FEC1H
MUSIC: ;樂曲名稱《梁?!?/p>
DB02H,82H,62H,52H,48H,02H,52H,32H,22H,18H
DB83H,91H,72H,62H,51H,61H,71H,61H,83H,61H
DB81H,51H,61H,71H,61H,51H,46H,82H,32H,52H
DB22H,42H,16H,21H,41H,18H,0E4H,13H,21H,43H
DB51H,21H,41H,12H,83H,81H,61H,81H,58H,53H
DB61H,31H,22H,13H,21H,42H,52H,0E2H,42H,21H
DB11H,91H,41H,18H,63H,81H,32H,52H,21H,41H
DB16H,0E4H,11H,21H,31H,51H,26H,11H,21H,43H
DB51H,82H,62H,52H,61H,51H,42H,21H,11H,0E4H
DB44H,21H,41H,21H,11H,0E1H,11H,21H,41H,18H
DB61H,81H,51H,61H,51H,41H,32H,21H,41H,18H
DB08H,0H,04H
DB00H ;樂曲結(jié)束
END進(jìn)一步分析:
這個(gè)程序的節(jié)拍控制使用延時(shí)方式設(shè)計(jì)(前面的程序已經(jīng)演示了如何使用中斷方式設(shè)計(jì)節(jié)拍),而音調(diào)控制則采用中斷形式。
這里對(duì)音符碼的操作方式做一分析:首先由MUSIC表中獲得音符碼;拆分成高8位的音調(diào)碼和低8位的節(jié)拍碼;由音調(diào)碼查詢TONE表獲得對(duì)應(yīng)的音調(diào)數(shù)據(jù),設(shè)置T0開始中斷產(chǎn)生對(duì)應(yīng)音調(diào);由節(jié)拍碼控制DELAY的延時(shí)次數(shù);本次音符發(fā)聲完畢后,再取下一個(gè)音符碼,直至遇到結(jié)束碼:00H。
在這個(gè)程序中,發(fā)聲的時(shí)間是在程序內(nèi)部已經(jīng)設(shè)置好的。如要由按鍵來控制發(fā)聲的時(shí)間和音調(diào),則就變成了下一節(jié)所要介紹的內(nèi)容。11.3.2單片機(jī)彈奏音樂設(shè)計(jì)——簡易電子琴簡易電子琴的電路比較簡單,如圖11-5所示。
1.電路分析
本電路使用12MHz的晶振,機(jī)器周期為1μs。
信號(hào)輸出端是P1.0。
功率驅(qū)動(dòng)采用LM386,當(dāng)SPK輸入方波時(shí),可以給喇叭足夠的功率驅(qū)動(dòng)。
P2口內(nèi)部有上拉電阻,所以排阻RESP1可以不用。
2.功能設(shè)定設(shè)計(jì)有8個(gè)按鍵S1、S2、…、S8,按鍵S1對(duì)應(yīng)中音Do,S2對(duì)應(yīng)中音Re,…,按鍵S7對(duì)應(yīng)中音Si,按鍵S8對(duì)應(yīng)高音Do,對(duì)應(yīng)關(guān)系如表11-2所示。圖11-5簡易電子琴設(shè)計(jì)電路表11-2簡易電子琴按鍵參數(shù)設(shè)置
3.程序設(shè)計(jì)按鍵采用循環(huán)掃描方式,當(dāng)檢測到有按鍵時(shí),則對(duì)應(yīng)的裝載音調(diào)數(shù)據(jù)開始發(fā)聲;當(dāng)檢測到無按鍵時(shí),則清除TR0,關(guān)閉聲音。音調(diào)數(shù)據(jù)(定時(shí)器初值)被放入表格TONE中,數(shù)據(jù)對(duì)應(yīng)關(guān)系如表11-2所示。讀者也可以到表11-1中查詢,并加以修改或擴(kuò)展。
ORG0000H LJMPSTART ORG000BH LJMPT0_ISR ORG0100H
SPK EQUP1.0 ;喇叭控制端
KEY EQUP2 ;按鍵輸入端口
START: MOVSP,#60H MOVTMOD,#01H;T0工作于定時(shí)器方式1,
16位
MOVKEY,#0FFH;把按鍵端口設(shè)置為輸入模式
MOVDPTR,#TONE;音調(diào)對(duì)應(yīng)初值表地址初始化
CLRF0
;清除是否已經(jīng)響應(yīng)按鍵標(biāo)志
MOVIE,#82H
;開定時(shí)器0中斷,開中斷
KEY_CK: MOVA,KEY
;讀取按鍵
CPLA
;取反后
JNZKEY_PROC
;如果不全部為0,則有按鍵
CLRF0
;如果無按鍵,則清除按鍵標(biāo)志
CLRTR0 ;關(guān)閉定時(shí)器
CLRSPK ;并且關(guān)閉喇叭
SJMPKEY_CK ;重新檢測按鍵
KEY_PROC:JBF0,KEY_CK ;首先判斷是否已經(jīng)響應(yīng)該按鍵
SETBF0 ;設(shè)置已經(jīng)響應(yīng)標(biāo)志
CLRTR0 ;設(shè)置初值時(shí)先關(guān)閉定時(shí)器
MOVR0,#00H ;用于獲取對(duì)應(yīng)的音調(diào)存放指針
C_TEST: RRCA ;帶進(jìn)位右移
JCGET_TONE ;判斷是否已經(jīng)找到按鍵
INCR0 ;否則繼續(xù)修改指針
SJMPC_TEST ;繼續(xù)檢測
GET_TONE:MOVA,R0 ;先要修改指針,因?yàn)榘醋执娣?/p>
RLA ;所以要先乘以2
PUSHA ;保存當(dāng)前音調(diào)指針
MOVCA,@A+DPTR ;取高8位
MOV20H,A POPA ;恢復(fù)當(dāng)前音調(diào)指針
INCA ;指向下一個(gè)字節(jié)
MOVCA,@A+DPTR ;再取低8位
MOV21H,A SETBTR0 ;重新開定時(shí)器,開始發(fā)聲
SJMPKEY_CK ;繼續(xù)監(jiān)測按鍵狀態(tài)T0_ISR: CLRTR0 ;中斷完成音調(diào)發(fā)聲
CPLSPK ;輸出方波
MOVA,20H ;取出高8位
MOVTH0,A
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- (新教材)2026年滬科版七年級(jí)上冊(cè)數(shù)學(xué) 3.5 二元一次方程組的應(yīng)用 課件
- (新教材)2026年滬科版八年級(jí)下冊(cè)數(shù)學(xué) 17.4 一元二次方程的根與系數(shù)的關(guān)系 課件
- 崇義中學(xué)高一下學(xué)期第一次月考化學(xué)試題
- 2025年辦公樓網(wǎng)絡(luò)安裝協(xié)議
- 售后服務(wù)質(zhì)量評(píng)價(jià)規(guī)范
- 城市云邊協(xié)同計(jì)算
- 專題02大都市圈-沖刺2025年高考地理熱點(diǎn)梳理情境對(duì)點(diǎn)練
- 基于隱私增強(qiáng)的文件共享協(xié)議設(shè)計(jì)
- 2026 年中職酒店管理與數(shù)字化運(yùn)營(酒店前廳服務(wù))試題及答案
- 類比推理考試題目及答案
- 醫(yī)學(xué)影像云存儲(chǔ):容災(zāi)備份與數(shù)據(jù)恢復(fù)方案
- 2025年衛(wèi)生系統(tǒng)招聘(臨床專業(yè)知識(shí))考試題庫(含答案)
- 基建工程索賠管理人員索賠管理經(jīng)典文獻(xiàn)
- 工業(yè)機(jī)器人專業(yè)大學(xué)生職業(yè)生涯規(guī)劃書
- 農(nóng)貿(mào)市場消防安全管理制度
- 良品鋪?zhàn)訝I運(yùn)能力分析及對(duì)策研究
- 2025年小學(xué)教師素養(yǎng)大賽試題(含答案)
- 特種設(shè)備應(yīng)急處置課件
- 2025年科研年度個(gè)人工作總結(jié)(3篇)
- 熱力管網(wǎng)建設(shè)工程方案投標(biāo)文件(技術(shù)方案)
- 【《球閥的測繪方法概述》2900字】
評(píng)論
0/150
提交評(píng)論