基于单片机的电子琴设计_毕业设计论文(18页).doc
-基于单片机的电子琴设计_毕业设计论文-第 16 页基于单片机的电子琴设计目录1 概述 3 1.1 引言 3 1.2 设计思路 4 1.3 方案论证 42 系统总体方案及硬件设计 4 2.1 系统组成及总体框图 42.2 元件介绍 5 2.2.1 AT89S52 5 2.2.2 三极管 5 2.2.3 LED数码管 62.3 按键选择方案 62.4各功能模块原理图 6 2.4.1 AT89S52模块电路原理图 6 2.4.2 键盘扫描模块电路原理图 7 2.4.3 数码管显示模块电路原理图 7 2.4.4 音频处理模块电路原理图 73 软件设计 8 3.1 音乐相关知识 8 3.2 如何用单片机实现音乐的节拍 8 3.3 如何用单片机产生音频脉冲 8 3.4 系统总体功能流程图 104 Proteus软件仿真 11 4.1 ISIS软件介绍 11 4.2 仿真图介绍 115 系统调试12 5.1 硬件调试12 5.2 软件调试126课程设计体会 12参考文献 12附1:源程序代码 22附2:系统原理图 23概述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个音节键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来,本设计可以实现用户自由弹奏音乐。用单片机产生的音频脉冲直接驱动扬声器并不能产生所要实现的音乐,因为它没有足够的驱动能力,这就需要音频功率放大器,本设计采用三极管就可以实现信号放大功能。基于单片机系统的电子琴的基本结构如图(1)所示:AT89S52弹奏按键功能切换键时钟电路复位电路扬声器LED显示图(1)2.2 元件介绍2.2.1 AT89S52功能特性: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 字节在系统可编程 Flash AT89S52。主要性能:与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:0Hz33Hz 、 三级加密程序存储器 、32个可编程I/O口线 、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。2.2.2 三极管 晶体三极管也称三极管,是通过一定的工艺,将两个PN结结合在一起的器件.由于PN结之间的相互影响,使三极管变现出不同于单个PN结的特性而具有电流放大功能,从而使PN结的应用发生了质的飞跃。本设计采用了S8050三极管,它是小功率、NPN型的信号放大器。它的外型与封装如下图所示:2.2.3 LED数码管本次设计的显示电路采用LED数码管显示,LED(Light-Emitting Diode)是一种外加电压从而渡过电流并发出可见光的器件。LED是属于电流控制器件,使用时必须加限流电阻。LED有单个LED和八段LED之分,也有共阴和共阳两种。常用的七段显示器的结构如图下图所示。发光二极管的阳极连在一起的称为共阳极显示器(如图b所示),阴极连在一起的称为共阴极显示器(如图c所示)。1位显示器由八个发光二极管组成,其中七个发光二极管ag控制七个笔画(段)的亮或暗,另一个控制一个小数点的亮和暗,这种笔画式的七段显示器能显示的字符较少,字符的开头有些失真,但控制简单,使用方便。此外,要画出电路图,首先还要搞清楚他的引脚图的分布,在了解了正确的引脚图后才能进行正确的字型段码编码。才能显示出正确的数字来。(a)外形 (b)共阳极 (C)共阴极 图3-6 数码管引脚2.3 按键选择方案传统电子琴可以用键盘上的“1”到“A”键演奏从低So到高Do等11音。该设计有11个按钮矩阵,设计成21个音阶,可以实现音阶在低音1-高音7之间。比传统音阶范围大,弹奏效果好。2.4 各功能模块原理图 2.4.1 AT89S52模块电路原理图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/4125ms 调4/462ms调3/4187ms 调3/494ms调2/4250ms 调2/4125ms 音乐节拍表3.3 如何用单片机产生音频脉冲了解音乐的一些基本知识后可知,产生不同频率的音频脉冲即能产生音乐,对于单片机而言,产生不同频率有脉冲非常方便,可以利用它的定时/计数器来产生这样的方波频率信号,因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。在本设计中,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在此情况下,C调的各音符频率与计数值T的对照如下表: 音符频率与计数值T的对照表T的值决定了TH0和TL0的值,其关系为:TH0=T/256,TL0=T%2563.4 系统总体功能流程图该程序设计思路比较清晰既从开始到声明变量与函数再到读取按钮开关,判断是否按下,然后就是一个一个按钮的动作。其主程序框图如下:Proteus软件仿真4.1 ISIS软件介绍Proteus ISIS 是英国Labcenter公司开发的电路分析与实物仿真。可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:它实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。它支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。它提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如 KeiC51 u Vision2 等软件。 另外,它具有强大的原理图绘制功能。 4.2 仿真图 本设计系统的仿真图如下所示:系统调试5.1 硬件调试硬件调试主要是针对单片机部分进行调试。在上电前,先确保电路中不在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况等。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要键盘单片机控制部分、数码管点亮部分、和音频转换电路硬件调试。数码管LED电路调试:接通电源,随机按下按钮可以看到数码管显示数字。键盘单片机控制部分调试:上电后,随机按动键盘可以发现各个按键对应的音正确。5.2 软件调试调试主要方法和技巧:通常一个调试程序应该具备至少四种性能:跟踪、断点、查看变量、更改数值。整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。课程设计体会通过各方面的努力,本次设计任务顺利完成,系统部分功能已完全实现课程的要求。可以随意演奏一首喜欢的曲子,并能显示在数码管上;而且还能通过切换功能键实现弹奏和播放音乐功能的切换,进入播放功能时,可以通过按键任意选择七首音乐,并能通过数码管进行显示,因而基本达到预定的要求和良好的效果。通过这次比较系统的项目设计提高了我们运用所学的专业基础知识来解决面临实际问题的能力,同时也提高了我们查阅各种文献资料、设计手册、设计规范以及软件编程的水平。参考文献1 余发山,王福忠,杨凌霄. 单片机原理及应用技术. 中国矿业大学出版社.2008.62 王守中. 51单片机开发入门与典型实例. 北京:人民邮电出版社,2007.83 胡辉. 单片机应用系统设计与训练. 北京:中国水利水电出版社,2004.8附1 源程序代码KEYBUF EQU 30H ;列号保存单元STH0 EQU 31H ;定时器T0初值高8位存放单元STL0 EQU 32H ;定时器T0初值低8位存放单元TEMP EQU 33H ;定时器初值偏移地址存放单元SPK EQU P1.0 ;发声器所在端口ORG 0000HLJMP START ;上电转向主程序ORG 000BH ;定时器T0中断向量地址LJMP INT_T0 ;转向定时器T0中断服务子程序START: MOV DPTR,#TABLE2 ;默认为中音模式 MOV TMOD,#11H ;设置定时器的工作方式,定时器T0和T1都是方式1,作为16为定时计数器使用(定时方式) SETB ET0 ;开各中断开关 SETB EA ;开放中断总允许和源允许ZAICI: ACALL SAOMIAO ;进入手动弹奏程序 SJMP ZAICI;*手动弹奏程序*SAOMIAO:;*高中低音模式选择* MOV P3,#0FFH ;判断P3口模式键是否有键按下 MOV A,P3 XRL A,#0FFH CJNE A,#00H,MOSHI ;有键按下,转向模式转换子程序 AJMP TANZOU ;没有按下模式不变MOSHI:LCALL DELY10MS ;延时消抖 JB P3.0,ZHONGYIN ;高音键没有按下,转向中音 MOV DPTR,#TABLE1 ;高音键按下将模式设定为高音 LJMP TANZOU ;转向扫描音符键 ZHONGYIN: JB P3.1,DIYIN ;中音键没有按下,转向低音 MOV DPTR,#TABLE2 ;中音键按下将模式设定为中音 LJMP TANZOU ;转向扫描音符键DIYIN:JB P3.2,TANZOU ;低音键没有按下,转向扫描音符键 MOV DPTR,#TABLE3 ;低音键按下将模式设定为低音 LJMP TANZOU ;转向扫描音符键 ;手动弹奏程序;*音符键扫描*TANZOU:MOV P2,#0FFH ;先将键盘的列全部置为高电平 MOV A,P2 XRL A,#0FFH CJNE A,#00H,NEQ ;有键按下转向NEQ CLR P1.0 ;没有键按下,蜂鸣器不发声 LJMP NOKEYS ;没有按键按下即跳转到NOKEYSNEQ: LCALL DELY10MS ;延时10ms消抖 MOV A,P2 ;消除扰动和干扰 XRL A,#0FFH CJNE A,#00H,NK1 LJMP NOKEYS ;为扰动信号没有键按下转NOKEYSNK1: MOV A,P2 ;判断是否按下#1键 CJNE A,#0FEH,NK2 ;按下#1键即顺序执行程序,否则跳到NK2检查下一键位 MOV KEYBUF,#0 ;保存列号#0 MOV P0,#06H ;让LED显示为1 LJMP DK1NK2: CJNE A,#0FDH,NK3 ;判断是否按下#2键 MOV KEYBUF,#1 ;保存列号#1 MOV P0,#5BH ;让LED显示为2 LJMP DK1NK3: CJNE A,#0FBH,NK4 ;判断是否按下#3键 MOV KEYBUF,#2 ;保存列号#2 MOV P0,#4FH ;让LED显示为3 LJMP DK1NK4: CJNE A,#0F7H,NK5 ;判断是否按下#4键 MOV KEYBUF,#3 ;保存列号#3 MOV P0,#66H ;让LED显示为4 LJMP DK1NK5: CJNE A,#0EFH,NK6 ;判断是否按下#5键 MOV KEYBUF,#4 ;保存列号#4 MOV P0,#6DH ;让LED显示为5 LJMP DK1NK6: CJNE A,#0DFH,NK7 ;判断是否按下#6键 MOV KEYBUF,#5 ;保存列号#5 MOV P0,#7DH ;让LED显示为6 LJMP DK1 NK7: CJNE A,#0BFH,NK08 ;判断是否按下#7键 MOV KEYBUF,#6 ;保存列号#6 MOV P0,#07H ;让LED显示为7 LJMP DK1NK08: CJNE A ,#7FH,NK8 ;判断是否按下#8功能切换键 NK8: LJMP CHOICE ;转向功能转换程序DK1: MOV A,KEYBUF ;取列号 MOV B,#2 ;初值为双字节,乘以2 MUL AB ;对应读取表格TABLE1的数据 MOV TEMP,A ;保存初值高八位偏移地址 MOVC A,A+DPTR ;取初值高八位 MOV STH0,A ;保存值高八位 MOV TH0,A ;装初值高八位 INC TEMP ;初值高八位偏移地址加一得到初值低八位偏移地址 MOV A,TEMP MOVC A,A+DPTR ; 取初值低八位 MOV STL0,A ;保存值低八位 MOV TL0,A ;装初值低八位 SETB TR0 ;开启定时器T0,T0开始计数DK1A: ;判断音符键是否松开 MOV A,P2 XRL A,#0FFH JNZ DK1A ;没有松开,等待 CLR TR0 ;松开,定时器T0停止计数NOKEYS: RET ;返回;*功能转换程序*CHOICE: MOV P2,#0FFH MOV A,P2 CJNE A,#7FH,NEXT1111 ;按下了P1.7功能转换键后,顺序执行,否则则跳转到NEXT1111 NEXT111: MOV P2,#0FFH MOV A,P2 XRL A,#0FFH JNZ NEXT111 ;如果A不为0,即按键有变化,等待键释放 ACALL DISPLAY ;如果没有键按下,即调用DISPLAY MOV SP,#60H ;设定堆栈指针指向60H MOV 40H,#00H ;歌谱偏移地址存储单元清零 ACALL DIANGE ;转向点歌程序NEXT1111: LJMP SAOMIAO ;返回弹奏程序;*点歌播放音乐程序*DIANGE: MOV P2,#0FFH ;先将键盘的列全部置为高电平 MOV A,P2 XRL A,#0FFH CJNE A,#00H,NNEQ ;判断有没键按下, CLR P1.0 ;没有键按下,蜂鸣器不发声 LJMP DIANGE ;等待点歌NNEQ: ;有按键按下即跳到NNEQ LCALL DELY10MS ;延时10ms消抖 MOV A,P2 XRL A,#0FFH CJNE A,#00H,NNEQ1 ;有键按下转向NNEQ1 LJMP DIANGE ;没有键按下等待点歌NNEQ1: MOV A,P2 ;判断是否按下#1键 CJNE A,#0FEH,NNK2 ;按下#1键即顺序执行程序,否则跳到NNK1检查下一键位 MOV DPTR,#TABLE10 ;DPTR指向第一首歌歌谱 MOV P0,#06H ;让LED显示为1 LJMP MUSIC ;转向歌曲播放程序NNK2: CJNE A,#0FDH,NNK3 ;判断是否按下#2键 MOV DPTR,#TABLE20 ; DPTR指向第二首歌歌谱 MOV P0,#5BH ;让LED显示为2 LJMP MUSIC ;转向歌曲播放程序NNK3: CJNE A,#0FBH,NNK4 ;判断是否按下#3键 MOV DPTR,#TABLE30 ; DPTR指向第三首歌歌谱 MOV P0,#4FH ;让LED显示为3 LJMP MUSIC ;转向歌曲播放程序NNK4: CJNE A,#0F7H,NNK5 ;判断是否按下#4键 MOV DPTR,#TABLE40 ; DPTR指向第四首歌歌谱 MOV P0,#66H ;让LED显示为4 LJMP MUSIC ;转向歌曲播放程序NNK5: CJNE A,#0EFH,NNK6 ;判断是否按下#5键 MOV DPTR,#TABLE50 ; DPTR指向第五首歌歌谱 MOV P0,#6DH ;让LED显示为5 LJMP MUSIC ;转向歌曲播放程序NNK6: CJNE A,#0DFH,NNK7 ;判断是否按下#6键 MOV DPTR,#TABLE60 ; DPTR指向第六首歌歌谱 MOV P0,#7DH ;让LED显示为6 LJMP MUSIC ;转向歌曲播放程序NNK7: CJNE A,#0BFH,NNK08 ;判断是否按下#7键 MOV DPTR,#TABLE70 ; DPTR指向第七首歌歌谱 MOV P0,#07H ;让LED显示为7 LJMP MUSIC ;转向歌曲播放程序NNK08: CJNE A,#07FH,DIANGE ;判断是否按下#8功能切换键;*判断功能切换键释放*SHIFANG: MOV P2,#0FFH ;将键盘的列全部置为高电平 MOV A,P2 XRL A,#0FFH CJNE A,#00H,SHIFANG ;判断键有没有松开, LCALL DELY10MS ;延时10ms 消抖 MOV P2,#0FFH MOV A,P2 XRL A,#0FFH CJNE A,#00H,SHIFANG MOV P0,#7FH ;键释放让LED显示为8 LJMP START ;返回程序开始;*歌曲播放程序*MUSIC: NEXT20: MOV A,40H MOVC