您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于单片机的简单电子琴设计
《单片机原理与应用》课程设计报告基于单片机的简易电子琴设计专业:学号:姓名:2015-12-251一、课题名称基于单片机的简易电子琴设计二、任务要求1、4x4键盘矩阵识别,即矩阵扫描,显示当前的音符。2、不同频率音符播放,可以通过按键控制16种发音。三、任务分析1、以AT89C51单片机为核心控制元件,与键盘,扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。2、从电路原理图,主要芯片、模块原理及各模块的程序等方面入手设计。3、效果按下键盘矩阵中的按键会是数码管显示当前按键,扬声器播放对应的音符。四、设计方案1、硬件方案本系统只要以51单片机为主控核心,与矩阵键盘、扬声器、LED显示管模块一起组合而成。具体如下:表1.简易电子琴硬件方案矩阵键盘单片机扬声器数码管22、软件方案仿真使用Proteus软件,可以将电子琴仿真实验形象化,帮助我们学习。仿真原理图一共分为四个部分,AT89C51单片机及其复位电路、时钟电路部分,4x4矩阵键盘部分,LED显示管部分,扬声器部分。所需元器件有:AT89C51(51单片机),7SEG-COM-AN-BLUE(蓝色7段数码管)BUTTON(按键),CAP(电容),CRYSTAL(晶振),MINELECT100U10V(电解电容)RESPACK-8(有公共端电阻排),RT0805FRE071KL(电阻),SOUNDER(扬声器)五、具体实现1、硬件电路图及工作原理描述本系统由键盘矩阵、LED显示管、扬声器这几个部分组成,LED显示管显示当前按键,扬声器发出对应音符。硬件总体设计图如下:图1.硬件总体原理图3LED显示模块如图所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个七段数码管的a-h的笔段上,数码管的公共端接电源。图2.LED显示模块矩阵扫描显示当前按键模块如下:图3.矩阵扫描模块4矩阵扫描扬声器发出对应音符模块如下:图4.扬声器模块单片机时钟电路,复位电路如下:图5.时钟电路、复位电路52、软件流程图及对应实现程序本系统的软件流程图如下:表2.软件总体流程图否是开始扫描键盘矩阵显示按键启动定时器根据KEY发音延时发送扫描码模块初始化结束停止播放有键按下6七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。LED数码管的g~a七个发光二极管因加零电压而发亮,因加正电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码。本系统按键显示模块软件流程图如下:表3.按键模块软件流程图是否开始模块初始化有键按下扫描键盘矩阵显示按键结束7一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系正确即可。利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。计数脉冲值与频率的关系式是:N=fi÷2÷fr2-1式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。其计数初值T的求法如下:T=65536-N=65536-fi÷2÷fr例如:设K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr低音DO的T=65536-500000/262=63627中音DO的T=65536-500000/523=64580高音DO的T=65536-500000/1046=650598本系统按键发出对应音符模块软件流程图如下:表4.扬声器模块流程图是否开始扫描键盘矩阵启动定时器根据KEY发音模块初始化结束有键按下9Keil软件程序:#includereg51.h#defineuintunsignedint#defineucharunsignedcharuchartemp,num;uintx,y;sbitbell=P3^0;ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,};uintcodeyy[]={64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,};voiddelay(uintz){for(x=z;x0;x--)for(y=110;y0;y--);}voidtimer0()interrupt1{TH0=yy[num]/256;TL0=yy[num]%256;bell=~bell;}voiddisplay(num){P0=table[num];}10voidkeyscan(){P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case0xee:num=0;break;case0xde:num=4;break;case0xbe:num=8;break;case0x7e:num=12;break;}}}P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;11temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case0xed:num=2;break;case0xdd:num=6;break;case0xbd:num=10;break;case0x7d:num=14;break;}}}P1=0xfb;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case0xeb:num=2;break;case0xdb:num=6;12break;case0xbb:num=10;break;case0x7b:num=14;break;}}}P1=0xf7;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case0xe7:num=3;break;case0xd7:num=7;break;case0xb7:num=11;break;case0x77:num=15;break;}}}}13voidmain(){bell=0;EA=1;ET0=1;TR0=0;TMOD=0x01;num=16;P0=table[num];while(1){P1=0xf0;if(P1!=0xf0){keyscan();display(num);TR0=1;}else{TR0=0;}delay(2);}}六、仿真、实验验证过程及硬件结果、现象1、按照设计要求在Proteus软件上做出仿真电路。2、利用Keil软件编写相应的单片机程序,以实现硬件仿真电路的功能。143、仿真结果截图如下:图6.Proteus仿真结果七、总结(体会)通过这次课程设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。经过我长时间的设计及调试,本系统基本能实现按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放对应的音符。但本设计音频效果不是很好。不足之处有:1.可弹奏的音符数较少,只能在一定范围内满足用户需要2.音量不可调。我的综合设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。基本掌握了Proteus原理图的方法。通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。并且我学会了分析问题解决问题的能力,加深了对所学理论知识的理解和运用。我的动手能力得到了很大的提高,创新意识得到了锻炼。
本文标题:基于单片机的简单电子琴设计
链接地址:https://www.777doc.com/doc-5589909 .html