1、音乐盒设计II摘 要本文是应用 STC89C52 单片机原理和控制理论来设计音乐盒的硬件电路,并利用汇编语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐,再利用延迟来控制发音时间的长短。该程序通过把乐谱转化成相应的定时常数来驱动发音设备演奏出悦耳动听的音乐。这种控制电路结构简单,可靠性高,应用性强;软件程序适应范围广,对于不同的音乐只需要改变相应的定时常数即可。对单片机和音乐爱好者有一定的借鉴价值。关键词:STC89C52 单片机 音乐盒 汇编语言III目 录1.设计目的及要求 .11.1 设计目的 .11.2 设计要求 .12 .设计方案及原理 .
2、12.1 设计原理.12.2 总设计思想 .23.硬件设计 .34.软件设计 .34.1 音调、节拍以及编码的确定方法 .34.2 程序流程图 .44.3 程序(汇编语言) .55. 总结.8参考文献.811.设计目的及要求1.1 设计目的 随着电子技术及计算机技术的发展,单片机在日常生活中的应用越来越广泛,同时也显现出了它的重要性,尤其在一些特殊的场合更是不可代替。为熟悉单片机的应用。要求设计一个基于 STC89C52 单片机的带彩灯外观的音乐盒。1.2 设计要求音乐盒有三个按键 key1, key2,key3,其中 key1 控制彩灯的样式,本设计有六种彩灯花样,每按一次变换一种样式。Ke
3、y2 控制音乐播放,本设计有五首音乐,每按一次变换到下一首,同时八路 LED 灯随音调不同而闪烁。Key3 为总开关用于关闭音乐跟彩灯。2.设计方案及原理2.1 设计原理 音调之所以不同是因为频率的不同。根据每个音调的频率单片机内部的定时计数器来产生相应的音乐脉冲。只要算出某一音频的周期(1/频率),然后将此周期除以 2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O 口反相,然后重复计时此半周期时间再对 I/O 反相,就可在 I/O 脚上得到此频率的脉冲。利用 STC89C52 的内部定时计数器工作在方式 1 下,改变初值 TH0 及 TL0 以产生不同频率
4、。 此外结束符和休止符可以分别用代码 0xff 和 0x00 来表示,若查表结果为 0xff,则表示曲子终了;若查表结果为 0x00,则产生相应的停顿效果。 例如频率为 523Hz,其周期 T=1/523=1912us,定时时间为 1912/2=956us 因此只要令计数器计时 956us/1us=956 次(若晶振频率为 6MHZ),在每次计数 956 次时将 I/O 反相,就可得到中音 DO(523Hz)。根据计数次数就可算出计数初值。 要产生音乐光有音调是不行的,每个音调还有持续一定的时间。这可以用延时程序 delay()来实现。因此每个音乐代码有八位数字组成,高四位控制音调,低四位通过
5、延时程序对该音调进行延时。通过子函数连续不断的调用音乐代码就产生了动听的音乐。音调的频率与时间都不同,让 DO、RE、MI、FA、SO、LA、SI 分别对应八路 LED 灯中的一个,这样播放音乐的同时就有 LED 灯对应闪烁。22.2 总体设计思想 图 1 思路图 如图 1 所示按键部分有三个键,分别结于外部中断 P3.2/INT0,P3.3/INT1,及串行口 P3.1/TXD 上,P3.2 每产生一次中断 count1 加一,根据 count1 的值来决定花样灯的种类。P3.3 每产生一次中断 count2 加一,根据 count2 的数值来决定播放哪一首歌曲。P3.1 接总开关的。播放音
6、乐,及花样灯均通过调用子程序来实现。八路 LED 灯灯接到P1 口。扬声器接到 P3.7 上。总体设计电路原理图,如图 2。图 2 原理图33 硬件设计 电路由 STC89C52 八路 LED 灯,排阻,三个开关,扬声器及晶振组成,搭建如图 3。图 3 硬件图4.软件设计在本程序中设置了一个标志count1,分别初始化为 0。按键 1 使得 count1 在14 之间切换。程序检测 count1 的值,count1 等于 1 时播放第一首歌曲,等于 2 时播放第二首。4.1 音调、节拍以及编码的确定方法 一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴
7、那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间。 不同音高的乐音是用 C、D、E、F、G、A、B 来表示,这 7 个字母就是音乐的音名,它们一般依次唱成 DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即 Tone。把 C、D、E、F、 G、A、B 这一组音的距离分成 124个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,CD、DE、FG 、GA、A B 两音之间隔着一个黑键
8、,他们之间的距离就是全音;EF、BC 两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成 1、2、3、4、5、6、7 的音叫自然音,那些在它们的左上角加上号或者 b 号的叫变化音。叫升记号,表示把音在原来的基础上升高半音,b 叫降记音,表示在原来的基础上降低半音。例如高音 DO 的频率(1046Hz)刚好是中音DO 的频率(523Hz )的一倍,中音 DO 的频率(523Hz)刚好是低音 DO 频率(266 Hz)的一倍;同样的,高音 RE 的频率(1175Hz)刚好是中音 RE 的频率(587Hz)的一倍,中音 RE 的频率(587Hz )刚好是低音 RE 频率(294 Hz)的一倍。1
9、)要产生音频脉冲,只要算出某一音频的周期(1/ 频率),然后将此周期除以 2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的 I/O反相,然后重复计时此半周期时间再对 I/O 反相,就可在 I/O 脚上得到此频率的脉冲。2)利用 AT89C51 的内部定时器使其工作在计数器模式 MODE1 下,改变计数值 TH0及 TL0 以产生不同频率的方法。 此外结束符和休止符可以分别用代码 00H 和 FFH 来表示,若查表结果为 00H,则表示曲子终了;若查表结果为 FFH,则产生相应的停顿效果。 3)例如频率为 523Hz,其周期 T=1/523=1912us,因此只要令
10、计数器计时956us/1us=956,在每次技术 956 次时将 I/O 反相,就可得到中音 DO(523Hz )。 4.2 程序流程图5初始化变量及 LCD 接口初始化计数器 T0,定时器 T1LCD 显示英文欢迎字符等待按键,是否有按键?包括播放键,暂停键,停止键歌曲号及播放时间显示在 LCD 上主程序开始依据按键码演奏对应的歌曲YN4.3 汇编语言程序org 0000hajmp mainorg 000bh jmp tim0org 0030hmain: ;主程序setb p1.1clr p1.4setb p3.0mov tmod,#01h ;设定时方式mov ie,#82h ;开中断sta
11、rt0:6mov 30h,#00h ; next:mov a,30hmov dptr,#tablemovc a,a+dptr ;查表取音调和节拍mov r2,a jz end0 ;为零,不进行处理anl a,#0fhmov r5,a ;将节拍存入 R5mov a,r2swap aanl a,#0fh jnz sing ;根据音调决定是否演奏clr tr0jmp d1sing:dec amov 22h,a ;将音调存入 22H.rl amov dptr,#table1movc a,a+dptr ;根据音调决定定时器初值。mov th0,a ;放入 TH0mov 21h,amov a,22hrl ainc amovc a,a+dptrmov tl0,a ;放入 TL0