machongchang 发表于 2011-9-2 17:21:48

STC89C52单片机的多音阶电子琴程序

#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一个52标准内核的头文件

char code dx516 _at_ 0x003b;//这是为了仿真设置的
sbit speaker=P2^0; //喇叭输出脚
sbit K0= P1^0;

sbit LED1= P0^0;
sbit LED2= P0^1;
sbit LED3= P0^2;
sbit LED4= P0^3;
sbit LED5= P0^4;
sbit LED6= P0^5;
sbit LED7= P0^6;

sbit K1= P3^1;
sbit K2= P3^2;
sbit K3= P3^3;
sbit K4= P3^4;
sbit K5= P3^5;
sbit K6= P3^6;
sbit K7= P3^7;

sbit K8= P1^1;
sbit K9= P1^2;
sbit K10= P1^3;
sbit K11= P1^4;
sbit K12= P1^5;
sbit K13= P1^6;
sbit K14= P1^7;

sbit K15= P2^1;       
sbit K16= P2^2;
sbit K17= P2^3;
sbit K18= P2^4;
sbit K19= P2^5;
sbit K20= P2^6;
sbit K21= P2^7;


uchar th0_f; //在中断中装载的T0的值高8位
uchar tl0_f; //在中断中装载的T0的值低8位
//T0的值,及输出频率对照表
uchar code freq={
0xA9,0xEF,//00220HZ ,1 //0
0x93,0xF0,//00233HZ ,1#//1
0x73,0xF1,//00247HZ ,2 //2
0x49,0xF2,//00262HZ ,2#//3
0x07,0xF3,//00277HZ ,3 //4
0xC8,0xF3,//00294HZ ,4 //5
0x73,0xF4,//00311HZ ,4#//6
0x1E,0xF5,//00330HZ ,5 //7
0xB6,0xF5,//00349HZ ,5#//8
0x4C,0xF6,//00370HZ ,6 //9
0xD7,0xF6,//00392HZ ,6#//10
0x5A,0xF7,//00415HZ ,7 //11
0xD8,0xF7,//00440HZ 1//12
0x4D,0xF8,//00466HZ 1# //13
0xBD,0xF8,//00494HZ 2//14
0x24,0xF9,//00523HZ 2# //15
0x87,0xF9,//00554HZ 3//16
0xE4,0xF9,//00587HZ 4//17
0x3D,0xFA,//00622HZ 4# //18
0x90,0xFA,//00659HZ 5//19
0xDE,0xFA,//00698HZ 5# //20
0x29,0xFB,//00740HZ 6//21
0x6F,0xFB,//00784HZ 6# //22
0xB1,0xFB,//00831HZ 7//23
0xEF,0xFB,//00880HZ `1 //24
0x2A,0xFC,//00932HZ `1#//25
0x62,0xFC,//00988HZ `2 //26
0x95,0xFC,//01046HZ `2#//27
0xC7,0xFC,//01109HZ `3 //28
0xF6,0xFC,//01175HZ `4 //29
0x22,0xFD,//01244HZ `4#//30
0x4B,0xFD,//01318HZ `5 //31
0x73,0xFD,//01397HZ `5#//32
0x98,0xFD,//01480HZ `6 //33
0xBB,0xFD,//01568HZ `6#//34
0xDC,0xFD,//01661HZ `7 //35
};
//定时中断0,用于产生唱歌频率
timer0() interrupt 1
{
TL0=tl0_f;TH0=th0_f; //调入预定时值
speaker=~speaker; //取反音乐输出IO
}

//按键控制音阶声音输出(电子琴)
void main(void) // 主程序
{
ulong n;
uchar code jie8={0,2,4,5,7,9,11,12,14,16,17,19,21,23,24,26,28,29,31,33,35};//1234567`1八个音符在频率表中的位置
TMOD = 0x01; //使用定时器0的16位工作模式
TR0 = 0;
ET0 = 1;
EA = 1;
while(1)
{


if(!K0)
{
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<24000;n++); //延时
TR0 =0;
for(n=0;n<10000;n++);

tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<18000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<6000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<30000;n++); //延时
TR0 =0;
for(n=0;n<10000;n++);

tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
TR0 =0;
for(n=0;n<10000;n++);

TR0 = 1;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<30000;n++); //延时
TR0 =0;
for(n=0;n<10000;n++);

tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<18000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<6000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<24000;n++); //延时
TR0 =0;
for(n=0;n<10000;n++);

tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
TR0 =0;
for(n=0;n<3000;n++);
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
TR0 =0;
for(n=0;n<3000;n++);
for(n=0;n<12000;n++); //延时
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
if(K0) goto        tanzou;
for(n=0;n<30000;n++); //延时
TR0 =0;
for(n=0;n<10000;n++);
}

tanzou: if(!K1)
{
LED1=0;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K2)
{
LED1=1;
LED2=0;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K3)
{
LED1=1;
LED2=1;
LED3=0;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K4)
{
LED1=1;
LED2=1;
LED3=1;
LED4=0;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K5)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=0;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K6)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=0;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K7)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=0;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K8)
{
LED1=0;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K9)
{
LED1=1;
LED2=0;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K10)
{
LED1=1;
LED2=1;
LED3=0;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K11)
{
LED1=1;
LED2=1;
LED3=1;
LED4=0;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K12)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=0;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K13)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=0;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K14)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=0;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K15)
{
LED1=0;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K16)
{
LED1=1;
LED2=0;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K17)
{
LED1=1;
LED2=1;
LED3=0;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K18)
{
LED1=1;
LED2=1;
LED3=1;
LED4=0;
LED5=1;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K19)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=0;
LED6=1;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K20)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=0;
LED7=1;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}
if(!K21)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=0;
tl0_f=freq*2]; //置一个音符的值
th0_f=freq*2+1];
TR0 = 1;
for(n=0;n<10000;n++); //延时
}

TR0 = 0;
}
}

bitbull 发表于 2011-12-29 13:58:48

mark

yihui184 发表于 2012-8-30 15:25:59

楼主自己写的嘛?写了多久哇,真厉害。

zhuangchao12 发表于 2012-8-30 22:01:04

楼主很强大啊,佩服

szfrg 发表于 2012-8-31 07:09:03

{:victory:}{:victory:}{:victory:}
页: [1]
查看完整版本: STC89C52单片机的多音阶电子琴程序