单片机课程设计音乐演奏器的设计_第1页
单片机课程设计音乐演奏器的设计_第2页
单片机课程设计音乐演奏器的设计_第3页
单片机课程设计音乐演奏器的设计_第4页
单片机课程设计音乐演奏器的设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要本文是应用mcs-51单片机原理和控制理论设计音乐演奏控制器的硬件电路,并利用汇编语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐,再利用延迟来控制发音时间的长短。把乐谱转化成相应的定时常数就可以从发音设备中演奏出悦耳动听的音乐。 这种控制电路结构简单,可*性高,应用性强;软件程序适应范围广,对于不同的音乐只需要改变相应的定时常数即可。对单片机和音乐爱好者有一定的借鉴价值目录1 设计目的32 硬件电路设计及描述32.1 确定元器件的型号及参数32.1.1 at89c51单片机简介32.1.2 89c51的定时/计数器52.1.3 80c51的中断

2、系统72.1.4 蜂鸣器的介绍102.1.5 dip 双列直插式封装102.1.6 三极管112.2 工作原理及原理图112.3 列出元器件单123 软件设计123.1演奏原理123.1.1如何产生音乐频率123.1.2 如何产生节拍133.1.3 歌谱143.1.4 建立步骤143.2程序设计143.2.1程序流程图143.2.3 程序164参考文献18设计体会191 设计目的利用单片机做演奏一首生日快乐歌,通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经放大后驱动蜂鸣器发出不同音节的声音,通过软件延时来控制发音时间的长短,控制节拍。2 硬件电路设计及描述2.1 确定元器件的型号及参

3、数2.1.1 at89c51单片机简介 at89c51是一种带4k字节闪烁可编程可擦除只读存储器(fperomfalsh programmable and erasable read only memory)的低电压,高性能cmos8位微处理器,俗称单片机。at89c2051是一种带2k字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的at89c51是一种高效微控制器,at89c2051是它的一种

4、精简版本。at89c单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 1. 主要特性:与mcs-51 兼容 4k字节可编程闪烁存储器 寿命:1000写/擦循环数据保留时间:10年全静态工作:0hz-24hz三级程序存储器锁定128*8位内部ram32可编程i/o线两个16位定时器/计数器5个中断源 可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路 2. 管脚说明:vcc:供电电压。gnd:接地。p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

5、在fiash编程时,p0 口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。 p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p

6、2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。p3口也可作为at89c51的一些特殊功能口,如下表所示:口管脚 备选功能p3.0 rxd(串行输入口)p3.1 txd(串

7、行输出口)p3.2 /int0(外部中断0)p3.3 /int1(外部中断1)p3.4 t0(记时器0外部输入)p3.5 t1(记时器1外部输入)p3.6 /wr(外部数据存储器写选通)p3.7 /rd(外部数据存储器读选通)p3口同时为闪烁编程和编程校验接收一些控制信号。rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的

8、。然而要注意的是:每当用作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行movx,movc指令是ale才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。/psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。/ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此

9、间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。xtal2:来自反向振荡器的输出。3振荡器特性:xtal1和xtal2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,xtal2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。4 芯片擦除: 整个perom阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ale管脚处于低电平10ms 来完成。在芯片擦操作

10、中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,at89c51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,cpu停止工作。但ram,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存ram的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。2.1.2 89c51的定时/计数器1. 89c51 的两个计数器,分别称之为t0 和t1,这两个计数器都是由两个8 位的ram 单元组成的,即每个计数器都是16 位的计数器,最大的计数容量是216=65536 ,记住是从0-65535,因为在计算机中,

