單片機(jī)設(shè)計(jì)的電子琴
此電子琴小巧、聲音悅耳、便于攜帶、成本低、美觀大方,能演奏絕大部分音樂。本作品采用的16鍵設(shè)計(jì)方法,也可以擴(kuò)展成21鍵的。另外還能在這個(gè)基礎(chǔ)上附加一些功能。
本文引用地址:http://m.butianyuan.cn/article/201611/317331.htm1.由4×4組成的16個(gè)按鈕矩陣,設(shè)計(jì)成16個(gè)音。
2.硬件原理圖:
程序附錄:
實(shí)物圖:
原理圖:
源代碼:
;************* 單片機(jī)--電子琴 *******************;
;*MCU: AT89C52 ;
;*MCU-crystal: 12M ;
;*Version: 01 ;
;*Last Updata: 2007-6-9 ;
;*Author: zhaojun ;
;*Description: ;
;P2口是電子琴按鍵輸入 ;
;P1.0為音頻輸出 ;
;***************WAVE-E6000/T*********************;
;******************************;
; 電子琴 ;
;******************************;
ORG 0000H ;主程序起始地址
JMP START ;跳至主程序
ORG 000BH ;TIMER0中斷起始地址
JMP TIM0 ;跳至TIMER0中斷起始地址
START: MOV TMOD,#00000001B ;設(shè)TIMER0在MODE1
MOV IE,#10000010B ;中斷使能
SETB TR0 ;啟動(dòng)TIMER0
L1: CALL KEY ;調(diào)用KEY,判斷是否有鍵按下?
CLR EA ;中斷屏蔽
JB F0,L1 ;沒按則F0=1,有按則F0=0
MOV A,22H ;有按則將取碼指針暫存地址載入A
RL A ;乘2
MOV DPTR,#TABLE ;
MOVC A,@A+DPTR ;至TABLE取碼,取T的值
MOV TH0,A ;取到的高位字節(jié)存入TH0
MOV A,21H ;取到的高位字節(jié)存入(21H)
MOV A,22H ;再載入取碼指針值
RL A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;至TABLE1取相對(duì)的低位字節(jié)計(jì)數(shù)值
MOV TL0,A ;取到的低位字節(jié)存入TLO
MOV 20H,A ;取到的低位字節(jié)存入(20H)
L2: CALL KEY ;調(diào)用KEY判斷有按否?
SETB EA ;中斷使能
JB F0,L1 ;有按否?
JMP L2 ;有則跳至L2
KEY: SETB F0 ;設(shè)F0=1
MOV R3,#0F7H ;掃描初值(P23=0)
MOV R1,00H ;取碼指針初值
L3: MOV A,R3 ;載入掃描指針
MOV P2,A ;輸出至P2,開始掃描(P23~P20)一行為0
MOV A,P2 ;讀入P2
CLR C
CPL C ;令C=1
MOV R5,#04H ;檢測(cè)P27~P24
L4: RLC A ;左移一位(P27~P24)
JNC KEYIN ;檢測(cè)行C=0,表示被按
INC R1 ;沒按則取碼值指針加1
DJNZ R5,L4 ;4列檢測(cè)完畢了?
MOV A,R3 ;載入掃描指針
CLR C
CPL C ;C=1
RRC A ;掃描下一行,即下一行為0
MOV R3,A ;存回R3掃描指針寄存器
JC L3 ;C=0表示掃描完畢
RET
KEYIN: MOV 22H,R1 ;取碼指針存入22H地址
CLR F0 ;令F0=0
RET
TIM0: PUSH ACC ;將A的值暫存于堆棧
PUSH PSW ;將PSW的值暫存于堆棧
MOV TL0,20H ;重設(shè)計(jì)數(shù)值
MOV TH0,21H
CPL P1.0 ;將P1.0位反相
POP PSW ;至堆棧取回PSW的值
POP ACC ;至堆棧取回A的值
RETI ;返回主程序
TABLE: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
END
評(píng)論