《课程设计报告-电子琴.docx》由会员分享,可在线阅读,更多相关《课程设计报告-电子琴.docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 合肥工业大学计算机学院创新设计报告设计题目: 电子琴音乐发生器 专 业: 电子信息科学与技术 班 级: 10-01班 组 长:副 组 长:组 员:2012年6月18日2012年7月15日摘要:本系统采用Atmel89s52单片机控制,主要利用了键盘矩阵模块和蜂鸣器模块来对电子琴进行设计,通过键盘扫描程序的识别,使用单片机的定时/计数器延时。可以大致准确的来发出所需的音调(即1,2,3,4,5,6,7这7个音符)。关键字:Atmel89s52,键盘扫描,定时器设计题目及要求:1:能够通过键盘演奏音符。2:能够保存演奏的音乐,并实现回放。3:有音调调整功能(如:C调,G调)。4: 可以自由选择高
2、音、中音、低音。5: 要求有单片机硬件系统框图,电路原理图,软件流程图。一、系统方案: 总体方案的方框图如下:定时器控制TH0与TL0蜂鸣器频率选择声调选择 键盘扫描Atmel89S52控制模块二、单元电路: 1.电路原理图: Proteus 软件制作的原理图 矩阵键盘原理图: 单片机最小系统原理图:三、控制算法: 对于电子琴来说,其主要原理是利用单片机某个口线不断的输出“高”“低”电平,则在该口在线就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用过程控制“高”“低”电平的持续时间,就能改变输出波形的频率,从而改变音调。对于AT89C2051单片机来说要产生一定频率的方
3、波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的输出就会产生一定频率的方波,通过改变延时的时间就可以改变输出方波的频率,而单片机延时主要有两种方法:1 使用循环语句来实现延时,让单片机循环的执行某条指令然后根据单片机每条指令运行的时间以及循环的次数来计算延时时间。2 使用单片机的定时/计数器延时。AT89S52单片机内部有两个16位的定时/计数器T0和T1,当对单片机的内部晶振驱动时钟计数时,每个机器周期定时/计数器的计数值就加1,当计数值达到计数最大值时计数完毕并通知单片机的CPU;对外部输入的时钟信号计数时,外部时钟的每个时钟上升沿定时/计数器的计数值就加1,当计数值达
4、到计数最大值时计数完毕并通知单片机的CPU。因此,如果知道单片机的机器周期或者外部输入时钟信号的周期,单片机就可以根据定时器的计数值计算出定时的时间。 本实验采用第二种方式:计数初值的计算方法:用最大计数量减去需要的计数次数即可。例:如果T0运行于定时状态,单片机的晶振是12MHz,要求定时lOOus,那么定时器要计 100个机器周期,当TO工作在工作方式O时计数初值应该是8192100=8092;工作在方式1时的计数初值应该是65536-100= 65436;工作在方式2,3时的计数初值应该是256100=156。当然,此次实验使用的是T1工作方式。 设音符的频率为f,则计数初值=65336
5、一各个音符的周期=65536- 四、软件控制程序流程图:开始 T0初始化并开中断允许放T0中断按键按下成功否? N按键释放成功否?启动T1工作根据按键功能,装入音符初始值到T1中识别按键功能 Y N 停止T1工作附录:1. 参考文献:1 大学生电子实验室 WWW.CEET.HBNU.EDU.CN/BBS/2 电子工程世界 WWW.EEWORLD.COM3 元器件交易网 WWW.CECB2B.COM4 中国知网 WWW.CNKI.COM.CN程序代码: /* 共有7种音符 有三种音调可选择 C调 1 2 3 4 5 6 7 (do rai mi fa so la xi) g调 1 2 3 4 5
6、 6 7 (fa so la xi do rai mi) 5=1,6=2,7=3,1=4,2=5,3=6,4=7 可保存音乐*/#include#define uint unsigned int#define uchar unsigned charuint code table2= /G音0 ,65178, 65217 ,65252 ,65283, 65058 ,65110 ,65157;uint code table3= /C调0 ,65058 ,65110 ,65157 ,65178,65217 ,65252 ,65283;uint table12=0;sbit beep=P23;uint
7、 num,CTH0,CTL0,i,j,m;uchar temp,flag;void delay(uint);void keyscan();void play(uint );void init();void replay();void main() init(); while(1) keyscan(); void delay(uint z) uint a; uchar b; for(a=z;a0;a-) for(b=110;b0;b-);void init() TMOD=0x01; EA=1;/开总中断 ET0=1; /开定时器中断void keyscan()P3=0xfe; /检测第一行tem
8、p=P3;temp=temp&0xf0;while(temp!=0xf0)/初始列置高电平,行置底电平delay(300);/消抖temp=P3;temp=temp&0xf0;while(temp!=0xf0) /确认按键按下temp=P3;switch(temp)case 0xee:num=7;break;case 0xde:num=8;break;case 0xbe:num=9;break;case 0x7e:break;play(num); /演奏音符while(temp!=0xf0)temp=P3;/检验是否释放temp=temp&0xf0;TR0=0; /按键关闭之后,停止定时器工作
9、beep=1; P3=0xfd; /检测第二行temp=P3;temp=temp&0xf0;while(temp!=0xf0)delay(300);temp=P3;temp=temp&0xf0;while(temp!=0xf0)temp=P3;switch(temp)case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d: break;play(num); while(temp!=0xf0)temp=P3;temp=temp&0xf0;TR0=0; / 按键释放之后,蜂鸣器停止beep=1;P3=0
10、xfb; /检测第三行temp=P3;temp=temp&0xf0;while(temp!=0xf0)delay(300);temp=P3;temp=temp&0xf0;while(temp!=0xf0)temp=P3;switch(temp)case 0xeb:num=1;break;case 0xdb:num=2;break;case 0xbb:num=3;break;case 0x7b:break;play(num);while(temp!=0xf0)temp=P3;temp=temp&0xf0;TR0=0;/ 按键释放之后,蜂鸣器停止beep=1; P3=0xf7; /检测第四行tem
11、p=P3;temp=temp&0xf0;while(temp!=0xf0)delay(300);temp=P3;temp=temp&0xf0;while(temp!=0xf0)temp=P3;switch(temp)case 0xe7: flag=flag; /改变音调(C调与G调切换)break;case 0xd7:num=0;break;case 0xb7:replay(); / 保存音乐break;case 0x77:break;while(temp!=0xf0)temp=P3;temp=temp&0xf0; void play(uint num) if(flag=1) CTH0=tab
12、le2num/256; CTL0=table2num%256; else CTH0=table3num/256; CTL0=table3num%256; TR0=1; tablei+=num; /存储刚才按下的音 void timer0() interrupt 1 TH0=CTH0; TL0=CTL0; beep=beep;void replay() for(j=0;j=i;j+) m=tablej+1; play(m); delay(300); TR0=0; beep=1; delay(300); beep=1; TR0=0; for(i=0;i12;i+) /初始化音乐保存数组 table
13、i=0;第二次会议记录会议时间:7月5日下午18:00会议地点:电子信息创新基地(4号实验楼7号机房)主持人: 陈力会议内容: 经过一段时间的学习,很多同学已经掌握单片机的基本方法,可以编写一些简单的程序,但是很多大一点的程序还没有思绪,本次会议主要是给大家提供一些源代码,给大家赏析的同时要求组员必须参透这些程序,对于不懂的地方我们给予他们讲解。会议成效: 大家通过对一些代码比较大的程序了解后发现原来编写程序也不是那么的难,主程序里只有几个模块,而且很多代码原理都一样,通过这次会议给大家提高了信心。本次与会人员:武 哲20102908电信科10-1班韩 阳20102909电信科10-1班甄 鑫20102910电信科10-1班杨 柯20102915电信科10-1班张宇晓20102916电信科10-1班胡学望20102921电信科10-1班陈 力20102926电信科10-1班张 翔20102928电信科10-1班李飞腾20102932电信科10-1班万东昱20102938电信科10-1班吴宇驰20102944电信科10-1班石朝阳20102947电信科10-1班 罗 盛201102949电信科10-1班未到人员:无