51单片机简易电子琴程序
2009-04-16 19:59
感谢网上的诸多前辈,小弟我将这个程序写了出来。这个简易电子琴应用了4*4矩阵键盘,每一个按键赋予了不同的音调,共计有两个八度。并预存了一首乐曲《世上只有妈妈好》。(附有protues仿真图)
#include
#define uchar unsigned char
#define uint unsigned int
uint key,i,j,time,m,k;
uchar temp;
uchar STH0,STL0,STH1,STL1;
sbit sw=P2^7;
sbit speaker=P2^4;
sbit P37=P3^7;
sbit P36=P3^6;
sbit P35=P3^5;
sbit P34=P3^4;
//世上只有妈妈好数据表
code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
// 音阶频率表高八位
code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,
//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
// 音阶频率表低八位
code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
unsigned int code tab[]={64021,64103,64260,64400, 64524,64580,64684,64777,
64820,64898,64968,65030, 65058,65110,65157,65178}; void key_music()
{
P3=0xff;
P34=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=1;
break;
case 0x0b:
key=2;
break;
case 0x07:
key=3;
break;
}
speaker=~speaker;
STH1=tab[key]/256;
STL1=tab[key]%256;
TR0=1;
temp=P3;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P35=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=7;
break;
}
speaker=~speaker;
STH1=tab[key]/256;
STL1=tab[key]%256;
TR0=1;
temp=P3;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P36=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=8;
break;
case 0x0d:
key=9;
break;
case 0x0b:
key=10;
break;
case 0x07:
key=11;
break;
}
speaker=~speaker;
STH1=tab[key]/256;
STL1=tab[key]%256;
TR0=1;
temp=P3;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P37=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=12;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
speaker=~speaker;
STH1=tab[key]/256;
STL1=tab[key]%256;
TR0=1;
temp=P3;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
}
void timer0(void) interrupt 1 using 0 {
if(sw==1)
{
TH0=STH1;
TL0=STL1;}
else
{
TH0=STH0;
TL0=STL0;}
speaker=!speaker;
}
void delay(unsigned char t)
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1 { for(t2=0;t2<8000;t2++) { ; } } TR0=0; } void song() { TH0=STH0; TL0=STL0; TR0=1; delay(time); } void music(void) { m=0; time=1; sw=1; while(time&&sw==0) { if(sw) {i=0;continue;} else { k=sszymmh[m]+7*sszymmh[m+1]-1; STH0=FREQH[k]; STL0=FREQL[k]; time=sszymmh[m+2]; m=m+3; song(); } } } void main() { TMOD=0x01; ET0=1; EA=1; while(1) { if(sw==1)key_music(); else music(); } }