?? 樂曲t.asm
字號:
ORG 0000H ;通用音樂程序,適用SL-AVRS,SL-AVR-1,SL-AVR-2實驗板
;AT89(X)XX單片機 P2.0或AT90S8515/8535單片機 PC.0輸出樂曲聲
LJMP L0300 ;為適用SST89F5X單片機而跳轉(zhuǎn)
ORG 0003H ; INT0中斷入口地址
LJMP L0303 ; 轉(zhuǎn)INT0中斷
ORG 000BH ; T0中斷入口地址
LJMP L030B ; 轉(zhuǎn)T0中斷
ORG 0013H ; INT1中斷入口地址
LJMP L0313 ; 轉(zhuǎn)INT1中斷
ORG 0300H ;SST89F5X用戶程序首址
L0300: SJMP L0330 ;轉(zhuǎn)主程序
ORG 0303H ;INT0中斷入口地址
L0303: LJMP L03F0 ;轉(zhuǎn)INT0中斷服務(wù)子程序
ORG 030BH ;T0中斷入口地址
L030B: LJMP L03A0 ; 轉(zhuǎn)T0中斷服務(wù)子程序
ORG 0313H ; INT1中斷入口地址
L0313: LJMP L0480 ; 轉(zhuǎn)INT1中斷服務(wù)子程序
ORG 031BH ; T1中斷入口地址
RETI ;抗干擾用
ORG 0323H ;串行中斷入口地址
RETI ; 抗干擾用
ORG 032BH ; T2中斷入口地址
RETI ; 抗干擾用
ORG 0330H ;主程序
L0330: MOV 31H,#2DH ;第一首曲節(jié)拍速度值
MOV SP,#60H ;設(shè)堆棧
MOV TMOD,#01H ;T0方式1
MOV IE,#87H ;開中斷
MOV IP,#04H ;INT1為優(yōu)先中斷
MOV 41H,#06H ;
MOV 40H,#00H ;樂曲首地址為0600H
L0342: MOV 32H,#00H ;曲組編號
L0345: MOV 24H,#01H ;反復放音次數(shù),01H為放l次
NOP
NOP
NOP
MOV 34H,#04H ;
MOV 33H,#51H ;音符表首址,第一首曲音符表為0451H
L0351: MOV 30H,#00H ;取曲指針,00H為第一首樂曲
L0354: MOV A,30H
MOV DPL,40H ;取曲碼首址
MOV DPH,41H
MOVC A,@A+DPTR
MOV R2,A ;簡碼暫存于R2
JZ L038A ;結(jié)束則轉(zhuǎn)
ANL A,#0FH ;取節(jié)拍碼
MOV R5,A ; 節(jié)拍碼存于R5
MOV A,R2
SWAP A
ANL A,#0FH ;取音符碼
JNZ L036D
CLR TR0 ;為0不發(fā)音
SJMP L0384 ;延時
L036D: DEC A
MOV 22H,A ;音符碼存于22H
RL A
MOV DPTR,#0451H ;取音符碼高位字節(jié)
MOVC A,@A+DPTR
MOV TH0,A ; 音符碼高位字節(jié)存于TH0
MOV 21H,A ; 音符碼高位字節(jié)存于TH0
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR ; 取音符碼低位值
MOV TL0,A ; 音符碼低位值存于TL0
MOV 20H,A ; 音符碼低位值存于20H
SETB TR0 ;啟動T0
L0384: ACALL S03B1 ;延時
AJMP L03D1 ;查A超過FFH嗎
L0388: SJMP L0354 ;取一個碼
L038A: CLR TR0 ;停T0
AJMP L03E0 ;重復
L038E: INC 30H ;曲指針加1
CLR C
MOV A,40H ;查A超過FFH
ADD A,30H
MOV 40H,A
JBC CY,L039C ;超過DPH加1
SJMP L039E ;不超過轉(zhuǎn)
L039C: INC 41H
L039E: AJMP L0420 ;繼續(xù)
L03A0: PUSH ACC ;T0溢出產(chǎn)生中斷,T0中斷服務(wù)子程序,保護ACC,PSW數(shù)據(jù)
PUSH PSW
MOV TL0,20H ;T0取數(shù)
MOV TH0,21H ;
CPL P2.0 ;P2.0取反,即該腳輸出樂曲
POP PSW ;出棧
POP ACC
RETI ;中斷返回
S03B1: MOV R7,#06H ;延時子程序
L03B3: MOV R4,31H
L03B5: MOV R3,#0F1H
L03B7: DJNZ R3,$
DJNZ R4,L03B5
DJNZ R7,L03B3
DJNZ R5,S03B1
RET
L03C0: INC 30H ;判是否全部曲結(jié)束
MOV A,30H ;一 個單元為00H,表示一首曲結(jié)束
MOV DPL,40H ;連續(xù)二個單元為00H,表示全部曲結(jié)束
MOV DPH,41H
MOVC A,@A+DPTR
JZ L03CF ;全部曲結(jié)束轉(zhuǎn)
AJMP L0430 ;轉(zhuǎn)下一首曲
L03CF: AJMP L0300 ;從頭開始
L03D1: INC 30H
MOV A,30H
JZ L03D9 ;A超過FFH嗎?
AJMP L0388
L03D9: INC 41H ;超過,DPH加1
AJMP L0388 ;繼續(xù)
ORG 03E3H ;判一首曲反復唱幾次
L03E0: DEC 24H
MOV A,24H
CJNE A,#00H,L03EC ;曲間延時
ACALL S0443
AJMP L03C0 ;轉(zhuǎn)下一首曲
NOP
L03EC: ACALL S0443
AJMP L0351
L03F0: PUSH ACC ;快速跳過十首曲中斷服務(wù)子程序,如P3.2為低電平,表示
;要求跳過十首曲,則INT0中斷響應(yīng)
PUSH DPH ;進載保護數(shù)據(jù)
PUSH DPL
CLR TR0
MOV R0,#0FFH
L03FA: DJNZ R0,$ ;延時去抖動
MOV A,32H ;跳到第幾組(十首為一組)
RL A
MOV 36H,A ;存現(xiàn)在選的曲組
MOV DPTR,#0500H ;取曲組首址
L0404: JNB INT0,$ ;等P3.2升高
MOVC A,@A+DPTR ;取高位地址
MOV 41H,A
INC 36H
MOV A,36H
MOVC A,@A+DPTR ; 取低位地址
MOV 40H,A
INC 32H
SETB TR0 ;開T0
POP DPL ;出棧
POP DPH
POP ACC
RETI ;中斷返回
ORG 0420H ;判P3.0為0,反復放該首曲
L0420: JB RXD,L042B ;為1繼續(xù)放音
MOV 41H,DPH
MOV 40H,DPL
AJMP L0342 ;繼續(xù)放音
L042B: AJMP L0345 ;反復放音
ORG 0430H ;取曲初始化節(jié)拍子程序
L0430: MOV 31H,A
INC 30H
MOV A,30H
MOVC A,@A+DPTR ;取音符高位地址
MOV 34H,A ;
INC 30H
MOV A,30H
MOVC A,@A+DPTR ; 取音符低位地址
MOV 33H,A
LJMP L038E
S0443: PUSH 31H ;延時
MOV 31H,#02H
ACALL S03B1
POP 31H
RET
ORG 0451H ;音符表首地址
DW 0E446H ;低八度音1
DW 0FCAEH ; 低八度音2
DW 0FD0BH ; 低八度音3
DW 0FD34H ; 低八度音4
DW 0FD82H ; 低八度音5
DW 0FDC8H ; 低八度音6
DW 0FE06H ; 低八度音7
DW 0FE22H ;中音1
DW 0FE4FH ; 中音2
DW 0FE85H ; 中音3
DW 0FE9AH ; 中音4
DW 0FEC1H ; 中音5
DW 0FEE4H ; 中音6
DW 0FF03H ; 中音7
DW 0FF11H ; 高八度音1
DW 0FF2BH ; 高八度音2
DW 0FF42H ; 高八度音3
DW 0FF4DH ; 高八度音4
DW 0FF61H ; 高八度音5
DW 0FF72H ; 高八度音6
DW 0FF81H ; 高八度音7
ORG 0480H ;找下一首曲中斷服務(wù)子程序,由于P3.3低電平
;INT1響應(yīng)中斷
L0480: PUSH ACC ;進棧保護
CLR TR0 ;關(guān)T0
MOV R0,#0FFH ;送延時常數(shù)
L0486: DJNZ R0,$ ;延時
MOV DPH,41H
MOV DPL,40H
L048E: INC DPTR
MOV A,#00H
MOVC A,@A+DPTR ;找一首曲結(jié)束單元
JZ L0496 ;找到轉(zhuǎn)取曲
SJMP L048E ;找不到繼續(xù)找
L0496: INC DPTR ;
MOV A,#00H
MOVC A,@A+DPTR ;取節(jié)拍速度值
MOV 31H,A
INC DPTR
MOV A,#00H
MOVC A,@A+DPTR ;取高符低位值
MOV 34H,A
INC DPTR
MOV A,#00H
MOVC A,@A+DPTR ; 取音符低位值
MOV 33H,A ;保存有關(guān)數(shù)據(jù)
MOV 41H,DPH
MOV 40H,DPL
L04AE: JNB INT1,$ ;等升P3.3高,關(guān)中斷
SETB TR0 ;開T0
POP ACC ;出棧
RETI ;中斷返回
ORG 0500H ;曲組首址
DW 0C64H ;第10首曲地址
DW 1762H ; 第20首曲地址
DW 2076H ; 第30首曲地址
DW 2AF3H ; 第40首曲地址
DW 3571H ; 第50首曲地址
DW 4342H ; 第60首曲地址
DW 4CB2H ; 第70首曲地址
DW 568AH ; 第80首曲地址
DW 5E4CH ; 第90首曲地址
DW 6139H ; 第100首曲地址
DW 6487H ; 第110首曲地址
DW 692BH ; 第120首曲地址
DW 6D65H ; 第130首曲地址
DW 7472H ; 第140首曲地址
DW 79D2H ; 第150首曲地址
ORG 0600H ;樂曲首址
DW 8381H ;第1首曲
DW 9484H
DW 0B4A8H
DW 8381H
DW 9484H
DW 0C4B8H
DW 8381H
DW 0F4D4H
DW 0B4A4H
DW 94E3H
DW 0E1D4H
DW 0B4C4H
DW 0B883H
DW 8194H
DW 84B4H
DW 0A883H
DW 8194H
DW 84C4H
DW 0B883H
DW 81F4H
DW 0D4B4H
DW 0A494H
DW 0E3E1H
DW 0D4B4H
DW 0C4B8H
DW 002DH ; 第2首曲速度值
DW 0159H ; 第2首曲曲碼表為0159H開始
DW 0B1C1H ; 第2首曲開始
DW 0B1C1H
DW 0DC92H
DW 0B2CCH
DW 0B1C1H
DW 0B1C1H
DW 0DC82H
DW 92BFH
DW 4652H
DW 6284H
DW 6251H
DW 4146H
DW 4866H
DW 8292H
DW 0B492H
DW 9181H
DW 8688H
DW 96B2H
DW 0B2C4H
DW 0B1C1H
DW 0B191H
DW 9694H
DW 8292H
DW 8282H
DW 0262H
DW 6341H
DW 5261H
DW 5152H
DW 5658H
DW 4244H
DW 5262H
DW 8462H
DW 5141H
DW 4648H
DW 6264H
DW 8292H
DW 0B492H
DW 9181H
DW 8688H
DW 9294H
DW 0B2B2H
DW 0C4B1H
DW 0C1B1H
DW 9196H
DW 9482H
DW 9282H
DW 8202H
DW 6263H
DW 4151H
DW 6151H
DW 414FH
DW 44B2H
DW 0C2D2H
DW 0C1D6H
DW 0D8D4H
DW 0B2C2H
DW 0D2D4H
DW 0A291H
DW 92A1H
DW 9282H
DW 9492H
DW 0B2C2H
DW 0C4A2H
DW 9192H
DW 0A192H
DW 6281H
DW 918CH
DW 0B2C2H
DW 0D2C1H
DW 0D6D8H
DW 0D4B2H
DW 0C2D2H
DW 0D4A2H
DW 9192H
DW 0A192H
DW 8294H
DW 92B2H
DW 0C2C4H
DW 0A292H
DW 9161H
DW 8292H
DW 0B1C1H
DW 0BCB1H
DW 0C1B1H
DW 0C1DCH
DW 92B2H
DW 0CCB1H
DW 0C1B1H
DW 0C1DCH
DW 8292H
DW 0BF46H
DW 5262H
DW 8462H
DW 5141H
DW 4648H
DW 6682H
DW 92B4H
DW 9291H
DW 8186H
DW 8896H
DW 0B2B2H
DW 0C4B1H
DW 0C1B1H
DW 9196H
DW 9482H
DW 9282H
DW 8202H
DW 6263H
DW 4152H
DW 6151H
DW 5256H
DW 5842H
DW 4452H
DW 6284H
DW 6251H
DW 4146H
DW 4862H
DW 6482H
DW 92B4H
DW 9291H
DW 8186H
DW 8892H
DW 94B2H
DW 0B2C4H
DW 0B1C1H
DW 0B191H
DW 9694H
DW 8292H
DW 8282H
DW 0262H
DW 6341H
DW 5161H
DW 5141H
DW 4F44H
DW 0B2C2H
DW 0D2C1H
DW 0D6D8H
DW 0D4B2H
DW 0C2D2H
DW 0D4A2H
DW 9192H
DW 0A192H
DW 8294H
DW 92B2H
DW 0C2C4H
DW 0A291H
DW 92A1H
DW 9262H
DW 8191H
DW 8CB2H
DW 0C2D2H
DW 0C1D6H
DW 0D8D4H
DW 0B2C2H
DW 0D2D4H
DW 0A291H
DW 92A1H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -