课程设计报告电子琴.docx

上传人:b****6 文档编号:5965116 上传时间:2023-01-02 格式:DOCX 页数:16 大小:225.76KB
下载 相关 举报
课程设计报告电子琴.docx_第1页
第1页 / 共16页
课程设计报告电子琴.docx_第2页
第2页 / 共16页
课程设计报告电子琴.docx_第3页
第3页 / 共16页
课程设计报告电子琴.docx_第4页
第4页 / 共16页
课程设计报告电子琴.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

课程设计报告电子琴.docx

《课程设计报告电子琴.docx》由会员分享,可在线阅读,更多相关《课程设计报告电子琴.docx(16页珍藏版)》请在冰豆网上搜索。

课程设计报告电子琴.docx

课程设计报告电子琴

合肥工业大学计算机学院

创新设计报告

设计题目:

电子琴音乐发生器

专业:

电子信息科学与技术

班级:

10-01班

组长:

副组长:

组员:

2012年6月18日—2012年7月15日

 

摘要:

本系统采用Atmel89s52单片机控制,主要利用了键盘矩阵模块和蜂鸣器模块来对电子琴进行设计,通过键盘扫描程序的识别,使用单片机的定时/计数器延时。

可以大致准确的来发出所需的音调(即1,2,3,4,5,6,7这7个音符)。

关键字:

Atmel89s52,键盘扫描,定时器

 

设计题目及要求:

1:

能够通过键盘演奏音符。

2:

能够保存演奏的音乐,并实现回放。

3:

有音调调整功能(如:

C调,G调)。

4:

可以自由选择高音、中音、低音。

5:

要求有单片机硬件系统框图,电路原理图,软件流程图。

一、系统方案:

总体方案的方框图如下:

定时器控制TH0与TL0

蜂鸣器

频率选择

声调选择

键盘扫描

Atmel

89S52

控制模块

 

二、单元电路:

1.电路原理图:

Proteus软件制作的原理图

 

矩阵键盘原理图:

 

单片机最小系统原理图:

 

三、控制算法:

对于电子琴来说,其主要原理是利用单片机某个口线不断的输出“高”“低”电平,则在该口在线就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用过程控制“高”“低”电平的持续时间,就能改变输出波形的频率,从而改变音调。

对于AT89C2051单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的输出就会产生一定频率的方波,通过改变延时的时间就可以改变输出方波的频率,而单片机延时主要有两种方法:

1.使用循环语句来实现延时,让单片机循环的执行某条指令然后根据单片机每条指令运行的时间以及循环的次数来计算延时时间。

2.使用单片机的定时/计数器延时。

AT89S52单片机内部有两个16位的定时/计数器T0和T1,当对单片机的内部晶振驱动时钟计数时,每个机器周期定时/计数器的计数值就加1,当计数值达到计数最大值时计数完毕并通知单片机的CPU;对外部输入的时钟信号计数时,外部时钟的每个时钟上升沿定时/计数器的计数值就加1,当计数值达到计数最大值时计数完毕并通知单片机的CPU。

因此,如果知道单片机的机器周期或者外部输入时钟信号的周期,单片机就可以根据定时器的计数值计算出定时的时间。

本实验采用第二种方式:

计数初值的计算方法:

用最大计数量减去需要的计数次数即可。

例:

如果T0运行于定时状态,单片机的晶振是12MHz,要求定时lOOus,那么定时器要计100个机器周期,当TO工作在工作方式O时计数初值应该是8192—100=8092;工作在方式1时的计数初值应该是65536-100=65436;工作在方式2,3时的计数初值应该是256—100=156。

当然,此次实验使用的是T1工作方式。

设音符的频率为f,则计数初值=65336一各个音符的周期=65536-

四、软件控制程序流程图:

开始

T0初始化并开中断允许放T0中断

按键按下成功否?

N

按键释放成功否?

启动T1工作

根据按键功能,装入音符初始值到T1中

识别按键功能

Y

 

 

N

 

停止T1工作

 

附录:

1.参考文献:

[1]大学生电子实验室WWW.CEET.HBNU.EDU.CN/BBS/

[2]电子工程世界WWW.EEWORLD.COM

[3]元器件交易网WWW.CECB2B.COM

[4]中国知网WWW.CNKI.COM.CN

 

程序代码:

/**************************************************

共有7种音符

有三种音调可选择

C调1234567(doraimifasolaxi)

g调1234567(fasolaxidoraimi)

5=1,6=2,7=3,1=4,2=5,3=6,4=7

可保存音乐

**************************************************/

#include

#defineuintunsignedint

#defineucharunsignedchar

uintcodetable2[]={//G音

0,65178,65217,65252,

65283,65058,65110,65157

};

uintcodetable3[]={//C调

0,65058,65110,65157,

65178,65217,65252,65283

};

uinttable[12]={0};

sbitbeep=P2^3;

uintnum,CTH0,CTL0,i,j,m;

uchartemp,flag;

voiddelay(uint);

voidkeyscan();

voidplay(uint);

voidinit();

voidreplay();

voidmain(){

init();

while

(1){

keyscan();

}

}

voiddelay(uintz){

uinta;

ucharb;

for(a=z;a>0;a--)

for(b=110;b>0;b--);

}

voidinit(){

TMOD=0x01;

EA=1;//开总中断

ET0=1;//开定时器中断

}

voidkeyscan()

{

P3=0xfe;//检测第一行

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)//初始列置高电平,行置底电平

{

delay(300);//消抖

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{//确认按键按下

temp=P3;

switch(temp)

{

case0xee:

num=7;

break;

case0xde:

num=8;

break;

case0xbe:

num=9;

break;

case0x7e:

break;

}

play(num);//演奏音符

while(temp!

=0xf0)

{

temp=P3;//检验是否释放

temp=temp&0xf0;

}

TR0=0;//按键关闭之后,停止定时器工作

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)

{

case0xed:

num=4;

break;

case0xdd:

num=5;

break;

case0xbd:

num=6;

break;

case0x7d:

break;

}

play(num);

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

TR0=0;//按键释放之后,蜂鸣器停止

beep=1;

}

}

P3=0xfb;//检测第三行

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay(300);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xeb:

num=1;

break;

case0xdb:

num=2;

break;

case0xbb:

num=3;

break;

case0x7b:

break;

}

play(num);

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

TR0=0;//按键释放之后,蜂鸣器停止

beep=1;

}

}

P3=0xf7;//检测第四行

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay(300);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xe7:

flag=~flag;//改变音调(C调与G调切换)

break;

case0xd7:

num=0;

break;

case0xb7:

replay();//保存音乐

break;

case0x77:

break;

}

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

}

voidplay(uintnum){

if(flag==1){

CTH0=table2[num]/256;

CTL0=table2[num]%256;}

else

CTH0=table3[num]/256;

CTL0=table3[num]%256;

TR0=1;

table[i++]=num;//存储刚才按下的音

}

voidtimer0()interrupt1{

TH0=CTH0;

TL0=CTL0;

beep=~beep;

}

voidreplay(){

for(j=0;j<=i;j++){

m=table[j+1];

play(m);

delay(300);

TR0=0;

beep=1;

delay(300);

}

beep=1;

TR0=0;

for(i=0;i<12;i++)//初始化音乐保存数组

table[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班

未到人员:

 

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

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1