搜档网
当前位置:搜档网 › 基于51单片机的简单电子琴代码

基于51单片机的简单电子琴代码

#include <AT89X52.h>
sbit P10=P1^0;//高音阶,红灯
sbit P11=P1^1;//中音阶,黄灯
sbit P12=P1^2;//低音阶,绿灯
sbit P13=P1^3;//蜂鸣器控制端口
sbit P31=P3^0;//低音阶按键行
sbit P32=P3^1;//中音阶按键行
sbit P33=P3^2;//高音阶按键行
sbit P35=P3^4;//播放音乐按键
unsigned int i,j,k=0,l=0;
unsigned char count1=0xff,count0=0x50;
/***************************
******数码管码表(P0)********
***************************/
unsigned char Tab[]={0XBF,0X06,0X5B,0X4F,0X66,//数码管0~4
0X6D,0X7D,0X07,0X7F,0X6F,//数码管5~9
0X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//数码管A~F
/***************************
*********音阶控制***********
***************************/
music_data_high[]={0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,//数组0~6 低音
0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,//数组7~13 中音
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff};//数组14~20 高音

music_data_low[]= {0xf3,0xb8,0x15,0xb9,0x4a,0xcf,0x0c,//数组0~6 低音
0x44,0xac,0x09,0x34,0x82,0xc8,0x05,//数组7~13 中音
0x4c,0x6d,0x94,0xad,0xd2,0xf3,0x02};//数组14~20 高音
/*****************************************************
*函数名:delayms
*参数:n 延时毫秒数
*功能:延时N毫秒
*****************************************************/
void delayms(unsigned char n)
{unsigned char a,b;
for(a=100;a>0;a--)
for(b=10*n;b>0;b--);
}
/*****************************************************
*函数名:key_check
*参数:无
*功能:扫描按键并运行对应功能
*****************************************************/
void key_check(void)
{
P2=0xff;
P3=0xfe;
if(P2!=0xff)
{ delayms(20);
if(P2!=0xff)
{P10=1;P11=1;P12=0;
switch(P2)
{
case 0xfe:EA=1;count1=0xf8;count0=0xf3;P0=Tab[1];delayms(50);break;
case 0xfd:EA=1;count1=0xf9;count0=0xb8;P0=Tab[2];delayms(50);break;
case 0xfb:EA=1;count1=0xfa;count0=0x15;P0=Tab[3];delayms(50);break;
case 0xf7:EA=1;count1=0xfa;count0=0xb9;P0=Tab[4];delayms(50);break;
case 0xef:EA=1;count1=0xfb;count0=0x4a;P0=Tab[5];delayms(50);break;
case 0xdf:EA=1;count1=0xfb;count0=0xcf;P0=Tab[6];delayms(50);break;
case 0xbf:EA=1;count1=0xfc;count0=0x0c;P0=Tab[7];delayms(50);break;
defaule:break;
}
}
}
//else {EA=0;P13=1;}
P2=0xff;
P3=0xfd;
if(P2!=0xff)
{ delayms(20);
if(P2!=0xff)
{P10=1;P11=0;P12=1;
switch(P2)
{
case 0xfe:EA=1;count1=0xfc;count0=0x79;P0=Tab[1];delayms(50);break;
case 0xfd:EA=1;count1=0xfc;count0=0xbc;P0=Tab[2];delayms(50);break;
case 0xfb:EA=1;count1=0xfd;count0=0x09;P0=Tab[3];delayms(50);break;
case 0xf7:EA=1;count1=0xfd;count0=0x44;P0=Tab[4];delayms(50);break;
case 0xef:EA=1;count1=
0xfd;count0=0xa2;P0=Tab[5];delayms(50);break;
case 0xdf:EA=1;count1=0xfd;count0=0xd8;P0=Tab[6];delayms(50);break;
case 0xbf:EA=1;count1=0xfe;count0=0x05;P0=Tab[7];delayms(50);break;
// defaule:break;
}
}
}
//else {EA=0;P13=1;}

P2=0xff;
P3=0xfb;
if(P2!=0xff)
{ delayms(20);
if(P2!=0xff)
{P10=0;P11=1;P12=1;
switch(P2)
{
case 0xfe:EA=1;count1=0xfe;count0=0x4c;P0=Tab[1];delayms(50);break;
case 0xfd:EA=1;count1=0xfe;count0=0x6d;P0=Tab[2];delayms(50);break;
case 0xfb:EA=1;count1=0xfe;count0=0x9f;P0=Tab[3];delayms(50);break;
case 0xf7:EA=1;count1=0xfe;count0=0xad;P0=Tab[4];delayms(50);break;
case 0xef:EA=1;count1=0xfe;count0=0xd2;P0=Tab[5];delayms(50);break;
case 0xdf:EA=1;count1=0xfe;count0=0xf3;P0=Tab[6];delayms(50);break;
case 0xbf:EA=1;count1=0xff;count0=0x02;P0=Tab[7];delayms(50);break;
// defaule:break;
}
}
}
if(P2==0xff) {EA=0;P13=1;}
}
/*****************************************************
*函数名:play_music
*参数:无
*功能:播放音乐
*****************************************************/
void play_music(void)
{

count1=music_data_high[0];count0=music_data_low[0];
EA=1;delayms(50);EA=0;delayms(5);
}

/*****************************************************
*函数名:TIM0_init
*参数:无
*功能:定时器0初始化
*****************************************************/
void TIM0_init(void)
{
TMOD=0x01;
TH0=count1;TL0=count0;
EA=1;ET0=1;TR0=1;
}

void timer0(void) interrupt 1 using 0
{
TH0=count1;TL0=count0;
P13=!P13;

}
/*****************************************************
*函数名:main
*参数:无
*功能:开跑程序
*****************************************************/
void main(void)
{ P35=1;
TIM0_init();
//play_music();
//
while(1)
{ if(P35==0) {delayms(20);P35=1;play_music();}
key_check();
}
}

相关主题