欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 幼儿/小学教育>
  • 中学教育>
  • 高等教育>
  • 研究生考试>
  • 外语学习>
  • 资格/认证考试>
  • 论文>
  • IT计算机>
  • 法律/法学>
  • 建筑/环境>
  • 通信/电子>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    汇编实验音乐播放程序.docx

    • 资源ID:500183       资源大小:87.34KB        全文页数:13页
    • 资源格式: DOCX        下载积分:5
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要5
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    汇编实验音乐播放程序.docx

    1、第三节音乐播放程序1硬件编程21.1 硬件开发的通用思路21.2 8253的功能与作用21.3 8253工作原理21.4 8253编程方法32音乐程序编写62.1 扬声器驱动原理62.2 音符频率确实定62.3 定时器8253编程62.4 并口8255A编程73实验步骤104Turboc2的安装与使用114.1 turboc2的安装114.2 集成环境介绍114.3 turboc2的配置124.4 根本编程操作121硬件编程1.1 硬件开发的通用思路在学习的过程中,往往表达一个人的学习能力,并不是一个人在某一方面具体知识和技能掌握的如何,而是他是否掌握了有效的学习方法,是否能够建立起一个夯实的

    2、知识框架。在本次实验中,通过大家学习本次实验,完成实验任务只是一个浅层次的目的,更重要的目的,也是通过实验,让大家亲身体验下硬件编程,掌握硬件编程的方法。其实不光是在硬件开发上,对于其他的任何事物和问题,解决问题的方法也是一样的。以下我们以8253定时器的开发,来简要介绍下我们的学习思路和方法,也可作为本小节内容组织的一个缩影。是什么?8253的功能和作用为什么?8253的工作原理怎么做?如何编程控制8253图1.11.2 8253的功能与作用8253是可编程的定时器与计数器。为外设与CPU之间或外设与外设之间配合工作时,提供有效的时间配合条件。8253有三个独立的16位计数器。每个计数器均可

    3、按二进制或者BCD码计数。各个计数器有6种不同的工作方式。1.3 8253工作原理8253内部结构图1.28253内部结构框图8253内部有六个模块,结构框图如图1.2所示。数据总线缓冲器:数据总线缓冲器通过引脚D0D7与系统数据总线的D0D7相连,来实现CPU和8253的数据传输的。数据包括8253的计数值,和工作方式命令字。传输的方式为读和写。读写控制逻辑:读写控制逻辑由CPU发出的读写控制信号和地址信号,选择读出或写入的存放器,并确定数据传输的方向:读/写。控制字存放器:控制字存放器接收CPU发来的控制字。控制字用于设定8253的硬件状态,如计数器的选择与工作方式等。计数器n:计数器是8

    4、253中真正的“劳动者”,8253的计数和定时功能是由计数器实际执行完成的。8253内部有3个独立的计数器。对于每一个独立的计数器,其都有三个引脚:CLKn.GATEnOUTno也可以简单的将这三个引脚的关系理解为输入ICLKn)、输出(OUTn)和控制(GATEn)08253计数原理计数器的输入为CLK时钟信号,为计数器工作提供计数的基准参考。在8253工作时,每输入一个时钟信号CLK,便使定时或计数值减1。当计数器工作时,定时或计数值减为。时,就在OUT线上输出OUT信号,以指示定时或计数己到。GATE门选通信号用于控制计数器工作,主要用来禁止、允许或开始计数。1.4 8253编程方法端口

    5、与存放器图1.38253读写操作及端口地址8253的读写操作主要是由控制逻辑模块来实现的,AO.Al地址信号用来选择计数器,而由图。1.3可以看出,更确切的说AO、AI地址信号的作用是在选择端口。端口其实就是存放器,端口地址就是存放器的地址。当我们写数据到某个端口时,总要有个存储单元来接收存储我们的数据吧,否那么数据还没被送给CPU就不见了。当我们读取某个端口,那么一定也有一个存储单元存储着我们想要的数据吧,否那么我们的数据从哪里来呢?这样应该好理解吧,所以端口其实就是存放器。读写信号控制着数据的流向,数据是输入还是输出。这里大家可能会有疑问了。那我在编程控制8253的时候,读写信号、地址信号

    6、是不是都要我在编程的时候直接进行设定呢?答案是否认的。其实我们在编程的时候要方便的多。硬件接口中每个端口都有特定的功能,编程时通过读写相应端口来对硬件接口进行控制和数据传输。8253端口:40H计数器0数据口。写该端口,可设置计数器1的初值。读同之。41H计数器1数据口。42H一一计数器2数据口43H8253控制口写该端口,选定计数器及其工作方式等。当我们要设置8253的工作状态时,我们要将工作方式命令字写入43H端口即可,当我们要对计数器2设置计数初值时,将计数初值写入42H端口即可。读写操作由汇编指令IN、OUT来完成,C语言中由inportb()和OUtPOrtbo函数完成。因此,在我们

    7、编程时,我们只需要使用端口10命令或函数,指定要操作的端口号即可。至于硬件级别的引脚信号怎么做的都是由CPU在执行代码时,CPU发出的,那是CPU的事。8253编程任何一个硬件设备在正常使用之前都需要进行初始化。当芯片刚加电时,硬件的工作状态都是混乱的,因此,第一步总是要初始化硬件,初始化完成后,就可以控制硬件完成功能任务。图1.48253工作方式命令字格式由8253命令字可以看出,命令字主要控制着8253的计数器选择、读写格式、工作方式和计数码制。通过向8253的控制端口写入工作方式命令字,实现对8253工作状态的控制,主要用于8253的初始化。代码1.1选择计数器2,工作方式3,计数初值5

    8、33(2个字节),采用二进制计数。#defineTIMER2JNIT0xb6命令字#defineINIT_DATA0x533计数初值#definePORT_T20x42计数器2数据口#definePORT.CTRL0x43/8253控制口union共用体暂存计数初值(unsignedintdivisor;unsignedchard2;tone;tone.divisor=INIT_DATA;OUtPOnb(CTRL_T,INnLT2);向控制端口写入工作方式命令字,初始化outportb(PORT_T2,tone.dOD;写入计数初值的低字节outportb(PORT-T2,tone.dI);写

    9、入计数初值的高字节include函数名:inportb功能:返回从指定硬件端口读入的一个8位二进制(一个字节)。用:intinportb(intport);函数名:Outportb功能:输出字节到硬件端口中用法:voidoutportb(intport,charbyte);2音乐程序编写2.1 扬声器驱动原理图2.1扬声器硬件原理图在PC机中,8253的通道2与计算机的扬声器相连,由通道2工作于方式3产生一定频率的方波信号去驱动扬声器按一定频率发声。其中8253是否工作取决于其片选信号GATE2,输出的频率大小受控于编程时写入的计数初值。其原理如图2.1所示。8253的端口地址为40H43Ho

    10、从图中可见,系统使用并行I/O接口8255A中PB端口的最低两位用作两个开关,来控制该发声驱动系统:PBo作为8253通道2的门控信号GATE2,控制通道2定时计数的启停;PBi与通道2的OUT2信号相与后去控制扬声器接通与断开。PC中8255A的端口地址为60H63H.可见,要使扬声器发声,PBO置1,通道2才能工作;PBl置1,OUT2上产生的一定频率的方波信号才能通过与门送到驱动器,从而使扬声器发声。在明白了如何通过驱动扬声器的原理后,我们应该明白,实现本次实验,关键点就在与两个方面了:一是如何控制8253定时器,使其输出音频波形;二是如何控制8255A,使其起到控制开关的作用。接下来我

    11、们来深入探讨。2.2 音符频率确实定乐曲是按照一定的上下、长短和强弱关系组成的音调。在一首乐曲中,每个音符的音高与频率有关。组成乐曲的每个音符的频率值是乐曲程序发声所需要的数据。音符的频率根据不同的音乐是不同的,可以预先查知,但实际送入计数器的是输入频率l193MHz(l193180)与音符频率相除的值。8度音:1234567i音符1300Hz1462.5Hz1625Hz1733Hz1950Hz2166.7Hz2437.5Hz2600Hz频率918816734689612550489469初值音符频率表例如我们计算扬声器发出音符I时的计数初值,音符I的频率为1300Hz,那么计数初值就为119

    12、3180/1300,各个音符的频率以及相关8253的计数初值在上表中。2.3 定时器8253编程定时器8253主要实现音乐频率的产生。在8253的三个独立的计数器中,计数器2用于控制扬声器,两外两个计数器分别用于控制系统软时钟和动态存储器刷新。在音乐播放程序中,首先要初始化8253,使计数器2工作在方式3,随后对计数器2赋初值,它就根据系统时钟对初始值进行减1计数,当计数值到0时,定时器就向扬声器发出一个脉冲,同时重新从初始值开始减计数。总之,定时器能根据要求的频率向扬声器发出脉冲,于是扬声器就产生指定频率的声音。定时器的输入频率固定为1193180,计数初值决定了向扬声器发出脉冲的时间间隔,

    13、他们之间的关系如下公式计算:频率=1193180/计数初值计数初值=1193180/频率其中各个音符的频率,可参考2.2小节中的音符频率表,表中给出了各个音符的频率,以及相应的计数器的初值。定时器8253的编程可参考代码IJ02.4 并口8255A编程声音的停顿以及开关是由8255A来实现的。8255A是通用可编程并口芯片。片内有3个8位并行I/O口,分别称为PA口、PB口和PC口,可以通过编程对8255A输入不同的指令改变I/O口的工作方式。在音乐播放程序中,并口8255A中的PB口中d和dl两位控制着定时器8253的GATE2和扬声器,其作用相当于一个开关。只有当d为1时,8253的计数器

    14、2才允许计数,因此d作为8253工作与否的开关;同时dl位控制着8253的计数器2的OUT信号是否能够顺利送达扬声器,因此,当音乐播放的时候,PB口的dO、dl位要置1。代码2.1unsignedcharvalue;value=inportb(PORT,PB);取出8255A的PB口状态outportb(PORTPB,(value0x03);将PB口的低2位值1udelay(ms);延时子函数,控制音符的节拍outportb(PORT_PB,value);恢复PB口状态,即关闭在代码2.1中,定义了一个UnSignedChar型变量VaIUe,用于读取8255APB口的状态,随后将ValUe与

    15、0x3相与写入PB口,等待一个延时,这个延时控制着一个音符发声的时长,即节拍。随后将VahIe值再写入PB口。这样就防止了对PB口中其他位产生影响。在代码2.1中,有个延时子程序LdelayO,这个延时主要是控制每个音符发声的长短,从而实现整个音乐的节拍。该延时子程序的实现与CPU主频无关,能够到达不依赖于硬件主频的准确延时。有兴趣同学可以分析下该延时程序,代码如下:代码2.2voidu-delay(unsignedintms)structtimetimep;floatiime.timel:getlime(&timep);time=timep.ti_hour*3600+limep.li_min

    16、60+limep.ti_sec+limep.li_hund*1.00/100;dogetlime(&timep);time1=timep.ti_hour*3600+limep.li_min*60+limep.ti_sec+(imep.(i_hund*1.00/100;if(timeltime)(time1+=86400;)Iwhile(time1-IimeOoc2解压在了F分区下,因此以此路径为例进行讲解。如果你turboc2解压的位置与我的不同,请注意相关路径,以你实际路径为准。图4.1在图4.1中,显示了进入UIrbOC2安装目录的情况,可以看到UIrbOC2目录下有两个文件夹INCLU

    17、DE和LlBo在使用IUrbOC2之前,我们需要先设置turboc2的头文件和库文件的路径,设置方法稍后会介绍。4.2 集成环境介绍1. 进入dos环境2. f:3. Cdturboc24. tcC:DocumentsandSettingsAdministratorf:F:cdturboc2F:turboc2tc图4.2输入tc命令,就开始执行:turboc2的集成开发环境。图下列图所示:图4.3如图4.3所示,集成环境有四个区域组成:主菜单、编辑区、信息窗口、状态行。主菜单包括File、Edit、Run、CompileOptionsDebugBreak/watch子菜单。编辑区用来编辑文件的

    18、也是turboc2的主窗口,在次窗口可以输入、编辑和调试C语言文件。在编辑状态下,闪烁的“,为光标,表示当前输入文字将出现的位置。信息窗口在编译、调试程序的时候会显示出相关的信息。在编译/连接时输出编译/连接的结果,在程序调试中,此窗口又称为跟踪窗口,用于显示跟踪表达式或变量的当前值。编辑窗口和信息窗口的切换通过功能键F6实现。状态行即图4.3红线处,为用户提供最根本的帮助信息,以及当前键盘状态。在UIrbOC2的集成环境中,是不能用鼠标的,只能使用键盘。在图4.3中,可以看到主菜单File的背景色为黑色,按下回车,即可展开File下的子菜单。如图4.4图4.4在File的子菜单中,可以使用

    19、键盘上下方向键来选择子选项。退到主菜单可按“ESC”键,也可使用“FI0”快捷键切到主菜单。在不同的子菜单中切换,可以在主菜单下使用左右方向键,黑色背景即为当前操作的子菜单。也可以使用“Alt”快捷键,如我想进入COmPiIe子菜单,可以使用“Alt+C”即可,在主菜单中每个子菜单的首字母都是大写红色,Alt和各个子菜单的首字母组合都可进入相应的子菜单。如图4.5所示。图4.5如果要退出turboc2集成环境,可以进入FiIe子菜单中,选择QUiI即可,也可使用“Alt+X”快捷键。4.3 turboc2的配置在4.1小节我们提到需要配置turboc2的一些路径,这里我们来完成这个任务。进入U

    20、IrboC2集成环境,切到OPt沁ns子菜单,选择DireCtorieS选项。如图4.6所示:图4.6进入DireCtorieS后如图4.7所示:图4.7如图4.7显示,有四个工程,如果你的安装路径和我的不同,请做相应的修改。Includedirectories:头文件的路径,如图4.1所示,设为turboc2目录下的INCLUDE文件夹。1.ibrarydirectories:库文件路径,设为turboc2目录下LlB文件夹。Outputdirectories:输出文件夹,即用来存放编译程序时的生成文件,包括目标文件和可执行文件等。由于turboc2目录下文件太多,为了方便程序管理,我在Ul

    21、rbOC2目录下新建了一个Project文件夹,来存放源程序和编译生成的程序。TurboCdirectory:该路径为turboc2的安装目录即可。到此,turboc2环境就可以正常使用了。4.4 根本编程操作创立一个c源文件在每次启动turboc2后,系统会自动创立名为N0NAME.C的新文件。在编辑窗口输入程序代码,并保存,就可以创立一个C源文件。另外,在FiIe菜单下“New”选项也可创立一个新文件。如图4.8所示:图4.8程序文本输入在插入点处输入文档的内容。如果当前的编辑状态为InSert(插入),输入程序文本后,插入点自动向后移动。如果当前的编辑状态为改写,输入程序文本后,当前输入

    22、的文本会显示在窗口中,并自动覆盖插入点后的文本,直到停止输入。插入和改写状态切换是通过按InSert功能键来实现的,在编辑窗口上的提示行中有“Insert”信息时表示当前的状态为插入状态,否那么为改写状态。在程序输入的时候,应当注意如下的问题,缩进或对齐程序文本时最好使用Tab键。调整插入点的位置,使用光标键进行精确定位,使用PageUP/PageDown键进行上下翻集成开发环境的简介页,使用HOme键将光标移到所在行的开始,使用End键将光标移到所在行的结尾。如果发现输入有误,将插入点移动到相应的位置,使用Del键删除插入点右边的文本,使用Backspace键删除插入点左边的文本。图4.9保

    23、存文件在FiIe菜单下,选择SaVe选项。如图4.10所示:图4.10此时会出现一个提示框,提示输入文件的文件名。由于我在turboc2目录下新建了一个Project文件夹,来存放我的源文件和编译生成的文件,因此,我就把路径和文件名设置为如图4.11所示,文件名为HelIO.c,存放在F:TURBOC2project目录下。图4.11敲下回车即完成文件的保存。这时在F:TURBOC2project就生成了一个HelIo.c源文件。、翻开已存文件在翻开turboc2集成环境后,选择FiIr菜单下Load选项,如图4.12所示:图4.12在提示框中可以输入我们要翻开文件的文件名,系统默认的是在TU

    24、RB0C2目录下查找文件,假设TURB0C2目录下不存在该文件,那么无法翻开并且以该文件名新建一个文件。而我的Hellox文件在TURBoC2目录下Project文件夹下,此处输入的文件名可以包含路径和文件名,假设我要翻开Heno.c文件,输入PrOjeCtHello.c如图4.13所示:图4.13编译连接进入ComPile菜单,如图4.14所示:图4.14CompiletoOBJs将hello.c经过预处理、编译、汇编后得到OBJ目标程序。MakeEXEfile::将Hello.c程序直接编译成可执行程序。也可按下F8快捷键。1.inkEXEfile:将目标程序进行链接,生成可执行程序EXE。运行/调试


    注意事项

    本文(汇编实验音乐播放程序.docx)为本站会员(田海滨)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!




    宁ICP备18001539号-1

    三一文库
    收起
    展开