若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将I/O口反相,然后重复计时再反相。就可以在该I/O口引脚上得到频率的脉冲。
STCC52RC单片机的一个计数周期需要12个时钟周期,采用12MHz晶振,一个计数周期即1us。利用单片机内部的定时器,使其工作计数器模式下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。例如,中音DO频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,每计数956次将I/O口反相,就可得到中音DO。
计数脉冲值与频率的关系式是:
N=fi÷2÷fr
式中,N是计数值;fi是机器频率(晶振为12MHz时,其频率为1MHz);fr是想要产生的频率。
其计数初值T的求法如下:
T=65536-N=65536-fi÷2÷fr
单片机12MHz晶振,高中低音符与计数值对照如表 3 1所示。
表 3 1 C大调各音符频率与计数值对照表
音符 频率Hz 周期(T值) 音符 频率Hz 周期(T值)
低音区 低音DO 262 63628 中音区 #FA 740 0676
#DO 277 63731 中SO 784 0638
低RE 294 63836 #SO 831 0602
#RE 311 63928 中LA 880 0568
低M 330 020 #LA 932 0536
低FA 349 103 中SI 988 0506
#FA 370 186 高音区 高DO 1046 0478
低SO 392 260 #DO 1109 0451
#SO 415 331 高RE 1175 0426
低LA 440 400 #RE 1245 0402
#LA 466 4 高M 1318 0372
低SI 494 524 高FA 1397 0358
中音区 中DO 523 580 #FA 1480 0338
#DO 554 633 高SO 1568 0319
中RE 578 694 #SO 1661 0292
#RE 622 732 高LA 1760 0284
中M 659 777 #LA 1865 0268
中FA 698 820 高SI 1976 0253
注:#代表该音符升半调。
我们要为这些音符建立一个表格,让单片机通过查表的方法来获得音符的计数值。
unsigned int code note_value[][14]={
{0,63628,63835,021,103,260,400,524,63731,63928,0,185,331,463}, //低音1,2,3,4,5,6,7,#1,#2,0(#3在此程序中无需设),#4,#5,#6 相对应的定时器初值 {0,580,684,777,820,8,968,65030,633,732,0,860,934,994}, //中音1,2,3,4,5,6,7,#1,#2,0(#3在此程序中无需设),#4,#5,#6 相对应的定时器初值 {0,65058,65110,65157,65178,65217,65252,65283,65085,65134,0,65198,65235,65268} //高音1,2,3,4,5,6,7,#1,#2,0(#3在此程序中无需设),#4,#5,#6 相对应的定时器初值
};
音乐的节拍,一个节拍为一个单位。如表 3 2所示。
表 3 2 曲调值表
曲调值 延时(ms) 曲调值 延时(ms)
调4/4 125 调4/4 62
调3/4 187 调3/4 94
调2/4 250 调2/4 125
这提供一个小软件音乐编码 自动换算下载本文