基于51单片机设计多功能电子琴.docx
《基于51单片机设计多功能电子琴.docx》由会员分享,可在线阅读,更多相关《基于51单片机设计多功能电子琴.docx(27页珍藏版)》请在冰豆网上搜索。
![基于51单片机设计多功能电子琴.docx](https://file1.bdocx.com/fileroot1/2022-12/13/08463085-d847-4cbf-a428-d7735389ac0d/08463085-d847-4cbf-a428-d7735389ac0d1.gif)
基于51单片机设计多功能电子琴
2015-2016学年第一学期
《单片机原理及应用》
课程设计报告
课程名称:
单片机原理及应用
项目名称:
基于51单片机设计多功能电子琴
所在分院:
信息工程学院
班级:
组员:
指导教师:
设计报告成绩评定表:
评分内容
成绩
报告内容的完整性(10%)
硬件原理图及说明(20%)
程序流程图(20%)
程序清单(10%)
调试及结果分析(20%)
系统改进建议或者方案(10%)
格式规范(10%)
总分
摘要
本设计是用AT89S52单片机为核心控制元件,设计一个模拟电子琴发声控制系统。
以单片机作为主控核心,与键盘、扬声器、LED显示器等模块组成核心主控制模块。
在主控模块上设有11个按键,其中7个按键控制7个音符,1个作为功能转换键使用,具有手动随意弹奏和自动播放乐曲的功能,另外3个按键用来实现高、中、低音的音符发音。
下面具体介绍一下单片机各端口的分配功能:
单片机的P2.0-P2.6为输入端口,用来控制7个音符的选择弹奏;P2.7为功能转换键,它能切换手动随意弹奏和自动播放乐曲的功能;P2.0-P2.2为单片机控制电子琴实现弹奏高、中、低的功能切换键;P0端口通过上拉电阻接到+5V上,然后接LED共阴数码管;P1.0为单片机的输出端口,它通过限流电阻R与三极管级基极相接,三极管的集电极接扬声器。
本设计通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经三极管放大信号后驱动蜂鸣器发出不同音节的声音。
要实现7个音符的各自的高、中、低音,需要建立三个表,分别存储高音、中音和低音的频率值;当三个拨码开关中某一个按下,通过软件选择相应的音频。
按下弹奏键就可弹奏出不同的声音。
另外用软件延时来控制发音时间的长短,来控制节拍。
通过把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中。
由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间,这样就可以实现乐曲的演奏。
为了实现按键的准确判断和完善电子琴发声的效果,本设计采用了软件防抖的方法,有效的解决了按键抖动的问题。
另外当按下功能切换键,切换至音乐自动播放功能时,本系统能实现七首歌曲的有选择播放,另附带数码管显示提醒。
这样使得电子琴的功能变的更加强大。
本设计为实物电路板设计开发,报告中详细的阐述了电子琴设计的方法和过程。
并经过软硬件的调试,该音乐发生器不但能通过键盘弹奏出很好的音调,而且还可以通过键盘选择播放不同的音乐。
除此之外,本电子琴还带有显示功能,能显示哪个按键按下,而且相当准确。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
一概述
1.1引言
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
目前市场上各种品牌、型号的电子琴有上百种,由几十块的玩具电子琴到几百,几千的学习、演奏用琴真是琳琅满目,电子琴能够模仿各种音色和具有自动伴奏功能,这些是电子琴最基本的特征。
档次的高低无非是音色模仿的是否逼真,自动伴奏设计的是否丰富,或者增加了其他制作,编曲功能的。
本设计主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴系统硬件组成。
利用单片机产生不同频率来获得我们要求的7个音符,最终可随意弹奏想要表达的音乐。
并且本设计分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
1.2设计思路
从系统实现的功能上来看,电子琴的设计主要分为手动弹奏乐曲和自动播放音乐两大部分组成。
手动弹奏乐曲是根据具体的硬件键盘设置了7个音符按键,3个高、中、低音模式切换键和1个功能转换键,自动播放音乐是在单片机的存储器中通过软件编程的方法放置音乐代码和相关播放程序来实现。
从系统硬件结构上来看,主要使用到52系列单片机、7个键输入电路、LED数码管显示电路、扬声器以及电源电路等等。
将这些硬件电路有机地结合起来使之满足电子琴设计的基本硬件要求。
从系统软件设计角度来看,将电子琴的设计采用程序模块化设计方法,将程序分为主程序、键盘扫描程序模块、数码显示模块、转换控制模块、音乐产生模块等等。
此外,采用程序设计思想,将中断定时方式与外部按键查询方式相结合,实现手动弹奏乐曲到自动播放音乐的切换。
从音乐产生原理方面来看,通过控制单片机的定时器的定时时间产生不同频率的音频脉冲,经放大后驱动扬声器发出不同音乐的声音。
用软件延时来控制发音时间的长短,控制节拍。
把音乐的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在程序存储器中,由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出音频脉冲的持续时间。
因此,我们可以综合上述的不同角度的方案设计原理,主要从软件和硬件两部分进行有计划有步骤的系统分析与设计,最终确立总体的设计方案。
1.3方案论证
采用AT89C51单片机进行控制,由于它不具备ISP功能,而且其ROM只有4K,系统在将来升级方面没有潜力。
采用AT89S52单片机进行控制,由于其性价比高,完全满足了本系统设计的要求,它的内部程序存储空间达8K,使软件设计有足够的内部使用空间并且方便日后系统升级,使用方便,抗干扰性能提高。
二系统总体方案及硬件设计
2.1系统组成与总体框图
硬件设计的任务是根据总体设计要求,在选择的机型的基础上,具有确定系统中所要使用的元器件,设计出系统的原理框图、电路原理图。
该设计要实现一种有单片机控制的电子琴,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号.该设计具有11个音节键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来,本设计可以实现用户自由弹奏音乐。
用单片机产生的音频脉冲直接驱动扬声器并不能产生所要实现的音乐,因为它没有足够的驱动能力,这就需要音频功率放大器,本设计采用三极管就可以实现信号放大功能。
基于单片机系统的电子琴的基本结构如下图所示:
2.2元件介绍
作品设计所需器件如下表:
元件名称
型号
数量/个
用途
单片机
AT89S52
1
控制核心
晶振
12MHz
1
晶振电路
电容
30pF
2
晶振电路
电解电容
10uF/25V
1
复位电路
按键开关
6*6*6
12
按键/复位电路
电阻
1K
1
电源指示电路
电阻
5.1K
1
复位电路
电阻
220
2
限流/复位电路
三极管
S8550
1
扬声器电路
扬声器
1
扬声器电路
排针
间距2.54mm
2
电源接口
数码管
八位
1
显示电路
排阻
A103g
1
显示电路
2.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串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
2.2.2三极管
晶体三极管也称三极管,是通过一定的工艺,将两个PN结结合在一起的器件.由于PN结之间的相互影响,使三极管变现出不同于单个PN结的特性而具有电流放大功能,从而使PN结的应用发生了质的飞跃。
本设计采用了S8050三极管,它是小功率、NPN型的信号放大器。
它的外型与封装如下图所示:
2.2.3LED数码管
本次设计的显示电路采用LED数码管显示,LED(Light-EmittingDiode)是一种外加电压从而渡过电流并发出可见光的器件。
LED是属于电流控制器件,使用时必须加限流电阻。
LED有单个LED和八段LED之分,也有共阴和共阳两种。
常用的七段显示器的结构如图下图所示。
发光二极管的阳极连在一起的称为共阳极显示器(如图b所示),阴极连在一起的称为共阴极显示器(如图c所示)。
1位显示器由八个发光二极管组成,其中七个发光二极管a~g控制七个笔画(段)的亮或暗,另一个控制一个小数点的亮和暗,这种笔画式的七段显示器能显示的字符较少,字符的开头有些失真,但控制简单,使用方便。
此外,要画出电路图,首先还要搞清楚他的引脚图的分布,在了解了正确的引脚图后才能进行正确的字型段码编码。
才能显示出正确的数字来。
2.3按键选择方案
传统电子琴可以用键盘上的“1”到“A”键演奏从低So到高Do等11音。
该设计有11个按钮矩阵,设计成21个音阶,可以实现音阶在低音1-高音7之间。
比传统音阶范围大,弹奏效果好。
2.4各功能模块原理图
2.4.1最小系统模块电路原理图
2.4.2键盘扫描模块电路原理图
2.4.3数码管显示模块电路原理图
2.4.4音频处理模块电路原理图
三软件设计
3.1音乐相关知识
乐音听起来有的高,有的低,这就叫音高,音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低声音就低,不同音商的乐音是用C、D、E、F、G、A、B表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,这是唱曲时乐音的发音,所以叫唱名。
音持续时间的长短即时值,一般用拍数表示,休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延时,构成音乐。
3.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
3.3如何用单片机产生音频脉冲
了解音乐的一些基本知识后可知,产生不同频率的音频脉冲即能产生音乐,对于单片机而言,产生不同频率有脉冲非常方便,可以利用它的定时/计数器来产生这样的方波频率信号,因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
在本设计中,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在此情况下,C调的各音符频率与计数值T的对照如下表:
T的值决定了TH0和TL0的值,其关系为:
TH0=T/256,TL0=T/256。
3.4系统总体功能流程图
该程序设计思路比较清晰既从开始到声明变量与函数再到读取按钮开关,判断是否按下,然后就是一个一个按钮的动作。
其主程序框图如下:
四软件仿真
4.1ISIS软件介绍
ProteusISIS是英国Labcenter公司开发的电路分析与实物仿真。
可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:
它实现了单片机仿真和SPICE电路仿真相结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
它支持主流单片机系统的仿真。
目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
它提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如KeiC51uVision2等软件。
另外,它具有强大的原理图绘制功能。
4.2仿真图
本设计系统的仿真图如下所示:
五系统调试
5.1硬件调试
硬件调试主要是针对单片机部分进行调试。
在上电前,先确保电路中不在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。
在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况等。
注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要键盘单片机控制部分、数码管点亮部分、和音频转换电路硬件调试。
数码管LED电路调试:
接通电源,随机按下按钮可以看到数码管显示数字。
键盘单片机控制部分调试:
上电后,随机按动键盘可以发现各个按键对应的音正确。
5.2软件调试
调试主要方法和技巧:
通常一个调试程序应该具备至少四种性能:
跟踪、断点、查看变量、更改数值。
整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。
六课程设计体会
通过各方面的努力,本次设计任务顺利完成,系统部分功能已完全实现课程的要求。
可以随意演奏一首喜欢的曲子,并能显示在数码管上;而且还能通过切换功能键实现弹奏和播放音乐功能的切换,进入播放功能时,可以通过按键任意选择七首音乐,并能通过数码管进行显示,因而基本达到预定的要求和良好的效果。
同样作品也有有所改善之处,在显示电路模块不能很清楚的感受到电子琴的工作状态,将在后期改善中提高作品功能。
通过这次比较系统的项目设计提高了我们运用所学的专业基础知识来解决面临实际问题的能力,同时也提高了我们查阅各种文献资料、设计手册、设计规范以及软件编程的水平。
附录
附1源程序代码
KEYBUFEQU30H;列号保存单元
STH0EQU31H;定时器T0初值高8位存放单元
STL0EQU32H;定时器T0初值低8位存放单元
TEMPEQU33H;定时器初值偏移地址存放单元
SPKEQUP1.0;发声器所在端口
ORG0000H
LJMPSTART;上电转向主程序
ORG000BH;定时器T0中断向量地址
LJMPINT_T0;转向定时器T0中断服务子程序
START:
MOVDPTR,#TABLE2;默认为中音模式
MOVTMOD,#11H;设置定时器的工作方式,定时器T0和T1都是方式1,作为16为定时计数器使用(定时方式)
SETBET0;开各中断开关
SETBEA;开放中断总允许和源允许
ZAICI:
ACALLSAOMIAO;进入手动弹奏程序
SJMPZAICI
;********手动弹奏程序********
SAOMIAO:
;********高中低音模式选择*******
MOVP3,#0FFH;判断P3口模式键是否有键按下
MOVA,P3
XRLA,#0FFH
CJNEA,#00H,MOSHI;有键按下,转向模式转换子程序
AJMPTANZOU;没有按下模式不变
MOSHI:
LCALLDELY10MS;延时消抖
JBP3.0,ZHONGYIN;高音键没有按下,转向中音
MOVDPTR,#TABLE1;高音键按下将模式设定为高音
LJMPTANZOU;转向扫描音符键
ZHONGYIN:
JBP3.1,DIYIN;中音键没有按下,转向低音
MOVDPTR,#TABLE2;中音键按下将模式设定为中音
LJMPTANZOU;转向扫描音符键
DIYIN:
JBP3.2,TANZOU;低音键没有按下,转向扫描音符键
MOVDPTR,#TABLE3;低音键按下将模式设定为低音
LJMPTANZOU;转向扫描音符键
;手动弹奏程序
;*******音符键扫描********
TANZOU:
MOVP2,#0FFH;先将键盘的列全部置为高电平
MOVA,P2
XRLA,#0FFH
CJNEA,#00H,NEQ;有键按下转向NEQ
CLRP1.0;没有键按下,蜂鸣器不发声
LJMPNOKEYS;没有按键按下即跳转到NOKEYS
NEQ:
LCALLDELY10MS;延时10ms消抖
MOVA,P2;消除扰动和干扰
XRLA,#0FFH
CJNEA,#00H,NK1
LJMPNOKEYS;为扰动信号没有键按下转NOKEYS
NK1:
MOVA,P2;判断是否按下#1键
CJNEA,#0FEH,NK2;按下#1键即顺序执行程序,否则跳到NK2检查下一键位
MOVKEYBUF,#0;保存列号#0
MOVP0,#06H;让LED显示为1
LJMPDK1
NK2:
CJNEA,#0FDH,NK3;判断是否按下#2键
MOVKEYBUF,#1;保存列号#1
MOVP0,#5BH;让LED显示为2
LJMPDK1
NK3:
CJNEA,#0FBH,NK4;判断是否按下#3键
MOVKEYBUF,#2;保存列号#2
MOVP0,#4FH;让LED显示为3
LJMPDK1
NK4:
CJNEA,#0F7H,NK5;判断是否按下#4键
MOVKEYBUF,#3;保存列号#3
MOVP0,#66H;让LED显示为4
LJMPDK1
NK5:
CJNEA,#0EFH,NK6;判断是否按下#5键
MOVKEYBUF,#4;保存列号#4
MOVP0,#6DH;让LED显示为5
LJMPDK1
NK6:
CJNEA,#0DFH,NK7;判断是否按下#6键
MOVKEYBUF,#5;保存列号#5
MOVP0,#7DH;让LED显示为6
LJMPDK1
NK7:
CJNEA,#0BFH,NK08;判断是否按下#7键
MOVKEYBUF,#6;保存列号#6
MOVP0,#07H;让LED显示为7
LJMPDK1
NK08:
CJNEA,#7FH,NK8;判断是否按下#8功能切换键
NK8:
LJMPCHOICE;转向功能转换程序
DK1:
MOVA,KEYBUF;取列号
MOVB,#2;初值为双字节,乘以2
MULAB;对应读取表格TABLE1的数据
MOVTEMP,A;保存初值高八位偏移地址
MOVCA,@A+DPTR;取初值高八位
MOVSTH0,A;保存值高八位
MOVTH0,A;装初值高八位
INCTEMP;初值高八位偏移地址加一得到初值低八位偏移地址
MOVA,TEMP
MOVCA,@A+DPTR;取初值低八位
MOVSTL0,A;保存值低八位
MOVTL0,A;装初值低八位
SETBTR0;开启定时器T0,T0开始计数
DK1A:
;判断音符键是否松开
MOVA,P2
XRLA,#0FFH
JNZDK1A;没有松开,等待
CLRTR0;松开,定时器T0停止计数
NOKEYS:
RET;返回
;*******功能转换程序********
CHOICE:
MOVP2,#0FFH
MOVA,P2
CJNEA,#7FH,NEXT1111;按下了P1.7功能转换键后,顺序执行,否则则跳转到NEXT1111
NEXT111:
MOVP2,#0FFH
MOVA,P2
XRLA,#0FFH
JNZNEXT111;如果A不为0,即按键有变化,等待键释放
ACALLDISPLAY;如果没有键按下,即调用DISPLAY
MOVSP,#60H;设定堆栈指针指向60H
MOV40H,#00H;歌谱偏移地址存储单元清零
ACALLDIANGE;转向点歌程序
NEXT1111:
LJMPSAOMIAO;返回弹奏程序
;*******点歌播放音乐程序********
DIANGE:
MOVP2,#0FFH;先将键盘的列全部置为高电平
MOVA,P2
XRLA,#0FFH
CJNEA,#00H,NNEQ;判断有没键按下,
CLRP1.0;没有键按下,蜂鸣器不发声
LJMPDIANGE;等待点歌
NNEQ:
;有按键按下即跳到NNEQ
LCALLDELY10MS;延时10ms消抖
MOVA,P2
XRLA,#0FFH
CJNEA,#00H,NNEQ1;有键按下转向NNEQ1
LJMPDIANGE;没有键按下等待点歌
NNEQ1:
MOVA,P2;判断是否按下#1键
CJNEA,#0FEH,NNK2;按下#1键即顺序执行程序,否则跳到NNK1检查下一键位
MOVDPTR,#TABLE10;DPTR指向第一首歌歌谱
MOVP0,#06H;让LED显示为1
LJMPMUSIC;转向歌曲播放程序
NNK2:
CJNEA,#0F