源:http://blog.163.com/zhaojun_xf/blog/static/3005058020084196558440/
单片机音乐的应用
相关知识:
1.要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2.利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
3.例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi÷2÷Fr N:计数值;
Fi:内部计时一次为1us,故其频率为12MHz;
Fr:要产生的频率;
4.其计数值的求法如下:
T=65536-N=65536-Fi÷2÷Fr
例如:设K=65536,F=1000000=Fi=1MHz,求低音DO(261MHz)、中音DO(523MHz)、高音DO(1046MHz)的计数值。
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 C调各音符频率与计数值T的对照表
低1DO |
频率(Hz) |
简谱码(T值) |
音符 |
频率(Hz) |
简谱码(T值) |
||
262 |
63628 |
#4FA# |
740 |
64860 |
|||
#1DO# |
277 |
63731 |
中5SO |
784 |
64898 |
||
#2RE# |
294 |
63835 |
#5SO# |
831 |
64934 |
||
311 |
63928 |
中6LA |
880 |
64968 |
|||
低3M |
330 |
64021 |
#6 |
932 |
64994 |
||
低4FA |
349 |
64103 |
中7SI |
988 |
65030 |
||
#4FA# |
370 |
64185 |
高1DO |
1046 |
65058 |
||
低5SO |
392 |
64260 |
#1DO# |
1109 |
65085 |
||
#5SO# |
415 |
64331 |
高2RE |
1175 |
65110 |
||
低6LA |
440 |
64400 |
#2RE# |
1245 |
65134 |
||
#6 |
466 |
64463 |
高3M |
1318 |
65157 |
||
低7SI |
494 |
64524 |
高4FA |
1397 |
65178 |
||
中1DO |
523 |
64580 |
#4FA# |
1480 |
65198 |
||
#1DO# |
554 |
64633 |
高5SO |
1568 |
65217 |
||
中2RE |
587 |
64684 |
#5SO# |
1661 |
65235 |
||
#2RE# |
622 |
64732 |
高6LA |
1760 |
65252 |
||
中3M |
659 |
64777 |
#6 |
1865 |
65268 |
||
中4FA |
698 |
64820 |
高 |
1967 |
65283 |
表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/4节拍的时间设定
曲 调 值 |
DELAY |
曲 调 值 |
DELAY |
调4/4 |
125毫秒 |
调4/4 |
62毫秒 |
调3/4 |
187毫秒 |
调3/4 |
94毫秒 |
调2/4 |
250毫秒 |
调2/4 |
125毫秒 |
1/4拍的延迟时间=187毫秒
DELAY: MOV R7,#02
D2: MOV R4,#187 别的延迟值,只需修改这儿的值为相应值,即可。
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY 节拍值放在R5,决定节拍
RET
建立音乐的步骤:
1. 先把乐谱的音符找出,然后建立T值表的顺序。
2. 把T值表建立在TABLE1,构成发音符是计数值放在“TABLE”。
3. 简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的“TABLE”处。
相关知识:
每一音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表2为节拍与节拍码的对照。如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间 。假使1/4拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DEALY时间,其余的节拍就是它的倍数,如表3为1/4和1/8节拍的时间设定。
简 谱 |
发 音 |
简 谱 码 |
T值 |
5 |
低音SO |
1 |
64260 |
6 |
低音LA |
2 |
64400 |
7 |
低音TI |
3 |
64524 |
1 |
中音DO |
4 |
64580 |
2 |
中音RE |
5 |
64684 |
3 |
中音MI |
3 |
64777 |
4 |
中音FA |
7 |
64820 |
5 |
中音SO |
8 |
64898 |
6 |
中音LA |
9 |
64968 |
7 |
中音TI |
A |
65030 |
1 |
高音DO |
B |
65058 |
2 |
高音RE |
C |
65110 |
3 |
高音MI |
D |
65157 |
4 |
高音FA |
E |
65178 |
5 |
高音SO |
F |
65217 |
不发音 |
0 |
表4 简谱对应的简谱码、T值、节拍数
8051播放音乐电路图
程序:
C51
此程序用了外中断INT0,用于换歌曲,当有键按下时,产生中断,奏下一首歌。没有中断时,循环演奏此曲。
汇编程序:
此程序的思想与上边的C51基本一致,不同的是此程序没有用外中断(INT0)。所以次程序只是音乐演奏的基本程序。还有因为8051是8位的,而此程序仅用一单元作简谱码指针。所以只能放256个简谱。故不能写太长的歌曲。
简谱码:
82H : 8对应音符 中音5SO; 2对应节拍2/4拍
01H : 0不发音 ; 1对音节拍1/4拍
81H : 8对应音符 中音5SO; 1对应节拍1/4拍
94H : 9对应音符 中音6LA; 4对应节拍1拍
84H : 8对应音符 中音5SO; 4对应节拍1拍
此程序是:T0(P3.4)作为控制门铃的按钮,每按一次,歌曲就改变。按完6次,再重复循环。按钮接P3.4。
以上三个程序的原理图基本上是一样的,不同的只是有无按钮和按钮的接法。第一个程序的按钮是接INT0(P3.2)。第二个程序无按钮。第三个程序的按钮是接T0(P3.4)。别的都是一样的。
电子琴
功能说明:
1. 由4×4组成的16个按钮矩阵,设计成16个音。
2. 硬件原理图:
程序:
实物图: