基于51单片机带存储播放功能功能的电子琴【参考】Word文件下载.docx
《基于51单片机带存储播放功能功能的电子琴【参考】Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机带存储播放功能功能的电子琴【参考】Word文件下载.docx(31页珍藏版)》请在冰点文库上搜索。
屏等外围器件,另外还用到一些简单器件如NPN型三极管及电阻等。
利用按键实现音符和音调的输入;
LCD显示屏进行被操作的按键显示;
用PNP型三极管2N2907实现低音频功率放大;
最后用扬声器发音。
主控芯片采用AT89C51单片机,它是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
避免了由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、体积过大等不利因素。
同时具有强大的控制功能和灵活的编程实现特性,由于本设计主要用于娱乐方面,因此在设计上尽量使其安全以及简单易操作。
具有经济可行性、技术可行性、实物应用性。
第三章 硬件系统设计
3.1时钟电路
MCS-51内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端输出端。
本图采用内部时钟电路,如图3-1所示,通常在引脚XTALl和XTAL2上跨接石英晶体X1和两个补偿电容C1、C2构成自激振荡器。
可以根据情况选择2~12MHz频率之间的石英晶体,补偿电容通常选择30pF左右的瓷片电容。
3.2复位电路
图3-1 时钟电路
单片机小系统常采用上电自动复位和手动按键复位两种方式实现系统的复位操作。
本实验采用上电自动复位方式,其结构图如图3-2所示。
上电复位要求接通电源后,自动实现复位操作。
复位电路的基本功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。
对于MCS-51单片机,只要在RST复位端接一个电容至VCC和一个电阻至VSS即可。
在加电瞬间,RST端出现一定时间的高电平,只要高电平保持时间足够长,就可以使MCS-51复位。
图3-2 复位电路
3.3原理框图
本系统有主控芯片AT89C52、扬声器、显示模块、按键模块和晶振复位电路组成。
图3-3 原理框图
3.4显示部分设计
为了让电子琴能够显示出音调,我们另外附加了一个LCD1602提供屏幕式音调显示,LCD1602属于字符型液晶,可以显示字母和数字等字符。
LCD1602是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
图3-4 显示电路
3.5按键部分设计
3.5.1键盘设计
键盘可以分为2类:
独立连接式键盘和矩阵式键盘。
本设计采用独立式键盘。
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一
根I/O口线,每个按键的工作不会影响其它I/O口线的状态。
独立式按键电路配置灵活,软件结构简单。
独立式按键软件常采用查询式结构。
先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
由于本程序较为简单,为了使用方便及节省资源,选择独立式键盘。
下图为独立式键盘电路图:
3.5.2去抖动
图3-5 独立式键盘电路图
键盘编程中主要考虑去抖动的问题。
当测试表明有键被按下之后,紧接着就进行去抖动处理。
因为按键是机械开关结构,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。
为保证键识别的准确,在电压信号抖动的情况下不能进行行状态输入。
为此需进行去抖动处理。
去抖动有硬件和软件两种方法。
硬件方法就是加去抖动电路,从根本上避免抖动的产生。
软件消抖,在第一次检测到有键按下时,执行一段延时程序之后,再检测此按键,如果第二次检测结果仍为按下状态,CPU便确认此按键己按下,消除了抖动。
本实验采用软件消抖法,在按键按下后,执行一段延时程序。
3.6发音部分设计
如下图所示,发音电路是由扬声器、三极管、变位器构成。
由三极管来驱动扬声器发音的,同时加上变位器实现电阻的可调来增强驱动电流,提高驱动能力,从而调节扬声器的音效。
图3-6扬声器电路图
第四章软件系统设计
4.1系统分析
4.1.1系统软件的组成
(1)键盘扫描程序:
检测是否有按键按下,有按键按下则记录按下键的键
值,并跳转至功能转移程序;
无按键按下,则返回键盘扫描程序继续检测。
(2)功能转移程序:
对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有三种,即音色调节功能、自动播放乐曲和录音的功能。
(3)琴键处理程序:
根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。
(4)自动播放歌曲程序:
检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放的歌曲或录音歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有按键按下。
(5)录音程序:
检测到按键按下的是录音功能键后执行该程序,跳转到键盘扫描程序,检测是否有键按下,有按键按下则记录按下键值,根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音并跳转到功能转移程序。
录音功能键按下
Y
记录音符
N
演奏功能键按下
自动播放键按
下
播放音符
查表得到按键音符频率
播放内部存储的音乐
键盘扫描程序
初始化T0
开始
4.1.2系统总体功能流程图
4.2参数计算
4.2.1发音原理
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以
2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。
就可在P1.0引脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
4.2.2音调的确定
音调是唱曲时乐音的发音,一般依次唱成
DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音。
例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系式是:
N=fi÷
2÷
fr,式中,N是计数值;
fi是机器频率
(晶体振荡器为12MHz时,其频率为1MHz);
fr是想要产生的频率。
其计数初值T的求法如下:
T=65536-N=65536-fi÷
fr
例如:
设K=65536,fi=1MHz,求中音DO(261Hz)。
T=65536-N=65536-fi÷
fr=65536-1000000÷
fr=65536-500000/fr,中音DO的T=65536-500000/523=64580。
由音符的频率值可以计算得出各个音调的计数值,如表4-1所示:
(﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。
)
表4-1音调频率与计数初值对照
音符
频率
(Hz)
计数值(T
值)
计数值(T值)
低
1DO
262
63628
#4FA#
740
64860
#
1DO#
277
63737
中5SO
784
64898
2RE
294
63835
#5SO#
831
94934
2RE#
311
63928
中6LA
880
64968
3MI
330
64021
#6LA#
932
64994
4FA
349
64103
中7SI
968
65030
4FA#
370
64185
104
6
65058
SO
392
64260
#1DO#
110
9
65085
5SO#
415
64331
高2RE
117
5
65110
6LA
440
64400
#2RE#
124
65134
6LA#
466
64463
高3MI
131
8
65157
7SI
494
64524
高4FA
139
7
65178
中
523
64580
149
65198
554
64633
高5SO
156
65217
587
166
1
65235
622
64884
高6LA
176
65252
659
64732
186
65268
698
64820
高7SI
196
65283
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据。
4.2.3节拍的确定
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。
“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。
若1拍实0.5s,则1/4拍为0.125s,只要设定延迟时间就可以求得节拍的时间,假设1拍为4DELAY,则1/4应为1DELAY,以此类推,得到如表4-2所示的节
拍与延迟时间对照表。
休止符表示暂停发音。
表4-2 1/4和1/8节拍的时间设定
曲调值
DELAY
调4/4
125毫秒
62毫秒
调3/4
187毫秒
94毫秒
调2/4
250毫秒
4.3程序设计
4.3.1播放子程序(包括自动播放存储音乐和按键发音)
本设计共两种播放模式,包括自动播放存储音乐和按键发音。
上电后,首
先开中断并设定定时器0为工作方式1,当自动播放键按下时,进入中断,根据乐谱在定义的音频数组中查找相应音律,然后给定时器赋初值,即开始播放音乐。
当DO、RE、MI、FA、SO、LA、SI七种音符键按下时,根据音符值在定义的音频数组中查找相应音律,然后给定时器赋初值,即按键发音。
播放音乐
给定时器T0赋
播放键值对应的音符
给定时器T0赋值
根据乐谱在数组中查找相应音律
进入中断
根据yinfu和工作方式取值,并在数组中查找相应音律
有键按下
开中断并设定工作寄存器
第五章实验结果
5.1硬件调试
硬件调试主要是针对单片机部分进行的调试。
在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。
在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。
注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要是检测单片机控制部分、数码管点亮部分、和音频转换电路硬件调试。
1、数码管LED电路调试:
接通电源,随机按下按钮可以看到数码管显示数字。
2、键盘单片机控制部分调试:
上电后,随机按动键盘可以发现各个按键对应的音正确。
5.2软件调试
调试主要方法和技巧:
通常一个调试程序应该具备至少四种性能:
跟踪、
断点、查看变量、更改数值。
整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。
5.3仿真结果
第六章 总结
本次51单片机课程设计我们组做的是《基于AT89C51单片机的屏幕式声
光电子琴的设计》,通过这次的DIY制作的学习,我学到了不少知识,真正体会到了学以致用的快感,通过自己动手制作小作品不仅加深了我们对51单片机的理解,而且也增强了我们对音乐的兴趣,也因此喜欢上了各种基于51单片机的小制作,从而更好地将课本知识与实践过程相结合。
在这次课程设计中,主要涉及了软件和硬件两个方面的内容。
在软件方面,我们掌握了仿真软件proteus的仿真方法,实现了7音符的发声、录音以及音乐的自动播放功能,同时也提高了我们用汇编语言编程的能力;
在硬件方面,我们对电子产品的开发流程和功能应用有了一定的了解,进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤。
并且提高了我们运用所学的专业基础知识来解决实际问题的能力,加深了对所学理论知识的理解和运用,动手能力也得到了相应的提高,创新意识得到了锻炼。
在本次的实验设计中,我们在借鉴前人的基础上也对自己的作品进行了一部分创新,①在设置录音功能方面,根据随机弹奏的音调,将其偏移地址存入36H单元中,然后通过查询音调表,使其发出相应频率的声音,从而弹奏出事先录好的一段音乐。
②在控制节奏方面,我们设置了休止符,来控制节奏的停顿,这样就能产生有停顿感的音乐,而不是连续的,使音乐听起来更加悦耳。
而这些创新均基于汇编语言的学习。
总体来说,此次单片机课程设计使我们收获良多,虽然课程设计的过程中遇到了很多困难与问题,但我们最终还是完成了设计的任务及要求。
也让我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没有什么办不到的。
最后,衷心感谢老师给我们提供了这样一次难得的机会来展示自己的作品,激发了我们对单片机DIY小制作的兴趣,也感谢老师在这个学期孜孜不倦的教悔,让我们在学习单片机的基础知识的同时,真正体会到学以致用带来的快感。
由此我觉得,我们的学习不仅要在教师引导和帮助下顺利入门,还要掌握自动控制原理课程的精髓和要点,并且能够“由厚及薄”,达到对课程整体的把握,
具有一定的工程概念和实践能力。
附录一:
源程序
RSEQUP3.5RWEQUP3.6EEQUP3.7ORG00HSJMPMAINORG00BHMOVTH0,33HMOVTL0,34HCPLP3.4
RETI
;
!
ORG 001BH
INC 3CH ;
中断服务,中断计数器加1MOV TH1,#0D8H
MOV TL1,#0EFH ;
12M晶振,形成10毫秒中断RETI
ORG30H
MAIN:
SETBP3.4 ;
关闭扬声器LCALLCSH1602 ;
初始化1602
MOV TMOD,#11H ;
设置定时器0为工作模式1SETB EA ;
开总中断
SETB ET0 ;
开定时器0中断HUANYING:
MOVP1,#80H ;
欢迎语显示地址LCALLENABLE
MOVDPTR,#TAB_HYMOV30H,#00
LP:
MOVA,30HMOVCA,@A+DPTRJZKEY
LCALLDELAY_100MSLCALLWRITE_1602INC30H
SJMPLP
KEY:
MOVP1,#01H ;
清屏ACALLENABLE
MOVP1,#80HLCALLENABLE
MOVDPTR,#TAB_YANZHOUMOV30H,#00
LP7:
MOVA,30H
MOVCA,@A+DPTRJZKEY_0
LCALLWRITE_1602INC30H
SJMPLP7
KEY_0:
MOVP1,#0C0H ;
音符的显示地址LCALLENABLE
MOV38H,#16 ;
写入1602的显示地址指针
MOV35H,#2 ;
控制节拍
KEY_1:
MOVP2,#0FFH ;
置P2为输入
JBP2.0,KEY_2 ;
K1键没按下,转移
LCALLDELAY_10MS ;
延时消抖JNBP2.0,$
MOV36H,#0 ;
装入1的音符码相对地址
LCALL BOFANG_YF
KEY_2:
KEY_3:
KEY_4:
KEY_5:
KEY_6:
KEY_7:
KEY_9:
JBP2.1,KEY_3 ;
K2键没按下,转移
延时消抖JNBP2.1,$
MOV36H,#2
JBP2.2,KEY_4 ;
K3键没按下,转移LCALLDELAY_10MS ;
延时消抖JNBP2.2,$
MOV36H,#4
JBP2.3,KEY_5 ;
K4键没按下,转移LCALLDELAY_10MS ;
延时消抖JNBP2.3,$
MOV36H,#6
JBP2.4,KEY_6 ;
K5键没按下,转移LCALLDELAY_10MS ;
延时消抖JNBP2.4,$
MOV36H,#8
JBP2.5,KEY_7 ;
K6键没按下,转移LCALLDELAY_10MS ;
延时消抖JNBP2.5,$
MOV36H,#10
JBP2.6,KEY_9 ;
K7键没按下,转移
延时消抖JNBP2.6,$
MOV36H,#12
JBP3.2,KEY_1 ;
K9键没按下,重新扫描
延时消抖JNBP3.2,$
LCALLDELAY_10MS
-----------播放音乐程序段---------------
MOVP1,#01H ;
MOVDPTR,#TAB_PLAYMOV30H,#00
LP8:
MOVCA,@A+DPTRJZPLAY
SJMPLP8
PLAY:
MOVP2,#0FFH ;
JBP2.0,PLAY_2 ;
MOVDPTR,#TAB_GEQU1 ;
存曲目标志LCALL BOFANG_GEQU
PLAY_2:
JBP2.1,PLAY_3 ;
SETBET1MOV3BH,TMOD
MOV TMOD,#11H
movdptr,#tab2movp1,#0c0hlcallenablelcallwrite1
MOV DPTR,#DAT2LCALLMUSIc0CLRTR1
CLRET1
MOVTMOD,3BHPLAY_3:
JBP2.2,PLAY_4 ;
K3键没按下,转移
SETBET1
MOV3BH,TMOD
movdptr,#tab1movp1,#0c0hlcallenablelcallwrite1
MOV DPTR,#DAT1LCALLMUSIc0CLRTR1
MOVTMOD,3BHPLAY_4:
JBP2.3,PLAY_9MOVR1,#50H
LCALLBOFANG_LUYIN
PLAY_9:
JBP3.2,PLAY ;
K8键没按下,重新扫描
LCAL