基于51单片机的16键声光电子琴程序
时间: 2023-11-12 15:06:54 浏览: 144
以下是基于51单片机的16键声光电子琴程序的示例代码:
```c
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code kcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code mcode[]={0x3f,0x3e,0x3d,0x3b,0x37,0x2f,0x1f,0x00};
uchar key;
uchar tone;
void delay(uint i)
{
while(i--);
}
void play(uchar x)
{
switch(x)
{
case 1:TR0=1;P3=mcode[0];break;
case 2:TR0=1;P3=mcode[1];break;
case 3:TR0=1;P3=mcode[2];break;
case 4:TR0=1;P3=mcode[3];break;
case 5:TR0=1;P3=mcode[4];break;
case 6:TR0=1;P3=mcode[5];break;
case 7:TR0=1;P3=mcode[6];break;
case 8:TR0=1;P3=mcode[7];break;
default:TR0=0;P3=0x00;break;
}
}
void main()
{
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
ET0=1;
EA=1;
while(1)
{
key=P1;
key=key&0xf0;
if(key!=0xf0)
{
key=P1;
key=key&0xf0;
if(key!=0xf0)
{
key=kcode[key>>4];
if(key!=tone)
{
tone=key;
play(tone);
}
}
}
}
}
void timer0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
P2=_crol_(P2,1);
}
```
该程序使用了一个定时器和一个外部中断来实现声音的发生和光的闪烁。当按下一个键时,程序会检测所按下的键,并使用相关的代码来产生正确的声音和光线。如果没有按下任何键,则程序会保持当前的状态。
阅读全文