| 单片机演奏音乐的实现 文章长度[ ] 加入时间[ 2007/7/14] 更新时间[ 2024/9/8 20:54:59] 级别[ 0] [ 评论] [ 收藏]
要单片机8031产生音频脉冲,只要算出某一音频的周期,然后用计数器计数1/2 此周期,计时到即将输出脉冲的I/O管脚反相,再重计时输出,既可在此I/O管脚得到此音频的脉冲。
用8031内部定时/计数器计数,使其工作于模式1,要得到不同频率的音频信号,只要改变其计数值即可。如要产生频率为f的音频信号,计数器计数如下: N=2-10/f(采用6M晶振)
表1为C调各音符频率与计数值N的对照表 一、硬件 用广州单片机实验室设计开发的ZH5101单板机,从其扩展口P1口的P1.0管脚拉出一根线,外加如右下图所示的电路,就做成了会奏乐的单片机。 二、软件设计 要输出某一曲调,必须知道此曲调所包括的音符以及每个音符所占的节拍。本软件将一个音符用一个字节的代码表示。字节高四位代表简码,低四位代表音符的节拍数,设1/4拍所占时间为T,则一个节拍的时间为4T,如某一音符节拍为2/4拍,则声音的延续时间为2T,在2T时间里,P1.0输出的即为此音符的音频脉冲。
为使读者能进一步了解此软件的设计思想,现举例如下: 如要输出曲调|63 43 26|,此谱只有4个音符,可先对这4个音符建一计数值表TAB如表2,再根据每个音符的简码号极其节拍数依次将其代码存于TAB1地址开始的存储单元,高四位存简码号,低四位存节拍。如6的简码号为1,节拍数为2/4,即2T,则写入的数据代码为12H,高四位为1,低四位为2(2T),这样根据以上曲调从TAB1开始处依次写入:12H,32H,42H,32H,24H,14H便组成了音符代码表(表3)。 程序运行时,从代码表中依次读出各音符代码,根据高位的简码号从TAB表中取出相应的计数值送THO TLO,再根据低位的节拍数确定每个音符相应的延时时间。本程序流程图如下: 如果读者手头没有单片机实验板,不妨向本站邮购。邮购价:¥110(包括邮费)
表1
音符 |
频率(Hz) |
简码(N值) |
音符 |
频率(Hz) |
简码(N值) |
低1 |
262 |
F117H |
#4 |
740 |
FAB8H |
#1 |
277 |
F1E5H |
中5 |
784 |
FB04H |
低2 |
294 |
F2B6H |
#5 |
831 |
FB4CH |
#2 |
311 |
F370H |
中6 |
880 |
FB8FH |
低3 |
330 |
F429H |
#6 |
932 |
FBCFH |
低4 |
349 |
F4CEH |
中7 |
988 |
FC0BH |
#4 |
370 |
F571H |
高1 |
1046 |
FC43H |
低5 |
392 |
F608H |
#1 |
1109 |
FC7AH |
#5 |
415 |
F696H |
高2 |
1175 |
FCACH |
低6 |
440 |
F71FH |
#2 |
1245 |
FCDCH |
#6 |
466 |
F79EH |
高3 |
1318 |
FDO9H |
低7 |
494 |
F817H |
高4 |
1397 |
FD34H |
中1 |
523 |
F887H |
#4 |
1480 |
FD5CH |
#1 |
554 |
F8F2H |
高5 |
1568 |
FD82H |
中2 |
578 |
F93DH |
#5 |
1661 |
FDA5H |
#2 |
622 |
F9B8H |
高6 |
1760 |
FDC7H |
中3 |
659 |
FA12H |
#6 |
1865 |
FDE7H |
中4 |
698 |
FA67H |
高7 |
1976 |
FE05H |
表2
音符 |
简码 |
N值 |
存储地址 |
6 |
1 |
F71FH |
TAB |
2 |
2 |
F93DH |
TAB+2 |
3 |
3 |
FA12H |
TAB+4 |
4 |
4 |
FA67H |
TAB+6 |
表3
音符 |
节拍 |
代码 |
存储地址 |
6 |
2/4 |
12H |
TAB1 |
3 |
2/4 |
32H |
TAB1+1 |
4 |
2/4 |
42H |
TAB1+2 |
3 |
2/4 |
32H |
TAB1+3 |
2 |
4/4 |
24H |
TAB1+4 |
6 |
4/4 |
14H |
TAB1+5 | | 1、 本站不保证以上观点正确,就算是本站原创作品,本站也不保证内容正确。 2、如果您拥有本文版权,并且不想在本站转载,请书面通知本站立即删除并且向您公开道歉! |