劳锦富%2B初级组电子琴.doc_第1页
劳锦富%2B初级组电子琴.doc_第2页
劳锦富%2B初级组电子琴.doc_第3页
劳锦富%2B初级组电子琴.doc_第4页
劳锦富%2B初级组电子琴.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

题目:电子琴队长:劳锦富 08自动化2班队员:冯剑浩 08自动化2班王烨 08自动化2班一题目要求: 一、 设计任务设计制作一个电子琴。二、 设计要求1.基本要求:1)可以通过按键控制发音,能够发出1、2、3、4、5、6、7、i等八个音符;2)可以播放已存储的音乐;3)能够自动演奏多首(两首以上)乐曲,且演奏方式可选择(如重复播放或者顺序播放等)。2.扩展要求:1)可以发出八个以上的音符;2)进行音调、音量的选择;3)可以对编奏乐曲进行录音,在按下放音键时能演奏出来;4)其他。二实现功能1.通过键盘控制发出从低音3到高音4共16个音符2.可以通过键盘选择播放3首已存储的音乐3.能够以重复播放或顺序播放三首乐曲4.播放16个音符时相应的LED灯会亮5.播放歌曲时对应的每个音符的LED灯会亮三方案选择方案1:以AT89S52为芯片,实现形式以时间片来处理。简单说来,就是CPU分配给各个程序的时间,使各个程序从表面上看是同时进行的,而不会造成CPU资源浪费 在宏观上:我们可以同时打开多个应用程序(在此设计中如播放歌曲,暂停,停止等),每个程序并行不悖,同时运行。但是在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。可以以T1为计时器来确定每个时间段,从而在每个时间段中判断是否有程序需要处理,相应做出反应。如在按下键盘时,需要以延迟来扫除振荡,此时可以跳出延迟,执行相应的外部程序,从而达到更加精简。方案2:以AT89S52为芯片,通过T0计时器确定各个音符的频率,以T1确定节拍时间,通过扫描键盘获得相应的处理值从而进行处理。最终选择:以方案2来处理。方案1更有效率,只是因为技术上方面的限制,无法很好实现此方案。方案2具有普遍性,虽然效率没有方案1高,但却更容易处理。四设计与认证主要原理:一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了。此电路使用单片机ATS89S52,晶振频率为12MHZ。通过T0计时器来产生方波频率,进而控制蜂鸣器的发声。通过4*4矩阵键盘确定输出16个音符。通过T1计时器来定义一首歌的节拍。算出高中低间符与单片机计数T0相关的计数值如下表所示:音符频率T值音符频率T值低126263628高1104665058低229463835高2110965110低333064021高3131865157低434964103高4139765178低539264260高5156865217低644064400高6176065252低749464524高7196765283中152364580中258764684中365964777中4 69864820中578464898中688064968中798865030音符频率T值音符频率T值音符频率T值低音#127763731中音#155464633高音#1110965085低音#231163928中音#262264732高音#2124565134低音#437064185中音#474064860高音#4148065198低音#541564331中音#583164934高音#5166165235低音#646664463中音#693264994高音#6186565268流程图:硬件:矩阵键盘:矩阵键盘两端都与单片机I/O口相连,在检测时人为通过单片机I/O口送出低电平,检测时,先送一列为低电平,其余几列全为高电平,此时确定列数,然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平,则可确认当前被按下的键是哪一行哪一列的,用相同方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。本实验以P3口做为矩阵键盘的扫描。独立键盘:独立键盘有一端固定为低电平,当按键按下时,输出口变为低电平,便可确定是否有键按下。本实验以P1.1-P1.7为独立键盘,分别控制四首歌的播放以及播放顺序。LED灯:本实验通过16个I/O口控制16个LED灯。输出口为P0,P2. 当用作输出,所有口线的状态都与SFR锁存位的设置有密切的联系。 P0口为低除外。当P0口的一个位写入0时,这个位被拉低。但是对P0口的其中一个位写入1时,这个位呈现高阻(高阻浮空状态),也就是未能连机,不能使用。要想获得1输出,你必须在P0口外加上拉电阻。补充:一些口线被作为简单的高电平输入也与SFR锁存位有关。因为P1、P2、P3有内部上拉电阻,可以随意被拉高,拉低。而P0口作为高电平输入时,也会呈现高阻态。 P0没有内部上拉电阻,在驱动场效应管的上方有一个提升场效应管,它只是在对外存储器进行读写操作,用作地址/数据时才起作用,当向位锁存器写入1,使驱动场效应管截止,则引脚浮空,所以写入1而未获得。用P0口驱动led,用1K左右的就行了。要想LED亮度大一些,电阻要减小,最小不要小于200欧姆,否则电流太大。对于P2口,可以对每个LED灯串联上一个1K电阻。扬声器:以P1.0作为扬声器输入口,扬声器功率为0.5W,电阻8欧。通过两级放大电路以驱动扬声器。放大电路通过两个8050NPN三极管实现。电路图如下。其中串联电阻可以不用接上。软件:仿真部分:用PROTEUS进行软件仿真,鉴于软件仿真情况跟现实有较大的区别,在软件仿真中没有误差的存在。于是在扬声器电路中只需短接扬声器,不需要使用三极管放大。LED灯所接的电阻也不需要为1K,可以空间LED灯,而本设计加上50欧的电阻。软件仿真电路图如下:制作电路板:用ALTIUM DESIGNER进行电路板制作,主要原理图如下:PCB制板电路图如下:六测试数据及分析电路板制作后,由于转印过程中有导线未能很好复印,导致导线有断路的情况。因此用万用表二极管测各条导线是否导通,用于断线的电路用导线连接上。一开始由于对扬声器的驱动没有很好的把握,设计只用一个三极管驱动,后来发现供电电压不够大,无法驱动扬声器。于是加上一万表板,用两个三极管放大电流用来驱动扬声器。接上电源之后,电源灯亮,电路导通。各个功能的尝试,跟设计预期效果一样。设计程序:unsigned int code table=64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030, 65058,65110,65157,65178,65110,65110,65110,65110,65110,65110,65110,65110,65110,65110,65110,65110,65110,65110,65110,65110; /低音3到高音4 16个音T值 unsigned int code tmusic=0,63628, 63835, 64021, 64103, 64260, 64400, 64524, 0, 0, 0, / 低64580, 64684, 64777, 64820, 64898, 64968, 65030, 0, 0, 0, / 中65058, 65110, 65157, 65178, 65217, 65252, 65283, 0, 0, 0, / 高63731, 63928, 64021, 64186, 64331, 64463, 64524, 0, 0, 0, / 低升半64633, 64732, 64777, 64860, 64934, 64994, 65030, 0, 0, 0, / 中升半65085, 65134, 65157, 65198, 65235, 65258, 65283 ; / 高升半unsigned int code music11= 64777,64777,64820,64898, 64898,64820,64777,64684, 64580,64580,64684,64777, 64777,64684,64684,64684, 64777,64777,64820,64898, 64898,64820,64777,64684, 64580,64580,64684,64777, 64684,64580,64580,64580, 64684,64684,64777,64580, 64684,64777,64820,64777,64580, 64684,64777,64820,64777,64684, 64580,64684,64260,64260, 64777,64777,64820,64898, 64898,64820,64777,64820,64684, 64580,64580,64684,64777, 64684,64580,64580,0 ; /定义第一首歌频率 unsigned char code music12=10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,5, 10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,5, 10,10,10,10, 10,5,5,10,10, 10,5,5,10,10, 10,10,10,5, 10,10,10,10, 10,10,10,5,5, 10,10,10,10, 10,10,10,10; /定义第一首歌节拍时间 unsigned int code music21=64968,64777,64820,64898,64898,64898,65898,64777,64820,64898,64898,64898,64898,64777,64820,64898,64898,64898,65058,65110,65030,65030,64777,64898,64898,647898,64968,65157,65157,65110,65110,65110,65110,64777,64898,65110,65110,65110,65058,65058,65058,65058,65058,64777,64820,65058,65058,65058,65110,65157,65058,65058,65030,65030,65058,64820,65058,65058,65058,65110,65157,65058,65058,65058,64968,65110,65110,64898,65110,65127,65127,65110,65110,65110,65058,65058,65110,65157,64968,65058,65058,0;unsigned char code music22=20,20,12,12,12,12,20,20,12,12,12,12,20,20,12,12,12,12,12,12,20,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,20,12,12,12,12,12,12,12,12,12,12,12,20,12,12,12,12,12,12,12,12,12,20,12,12,12,12 ;unsigned int code music31= 64580,64684, 64777,64777,64684,64580, 64777,64684,64400, 64580,64580,64524,64580, 64400,64400,64580, 64524,64524,64400,64260, 64524,64524,64260, 64400,64400,64580,64524,64580, 64400,64580,64684, 64777,64777,64898,64898,64684, 64684,64777,64684,64524,64580, 64684,64684,64777,64684,64580, 64524,64580,64400,64400,64580, 64524,64524,64400,64260, 64524,64524,64260, 64400,64400,64580,64524,64580, 64400,64580,64684, 64777,64820,64777, 64684,64524,64580, 64684,64684,64777, 64580,64400,64524, 64580,64580,64524,64400,64580, 64524,64524,64260, 64777,64777,64777, 64777,64580,64684, 64777,64777,64898, 64684,64524,64580, 64684,64684,64777, 64580,64400,64524, 64580,64580,64524,64400,64580, 64524,64524,64260, 64400,64400,0 ;unsigned char code music32=10,10, 20,10,10,20, 20,10,10, 20,20,10,10, 20,10,10, 20,10,10,20, 20,10,10, 20,10,10,10,10, 20,10,10, 20,10,10,10,10, 10,10,20,10,10, 20,10,10,10,10, 10,10,20,10,10, 20,10,10,20, 20,10,10, 20,10,10,10,10, 20,10,10, 20,10,10, 20,10,10, 20,10,10, 20,10,10, 20,10,10,10,10, 20,20,20, 20,10,10, 20,10,10, 20,10,10, 20,10,10, 20,10,10, 20,10,10, 20,10,10,10,10, 20,20,20, 20,10 ;#include #includemusic.h#define uchar unsigned char#define uint unsigned intuchar sth0,stl0; /用于存储TH0以及TL0的值 uint i,flag,b,j,y; /b值用于读取每个音符值sbit sounder=P10; / 蜂鸣器端 sbit music1=P11; /低电位时播放歌曲1 sbit music2=P12; /低电位时播放歌曲2 sbit music3=P13; /低电位时播放歌曲3 sbit shunxu=P14; /低电位时按顺序播放歌曲 sbit chongfu=P15; /低电位时重复播放歌曲 sbit yindiao=P16; /选择音调的不同 sbit stop=P17; /低电位时暂停播放歌曲 uchar k,play_flag; /K为确定独立键盘按下的,用于确定16个音符中某一个。play_flag为确定播放歌曲uchar pause;/播放歌曲时,有按键输入则跳出播放 ,为1时确定暂停uchar replay_flag; /循环播放时值为0,初定义为1 void delayms(uint xms); /延时程序,用于消除振荡 void keyscan(); /扫描矩阵键盘,确定按下音符值 void keyscan1(); /扫描独立键盘,进行相关程序 void changeyin()if(yindiao=0)delayms(10);if(yindiao=0)y=y+16;switch(y)case 16:P0=0xff;P2=0x00;while(yindiao=0);break;case 32:P2=0xff;P0=0x00;while(yindiao=0);break;case 48:P0=0xff;P2=0xff;while(yindiao=0);y=0;break; void main()P0=0;P2=0; /关闭所有LED灯TMOD=0x11; /确定工作方式 EA=1; /开总开断 ET0=1;replay_flag=0;TH1=(65535-25000)/256;TL1=(65535-25000)%256;ET1=1;TR1=1; while(1) changeyin();keyscan();keyscan1();while(play_flag=1)b=0;flag=0;i=0;switch(k)case 1:sth0=music11b/256;stl0=music11b%256;TH0=sth0;TL0=stl0;TR0=1;while(music11b!=0&pause!=1)sth0=music11b/256;stl0=music11b%256;if(flag=1)sth0=music11b/256;stl0=music11b%256;flag=0;keyscan();P0=0;P2=0;switch(music11b)case 64021:P0=0x01;break;case 64103:P0=0x02;break; case 64260:P0=0x04;break;case 64400:P0=0x08;break;case 64524:P0=0x10;break;case 64580:P0=0x20;break;case 64684:P0=0x40;break;case 64777:P0=0x80;break;case 64820:P2=0x80;break;case 64898:P2=0x40;break;case 64968:P2=0x20;break;case 65030:P2=0x10;break;case 65058:P2=0x08;break;case 65110:P2=0x04;break;case 65157:P2=0x02;break;case 65178:P2=0x01;break;TR0=0;P2=0;P0=0;if(j=1) play_flag=1;k=2;j=2;delayms(1000);else play_flag=replay_flag;delayms(1000);break;case 2: sth0=music21b/256;stl0=music21b%256;TH0=sth0;TL0=stl0;TR0=1;while(music21b!=0&pause!=1)sth0=music21b/256;stl0=music21b%256;if(flag=1)sth0=music21b/256;stl0=music21b%256;flag=0;keyscan();P0=0;P2=0;switch(music21b) case 64021:P0=0x01;break;case 64103:P0=0x02;break; case 64260:P0=0x04;break;case 64400:P0=0x08;break;case 64524:P0=0x10;break;case 64580:P0=0x20;break;case 64684:P0=0x40;break;case 64777:P0=0x80;break;case 64820:P2=0x80;break;case 64898:P2=0x40;break;case 64968:P2=0x20;break;case 65030:P2=0x10;break;case 65058:P2=0x08;break;case 65110:P2=0x04;break;case 65157:P2=0x02;break;case 65178:P2=0x01;break;TR0=0;P0=0;P2=0;if(j=2)play_flag=1;k=3;j=3;delayms(1000);elseplay_flag=replay_flag;delayms(1000);break;case 3: sth0=music31b/256;stl0=music31b%256;TH0=sth0;TL0=stl0;TR0=1;while(music31b!=0&pause!=1)sth0=music31b/256;stl0=music31b%256;if(flag=1)sth0=music31b/256;stl0=music31b%256;flag=0;keyscan();P0=0;P2=0;switch(music31b) case 64021:P0=0x01;break;case 64103:P0=0x02;break; case 64260:P0=0x04;break;case 64400:P0=0x08;break;case 64524:P0=0x10;break;case 64580:P0=0x20;break;case 64684:P0=0x40;break;case 64777:P0=0x80;break;case 64820:P2=0x80;break;case 64898:P2=0x40;break;case 64968:P2=0x20;break;case 65030:P2=0x10;break;case 65058:P2=0x08;break;case 65110:P2=0x04;break;case 65157:P2=0x02;break;case 65178:P2=0x01;break;TR0=0;P0=0;P2=0;if(j=3)play_flag=1;k=1;j=1;delayms(1000);elseplay_flag=replay_flag;delayms(1000);break;case 4:k=1;j=1; delayms(200);break; void keyscan1()if(music1=0)delayms(10);if(music1=0)k=1;pause=0;play_flag=1;if(music2=0)delayms(10);if(music2=0)k=2;pause=0;play_flag=1;if(music3=0)delayms(10);if(music3=0)k=3;pause=0;play_flag=1;if(chongfu=0)delayms(10);if(chongfu=0)pause=0;replay_flag=1;if(shunxu=0)delayms(10);if(shunxu=0) k=4;pause=0;play_flag=1;void T1_time() interrupt 3TH1=(65535-25000)/256;TL1=(65535-25000)%256;i+;switch(k)case 1:if(i=music12b)b+;flag=1;i=0;break;case 2:if(i=music22b)b+;flag=1;i=0;break;case 3:if(i=music32b)b+;flag=1;i=0;break; void T0_time() interrupt 1TH0=sth0;TL0=stl0;sounder=sounder;void delayms(uint xms)uint i,j;for(i=xms;i0;i-)for(j=110;j0;j-);void keyscan()uchar temp,key;P3=0xfe; /扫描第一行键盘 temp=P3;temp=temp&0xf0;if(temp!=0xf0)delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0) temp=P3;switch(temp) case 0xee: /第一列,第四行键盘按下 key=12;pause=1;P2=0x08;break; case 0xde:/第二列,第四行键盘按下 key=13;pause=1;P2=0x04;break; case 0xbe: /第三列,第四行键盘按下 key=14;pause=1;P2=0x02;break; case 0x7e:/第四列,第四行键盘按下 key=15;pause=1;P2=0x01;break;temp=P3; sounder=sounder; sth0=tablekey+y/256; stl0=tablekey+y%256; /对计时器赋初值 TH0=sth0; TL0=stl0; TR0=1; /打开计时器1 temp=temp&0xf0; while(temp!=0xf0)/确认松开键盘 temp=P3; temp=temp&0xf0;P2=0; TR0=0;/关闭计时器 P3=0xfd; /扫描第二行键盘 temp=P3;temp=temp&0xf0;if(temp!=0xf0)delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xed: /第一列,第三行键盘按下 key=8;pause=1;P2=0x80; /LED9亮break; case 0xdd: /第二列,第三行键盘按下 key=9;pause=1;P2=0x40; /LED10亮break; case 0xbd: /第三列,第三行键盘按下 key=10;pause=1;P2=0x20; /LED11亮break; case 0x7d: /第四列,第三行键盘按下 key=11;pause=1;P2=0x10; /LED12亮break;temp=P3; sounder=sounder; sth0=tablekey+y/256; stl0=tablekey+y%256; /对计时器赋初值 TH0=sth0; TL0=stl0; TR0=1; temp=temp

温馨提示

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

最新文档

评论

0/150

提交评论