基于AT89C51单片机简易电子琴.doc

上传人:大张伟 文档编号:8871200 上传时间:2021-01-21 格式:DOC 页数:28 大小:520.50KB
返回 下载 相关 举报
基于AT89C51单片机简易电子琴.doc_第1页
第1页 / 共28页
基于AT89C51单片机简易电子琴.doc_第2页
第2页 / 共28页
基于AT89C51单片机简易电子琴.doc_第3页
第3页 / 共28页
基于AT89C51单片机简易电子琴.doc_第4页
第4页 / 共28页
基于AT89C51单片机简易电子琴.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《基于AT89C51单片机简易电子琴.doc》由会员分享,可在线阅读,更多相关《基于AT89C51单片机简易电子琴.doc(28页珍藏版)》请在三一文库上搜索。

1、目录基于AT89C51单片机简易电子琴的设计1小组分工2一 、概述31.1课程设计的题目:基于AT89C51单片机简易电子琴31.2设计任务31.3引言31.4基于AT89C51单片机简易电子琴的设计思想41.5设计功能4二、方案比较与论证52.1 举例方案52.2 系统组成52.3流程图6三、电路设计73.2 矩阵键盘模块73.3主控模块93.4音乐设计“音调”和“节拍”103.5工作原理123.6创新部分123.7 LED数码显示管与单片机的连接123.8源程序13四、心得与体会26基于AT89C51单片机简易电子琴的设计小组分工:*负责:资料收集与整理,DXP2004电路板的绘制,数码管

2、显示 *负责:矩阵键盘上实现7种不同的音调 *负责:音乐播放实现一 、概述1.1课程设计的题目:基于AT89C51单片机简易电子琴摘要:如今随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,生活中的我们都会欣赏世界名曲,作为对精神的洗礼。本论文设计一个基于AT89C51单片机的简易电子琴。电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本系统是以51系列单片机AT89C51为主控制器,附有矩阵键盘、LED显示管、扬声器组成。系统完成显示输入信息、播放

3、相应音符等基本功能。本设计的系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。关键词:AT89C51;矩阵键盘;LED显示管;扬声器1.2设计任务1) 查阅相关电子琴的资料,了解熟悉单片机控制单音喇叭发声原理。 2) 利用键盘的16键,能够发出1,2,3,4,5,6,7等7个音符,具有一般演奏功能,要求按下键发声,松开则延时一段时间停止,中间再按别的键,则发出另一个音调的。3) 存储有一首歌的音乐,设置按键按下具有自动播放已存曲目功能。 1.3引言单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小

4、、价格低廉、稳定可靠、应用广泛的特点。AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4k字节的可系统编程的Flash只读程序存器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。由于将多功能8位CPU和闪烁存器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C51是它的一种精简版本。AT89C51单片机为很多嵌入式制系统提供了一种灵活性高且价廉的方案,可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一

5、部分。电子琴已为人们所熟知,它可以演奏出非常动听的乐曲, 它在现代音乐扮演着重要的角色。它是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。在许多专用的电子琴电路中,都采用了特殊的集成电路来完成电子电路的设计,利用专用电路产生的声音信号驱动扬声器发音,通过演奏者不同的操作,弹奏出美妙的乐曲。但是,以单片机作为主控核心,与键盘、蜂鸣器等模块组成核心主控制模块就可以达到设计一个简易电子琴的目的。1.4基于AT89C51单片机简易电子琴的设计思想单片机产生音乐的要素一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。因此,单片机奏乐

6、只需弄清楚两个概念,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样我们就可以利用不同的频率的组合,加上与拍数对应的延时,即可构成我们所想要的音乐了。所以本课程设计的主要内容是用 AT89C52单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、蜂鸣器等模块组成核心主控制模块,在主控模块上设有16个按键和蜂鸣器,用不同的频率和延时的时间来产生音乐的要素“音调”和“节拍”。1.5设计功能(1)由4X4组成16个按钮矩阵,设计成16个音,可随意弹奏想要表达的声音。(2)设计有音乐

