基于c51单片机的电子琴设计
- 格式:doc
- 大小:91.00 KB
- 文档页数:5
设计任务:
1利用MCS-51单片机设计音乐演奏的硬件电路
2利用C51或者汇编语言实现软件设计。
3利用proteus进行仿真
具体功能:
1. 按键发音(eg:按下1,发出do的音,按下2,发出re的音……)
2. 按下功能键X,自动播放诸如《生日快乐》等简易歌曲(选做)
#include
#define uchar unsigned char
#define uint unsigned int
uint code tab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65010,
65058,65110,65157,65178,};
uchar code shuzhi[4][4]={0x11,0x21,0x41,0x81,
0x12,0x22,0x42,0x82,
0x14,0x24,0x44,0x84,
0x18,0x28,0x48,0x88};
sbit P20=P2^0;
uchar STH0;
uchar STL0;
void delay(void)
{ uchar x;
for (x=300;x>0;x--);
}
/*uchar getkey(void)
{
uchar scancode,tmpcode;
if((P1&0xf0)==0xf0)
return(0);
scancode=0xfe;
while((scancode&0x10)!=0)
{
P1=scancode;
if((P1&0xf0)==0xf0)
{
tmpcode=(P1&0xf0)|0x0f;
return((~scancode)+(~tmpcode));
}
else scancode=(scancode<<1)|0x01;
}
} */
uchar getkey(void)
{
uchar temp,temp1,i,j;
/*delay(100);*/
P1=0xf0;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:i=0;break;
case 0xd0:i=1;break;
case 0xb0:i=2;break;
case 0x70:i=3;break;
}
P1=0x0f;
temp1=P1;
temp1=temp1&0x0f;
switch(temp1)
{
case 0x0e:j=0;break;
case 0x0d:j=1;break; case 0x0b:j=2;break;
case 0x07:j=3;break;
}
return(shuzhi[i][j]);
}
}
void time0_int(void) interrupt 1 using 0
{
TH0=STH0;
TL0=STL0;
P20=~P20;
}
void main()
{
uchar key,k;
TMOD=0x01;
ET0=1;
EA=1;
while(1)
{
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
delay();
if((P1&0xf0)!=0xf0)
{
key=getkey();
switch(key)
{
case 0x11:
k=0;
break;
case 0x21:
k=1;
break;
case 0x41:
k=2;
break;
case 0x81:
k=3; break;
case 0x12:
k=4;
break;
case 0x22:
k=5;
break;
case 0x42:
k=6;
break;
case 0x82:
k=7;
break;
case 0x14:
k=8;
break;
case 0x24:
k=9;
break;
case 0x44:
k=10;
break;
case 0x84:
k=11;
break;
case 0x18:
k=12;
break;
case 0x28:
k=13;
break;
case 0x48:
k=14;
break;
case 0x88:
k=15;
break;
default:
break;
}
P20=~P20;
STH0=tab[k]/256;
STL0=tab[k]%256;
TR0=1; P1=0xf0;
while((P1&0xf0)!=0xf0)
{
P1=0xf0;
}
TR0=0;
}
}
}
}