基于AT89S52单片机的电子琴方案设计书.docx
《基于AT89S52单片机的电子琴方案设计书.docx》由会员分享,可在线阅读,更多相关《基于AT89S52单片机的电子琴方案设计书.docx(29页珍藏版)》请在冰点文库上搜索。
基于AT89S52单片机的电子琴方案设计书
【摘要】微型电子琴的设计以AT89S52单片机作为系统的核心控制部分,通过制作硬件电路和软件的设计编写,然后进行软硬件的调试运行,最终达到设计电路的乐器演奏、点歌、存储及显示功能。
设计中应用中断系统和定时/计数原理控制演奏器发声,对音乐发生所必须确定的音符和节拍分别用程序语言实现。
可以用它来弹奏和播放乐曲。
特点是设计思路简单、清晰,成本低。
1.前言………………………………………………………………………………1
1.1系统开发背景……………………………………………………………………1
1.2系统开发意义…………………………………………………………………1
1.3设计目标………………………………………………………………………1
2.方案论证…………………………………………………………………………1
2.1控制模块选择方案………………………………………………………………1
2.2按键选择方案……………………………………………………………………1
3.系统硬件设计及说明…………………………………………………………2
3.1系统组成及总体框图……………………………………………………………2
3.2元件简介…………………………………………………………………………2
3.2.1AT89S52…………………………………………………………………………2
3.2.2LM386…………………………………………………………………………3
3.2.3LED数码管……………………………………………………………………5
3.3音频功放电路……………………………………………………………………6
3.4显示电路…………………………………………………………………………7
4.系统软件设计……………………………………………………………………7
4.1音乐相关知识……………………………………………………………………7
4.2如何用单片机实现音乐的节拍…………………………………………………7
4.3如何用单片机产生音频脉冲……………………………………………………7
4.4系统总体功能流程图……………………………………………………………8
5.系统调试…………………………………………………………………………11
5.1硬件调试…………………………………………………………………………11
5.2软件调试…………………………………………………………………………11
6.结论………………………………………………………………………………11
7.参考文献…………………………………………………………………………11
附录1:
元器件清单………………………………………………………………12
附录2:
主要电路原理图………………………………………………………13
附录3:
程序………………………………………………………………………13
1前言
1.1系统开发背景
随着电子科技的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣。
基于当前市场上的玩具市场需求量大,其中电子琴就是一个很好的应用方面。
单片机技术使我们可以利用软硬件实现电子琴的功能,从而实现电子琴的微型化,可以用作玩具琴、音乐转盘以及音乐童车等等。
并且可以进行一定的功能扩展。
鉴于传统电子琴可以用键盘上的“1”到“A”键演奏从低So到高DO等11个音,从而可以用来弹奏喜欢的乐曲。
该设计将十一个琴键改成16个,使电子琴的功能更加完美。
不但可以实现对乐曲的演奏,同时还具有存储音乐、播放歌曲以及显示按键的功能。
使该设计功能更加完善。
1.2系统开发意义
该设计具有以下优点:
①可以随意弹奏想要表达的音乐;
②比传统电子琴功能更完善
③制作简单,成本低
1.3设计目标
由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。
其次,在这次设计可行性上进行分析如下:
1、经济可行性:
所谓经济可行性,即在这次设计上需要投入资金的多少,由于毕业设计是没有工程资金,没有开发经费,因此在经济上必须能够承受,比较理想化的工程对于我们毕业设计来说是不可行的。
通过分析后,无论是在器件价格或是常见度上均是可行的。
2、技术可行性:
技术可行性主要是分析技术条件上是否能够顺利开展并完成开发工作,硬件、软件能否满足设计者的需要等。
通过分析各种软件环境,硬件仿真环境等均已经具备。
综上所述,本系统设计目标已经明确,在经济与技术上均可行,因此本系统的开发是完全可行的。
2方案论证
2.1控制模块选择方案
方案一:
用可控硅制作电子琴。
将220V交流电经变压器降压,再经过整流、滤波,获得+13.5V直流电压。
将单向可控硅SCR和电阻、电容组成驰张振荡器电路。
但该设计方案制作成本高且复杂。
方案二:
采用AT89C51单片机进行控制,由于AT89C51不具备ISP功能,因此Atmel公司已经停产在市面上已经不常见,况且其ROM只有4K在系统将来升级方面没有潜力。
方案三:
采用AT89S52单片机进行控制,由于其性价比高,完全满足了本作品智能化的要求,它的内部程序存储空间达到8K,使软件设计有足够的内部使用空间并且方便日后系统升级,使用方便,抗干扰性能提高。
鉴于上述对比与分析,本设计采用方案三
2.2按键选择方案
传统电子琴可以用键盘上的“1”到“A”键演奏从低SO到高DO等11音。
该设计有20个按钮矩阵,设计成16个音,可以实现音阶在低音4-高音5之间。
比传统音阶范围大,弹奏效果好。
3系统硬件设计及说明
3.1系统组成及总体框图
硬件设计的任务是根据总体设计要求,在选择的机型的基础上,具体确定系统中所要使用的元器件,设计出系统的原理框图、电路原理图。
该设计要实现一种由单片机控制的电子琴,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号。
该设计具有11个音节的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。
由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。
用单片机产生的音频脉冲直接驱动扬声器并不能产生所要实现的音乐,因为它没有足够的驱动能力,这就需要音频功率放大电路。
本例使用国家半导体公司的低压音频功率放大器LM386来实现音频功放电路。
图3-1系统结构图
3.2元件简介
3.2.1AT89S52
功能特性:
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
8位微控制器8K字节在系统可编程FlashAT89S52。
主要性能:
与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33Hz 、 三级加密程序存储器 、32个可编程I/O口线 、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
3.2.2LM386
LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。
为使外围元件最少,电压增益内置为20。
但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至200。
输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。
LM386的封装形式有塑封8引线双列直插式和贴片式。
图3-2LM386的封装形式
特性(Features)
静态功耗低,约为4mA,可用于电池供电。
工作电压范围宽,4-12Vor5-18V。
外围元件少。
电压增益可调,20-200。
低失真度。
其典型应用电路如下:
图3-3放大器增益=20(最少器件)
图3-4放大器增益=50
图3-5低频提升放大器
3.2.3LED数码管
本次毕业设计的显示电路采用LED数码管显示,LED(Light-EmittingDiode)是一种外加电压从而渡过电流并发出可见光的器件。
LED是属于电流控制器件,使用时必须加限流电阻。
LED有单个LED和八段LED之分,也有共阴和共阳两种。
常用的七段显示器的结构如图下图所示。
发光二极管的阳极连在一起的称为共阳极显示器(如图b所示),阴极连在一起的称为共阴极显示器(如图c所示)。
1位显示器由八个发光二极管组成,其中七个发光二极管a~g控制七个笔画(段)的亮或暗,另一个控制一个小数点的亮和暗,这种笔画式的七段显示器能显示的字符较少,字符的开头有些失真,但控制简单,使用方便。
此外,要画出电路图,首先还要搞清楚他的引脚图的分布,在了解了正确的引脚图后才能进行正确的字型段码编码。
才能显示出正确的数字来。
(a)外形(b)共阳极(C)共阴极
图3-6数码管引脚
图3-7数码管引脚接线图
3.3音频功放电路
在一定频率范围内的振动能够产生乐音,但是用单片机产生的音频脉冲直接驱动扬声器并不能产生所要实现的音乐,因为它没有足够的驱动能力,这就需要音频功率放大电路。
lm386功放最大的特点是低功耗,高增益,增益最高可达200。
LM386电源电压4--12V,音频功率0.5w。
LM386音响功放是由NSC制造的,它的电源电压范围非常宽,最高可使用到15V,消耗静态电流为4mA,当电源电压为12V时,在8欧姆的负载情况下,可提供几百mW的功率。
它的典型输入阻抗为50K。
本例使用国家半导体公司的低压音频功率放大器LM386来实现音频功放电路。
其电路以及各参数如下图
图3-8LM386电路图及各参数
图3-9LM386应用图
3.4显示电路
本次毕业设计的显示电路采用LED数码管显示,由于LED是属于电流控制器件,使用时必须加限流电阻。
因为在这次的设计中只用了一个数码管所以比较简单不予详细描述。
4系统软件设计
本软件设计关键是要实现一种由单片机控制的简单音乐发生器,它由16个音节组成的的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。
4.1音乐相关知识
乐音听起来有的高,有的低,这就叫音高,音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低声音就低,不同音商的乐音是用C、D、E、F、G、A、B表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,这是唱曲时乐音的发音,所以叫唱名。
音持续时间的长短即时值,一般用拍数表示,休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延时,构成音乐。
4.2如何用单片机实现音乐的节拍
除了音符以外,节拍也是音乐的关键组成部分。
节拍实际上就是音持续时间的长短,在单片机系统中可以用延时来实现,如果1/4拍的延时是0.4秒,则1拍的延时是1.6秒,只要知道1/4拍的延时时间,其余的节拍延时时间就是它的陪数。
如果单片机要自己播放音乐,那么必须在程序设计中考虑到节拍的设置,由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
音乐的音拍,一个节拍为单位(C调)具体如下表:
曲调值
DELAY
曲调值
DELAY
调4/4
125ms
调4/4
62ms
调3/4
187ms
调3/4
94ms
调2/4
250ms
调2/4
125ms
表4-1音乐节拍表
4.3如何用单片机产生音频脉冲
了解音乐的一些基本知识后可知,产生不同频率的音频脉冲即能产生音乐,对于单片机而言,产生不同频率有脉冲非常方便,可以利用它的定时/计数器来产生这样的方波频率信号,因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
在本实验中,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在此情况下,C调的各音符频率与计数值T的对照如下表:
音符
频率(HZ)
计数值(T值)
音符
频率(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
#4FA#
370
64185
低1DO
1046
65058
低SO
392
64260
#1DO#
1109
65085
#5SO#
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
#6LA#
466
64463
高3MI
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
#4FA#
1490
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64633
#5SO#
1661
65235
#2RE#
622
64884
高6LA
1760
65252
中3MI
659
64732
#6LA#
1865
65268
中4FA
698
64820
高7SI
1967
65283
表4-2音符频率与计数值T的对照表
T的值决定了TH0和TL0的值,其关系为:
TH0=T/256,TL0=T%256
4.4系统总体功能流程图
该程序设计思路比较清晰既从开始到声明变量与函数再到读取按钮开关,判断是否按下,然后就是一个一个按钮的动作。
其主程序框图如下:
图4-1主程序框图
按键子程序流程图如下:
5系统调试
电路调试是整个系统功能否实现的关键步骤,我们将整个调试过程分为三大部分:
硬件调试、软件调试和综合调试。
5.1硬件调试
硬件调试主要是针对单片机部分进行调试。
在上电前,先确保电路中不在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。
在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况等。
注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要键盘单片机控制部分、数码管点亮部分、和音频转换电路硬件调试。
1、数码管LED电路调试:
接通电源,随机按下按钮可以看到数码管显示数字。
2、键盘单片机控制部分调试:
上电后,随机按动键盘可以发现各个按键对应的音正确。
5.2软件调试
调试主要方法和技巧:
通常一个调试程序应该具备至少四种性能:
跟踪、断点、查看变量、更改数值。
整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。
6调试结论
通过各方面努力,本次毕业设计任务完成,系统部分功能已实现。
可以随意演奏一首喜欢的曲子,并可以显示在数码管上。
基本达到预定的效果。
毕业设计是本科学习阶段一次非常难得的理论与实践相结合的机会,通过这次比较系统的工程设计提高了我运用所学的专业基础知识来解决面临实际问题的能力,同时也提高了我查阅各种文献资料、设计手册、设计规范以及软件编程的水平。
附录1:
元器件清单
共阴数码管一只
扬声器一只
按键17只
钽电容:
0.1uf五只
晶振:
11.0592M一只
瓷片电容:
20pf二只
电解电容:
10uf三只47uf一只
电阻10K四只
排阻:
1K一只
数码管:
LED一只
集成块:
LM386一只
AT89C52一只
附录2:
主要电路原理图:
附录3:
程序清单
#include"reg52.h"
unsignedintcodetab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178}。
sbitP10=P1^0。
unsignedcharSTH0。
unsignedcharSTL0。
voiddelay(void)
{unsignedchari。
for(i=300。
i>0。
i--)。
}
unsignedchargetkey(void)
{unsignedcharscancode,tmpcode。
if((P2&0xf0)==0xf0)
return(0)。
scancode=0xfe。
while((scancode&0x10)!
=0)
{
P2=scancode。
if((P2&0xf0)!
=0xf0)
{
tmpcode=(P2&0xf0)|0x0f。
return((~scancode)+(~tmpcode))。
}
else
scancode=(scancode<<1)|0x01。
}
}
voidtime0_int(void)interrupt1using0
{
TH0=STH0。
TL0=STL0。
P10=~P10。
}
voidmain()
{unsignedcharkey,k。
TMOD=0x01。
ET0=1。
EA=1。
while
(1)
{
P2=0xf0。
if((P2&0xf0)!
=0xf0)
{
delay()。
if((P2&0xf0)!
=0xf0)
{
key=getkey()。
switch(key)
{
case0x11:
k=0。
P3=0xc0。
break。
case0x21:
k=1。
P3=0xf9。
break。
case0x41:
k=2。
P3=0xa4。
break。
case0x81:
k=3。
P3=0xb0。
break。
case0x12:
k=4。
P3=0x99。
break。
case0x22:
k=5。
P3=0x92。
break。
case0x42:
k=6。
P3=0x82。
break。
case0x82:
k=7。
P3=0xf8。
break。
case0x14:
k=8。
P3=0x80。
break。
case0x24:
k=9。
P3=0x90。
break。
case0x44:
k=10。
P3=0x88。
break。
case0x84:
k=11。
P3=0x83。
break。
case0x18:
k=12。
P3=0xc6。
break。
case0x28:
k=13。
P3=0xa1。
break。
case0x48:
k=14。
P3=0x86。
break。
case0x88:
k=15。
P3=0x8e。
break。
default:
P3=0xc7。
break。
}
P10=~P10。
STH0=tab[k]/256。
STL0=tab[k]%256。
TR0=1。
P2=0xf0。
while((P2&0xf0)!
=0xf0)
{
P2=0xf0。
}
TR0=0。
}
}
}
}
;4首歌
#include
sbitY1=P1^0。
sbitY2=P1^1。
sbitY3=P1^2。
sbitY4=P1^3。
sbitSPK=P3^7。
staticunsignedcharbdataStateREG。
sbitm=StateREG^0。
unsignedcharcode*datasong。
unsignedintdataj。
unsignedchardatai。
unsignedchardatak。
unsignedchardatal。
unsignedchardatap11。
unsignedchardatap33。
voiddelay(void)。
unsignedcharcodeyin[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,0x34,0xFD,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85}。
unsignedcharcodesong1[97]={0x34,0x32,0x32,0x34,0x42,0x51,
0x62,0x52,0x42,0x32,0x34,0x04,
0x74,0x74,0x62,0x62,0x64,
0x3c,0x04,
0x64,0x62,0x52,0x42,0x3