新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機電子琴電路圖及源程序代碼

單片機電子琴電路圖及源程序代碼

作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏

實驗仿真圖

本文引用地址:http://butianyuan.cn/article/201611/321258.htm

源程序代碼:(彈奏部分代碼暫時去掉,見諒,需要的留言,轉(zhuǎn)載請注明出處,謝謝!)

DUAN EQU 0c000H
WEI EQU 0a000H
LED0 EQU 8000H
ORG 0000H ;復位地址
LJMP MAIN ;跳轉(zhuǎn)到主程序
ORG 0003H ;外部中斷0入口地址
LJMP INT00 ;跳轉(zhuǎn)到外部中斷0服務程序
ORG 000BH ;T0中斷入口
LJMP TIM0 ;跳轉(zhuǎn)到T0中斷服務程序


ORG 0030H ;主程序入口地址
MAIN:

MOV DPTR,#LED0
MOV A,#00H
MOVX @DPTR,A


MOV TMOD,#01H ;寫入T0控制字, 16位定時方式
SETB IT0 ;外部中斷為下降沿觸發(fā)
MOV IE,#83H ;開中斷
MOV 30H,#00H ;取簡譜碼指針
MOV R6,#0FFH ;選擇音樂節(jié)奏燈循環(huán)次數(shù)
CLR 23H ;功能選擇標志 00:鍵盤 01:音樂

NEXT: CLR TR0
JNB 23H,KEYPLAY ;若標志位是0則轉(zhuǎn)到鍵盤程序
SETB P2.2
MOV A,30H ;簡譜碼指針裝入A
JNB P0.1,START1 ;否則查詢播放哪一首歌曲
JNB P0.2,START2
JNB P0.3,START3
LJMP NEXT

;確定不同歌曲的基地址
START1:

MOV DPTR,#TABLE ;從TABLE處取簡譜碼
MOV 60H,DPH
MOV 61H,DPL
MOV A,#00H
LJMP NEXT1
START2:

MOV DPTR,#TABLE2 ;從TABLE2處取簡譜碼
MOV 60H,DPH
MOV 61H,DPL
MOV A,#01H
LJMP NEXT1
START3:

MOV DPTR,#TABLE3 ;從TABLE處取簡譜碼
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 ;取得的簡譜碼暫存于R2
JZ END0 ;是否取到結(jié)束碼00H
ANL A,#0FH ;不是,則取節(jié)拍碼
MOV R5,A ;節(jié)拍碼存于R5
MOV A,R2 ;將簡譜碼裝入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中取相對的高位字節(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中取相對的低位字節(jié)值
MOV TL0,A ;取得的高位字節(jié)裝入TL0和20H單元
MOV 20H,A
SETB TR0 ;啟動T0
D1: LCALL DELAY ;基本單位時間1/4拍,延時187毫秒
INC 30H ;取簡譜碼指針加1
LJMP NEXT ;取下一個碼
END0: CLR TR0 ;停止T0
CLR 30H ;清零簡樸指針
LJMP NEXT ;重復循環(huán)


上一頁 1 2 下一頁

評論


技術專區(qū)

關閉