编写基于单片机的宽音域高音准音乐程序.docVIP

编写基于单片机的宽音域高音准音乐程序.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编写基于单片机的宽音域高音准音乐程序

编写基于单片机的宽音域高音准音乐程序 (南京农业大学 电气工程系) 摘要 介绍了一种利用定时中断为单片机编写高音准的音乐程序的方法,并给出实例程序清单。 关键词 单片机,中断,编程,音乐,音级,音程 采用适当的误差补偿,利用单片机定时中断的方法能在宽音域范围产生准确稳定的音频信号。本文以MCS-51单片机为例介绍单片机的音乐程序的编写,给出的程序,只须修改乐曲内容就可得到读者自己的程序。 1 音乐的基本知识 在音乐中使用的各个固定频率的音叫音级[1]。常用符号C、D、E、F、G、A、B、c、d、e、……a1、b1、c2、d2……表示,它们对应于钢琴上的白键。两音之间音高的距离叫音程。在上述音级中,E与F、B与C之间音高的距离仅为其它相邻音级之间距离的一半,称它们之间的音程为半音音程,而称其它相邻各音之间的距离为全音音程。在这些全音音程之间又加入新的半音音级,用符号﹟C、﹟D、﹟F、﹟G、﹟A、﹟c、﹟d、﹟f、……表示,对应于钢琴上的黑键。 国际上目前采用以a1 =440Hz作为标准国际音高,由此推算出各音级的频率见表1。 音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。 2 编程思路 要产生音频信号,只要算出某一音频的周期(频率的倒数),将此周期除以2即为半周期的时间,利用定时器计时此半周期时间,计时到后取反输出,重复此过程即得到此频率的声音信号。此信号从P1.7脚输出。 定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。本例中单片机晶振频率为6MHz。 每个音符使用两个字节。低位字节(偶地址)代表音级,00H表示不发音(休止符),01H~30H依次表示的音级为c、﹟c、d、﹟d、e、f、……a3、﹟a3、b3 ,详见表1。高位字节(奇地址)代表音符的时值(拍数),00H~0FH依次表示拍数为1/8拍(0.10s)~8拍(6.40s),见表2。乐曲的结束标志是两个字节:00H,0FH。 定时器T1工作在定时方式1,定时时间为0.10s左右,作为音符节拍的最小时间单位,即1/8拍,该时间要求不必很准确,该时间越短,音乐播放节奏就越快。时间取0.10s时,定时常数取为3CB0H。即TH1=3CH,TL1=0B0H。其它的音符节拍都是1/8拍的整数倍,借助软件计数,允许中断的次数就是倍数。例如,要得到1拍的延时,只要中断8次即可。 要编写的乐谱按要求以音符字节数据表的形式存放在程序中,改变乐曲就是通过改变该数据表的内容来实现的。 主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和音长子程序,启动定时器T0;根据定时器T1应中断的次数,启动定时器T1。数据表读完后,根据所设置的循环演奏次数决定是否结束程序。音级子程序的任务是取出字节中的音级部分,分析TH0和TL0中应送入何值,送给寄存器R3、R2。音长子程序的任务是取出字节中的音长部分,分析确定定时器T1应中断的次数,次数送寄存器R4中,同时启动定时器T1,直到完成所需拍数。 定时器T0的中断服务程序任务是取反P1.7输出产生方波,重新为TH0,TL0送初值。 定时器T1的中断服务程序任务是:判断节拍数完成否,关闭定时器T0、T1中断。 当乐曲较长时(超过254个字节),数据表指针溢出,应及时修改基址寄存器DPTR内容,即数据表的表头指针。 例如,C=1时音节: 6 - 用音符(包含音级和音长)字节表示就为:11H,02H,14H,01H,16H,01H,19H,02H,16H,02H,16H,08H,16H,0AH,00H,04H。其中11H,02H中的11H表示音3(mi),02H表示节拍为半拍,即。其余类推。 3 播放方法: P1.7输出的音频信号不能直接驱动普通喇叭,可驱动高阻抗耳机发声或者有源音箱发音。也可自制音频放大电路驱动喇叭发音。 表1 各音的频率、定时初值、字节字符 音级/1=C 频率(Hz) 定时初值 字节字符 音级/1=C 频率(Hz) 定时初值 字节字符 c / 1 130.81 F88E 01H c2 / 523.25 FE27 19H ﹟c 138.59 F8F9 02H ﹟c2 554.37 FE42 1AH d / 2 146.83 F95E 03H d2 /

文档评论(0)

ctuorn0371 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档