《单片机音乐发生器毕业设计说明书1.doc》由会员分享,可在线阅读,更多相关《单片机音乐发生器毕业设计说明书1.doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目 录摘 要1第1章 绪论2第2章 音乐基础知识32.1 音乐基础32.2 音频脉冲和音乐节拍的实现32.2.1 音频脉冲的产生32.2.2 音乐节拍的产生5第3章 系统方案设计6设计任务63.2 设计目的63.3 设计过程63.4 设计思想63.4.1 方案设计与选择7第4章 硬件电路设计94.1 电路组成及工作原理94.1.2 工作原理94.2 AT89C52单片机介绍94.4 发声驱动电路124.5 显示电路124.6 控制电路13第5章 软件设计14程序设计145.2 程序流程图14第6章 系统调试156.1 常用调试工具15 Proteu仿真软件介绍156.1.2 Keil编译环境介
2、绍156.2 系统调试方法15结 论17致 谢18参考文献19附 录20附录1 程序清单20附录2 单片机音乐发生器电路原理图32I摘 要在电子技术日月更新、不断换代,计算机程序设计语言应用广泛,特别是单片机技术日趋发达的情况下,为了培养并增强设计自主性和动手能力强的人才,了解单片机强大的设计功能,我们进行了此次设计。为了实现一首音乐的播放,选择了用单片机来实现音乐的播放,因为它有很多优点,如:外部结构简单、实现起来比较方便等。对于单片机产生音乐,关键是控制频率的输出。我们知道,不同的声音对应不同的频率,产生有规律的频率输出就可以得到相应规律的声音。音乐中,有7个基本音符:doremifaso
3、lasi,七个不同的音符对应着不同的频率。只要我们对照音符输出相对应的频率,就可以产生美妙的音乐了。在此次设计中主要采用单片机AT89C52和一个SOUNDER(喇叭)来实现音乐的播放,在单片机AT89C52的18号和19号引脚(外接晶振端子,分别是片内反相放大器输入端、片内反相放大器输出端)上外接振荡电路,以此来提供时钟频率(时钟频率为12MHz);而P3口中的P2.0端口作为音频输出口;并同时利用P3口中、端口来控制音乐选择上一曲、下一曲及音乐播放的开始或暂停;与此同时我们还在P1口端接一个八段数码管来显示当前所放歌曲的曲数。关键词:音乐发生器;单片机音乐发生器;音乐播放器第32页第1章
4、绪论现在各种各样的音乐播放器呈现在我们面前,外观越来越精美,功能越来越多,体积越来越小,重量也越来越小、价格越来越便宜。同时,随着当代 行业的快速发展,许多 厂商为了能够吸引广大的客户受到消费者的青睐,致此他们开始研究在 上实现音乐和视频的播放,因此现在的 都能够轻松的播放音乐了。这样人们就更很容易携带,随时随地都可以听,以便来缓解人们的疲劳、压抑、愉快人们的心情等,甚至有时还可以借着音乐来抒发自己的感情,传达我们对朋友的祝福。因此,在不知不觉中它成为了人们生活的一样必需品,无论到哪里、无论什么时候都可以听到我们想听的音乐。根据现在各大学教学计划的要求,并培养学生综合运用所学的专业知识和基本技
5、能、培养学生分析问题、解决问题能力的教育过程。要求即将毕业的学生必须根据学院要求独立的做出一个毕业设计,而不同专业的学生有不同的设计题目。我们学院也不例外,由各个专业的老师出题(本专业范围内),再由学生(学生根据自身学习情况综合考虑)进行选择设计题目(同时也确定了该学生的毕业设计的指导老师),然后由独立的(可以向指导老师询问)完成。在本设计中要求用单片机实现音乐发生器,主要是利用我们常见的或是比较熟悉的单片机来实现音乐的播放。而本设计主要是利用单片机AT89C52(51系列单片机)来实现的,同是时也利用了共阴极的八段数码管及扬声器(喇叭),共同来实现音乐的播放。本设计共分为六章,第1章是绪论,
6、第2章是音乐基础知识,第3章是系统方案设计,第4章是硬件电路设计,第5章软件设计,第6章是系统调试。在实际中参照单片机相关资料,就可容易的利用单片机设计出一个音乐发生器。在设计过程中人们还可考虑用多种方法进行实现,这样不但很好的发挥了人们的创新精神,还提高了动手能力、综合分析能力及专业知识运用能力。第2章 音乐基础知识2.1 音乐基础音作为一种物理现象,是由于物体振动而产生的,振动产生的声波作用于人耳,听觉系统将神经冲动传达给大脑,进而产生听觉。人耳能听到的声音频率大约在1120000Hz,而音乐使用的音一般在274100Hz。乐音体系中各音级的名称叫做音名,被广泛采用的是C D E F G
7、A B (do re mi fa so la si则多用于歌唱,称为唱名)。乐音体系中音高关系的最小计量单位叫做半音,两个半音构成一个全音。乐音中有几十个高低不同的音,但是最基本只有这七个音,其他高、低音名都是在这个基础上变化出来的。乐谱表上用来表示正在进行的音的长短的符号,叫做音符。不同的音符代表不同的长度。音符有以下几种:全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符、六十四分音符。此外,还有附点音符,它就是指带附点的音符,所谓附点就是记在音符右边的小圆点,表示增加前面音符时值的一半。音持续的长短即时值,一般用拍数表示,休止符表示暂停发音。一首音乐就是由许多不同的音符组成的
8、,而每一个音符对应着不同的频率,这样就可以利用不同的频率的组合,加以拍数对应的延时来构成不同的音乐。2.2 音频脉冲和音乐节拍的实现2.2.1 音频脉冲的产生音乐的产生需要不同频率的音频脉冲,对于单片机而言,可以利用它的定时/计数器产生这样的方波频率信号。在本设计中,单片机工作在12MHz时钟频率下,其时钟周期为1us,因此可以利用AT89C52的内部定时/计数器T0,使其工作模式为1,根据对应音符的不同频率求出计数器的初值T(即是TH0和TL0的值),则TH0=T/256,TL0=T%256。C调各音符频率与计数值T的对照如下表2-1所示。表2-1 C调各音符频率与计数值T的对照表音符频率(
9、Hz)简谱码(T)音符频率(Hz)简谱码(T)低1D026263628#4FA#74064860#1D0#27763731中5SO74864898低2RE29463835#5S0#83164934#2RE#31163928中6LA88064968低3M33064021#6LA#93264994低4FA34964103中7S198865030#4FA#37064185高1DO104665058低5SO39264260#DO#110965085#5S0#41564331高2RE117565110低6LA44064400#2RE#124565134#6LA#46664463高3M131865157低
10、7S149464524高4FA139765178中1DO52364580#4FA#148065198#1D0#55464633高5SO156865217中2RE57864684#5SO#166165235#2RE#62264723高6LA176065252中3M65964777#6LA#186565268中4FA69864820高7SI1967652832 音乐节拍的产生节拍是指音乐持续的长短,是除音符之外音乐的另一关键组成部分,在单片机系统中可以通过延时来实现。如果1/4拍的延时设为0.2s,则1拍的时间为0.8s,依次类推,可以求出其余节拍的值,节拍的延时时间与音乐的曲调值有相对应的关系,
11、下面为不同曲调下的1/4和1/8节拍的时间设定,如下表2-2所示。表2-2 不同曲调下1/4和1/8节拍的延时表曲调值(1/8节拍)delay(ms)曲调值(1/4节拍)delay(ms)调4/462调4/4125调3/494调3/4187调2/4125调2/4250第3章 系统方案设计3.1设计任务设计一音乐发生器:(1)用单片机作为开发工具,至少能储存3首乐曲;(2)能按键选择乐曲序号,每按一次加1键乐曲序号加1,每按一次减1键乐曲序号减1;(3)用LED数码管显示正在播放的乐曲序号;(4)能进行仿真音乐发生器。3.2 设计目的(1)培养学生怎样将综合的理论知识与实际相结合起来的能力(2)
12、培养学生分析问题、解决问题的能力(3)锻炼学生独立、自学的能力及其动手能力 设计过程在毕业设计题目选择后,我积极的查阅相关资料。经过分析、思考及其指导老师的悉心的指导,我最终设计出了三种方案,并对每一种方案进行分析与考虑及各个方案的比较,选择了第一种方案用AT89C52单片机、一个共阴极的八段数码管及扬声器来实现音乐的播放。确定好设计方案后,将整个设计分成了三个步骤:一是,设计的硬件电路图的绘制;二是,程序的设计;三是,硬件电路仿真与程序的编译、连接及运行。3.4 设计思想在此次设计中,我查阅了很多相关资料并经过分析、思考得到了以下三种方案。它们分别是:用AT89C52单片机、一个共阴极的八段
13、数码管及扬声器实现音乐发生器,用单片机AT89C51、LM386(音频功放)和扬声器实现音乐发生器,用单片机AT89C52和扬声器实现音乐发生器,但经过我自己的分析总结,最后选择了第一种方案。3.4.1 方案设计与选择 方案一 用单片机AT89C52实现音乐发生器主要运用AT89C52单片机和一个扬声器两个器件组成。在AT89C51单片机外部端子上接晶振电路,单片机的工作时钟为12MHz,将P3口的P3.7引脚作为音频输出口直接送给喇叭,再通过程序设计的来计算出将要播放的歌曲的长度,然后在计算出从该首歌中所取出来的音符的长度,在将该音符通过一系列的控制后实现了该音符的播放,在利用延时来实现该音
14、符播放的长度,在该音符播放完后接着取下一个音符,就这样反复的取出下一个音符,从而实现了乐曲的播放。该方案具体的、详细的电路图设计如图3-1所示。图3-1 方案三的电路图方案二 用单片机AT89C51和LM386(音频功放)实现音乐发生器主要运用AT89C51单片机、音频功放芯片(LM386)和扬声器三部分组成。此方案中电路原理图也是由两部分组成:一是ATMEL公司的AT89C51单片机外接晶振电路(单片机的工作时钟12MHz)及复位电路来实现的;二是美国国家半导体公司的音频功率放大器(LM386)电路。将单片机AT89C51的P0.0作为音频脉冲输出脚,输入到由LM386组成的音频功放电路中,
15、经过处LM386处理后,从LM386的输出引脚,经过补偿网络(与扬声器相并)主要是为了防止高频自激和过压现象,再输入到扬声器中,这样单片机发出的不同频率的音频信号就可以通过扬声器发出我们所想要的乐曲。该设计方案的硬件电路图的设计如下所示,如图3-2所示。图3-2 方案二的电路图方案三 用AT89C52单片机、八段数码管及扬声器来实现音乐发生器主要运用单片机AT89C52、一个共阴极的八段数管及扬声器三部分组成。它的主要思想就是将定时器0用于定时,作音符发生器用;定时器1用计数,这里用作中断;同时将所要播放的歌曲存放在指定的地址单元中,单片机来直接驱动扬声器来实现音乐的播放。同时还添加了数码管显
16、示即所播放的歌曲的曲目数显示,还添加了实现上一曲、下一曲、开始/暂停的功能,就能够选择所要的乐曲了。综合以上三种方案都可以实现音乐的播放,比较三种设计方案来说:从电路原理图实现相对来说三种方案之中的第一方案比较简单,但是它没有实现音乐播放的其他功能,只能够循环的播放你所存储的音乐。而第二方案与第一方案大同小异,用的单片机不同一个是AT89C51、另一个是AT89C52,并同时方案了利用了一个音频功放电路来放大输入的脉冲信号,这样就比第一方案中产生的音乐好听了。第三方案是用单片机AT89C52、一个共阴极的八段数码管及扬声器,再利用开关按钮来控制音乐播放的开始/暂停、上一曲及下一曲,同时将所播放
17、的乐曲的曲目在八段数管电理工作显示。因此,在此次设计中我选择了第三种方案来实现音乐发生器,单片机音乐发生器电路图见附录2所示。第4章 硬件电路设计4.1 电路组成及工作原理.1 电路组成对于整个设计的电路由单片机、显示电路、驱动发声电路及歌曲播放控制电路等部分组成,其组成框图如图4-1所示,其中单片机AT89C52主要是将各个模块连接起来并控制各个模块;时钟电路则是用来产生时钟频率,一般是12MHz;复位电路则是能够将当前状态变为初始状态;歌曲的曲数显示电路主要是显示当前所播放的歌曲的曲目数;驱动发声电路则是来播放音乐的;歌曲播放控制电路则是来控制歌曲的播放/暂停和选择歌曲;而整个电路组成框图
18、则是用来显示播放歌曲的曲目数同是控制歌曲的选择及音乐的播放。AT89C52单片机时钟电路复位电路显示电路发声驱动电路控制电路图4-1 电路组成框图 工作原理利用单片机AT89C52直接来产生音频脉冲来驱动喇叭来完成音乐的播放 。利用了该单片机的内部定时器/计数器T0来定进行定时,同时利用定时器/计数器T1用业计数,并同时利用了该单片机的P2口的P2.0来作为音频脉冲的输出端。4.2 AT89C52单片机介绍 AT89C52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的只读程序存储器(PEROM)和蔼可亲256 bytes的随机存取数据存储器(R
19、AM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C52单片机适合于许多较为复杂控制应用场合,如图4-2所示。图4-2 AT89C52引脚图1、主要性能参数 与MCS-51产品指令和引脚完全兼容 8k字节可重擦写Flash闪速存储器 1000次擦写周期 全静态操作:0Hz24MHz 三级加密程序存储器 2568字节内部RAM 32个可编程I/O口线 3个16位定时/计数器 8个中断源 可编程串行UART通道低功耗空闲和掉电模式2、引脚功能 Vcc:电源电压 GN
20、D:接地 P0口:P0口是一个8位双向I/O接口,也即地址/数据总线复用口。在访问外部数据存储器时,这组口线分时转换地址(低8位)和数据总线复用。 P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”通过内部的上拉电阻把端口拉到高电平时,此时可作输入口。 P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。在访问外部存储器时,P2口送出高8位地址数据。 P3口:P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下表4-1所示。表4-1 P3口
21、的第二功能表端口引脚第二功能RXD (串行输入口)TXD (串行输出口)INT0 (外中断0)INT1 (外中断1)T0 (定时/计数器0)T1 (定时/计数器0)WR (外部数据存储器写选通)RD (外部数据存储器读选通) RST:复位信号输入端。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。 /PROG:地址锁存有效信号输出端。当访问片外部存储器时,ALE(地址锁存允许)输出脉冲用于位锁存低8地址 :程序存储允许输出端。是片外程序存储器的读选通信号。 /Vpp:行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,这必须是该器件是使
22、用12V编程电压Vpp。 XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。 XTAL2:振荡器反相放大器的输出端。通过XTAL1、XTAL2外接晶振后,即可构成自激振荡器,驱动内部时钟发生器向主机提供时钟信号。在AT89C52片内存储器中,80H-FFH共128个单元为特殊功能寄存器(SFR),其中包括B寄存器、累加器、程序状态寄存器(PSW)、定时/计数器控制、中断优级控制寄存器(IP)、P3口锁存寄存器、中断允许控制寄存器(IE)、串行口控制寄存器等。它们可运用来设置片内电路的运行方式,记录电路的运行状态,MCS-51单片机对特殊功能寄存器采取与片内RAM统一编址的方法,可按字节地
23、址直接寻址。 发声驱动电路主要是采用一个三极管来驱动扬声器来产生音乐。在单片机的P2的端子上连接发声驱动电路,其中要先连接一个10k的电阻主要是用业限制电流过大,然后连接一个三极管来驱动扬声器以致放出的音质较好,再连接扬声器,因为用到一个扬声器所以就可以不能区分它的正负极性了,它的电路框图如4-3图所示。图4-3 发声驱动电路 显示电路显示部分主要是由一个共阴极的八段数码管和八个限流电阻共同来组成的。它们接在AT89C52单片机P1口上,用一组电阻都为220、330或100来对P1口输出的电压进行分流,从而来确定了八段数码管拥有正常的电压,不会因电流过大而被烧坏。这样数码管就可以正常显示所播放
24、的歌曲的曲目数了,具体的显示器电路图如图4-4所示。图 4-4 显示电路 控制电路这部分电路主要是用来控制歌曲的播放/暂停及选择。采用了三个按钮来进行控制来实现歌曲播放的上一曲、下一曲及开始/暂停的功能,同时还接一个上拉电阻,它的阻值一般是5.1k、4.7k、10k三个阻值,共同实现了音乐播放歌曲的控制。如图4-5所示。图4-5 控制电路图第5章 软件设计5.1程序设计详细的程序设计见附录15.2 程序流程图如图5-1所示。开 始设置歌曲的入口地址及对变最初始化判断按键的值及歌曲是否播放?结束图5-1 主程序图第6章 系统调试 常用调试工具 Proteu仿真软件介绍Proteu仿真软件用来画硬
25、件电路原理图,在其中我们可以同时调用各样的单片机,但是其中存放的是普通的单片机可能不存在我们所要的芯片,因此我们也可以用Auto CAD或protel 99来画此硬件电路图,而我在此次设计中采用了Proteu这个软件。在画图过程中一定要注意的是,元器件之间的连接线不可以是非线一定要导线,因此完成电路图后再调试这个硬件电路是否能实现它的功能。具体的操作是打开电路原理图后双击单片机芯片在弹出的对话窗口中把我们在keil编译软件中编译生成的后缀名为.hex文件调入其中,而该单片机的工作时钟频率我们可以在此改变,设置好后点击OK就可以了,再点击原理图左下角的运行就可以正常运行了,若要暂停或是恢复则点击
26、相应的按钮就好了。6. Keil编译环境介绍Keil编译软件用来编程,可以用汇编语言也可以用C语言来进行编程实现某些功能。当打开keil后,首先新建一个项目保存在相应位置,后再新建一个文本,将你已经编好的程序复制到这个文本中或是在这个文本进行编写程序,之后一再将其保存为一个以.Asm或是.c作为后缀名的文本,再在我们建立的组中将程序文件添加到工程中,再经过编译,然后生成.Hex文件再编译,若提示没有出现错误errors(不含警告warnings)则说明调试成功,反之则应该对程序进行检查分析,直到调试成功为止。6.2 系统调试方法(1)打开电路仿真的应用程序ISIS Professional,在
27、其中选择该设计所需的的单片机或是元件,然后将其放置到要画图的区域中,你可以双击该元件改变它相应的属性及参数。2、用带电气性的连接线来连接各个元件,从而构成了完整的电路图并保存在为.DSN为后缀名的文件,放在你所需的地方。3、打开程序仿真或调试应用程序Keil uVision2, 首先要建一个工程,再将程序添加到该工程中,再保存。4、再进行程序的编译与连接,检查程序是否正确,如果不正确,则进行分析直到正确为止;如果正确,则可以生成.hex文件。5、点击project菜单,选择options for target项或是直接点击常用工具栏中的图标打开对话框进行设置, 则就可以生成.hex文件了。6、
28、再打开电路仿真的应用程序ISIS Professional,然后双击该电路图中的主的单片机,同时弹出一个对话框,在对话框中进行选择所生成的.hex文件,并还可以进行单片机的频率设置,再单击确定。7、点击运行检查是否可以运行正确。结 论通过这次比较完整的单片机音乐发生器的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,同时也提高我查阅文献资料、设计规范以及电脑画图等其他专业能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富,并且意志品质力。这是我们都希望看到的也正是我们进行毕业设计的目的所在。在此
29、次设计中我学到了很多东西,包括对单片机的更进一步的认识、一些关于音乐的基础知识的了解、汇编语言的应用的学习等等。首先,在这次毕业设计中,通过上网或、图书馆或是上书店翻阅相关的单片机资料,同时也在帮同学查看和解决一些问题(毕业设计中的硬件问题)时,更加清楚地认识了单片机,让在我原来的硬件基础知识的基础上又认识了解几款单片机(AT89S52)及它的原理。其次,就是在此次毕业设计中关系到了音乐的一些基础知识,音乐是由不同的音符组成,不同的音符对应着不同的频率产生,产生有规律的频率乐音。了解音乐的产生,音乐体系中中音高关系的最小计量单位及音符的定义,同时也知道了音符又分为了以下几种:全音符、二分音符、
30、四分音符、八分音符、十六分音符、三十二分音符、六十四分符。最后,让我感受最大的是将理论和实践相结是要解决很多问题经过一定的挫折才能很好的完成任务,因此在其过程中考虑问题时一定要谨慎、全面,出现问题时不应该气馁,要沉着思考或是向同学、老师请求帮忙。只要坚持不懈我们就一定能克服任何困难完成任务。参考文献1 樊明龙、任丽静.单片机原理与应用.化学工业出版社,20012 谢嘉奎.电子线路.高等教育出版社,20023 马家辰、孙玉德.MCS-51单片机原理及接口技术. 哈尔滨工业大学出版社,20014 李华.MCS-51单片机接口技术与运用.北京航天航空大学出版社,20035 胡汉才.单片机接口技术与运
31、用.清华大学出版社,20016 何立民.单片机高级教程.北京航空航天大学出版社,2001 7 赵晓安.MCS-51单片机原理及应用.天津大学出版社,2001.3 8 李广第.单片机基础.北京航空航天大学出版社,1999 9 徐惠民、安德宁.单片微型计算机原理接口与应用. 北京邮电大学出版社,1996 10 夏继强.单片机实验与实践教程.北京航空航天大学出版社,2001 附 录附录1 程序清单OUT BIT P2.0 N EQU 3 ;歌曲总数OUT_NUM EQU P0 ;数码管显视当前所放歌曲曲数 ORG 0000H AJMP MAIN ORG 0003H AJMP LAST_SONG ;外
32、部中断0用于接上一曲歌按键 ORG 000BH AJMP F_T0 ;定时器0用于定时,作音符发生器用 ORG 0013Hq4: AJMP NEXT_SONG ;外部中断1接下一曲歌按键 ORG 001BH AJMP START_PAUSE ;定时器1用计数,这里用作中断,接开始/暂停键,初值为0ffH,方式2 ORG 0030HMAIN: MOV SP,#60H MOV DPTR,#TABLE ;DPRT指向每首歌曲的入口地址的地址。 MOV R0,#30H ;R0中存入数据30H,这里在以30H开始的单元存放每首歌曲的入口地址,其中30H,31H存放歌曲的节拍入口地址,32H,33H存放歌
33、曲音符入口地址,每首歌占用四个存储存单元。 MOV R5,#00H ;R5中存放表TABLE中正在执行操作的序号 MOV R6,#1 ;R6存放正在设置入口信息的歌曲数SET_TAB: MOV A,R5;设置每首歌曲的入口信息,存放在以30H开始的存储单元中。 MOVC A,A+DPTR MOV R0,A INC R5 INC R0 MOV A,R5 MOVC A,A+DPTR MOV R0,A INC R5 INC R0 MOV A,R5 MOVC A,A+DPTR MOV R0,A INC R0 INC R5 MOV A,R5 MOVC A,A+DPTR MOV R0,A INC R0 I
34、NC R5 INC R6 ;设置完一首歌曲后,歌曲数加一 CJNE R6,#N+1,SET_TAB是否设置完,没有便继续,否则进行下面的操作 ;*对中断,计数器的相关参数进行设置 MOV TMOD, #61H ;计数器0工作方式1,计数器1工作方式2 MOV TH1,#0FFH;给计数器1置初值0FFH,又由于是工作方式2,所以 MOV TL1,#0FFH;计数器计数为1,相当于一外部中断。 SETB ET1;允许计数器1中断 SETB ET0 ;允许计数器具0中断 CLR PT0 ;计数器0为低优先级 SETB PT1;计数器1为高优先级 SETB IT0 ;外部中断0为跳沿触发 SETB
35、PX0 ;高优先级 SETB IT1 ;外部中断1为跳沿触发 SETB PX1 ;高优先级 SETB EX1 ;允许外部中断1中断 SETB EX0 ;允许外部中断定0中断 SETB EA ;开中断总开关 SETB TR1 ;定时器1开始工作,作中断用 SETB OUT ;音频输出端口初始化 ;* ;设置结束 CLR F0 ;设置F0=0,用来作暂停/播放的标置位用 MOV 22H,#01H ;22H单元中存放正在播放的歌曲编号 MOV DPTR,#OUT_TAB ;将正在播放的歌曲编号送数码管显视 MOV A,22H MOVC A,A+DPTR MOV OUT_NUM,A MOV R7,#0
36、0H ;R7中存放歌曲总信息的入口地址 START0:MOV R4,#00H ;R4存放当前正在播放歌曲的第几个节拍数 MOV R0,#30H ;30H开始的单元中存放歌曲的入口信息 MOV A,R7 ;将歌曲的节拍表的入口地址送到DPTR ADD A,R0 MOV R0,A MOV DPH,R0 INC R0 MOV DPL,R0 INC R0 MOV A,R4 INC R4 MOVC A,A+DPTR ;取出第一节拍数,其实第一个节拍不是歌曲的第一个节拍,而是表示几分音符;* MOV 26H,A;将取出的音符数+节拍数保存在职26H单元中NEXT: MOV R0,#30H ;开始取出歌曲的
37、第一个数据 MOV A,R7 ADD A,R0 MOV R0,A MOV DPH,R0 INC R0 MOV DPL,R0 INC R0 MOV A,R4 INC R4 MOVC A,A+DPTR ;放在A中;* JZ END0 ;若为0,则表示为休止符,不唱,本次音符不唱, MOV R1,A ;不为0,取出节拍数 ANL A,#0FH MOV R2,A MOV A,R1 SWAP A ANL A,#0FH JNZ SING ;音符不为0,唱 CLR TR0 ;为0,不唱,关频率发生器 SJMP SING1 SING: DEC A ;开始唱,进行相应的数据处理 MOV R3,A RL A MO
38、V DPH,R0 INC R0 MOV DPL,R0 INC R0 MOVC A,A+DPTR MOV 21H,A MOV TH0,A MOV A,R3 RL A INC A MOVC A,A+DPTR MOV 20H,A MOV TL0,A SETB TR0 ;开唱SING1:LCALL DELAY ;每个音符唱多久 JB F0,FOR ;是否暂停, AJMP NEXT ;没有暂停,继续FOR: CLR TR0 ;暂停,不唱 JB F0,$ ;等待播放 AJMP NEXT ;开始播放END0: CLR TR0 ;不唱 MOV A,22H ;唱完处理 CJNE A,#N,WW ;是不是全部歌曲
39、都唱完 MOV 22H,#01H ;全部唱完,则从第一首开始再唱 MOV R7,#00H MOV OUT_NUM,#06H ;数码管显视第一首歌曲编号 AJMP WWWWW: MOV A,R7 ;没有全部唱完,唱下一首,歌曲的入口信息调整 ADD A,#4 MOV R7,A INC 22H CLR EA PUSH DPH PUSH DPL MOV A,22H MOV DPTR,#OUT_TAB MOVC A,A+DPTR MOV OUT_NUM,A ;数码管显视相应的歌曲编号 POP DPL POP DPHWWW: SETB EA AJMP START0 ;开始下一首的演唱F_T0: MOV TH0,21H ;定时器0置初值 MOV TL0,20H CPL OUT ;频率产生 RETINEXT_SONG: PUSH ACC ;下一曲中断程序处理,保护现场 PUSH DPH PUSH DPL CLR EA ;关中断 MOV A,22H CJNE A,#N,Q ;是最后一首吗? MOV R7,#00H ;是最后一首,则R7指向第一首,演唱第一首 MOV 22H,#01H AJMP BACK Q: INC 22H ;不是最后一首,唱下一首,R7内容加4,歌曲数加1 MOV A,R7 ADD A,#4 MOV R7,