基于51单片机的电子琴课程设计Word格式.docx
- 文档编号:21666204
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:20
- 大小:420.63KB
基于51单片机的电子琴课程设计Word格式.docx
《基于51单片机的电子琴课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的电子琴课程设计Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
2.1总体设计
实现本次设计的方案有多种,下面比较说明一下最佳方案的选择。
方案一:
采用单个的逻辑器件组合
音乐是有由不同的音阶组成的,而不同的音阶又是由不同的频率发出的,那么利用不同的频率,就可以发出不同的音乐了。
我们知道计数器8253可以产生任意频率的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率与计数器的频率对应起来就可通过计数器产生音乐了。
根据本实验要求,采用8279将键扫得到的键值通过查表得到相应的8253的频率值,将从8253得到相对应的按键弹奏信号经过LM386进行放大,再用喇叭输出,就实现了简易电子琴的基本功能,也就完成了实验的要求。
方案二:
用VHDL语言编程来实现
系统整体基本原理图如下:
图1、系统整体基本原理图
利用我们实验室先进的数字电路实验设备,我们可以采用VHDL语言编程来实现。
我们可以通过VDHL语言,对实验原理图的各个部分进行设计,通过编译,可以在计算机上下载此实验原理图,利用电路学习机上的芯片。
我们很快就可以设计出一个简单的电子琴。
并实现其功能。
方案三:
采用AT89S52单片机作为主控芯片,设置键盘、蜂鸣器等外围器件,另外还用到一些简单器件如:
最后用蜂鸣器发音。
三种方案的比较:
方案一采用单个的逻辑器件组合实现。
这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然,但是由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、体积过大等不利因素。
例如七个不同的音符是由七个不同的频率来控制发出的,所用仪器之多显而易见。
方案二采用VHDL语言编程来实现电子琴的各项功能。
系统主要由电子琴发声模块、选择控制模块和储存器模块组成。
和方案一相比较,方案二就显得比较笼统,虽然我们可以看到用超高速硬件描述语言VHDL的优势,但本质上它只是把整个系统分为了若干个模块,而不牵涉到具体的硬件电路。
方案三与前两种方案相比,主控芯片采用AT89S52单片机,它是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
同时具有强大的控制功能和灵活的编程实现特性,由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。
而第三种方案具有经济可行性、技术可行性、实物应用性。
综上所述,本次课程设计采用第三种方案。
2.2单片机选型
硬件电路要以单片机作为主控芯片,实现按键输入音符和音调,两位数码管的显示以及低音频功率放大和蜂鸣器发音。
针对本设计的功能和用途,采用AT89S51单片机更好,实现功能完全,性价比较高,更适合本设计。
2.3单片机的最小工作系统
单片机加上适当的外围器件和应用程序,构成的应用系统称为最小系统。
单片机内部具有一个高增益反相放大器,用于构成振荡器。
通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,结构图2中X1、C1、C2。
可以根据情况选择6MHz、12MHz或24MHz等频率的石英晶体,补偿电容通常选择30pF左右的瓷片电容。
图2、时钟电路
单片机小系统常采用上电自动复位和手动按键复位两种方式实现系统的复位操作。
上电复位要求接通电源后,自动实现复位操作。
手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。
其结构如下图。
上电自动复位通过电容C3充电来实现。
手动按键复位是通过按键将电阻R1与VCC接通来实现。
图3、复位电路
2.4原理框图
本系统有主控芯片89S52、发音单元、显示模块、按键模块组成。
图4、原理框图
2.5按键部分设计
2.5.1操作键设计
常用的按键有三种:
机械触点式按键、导电橡胶式和柔性按键(又称触摸式键盘)。
机械触点式按键是利用机械弹性使键复位,手感明显,连线清晰,工艺简单,适合单件制造。
但是触点处易侵入灰尘而导致接触不良,体积相对较大。
导电橡胶按键是利用橡胶的弹性来复位,通过压制的方法把面板上所有的按键制成一块,体积小,装配方便,适合批量生产。
但是时间长了,橡胶老化而使弹力下降,同时易侵入灰尘。
柔性按键是近年来迅速发展的一种新型按键,可以分为凸球型和平面型两种。
柔性按键最大特点是防尘、防潮、耐蚀,外形美观,装嵌方便。
而且外形和面板的布局、色彩、键距可按照整机的要求来设计。
但是由于客观条件与经济能力有限,本系统采用机械触点式按键。
2.5.2键盘设计
键盘在单片机应用系统中是一个关键的部件,它能实现向计算机输入数据,传送命令等功能,是人工干预计算机的主要手段。
键盘可以分为2类:
独立连接式键盘和矩阵式键盘。
(1)矩阵式键盘
单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。
矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。
显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。
矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上.当无键按下时,行线处于高电平状态;
当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。
这是识别按键是否按下的关键。
(2)独立连接式键盘
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,然而,在按键较多时,I/O口线浪费较大,不宜采用。
独立式按键软件常采用查询式结构。
先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
由于本程序较为简单,为了使用方便及节省资源,选择独立式键盘。
下图为独立式键盘电路图:
图6、独立式键盘电路图
2.5.3去抖动
键盘编程中主要考虑去抖动的问题。
当测试表明有键被按下之后,紧接着就进行去抖动处理。
因为键是机械开关结构,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。
为保证键识别的准确,在电压信号抖动的情况下不能进行行状态输入。
为此需进行去抖动处理。
去抖动有硬件和软件两种方法。
硬件方法就是加去抖动电路,从根本上避免抖动的产生。
软件消抖,在第一次检测到有键按下时,执行一段延时程序之后,再检测此按键,如果第二次检测结果仍为按下状态,CPU便确认此按键己按下,消除了抖动。
2.6发音部分设计
如下图所示,发音电路是由蜂鸣器、三极管、上拉电阻构成。
由三极管来驱动扬声器发音的,同时加上拉电阻增强驱动电流,提高驱动能力。
图7、发音部分电路图
3.系统软件设计
3.1系统分析
(1)键盘扫描程序:
检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;
无按键按下,则返回键盘扫描程序继续检测。
(2)功能转移程序:
对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲的功能。
(3)琴键处理程序:
根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。
(4)自动播放歌曲程序:
检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有按键按下。
N
N
Y
3.2参数计算
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。
就可在P1.0引脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
例如,频率为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)。
fr=65536-1000000÷
fr=65536-500000/fr,中音DO的T=65536-500000/523=64580。
(1)单片机12MHZ晶振,中音符与计数T0相关的计数值如表所示:
音符
频率(HZ)
计数值(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
370
64185
1046
65058
低SO
392
64260
1109
65085
415
64331
高2RE
1175
65110
低6LA
440
64400
1245
65134
466
64463
高3MI
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
1490
65198
554
64633
高5SO
1568
65217
中2RE
587
1661
65235
622
64884
高6LA
1760
65252
中3MI
659
64732
1865
65268
中4FA
698
64820
高7SI
1967
65283
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
低音0-19之间,中音在20-39之间,高音在40-59之间。
用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。
为了输出合适的方波,首先应该知道音符与频率的关系。
(2)音调数据表
曲调值
DELAY
调4/4
125ms
62ms
调3/4
187ms
94ms
调2/4
250ms
上表中的频率数值,有些过多,去掉不常用的黑键频率,只是把白键对应的数据存放在单片机中,即可满足绝大部分的应用需求。
定义音调数据表的程序如下:
DW63628,63835,64021,64103,64260,64400,64524;
64580,低音区:
1234567
DW64580,64671,64777,64820,64898,64968,6503065058中音区:
DW65058,65110,65157,65178,65217,65252,6528365312高音区:
把这个数据表,放在程序中,需要播音的时候,就从表中取出一个数据送到定时器,当定时器溢出中断的时候,再对输出引脚取反,那么,在扬声器中,即可听到上表中频率的声音。
3.3程序设计
在软件设计中采用yinjie代表音阶,如下图所示
音阶
Yinjie值
高
2
中
1
低
初始化状态为中音(yinjie=1),电路中设计高、低两个音阶键。
上电后,若无按键按下,则为中音模式。
若音阶键被按下,则如下流程图所示,初始化后进行按键扫描,在高音键按下,若初始yinjie不为2,则另yinjie=2,进入高音工作模式,若初始yinjie为2,则对yinjie进行初始化,即另yinjie=1,重新进入进入中音工作模式,这样即实现了高音键切换高、中音方式的转换。
同理,用低音键实现中、低音的切换。
图9、判断音阶(高中低音)子程序
图10、播放子程序
4.Proteus软件仿真
4.1硬件调试
硬件调试主要是针对单片机部分进行的调试。
在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。
在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。
注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要是检测单片机控制部分、音频转换电路硬件调试。
键盘单片机控制部分调试:
上电后,随机按动键盘可以发现各个按键对应的音正确。
4.2软件调试
调试主要方法和技巧:
通常一个调试程序应该具备至少四种性能:
跟踪、断点、查看变量、更改数值。
整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。
4.3仿真结果(任举一例)
图10、低音音符DO仿真图
4.4结果分析
根据仿真结果可知,本次课程设计能够准确并彻底的完成设计要求。
分别按下左侧的七个按键,蜂鸣管会依次发出DO、RE、MI、FA、SO、LA、SI七种音符。
右侧前两个按键可以改变音调,能够进行高、中、低音的自由切换。
最下面的按键是预存音乐“送别”的控制开关,可以进行音乐的播放与暂停。
5.课程设计体会
总体来说,此次单片机课程设计使我们收获良多,虽然课程设计的过程中遇到了很多困难与问题,但我们最终还是完成了设计的任务及要求。
具体来说可以分为以下几点:
第一,不够细心,不够严谨(如因为粗心大意而焊错线);
第二,因对课本理论的掌握度不够导致编程出现错误;
第三,硬件方面,刚开始有的程序模块不能实现预期的效果,对于有的硬件,在实物制作过程中焊了比较多的排线,同时对于整体各元器件的布局都有很高的要求。
不过在向同学请教,各方面都有了不同程度的改善;
第四,在做人方面,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没有什么办不到的。
这次课程设计中,经过我们的努力,在仿真软件和实物上都实现了高、中、低21个音符的发声和音乐的自动播放,使我们有了一定的成就感,也使我们进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤,掌握了单片机仿真软件Proteus的使用方法和键盘、显示器在的单片机控制系统中的应用,同时也掌握了撰写课程设计报告的方法。
总之,通过这次课程设计,我们都清楚明白了自己的能力有多深,想提高还得归于多锻炼,多动手,多向别人学习。
参考文献
【1】徐泳龙·
单片机及原理及应用·
北京:
机械工业出版社,2013
【2】胡学海·
单片机原理及应用系统设计·
北京电子工业出版社,2005
【3】高伟·
.AT89单片机原理及应用·
国防工业出版社,2008
附1源程序代码
#include<
reg52.h>
#definekeyportP1
#defineucharunsignedchar
#defineuintunsignedint
ucharhigh,low;
//定时器预装值的高8位和低8位
sbitspeak=P3^0;
sbitgao=P3^5;
sbitdi=P3^6;
sbitzdbf=P3^7;
ucharyinjie=1;
uchartime;
ucharn=0;
ucharbo=0;
ucharcodefre[][2]={
0x8c,0xf8,
0x5b,0xf9,
0x15,0xfa,
0x67,0xfa,
0x90,0xfb,
0xae,0xfb,
0x0c,0xfc,//低音
0x44,0xfc,
0xac,0xfc,
0x09,0xfd,
0x34,0xfd,
0x82,0xfd,
0xc2,0xfd,
0x06,0xfe,//中音
0x22,0xfe,
0x56,0xfe,
0x85,0xfe,
0x9a,0xfe,
0xc1,0xfe,
0xe4,0xfe,
0x03,0xff,//高音
};
voiddelay(uint);
voidITimer0(void);
//定时器初始化
voidkey(void);
voiddtxs(int,int);
voidsong()
{
TH0=high;
TL0=low;
TR0=1;
delay(time*240);
}
voidyinyue()
ucharcodehls[]={5,2,2,3,2,1,5,2,1,1,3,4,6,2,2,1,3,2,5,2,4,5,2,2,1,2,1,2,2,1,3,2,2,2,2,1,
1,2,1,2,2,6,5,2,2,3,2,1,5,2,1,1,3,3,7,2,1,6,2,2,1,3,2,5,2,4,5,2,2,
2,2,1,3,2,1,4,2,3,7,1,1,1,2,6,6,2,2,1,3,2,1,3,4,7,2,2,6,2,1,7,2,1,1,3,4,6,2,1,
7,2,1,1,3,1,6,2,1,6,2,1,5,2,1,3,2,1,1,2,1,2,2,6,5,2,2,3,2,1,
1,2,1,1,3,3,7,2,1,6,2,2,1,3,2,5,2,4,5,2,2,2,2,1,3,2,1,4,2,3,7,1,1,1,2,6
};
ucharm;
n=0;
while(n<
174)
{
m=hls[n]+7*(hls[n+1]-1)-1;
high=fre[m][1];
low=fre[m][0];
time=hls[n+2];
n=n+3;
song();
}
}
voidmain(void)
ucharnum;
ITimer0();
speak=0;
while
(1)
key();
switch(keyport)
{
case0xfe:
num=1;
break;
case0xfd:
num=2;
case0xfb:
num=3;
case0xf7:
num=4;
case0xef:
num=5;
case0xdf:
num=6;
case0xbf:
num=7;
case0x7f:
num=8;
default:
num=0;
}
if(num==0)
TR0=0;
speak=0;
else
high=fre[7*yinjie+num-1][1];
low=fre[7*yinjie+num-1][0];
TR0=1;
dtxs(yinjie,num);
voidITimer0(void)
TMOD|=0x01;
//使用模式1,16位定时器,使用"
|"
符号可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 电子琴 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)