⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yinyue.c

📁 用51单片机实现电子琴及mp3播放功能
💻 C
📖 第 1 页 / 共 3 页
字号:
/*************************************************/
/********                                 ********/
/********           北京交通大学          ********/
/********              理学院             ********/
/********             05思源班            ********/
/********              吴佳欣             ********/
/********          学号:05291254         ********/
/********                                 ********/
/*************************************************/
#include<reg52.h>//寄存器定义头文件;
//#include<AT89x52.h>
#define LH1 0xf2
#define LL1 0x42
#define LH2 0xf3
#define LL2 0xc1
#define LH3 0xf5
#define LL3 0x17
#define LH4 0xf6
#define LL4 0x04
//#define LH5 0xf6
#define LL5 0xd9
#define LH6 0xf7
#define LL6 0xd1
#define LH7 0xf8
#define LL7 0xb6
#define DH1 0xf9
#define DL1 0x16
#define DH2 0xfa
#define DL2 0x00
//#define DH3 0xfa
#define DL3 0x8a
//#define DH4 0xfa
#define DL4 0xd8
#define DH5 0xfb
#define DL5 0x68
//#define DH6 0xfb
#define DL6 0xf0
#define DH7 0xfc
#define DL7 0x48
//#define HH1 0xfc
#define HL1 0x83
#define HH2 0xfd
#define HL2 0x00
//#define HH3 0xfd
#define HL3 0x45
//#define HH4 0xfd
#define HL4 0x6e
//#define HH5 0xfd
#define HL5 0xb4
#define HH6 0xfe
#define HL6 0x0a
//#define HH7 0xfe
#define HL7 0x2e
void gequ();
void jianpan();
void luyin();
void bofang();
void jianpanluyin();
void model1();
void model2();
void model3();
void gequ1();
void gequ2();
void gequ3();
void k11();
void k12();
void k13();
void k14();
void k21();
void k22();
void k23();
void k31();
void k32();
void k33();
void k34();
void k41();
void k42();
void k43();
void k51();
void k52();
void k53();
void k54();
void k61();
void k62();
void k63();
void L11();
void L12();
void L13();
void L14();
void L21();
void L22();
void L23();
void L31();
void L32();
void L33();
void L34();
void L41();
void L42();
void L43();
void L51();
void L52();
void L53();
void L54();
void L61();
void L62();
void L63();
////////////////////////////1       2       3       4       5       6       7
code unsigned char table[]={LH1,LL1,LH2,LL2,LH3,LL3,LH4,LL4,LH4,LL5,LH6,LL6,LH7,LL7,
                            DH1,DL1,DH2,DL2,DH2,DL3,DH2,DL4,DH5,DL5,DH5,DL6,DH7,DL7,
			    DH7,HL1,HH2,HL2,HH2,HL3,HH2,HL4,HH2,HL5,HH6,HL6,HH6,HL7};
		char *plu;
		char *pdeng;
		unsigned char tablelu[30];
		unsigned char tabledeng[30];
		int lengthlu;
    	int lengthdeng;

sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;

sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97;

sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;

sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;
/*************************************************/
void main()
{
    int TMOD=0x11;//T0、T1工作在方式1;
	int ET0=1;
	int ET1=1;
	int EA=1;
	int TR0=0;
	int TR1=0;

	do//模式选择,分为播放歌曲和电子琴两个模式,如果没有选择,继续判断;
	{
		P0=0xff;//P0口全部置高电平;
		P1=0xff;//P1口全部置高电平;
		P2=0x00;//亮灯;
		P3=0x00;
		P0_1=0;
		if(P1_3==0)//判断是否放歌曲;
		{
			int j;
			for(j=0;j<=23000;j=j+1)//消抖延时循环;
			{
			}
			if(P1_3==0)
				gequ();//选择了播放歌曲模式;
		}
		P0=0xff;
		P1=0xff;
		P0_3=0;
		if(P1_3==0)//判断是否扫描键盘;
		{
			int j;
			for(j=0;j<=23000;j=j+1)
			{
			}
			if(P1_3==0)
				jianpan();//选择了电子琴方式;
		}
		P0=0xff;
		P1=0xff;
		P0_5=0;
		if(P1_3==0)//判断是否扫描键盘;
		{
			int j;
			for(j=0;j<=23000;j=j+1)
			{
			}
			if(P1_3==0)
			    luyin();
		}
	} 
	while(1);
}
/*************************************************/
/****扫描键盘****/	
void jianpan()
{
	do//循环扫描键盘;
	{
		/***扫描第一行***/
		P2=0xff;//灭灯;
		P3=0xff;
		P0=0xff;
		P1=0xff;
		P0_0=0;//把第一行赋值0,逐列判断;
		if(P1_0==0)//判断是否是第一列的被按下,是则跳转,不是则继续判断;
			k11();
		if(P1_1==0)//判断第二列;
			k12();
		if(P1_2==0)//判断第三列;
			k13();
		if(P1_3==0)//判断第四列;
			k14();
		/***扫描第二行***/
		P0=0xff;
		P1=0xff;
		P0_1=0;//把第2行赋值0;
		if(P1_0==0)
			k21();
		if(P1_1==0)
			k22();
		if(P1_2==0)
			k23();
		/***扫描第三行***/
		P0=0xff;
		P1=0xff;
		P0_2=0;//把第3行赋值0;
		if(P1_0==0)
			k31();
		if(P1_1==0)
			k32();
		if(P1_2==0)
			k33();
		if(P1_3==0)
			k34();
		/***扫描第四行***/
		P0=0xff;
		P1=0xff;
		P0_3=0;//把第4行赋值0;
		if(P1_0==0)
			k41();
		if(P1_1==0)
			k42();
		if(P1_2==0)
			k43();
		/***扫描第五行***/
		P0=0xff;
		P1=0xff;
		P0_4=0;//把第5行赋值0;
		if(P1_0==0)
			k51();
		if(P1_1==0)
			k52();
		if(P1_2==0)
			k53();
		if(P1_3==0)
			k54();
		/***扫描第六行***/
		P0=0xff;
		P1=0xff;
		P0_5=0;//把第6行赋值0;
		if(P1_0==0)
			k61();
		if(P1_1==0)
			k62();
		if(P1_2==0)
			k63();
	}
	while(1);
}
/*************************************************/
/*****按键响*****/

