#include<reg51.h>
unsigned char fullScanKey(void);
unsigned char findKeyValue(void);
unsigned char readKey(void);
void ddxh(void);
void ctxh(void);
void xmze(void);
void delay(unsigned char t);
void Delay_ms (unsigned int Delay);
sbit beep=P2^0;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
// 我和我的祖国
// 频率-半周期数据表 高八位
code unsigned char FREQH[] = {
0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567
// 频率-半周期数据表 低八位
code unsigned char FREQL[] = {
0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567
0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567
0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567
//数据表
//我和我的祖国
code unsigned char song1[] = {
5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我和我的祖国
1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12, //一刻也不能分割
6, 2, 2, 7, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 6, 1, 6, //无论我走到哪里
7, 1, 2, 6, 1, 2, 5, 1, 2, 5, 2, 2, 1, 2, 3, 2, 2, 1, 3, 2, 12, //都唱出一首赞歌
5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我歌唱每一座高山
1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 2, 3, 3, 1, 3, 1, 6, 2, 12, //我歌唱每一条河
1, 3, 2, 7, 2, 2, 6, 2, 2, 5, 2, 6, //袅袅炊烟
6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 6, //小小村落
7, 1, 4, 6, 1, 2, 5, 1, 4, 2, 2, 2, 1, 2, 12, //路上一道辙
8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12,//我最亲爱的祖国
8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 5, 2, 3, 3, 2, 1, 6, 2, 12,//我永远紧依着你的心窝
5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 7, 1, 2, 6, 1, 2, 5, 1, 2, 3, 2, 6,4, 2, 6, 2, 2, 4, 1, 2, 2,1, 2, 10};//你用你那母亲的脉搏和我诉说
//起风了
code unsigned char song2[] = {
1, 3, 2, 2, 3, 2, 3, 3, 2, 6, 3, 1, 5, 3, 3, 6, 3, 1, 5, 3, 3, 6, 3, 1, 5, 3, 3, 2, 3, 1, //我曾难自拔于世界之大
3, 3, 3, 6, 3, 1, 5, 3, 3, 6, 3, 1, 5, 3, 3, 6, 3, 1, 5, 3, 3, 2, 3, 1, 3, 3, 1, //也沉溺于其中梦话
2, 3, 2, 1, 3, 1, 6, 2, 3, 1, 3, 1, 1, 3, 1, 2, 3, 1, 1, 3, 1, 6, 2, 3, 1, 3, 3, 3, 3, 5, 4, 3, 1, 3, 3, 1, 2, 3, 1, 3, 3, 1, 2, 3, 3, //不得真假,不做挣扎,不惧笑话
1, 3, 2, 2, 3, 2, 3, 3, 2, 6, 3, 1, 5, 3, 3, 6, 3, 1, 5, 3, 3, 6, 3, 1, 5, 3, 3, //我曾将青春翻涌成她
3, 3, 2, 3, 3, 2, 6, 3, 1, 5, 3, 3, 6, 3, 1, 5, 3, 3, 6, 3, 1, 5, 3, 2, //也曾之间弹出盛夏
3, 3, 3, 2, 3, 2, 1, 3, 1, 6, 2, 2, 3, 3, 3, 2, 3, 1, 1, 3, 1, 6, 2, 2, 1, 3, 3, 1, 3, 12, //心之所动,且就随缘去吧
6, 2, 1, 3, 3, 3, 2, 3, 2, 1, 3, 1, 6, 2, 2, 3, 3, 2, 2, 3, 1, 2, 3, 1, 1, 3, 2, 6, 2, 3, 1, 3, 2, 1, 3, 16,}; //逆着光行走,任风吹雨打
//5,1,4, 3,1,6, 5,1,2, 1,2,6, 6,1,4, 1,2,4, 5,1,8,
//5,1,4, 1,1,2, 2,1,2, 3,1,4, 2,1,2, 1,1,2, 2,1,8,
//5,1,4, 3,1,2, 5,1,2, 1,2,4, 7,1,2, 6,1,4,
//1,2,4, 5,1,8, 5,1,4, 2,1,2, 3,1,2, 4,1,4, 7,0,2,
//1,1,8, 6,1,4, 1,2,4, 1,2,8, 7,1,4, 6,1,2, 7,1,2,
//1,2,2, 6,1,2, 7,1,2, 1,2,2, 6,1,2, 6,1,2, 5,1,2,
//3,1,2, 1,1,2, 2,1,16, 5,1,4, 3,1,2, 5,1,2, 1,2,2,
//7,1,2, 6,1,4, 1,2,4, 5,1,8, 5,1,4, 2,1,2, 3,1,2,
//4,1,4, 7,0,4, 1,1,8, 0,0,0};
//Let it go
code unsigned char song3[] = {
6, 2, 1, 6, 2, 1, 7, 2, 1, 1, 3, 5, 1, 3, 1, 5, 2, 1, 5, 2, 1, 2, 3, 5, //let it go,let it go
1, 3, 2, 1, 3, 1, 6, 2, 1, 6, 2, 1, 6, 2, 1, 6, 2, 3, 7, 2, 2, 1, 3, 3, //can not hold it back any more
6, 2, 1, 6, 2, 1, 7, 2, 1, 1, 3, 3, 1, 3, 1, 5, 2, 1, 3, 3, 1, 3, 3, 2, 2, 3, 3, //let it go,let it go
1, 3, 1, 1, 3, 1, 2, 3, 1, 3, 3, 2, 3, 3, 2, 4, 3, 1, 3, 3, 2, 2, 3, 1, 1, 3, 1, 2, 3, 1, 1, 3, 3, 1, 3, 4, //turn away and i am the door
5, 3, 2, 3, 3, 1, 3, 3, 2, 2, 3, 1, 2, 3, 2, 2, 3, 2, 2, 3, 2, 1, 3, 2, 1, 3, 2, 5, 3, 1, 5, 3, 2, 3, 3, 2, 1, 3, 1, 1, 3, 4, 1, 3, 2, //i do not i care what they are going to say
1, 3, 2, 1, 3, 1, 1, 3, 1, 7, 2, 2, 5, 2, 1, 5, 2, 3, 5, 2, 6, //let the strom rage on
4, 2, 3, 4, 2, 1, 4, 2, 2, 4, 2, 1, 3, 2, 1, 4, 2, 1, 3, 2, 1, 4, 2, 1, 4, 2, 1, 3, 2, 1, 1, 2, 3, 1, 2, 4}; //the cold never bothered me anyway
//5,1,2, 2,2,2, 3,2,4, 2,2,2, 3,2,2, 5,2,2, 6,2,2, 5,2,6, 1,2,2, 2,2,2,
//3,2,2, 6,2,2, 5,2,2, 3,2,2, 5,2,6, 5,2,2, 6,2,2, 1,3,4, 6,2,2, 5,2,2,
//3,2,2, 5,2,2, 3,2,4, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 6,1,2, 3,2,2, 2,2,2,
//5,1,2, 2,2,2, 3,2,4, 2,2,2, 3,2,2, 5,2,2, 6,2,2, 5,2,6, 1,2,2, 2,2,2,
//3,2,2, 6,2,2, 5,2,6, 5,2,2, 6,2,2, 1,3,4, 6,2,2,
//5,2,2, 3,2,2, 5,2,2, 3,2,4, 1,2,2, 6,1,2, 3,2,2, 2,2,2, 1,2,2, 6,1,2,
//1,2,2, 2,2,2, 2,2,2, 1,2,8, 0,0,0};
int code tho[]={0xfa, 0xfa, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc,0xfd, 0xfd,0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};//高位定时器的值
int code tlo[]={0x15, 0x67, 0x04, 0x90, 0x0c, 0x44, 0xac,0x09, 0x34,0x83, 0xc8, 0x06, 0x22, 0x56, 0x85, 0x9a};//低位定时器的值
code unsigned char light[16]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char timer0H, timer0L, time;
static unsigned char m,k,t,i,q,a,b,c,p,d,e,f,g,h,l,n,r;
unsigned int w,y,z;
static int HT,LT;//高低位定时器的值
void main()
{
TMOD=0X01;
TCON=0X00;
beep=0;
ET0=1;
EX0=1;
EA=1;
while(1)
{
if(fullScanKey()!=0)
{TR0=1;
m=readKey();
Delay_ms(10);
P0=light[m];
HT=tho[m];
LT=tlo[m];
TR0=0;beep=0;
}
else P0=0xff;
ctxh();
ddxh();
xmze();
}
}
void intf0() interrupt 1
{
TH0=HT;
TL0=LT;
beep=~beep;
}
void intf1() interrupt 0
{
TR0=0;
}
void ctxh(void)
{w=0;y=0;z=0;
if(P3_0==0)
{ d=1;
while(d)
{
if(w<268&P3_4==1)
{a = song1[w] + 7 * song1[w + 1] - 1;//第i个是音符, 第i+1个是第几个八度
HT = FREQH[a]; //从数据表中读出频率数值
LT = FREQL[a]; //实际上, 是定时的时间长度
time = song1[w + 2]; //读出时间长度数值
w = w+3;
delay(time); //控制时间长度
TR0=1;
P0=light[1];
}
if (w>268 & y<218 & P3_4==1 )
{b = song2[y] + 7 * song2[y + 1] - 1;//第i个是音符, 第i+1个是第几个八度
HT = FREQH[b]; //从数据表中读出频率数值
LT = FREQL[b]; //实际上, 是定时的时间长度
time = song2[y + 2]; //读出时间长度数值
y = y+3;
delay(time); //控制时间长度
TR0=1;
P0=light[2];
}
if(w>268 & y>218 & z<212&P3_4==1)
{c = song3[z] + 7 * song3[z + 1] - 1;//第i个是音符, 第i+1个是第几个八度
HT = FREQH[c]; //从数据表中读出频率数值
LT = FREQL[c]; //实际上, 是定时的时间长度
time = song3[z + 2]; //读出时间长度数值
z = z+3;
delay(time); //控制时间长度
TR0=1;
P0=light[3];
}
if(w>268 & y>218 & z>212)
{ w=0;y=0;z=0;P1=0xff;}
if(P3_4==0)
{P0=0xff;break;}
}
TR0=0;beep=0;
}
}
void ddxh(void)
{
if(P3_1==0 & P3_5==0)
{ e=1;TR0=1;
while(e)
{a = song1[w] + 7 * song1[w + 1] - 1;//第i个是音符, 第i+1个是第几个八度
HT = FREQH[a]; //从数据表中读出频率数值
LT = FREQL[a]; //实际上, 是定时的时间长度
time = song1[w + 2]; //读出时间长度数值
w = w+3;
delay(time); //控制时间长度
TR0=1;
P0=light[1];
if(w>268)
w=0;
else if(P3_4==0)
{P0=0xff;break;}
}
TR0=0;beep=0;
}
if (P3_1==0 & P3_6==0)
{f=1;TR0=1;
while(f)
{b = song2[y] + 7 * song2[y + 1] - 1;//第i个是音符, 第i+1个是第几个八度
HT = FREQH[b]; //从数据表中读出频率数值
LT = FREQL[b]; //实际上, 是定时的时间长度
time = song2[y + 2]; //读出时间长度数值
y = y+3;
delay(time); //控制时间长度
TR0=1;
P0=light[2];
if(y>218)
y=0;
else if(P3_4==0)
{P0=0xff;break;}
}
TR0=0;beep=0;
}
if (P3_1==0 & P3_7==0)
{ g=1;TR0=1;
评论0