单片机电子琴程序+详细注解.docx
《单片机电子琴程序+详细注解.docx》由会员分享,可在线阅读,更多相关《单片机电子琴程序+详细注解.docx(15页珍藏版)》请在冰豆网上搜索。
单片机电子琴程序+详细注解
#include
#include
#include
#include
sbitlie0=P2^3;
sbitlie1=P2^2;
sbitlie2=P2^1;
sbitlie3=P2^0;
sbitPWM1=P2^6;
unsignedchartemp;
unsignedcharkey;
unsignedcharSTH0,STL0;
unsignedcharjishi=0;
unsignedcharn=0;//n为节拍常数变量
unsignedchara[7]={00,59,19,3,4,8,10};//设置时间的初始值
unsignedcharb[7];//将所更新的时间放入数组b中
/***********1s延时程序***********/
voiddelay1s(void)
{
unsignedchari,k;
for(k=100;k>0;k--)
for(i=100;i>0;i--);
}
/**************************************************/
/******************定时器0中断*******************/
voidTIMER0(void)interrupt1
{
TH0=STH0;
TL0=STL0;
PWM1=~PWM1;
}
/*************************************************/
/******************定时器1中断*******************/
voidint0()interrupt3//采用中断3控制节拍节拍延时
{TH1=0xd8;
TL1=0xef;
n--;
}
/**************************************************/
/****************频率延时程序*******************/
voiddelay(unsignedcharm)//控制频率延时
{
unsignedi=3*m;
while(--i);
}
/************************************************/
/***************************毫秒延时子程序**************************/
voiddelayms(unsignedchara)
{
while(--a);//采用while(--a)不要采用while(a--);
}
/*******************************************************************/
/**************************设置1-8曲调值*************************/
unsignedintcodetab[]={0xfc43,0xfd08,0,0,0xfd20,0xfd32,0,0,0xfd81,0xfdc7,0,0,0xfe05,0xfe21,0,0,};
/***************************************************************/
/**************以下对应数码管0-f**************************/
unsignedcharcodetable[]={
0x03,0x9f,0x25,0x0d,
0x99,0x49,0x41,0x1f,
0x01,0x09,0x11,0xc1,
0x63,0x85,0x61,0x71,0xff};
/***************************************************************/
/*********************第一首音乐老男孩***************************/
unsignedcharcodemusic_tab_1[]={
/*1*/
0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,
0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,
0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,
0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10,
0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,
0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,
0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,
0x2b,0x60,
/*2*/
0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,
0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,
0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,
0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10,
0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,
0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,
0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,
0x2b,0x60,
//1176711237755
0x30,0x40,0x18,0x20,0x19,0x20,0x1c,0x20,0x19,0x10,
0x18,0x10,0x18,0x20,0x2b,0x20,0x13,0x20,0x19,0x20,
0x19,0x20,0x20,0x10,0x20,0x10,
//63221117
0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,
0x18,0x40,0x18,0x20,0x19,0x20,
//6711237755
0x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20,
0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,
//632211
0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,
0x18,0x60,
//00000
0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,
//1155555577755
0x18,0x10,0x18,0x10,0x10,0x20,0x10,0x10,0x10,0x10,
0x10,0x20,0x10,0x20,0x10,0x20,0x19,0x10,0x19,0x10,
0x19,0x20,0x20,0x10,0x20,0x10,
//55556511112
0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20,
0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10,
0x15,0x10,
//3244332443
0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,
0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,
//32443
0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,
//5511
0x10,0x40,0x10,0x20,0x18,0x10,0x18,0x10,
//55555577755
0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20,
0x10,0x20,0x19,0x10,0x19,0x10,0x19,0x20,0x20,0x10,
0x20,0x10,
//55556511112
0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20,
0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10,
0x15,0x10,
//3244332171
0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,
0x13,0x20,0x15,0x10,0x18,0x10,0x18,0x20,0x19,0x10,
0x18,0x60,
0x01,0x40,0x01,0x40,
//第二次
/*3*/
0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,
0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,
0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,
0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10,
0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,
0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,
0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,
0x2b,0x60,
/*4*/
0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,
0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,
0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,
0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10,
0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,
0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,
0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,
0x2b,0x60,
//1176711237755
0x30,0x40,0x18,0x20,0x19,0x20,0x1c,0x20,0x19,0x10,
0x18,0x10,0x18,0x20,0x2b,0x20,0x13,0x20,0x19,0x20,
0x19,0x20,0x20,0x10,0x20,0x10,
//63221117
0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,
0x18,0x40,0x18,0x20,0x19,0x20,
//6711237755
0x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20,
0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,
//632211
0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,
0x18,0x60,
//33535
0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,
//1155555577755
0x18,0x10,0x18,0x10,0x10,0x20,0x10,0x10,0x10,0x10,
0x10,0x20,0x10,0x20,0x10,0x20,0x19,0x10,0x19,0x10,
0x19,0x20,0x20,0x10,0x20,0x10,
//55556511112
0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20,
0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10,
0x15,0x10,
//3244332443
0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,
0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,
//32443
0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,
//5511
0x10,0x40,0x10,0x20,0x18,0x10,0x18,0x10,
//55555577755
0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20,
0x10,0x20,0x19,0x10,0x19,0x10,0x19,0x20,0x20,0x10,
0x20,0x10,
//55556511112
0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20,
0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10,
0x15,0x10,
//3244332171
0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,
0x13,0x20,0x15,0x10,0x18,0x10,0x18,0x20,0x19,0x10,
0x18,0x60,
0x01,0x40,0x01,0x40,
//结尾
//321712133423342
0x13,0x20,0x15,0x20,0x18,0x30,0x19,0x10,0x18,0x10,0x15,0x10,
0x18,0x40,0x13,0x40,0x13,0x40,0x12,0x40,0x15,0x40,
0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,
0x00
};
/*********************************************************************/
/*******************第二首音乐机器猫**************************/
unsignedcharcodemusic_tab_2[]={0x40,0x20,0x39,0x10,0x30,0x20,0x26,0x10,0x1c,0x20,0x26,0x20,0x20,0x40,
0x20,0x20,0x1c,0x10,0x20,0x20,0x26,0x10,0x24,0x20,0x26,0x10,0x2b,0x40,
0x39,0x20,0x2b,0x10,0x2b,0x20,0x24,0x10,0x19,0x20,0x19,0x10,0x1c,0x20,
0x20,0x10,0x24,0x40,0x24,0x20,0x26,0x20,0x39,0x40,0x33,0x40,0x30,0x40,
0x2b,0x40,
0x40,0x20,0x39,0x10,0x30,0x20,0x26,0x10,0x1c,0x20,0x26,0x20,0x20,0x40,
0x20,0x20,0x1c,0x10,0x20,0x20,0x26,0x10,0x24,0x20,0x26,0x10,0x2b,0x40,
0x39,0x20,0x2b,0x10,0x2b,0x20,0x24,0x10,0x19,0x20,0x19,0x10,0x1c,0x20,
0x20,0x10,0x24,0x40,0x24,0x20,0x26,0x20,0x33,0x40,0x2b,0x40,0x30,0x40,
0x1c,0x40,0x1c,0x20,0x20,0x20,0x24,0x20,0x20,0x10,0x1c,0x10,0x20,0x40,
0x2b,0x20,0x26,0x10,0x24,0x20,0x2b,0x10,0x20,0x40,
0x1c,0x40,0x20,0x40,0x24,0x40,0x2b,0x40,0x19,0x20,0x1c,0x10,0x20,0x20,
0x1c,0x10,0x20,0x20,0x24,0x20,0x20,0x20,0x1c,0x20,0x26,0x40,0x2b,0x20,
0x30,0x40,0xff};
/******************************************************************************/
/*******************以下为主函数部分**************************/
voidmain(void)
{
unsignedcharp,m;//m为频率常数变量
unsignedchari=0;
TMOD=0x11;//设置定时器模式都为模式1
IE=0x8a;//中断使能
TH1=0xd8;
TL1=0xef;
P2=0xa0;
P3=0x0f;
I2CCON=0xE8;
SetTime(a);//设置时间
SwitchRTC
(1);
LCDInitialize();//液晶初始化
while
(1)
{
P1=0xf0;
P2=0xbf;
lie0=0;//扫描第一列以下以此类推
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay1s();//去键盘抖动
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=0;
break;
case0x0d:
key=4;
break;
case0x0b:
key=8;
break;
case0x07:
key=12;
break;
}
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
TR0=0;
}
}
P1=0xf0;
P2=0xbf;
lie1=0;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay1s();
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=1;
break;
case0x0d:
key=5;
break;
case0x0b:
key=9;
break;
case0x07:
key=13;
break;
}
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
TR0=0;
}
}
P1=0xf0;
P2=0xbf;
lie2=0;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay1s();
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=2;
break;
case0x0d:
key=6;
break;
case0x0b:
key=10;
break;
case0x07:
key=14;
break;
}
P0=table[key];
}
}
P1=0xf0;
P2=0xbf;
lie3=0;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay1s();
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=3;
break;
case0x0d:
key=7;
break;
case0x0b:
key=11;
break;
case0x07:
key=15;
break;
}
P0=table[key];
}
}
switch(key)
{case0,4,8,12,1,5,9,13,8,7,10,11,15:
break;
case2:
{
play_1:
{
a_1:
p=music_tab_1[i];
if(p==0x00){i=0,delayms(1000);gotoplay_1;}//如果碰到结束符,延时1秒,回到开始再来一遍
elseif(p==0xff){i=i+1;delayms(100),TR1=0;gotoa_1;}//若碰到休止符,延时100ms,继续取下一音符
else{m=music_tab_1[i++],n=music_tab_1[i++];}//取频率常数和节拍常数
TR1=1;//开定时器1
while(n!
=0)PWM1=~PWM1,delay(m);//等待节