音乐播放原理
经常有人找单片机发声的
, 我整理了一下,帖了上来,给大家一些 参考.
.
1.要生产音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间.利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间
再对I/O反相,就可在I/O脚上得到此频率的脉冲.
2. 利用8051的内部定时器使用其工作在计数器模式MODE1下,改变计数值THO及TLO
以产生不同频率的方法.
3. 例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在
每次计数956次时将I/O反相,就可得到中音DO (523Hz).
计数脉冲值与频率的关系
如下:
N=Fi?2?Fr N: 计算值;
Fi: 内部计时一次为1us, 故其频率为1MHz;
4. 其计数值的求法如下:
T=65536-N=65536-Fi?2?Fr
例如: 设K=65536, 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
5. C调各音符频率与计数值T的
如表1所示.
表1 C 调各音符频率与计数值T的对照表
音符 频率(HZ) 简谱码(T值) 音符 频率(HZ) 简谱码(T值) 低 1 DO # 4 FA# 262 63628 740 64860
中 5 SO # 1 DO# 277 63731 784 64898 低 2 RE # 5 SO# 294 63853 831 64934
中 6 LA # 2 RE# 311 63928 880 64968 低 3 M # 6 330 64021 932 64994 低 4 FA 中 7 SI 349 64103 988 65030
高 1 DO # 4 FA# 370 64185 1046 65058 低 5 SO # 1 DO# 392 64260 1109 65085
高 2 RE # 5 SO# 415 64331 1175 65110 低 6 LA # 2 RE# 440 64400 1245 65134
高 3 M # 6 466 64463 1318 65157 低 7 SI 高 4 FA 494 64524 1397 65178 中1 DO # 4 FA# 523 64580 1480 65198
高 5 SO # 1 DO# 554 64633 1568 65217 中 2 RE # 5 SO# 587 64684 1661 65235
高 6 LA # 2 RE# 622 64732 1760 65252 中 3 M # 6 659 64777 1865 65268 中 4 FA 高 7 SI 698 64820 1967 65283
.
()
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表2为节拍与节拍码的对照.如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间.假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推.所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如表3
为1/4和1/8节拍的时间设定.
表2 节拍与节拍码对照 节 拍 码 节 拍 数 节 拍 码 节 拍 数
1/4 拍 1/8 拍 1 1
2/4 拍 1/4 拍 2 2
3/4 拍 3/8 拍 3 3
1 拍 1/2 拍 4 4
1又1/4 拍 5/8 拍 5 5
1又1/2 拍 3/4 拍 6 6
2 拍 1 拍 8 8
2又1/2 拍 1又1/4 拍 A A
3 拍 1又1/2 拍 C C
3又3/4 拍 F
表3 各调1/4节拍的时间设定 各调1/8节拍的时间设定 曲 调 值 曲 调 值 DELAY DELAY 调 4/4 125 毫秒 调 4/4 62 毫秒 调 3/4 187 毫秒 调 3/4 94 毫秒 调 2/4 250 毫秒 调 2/4 125毫秒
.
建立音乐的步骤:
1. 先把乐谱的音符找出,然后由表63建立T值表的顺序.
2. 把T值勤表建立在TABLE1,构成发音符的计数值放在"TABLE".
3. 简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的"TABLE"处.
表4 简谱对应的简谱码.T值. 节拍数
简 谱 发 音 简 谱 码 T 值 节 拍 码 节 拍 数 低音 SO 1/4 拍 5 1 64260 1 低音 LA 2/4 拍 6 2 64400 2 低音 TI 3/4 拍 7 3 64524 3 中音 DO 1 拍 1 4 64580 4 中音 RE 1又1/4 拍 2 5 64684 5 中音 MI 1又1/2 拍 3 6 64777 6 中音 FA 2 拍 4 7 64820 8 中音 SO 2又1/2 拍 A 5 8 64898
中音 LA 3 拍 C 6 9 64968
中音 TI 3又3/4 拍 A F 7 65030
高音 DO B 1 65058
高音 RE C 2 65110
高音 MI D 3 65157
高音 FA E 4 65178
高音 SO F 5 65217
不发音 0
1/4187
DELAY: MOV R7. #02
D2: MOV R4. #187
D3: MOV R3. #248
DJNZ R3. $
DJNZ R4. D3
DJNZ R7. D2
DJNZ R5. DELAY
RET
表1 C 调各音符频率与计数值T的对照表
音符 频率(HZ) 简谱码(T值) 音符 频率(HZ) 简谱码(T值) 低 1 DO 262 63628 # 4 FA# 740 64860 # 1 DO# 277 63731 中 5 SO 784 64898 低 2 RE 294 63853 # 5 SO# 831 64934 # 2 RE# 311 63928 中 6 LA 880 64968 低 3 M 330 64021 # 6 932 64994 低 4 FA 349 64103 中 7 SI 988 65030 # 4 FA# 370 64185 高 1 DO 1046 65058 低 5 SO 392 64260 # 1 DO# 1109 65085 # 5 SO# 415 64331 高 2 RE 1175 65110 低 6 LA 440 64400 # 2 RE# 1245 65134 # 6 466 64463 高 3 M 1318 65157 低 7 SI 494 64524 高 4 FA 1397 65178 中1 DO 523 64580 # 4 FA# 1480 65198 # 1 DO# 554 64633 高 5 SO 1568 65217 中 2 RE 587 64684 # 5 SO# 1661 65235 # 2 RE# 622 64732 高 6 LA 1760 65252 中 3 M 659 64777 # 6 1865 65268 中 4 FA 698 64820 高 7 SI 1967
()
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表2为节拍与节拍码的对照.如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间.假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推.所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如表3为1/4和1/8节拍的时间设定.
表2 节拍与节拍码对照
节 拍 码 节 拍 数 节 拍 码 节 拍 数 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 拍 8 2 拍 8 1 拍 A 2又1/2 拍 A 1又1/4 拍 C 3 拍 C 1又1/2 拍 F 3又3/4 拍
表3 各调1/4节拍的时间设定 各调 1/8节拍的时间设定
曲 调 值 DELAY 曲 调 值 DELAY 调 4/4 125 毫秒 调 4/4 62 毫秒 调 3/4 187 毫秒 调 3/4 94 毫秒 调 2/4 250 毫秒 调 2/4 125毫秒