微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 单片机典型案例开发(三)

单片机典型案例开发(三)

时间:03-23 来源:本站整理 点击:

ms 时,就能发出200HZ 的音调。 我们可以写一个延时子程序,用R3 来提供参数,R3=1 时,延时为20us,那么R3 取2500/20=125(7DH)时,就可以发出200Hz 的音调,提供不同的R3 常数,可以得到不同的音调变化。

  利用通用发声程序可以编写乐曲演奏程序,乐曲是按照一定的高低,长短和强弱的关系组成的音调,在一首乐曲中,每音符的音高和音长与频率和节拍有关(如图3 所示)。

  

  图3 音符的音高和音长与频率的关系

  图3 画出了两个音阶(一个音阶是8 个音符)的钢琴键和每个键的音符名及其频率(HZ),低音阶以低C(130.8Hz)到中C(261.7Hz)高音阶以中C 到高C(523.3Hz)黑键比它旁边的白键高半个音或低半个音。 组成乐曲的每个音符的频率和持续时间是乐曲程序发声所需要的两个重要数据。 频率可以从图中得到,音符的持续时间可根据乐曲速度及每个音符的节拍数来确定,是可以从乐谱中得到的。

  2.2 节拍

  控制一个音符输出的时间,比如1 拍、1/4 拍。 在4/4(四四拍)中,四分音符为一拍,每小节4 拍,全音符持续4 拍,二分音符持续2 拍,四分音符持续1 拍,八分音符持续半拍。 而全音符需要1s 的时间,则二分音符持续时间为0.5s(50×10ms),四分音符的持续时间为0.25s(25×10ms),八分音符持续时间为0.125s(12.5×10ms)。

  知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表,然后编写程序依次取出表中的时间值和频率值。

  仅上所叙还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。 例如,一首曲子的节奏为每分种94 拍,那么一拍就为60/94=0.64s.

  音乐的节拍我们可用定时器来控制,简单的说,一个一拍的音符唱0.64s,我们就设置一个定时器定时0.64s,时间一到就换下一个音符。 但是,由于单片机的T0,在12MHz 晶振下最大定时时间只能为65ms,因此不可能直接用改变T0 的时间初值来实现不同节拍。 如何定时一个更大的时间,我们可以用T0 来产生10ms 的时间基准,然后设置 一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。

  例如对1/4 拍音符,定时时间为0.16s,相应的时间常数(中段计数器)为16(即10H);对3 拍音符,定时时间为1.92s,相应时间长数为192(即C0H)。

  2.3 电路实现

  因为一首曲子不止一个音符,我们不可能对每一个音符的音阶都去"手工"的提供时间常数,为了实现的简化,我们编制一个将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成的表格,在程序里用查表指令依次查出每一个音符的频率和对应节拍时间,产生音符并控制节奏,就可以实现演奏效果。

  此外,结束符和体止符可以分别用代码00H 和FFH 来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。

  为了产生手弹的节奏感,在某些音符(例两个相同音符)音插入一个时间单位的频率略有不同的音符。

  程序框图如下图4. 本程序演奏的是民歌"八月桂花遍地开",C 调,节奏为94 拍/min。

  用Keil 对程序进行编译,见图5,具体方法可文献[5],编译无误后生成。hex 文件,然后双击Proteus环境下的原理图中的AT89C51,找到这个。 hex 文件,然后点按钮Play,这时单片机控制的蜂鸣器就可以开始播放音乐了。

  

  图4 程序流程图

  

  图5 在Keil 环境下对程序进行编译

  3 结论

  以上介绍的方法已通过测试,运行良好。 对初学单片机者有一定的启示作用。 读者也可以自行找出一首歌,将乐曲翻译成码表输入单片机,而程序不变。 本实验方法简便,即使不懂音乐的人,也可方便地将一首陌生的曲子翻译成代码。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top