单片机电子琴课程设计.docx
- 文档编号:7761396
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:15
- 大小:143.51KB
单片机电子琴课程设计.docx
《单片机电子琴课程设计.docx》由会员分享,可在线阅读,更多相关《单片机电子琴课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
单片机电子琴课程设计
一、设计目的
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;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子琴 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)