单片机的蜂鸣器一波一波播放音乐,如何分辨乐谱中有多少拍?

/*音符频率对应表

音符频率/HZ半周期/us(N)

-

●1do 262 1908 # 1do # 277 1805

●2RE 294 1700 # 2RE # 3111608

低3mi 330 1516 # 3mi # 340 1470

●4fa 349 1433 # 4fa # 370 1350

●5SO 392 1276 # 5SO # 4151205

●6LA 440 1136 # 6LA # 4661072

●7si 494 1012 # 7si # 524 0954

钟1do 523 0956 # 1do # 554 0903

钟2RE 578 0842 #2RE# 622 0804

钟三米659 0759 #三米# 682 0733

钟4FA 698 0716 #4FA# 740 0676

中型5SO 784 0638 #5SO# 831 0602

钟6LA 880 0568 #6LA# 932 0536

7SI 988 0506 #7SI# 1046 478。

身高1do 1046478 # 1do # 1109451。

高2Re 1175426 # 2Re # 1245402

高3mi 1318372 # 3mi # 1356368

高4fa 1397358 # 4fa # 1480338

高5so 1568 319 # 5s 0 # 1661 292

高6la 1760284 # 6la 1865268

高7SI 1976 253 #7SI# 2066 242

-

(“#”表示半音,用来升半音)*/

/* - */

# include & ltreg52.h & gt//包含头文件,一般不需要更改。头文件包含特殊功能寄存器的定义。

#定义uint无符号整数

#定义uchar无符号字符

sbit spk=p1^2;//定义喇叭端口

无符号int I;//定义全局变量

Uchar table[14]={ //中音音阶对应定时器初始值。

0xfc,0x44,//1

0xfc,0xb6,//2

0xfd,0x09,//3

0xfd,0x34,//4

0xfd,0x82,//5

0xfd,0xc8,//6

0xfe,0x06 //7

};

/******************************************************************/

/*延迟函数语句*/

/******************************************************************/

Void delayms(unsigned int xms) //毫秒延迟

{

uint i,j;

for(I = xms;我& gt0;我-)

for(j = 125;j & gt0;j-);

}

Void init() //定时器初始化函数

{

TMOD | = 0x 01;//定时器工作模式,定时器0用于计时。

TH0 =表[0];//定时器刻度1对应初始值,高0xfc,低0x44。

TL0 = table[1];

ET0 = 1;//定时器0允许

EA = 1;//打开主机中断

}

/******************************************************************/

/*主函数*/

/******************************************************************/

主()

{

init();//定时器初始化

while(1)

{

for(I = 0;我& lt7;I++) //循环弹奏7个音阶。

{

TR0 = 1;//开启定时器0,开始计数,产生喇叭驱动频率。

戴莱姆斯(500);//每个音阶大约持续演奏时间。

TR0 = 0;//停止计时

delayms(1000);//喇叭停止工作,间歇时间约为1s,可以更改。

}

}

}

无效定时器0()中断1 //定时器中断功能

{

TH0 = table[I * 2];//小数位数1234567对应定时器初始值的高值。

//table[i*2]表示table[]数组中的数字0 2 4 6 8 10 12 14。

TL0 = table[I * 2+1];//table[i*2+1]表示table[]数组中的13579 1113 15值。

SPK = ~ SPK;//定时到了,喇叭电平反转,实现频率驱动。

}