c51电子琴.docx
- 文档编号:6747672
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:21
- 大小:16.20KB
c51电子琴.docx
《c51电子琴.docx》由会员分享,可在线阅读,更多相关《c51电子琴.docx(21页珍藏版)》请在冰豆网上搜索。
c51电子琴
51单片机电子琴,多按键调试可行
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
#include
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
sbitspeaker=P2^0;//喇叭输出脚
sbitK0=P1^0;
sbitLED1=P0^0;
sbitLED2=P0^1;
sbitLED3=P0^2;
sbitLED4=P0^3;
sbitLED5=P0^4;
sbitLED6=P0^5;
sbitLED7=P0^6;
sbitK1=P3^1;
sbitK2=P3^2;
sbitK3=P3^3;
sbitK4=P3^4;
sbitK5=P3^5;
sbitK6=P3^6;
sbitK7=P3^7;
sbitK8=P1^1;
sbitK9=P1^2;
sbitK10=P1^3;
sbitK11=P1^4;
sbitK12=P1^5;
sbitK13=P1^6;
sbitK14=P1^7;
sbitK15=P2^1;
sbitK16=P2^2;
sbitK17=P2^3;
sbitK18=P2^4;
sbitK19=P2^5;
sbitK20=P2^6;
sbitK21=P2^7;
ucharth0_f;//在中断中装载的T0的值高8位
uchartl0_f;//在中断中装载的T0的值低8位
//T0的值,及输出频率对照表
ucharcodefreq[36*2]={
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,//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//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()interrupt1
{
TL0=tl0_f;TH0=th0_f;//调入预定时值
speaker=~speaker;//取反音乐输出IO
}
//按键控制音阶声音输出(电子琴)
voidmain(void)//主程序
{
ulongn;
ucharcodejie8[21]={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[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[19]*2];//置一个音符的值
th0_f=freq[jie8[19]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<24000;n++);//延时
TR0=0;
for(n=0;n<10000;n++);
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<18000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<6000;n++);//延时
tl0_f=freq[jie8[9]*2];//置一个音符的值
th0_f=freq[jie8[9]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[12]*2];//置一个音符的值
th0_f=freq[jie8[12]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<30000;n++);//延时
TR0=0;
for(n=0;n<10000;n++);
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[12]*2];//置一个音符的值
th0_f=freq[jie8[12]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[9]*2];//置一个音符的值
th0_f=freq[jie8[9]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[12]*2];//置一个音符的值
th0_f=freq[jie8[12]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[19]*2];//置一个音符的值
th0_f=freq[jie8[19]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
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[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[21]*2];//置一个音符的值
th0_f=freq[jie8[21]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[19]*2];//置一个音符的值
th0_f=freq[jie8[19]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[7]*2];//置一个音符的值
th0_f=freq[jie8[7]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[12]*2];//置一个音符的值
th0_f=freq[jie8[12]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<30000;n++);//延时
TR0=0;
for(n=0;n<10000;n++);
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[12]*2];//置一个音符的值
th0_f=freq[jie8[12]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[19]*2];//置一个音符的值
th0_f=freq[jie8[19]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<18000;n++);//延时
tl0_f=freq[jie8[21]*2];//置一个音符的值
th0_f=freq[jie8[21]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<6000;n++);//延时
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<24000;n++);//延时
TR0=0;
for(n=0;n<10000;n++);
tl0_f=freq[jie8[9]*2];//置一个音符的值
th0_f=freq[jie8[9]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[16]*2];//置一个音符的值
th0_f=freq[jie8[16]*2+1];
TR0=1;
if(K0)gototanzou;
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
TR0=0;
for(n=0;n<3000;n++);
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[14]*2];//置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0=1;
if(K0)gototanzou;
TR0=0;
for(n=0;n<3000;n++);
for(n=0;n<12000;n++);//延时
tl0_f=freq[jie8[12]*2];//置一个音符的值
th0_f=freq[jie8[12]*2+1];
TR0=1;
if(K0)gototanzou;
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[jie8[0]*2];//置一个音符的值
th0_f=freq[jie8[0]*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[jie8[1]*2];//置一个音符的值
th0_f=freq[jie8[1]*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[jie8[2]*2];//置一个音符的值
th0_f=freq[jie8[2]*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[jie8[3]*2];//置一个音符的值
th0_f=freq[jie8[3]*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[jie8[4]*2];//置一个音符的值
th0_f=freq[jie8[4]*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[jie8[5]*2];//置一个音符的值
th0_f=freq[jie8[5]*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[jie8[6]*2];//置一个音符的值
th0_f=freq[jie8[6]*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[jie8[7]*2];//置一个音符的值
th0_f=freq[jie8[7]*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[jie8[8]*2];//置一个音符的值
th0_f=freq[jie8[8]*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[jie8[9]*2];//置一个音符的值
th0_f=freq[jie8[9]*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[jie8[10]*2];//置一个音符的值
th0_f=freq[jie8[10]*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[jie8[11]*2];//置一个音符的值
th0_f=freq[jie8[11]*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[jie8[12]*2];//置一个音符的值
th0_f=freq[jie8[12]*2+1];
TR0=1;
for(n=0;n<10000;n++);/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c51 电子琴