返回列表 发帖

单片机演奏音乐的实现

要单片机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    262F117H#4740FAB8H
#1277F1E5H中5784FB04H
低2294F2B6H#5831FB4CH
#2311F370H中6880FB8FH
低3330F429H#6932FBCFH
低4349F4CEH中7988FC0BH
#4370F571H高11046FC43H
低5392F608H#11109FC7AH
#5415F696H高21175FCACH
低6440F71FH#21245FCDCH
#6466F79EH高31318FDO9H
低7494F817H高41397FD34H
中1523F887H#41480FD5CH
#1554F8F2H高51568FD82H
中2578F93DH#51661FDA5H
#2622F9B8H高61760FDC7H
中3659FA12H#61865FDE7H
中4698FA67H高71976FE05H

表2
音符简码N值存储地址
F71FHTAB
F93DHTAB+2
FA12HTAB+4
FA67HTAB+6

表3
音符节拍代码存储地址
2/412HTAB1
2/432HTAB1+1
2/442HTAB1+2
2/432HTAB1+3
4/424HTAB1+4
4/414HTAB1+5

返回列表

最新关注 关闭


关于论坛注册,最新修改,请网友们注意

由于最近大量垃圾信息出现在我们的论坛,为了营造一个良好的氛围,目前论坛只开发邀请注册,你可以点击以下链接自动邀请注册(如果有人使用了点击下一个试一试) ...


查看
珩源工控论坛热诚欢迎您联系我们进行合作!

Powered by Discuz! 7.2© 2001-2009 Comsenz Inc.

珩源工控论坛 ( 桂ICP备19004328号) |论坛统计|WAP| 客服中心-www.hymcu.com
  

GMT+8, 2024-11-24 18:59, Processed in 1.047259 second(s), 5 queries, Gzip enabled.