11、往往把0 作为起始点。2. 单片机中的计数器除了可以作为计数用,还可以用作定时器,定时器的用途当然很大,如闹钟的定时,手机的定时开关机等等, 只要计数脉冲的间隔相等,那么计数值就代表了时间的流逝。其实,单片机中的定时器和计数器是一个东西,只不过计数器记录的是外界发生的事情,而定时器则是单片机提供一个非常稳定的计数源,然后把计数源的计数次数转化为定时器的时间,图中的c/t 开关就是起这个作用的。那么提供给定时器的计数源又是从单片机的晶振经过12 分频后获得的一个脉冲源。一个12m 的晶振,它提供给计数器的脉冲时间间隔,1us。 3. 计数器溢出后会使得tf0 由“0”变为“1”,(,一旦tf0

12、由“0”变为“1”,就是产生了变化,产生了变化就会引发事件,就象闹钟的定时时间一到,会使tf0 由“0”变为“1”。4. 51 系列单片机的计数器是16 位的,也就是最大的计数值范围是0-65535 ,因此计数器计到65535 就会产生溢出。提示:如果是一个空的盆要1 万滴水滴进去才会满,我们在开始滴水之前就预先放入一勺水,还需要1 万滴嘛?单片机计数也是如此,如果我要计5000 个脉冲,就先放进60535 个,再来5000 个,不就到了65535 了吗?定时器同样如此,每个脉冲是1 微秒,则计满65536 个脉冲需时65.536 毫秒,但现在我只要10 毫秒就可以了,10 个毫秒为10000

13、 微秒,所以,只要在计数器里预先放进55536 就可以了,这种计数方法我们把它称之为预置数计数法。5. 单片机中的定时/计数器可以有两种用途,这就需要通过定时/计数器的方式控制字(实际上就是与定时/计数器有关的特殊功能寄存器)来设置。在单片机中有两个特殊功能寄存器与定时/计数器有关,它们是tmod 和tcon,tmod 和tcon 是名称,我们在写程序时既可以直接用这个名称来指定它们,也可以直接用它们的地址89h 和88h 来指定它们。tmod 被分成两部份,每部份4 位,分别用于控制t1 和t0。tcon 也被分成两部份,高4 位用于定时/计数器,低4 位则用于中断(我们暂不管),而tf0

14、我们前面已提到了,当计数溢出后tf0 就由“0”变为“1”,计数脉冲要想进入计数器就是tr0 要为“1”,开关才能合上,脉冲才能过来,因此,tr0 我们称之为运行控制位,当要使用t0 时必须用指令setb 来置位以启动计数/定时器工作(用指令clr 可关闭定时/计数器的工作)6. 单片机的定时/计数器共有四种工作方式,下面我们分别加以介绍:工作方式0 定时/计数器的工作方式0 称之为13 位定时/计数器方式。它由tl的低5 位和th的8 位构成13 位的计数器,此时tl(0/1)的高3 位未用。请看各位的功能:(1)m1m0:定时/计数器一共有四种工作方式,就是用tmod 的m1m0 来控制的

15、,两位正好是4 种组合。(2)c/t:前面我们说过,定时/计数器既可作定时器用也可作计数器用,到底作什么用,由我们根据需要自行决定,也说是决定权在我们编程者手中。如果c/t=0 就是用作定时器(开关往上打);如果c/t=1 就用作计数器(开关往下打)。顺便提一下:一个定时/计数器同一时刻要么作定时用,要么作计数用,不能同时使用,这一点请大家注意。(3)gate:当我们选择了定时/计数器工作方式后,定时/计数脉冲却不一定能到达计数器端,中间还有一个开关,很显然如果这个开关不合上,计数脉冲就没法通过,那么开关什么时候合上呢?它有两种情况:agate=0 ,分析一下逻辑,gate “非”后是“1”,

16、进入“或”门,“或”门总是输出“1”,和“或”门的另一个输入端int0(中断0,什么是中断,先不去管它)无关,在这种情况下,开关的打开、合上只取决于tr0,只要tr0=1,开关就合上,计数脉冲得以畅通无阻;而如果tr0=0 则开关打开,计数脉冲无法通过,因此定时/计数是否工作,在这里只取决于tr0。bgate=1 ,在这种情况下,计数脉冲通路上的开关不仅要由tr0 来控制,而且还要受到int0 引脚的控制,只有tr0=1,且int0 也是高电平,开关才能合上,计数脉冲才得以通过。工作方式1 工作方式1 是16 位的定时/计数器方式,将tmod 的m1m0 设为“01”即可,其它特性与工作方式0

17、 相同.工作方式2 要计5000 个数,可是16 位的计数器要计到65535 才溢出,先在计数器里放上60535 个,再来5000 个脉冲,是的,但是计满了之后,计数总是不断重复的,流水线上计满后马上又要开始下一次计数,下一次的计数还是5000 吗?当计满并溢出后,计数器里面的值又变成了“0”,因此下一次将要计满65535 后才会溢出,当然办法很简单,就是每次一溢出时执行一段程序,可以在这段程序中做把预置数60535 送入计数器中的工作。所以采用工作方式0 或1 都要在溢出后做一个重置预置数的工作,做工作当然就得要时间,一般来说这点时间不算什么,可是有一些场合我们还是要计较的,所以就有了工作方

18、式2-自动再装入预置数的工作方式。要自动装入预置数,它放在t0(或t1)的高8 位中,在工作方式2 中,只有低8 位参与计数,而高8 位是不参与计数的,用作预置数的存放,这样计数范围就小了每当计数溢出,就会打开t0(或t1)的高、低8 位之间的开关,预置数就进入低8 位。当然这是由硬件自动完成的,通常工作方式2 用于波特率发生器(我们将在下册的串行接口中讲解),对于这种用途,定时器就是为了提供一个时间基准,计数溢出后不需做任何的事情,要做的仅仅只有一件,就是重新装入预置数,再开始计数,而且中间不能有任何的延迟,可见这个任务用这种工作方式来完成是最妙不过了。工作方式3 在这种工作方式下,t0 被

19、拆成2 个独立的定时/计数器来用。其中,tl0 可以构成8 位的定时器或计数器工作方式;而th0 则只能作为定时器用,我们知道定时/计数器使用时需要有控制,计满后溢出需要有溢出标记,t0 被分成两个来用,那就要两套控制及溢出标记了,tl0 还是用原来的t0 的标记,而th0 则借用t1 的标记.在一般情况下,只有在t1 以工作方式2 运行时,才让t0 工作于方式32.1.3 80c51的中断系统1.mcs-51的对中断的开放和屏蔽是由中断允许寄存器ie控制来实现的,ie的结构格式如下。eaeset1ex1et0ex0ea:中断总控制位,ea=1,cpu开放中断。ea=0,cpu禁止所有中断。e

20、s:串行口中断控制位,es=1允许串行口中断,es=0,屏蔽串行口中断。et1:定时/计数器t1中断控制位。et1=1,允许t1中断,et1=0,禁止t1中断。ex1:外中断1中断控制位,ex1=1,允许外中断1中断,ex1=0,禁止外中断1中断。et0:定时/计数器t0中断控制位。et1=1,允许t0中断,et1=0,禁止t0中断。ex0:外中断0中断控制位,ex1=1,允许外中断0中断,ex1=0,禁止外中断0中断。2.mcs-51有两个中断优先级,即高优先级和低优先级,每个中断源都可设置为高或低中断优先级。如果有一低优先级的中断正在执行,那么高优先级的中断出现中断请求时,cpu则会响应这

21、个高有限级的中断,也即高优先级的中断可以打断低优先级的中断。而若cpu正在处理一个高优先级的中断,此时,就算是有低优先级的中断发出中断请求,cpu也不会理会这个中断,而是继续执行正在执行的中断服务程序,一直到程序结束,执行最后一条返回指令,返回主程序然后再执行一条指令后才会响应新的中断请求。 为了实现上述功能,mcs-51的中断系统有两个不可寻址的优先级状态触发器,一个指出cpu是否在执行高优先级中断服务程序,另一个指出cpu是否正在执行低优先级的中断服务程序,这两个中断触发器的1状态分别屏蔽所有中断申请和同一级别的其他中断申请,此外,mcs-51还有一个申请优先级寄存ip,ip的格式如下,字

22、节地址是b8h。pspt1px1pt0px03.中断请求标志位在中断系统中,选择哪种触发方式,由tcon和son的相应为规定。tcon和scon都属于特殊功能寄存器,字节地址分别为88h和89h.tcon是定时/计数器控制寄存器,它锁存2个定时/计数器的溢出中断标志和外部中断int0非和int1非的中断标志,与中端有关的各位定义为。tf1tr1tf0tr0ie1it1ie0it0it0=0,外部中断0为电平触发方式,it0=1外部中断为边缘触发方式。ie1:外部边沿触发中断1请求标志,其功能和操作类似于tf0。it1:外部中断1类型控制位,通过软件设置或清楚,用于控制外中断的触发信号类型。it

23、1=1,边沿触发。it=0是电平触发。ie0:外部边沿触发中断0请求标志,其功能和操作类似于ie1。it0:外部中断0类型控制位,通过软件设置或清楚,用于控制外中断的触发信号类型。其功能和操作类似于ie1。tf0:t0溢出中断请求标志位tf1:t1溢出中断请求标志位4.中断的响应mcs-51cpu在每一个机器周期顺序检查每一个中断源,在机器周期的s6按优先级处理所有被激活的中断请求,此时,如果cpu没有正在处理更高或相同优先级的中断,或者现在的机器周期不是所执行指令的最后一个机器周期,或者cpu不是正在执行reti指令或访问ie和ip的指令(因为按mcs-51中断系统的特性规定,在执行完这些指

24、令之后,还要在继续执行一条指令,才会响应中断),cpu在下一个机器周期响应激活了的最高级中断请求。 中断响应的主要内容就是由硬件自动生成一条长调用lcall addr16指令,这里的addr16就是程序存储器中相应的中断区入口地址,这些中断源的服务程序入口地址如下:中断源中断标志中断服务程序入口优先级顺序外部中断0ie00003h高定时计数器t0tf0000bh外部中断1ie00013h定时计数器t1tf1001bh串行口ri/ti0023h低生成lcall指令后,cpu紧跟着便执行之.首先将pc(程序计数器)的内容压入堆栈保护断点,然后把中断入口地址赋予pc,cpu便按新的pc地址(即中断服

25、务程序入口地址)执行程序。 值得一提的是,各中断区只有8个单元,一般情况下(除非中断程序非常简单),都不可能安装下一个完整的中断服务程序。因此,通常是在这些入口地址区放置一条无条件转移指令,使程序按转移的实际地址去执行真正的中断服务程序。2.1.4 蜂鸣器的介绍1蜂鸣器buzzer的介绍 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 2蜂鸣器buzzer的分类 蜂鸣器buzzer主要分为压电式蜂鸣器(piezoelectric buzzer)和电磁式蜂鸣器(magnetic tra

26、nsducer)两种类型。 3蜂鸣器buzzer的电路图形符号 蜂鸣器buzzer在电路中用字母“h”或“ha”旧标准用“fm”、“lb”、“jd”等)表示。2蜂鸣器buzzer的结构原理(1) 压电式蜂鸣器(piezoelectric buzzer) 压电式蜂鸣器主要由(多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等)组成。有的压电式蜂鸣器外壳上还装有发光二极管。 多谐振荡器由晶体管或集成电路构成。当接通电源后(1.515v直流工作电压),多谐振荡器起振,输出1.52.5khz的音频信号,阻抗匹配器推动压电蜂鸣片发声。 压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银

