- 帖子
- 120
- 主题
- 79
- 精华
- 0
- 积分
- 60
- 在线时间
- 5 小时
- 注册时间
- 2010-10-13
|
要单片机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 |
|
|