7、存储,按键按下后播放。(3)键盘矩阵识别,即矩阵扫描在数码管上可以显示矩阵键盘按下哪个按键。二、方案比较与论证2.1 举例方案方案一:用 VHDL 语言编程来实现系统整体基本原理图如下:利用我们实验室先进的数字电路实验设备,我们可以采用 VHDL 语言编程来实现。我们可以通过 VDHL 语言,对实验原理图的各个部分进行设计,通过编译,可以在计算机上下载此实验原理图,利空电路学习机上的芯片。方案二:利用 AT89C51 单片机为核心控制元件,以单片机作为主控核心,与键盘、蜂鸣器等模块组成核心主控制模块,在主控模块上设有16个按键和蜂鸣器来设计一个电子琴。方案一显得比较笼统,只是把整个系统分为了若

8、干个模块,而不牵涉到具体的硬件电路。而方案二,利用单片机4X4 组成 16 个按钮矩阵,设计成 16 个音对应音乐音符。每按一个键,单片机检测按下的那个键并查表查找相应的音符,输出到音频处理模块驱动蜂鸣器发出音符。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。所以本次设计采用方案二。2.2 系统组成本系统只要以51单片机为主控核心,与矩阵键盘、扬声器、LED显示管模块一起组合而成。具体如下:2.3流程图三、电路设计3.1、蜂鸣器模块单片机实验板蜂鸣器原理图如下图表1所示:图表 1蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电

