基于AT89C51单片机简易电子琴_第1页
基于AT89C51单片机简易电子琴_第2页
基于AT89C51单片机简易电子琴_第3页
基于AT89C51单片机简易电子琴_第4页
基于AT89C51单片机简易电子琴_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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=fj÷2÷fr式中,N是计数值:fj是机器频率(晶体振荡器为1

12、1.0592MH时,其频率为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图

13、表 82.定时常数C计算公式 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拍,需延时8

14、33/2ms“3”为1/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”字型的器件,引线已在内部连接完成,只需引出它们的各个笔

16、划,公共电极。led数码管常用段数一般为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<reg52.h>#include"music.h"#include"piano.h"void main() InterruptPiano(); while(1)P1=0xfe; temp=P1;temp=temp&0xf0;PlaySelect(); #endif播放音乐的程序:/*#

19、define MUSIC_GLOBALS#include"music.h"#include"piano.h"/* #define dao 523 #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

20、,re, dao,dao,sao,sao, la,la,sao, fa,fa,mi,mi, re,re,dao, 0xff; unsigned char code JP=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 , 4,4,4,4, 4,4,8, ;/*- 延时子程序 200ms -*/void Musicdelay() unsigned char i,j; for(i=0;i<250;i+) for(j=0;j<250;j+) ; /*- 定时器T0的中断服务子程序

21、,使P3.6引脚输出音频的方波 -*/ void Time0(void) interrupt 1 using 1 sound=!sound; TH0=(8192-C)/32; TL0=(8192-C)%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

22、=460830/fi; TH0=(8192-C)/32;TL0=(8192-C)%32;TR0=1;for(j=0;j<JPi;j+)Musicdelay();TR0=0;i+; #endif矩阵键盘的程序:/*/*#define PIANO_GLOBALS#include"piano.h"#include"music.h"/*/变量定义unsigned int tab=1759,1567,1396,1320, 1578,1047,933,832, 785,699,660,587, 524,466,441,392; uchar code num=0

23、xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/* 延时子函数*/void delay(uint z) uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);/* 中断初始化函数*/void InterruptPiano()TMOD=0x01;TH0=0xd8;TL0=0xf0; EA=1;ET0=1;TR0=0;/*选择电子琴或者音乐播放函数*/ void PlaySelect() if(PianoKey=0) Piano_count=1;if( Piano_count=1&&Mus

24、ic_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(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;cas

25、e 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;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

26、;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!=0xf0)temp=P1;switch(temp)case 0xeb:a=5;break;case 0xdb:a=6;break;case 0xbb:a=7;break;case 0x7b:a=8;break

27、;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=1;break;case 0xd7:a=2;break;case 0xb7:a=3;break;case 0x77:a=4;break;while(temp!=0xf0) P1=

28、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=(65536-num1)%256;p36=p36;#endif四、心得与体会在课程设计过程中,其中涉及到键盘的驱动和无源蜂鸣器,利用所给矩阵键盘的键,能够发出7个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键,则发出另一个音调的声音.通过学习老师给的驱动资料,自己摸索着进行设计,过程中也遇到一些错误,例如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论