void k11()//播放低音do;
{
	P3=0xe2;//显示"L1";
	P2=0x9e;
	do
	{
		TL0=LL1;//装载低音do频率初值;
		TH0=LH1;
		TR0=1;//启动T0;
		while(!TF0);//当计时时间到时,TF0变为1,则停止计数;
		P3_0=!P3_0;//P3_0翻转,实现输出规定频率的方波;
		TF0=0;//清除标志位,准备下一次计数;
	}
	while(P1_0==0);//没有释放按键,继续播放;
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;//P3_0清"0",防止接蜂鸣器时继续发声,保证在接蜂鸣器时也静音;
}

void k12()//播放低音ra;
{
	P3=0xe2;
	P2=0x24;
	do
	{
		TL0=LL2;//装载初值;
		TH0=LH2;
		TR0=1;
		while(!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_1==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k13()//低音mi;
{
	P3=0xe2;
	P2=0x0c;
	do
	{
		TL0=LL3;
		TH0=LH3;
		TR0=1;
		while(!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_2==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k14()//低音fa;
{
	P3=0xe2;
	P2=0x98;
	do
	{
		TL0=LL4;
		TH0=LH4;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_3==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

/*****第二行*****/
void k21()//低音so;
{
	P3=0xe2;
	P2=0x48;
	do
	{
		TL0=LL5;
		TH0=LH4;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_0==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k22()//低音la;
{
	P3=0xe2;
	P2=0x40;
	do
	{
		TL0=LL6;
		TH0=LH6;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_1==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k23()//低音si;
{
	P3=0xe2;
	P2=0x1e;
	do
	{
		TL0=LL7;
		TH0=LH7;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_2==0);
	P3_0=0;
	P3=0xff;//灭灯;
	P2=0xff;
}

/****第三行****/
void k31()//中音do;
{
	P3=0x84;
	P2=0x9e;
	do
	{
		TL0=DL1;
		TH0=DH1;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_0==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k32()//中音ra;
{
	P3=0x84;
	P2=0x24;
	do
	{
		TL0=DL2;
		TH0=DH2;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_1==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k33()//中音mi;
{
	P3=0x84;
	P2=0x0c;
	do
	{
		TL0=DL3;
		TH0=DH2;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_2==0);
	P3_0=0;
	P3=0xff;//灭灯;
	P2=0xff;
}

void k34()//中音fa;
{
	P3=0x84;
	P2=0x98;
	do
	{
		TL0=DL4;
		TH0=DH2;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_3==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

/*****第四行*****/
void k41()//中音so;
{
	P3=0x84;
	P2=0x48;
	do
	{
		TL0=DL5;
		TH0=DH5;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_0==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k42()//中音la;
{
	P3=0x84;
	P2=0x40;
	do
	{
		TL0=DL6;
		TH0=DH5;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_1==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k43()//中音si;
{
	P3=0x84;
	P2=0x1e;
	do
	{
		TL0=DL7;
		TH0=DH7;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_2==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

/*****第五行*****/
void k51()//高音do;
{
	P3=0x90;
	P2=0x9e;
	do
	{
		TL0=HL1;
		TH0=DH7;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_0==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k52()//高音ra;
{
	P3=0x90;
	P2=0x24;
	do
	{
		TL0=HL2;
		TH0=HH2;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_1==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k53()//高音mi;
{
	P3=0x90;
	P2=0x0c;
	do
	{
		TL0=HL3;
		TH0=HH2;
		TR0=1;
		while (!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_2==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

void k54()//高音fa;
{
	P3=0x90;
	P2=0x98;
	do
	{
		TL0=HL4;
		TH0=HH2;
		TR0=1;
		while(!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_3==0);
	P3=0xff;//灭灯;
	P2=0xff;
	P3_0=0;
}

/*****第六行*****/
void k61()//高音so;
{
	P3=0x90;
	P2=0x48;
	do
	{
		TL0=HL5;
		TH0=HH2;
		TR0=1;
		while(!TF0);
		P3_0=!P3_0;
		TF0=0;
	}
	while(P1_0==0);
	P3=0xff;//灭灯;
	P2=0xff;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -