关于生日快乐简谱!

简谱如下,谁能帮我读读:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit BEEP = P3^7;
uchar code SONG_TONE[]=
{
212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0
};
uchar code SONG_LONG[]=
{
9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0
};

void DelayMS(uint ms)
{
uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}

void PlayMusic()
{
uint i =0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP = ~BEEP;
for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10);
i++;
}
}

void main()
{
while(1)
{
PlayMusic();
DelayMS(500);
}
}

问题1:SONG_TONE和SONG_LONG下面的数字是怎么来的,计算方法是什么?
问题2:void playmusic()这段程序的解析?
谢谢!

第1个回答  2013-07-09
SONG_TONE的数字对应的是歌曲简谱中的1、2、3、4、5、6、7七个音节
SONG_LONG的数字对应的是每个音节的速率,是快还是慢
void PlayMusic()
{
uint i=0,j,k; //定义整形变量i=0,j,k
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{
//播放各个音符,SONG_LONG为拍子长度
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP=~BEEP; //按位取反,如果BEEP=1,则~BEEP=0.如果BEEP=0,则~BEEP=1
//SONG_TONE延时表决定了每个音符的频率
for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10); //延时10毫秒,也起到一个去抖动作用
i++;
}
}
第2个回答  2019-11-03
第3个回答  2010-05-05
首先想一下声音怎么来的
要发声就有震动,振动频率觉得了音调高低
所以如果想要得到 do re mi fa so ra ti
先去查一下频率,加入某个是频率f
时钟晶振频率fc
那么就要分频
fc/f倍
所以tune的循环越久频率越低,音调也越低

Long使用来说音长,我这个音节多长,循环次数越多,beep反转越多,也就越长本回答被网友采纳
相似回答