51单片机电子琴设计C语言设计实例Word格式文档下载.docx
《51单片机电子琴设计C语言设计实例Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《51单片机电子琴设计C语言设计实例Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
ucharcodefreq[36*2]={
0xA9,0xEF,//00220HZ,1//0
0x93,0xF0,//00233HZ,1#
0x73,0xF1,//00247HZ,2
0x49,0xF2,//00262HZ,2#
0x07,0xF3,//00277HZ,3
0xC8,0xF3,//00294HZ,4
0x73,0xF4,//00311HZ,4#
0x1E,0xF5,//00330HZ,5
0xB6,0xF5,//00349HZ,5#
0x4C,0xF6,//00370HZ,6
0xD7,0xF6,//00392HZ,6#
0x5A,0xF7,//00415HZ,7
0xD8,0xF7,//00440HZ1//12
0x4D,0xF8,//00466HZ1#//13
0xBD,0xF8,//00494HZ2//14
0x24,0xF9,//00523HZ2#//15
0x87,0xF9,//00554HZ3//16
0xE4,0xF9,//00587HZ4//17
0x3D,0xFA,//00622HZ4#//18
0x90,0xFA,//00659HZ5//19
0xDE,0xFA,//00698HZ5#//20
0x29,0xFB,//00740HZ6//21
0x6F,0xFB,//00784HZ6#//22
0xB1,0xFB,//00831HZ7//23
0xEF,0xFB,//00880HZ`1
0x2A,0xFC,//00932HZ`1#
0x62,0xFC,//00988HZ`2
0x95,0xFC,//01046HZ`2#
0xC7,0xFC,//01109HZ`3
0xF6,0xFC,//01175HZ`4
0x22,0xFD,//01244HZ`4#
0x4B,0xFD,//01318HZ`5
0x73,0xFD,//01397HZ`5#
0x98,0xFD,//01480HZ`6
0xBB,0xFD,//01568HZ`6#
0xDC,0xFD,//01661HZ`7//35
};
//定时中断0,用于产生唱歌频率
timer0()interrupt1
{
TL0=tl0_f;
TH0=th0_f;
//调入预定时值
BEEP=~BEEP;
//取反音乐输出IO
}
//按键控制音阶声音输出(电子琴)
voidmain(void)//主程序
ulongn;
ucharcodejie8[8]={12,14,16,17,19,21,23,24};
//`1八个音符在频率表中的位置
TMOD=0x01;
//使用定时器0的16位工作模式
TR0=0;
ET0=1;
EA=1;
while
(1)
if(!
K1)
tl0_f=freq[jie8[0]*2];
//置一个音符的值
th0_f=freq[jie8[0]*2+1];
TR0=1;
for(n=0;
n<
10000;
n++);
//延时
K2)
tl0_f=freq[jie8[1]*2];
th0_f=freq[jie8[1]*2+1];
K3)
tl0_f=freq[jie8[2]*2];
th0_f=freq[jie8[2]*2+1];
K4)
tl0_f=freq[jie8[3]*2];
th0_f=freq[jie8[3]*2+1];
/*******************************新的好用的电子琴*************************/
#include<
intrins.h>
absacc.h>
#defineucharunsignedchar
//#defineucharunsignedchar//定义一下方便使用
#defineulongunsignedlong
sbitBEEP=P3^0;
ucharrr;
uchark;
ucharkeydata;
//定时中断0,用于产生唱歌频率
voidkey_scan(void);
//键盘函数定义段;
ucharkey_tab(uchark);
voiddelay(void);
voidkey_in(uchark);
codeunsignedcharledmap[]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
//8段显示
//---------------------------------------------------------------
voidmain(void)
{//ulongn;
ucharcodejie8[8]={12,14,16,17,19,21,23,24};
TMOD=0x01;
TR0=0;
ET0=1;
EA=1;
while
(1)
{P2=0x00;
key_scan();
tl0_f=freq[jie8[keydata]*2];
th0_f=freq[jie8[keydata]*2+1];
TR0=1;
//延时
P0=ledmap[keydata];
}
}//---------------------------------------------------------------------------------------------
voidkey_scan(void)
{ucharsccode,recode,i;
P1=0xf0;
if((P1&
0xf0)!
=0xf0)
{
delay();
0xf0)!
sccode=0xfe;
for(i=0;
i<
4;
i++)
P1=sccode;
recode=(P1&
0xf0)|0x0f;
k=(~recode)+(~sccode);
rr=P1;
key_in(k);
break;
else
sccode=(sccode<
<
1)|0x01;
//do{ta=P2;
}while(ta==rr);
}
voiddelay()//去抖动
{inta=2500;
while(--a);
voidkey_in(uchark)
{ucharta;
//ucharkeydata;
do{ta=P1;
keydata=key_tab(k);
//-------------------------------------------------------------
ucharkey_tab(uchark)
{ucharkb;
switch(k)
{case0x11:
kb=0x0c;
break;
case0x21:
kb=0x0d;
case0x41:
kb=0x0e;
case0x81:
kb=0x0f;
case0x12:
kb=0x08;
case0x22:
kb=0x09;
case0x42:
kb=0x0a;
case0x82:
kb=0x0b;
case0x14:
kb=0x04;
case0x24:
kb=0x05;
case0x44:
kb=0x06;
case0x84:
kb=0x07;
case0x18:
kb=0x00;
case0x28:
kb=0x01;
case0x48:
kb=0x02;
case0x88:
kb=0x03;
default:
returnkb;