单片机的蜂鸣器一波一波播放音乐,如何分辨乐谱中有多少拍?
音符频率/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;//定时到了,喇叭电平反转,实现频率驱动。
}