27、电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。 (2) 电磁式蜂鸣器(magnetic transducer) 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。 接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。 (3) 蜂鸣器buzzer发声原理 是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的4. 选择蜂鸣器时需要关注的几个指标(1) 是有源的还是无源的,这决定了你是否需要再设计外部驱动电路;(2)是贴片的还是直插的,这决定了你该设计什么样的封装;(3)工作电压和工作电流,这决定的该部

28、分电路的供电电压和能耗;(4)工作温度,这决定了你设计的产品只能在什么环境下工作;(5)声强级和声音频率,这决定发出什么样的声音以及声音有多响2.1.5 dip 双列直插式封装80c51单片机采用双列直插式dip,qf44和lcc形式封装。dip(dualinline package)是指采用双列直插形式封装的集成电路芯片,绝大多数中小规模集成电路(ic)均采用这种封装形式,其引脚数一般不超过100个。封装材料有塑料和陶瓷两种。采用dip封装的cpu芯片有两排引脚,使用时,需要插入到具有dip结构的芯片插座上。当然,也可以直接插在有相同焊孔数和几何排列的电路板上进行焊接。dip封装结构形式有:

29、多层陶瓷双列直插式dip,单层陶瓷双列直插式dip,引线框架式dip(含玻璃陶瓷封接式,塑料包封结构式,陶瓷低熔玻璃封装式)等。dip封装具有以下特点:1.适合在pcb (印刷电路板)上穿孔焊接,操作方便。2.比to型封装易于对pcb布线。3.芯片面积与封装面积之间的比值较大,故体积也较大。以采用40根i/o引脚塑料双列直插式封装(pdip)的cpu为例,其芯片面积/封装面积=(33)/(15.2450)=1:86,离1相差很远。(ps:衡量一个芯片封装技术先进与否的重要指标是芯片面积与封装面积之比,这个比值越接近1越好。如果封装尺寸用途:dip是最普及的插装型封装,应用范围包括标准逻辑ic,

30、存贮器lsi,微机电路等。intel公司早期cpu,如8086、80286就采用这种封装形式,缓存(cache )和早期的内存芯片也是这种封装形式。2.1.6 三极管半导体三极管也称为晶体三极管,可以说它是电子电路中最重要的器件。它最主要的功能是电流放大和开关作用。三极管顾名思义具有三个电极。二极管是由一个pn结构成的,而三极管由两个pn结构成,共用的一个电极成为三极管的基极(用字母b表示)。其他的两个电极成为集电极(用字母c表示)和发射极(用字母e表示)。由于不同的组合方式,形成了一种是npn型的三极管,另一种是pnp型的三极管。三极管的种类很多,并且不同型号各有不同的用途。三极管大都是塑料

31、封装或金属封装,常见三极管的外观,有一个箭头的电极是发射极,箭头朝外的是npn型三极管,而箭头朝内的是pnp型。实际上箭头所指的方向是电流的方向。 2.2 工作原理及原理图单片机的p0.2引脚通过限流电阻r与三极管基极相接,三极管的集电极接有蜂鸣器。当单片机的p0.2引脚电平为0时,三极管导通,蜂鸣器有电流流过;当p0.2电平为1时三极管截止,蜂鸣器没有电流流过。这样,在蜂鸣器的两端就会出现波动的电流,波动的电流就会使蜂鸣器发声。2.3 列出元器件单序号元件名称规格数量189c51单片机at89s521个2晶振12 mhz立式1个3起振电容30 pf瓷片电容2个4复位电容22uf 16v电解电

32、容1个5电阻100 1k 4.7k各1个6三极管90121个7蜂鸣器81个8dip封装插座40 脚集成插座1个9万能板150mm*90mm1块3 软件设计3.1演奏原理3.1.1如何产生音乐频率:1.要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2, 即为半周期的时间,然后利用计时器计时此半周期时间,每当计时到后就将输出脉冲的i/o反相,然后重复计时此半周期时间再对i/o反相,如此就可在i/o 脚上得到此频率的脉冲.2.利用8051的内部计时器让其工作在计数模式mode1下,改变计数值th0及tl0以产生不同的频率.3.例如以6mhz晶振为例:要产生频率为523hz,其周

33、期t= 1/523= 1912us, 其半周期为1912/2=956us,因此只要令计数器计时956us/1us=956.所以在每计数956次时将i/o反相,就可得到中音do(523hz).计数脉冲值与频率的关系公式如下:以12mhz晶振为例,故其频率为500000hz4.其计数值的求法如下:t=(2*16-x)tcy例如:求低音do(262hz),中音do(523hz),高音do(1046hz) 的计数值?x=2*16-(t/tcy)低音do的 x=65536-250000/262=64582中音do的 x=65536-250000/523=65058高音do的 x65536-250000/

34、1047=652975. c调各音符频率与计数值t的对照表:音符频率hz12mhz 十六进制值低1do262f894h中1do523fc4ah高1do 1046 fe2ah低2re294f95ch中2re587fcaeh高2re1175 fe5ch低3m 330fa1ah中3m 659fd08h高3m 1318 fe84h低4fa349 fa6ah中4fa 698 fd30h高4fa 1397 fe98h低5so 392 fb00h中5so 784 fd80h高5so 1568 fec0h低6la 440 fb8ch中6la 880 fdc6h高6la 1760 fee8h低7si 494 f

35、c0eh中7si 988 fe02h高7si 1967 ffo6h3.1.2 如何产生节拍:每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,如果1拍节为0.4秒则1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间,再来我们假设1/4拍为1 dely单位,则1拍应为4个dely,以此类推,只要求得1/4拍的dely 单位时间,其余的节拍就是它的倍数.1/4拍的延迟时间=187亳秒delay:mov r7,#02 ;延时187ms子程序d2:mov r6,#187d3:mov r5,#248djnz r5,$djnz r6,d3djnz r7,d2ret ;延时子程序返

36、回3.1.3 歌谱3.1.4 建立步骤1先把乐谱的音符找出,然后根据表给出的定时值按乐谱的音符顺序建立编码表table.定时值为十六进制4位数,拆分成两组,前组装入定时器的高位th0,后组装入定时器的低位tl0。程序中将进行两次查表来完成一个音符对应的定时处值的装入。2 在程序中使用定时器t0方式1来产生歌谱中个音符对应的频率的音频脉冲,有p3.4输出再经三极管将信号放大后驱动蜂鸣器发出不同音节的声音。3 程序中节拍的控制是通过延时子程序delay的次数来实现,1拍为748ms3/4拍需要调用3次delay;2/4拍需要调用两次delay。4 节拍的控制码在表table中位于音符码的后面。如“

37、db 0fdh,80h,30h,”中,0fdh和80h是音符5的音符码,其后面的03h是节拍码,即3/4拍的时间。3.2程序设计3.2.1程序流程图开始初始化设置定时器初值存入乐谱代码读取音符(定时常数)a=ffh?读取节拍(延时常数)延时常数存入r2调用延时子程序结束yesnor2=0?yesno主程序t0重装定时值p0.2输出返回3.2.3 程序01 org ooooh ;主程序起始地址02 jmp start ;跳转至主程序03 org 000bh ;定时器t0中断入口 04 jmp ext0 ; 跳转至t0中断子程序05start: move tmod,#00000001bh ;设置t

38、0方式106 mov ie,#10000010b ; 允许t0中断07 mov dptr,#table ; 存表首地址08 loop: clr a ;清零09 movc a,a+dptr ;查表10 mov r1,a ;定时器高八位存入r111 inc dptr ;指针加112 clr a ;清零13 movc a,+dptr ;查表14 mov r0,a ;定时器低八位存入r015 orl a,r1 ;进行或运算16 jz next0 ;全零为休止符17 mov a,r0 18 anl a,r1 ;进行运算19 cjne a,#0ffh,next ;全1表示乐曲结束20 jmp start

39、;从头开始循环演奏21 next:mov tho,r1 ;装入高位定时值22 mov tlo,r0 ;装入低位定时值23 setb tr0 ; 启动定时器t024 jmp ne ;跳转到next1处25 lr tl0 ;关闭定时器,停止发音26 next1:clr a ;清零27 rnc dpttr ;指针加一28 movc a,a+dptr ;查延时常数29 mov r2,a ;延时常数存入r230 loop1:acall delay ;调用延时子程序31 dejnz r2 loop1 ;控制延时次数32 inc dptr ;指针加一33 jmp loop ;跳转到loop处34 ext0:

40、 mov th0,r1 ;重装定时值35 mov tl0,r0 36 cpl p0.2 ;反向输出37 reti 38 delay:mov r7,#02 ;延时187ms子程序39 d2:mov r6,#18740 d3:mov r5,#24841 djnz r5,$42 djnz r6,d343 djnz r7,d244 ret ;延时子程序返回45 table:db 0fdh,80h,03h,0fdh,80h,01h ;编码表46 db 0fbh,0c6h,04h,0fdh,80h,04h 47 db 0feh,2ah,04h,0feh,02h,04h48 db 00h,00h,04h49

41、 db 0fbh,80h,03h,0fdh,80h,01h50 db 0fdh,0c6h,04h,0fdh,80h,04h51 db 0feh,5ch,04h,0feh,2ah,04h52 db 00h,00h,04h53 db 0fdh,80h,03h,0fdh,80h,01h54 db 0feh,0c0h,04h,0feh,84h,04h55 db 0feh,2ah,04h,0feh,02h,04h56 db 0fdh,0c6h,04h57 db ofeh,98h,03h,0feh,98h,01h58 db 0feh,84h,04h,0feh,2ah,04h59db ofeh,5ch,04h,0feh,2ah,04h60 db 00h,00h,04h61 db 0ffh,0ffh ;结束码62 end ;程序结束程序分析解释0104:设定入口地址。其中定时器中断时从标号ext0处进入中断子程序。0507:设置定时器t0为方式1,并允许t0中断。其中07行语句将表table的首地址存入数据指针寄存器dptr中。0810:第一次查表,取出表中的第一个码,及乐谱中的第一个音符5的定时常数fd80h

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论