1樓:匿名使用者
22. 電子琴
1. 實驗任務
(1. 由4x4組成16個按鈕矩陣,設計成16個音。
(2. 可隨意彈奏想要表達的**。
2. 電路原理圖
圖4.22.1
3. 系統板硬體連線
(1. 把「微控制器系統」區域中的p1.0埠用導線連線到「音訊放大模組」區域中的spk in埠上;
(2. 把「微控制器系統「區域中的p3.0-p3.7埠用8芯排線連線到「4x4行列式鍵盤」區域中的c1-c4 r1-r4埠上;
4. 相關程式內容
(1. 4x4行列式鍵盤識別;
(2. **產生的方法;
一首**是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的**了,當然對於微控制器來產生不同的頻率非常方便,我們可以利用微控制器的定時/計數器t0來產生這樣方波頻率訊號,因此,我們只要把一首歌曲的音階對應頻率關係弄正確即可。現在以微控制器12mhz晶振為例,例出高中低音符與微控制器計數t0相關的計數值如下表所示
音符 頻率(hz) 簡譜碼(t值) 音符 頻率(hz) 簡譜碼(t值)
低1 do 262 63628 # 4 fa# 740 64860
#1 do# 277 63731 中 5 so 784 64898
低2 re 294 63835 # 5 so# 831 64934
#2 re# 311 63928 中 6 la 880 64968
低 3 m 330 64021 # 6 932 64994
低 4 fa 349 64103 中 7 si 988 65030
# 4 fa# 370 64185 高 1 do 1046 65058
低 5 so 392 64260 # 1 do# 1109 65085
# 5 so# 415 64331 高 2 re 1175 65110
低 6 la 440 64400 # 2 re# 1245 65134
# 6 466 64463 高 3 m 1318 65157
低 7 si 494 64524 高 4 fa 1397 65178
中 1 do 523 64580 # 4 fa# 1480 65198
# 1 do# 554 64633 高 5 so 1568 65217
中 2 re 587 64684 # 5 so# 1661 65235
# 2 re# 622 64732 高 6 la 1760 65252
中 3 m 659 64777 # 6 1865 65268
中 4 fa 698 64820 高 7 si 1967 65283
下面我們要為這個音符建立乙個**,有助於微控制器通過查表的方式來獲得相應的資料
低音0-19之間,中音在20-39之間,高音在40-59之間
table: dw 0,63628,63835,64021,64103,64260,64400,64524,0,0
dw 0,63731,63928,0,64185,64331,64463,0,0,0
dw 0,64580,64684,64777,64820,64898,64968,65030,0,0
dw 0,64633,64732,0,64860,64934,64994,0,0,0
dw 0,65058,65110,65157,65178,65217,65252,65283,0,0
dw 0,65085,65134,0,65198,65235,65268,0,0,0
dw 0
2、**的音拍,乙個節拍為單位(c調)
曲調值 delay 曲調值 delay
調4/4 125ms 調4/4 62ms
調3/4 187ms 調3/4 94ms
調2/4 250ms 調2/4 125ms
對於不同的曲調我們也可以用微控制器的另外乙個定時/計數器來完成。
下面就用at89s51微控制器產生一首「生日快樂」歌曲來說明微控制器如何產生的。
在這個程式中用到了兩個定時/計數器來完成的。其中t0用來產生音符頻率,t1用來產生音拍。
5. 程式框圖
圖4.22.2
6. 彙編源程式
keybuf equ 30h
sth0 equ 31h
stl0 equ 32h
temp equ 33h
org 00h
ljmp start
org 0bh
ljmp int_t0 ;t0中斷入口
start: mov tmod,#01h ;t0工作方式1
setb et0
setb ea
wait:
mov p3,#0ffh ;輸入口置1準備工作
clr p3.4
mov a,p3 ;讀鍵盤
anl a,#0fh ;保持低四位
xrl a,#0fh ;
jz nokey1
lcall dely10ms
mov a,p3
anl a,#0fh
xrl a,#0fh
jz nokey1
mov a,p3
anl a,#0fh
cjne a,#0eh,nk1
mov keybuf,#0
ljmp dk1
nk1: cjne a,#0dh,nk2
mov keybuf,#1
ljmp dk1
nk2: cjne a,#0bh,nk3
mov keybuf,#2
ljmp dk1
nk3: cjne a,#07h,nk4
mov keybuf,#3
ljmp dk1
nk4: nop
dk1:
mov a,keybuf
mov dptr,#table
movc a,@a+dptr
mov p0,a
mov a,keybuf
mov b,#2
mul ab
mov temp,a
mov dptr,#table1
movc a,@a+dptr
mov sth0,a
mov th0,a
inc temp
mov a,temp
movc a,@a+dptr
mov stl0,a
mov tl0,a
setb tr0
dk1a: mov a,p3
anl a,#0fh
xrl a,#0fh
jnz dk1a
clr tr0
nokey1:
mov p3,#0ffh
clr p3.5
mov a,p3
anl a,#0fh
xrl a,#0fh
jz nokey2
lcall dely10ms
mov a,p3
anl a,#0fh
xrl a,#0fh
jz nokey2
mov a,p3
anl a,#0fh
cjne a,#0eh,nk5
mov keybuf,#4
ljmp dk2
nk5: cjne a,#0dh,nk6
mov keybuf,#5
ljmp dk2
nk6: cjne a,#0bh,nk7
mov keybuf,#6
ljmp dk2
nk7: cjne a,#07h,nk8
mov keybuf,#7
ljmp dk2
nk8: nop
dk2:
mov a,keybuf
mov dptr,#table
movc a,@a+dptr
mov p0,a
mov a,keybuf
mov b,#2
mul ab
mov temp,a
mov dptr,#table1
movc a,@a+dptr
mov sth0,a
mov th0,a
inc temp
mov a,temp
movc a,@a+dptr
mov stl0,a
mov tl0,a
setb tr0
dk2a: mov a,p3
anl a,#0fh
xrl a,#0fh
jnz dk2a
clr tr0
nokey2:
mov p3,#0ffh
clr p3.6
mov a,p3
anl a,#0fh
xrl a,#0fh
jz nokey3
lcall dely10ms
mov a,p3
anl a,#0fh
xrl a,#0fh
jz nokey3
mov a,p3
anl a,#0fh
cjne a,#0eh,nk9
mov keybuf,#8
ljmp dk3
nk9: cjne a,#0dh,nk10
mov keybuf,#9
ljmp dk3
nk10: cjne a,#0bh,nk11
mov keybuf,#10
ljmp dk3
nk11: cjne a,#07h,nk12
mov keybuf,#11
ljmp dk3
nk12: nop
dk3:
mov a,keybuf
mov dptr,#table
movc a,@a+dptr
mov p0,a
mov a,keybuf
mov b,#2
mul ab
mov temp,a
mov dptr,#table1
movc a,@a+dptr
mov sth0,a
mov th0,a
inc temp
mov a,temp
movc a,@a+dptr
mov stl0,a
mov tl0,a
setb tr0
dk3a: mov a,p3
anl a,#0fh
xrl a,#0fh
jnz dk3a
clr tr0
nokey3:
mov p3,#0ffh
clr p3.7
mov a,p3
anl a,#0fh
xrl a,#0fh
jz nokey4
lcall dely10ms
mov a,p3
anl a,#0fh
xrl a,#0fh
jz nokey4
mov a,p3
anl a,#0fh
cjne a,#0eh,nk13
mov keybuf,#12
ljmp dk4
nk13: cjne a,#0dh,nk14
mov keybuf,#13
ljmp dk4
nk14: cjne a,#0bh,nk15
mov keybuf,#14
ljmp dk4
nk15: cjne a,#07h,nk16
mov keybuf,#15
ljmp dk4
nk16: nop
dk4:
mov a,keybuf
mov dptr,#table
movc a,@a+dptr
mov p0,a
mov a,keybuf
mov b,#2
mul ab
mov temp,a
mov dptr,#table1
movc a,@a+dptr
mov sth0,a
mov th0,a
inc temp
mov a,temp
movc a,@a+dptr
mov stl0,a
mov tl0,a
setb tr0
dk4a: mov a,p3
anl a,#0fh
xrl a,#0fh
jnz dk4a
clr tr0
nokey4:
ljmp wait
dely10ms:
mov r6,#10
d1: mov r7,#248
djnz r7,$
djnz r6,d1
retint_t0:
mov th0,sth0
mov tl0,stl0
cpl p1.0
reti
table: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
table1: dw 64021,64103,64260,64400
dw 64524,64580,64684,64777
dw 64820,64898,64968,65030
dw 65058,65110,65157,65178
end7. c語言源程式
#include
unsigned char code table=;
unsigned char temp;
unsigned char key;
unsigned char i,j;
unsigned char sth0;
unsigned char stl0;
unsigned int code tab=;
void main(void)
temp=p3;
p1_0=~p1_0;
p0=table[key];
sth0=tab[key]/256;
stl0=tab[key]%256;
tr0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
tr0=0;}}
p3=0xff;
p3_5=0;
temp=p3;
temp=temp & 0x0f;
if (temp!=0x0f)
temp=p3;
p1_0=~p1_0;
p0=table[key];
sth0=tab[key]/256;
stl0=tab[key]%256;
tr0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
tr0=0;}}
p3=0xff;
p3_6=0;
temp=p3;
temp=temp & 0x0f;
if (temp!=0x0f)
temp=p3;
p1_0=~p1_0;
p0=table[key];
sth0=tab[key]/256;
stl0=tab[key]%256;
tr0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
tr0=0;}}
p3=0xff;
p3_7=0;
temp=p3;
temp=temp & 0x0f;
if (temp!=0x0f)
temp=p3;
p1_0=~p1_0;
p0=table[key];
sth0=tab[key]/256;
stl0=tab[key]%256;
tr0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
tr0=0;}}
}}void t0(void) interrupt 1 using 0
電子琴琴鍵音階,電子琴的琴鍵怎麼分辨?
布言不語 看傳上來琴的 是一款61鍵的電子琴,有36個白鍵和25個黑鍵,黑鍵和白鍵都是電子琴的演奏用鍵。每個琴鍵所代表的音名和唱名,請見附圖 61鍵電子琴鍵盤對照圖 其中對61個琴鍵 包括白鍵和黑鍵 的音名和唱名在圖上作了標註。音名是指c d e f g a b字母,它們的音高是固定不變的。音階的唱...
怎樣才叫好的電子琴,怎樣學電子琴?
作為乙個過來人,我認為你應該買乙個價位在1200 2000左右的琴。如果你是用來考級,山葉的琴是最好的。我考級的時候,人們大多是用山葉的,我自己的也是,我的琴是yamaha psr350,而且級數越高,琴越好。初學者,買乙個稍微好點的琴就可以了。到了級數高後,再換乙個高階一點的琴。如果你是用來學著玩...
初學電子琴選什麼電子琴比較好
不用買那麼好的,國產的就行,比如說美科mk 900,千元以下,它的音非常準的,音色也不錯,61鍵。也許有人會推薦casio yamaha一類的,我覺得沒必要,初學者給個再好的琴也彈不出啥感覺來。只要音準就行,因為這對於初學者練聽力很重要。或許你可以再加點錢,花個八千多,買個國產的鋼琴吧,彈起來手感比...