单片机电子琴.docx
《单片机电子琴.docx》由会员分享,可在线阅读,更多相关《单片机电子琴.docx(15页珍藏版)》请在冰点文库上搜索。
![单片机电子琴.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/8e202a0b-6769-40eb-9f69-52a54027f69b/8e202a0b-6769-40eb-9f69-52a54027f69b1.gif)
单片机电子琴
一 设计原理 ……………………………………………………5
二 硬件电路图 ……………………………………………………6
三 软件设计 ………………………………………………………7
(一)延时程序编写…………………………………………………11
(二)T值表的建立…………………………………………………12
(三) 键盘扫描程序编写…………………………………………13
四 电子琴程序设计………………………………………………14
五 结束语 …………………………………………………………15
六 参考文献…………………………………………………………16
1设计原理
乐音实际上是有固定周期的信号,要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间对I/O反相,就可以在I/O脚上得到此频率的脉冲。
利用8051(晶振12HZ)的内部定时器使其工作在MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
例如:
要发出中音DO的音,首先知道中音DO的频率是523Hz(查表可以得知),其周期是T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每计数956次时将I/O反向,就可得到中音DO。
其T值的计算方法如下:
T=65536—N;
N=Fi/2/Fr; N:
计数值;
Fi:
内部计时一次为1us,故其频率为1MHz;
Fr:
要产生的频率;
中音DO的T=65536—500000/523=64580。
C调各音符频率与T值表
音符 频率(Hz) 简谱码(T值) 音符 频率(Hz) 简谱码(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
#4FA# 370 64185 高1DO 1046 65058
低5SO 392 64260 #1DO# 1109 65085
#5SO# 415 64331 高2RE 1175 65110
低6LA 440 64400 #2RE# 1245 65134
#6# 466 64463 高3M 1318 65157
低7SI 494 64524 高4FA 1397 65178
中1DO 523 64580 #4FA# 1480 65198
#1DO# 554 64633 高5SO 1568 65217
中2RE 587 64684 #5SO# 1661 65235
#2RE# 622 64732 高6LA 1760 65252
中3M 659 64777 #6# 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:
MOV R4,#187
D3:
MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
R5表示为1/4拍的倍数。
T值表的建立
T值表建立在TABLE1中:
TABLE1:
DW 63628,63731,63835,63928,64021,64103
DW 64185,64260,64331,64400,64463,64524
DW 64580,64633,64684,64732,64777,64820
DW 64860,64898,64934,64968,64994,65030
DW 65058,65085,65110,65134,65157,65178
DW 65198,65217,65235,65252,65268,65283
键盘扫描程序的编写
KEY:
MOV R3, #00H /R3中的数表示是那个键按下/
JNB P2.0, LOOP
INC R3
JNB P2.1, LOOP
INC R3
JNB P2.2, LOOP
INC R3
JNB P2.3, LOOP
INC R3
JNB P2.4, LOOP
INC R3
JNB P2.5, LOOP
INC R3
JNB P2.6, LOOP
INC R3
JNC P2.7, LOOP
SETB F0 /没有键按下则F0=0/
SJMP DO
LOOP:
CLR F0 /有键按下则F0=1/
DO:
NOP
RET
此程序可以判断是那个键按下,如果有键按下则F0=0,没有键按下则F0=1。
按键数存放在R3中。
这样就可以根据按键来发音了。
如果是按键8按下则表示是要唱一首完整的歌曲。
可以通过设定中断来实现它。
当按键8按下时产生中断,系统马上响应中断进入中断服务程序,进行查表TABLE可以得到歌曲的简谱码和节拍数然后按照歌曲的规律进行下去,这样就可以唱出一首完整的歌曲了。
TABLE表格的建立,,每个音符先编音符码然后编节拍数,音符码和节拍数各占一个字节。
程序如下:
ORG 0000H
SJMP BEGIN
ORG 000BH
SJMP TIM0
BEGIN:
MOV TMOD, #01H /设TIMER在MODE1/
MOV IE, #82H /中断使能/
REPE:
MOV 30H, #00H /取简谱码指针/
NEXT:
MOV A, 30H /简谱码指针存入A/
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV R2, A /音符码存入R2中/
CJNE A,#0FFH,GOOT /是否取到了规定的结束码 “FFH”/
SJMP END0
GOOT:
INC 30H
MOV A, 30H
MOVC A,@A+DPTR
MOV R5, A /节拍数存放在R5中/
MOV A, R2 /音符码存入A中/
CJNE A,#24H,SING /取到的音符码是否为“24H”/
CLR TR0 /是,则不发音/
JMP D1
SING:
MOV 31H, A /音符码存入31H中/
RL A
MOV DPTR, #TABLE1
MOVC A,@DPTR+A /找到TABLE1中对应的T值/
MOV 32H, A /取到T值的高字节存入32H中/
MOV TH0,A
MOV A,31H
RL A
INC A
MOVC A,@DPTR+A
MOV 33H, A /取到T值的高字节存入33H中/
MOV TL0,A
SETB TR0 /启动TIMER0/
D1:
CALL DELAY
INC 30H
SJMP NEXT
END0:
CLR TR0
SJMP REPE
TIM0:
PUSH ACC
PUSH PSW
MOV TH0,32H
MOV TL0,33H
CPL P1.0
POP ACC
POP PSW
RETI
DELAY:
MOV R7,#02
D2:
MOV R4,#187
D3:
MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
TABLE1:
DW 63628,63731,63835,63928,64021,64103
DW 64185,64260,64331,64400,64463,64524
DW 64580,64633,64684,64732,64777,64820
DW 64860,64898,64934,64968,64994,65030
DW 65058,65085,65110,65134,65157,65178
DW 65198,65217,65235,65252,65268,65283
TABLE:
13H, 02H, 24H, 01H, 13H, 01H, 15H, 04H 13H, 04H, 18H, 04H, 17H, 04H
24H, 04H, 13H, 02H, 24H, 01H, 13H, 01H, 15H, 04H, 13H, 04H, 1AH, 04H
18H, 04H, 24H, 04H, 13H, 02H, 24H, 01H, 13H, 01H, 1FH, 04H, 1CH, 04H
0FFH
END
对于不同的歌曲只要根据歌曲来建立TABLE即可。
上TABLE表是根据生日快乐歌曲建立的。
按键发音的过程,首先进行键盘扫描,判断是那个键按下,记下键数,存入R3中,然后查表得到相应的T值,并载入到定时器0中同时启动定时器,继续进行键盘扫描,判断是否有键按下,有则表示键一直是按下的,继续发音(因为扫描的时间很短最多也只有几十微秒,所以可以认为是同一个键按下的)。
没有则进行循环扫描。
ORG 0000H
SJMP COOM
ORG 000BH
SJMP TIMOY
COOM:
MOV TMOD,#01H
MOV IE,#82H
L1:
CALL KEY
JB F0, L1 /没有键按下则继续扫描/
MOV A,R3
CJNE A,#07H,SOPP
SJMP ##### /这里是为下面两个程序综合准备/
SOPP:
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV 35H, A /T值高字节放入35H中/
MOV TH0, A
MOV A, R3
RL A
INC A
MOVC A, @A+DPTR
MOV 36H, A /T值高字节放入36H中/
MOV TL0, A
SETB TR0
L2:
CALL KEY
JB F0, L3
SJMP L2
L3:
CPL TR0
SJMP L1
KEY:
MOV R3, #00H /R3中的数表示是那个键按下/
JNB P2.0, LOOP
INC R3
JNB P2.1, LOOP
INC R3
JNB P2.2, LOOP
INC R3
JNB P2.3, LOOP
INC R3
JNB P2.4, LOOP
INC R3
JNB P2.5, LOOP
INC R3
JNB P2.6, LOOP
INC R3
JNC P2.7, LOOP
SETB F0
SJMP DO
LOOP:
CLR F0
单片机电子琴设计
DO:
NOP
RET
TIMOY:
PUSH ACC
PUSH PSW
MOV TH0, #35H
MOV TL0, #36H
CPL P1.0
POP ACC
POP PSW
RETI
TABLE2:
DW 64580,64684,64777,64820,64898,64968,65030
END
只要将这两个程序综合起来就可以完成设计要求了,注意因为在这两个程序分开考虑的时候都是用定时器0来完成的。
而综合起来是只要改变其中一个为定时器1即可。
程序如下:
ORG 0000H
SJMP BEGIN
ORG 000BH
LJMP TIM0
ORG 001BH
LJMP TIM1
BEGIN:
MOV TMOD,#11H
MOV IE, #8AH
L1:
CALL KEY
JB F0, L1 /没有键按下则继续扫描/
MOV A,R3
CJNE A,#07H,SOPP
SJMP REPE
SOPP:
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV 35H, A /T值高字节放入35H中/
MOV TH1, A
MOV A, R3
RL A
INC A
MOVC A, @A+DPTR
MOV 36H, A /T值高字节放入36H中/
MOV TL1, A
SETB TR1
L2:
CALL KEY
JB F0, L3
SJMP L2
L3:
CPL TR1
SJMP L1
KEY:
MOV R3, #00H /R3中的数表示是那个键按下/
JNB P2.0, LOOP
INC R3
JNB P2.1, LOOP
INC R3
JNB P2.2, LOOP
INC R3
JNB P2.3, LOOP
INC R3
JNB P2.4, LOOP
INC R3
JNB P2.5, LOOP
INC R3
JNB P2.6, LOOP
INC R3
JNC P2.7, LOOP
SETB F0
SJMP DO
LOOP:
CLR F0
DO:
NOP
RET
TIM1:
PUSH ACC
PUSH PSW
MOV TH1, #35H
MOV TL1, #36H
CPL P1.0
POP ACC
POP PSW
RETI
REPE:
MOV 30H, #00H /取简谱码指针/
NEXT:
MOV A, 30H /简谱码指针存入A/
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV R2, A /音符码存入R2中/
CJNE A,#0FFH,GOOT/是否取到了规定的结束码 “FFH”/
SJMP END0
GOOT:
INC 30H
MOV A, 30H
MOVC A,@A+DPTR
MOV R5, A /节拍数存放在R5中/
MOV A, R2 /音符码存入A中/
CJNE A,#24H,SING /取到的音符码是否为“24H”/
CLR TR0 /是,则不发音/
JMP D1
SING:
MOV 31H, A /音符码存入31H中/
RL A
MOV DPTR, #TABLE1
MOVC A,@DPTR+A /找到TABLE1中对应的T值/
MOV 32H, A /取到T值的高字节存入32H中/,
单片机电子琴设计
MOV TH0,A
MOV A,31H
RL A
INC A
MOVC A,@DPTR+A
MOV 33H, A /取到T值的高字节存入33H中/
MOV TL0,A
SETB TR0 /启动TIMER0/
D1:
CALL DELAY
INC 30H
SJMP NEXT
END0:
CLR TR0
SJMP REPE
TIM0:
PUSH ACC
PUSH PSW
MOV TH0,32H
POP PSW
RETI
DELAY:
MOV R7,#02
D2:
MOV R4,#187
D3:
MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
TABLE1:
DW 63628,63731,63835,63928,64021,64103
DW 64185,64260,64331,64400,64463,64524
DW 64580,64633,64684,64732,64777,64820
DW 64860,64898,64934,64968,64994,65030
DW 65058,65085,65110,65134,65157,65178
DW 65198,65217,65235,65252,65268,65283
TABLE:
13H, 02H, 24H, 01H, 13H, 01H, 15H, 04H 13H, 04H, 18H, 04H, 17H, 04H
24H, 04H, 13H, 02H, 24H, 01H, 13H, 01H, 15H04H, 13H, 04H, 1AH, 04H
18H, 04H, 24H, 04H, 13H, 02H, 24H, 01H,