嵌入式电子琴设计.docx
- 文档编号:26313362
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:24
- 大小:538.60KB
嵌入式电子琴设计.docx
《嵌入式电子琴设计.docx》由会员分享,可在线阅读,更多相关《嵌入式电子琴设计.docx(24页珍藏版)》请在冰豆网上搜索。
嵌入式电子琴设计
前言
现代的流行音乐离不开电子琴,键盘手一般是现代电声乐队的中坚力量。
(单排键)电子琴、电吉他、架子鼓是流行音乐的三项主流乐器。
电子琴的发明使人们可以演奏出未曾拥有的音色,丰富了人们情感的表现;电子琴创造出了许多其他乐器无法演奏出的音色,甚至自然不存在的音色,这些音色帮助了人们通过音乐表现自己的情感,在很多电视节目或者音乐作品中都有运用。
电子琴的发明推动了音乐的普及,它让音乐真正成为了大众的音乐,成为了人类社会不可缺少的东西。
电子琴是目前用于音乐普及教育和音乐素质培养最多的乐器,它的经济性为他在普通家庭中的普及带来了可能。
本文主要介绍的是使用LM3S8962来实现基于Cortex-M3简易电子琴系统设计的方法,本设计由嵌入式芯片LM3S8962、音乐播放、单音节按键和数码管显示为核心,辅以必要的电路,构成了一个简易的电子琴。
当程序开始执行后,播放梁祝音乐,按下功能键后,切换至单音节演奏。
本设计的主要内容:
了解嵌入式技术的发展现状,熟悉电子琴各模块的工作原理;选择适当的芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;熟悉嵌入式使用方法和编程规则,编写出相应模块的应用程序;分别在各自的模块中调试出对应的功能,并使用真实器件播放音乐,实现功能切换,验证程序的正确性。
1.课题知识介绍
1.1Cortex-M3概述
ARMCortex-M3处理器结合了多种突破性技术,令芯片供应商提供超低费用的芯片,仅33000门的内核性能可达1.2DMIPS/MHz。
该处理器还集成了许多紧耦合系统外设,令系统能满足下一代产品的控制需求。
Cortex-M3内核主要是应用于小管脚数、低成本和低功耗的场合,并且具有极高的运算能力和极强的中断响应能力。
Cortex-M3采用了新型的单线调试(SingleWire)技术,专门拿出一个引脚来做调试,从而节约了大笔的调试工具费用。
同时,Cortex-M3中还集成了大部分存储器控制器,这样工程师可以直接在MCU外连接Flash,降低了设计难度和应用障碍。
CM3是一个32位处理器内核,内部数据路径是32位,寄存器是32位,存储器接口也是32位。
CM3采用哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。
这样一来,数据访问不再占用指令总线,从而提升了性能。
为了实现这个特性,CM3内部含有好几条总线接口,每条都为自己的应用场合优化过,并且可以并行工作。
但是,指令总线和数据总线共享同一个存储器空间,一个统一的存储器系统。
也就是说,不是因为有两条总线,可寻址空间就变成了8G。
1.2LM3S8962概述
LM3S8962微控制器的优势还在于能够方便的运用多种微控制器的优势还在于能够方便的运用多种ARM的开发工具和片上系统(SoC)的底层IP应用方案,以及广大的用户群体。
另外,该微控制器使用了兼容ARMThumb®的Thumb2指令集来减少存储容量的需求,并以此达到降低成本的目的。
最后,LM3S8962微控制器与tellaris®系列的所有成员是代码系列兼容的,这为用户提供了灵活性,能够适应各种精确的需求。
图1LM3S8962
1.3keil软件
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
2009年2月发布KeilμVision4,KeilμVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。
新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来发应用程序。
新版本支持更多最新的ARM芯片,还添加了一些其他新功能。
2011年3月ARM公司发布最新集成开发环境RealViewMDK开发工具中集成了最新版本的KeiluVision4,其编译器、调试工具实现与ARM器件的最完美匹配。
最新的KeilμVision4IDE旨在提高开发人员的生产力,实现更快,更有效的程序开发。
KeilμVision4引入了灵活的窗口管理系统,能够拖放到视图内的任何地方,包括支持多显示器窗口。
KeiluVision4在KeilμVision3IDE的基础上,增加了更多大众化的功能。
2.总体设计方案
2.1设计任务
本次课程设计的主要设计任务是设计一个简易的电子琴,其中设有功能切换键,一个功能是播放梁祝音乐,另一个功能是在做好的矩阵键盘上通过按键播放DO、RE、MI等8个单音节。
2.2总体方案设计
按键电路
LM3S8962
音乐播放
数码管显示
图2电子琴总体设计框图
本次方案设计按照系统设计的要求和功能,将系统分为主控制器模块、显示模块、按键模块、蜂鸣器电路模块。
系统框图如图2所示,主控制模块采用图1的芯片LM3S8962为控制中心,显示模块采用数码管显示,播放时使用蜂鸣器电路模块,设置功能切换键,实现对音乐播放和单音节演奏的功能切换。
3.硬件设计
3.1显示模块概述
3.1.1数码管显示
数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二级管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
其图如图3所示。
图3数码管引脚图
3.1.2数码管引脚说明
动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
3.1.3数码管注意事项
使用数码管时应注意以下几点:
(1)检查时若发光暗淡,说明器件已老化,发光效率太低。
假如显示的笔段残缺不全,说明数码管已局部损坏。
(2)对于型号不明、又无管脚排列图的led数码管,用数字万用表的h距挡可完成下述测试工作:
①判定数码管的结构形式(共阴或共阳);②识别管脚;③检查全亮笔段。
预先可假定某个电极为公共极,然后根据笔段发光或不发光加以验证。
当笔段电极接反或公共极判定错误时,该笔段就不能发光。
3.2复位电路
复位电路由电阻和极性电容组成,如图4所示,通过高电平时单片机复位,在时钟电路开始工作后,当高电平的时间超过大约5ms的时候,即可实现复位。
此复位电路同时具备了上电自动复位和按键人工复位的功能,上电复位发生在开机加电时,由系统自动完成,按键人工复位通过一个按键来实现在程序运行时,若遇到死机或死循环等情况时,通过手动复位就可以实现重新启动的操作。
按键人工复位需要认为在复位输入端RST上加入高电平。
图4复位电路
3.3蜂鸣器电路
蜂鸣器电路由一个220欧的电阻,三极管及蜂鸣器组成,如图5所示。
通过控制三极管的导通和截止来实现蜂鸣器的响与不响。
图5蜂鸣器原理图
3.4矩阵键盘
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图6所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,下图中,行线通过电阻接正电源,并将列线所接的单片机的I/O口作为输出端,而行线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
列线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
图64×4矩阵键盘电路图
4.软件设计
4.1流程图
图7流程图
根据以上流程图设计的程序见附录3。
4.2Keil详细过程
在图8界面下单“Project”中的“NewuVisionProject…”命令,弹出图9所示的创建新工程界面。
这时要设定该工程的路径和名称,要将存储工程的文件夹名称与工程项目的名称设为同一名字。
图8创建工程
图9设置工程保存路径和名称
点击保存按钮,弹出图10对话框。
该对话框要求选择芯片型号,找到LM3S8962,并且点击选择。
图10选择芯片
选择好芯片后,需要新建一个空白文件,用来放置程序代码。
图11新建文件
在SourceGroup上点右键,弹出快捷菜单。
如图12所示。
点击“AddFilestoGroup”选项,弹出添加源文件对话框,选择相应的需添加的文件即可。
图12添加源文件快捷菜单
这里仅对基本选项进行设置,以满足工程可编译、仿真、下载的要求。
在图13中,首先要设置晶振的频率。
由于开发板上使用的是6MHz的晶振,因此,这里需要将晶振频率设置为6MHz。
图13晶振及程序下载地址设置
完成相关设置后,即可进行编译,如图14所示。
图14编译程序
点击debug按钮,即可进入到软件仿真界面,课通过看到的结果进行调试,若不对可返回原界面进行修改。
图15仿真界面
5.设计结果
根据以上设计过程和原理可设计得到一个简易的电子琴,该电子琴可以在两个功能之间进行切换,一个是播放音乐梁祝,另一个是通过按键进行单音节播放,并且显示对应的音节,任何时刻都能进行复位操作。
图16开发板以及矩阵键盘实物
6.设计总结
在这学期的课程设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在实验课上,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
完成嵌入式课程设计后,我们发现我们还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能被动完成。
但通过学习这一次实践,增强了我们的动手能力,提高和巩固了单片机方面的知识,特别是软件方面。
从中增强了我们的团队合作精神,并让我们认识到把理论应用到实践中去是多么重要。
7.参考文献
[1]周立功.ARM嵌入式系统基础教程(第2版)[M].北京:
北京航空航天大学出版社,2008
[2]姚文详.ARMCortex-M3权威指南[M].北京:
北京航空航天大学出版社,2009
[3]魏洪兴.周亦敏.嵌入式系统设计与实例开发实验教材II[M].北京:
清华大学出版社,2007
[4]LuminaryMicro公司.LM3S1138微控制器数据手册[M].2008/2010
[5]武晔卿.嵌入式系统可靠性设计技术及案例解析[M].北京航空航天大学出版社,2012
[6]熊茂华.熊昕.嵌入式应用项目设计与开发典型案例详解[M].北京:
清华大学出版社,2012
[7]马维华.嵌入式系统原理及应用[M].北京:
北京邮电大学出版社有限公司
[8]夏靖波.嵌入式系统原理与开发[M].西安:
西安电子科技大学出版社
附录
附录1:
元器件表
元件名称
型号
数量/个
用途
芯片
LM3S8962
1
控制核心
蜂鸣器
有源蜂鸣器
1
蜂鸣器电路
电源
+5V
1
提供+5V电源
矩阵键盘
4×4
1
按键/复位电路
电阻
27
2
电阻
49.9
4
电阻
220
2
限流/复位电路
电阻
470
6
电阻
510
8
复位电路
电阻
1k
6
电源指示电路
电阻
1.5k
2
电阻
2.2k
1
电阻
10k
12
电容
104pF
20
数码管电路
电容
18pF
2
PWM电路
发光二级管
8
附录2:
原理图
附录3:
程序源代码
Main.c
#include"systemInit.h"
#include"buzzer.h"
#include"music.h"
unsignedcharflag=0;
unsignedcharvalue=0x00;
unsignedcharflag1=0;
voidkey_scan(void)
{
unsignedcharw1,w2;
//GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,0X3F);
//GPIOPinWrite(GPIO_PORTD_BASE,0X3F,0x07);
//GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,0X3F);
w1=GPIOPinRead(GPIO_PORTD_BASE,0X3f)&0x07;
if(w1!
=0x07)
{
SysCtlDelay(20*TheSysClock/3000);
if(w1!
=0x07)
{
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,0X3F);
GPIOPinWrite(GPIO_PORTD_BASE,0X3F,0x38);
GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,0X3F);
w2=GPIOPinRead(GPIO_PORTD_BASE,0X3f)&0x38;
value=(w1|w2);
flag=1;
}
}
}
voidkey_scanInit(void)
{
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,0X3F);
GPIOPinWrite(GPIO_PORTD_BASE,0X3F,0x07);
GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,0X3F);
}
intmain(void)
{
clockInit();
buzzerInit();
key_scanInit();SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,0X3F);
for(;;)
{
key_scan();
if(flag==1)
{
switch(value)
{
case0x1e:
if(flag1==0)buzzerSound(262);flag=0;break;
case0x1d:
if(flag1==0)buzzerSound(294);flag=0;break;
case0x1b:
if(flag1==0)buzzerSound(330);flag=0;break;
case0x2e:
if(flag1==0)buzzerSound(349);flag=0;break;
case0x2d:
if(flag1==0)buzzerSound(392);flag=0;break;
case0x2b:
if(flag1==0)buzzerSound(440);flag=0;break;
case0x36:
if(flag1==0)buzzerSound(494);flag=0;break;
case0x35:
if(flag1==0)buzzerSound(976);flag=0;break;
case0x33:
flag1++;if(flag1==2){flag1=0;}flag=0;break;
default:
flag=0;break;
}
}
if(flag1==1)
{
musicPlay(huadie);
SysCtlDelay(4000*(TheSysClock/3000));
flag1=0;
}
}
}
Music.c
#include"music.h"
#include"buzzer.h"
#include"systemInit.h"
consttNotehuadie[]=
{
{L3,T/4},
{L5,T/8+T/16},
{L6,T/16},
{M1,T/8+T/16},
{M2,T/16},
{L6,T/16},
{M1,T/16},
{L5,T/8},
{M5,T/8+T/16},
{H1,T/16},
{M6,T/16},
{M5,T/16},
{M3,T/16},
{M5,T/16},
{M2,T/2},
{M2,T/8},
{M2,T/16},
{M3,T/16},
{L7,T/8},
{L6,T/8},
{L5,T/8+T/16},
{L6,T/16},
{M1,T/8},
{M2,T/8},
{L3,T/8},
{M1,T/8},
{L6,T/16},
{L5,T/16},
{L6,T/16},
{M1,T/16},
{L5,T/2},
{M3,T/8+T/16},
{M5,T/16},
{L7,T/8},
{M2,T/8},
{L6,T/16},
{M1,T/16},
{L5,T/8},
{L5,T/4},
{L3,T/16},
{L5,T/16},
{L3,T/8},
{L5,T/16},
{L6,T/16},
{L7,T/16},
{M2,T/16},
{L6,T/4+T/8},
{L5,T/16},
{L6,T/16},
{M1,T/8+T/16},
{M2,T/16},
{M5,T/8},
{M3,T/8},
{M2,T/8},
{M3,T/16},
{M2,T/16},
{M1,T/8},
{L6,T/16},
{L5,T/16},
{L3,T/4},
{M1,T/4},
{L6,T/16},
{M1,T/16},
{L6,T/16},
{L5,T/16},
{L3,T/16},
{L5,T/16},
{L6,T/16},
{M1,T/16},
{L5,T/2},
{0,T/4},
{0,T/4},
{0,0}
voidmusicPlay(consttNote*music)
{
shorti=0;
for(;;)
{
if(music[i].mTime==0)break;
buzzerSound(music[i].mName);
SysCtlDelay(music[i].mTime*(TheSysClock/3000));
i++;
buzzerQuiet();
SysCtlDelay(10*(TheSysClock/3000));
}
}
Buzzer.c
#include"buzzer.h"
#include
#include
#include
#include
#include
#defineSysCtlPeriEnableSysCtlPeripheralEnable
#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput
externunsignedlongTheSysClock;
voidbuzzerInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE,GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTG_BASE,GPIO_PIN_0,0x01);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);
GPIOPinTypePWM(GPIO_PORTE_BASE,GPIO_PIN_1);
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);PWMGenConfigure(PWM_BASE,PWM_GEN_2,PWM_GEN_MODE_DOWN|PWM_GEN_MODE_NO_SYNC);
PWMOutputState(PWM_BASE,PWM_OUT_5_BIT,true);
}
voidbuzzerSound(unsignedshortusFreq)
{
unsignedlongulVal;
if((usFreq<=TheSysClock/65536UL)||(usFreq>20000))
{
buzzerQuiet();
}
else
{
GPIOPinTypePWM(GPIO_PORTE_BASE,GPIO_PIN_1);
ulVal=TheSysClock/usFreq;
PW
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 电子琴 设计