#include<reg51.h>
sbit high_tongue=P3^0; //高音控制位
sbit low_tongue=P3^1; //低音控制位
sbit eg_music=P3^2; //示例音乐控制位
sbit speak=P3^3; //喇叭控制位
int temp,key=16;
unsigned char Count;
//共阳极数码管显示按键号码
code unsigned char led[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0xff};
//低音、中音高音音频换算表(默认为中音)
code unsigned int table[]={63628,63835,64021,64103,64260,64400,64524,64550,
64580,64684,64777,64820,64898,64968,65030,65050,
65058,65110,65157,65178,65217,65252,65283,65310};
//示例音乐
unsigned char code SONG[] ={0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00, //祝你平安
0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00 //路边的野花不要采
};
//1ms延时子程序
void Delay_xMs(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
{
for(j=0;j<3;j++);
}
}
//定时器1的初始化
void Time1_Init()
{
TMOD=TMOD|0x10;
EA=1;
ET1=1;
TH1=0xD8;
TL1=0xEF;
}
//定时器中断函数
void Time1_Int() interrupt 3
{
TH1=0xD8;
TL1=0xEF;
Count++;
}
//示例音乐播放函数
void Play_Song(unsigned char i)
{
unsigned char Temp1,Temp2;
unsigned int Addr;
Count=0;
Addr=i*217;
while(1)
{
Temp1=SONG[Addr++];
if(Temp1==0xFF)
{
TR1=0;
Delay_xMs(100);
}
else if(Temp1==0x00)
{
Addr++;
i++;
if(i==2)
{
i=0;
return;
}
}
else
{
Temp2=SONG[Addr++];
TR1=1;
while(1)
{
speak=~speak;
Delay_xMs(Temp1);
if(Temp2==Count)
{
Count=0;
break;
}
}
}
}
}
//主函数
void main()
{
P0=0xff; //数码管初始灭
TMOD=0x01;
EA=1;
ET0=1;
while(1)
{
temp=P1;
if(temp!=0xff)
{
Delay_xMs(100); //消抖
if(temp!=0xff)
temp=P1;
TR0=1;
}
else
TR0=0;
switch(temp) //按键检测
{
case 0xfe: key=8; break;
case 0xfd: key=9; break;
case 0xfb: key=10; break;
case 0xf7: key=11; break;
case 0xef: key=12; break;
case 0xdf: key=13; break;
case 0xbf: key=14; break;
case 0x7f: key=15; break;
}
temp=P1;
P0=led[key-8]; //数码管显示相应数字
Delay_xMs(5000);
TH0=table[key]/256; //定时器赋初值
TL0=table[key]%256;
/*******高音按钮是否按下,按下数码管显示A,重新按键盘则发出高音***********/
while(!high_tongue)
{
P0=0x88; //A表示升高音调
temp=P1;
if(temp!=0xff)
{
Delay_xMs(100); //消抖
if(temp!=0xff)
temp=P1;
TR0=1;
}
else
TR0=0;
switch(temp) //按钮检测
{
case 0xfe: key=8; break;
case 0xfd: key=9; break;
case 0xfb: key=10; break;
case 0xf7: key=11; break;
case 0xef: key=12; break;
case 0xdf: key=13; break;
case 0xbf: key=14; break;
case 0x7f: key=15; break;
}
temp=P1;
key=key+8;
Delay_xMs(5000);
TH0=table[key+8]/256;
TL0=table[key+8]%256;
}
/*******低音按钮是否按下,按下数码管显示B,重新按键盘则发出低音***********/
while(!low_tongue)
{
P0=0x83; // B表示降低音调
temp=P1;
if(temp!=0xff)
{
Delay_xMs(100);
if(temp!=0xff)
temp=P1;
TR0=1;
}
else
TR0=0;
switch(temp)
{
case 0xfe: key=8; break;
case 0xfd: key=9; break;
case 0xfb: key=10; break;
case 0xf7: key=11; break;
case 0xef: key=12; break;
case 0xdf: key=13; break;
case 0xbf: key=14; break;
case 0x7f: key=15; break;
}
temp=P1;
key=key-8;
Delay_xMs(5000);
TH0=table[key]/256;
TL0=table[key]%256;
}
/*********按下按钮,播放示例音乐,数码管显示C***************/
while(!eg_music)
{
P0=0xc6; //C表示播放示例音乐
Time1_Init();
Play_Song(0);// 调用示例音乐函数
TR0=0;
}
}
}
//单独按键中断处理函数
void init_interrupt(void ) interrupt 1
{
TR0=0;
TH0=table[key]/256;
TL0=table[key]%256;
speak=~speak;
TR0=1;
}