9、流才能驱动它,单片机IO 引脚输出的电流较小,单片机输出的TTL 电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。如图一所示,蜂鸣器的正极接到VCC(5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B 经过限流电阻R1后由单片机的P3.6引脚控制,当P3.6输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P3.6输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P3.6脚的电平来使蜂鸣器发出声音和关闭。 用延时程序或者定时器控制接蜂鸣器的端口输出频率在2KHZ左右的矩形波就能让蜂鸣器发声了。程序中改变单片机P3.6引

10、脚输出波形的频率,就可以调整控制蜂鸣器音调,生各种不同音色、音调的声音。另外,改变P3.6输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。3.2 矩阵键盘模块在单片机组成的各种系统中,本次试验用的是非编码键盘,矩阵键盘。矩阵键盘:由单片机I/O口构成的行列式键盘,优点:扫描速度快,按键数量多缺点:按键间存在关联,不能级联。矩阵式结构的键盘识别要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就

11、可得知是否有键按下了。单片机实验板键盘原理图如下图表2所示:P2.0P2.7P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7图表 2键盘原理图的PCB 图如图表3所示:图表 3独立键盘模块 独立键盘:单片机一个I/O口连接一个按键。独立键盘的原理图如图表4所示:图表 43.3主控模块最小系统的原理图如图表5所示:图表 5总的原理图如图表6所示:图表63.4音乐设计“音调”和“节拍”(1)本设计的控制矩阵键盘使用定时器T0方式1的音调的计算方法如下矩阵键盘的音调计算:计数脉冲值与频率的关系式是:N=fj2fr式中,N是计数值:fj是机器频率(晶体振荡器为11.0592MH时,其频

12、率为1MHz);fr是想要产生的频率。 本设计定时器工作方式1,16个键的频率音阶对应频率(音调的频率)表如图表7所示:图表 7(2)节拍的计算方法本设计使用定时器T0的中断控制播放音乐一闪一闪亮晶晶,T0工作方式0, 图表8列出了C音调与频率的对应关系。1、C音调与频率的对应关系表C音调与频率的对应关系表音调低1(“dao”)低2低3低4低5低6低7频率262294330349392440494音调1(中音“dao”)234567频率523587659698784880988音调高1高2高3高4高5高6高7频率1064117513181397158617601967图表 82.定时常数C计算

13、公式 C=T0工作方式0.最大计数为8192,在已知定是常数为C的条件下,13位计算器的高8位和低5的初值可由以下公式设定TH0=(8192-C)/32;TL0=(8192-C)%32;3.简单乐谱|1 1 5 5| 6 6 5 -| 4 4 3 3| 2 2 1 -| 5 5 4 4 | 3 3 2 -| 5 5 4 4 |3 3 2 -| 1 1 5 5 | 6 6 5 -| 4 4 3 3|2 2 1 -|4.节拍控制 本例简谱的节拍为每分钟72拍,则每个节拍需时间 (1000*60ms)/72=833ms“1 “为1拍,需延时833ms“2”为1/2拍,需延时833/2ms“3”为1/

14、4,需延时833/4ms3.5工作原理矩阵键盘的工作原理:通过AT89C51单片机为核心控制元件,设计一个能发出电子音调的简易电子琴。在控制模块上设有16个矩阵键盘按键,通过按下矩阵键盘K01一K7键,可发出DO、RE、M、FA、SO、LA、SI 7个低音符的声音;矩阵键盘K08K14键,可发出D0、RE、M、FA、SO、LA、SI 7个中音符的声音;K15键是高音符DO的声音,K16键是高音符RE的声音。当我们随意按下矩阵键盘上的一个按键时,可以发出相应的声音。本设计有一个功能选择键(选择使用矩阵键盘选择键或者选择自动播放音乐选择键),一个矩阵键盘选择键、一个自动播放音乐选择键,通过按下功能

15、选择键,可以实现按键发音功能和音乐播放功能之间的切换。在矩阵按键发音的功能下,可以通过音调选择键来选择三个不同的音阶进行发音;在音乐播放功能下,可以自动播放音乐。3.6创新部分当我们选择矩阵键盘选择键的时候,在矩阵按键发音的功能下,可以通过音调选择键来选择三个不同的音阶进行发音,同时在主板的数码管上可以同时显示你在矩阵键盘上按下哪一个键。例如你按下K01键,同时在数码管显示01这个数字。3.7 LED数码显示管与单片机的连接led数码管(LED Segment Displays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码

16、管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位,1,2,3,4,5,6,8,10位等等.,led数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp 的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示

17、出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。 透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。由此本实验是将P2口通过芯片与数码管连接,以达到点亮数码管的效果。静态显示的特点是每个数码管的

18、段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。图表 93.8源程序主函数:#include#includemusic.h#includepiano.hvoid main() InterruptPiano(); while(1)P1=0xfe; temp=P1;temp=temp&0xf0;PlaySelect(); #endif播放音乐的程序:/*#define MUSIC_GLOBALS#includemusic.h#includepiano.h/* #define dao 52

19、3 #define re 587 #define mi 659 #define fa 698 #define sao 784 #define la 880 #define xi 987unsigned int code f=dao,dao,sao,sao, la,la,sao, fa,fa,mi,mi, re,re,dao, sao,sao,fa,fa, mi,mi,re, sao,sao,fa,fa, mi,mi,re, dao,dao,sao,sao, la,la,sao, fa,fa,mi,mi, re,re,dao, 0xff; unsigned char code JP=4,4,4,

20、4, 4,4,8, 4,4,4,4, 4,4,8, 4,4,4,4, 4,4,8, 4,4,4,4, 4,4,8, 4,4,4,4, 4,4,8 , 4,4,4,4, 4,4,8, ;/*- 延时子程序 200ms -*/void Musicdelay() unsigned char i,j; for(i=0;i250;i+) for(j=0;j250;j+) ; /*- 定时器T0的中断服务子程序,使P3.6引脚输出音频的方波 -*/ void Time0(void) interrupt 1 using 1 sound=!sound; TH0=(8192-C)/32; TL0=(8192-C

21、)%32; /*- 主函数-*/void MusicInit() EA=1; ET0=1; TMOD=0x00; while(Music_count=1) i=0; if(key1=0)Music_count=0;Piano_count=0; while(fi!=0xff&Music_count=1) if(key1=0)Music_count=0;Piano_count=0; C=460830/fi; TH0=(8192-C)/32;TL0=(8192-C)%32;TR0=1;for(j=0;j0;x-)for(y=110;y0;y-);/* 中断初始化函数*/void InterruptP

22、iano()TMOD=0x01;TH0=0xd8;TL0=0xf0; EA=1;ET0=1;TR0=0;/*选择电子琴或者音乐播放函数*/ void PlaySelect() if(PianoKey=0) Piano_count=1;if( Piano_count=1&Music_count=0)Piano();if(MusicKey=0)Music_count=1;if(Music_count=1&Piano_count=0) MusicInit();if(key1=0)Music_count=0;Piano_count=0; /* 键盘驱动电子琴函数*/void Piano()while(

23、temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xee:a=13;break;case 0xde:a=14;break;case 0xbe:a=15;break;case 0x7e:a=16;break;while(temp!=0xf0) P1=0xfe;temp=P1;temp=temp&0xf0;TR0=1; p36=1; TR0=0; P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0) delay(5);temp=P1;

24、temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xed:a=9;break;case 0xdd:a=10;break;case 0xbd:a=11;break;case 0x7d:a=12;break; while(temp!=0xf0) P1=0xfd;temp=P1;temp=temp&0xf0;TR0=1; p36=1; TR0=0;P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf

25、0)temp=P1;switch(temp)case 0xeb:a=5;break;case 0xdb:a=6;break;case 0xbb:a=7;break;case 0x7b:a=8;break;while(temp!=0xf0) P1=0xfb;temp=P1;temp=temp&0xf0;TR0=1; p36=1; TR0=0;P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xe7:a=

26、1;break;case 0xd7:a=2;break;case 0xb7:a=3;break;case 0x77:a=4;break;while(temp!=0xf0) P1=0xf7;temp=P1;temp=temp&0xf0;TR0=1; p36=1; TR0=0; p36=1;P2=0xfe;P0=numa/10;delay(5);P2=0xfd;P0=numa%10;delay(5);P0=0xff; /* 中断服务子函数,编号为1,即为定时器T1中断*/void timer0() interrupt 1 num1=taba;TH0=(65536-num1)/256;TL0=(65

27、536-num1)%256;p36=p36;#endif四、心得与体会在课程设计过程中,其中涉及到键盘的驱动和无源蜂鸣器,利用所给矩阵键盘的键,能够发出7个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键,则发出另一个音调的声音.通过学习老师给的驱动资料,自己摸索着进行设计,过程中也遇到一些错误,例如中音的时候,7个音调发出的声音是一样的,但是通过询问同学和查阅资料,最终还是实现了按键发出各种不同的频率,即是发出低音7个不同的音调,中音7个不同的音调,和2个高音dao,re. 设计的不足之处有:1.可弹奏的音符数较少,只能在一定范围内满足用户需要。可通过改进键盘识别模块和

28、发生模块来增加其复杂度2.音量不可调。我们三个人设计好的程序合为一体,再将程序烧入芯片,这次的课程设计涉及硬件和软件两方面的内容。首先是软件部分,在设计中我运用自己平时学到的一些知识,以及自己在课下所查找的进行设计,刚开始遇到很多困难,包括对使用C语言环境语言的不熟悉,后来一起和同学研究,而一些课程设计中的故障,也请同学帮忙参考一下,最终找到了解决问题的答案。我感觉自己在设计方面提高很大,特别是在设计程序时,逻辑思维能力有所加强,同时对以前所学的知识有了更深刻的认识,并进一步的得到了巩固和提高,充分的做到了理论联系实际,也使我认识到理论与实际的差别,通过该课程设计,不但对单片机有了较为全面的认

29、识,而且相关的知识也有了足够的掌握,我感觉最重要的还是设计思维的形成。更发现自己在平时学习中的缺陷。对以后的学习也有很大的帮助。我学会了运用keil C51软件建立工程文件来调试程序的正确性,同时也学会了运用DXP2004软件来画电路图,基本掌握DXP2004软件的使用方法包括绘制原理图、PCB图,通过这些图与焊接硬件电路紧密的联在一起。由于自己所学有限,所以程序的编写事件很头疼的事,所以我是先从网上下载一些类似的程序,然后对程序进行分析修改加以利用。硬件部分,在选取单片机前必须知道我将要制作的电路需要实现什么功能,根据其功能来选取我们需要的单片机。而在焊接的过程中我发现每个元器件的排布是十分讲究的,布局得好焊接起来就方便且简单多了。在此次的课程设计,我所收获的不仅是学习知识方面,更多的是生活方面。我了解到,在我们生活中,应该学会与别人共同分享,分享知识,分享问题,这样更有助于我们的交流,有利于我们共同进步,有利于我们对学习养成良好的兴趣。最后,我要感谢那些带我们课程设计的老师们,感谢你们对我们的耐心,感谢你们对我们的鼓励,让我们有信心继续下去,成功走到最后。教师评语:年 月 日签名:评分:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1