单片机设计矩阵键盘电子琴文档格式.docx
- 文档编号:22561356
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:16
- 大小:18.29KB
单片机设计矩阵键盘电子琴文档格式.docx
《单片机设计矩阵键盘电子琴文档格式.docx》由会员分享,可在线阅读,更多相关《单片机设计矩阵键盘电子琴文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
5
(1)硬件方面:
单片机。
4*4行列式键盘,蜂鸣器,独立数码管,独立建。
硬件部分采用逐列扫描,16个键位对应16个音,不断检测16键位,当某个键位被按下,先检测哪一列再检测哪个按键被按下,同时设置四个功能键,p1.0,p1.1播放歌曲,p1.2暂停,p1.3复位,可控制歌曲的播放。
插入图片
〔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
6程序设计的流程图如以下图,不断检测16个音阶键或功能键哪个被按下,当音阶键被按下时,发出对应的音;
当功能键被按下时,执行相应的功能。
然后再检测按键释放成不成功,也就是平时所说的松手检测,不成功就不断再检测,成功就停顿工作。
7心得体会:
通过这次课程设计,我学到了很多书本上学不到的知识与经历,同时也遇到了很多问题,并在这个过程中逐步尝试去解决他们,进步自己的理论才能,硬件设计上我发现通过不同的I/O口可以节省端口资源的利用,部分端口上的需求可以通过软件解决。
从语法错误到程序功能的实现,前前后后也是改了又改,这次课程设计使我意识到很多存在的问题,必须在单片机方面读更多的书,更深化的去探究,去挖掘这些问题的答案。
8源程序
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitbuz=P2^3;
//定义蜂鸣器
uchartemp,key;
sbits1=P1^0;
//定义功能键1
sbits2=P1^1;
//定义功能键2
sbits3=P1^2;
//定义功能键3
sbits4=P1^3;
uintcodetable[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
//频率
uintcodexable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
voiddelay(uintz)//延时程序
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidinitialize()
P1=0xff;
//起初数码管不显示任何数
voidmain()
{
TMOD=0x01;
EA=1;
//开总中断
ET0=1;
//开定时器0中断
while
(1)
{
P3=0xfe;
temp=P3;
temp=temp&
0xf0;
if(temp!
=0xf0)//检测第一行按键
delay(10);
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0,P0=xable[0];
break;
case0xde:
key=1,P0=xable[1];
case0xbe:
key=2,P0=xable[2];
case0x7e:
key=3,P0=xable[3];
}
TH0=table[key]/256;
TL0=table[key]%256;
TR0=1;
while(temp!
=0xf0)//松手检测
temp=temp&
}
TR0=0;
buz=1;
}
P3=0xfd;
//检测第二行按键
delay(10);
if(temp!
{
case0xed:
key=4,P0=xable[4];
break;
case0xdd:
key=5,P0=xable[5];
case0xbd:
key=6,P0=xable[6];
case0x7d:
key=7,P0=xable[7];
temp=P3;
}
}
P3=0xfb;
//检测第三行按键
case0xeb:
key=8,P0=xable[8];
case0xdb:
key=9,P0=xable[9];
case0xbb:
key=10,P0=xable[10];
case0x7b:
key=11,P0=xable[11];
}
P3=0xf7;
//检测第四行按键
case0xe7:
key=12,P0=xable[12];
case0xd7:
key=13,P0=xable[13];
case0xb7:
key=14,P0=xable[14];
case0x77:
key=15,P0=xable[15];
temp=temp&
buz=1;
}
}
if(s1==0)//功能键1
if(s1==0)
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;
key=5;
delay(300);
key=7;
key=6;
delay(600);
delay(150);
delay(300);
key=8;
key=6;
TH0=table[key]/256;
delay(300);
while(!
s1);
//松手检测
}
}
if(s2==0)//功能键2
if(s2==0)
{
if(s3==0)//功能键3
{
delay(10);
TR0=~TR0;
}
key=4;
//找朋友
delay(400);
key=5;
delay(400);
delay(800);
key=7;
delay(800);
key=2;
delay(800);
s2);
//松手检测
}
voidtime()interrupt1//中断
TL0=table[key]%256;
buz=~buz;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 设计 矩阵 键盘 电子琴