这两组数据不是算的,而是根据音符实际频率实验得到的。
硬要说算的也要根据你定时器的频率具体得到。
如果想要自己利用蜂鸣器编歌,可用下面程序(极乐净土蜂鸣器版)
贴上极乐净土的简谱,对照下就能自己用蜂鸣器编歌了
#include
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^5;//蜂鸣器端口定义
uint i,j;
unsigned int C;
#define l1 262
#define l2 284
#define l3 311
#define l4 349
#define l5 392
#define l6 440
#define l7 494
#define z1 523
#define z2 587
#define z3 659
#define z4 698
#define z5 784
#define z6 880
#define z7 987
#define h1 1046
#define h2 1174
#define h3 1318
#define h4 1396
#define h5 1567
#define h6 1760
#define h7 1975
#define zi 0
void delay();
unsigned code GP[]={zi,zi,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h1,z5,z6,z3,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h3,h1,h2,z6,zi,z3,z5,/**/
z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h1,z5,z6,z3,z5,z1,z2,/**/z3,h1,z6,h3,/**/h2,h3,h2,h1,h2,z6,zi,/**/z6,z6,z6,z6,h1,h2,h3,/**/
z6,z6,z6,z5,z5,z6,/**/z6,z6,z6,z6,h1,h2,h3,/**/z6,z6,z6,h4,h4,h3,/**/z6,z6,z6,z6,h1,h2,h3,/**/ z6,z6,z6,z5,z5,z6,/**/
z6,z6,z6,z6,h1,h2,h3,/**/h6,z5,z5,z6,z6,/**/0xff} ;
//该数组保存乐谱
//高7音 h开头 中7音 z开头 低7音 l开头 休止符 zi
unsigned code JP[]={8,8,8,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/
8,8,8,8,/**/4,2,2,4,4,8,8,/**/8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/
8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/8,8,8,2,2,2,2,/**/12,4,4,4,8,/**/
} ;
//该数组保存相对应的延长,至于延长时长可参照乐谱
void main()
{ uchar i,j;
TMOD=0x00;
EA=1; //开总中断
ET0=1; //开t0中断
while(1)
{ i=0;
while(GP[i]!=0xff)
{if(GP[i]!=0)
{C=460830/GP[i];
TH0=(8192-C)/32;
TL0=(8192-C)%32;
TR0=1;}//开定时器0
for(j=0;j{delay();}
TR0=0;
i++;
}
beep=0;
}
}
void delay()
{
for(i=70;i>0;i--)
{for(j=85;j>0;j--);}
}
void T0_time()interrupt 1
{ TR0=0;
beep=!beep;
TH0=(8192-C)/32;
TL0=(8192-C)%32;
TR0=1;
}