单片机电子琴课程设计.docx

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

单片机电子琴课程设计.docx

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

单片机电子琴课程设计.docx

单片机电子琴课程设计

一、设计目的

1.提高51单片机理论知识

2.学会如何设计电子琴

3.提高编程能力

二、设计要求

1.设计一个(4×4)的键盘,并将16个键设计成16个音

2.可弹奏想要表达的音乐

3.该电子琴包含1首示例音乐,接通电源可播放示例音乐

三、设计过程

1.主要芯片功能描述

AT89C51是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多种功能的I/O线等一台计算机所需要的基本部件。

其内包含下列几个部件:

1).一个8位CPU;

2).一个片内振荡器及时钟电路;

3).4K字节ROM程序存储器;

4).128字节RAM数据存储器

5).可寻址64K外部数据存储器和64K外部程序存储器空间的控制电路;

6).32条可编程的I/O线(四个8为并行I/O端口);

7).具有五个中断源、两个优先级嵌套结构;

其外型如图示:

2.音乐频率

一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。

单片机12MHZ晶振,高中低音符与单片机计数T0相关的计数值如下表所示:

 

音符

频率

简码值(T值)

低3M

330

64021

低4FA

349

64103

低5SO

392

64260

低6LA

440

64400

低7SI

494

64524

中1DO

523

64580

中2RE

587

64684

中3M

659

64777

中4FA

698

64820

中5SO

784

64898

中6LA

880

64968

中7SI

988

65030

高1DO

1064

65058

高2RE

1175

65110

高3M

1318

65157

高4FA

1397

65178

3.设计硬件部分

 

如下图所示,硬件部分采用的是逐列扫描,右边16个按键对应16个音。

不断检测十六个按键,当某个按键被按下,先检测出是哪一列被按下,再判断哪个键被按下。

左边的三个按键是我设置的三个功能键,P1.0是歌曲《祝你生日快乐》,P1.1是歌曲《找朋友》,当检测到按键被按下时,P1.0和P1.1接地,所以歌曲就播放。

P1.2是一个暂停/启动按键,当歌曲播放时,按下它就启动;当歌曲再次按下,它就停止播放。

 

 

4.软件设计部分

程序设计的流程图如下图,不断检测16个音阶键或功能键哪个被按下,当音阶键被按下时,发出对应的音;当功能键被按下时,执行相应的功能。

然后再检测按键释放成不成功,也就是平时所说的松手检测,不成功就不断再检测,成功就停止工作。

 

 

四、设计心得

通过本次课程设计,遇到了许多问题,也提高了自己的实践能力。

如设计硬件部分,我用了另外三个独立功能键,虽然这样做简单很多,但是浪费了IO口的资源;设计软件部分,发现自己的编程能力还有很多问题,改了又改,特别是实现功能键,花了很多时间。

在这次课程设计中,之所以存在着很多的问题,最主要是课外知识不够广,电子方面的知识比较欠缺,认识到了自己的弱点,在接下来的时间会针对这方面努力。

回顾起此次单片机课程设计,至今我仍感慨颇多,科技日益更新,我们要跟上时代的步伐就要掌握好知识,努力向上。

 

附录

设计源程序:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitbeep=P2^3;//定义蜂鸣器

uchartemp,key;

sbits1=P1^0;//定义功能键1

sbits2=P1^1;//定义功能键2

sbits3=P1^2;//定义功能键3

uintcodetable[]={64021,64103,64260,64400,

64524,64580,64684,64777,

64820,64898,64968,65030,

65058,65110,65157,65178};//频率

 

voiddelay(uintz)//延时程序

{

uintx,y;

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

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

}

 

voidmain()

{

TMOD=0x01;

EA=1;//开总中断

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

while

(1)

{

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)//检测第一行按键

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xee:

key=0;

break;

case0xde:

key=1;

break;

case0xbe:

key=2;

break;

case0x7e:

key=3;

break;

}

TH0=table[key]/256;

TL0=table[key]%256;

TR0=1;

while(temp!

=0xf0)//松手检测

{

temp=P3;

temp=temp&0xf0;

}

TR0=0;

beep=1;

}

}

P3=0xfd;//检测第二行按键

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xed:

key=4;

break;

case0xdd:

key=5;

break;

case0xbd:

key=6;

break;

case0x7d:

key=7;

break;

}

TH0=table[key]/256;

TL0=table[key]%256;

TR0=1;

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

TR0=0;

beep=1;

}

}

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

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xeb:

key=8;

break;

case0xdb:

key=9;

break;

case0xbb:

key=10;

break;

case0x7b:

key=11;

break;

}

TH0=table[key]/256;

TL0=table[key]%256;

TR0=1;

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

TR0=0;

beep=1;

}

}

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

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xe7:

key=12;

break;

case0xd7:

key=13;

break;

case0xb7:

key=14;

break;

case0x77:

key=15;

break;

}

TH0=table[key]/256;

TL0=table[key]%256;

TR0=1;

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

TR0=0;

beep=1;

}

}

if(s1==0)//功能键1

{

delay(10);

if(s1==0)

{

TR0=1;

while

(1)

{

if(s3==0)//功能键3

{

delay

(1);

if(s3==0)

{

TR0=~TR0;//设置启动\暂停

while(!

s3);

}

}

key=4;//祝你生日快乐

TH0=table[key]/256;

TL0=table[key]%256;

delay(150);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(150);

key=5;

TH0=table[key]/256;

TL0=table[key]%256;

delay(300);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(300);

key=7;

TH0=table[key]/256;

TL0=table[key]%256;

delay(300);

key=6;

TH0=table[key]/256;

TL0=table[key]%256;

delay(600);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(150);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(150);

key=5;

TH0=table[key]/256;

TL0=table[key]%256;

delay(300);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(300);

key=8;

TH0=table[key]/256;

TL0=table[key]%256;

delay(300);

key=6;

TH0=table[key]/256;

TL0=table[key]%256;

delay(300);

beep=1;

while(!

s1);//松手检测

}

}

}

if(s2==0)//功能键2

{

delay(10);

if(s2==0)

{

TR0=1;

while

(1)

{

if(s3==0)//功能键3

{

delay(10);

if(s3==0)

{

TR0=~TR0;

}

}

key=4;//找朋友

TH0=table[key]/256;

TL0=table[key]%256;

delay(400);

key=5;

TH0=table[key]/256;

TL0=table[key]%256;

delay(400);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(400);

key=5;

TH0=table[key]/256;

TL0=table[key]%256;

delay(400);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(800);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(400);

key=7;

TH0=table[key]/256;

TL0=table[key]%256;

delay(400);

key=6;

TH0=table[key]/256;

TL0=table[key]%256;

delay(400);

key=5;

TH0=table[key]/256;

TL0=table[key]%256;

delay(400);

key=4;

TH0=table[key]/256;

TL0=table[key]%256;

delay(800);

key=2;

TH0=table[key]/256;

TL0=table[key]%256;

delay(800);

beep=1;

while(!

s2);//松手检测

}

}

}

}

}

voidtime()interrupt1//中断

{

TH0=table[key]/256;

TL0=table[key]%256;

beep=~beep;

}

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

当前位置:首页 > 小学教育 > 语文

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

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