ORG 0000H
MOV P2,#11111111B
MOV P3,#11111111B
TEST: JNB P2.0,DO1 ;P2.0=0
JNB P2.1, RE1;P2.1=0
JNB P2.2, MI1;P2.2=0
JNB P2.3,FA1;P2.3=0
JNB P2.4,SO1;P2.4=0
JNB P2.5,LA1;P2.5=0
JNB P2.6,SI1;P2.6=0
JNB P2.7,DOH1;P2.7=0
JNB P3.0, START;P3.0=0
AJMP TEST
DO1:MOV R6,#126
AJMP OUTPUT1
RE1:MOV R6, #113
AJMP OUTPUT1
MI1:MOV R6, #100
AJMP OUTPUT1
FA1:MOV R6,#95
AJMP OUTPUT1
SO1:MOV R6, #85
AJMP OUTPUT1
LA1:MOV R6,#75
AJMP OUTPUT1
SI1:MOV R6,#67
AJMP OUTPUT1
DOH1:MOV R6,#63
AJMP OUTPUT1
OUTPUT1: CLR P3.7;令揚(yáng)聲器通電
ACALL DELAY;延時(shí)半周期t
SETB P3.7;令揚(yáng)聲器斷電
ACALL DELAY;延時(shí)半周期t
AJMP TEST ;重新測試按鍵
START: MOV DPTR, #MUSIC;DPTR指向樂譜的開頭
CONT: CLR A ;讀取樂譜內(nèi)代碼的音階
MOVC A,@A+DPTR ;A=音階代碼
CJNE A,#40,CHK ;若音階代碼為40
AJMP START ;則從頭開始演奏
CHK:PUSH ACC ;保存A的內(nèi)容
INC DPTR
CLR A ;讀取樂譜內(nèi)的音拍代碼
MOVC A, @A+DPTR;
MOV R4,A ;R4=音拍代碼取回A的內(nèi)容
POP ACC
CHK1: CJNE A, #01, CHK2 ; 若音階代碼為01,
ACALL DO ;則產(chǎn)生中音DO的聲音
JNB P3.2, STOP ;若P3.2=0,則停止演奏
CHK2: CJNE A, #02, CHK3 ;若音階代碼為02
ACALL RE ;產(chǎn)生中音RE的聲音
JNB P3.2, STOP ;若P3.2=0,則停止演奏
CHK3: CJNE A, #03, CHK4 ;若音階代碼為03
ACALL MI ;則產(chǎn)生中音MI的聲音
JNB P3.2, STOP ;若P3.2=0,則停止演奏
CHK4: CJNE A, #04, CHK5 ;若音階代碼為04
ACALL FA ;則產(chǎn)生中音FA的聲音
JNB P3.2, STOP ;若P3.2=0,則停止演奏
CHK5: CJNE A, #05, CHK6 ;若音階代碼為05
ACALL SO ;則產(chǎn)生中音SO的聲音
JNB P3.2, STOP ;若P3.2=0,則停止演奏
CHK6: CJNE A, #06, CHK7 ;若音階代碼為06
ACALL LA ;則產(chǎn)生中音LA的聲音
JNB P3.2, STOP ;若P3.2=0,則停止演奏
CHK7: CJNE A, #07, CHK8 ;若音階代碼為07,
ACALL SI ;則產(chǎn)生中音SI的聲音
JNB P3.2, STOP ;若P3.2=0,則停止演奏
CHK8: CJNE A, #08, CHK0 ;若音階代碼為08
ACALL DOH ;則產(chǎn)生高音D0的聲音
JNB P3.2, STOP ;若P3.2=0,則停止演奏
CHK0: CJNE A, #00, CONT2 ;若音階代碼為00
ACALL NON ;則不發(fā)出聲音
CONT2:
INC DPTR ;繼續(xù)讀取樂譜
AJMP CONT
DO: MOV R6,#126 ;設(shè)R6=延時(shí)參數(shù),R5=音長參數(shù)
MOV R5,#33 ;設(shè)定中音DO的相應(yīng)參數(shù)
AJMP OUTPUT
RE: MOV R6,#113 ;設(shè)定中音RE的相應(yīng)參數(shù)
MOV R5,#37
AJMP OUTPUT
MI: MOV R6,#100 ;設(shè)定中音M的相應(yīng)參數(shù)
MOV R5,#41
AJMP OUTPUT
FA: MOV R6,#95 ;設(shè)定中音FA的相應(yīng)參數(shù)
MOV R5,#44
AJMP OUTPUT
SO: MOV R6, #85 ;設(shè)定中音S0的相應(yīng)參數(shù)
MOV R5,#49
AJMP OUTPUT
LA: MOV R6,#75 ;設(shè)定中音LA的相應(yīng)參數(shù)
MOV R5,#55
AJMP OUTPUT
SI: MOV R6,#67 ;設(shè)定中音SI的相應(yīng)參數(shù)
MOV R5,#62
AJMP OUTPUT
DOH:MOV R6,#63 ;設(shè)定高音DO的相應(yīng)參數(shù)
MOV R5,#65
AJMP OUTPUT
NON:MOV R6,#33 ;設(shè)定休止符的相應(yīng)參數(shù)
MOV R5,#00
AJMP OUTPUT
OUTPUT:MOV ACC,R5
LOOP:CJNE A,#00,SOUND ;若音階代碼為00,則不讓揚(yáng)聲器通電
LJMP MUTE
SOUND: CLR P3.7 ;令揚(yáng)聲器通電
MUTE: ACALL DELAY ;延時(shí)半周期
SETB P3.7 ;令揚(yáng)聲器斷電
ACALL DELAY ;延時(shí)半周期
DJNZ R5, LOOP ;輸出一個(gè)音長,共R5周的方波
MOV R5, ACC ;取回R5的內(nèi)容
DJNZ R4, OUTPUT ;共輸出R4個(gè)音長
REST: MOV R6, #170 ;靜音
MOV R5, #20
WAIT: ACALL DELAY
DJNZ R5,WAIT
DELAY: MOV B,R6 ;延時(shí)半周期t=15μs×R6+9us
DL: MOV R7, #6
DJNZ R7,$
DJNZ R6,DL
MOV R6,B
RET
MUSIC: DB 03,02,03,02,03,04
DB 01,04
DB 03,02,03,02,03,04
DB 01,04
DB 05,02,06,02,05,02
DB 04,02,03,02,04,02
DB 05,08
DB 04,02,04,02,04,04
DB 02,04
DB 04,02,04,02,04,04
DB 02,04
DB 05,02,06,02,05,02
DB 04,02,03,02,02,02
DB 01,08
DB 06,04,05,08
DB 06,04,05,08
DB 05,02,06,02,05,02
DB 04,02,03,02,02,02
DB 01,08
DB 40
END
|