单片机AT89C51电子琴设计的原理图和c程序???

2024-12-11 22:12:24
推荐回答(4个)
回答1:

#include 

unsigned char temp;

unsigned char key;

unsigned char i,j;

unsigned char STH0;

unsigned char STL0;

unsigned int code tab[]={64021,64103,64260,64400,

64524,64580,64684,64777,

64820,64898,64968,65030,

65058,65110,65157,65178};

void main(void)

{

TMOD=0x01;

ET0=1;

EA=1;

while(1)

{

P3=0xff;                     //将P3口取出

P3_4=0;                       //使P3_4为低电平,这样可以判断第一竖排有没有键按下

temp=P3;

temp=temp & 0x0f;             

if (temp!=0x0f)            //有键按下

{

for(i=50;i>0;i--)

for(j=200;j>0;j--);           //延时

temp=P3;                   

temp=temp & 0x0f;

if (temp!=0x0f)               //再判断是否有键按下

{

temp=P3;

temp=temp & 0x0f;

switch(temp)                //判断是哪个键按下

{

case 0x0e:

key=0;

break;

case 0x0d:

key=1;

break;

case 0x0b:

key=2;

break;

case 0x07:

key=3;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

STH0=tab[key]/256;      //找出键对应的频率的时间,作为定时器中断初始值

STL0=tab[key]%256;

TR0=1;

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

TR0=0;

}

}

P3=0xff;

P3_5=0;                     //跟上面差不多,现在是判断第二排的按键

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=50;i>0;i--)

for(j=200;j>0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=4;

break;

case 0x0d:

key=5;

break;

case 0x0b:

key=6;

break;

case 0x07:

key=7;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

STH0=tab[key]/256;

STL0=tab[key]%256;

TR0=1;

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

TR0=0;

}

}

P3=0xff;

P3_6=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=50;i>0;i--)

for(j=200;j>0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=8;

break;

case 0x0d:

key=9;

break;

case 0x0b:

key=10;

break;

case 0x07:

key=11;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

STH0=tab[key]/256;

STL0=tab[key]%256;

TR0=1;

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

TR0=0;

}

}

P3=0xff;

P3_7=0;

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

for(i=50;i>0;i--)

for(j=200;j>0;j--);

temp=P3;

temp=temp & 0x0f;

if (temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

switch(temp)

{

case 0x0e:

key=12;

break;

case 0x0d:

key=13;

break;

case 0x0b:

key=14;

break;

case 0x07:

key=15;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

STH0=tab[key]/256;

STL0=tab[key]%256;

TR0=1;

temp=temp & 0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp & 0x0f;

}

TR0=0;

}

}

}

}

void t0(void) interrupt 1 using 0

{

TH0=STH0;

TL0=STL0;

P1_0=~P1_0;

}

 你自己看下程序吧,我也不愿意注释。 

这个是能发出16个音符声音的

回答2:

/*
21个按键,对应高中低音1234567
三个LED表示音高
7个LED表示音符
按下一个按键,发出对应的声音,对应的音高,音符的LED识点亮 */

ProteUS仿真工程,可运行!
推荐:03_钢琴LED.rar( http://ishare.iask.sina.com.cn/f/12212199.html )

回答3:

你在百度文库那里搜有很多的资料啊!不懂你的具体要求是什么。。

回答4:

你上杜洋工作室 这个个网站上去看看 他上面有教程