单片机电子琴设计-论文
单片机电子琴设计
目 录
电子琴的设计(摘要) ……………………………………………… 3 绪论…………………………………………………………………… 4 一 设计原理 …………………………………………………… 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值) 低 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 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
建立音乐的步骤:
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
单片机电子琴设计
3 软件设计
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拍的倍数。
2〃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 3.键盘扫描程序的编写
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, 15H
04H, 13H, 04H, 1AH, 04H
18H, 04H, 24H, 04H, 13H, 02H, 24H, 01H,
13H, 01H, 1FH, 04H, 1CH, 04H
0FFH
TABLE2: 64580, 64684, 64777, 64820, 64898, 64968, 65030 END
【参考文献】
[1]常青,陈辉煌,孙广富等. 可编程专用集成电路及其应用与设计实践. 国防工业出版社
[2]赵曙光,郭万有等. 可编程逻辑器件原理、开发与应用. 西安电子科技大学出版社
]范逸之,陈立元. Visual Basic与RS232串行通讯控制. 中国青年出版社. 2002第2版
[6]候伯亨,顾新. VHDL硬件描述语言与数字逻辑电路设计. 西安电子科技大学出版社
结束语
通过这次设计,以及对市场的调查。任何复杂的东西都是由简单的模块构成的, 只要有恒心就能完成任何事情。文中还有不少的欠缺希望老师多多点评
本文档为【单片机电子琴设计-论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。