以8051单片机为例(8051单片机的定时器每次计数时间为1us)。利用8051的内部定时器使其工作在计数器模式MODE1
下,改变计数值TH0及TL0以产生不同频率的方法如下:
例如,频率为523Hz,其周期为1/523 S=1912uS,因此只要令计数器计时956,在每计数956次时就将I/O反接,就可得到
中音DO(532Hz)。
其计数值N可以根据以下公式得到:
2N=Fi/Fr (Fi为内部时钟频率,Fr为对应音符频率) 而单片机定时器所需的预计数值 T=65536-N=65536-Fi/2/Fr
计算举例:
设F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580 高音DO的T=65536-500000/1047=65059
附表:音符与频率对应表
(“#”表示半音,用于上升或下降半个音)
表9.1 C调各音符频率与计数值T的对照表
音符 频率(Hz) 简谱码T值
低1DO 262 63628 #1DO# 277 63731 低2RE 294 63835 #2RE# 311 63928 低3M 330 64103 低4FA 349 64103 #4FA# 370 64260 低5SO 392 64260 #5SO# 415 64331 低6LA 440 64400 #6 466 64463
低7SI 494 64524 中1DO 523 64580
#1DO# 554 中2RE 578 FC9F;
#2RE# 622 中3MI 659 FD09; 中4FA 698 FD34
#4FA# 740 中5SO 784 FD82
#5SO# 831 中6LA 880 FDC8
#6LA# 932 中7SI 988 FE06
(2)节拍
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,下表为节拍码的对照。但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。
所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如下表为1/4和1/8节拍的时间设定。
表9.2 节拍码对照表
1/4节拍 1/8节拍
节拍码 节拍数 节拍码 节拍数
1 1/4拍 1 1/8拍 2 2/4拍 2 1/4拍 3 3/4拍 3 3/8拍 4 1拍 4 1/2拍 5 1又1/4拍 5 5/8拍 6 1又1/2拍 6 3/4拍 7 1又3/4拍 7 7/8拍
8 2拍 8 1拍
9 2又1/4拍 9 1又1/8拍 A 2又1/2拍 A 1又1/4拍 B 2又3/4拍 B 1又3/8拍 C 3拍 C 1又1/2拍 D 3又1/4拍 D 1又5/8拍 E 3又1/2拍 E 1又3/4拍 F 3又3/4拍 F 1又7/8拍
节拍延时参考:
1/4拍的延迟时间 4/4 125ms 3/4 187ms 2/4 250ms 拍的延迟时间 62ms 94ms 125ms
曲调 1/8