實(shí)驗(yàn)仿真圖
本文引用地址:http://www.biyoush.com/article/201611/321258.htm源程序代碼:(彈奏部分代碼暫時(shí)去掉,見諒,需要的留言,轉(zhuǎn)載請(qǐng)注明出處,謝謝!)
DUAN EQU 0c000H
WEI EQU 0a000H
LED0 EQU 8000H
ORG 0000H ;復(fù)位地址
LJMP MAIN ;跳轉(zhuǎn)到主程序
ORG 0003H ;外部中斷0入口地址
LJMP INT00 ;跳轉(zhuǎn)到外部中斷0服務(wù)程序
ORG 000BH ;T0中斷入口
LJMP TIM0 ;跳轉(zhuǎn)到T0中斷服務(wù)程序
ORG 0030H ;主程序入口地址
MAIN:
MOV DPTR,#LED0
MOV A,#00H
MOVX @DPTR,A
MOV TMOD,#01H ;寫入T0控制字, 16位定時(shí)方式
SETB IT0 ;外部中斷為下降沿觸發(fā)
MOV IE,#83H ;開中斷
MOV 30H,#00H ;取簡(jiǎn)譜碼指針
MOV R6,#0FFH ;選擇音樂(lè)節(jié)奏燈循環(huán)次數(shù)
CLR 23H ;功能選擇標(biāo)志 00:鍵盤 01:音樂(lè)
NEXT: CLR TR0
JNB 23H,KEYPLAY ;若標(biāo)志位是0則轉(zhuǎn)到鍵盤程序
SETB P2.2
MOV A,30H ;簡(jiǎn)譜碼指針裝入A
JNB P0.1,START1 ;否則查詢播放哪一首歌曲
JNB P0.2,START2
JNB P0.3,START3
LJMP NEXT
;確定不同歌曲的基地址
START1:
MOV DPTR,#TABLE ;從TABLE處取簡(jiǎn)譜碼
MOV 60H,DPH
MOV 61H,DPL
MOV A,#00H
LJMP NEXT1
START2:
MOV DPTR,#TABLE2 ;從TABLE2處取簡(jiǎn)譜碼
MOV 60H,DPH
MOV 61H,DPL
MOV A,#01H
LJMP NEXT1
START3:
MOV DPTR,#TABLE3 ;從TABLE處取簡(jiǎn)譜碼
MOV 60H,DPH
MOV 61H,DPL
MOV A,#02H
LJMP NEXT1
;鍵盤彈奏程序入口
KEYPLAY: ;鍵盤程序入口
SETB P2.1
CLR P2.2
JNB P0.4,LOWTONE ;查詢是高音還是其他的音
JNB P0.5,MIDDLETONE
JNB P0.6,HIGHTONE
LJMP NEXT ;沒有選擇高中低音則重新查詢
;確定高中低音基地址
LOWTONE:
MOV DPTR,#LOWTABLE ;賦基地址值
MOV 50H,DPH
MOV 51H,DPL
LJMP KEY ;跳轉(zhuǎn)到按鍵查詢程序
MIDDLETONE:
MOV DPTR,#MIDDLETABLE
MOV 50H,DPH
MOV 51H,DPL
LJMP KEY
HIGHTONE:
MOV DPTR,#HIGHTABLE
MOV 50H,DPH
MOV 51H,DPL
LJMP KEY
;歌曲播放程序
NEXT1: MOV DPTR,#SEG7
MOVC A,@A+DPTR
MOV DPTR,#DUAN
MOVX @DPTR,A
MOV DPTR,#WEI
MOV A,#000BH
MOVX @DPTR,A
MOV DPH,60H
MOV DPL,61H
MOV A,30H
MOVC A,@A+DPTR
MOV R2,A ;取得的簡(jiǎn)譜碼暫存于R2
JZ END0 ;是否取到結(jié)束碼00H
ANL A,#0FH ;不是,則取節(jié)拍碼
MOV R5,A ;節(jié)拍碼存于R5
MOV A,R2 ;將簡(jiǎn)譜碼裝入A
SWAP A ;高、低4位交換
ANL A,#0FH ;取音符碼
JNZ SING ;取得的音符碼是否為0?
CLR TR0 ;是則不發(fā)音
lJMP D1 ;跳轉(zhuǎn)到D1
SING: DEC A ;取得的音符碼減1(不含0)
MOV 22H,A ;存入22H單元
RL A ;乘2
MOV DPTR,#TABLE1 ;到TABLE1中取相對(duì)的高位字節(jié)值
MOVC A,@A+DPTR
MOV TH0,A ;取得的高位字節(jié)裝入TH0和21H單元
MOV 21H,A
MOV A,22H ;再裝入取得的音符碼
Rl A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;到TABLE1中取相對(duì)的低位字節(jié)值
MOV TL0,A ;取得的高位字節(jié)裝入TL0和20H單元
MOV 20H,A
SETB TR0 ;啟動(dòng)T0
D1: LCALL DELAY ;基本單位時(shí)間1/4拍,延時(shí)187毫秒
INC 30H ;取簡(jiǎn)譜碼指針加1
LJMP NEXT ;取下一個(gè)碼
END0: CLR TR0 ;停止T0
CLR 30H ;清零簡(jiǎn)樸指針
LJMP NEXT ;重復(fù)循環(huán)
評(píng)論