单片机制作电子琴共同探讨Word文档下载推荐.docx
《单片机制作电子琴共同探讨Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机制作电子琴共同探讨Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据
低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE:
DW0,63628,63835,64021,64103,64260,64400,64524,0,0
DW0,63731,63928,0,64185,64331,64463,0,0,0
DW0,64580,64684,64777,64820,64898,64968,65030,0,0
DW0,64633,64732,0,64860,64934,64994,0,0,0
DW0,65058,65110,65157,65178,65217,65252,65283,0,0
DW0,65085,65134,0,65198,65235,65268,0,0,0
DW0
2、音乐的音拍,一个节拍为单位(C调)
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。
其中T0用来产生音符频率,T1用来产生音拍。
5.程序框图
图4.22.2
7.C语言源程序
#include<
AT89X51.H>
unsignedchartemp;
unsignedcharkey;
unsignedchari,j;
unsignedcharSTH0;
unsignedcharSTL0;
unsignedintcodetab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
voidmain(void)
{
TMOD=0x01;
ET0=1;
EA=1;
while
(1)
P3=0xff;
//将P3口取出
P3_4=0;
//使P3_4为低电平,这样可以判断第一竖排有没有键按下
temp=P3;
temp=temp&
0x0f;
if(temp!
=0x0f)//有键按下
for(i=50;
i>
0;
i--)
for(j=200;
j>
j--);
//延时
=0x0f)//再判断是否有键按下
switch(temp)//判断是哪个键按下
case0x0e:
key=0;
break;
case0x0d:
key=1;
case0x0b:
key=2;
case0x07:
key=3;
}
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
//找出键对应的频率的时间,作为定时器中断初始值
STL0=tab[key]%256;
TR0=1;
while(temp!
=0x0f)
TR0=0;
P3_5=0;
//跟上面差不多,现在是判断第二排的按键
switch(temp)
key=4;
key=5;
key=6;
key=7;
P3_6=0;
key=8;
key=9;
key=10;
key=11;
P3_7=0;
key=12;
key=13;
key=14;
key=15;
voidt0(void)interrupt1using0
TH0=STH0;
TL0=STL0;
上面是我从网上弄来的,电子琴程序;
其中还存在很多问题,经过研究,自行修改了一些,修改之后明显有了乐感,但还是达不到音乐渐弱的感觉,如果哪位有兴趣的可以共同探讨,本人QQ:
1123658659
下面是我的修改程序;
大家对比学习:
REG52.H>
//#include<
unsignedchari,j,k;
sbitP3_4=P3^4;
sbitP1_0=P1^0;
sbitP3_5=P3^5;
sbitP3_6=P3^6;
sbitP3_7=P3^7;
//unsignedintcodetable[]={63628,63835
TMOD=0x11;
ET1=1;
k=0;
//P1_0=~P1_0;
//P0=table[key];
//TH0=STH0;
//TL0=STL0;
//LLLLLLLL
TH1=0;
TL1=0;
TR1=1;
//for(k=50;
k>
k--)
//for(i=100;
//for(j=100;
//LLLLLLL
//TR0=0;
//P1_0=1;
//&
&
//for(k=25;
k--)
//&
voidt1(void)interrupt3using0//用另一个中断控制上面的中断
k++;
if(k==12){//通过改变k可以使节拍变化
TR1=0;
大家对比学习,如有不妥之处或有更好的欢迎指正:
可至邮件1123658659@