用单片机实现简易电子琴.docx
《用单片机实现简易电子琴.docx》由会员分享,可在线阅读,更多相关《用单片机实现简易电子琴.docx(15页珍藏版)》请在冰豆网上搜索。
用单片机实现简易电子琴
南华大学电气工程学院
《单片机课程设计》
设计题目:
用单片机实现简易电子琴
专业:
本11通信01班
学生姓名:
刘陶银
学号:
20114400129
起迄日期:
2014年06月01日~2014年06月15日
指导教师:
朱卫华
教研室主任:
王彦
摘要
单片微型计算机室大规模集成电路技术发展的产物,属于第四代电子计算机它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
他的应用必定导致传统的控制技术从根本上发生变革。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器、自动放音功能等等也很好奇。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89C52单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘扬声器等模块组成核心主控制模块,在主控模块上设有8个按键,和一个复位按键。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏要表达的音符。
并且分别从原理图,主要芯片,个模块原理及各规模的程序的调试来详细阐述。
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,构成我们想演奏的那首曲目。
当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系编写正确就可以达到我们想要的曲目。
在此基础上,所做电子琴得到了应有的按键发音效果。
关键词:
AT89C52定时/计数器T0音色节拍器自动放音
一、设计任务与要求
1.1设计任务
实现电子琴发声控制系统;要求电路实现如下功能:
利用蜂鸣器作为发声部件,两个数码管作为显示部件,设置10个按键,实现高音、中音、低音的1、2、3、4、5、6、7的发音。
并在存储一首歌曲的内容,可以实现自动播放。
说明:
单片机的工作时钟频率为11.0592MHz。
1.2设计要求
设计一个带有复位电路,晶振时钟,能显示音调字符的8键电子琴。
1.3设计意义
该设计具有以下优点:
1)可以方便得知播放的音符和音调;
2)比传统电子琴功能更完善;
3)制作简单,成本低
二、方案总体设计
本次课程设计的课题是基于51单片机的电子琴的设计,所要达到的要求如下:
1)利用蜂鸣器作为发声部件。
2)一个数码管作为显示部件。
3)设置8个按键,实现高音、中音、低音的1、2、3、4、5、6、7、1的发音。
本次设计主要是要通过软硬件的配合实现电子琴的上述功能,操作人员可以通过按下键盘上任意一个键来发出相应的音符。
2.1方案对比
STC89C52具有高速度、低电压、低功耗、且可靠性和成本都比较低的特点。
因此本次课程设计采用STC89C52单片机作为整个电路核心控制器件。
对于本控制系统使用一片STC89C52系列的单片机,不需要外扩展存储器,就能实现显示、预制状态、动态调节的功能,因而整体结构简单。
设计电路时运用89C52系列单片机的接口来实现各种输入、输出功能。
P2.7待定部分口用作输出口,向发声电路输出信号;P1口和P0口共同实现一个键盘的功能。
方案一:
采用单个的逻辑器件组合
我们知道计数器8253可以产生任意频率的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率与计数器的频率对应起来就可通过计数器产生音乐了。
根据本实验要求,采用8279将键扫描得到的键值通过查表得到相应的8253的频率值,将从8253得到相对应的按键弹奏信号经过LM386进行放大,再用喇叭输出,就实现了简易电子琴的基本功能,也就完成了实验的要求
方案二:
用VHDL语言编程来实现
利用我们实验室先进的数字电路实验设备,我们可以采用VHDL语言编程来实现。
我们可以通过VDHL语言,对实验原理图的各个部分进行设计,通过编译,可以在计算机上下载此实验原理图,利用电路学习机上的芯片。
我们很快就可以设计出一个简单的电子琴。
并实现其功能。
方案三:
采用STC89C52单片机
采用STC89C52单片机作为主控芯片,设置键盘、蜂鸣器等外围器件,另外还用到一些简单器件如:
一位数码管,和PNP型三极管等。
利用按键实现音符和音调的输入;一位的数码管进行被操作的按键显示:
用PNP型三极管实现低音频功率放大;最后用蜂鸣器发音。
方案比较:
方案一采用单个的逻辑器件组合实现。
这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然,但是由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、体积过大等不利因素。
例如七个不同的音符是由七个不同的频率来控制发出的,所用仪器之多显而易见。
方案二采用VHDL语言编程来实现电子琴的各项功能。
系统主要由电子琴发声模块、选择控制模块和储存器模块组成。
和方案一相比较,方案二就显得比较笼统,虽然我们可以看到用超高速硬件描述语言VHDL的优势,但本质上它只是把整个系统分为了若干个模块,而不牵涉到具体的硬件电路。
方案三与前两种方案相比,主控芯片采用
STC89C52单片机,它是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
同时具有强大的控制功能和灵活的编程实现特性,由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。
而第三种方案具有经济可行性、技术可行性、实物应用性。
所以我们选择第三种方案。
2.2总体设计
设计总体框架图如图1所示
图1单片机总体框架图
2.3总体方案工作原理
由STC89C52的P1口8个按键控制DO,RE,MI,FA,SO,LA,XI,DO的各个音符,在由位于P0口的一位数码管显示出来,同时位于P3^7口的蜂鸣器发出声音。
发音原理:
若要产生音频脉冲,只要算出某一音频的周期,再将周期除以2,即为半周期的时间。
利用定时器记时半周期时间,每当记时终止后就将P3^7反相,然后记时再反相。
就可在P3^7上得到此频率的脉冲。
利用STC89C52的内部定时器使其工作计数器模式下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
三、硬件设计
3.1STC89C52芯片
STC89C52是一个低功耗,高性能CMOS8位单片机,片内含具有如下特点:
40个引脚(引脚图如图1-1所示),4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDTC)电路,片内时钟振荡器。
此外,STC89C52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
单片机引脚图如图2所示:
图2单片机引脚图
本系统采用单片机STC89C52为电子琴的控制核心,系统主要包括播放模块、安键控制模块。
下面对各模块的设计逐一进行论证比较。
3.2单片机复位部分
1)复位功能:
单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。
单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始。
2)复位原理:
单片机复位时只要保持RST引脚接2us的高电平即可。
在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。
当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。
随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。
根据串联电路电压为各处之和,这个时候10K电阻两端的
电压为3.5V,甚至更大,所以RST引脚又接收到高电平。
单片机系统自动复位。
复位电路图如图3所示:
图3复位电路图
3.3单片机晶振部分
外接晶振引脚XTAL1和TXAL2接外部晶振和微调电容的一端。
振荡电路的频率就是晶体的固有频率。
晶振电路结合单片机内部电路产生单片机所需的时钟频率。
晶振提高频率越高,单片机运行速度越快。
单片机一切指令的执行都是建立在晶振提供的时钟频率上。
晶振电路原理图如图4所示:
图4晶振电路原理图
3.4电源指示灯部分
电源指示灯部分包括一个开关,发光二级管和限流电阻。
当电源接通时发光二级管点亮,表明电路已上电。
电源指示灯原理图如图5所示:
图5电源指示灯原理图
3.5数码管显示部分
1)数码管的分类:
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(即多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
数码管LED对应字母图如图6所示:
图6数码管LED灯对应字母图
2)共阴极数码管:
阴极数码管是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图所示。
图中的8个LED分别和上面那个图中的A~DP各段相对应,通过控制各个LED的亮灭来显示数字。
当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
数码管引脚图如图7所示:
图7数码管所接引脚图
3)数码管显示部分的实现:
数码管通过PO口输入高低电平控制每个LED灯的亮灭,公共端接地线P0口接1K的上拉电阻。
由于并未用到小数点显示,所以DP引脚悬空。
数码管共阴显示图如图8所示:
图8数码管共阴显示图
数码管电路如图9所示:
图9数码管电路
以下为数码管显示字型对应的字符码表:
表1数码管显示数字的实现
3.6蜂鸣器部分
有源蜂鸣器与无源蜂鸣器的区别:
1)内部区别:
需要注意的是这里的“源”不是指电源,而是指震荡源。
也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。
而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。
有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。
2)外观区别:
两者的高度略有区别,有源蜂鸣器,高度为9mm,而无源蜂鸣器的高度为8mm。
如将两种蜂鸣器的引脚都朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。
3)辨别方式:
除了从外观上来看,进一步判断有源蜂鸣器和无源蜂鸣器,还可以用万用表电阻档Rxl档测试:
用黑表笔接蜂鸣器"-"引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。
有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。
无源蜂鸣器的优点是:
1)便宜
2)声音频率可控,可以做出“多来米发索拉西”的效果
3)在一些特例中,可以和LED复用一个控制口有源蜂鸣器的优点是程序控制方便。
蜂鸣器电路如图10所示:
图10蜂鸣器电路
3.7按键部分
1)操作键设计:
常用的按键有三种:
机械触点式按键、导电橡胶式和柔性按键(又称触摸式键盘)。
机械触点式按键是利用机械弹性使键复位,手感明显,连线清晰,工艺简单,适合单件制造。
但是触点处易侵入灰尘而导致接触不良,体积相对较大。
导电橡胶按键是利用橡胶的弹性来复位,通过压制的方法把面板上所有的按键制成一块,体积小,装配方便,适合批量生产。
但是时间长了,橡胶老化而使弹力下降,同时易侵入灰尘。
柔性按键是近年来迅速发展的一种新型按键,可以分为凸球型和平面型两种。
柔性按键最大特点是防尘、防潮、耐蚀,外形美观,装嵌方便。
而且外形和面板的布局、色彩、键距可按照整机的要求来设计。
但是由于客观条件与经济能力有限,本系统采用机械触点式按键。
2)键盘设计:
键盘在单片机应用系统中是一个关键的部件,它能实现向计算机输入数据,传送命令等功能,是人工干预计算机的主要手段。
键盘可以分为2类:
独立连接式键盘和矩阵式键盘。
●矩阵式键盘
单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。
矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。
显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。
矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上.当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。
这是识别按键是否按下的关键。
●独立连接式键盘
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,然而,在按键较多时,I/O口线浪费较大,不宜采用。
按键电路图如图11所示:
图11按键电路图
3)去抖动
键盘编程中主要考虑去抖动的问题。
当测试表明有键被按下之后,紧接着就进行去抖动处理。
因为键是机械开关结构,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。
为保证键识别的准确,在电压信号抖动的情况下不能进行行状态输入。
为此需进行去抖动处理。
去抖动有硬件和软件两种方法。
硬件方法就是加去抖动电路,从根本上避免抖动的产生。
软件消抖,在第一次检测到有键按下时,执行一段延时程序之后,再检测此按键,如果第二次检测结果仍为按下状态,CPU便确认此按键己按下,消除了抖动。
四、软件设计
4.1系统流程
程序流程如图12所示:
图12程序流程图
4.2延时源代码
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
4.3发音源代码
voidPlay(uchary)
{
uchari;
for(i=0;i<100;i++)
{
BEEP=~BEEP;//对蜂鸣器电平求反
DelayMS(y);
}
BEEP=1;//给蜂鸣器一个高电平
}
4.4单个按键源代码:
if(K1==0)
{
DelayMS(10);//按键去抖动
if(K1==0)
{
num=1;
P0=table[num];
Play
(1);
}
while(!
K1);
}
五、附录
仿真电路图图15所示:
图15仿真图
另附实物图如图16图17所示:
图16实物图1
六、设计总结
总体来说,此次单片机课程设计使我们收获良多,虽然课程设计的过程中遇到了很多困难与问题,但我们最终还是完成了设计的任务及要求。
具体来说可以分为以下几点:
第一,不够细心,不够严谨(如因为粗心大意而焊错线);
第二,因对课本理论的掌握度不够导致编程出现错误;
第三,硬件方面,刚开始有的程序模块不能实现预期的效果,对于有的硬件,在实物制作过程中焊了比较多的排线,同时对于整体各元器件的布局都有很高的要求。
不过在向同学请教,各方面都有了不同程度的改善;
第四,在做人方面,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没有什么办不到的。
这次课程设计中,经过我们的努力,在仿真软件和实物上都实现了7个音符的发声,使我们有了一定的成就感,也使我们进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤,掌握了单片机仿真软件Proteus的使用方法和键盘、显示器在的单片机控制系统中的应用,同时也掌握了撰写课程设计报告的方法。
总之,通过这次课程设计,我们都清楚明白了自己的能力有多深,想提高还得归于多锻炼,多动手,多向别人学习。
尤其在做各种东西时应该要特别的仔细小心,比如我在进行电路焊接时就将数码管搞错了,本应使用的共阴数码管被拿成了共阳数码管,然后发光二极管的极性焊反了,焊接的铁丝没有完全焊牢等问题,给自己和老师造成了许多不必要的麻烦,大大的浪费掉了宝贵的时间,这都是不应该出现的。
而对于一些软件来说,就必须了解软件各个方面的性质,不然,在一些小问题中也有可能造成不必要的错误。
另外,自己在理解老师所说的很多东西方面还不是很成熟,经常会反复去问老师一些同样的问题,其原因都是自己不仔细去揣摩老师所说的话的意思,导致自己无法按老师所要求的方面去做,而要反复去问老师反复强调的问题。
终上所述,这都是应该值得去注意和深思的,在做任何意见事情时,都要用百分百的态度去完成它,不能粗心大意了,不然有可能会浪费无比多的时间在一些不该出现的小问题上,比如虚焊。
从这次课程设计中不仅学到了很多做事的方法也学到了许多对人生应有的态度,受益匪浅。
七、参考文献
[1]李广弟.单片机基础[M],北京航空航天大学出版社,2007年6月第三版。
[2]康华光.电子技术基础(模拟部分)[M],高等教育出版社,2006年1月第五版。
[3]求是科技.单片机典型模块设计实例导航[M],人民邮电出版社,2004年5月第一版。
[4]彭伟.单片机C语言程序设计实训100例:
基于8051+Proteus仿真[M],电子工业出版社出版时间:
2009-06-01,ISBN:
9787121087578
..