单片机电子琴Word格式.docx
《单片机电子琴Word格式.docx》由会员分享,可在线阅读,更多相关《单片机电子琴Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
简谱码(T值)
低1DO
262
63628
#4FA#
740
64860
#1DO#
277
63731
中5SO
784
64898
低2RE
294
63835
#5SO#
831
64934
#2RE#
311
63928
中6
880
64968
低3M
330
64021
#6#
932
64994
低4FA
349
64103
中7SI
988
65030
370
64185
高1DO
1046
65058
低5SO
392
64260
1109
65085
415
64331
高2RE
1175
65110
低6LA
440
64400
1245
65134
466
64463
高3M
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
1480
65198
554
64633
高5SO
1568
65217
中2RE
587
64684
1661
65235
622
64732
高6LA
1760
65252
中3M
659
64777
1865
65268
中4FA
698
64820
高7SI
1967
65283
建立音乐的步骤:
1.
先把乐谱的音符找出,然后按照上表建立T值表的顺序。
2.
把T值表建立在TABLE1,构成发音符的计数值放在“TABLE”。
3.
简谱码为一个字节,节拍为一个字节,音符的节拍码放在“TABLE”处。
4.
节拍时间的设定,如果1拍的时间是0.4秒,1/4拍的时间就是0.1秒,只要设定延时时间就可以求得节拍的时间。
假如1/4拍为1DELAY,则1拍应为4DELAY。
以此类推。
所以只要求得1/4拍的时间DELAY时间,其余的节拍就是它的倍数。
2硬件电路图
如图,按键1—7表示发中音1—7,按键8表示唱一首完整的歌曲,当在唱歌时需要进行按键发音则按一下按键9即可。
LM386为音频小功放,输出到扬声器。
晶振选择12MZ,采用开关复位方式。
LM386功放电路参阅《8051单片机实践与应用》。
745
单片机电子琴设计
软件设计
1.延时程序的编写
1/4拍的延时时间=187毫秒,这个时间由歌曲本身来决定,歌曲不同这个1/4拍的时间也不同,这里1/4拍的时间就取为187毫秒。
DELAY:
MOV
R7,#02
D2:
R4,#187
D3:
R3,#248
DJNZ
R3,$
DJNZ
R4,D3
R7,D2
R5,DELAY
RET
R5表示为1/4拍的倍数。
T值表的建立
T值表建立在TABLE1中:
TABLE1:
DW
63628,63731,63835,63928,64021,64103
DW
64185,64260,64331,64400,64463,64524
64580,64633,64684,64732,64777,64820
64860,64898,64934,64968,64994,65030
65058,65085,65110,65134,65157,65178
65198,65217,65235,65252,65268,65283
键盘扫描程序的编写
KEY:
R3,
#00H
/R3中的数表示是那个键按下/
JNB
P2.0,
LOOP
INC
R3
JNB
P2.1,
P2.2,
INC
P2.3,
P2.4,
P2.5,
P2.6,
JNC
P2.7,
SETB
F0
/没有键按下则F0=0/
SJMP
DO
LOOP:
CLR
/有键按下则F0=1/
DO:
NOP
RET
此程序可以判断是那个键按下,如果有键按下则F0=0,没有键按下则F0=1。
按键数存放在R3中。
这样就可以根据按键来发音了。
如果是按键8按下则表示是要唱一首完整的歌曲。
可以通过设定中断来实现它。
当按键8按下时产生中断,系统马上响应中断进入中断服务程序,进行查表TABLE可以得到歌曲的简谱码和节拍数然后按照歌曲的规律进行下去,这样就可以唱出一首完整的歌曲了。
TABLE表格的建立,,每个音符先编音符码然后编节拍数,音符码和节拍数各占一个字节。
程序如下:
ORG
0000H
SJMP
BEGIN
000BH
TIM0
BEGIN:
TMOD,
#01H
/设TIMER在MODE1/
IE,
#82H
/中断使能/
REPE:
30H,
/取简谱码指针/
NEXT:
A,
30H
/简谱码指针存入A/
DPTR,
#TABLE
MOVC
A,
@A+DPTR
R2,
A
/音符码存入R2中/
CJNE
A,#0FFH,GOOT
/是否取到了规定的结束码
“FFH”/
END0
GOOT:
30H
A,@A+DPTR
R5,
/节拍数存放在R5中/
R2
/音符码存入A中/
CJNE
A,#24H,SING
/取到的音符码是否为“24H”/
CLR
TR0
/是,则不发音/
JMP
D1
SING:
31H,
/音符码存入31H中/
RL
A
#TABLE1
MOVC
A,@DPTR+A
/找到TABLE1中对应的T值/
MOV
32H,
/取到T值的高字节存入32H中/
TH0,A
A,31H
RL
33H,
/取到T值的高字节存入33H中/
TL0,A
SETB
/启动TIMER0/
D1:
CALL
DELAY
NEXT
END0:
TR0
REPE
TIM0:
PUSH
ACC
PSW
TH0,32H
TL0,33H
CPL
P1.0
POP
RETI
TABLE:
13H,
02H,
24H,
01H,
15H,
04H
04H,
18H,
17H,
04H
1AH,
1FH,
1CH,
0FFH
END
对于不同的歌曲只要根据歌曲来建立TABLE即可。
上TABLE表是根据生日快乐歌曲建立的。
按键发音的过程,首先进行键盘扫描,判断是那个键按下,记下键数,存入R3中,然后查表得到相应的T值,并载入到定时器0中同时启动定时器,继续进行键盘扫描,判断是否有键按下,有则表示键一直是按下的,继续发音(因为扫描的时间很短最多也只有几十微秒,所以可以认为是同一个键按下的)。
没有则进行循环扫描。
COOM
ORG
TIMOY
COOM:
TMOD,#01H
IE,#82H
L1:
KEY
JB
F0,
L1
/没有键按下则继续扫描/
A,R3
A,#07H,SOPP
#####
/这里是为下面两个程序综合准备/
SOPP:
DPTR,#TABLE2
A,@A+DPTR
35H,
/T值高字节放入35H中/
TH0,
36H,
/T值高字节放入36H中/
TL0,
L2:
L3
L2
L3:
L1
F0
TIMOY:
TH0,
#35H
TL0,
#36H
RETI
TABLE2:
64580,64684,64777,64820,64898,64968,65030
只要将这两个程序综合起来就可以完成设计要求了,注意因为在这两个程序分开考虑的时候都是用定时器0来完成的。
而综合起来是只要改变其中一个为定时器1即可。
LJMP
001BH
TIM1
BEGIN:
TMOD,#11H
IE,
#8AH
REPE
TH1,
TL1,
TR1
TIM1:
TH1,
TL1,
A,#0FFH,GOOT/是否取到了规定的结束码
/取到T值的高字节存入32H中/,
15H04H,