版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三节音乐播放程序TOC\o"1-2"\h\z\u1硬件编程21.1硬件开发的通用思路21.28253的功能与作用21.38253工作原理31.48253编程方法42音乐程序编写62.1扬声器驱动原理62.2音符频率确实定62.3定时器8253编程72.4并口8255A编程73实验步骤104Turboc2的安装与使用114.1turboc2的安装114.2集成环境介绍114.3turboc2的配置134.4根本编程操作141硬件编程1.1硬件开发的通用思路 在学习的过程中,往往表达一个人的学习能力,并不是一个人在某一方面具体知识和技能掌握的如何,而是他是否掌握了有效的学习方法,是否能够建立起一个夯实的知识框架。 在本次实验中,通过大家学习本次实验,完成实验任务只是一个浅层次的目的,更重要的目的,也是通过实验,让大家亲身体验下硬件编程,掌握硬件编程的方法。 其实不光是在硬件开发上,对于其他的任何事物和问题,解决问题的方法也是一样的。以下我们以8253定时器的开发,来简要介绍下我们的学习思路和方法,也可作为本小节内容组织的一个缩影。是什么?是什么?为什么?怎么做?8253的功能和作用8253的工作原理如何编程控制8253图1.11.28253的功能与作用 8253是可编程的定时器与计数器。为外设与CPU之间或外设与外设之间配合工作时,提供有效的时间配合条件。 8253有三个独立的16位计数器。 每个计数器均可按二进制或者BCD码计数。 各个计数器有6种不同的工作方式。1.38253工作原理8253内部结构图1.28253内部结构框图8253内部有六个模块,结构框图如图1.2所示。数据总线缓冲器:数据总线缓冲器:数据总线缓冲器通过引脚D0~D7与系统数据总线的D0~D7相连,来实现CPU和8253的数据传输的。数据包括8253的计数值,和工作方式命令字。传输的方式为读和写。读写控制逻辑:读写控制逻辑:读写控制逻辑由CPU发出的读写控制信号和地址信号,选择读出或写入的存放器,并确定数据传输的方向:读/写。控制字存放器:控制字存放器:控制字存放器接收CPU发来的控制字。控制字用于设定8253的硬件状态,如计数器的选择与工作方式等。计数器n:计数器n:计数器是8253中真正的“劳动者”,8253的计数和定时功能是由计数器实际执行完成的。8253内部有3个独立的计数器。对于每一个独立的计数器,其都有三个引脚:CLKn、GATEn、OUTn。也可以简单的将这三个引脚的关系理解为输入〔CLKn〕、输出〔OUTn〕和控制〔GATEn〕。8253计数原理计数器的输入为CLK时钟信号,为计数器工作提供计数的基准参考。在8253工作时,每输入一个时钟信号CLK,便使定时或计数值减1。当计数器工作时,定时或计数值减为0时,就在OUT线上输出OUT信号,以指示定时或计数已到。GATE门选通信号用于控制计数器工作,主要用来禁止、允许或开始计数。1.48253编程方法端口与存放器图1.38253读写操作及端口地址8253的读写操作主要是由控制逻辑模块来实现的,A0、A1地址信号用来选择计数器,而由图。1.3可以看出,更确切的说A0、A1地址信号的作用是在选择端口。端口其实就是存放器,端口地址就是存放器的地址。当我们写数据到某个端口时,总要有个存储单元来接收存储我们的数据吧,否那么数据还没被送给CPU就不见了。当我们读取某个端口,那么一定也有一个存储单元存储着我们想要的数据吧,否那么我们的数据从哪里来呢?这样应该好理解吧,所以端口其实就是存放器。读写信号控制着数据的流向,数据是输入还是输出。这里大家可能会有疑问了。那我在编程控制8253的时候,读写信号、地址信号是不是都要我在编程的时候直接进行设定呢?答案是否认的。其实我们在编程的时候要方便的多。硬件接口中每个端口都有特定的功能,编程时通过读写相应端口来对硬件接口进行控制和数据传输。8253端口:8253端口:40H——计数器0数据口。 写该端口,可设置计数器1的初值。读同之。41H——计数器1数据口。 42H——计数器2数据口43H——8253控制口 写该端口,选定计数器及其工作方式等。当我们要设置8253的工作状态时,我们要将工作方式命令字写入43H端口即可,当我们要对计数器2设置计数初值时,将计数初值写入42H端口即可。读写操作由汇编指令IN、OUT来完成,C语言中由inportb〔〕和outportb()函数完成。因此,在我们编程时,我们只需要使用端口IO命令或函数,指定要操作的端口号即可。至于硬件级别的引脚信号怎么做的都是由CPU在执行代码时,CPU发出的,那是CPU的事。8253编程任何一个硬件设备在正常使用之前都需要进行初始化。当芯片刚加电时,硬件的工作状态都是混乱的,因此,第一步总是要初始化硬件,初始化完成后,就可以控制硬件完成功能任务。图1.48253工作方式命令字格式由8253命令字可以看出,命令字主要控制着8253的计数器选择、读写格式、工作方式和计数码制。通过向8253的控制端口写入工作方式命令字,实现对8253工作状态的控制,主要用于8253的初始化。代码1.1代码1.1选择计数器2,工作方式3,计数初值533〔2个字节〕,采用二进制计数。选择计数器2,工作方式3,计数初值533〔2个字节〕,采用二进制计数。#define TIMER2_INIT 0xb6 //命令字#define TIMER2_INIT 0xb6 //命令字#define INIT_DATA 0x533 //计数初值#define PORT_T2 0x42 //计数器2数据口#define PORT_CTRL 0x43 //8253控制口 union //共用体暂存计数初值 { unsignedintdivisor; unsignedchard[2]; }tone; tone.divisor=INIT_DATA; outportb(CTRL_T,INIT_T2); //向控制端口写入工作方式命令字,初始化 outportb(PORT_T2,tone.d[0]); //写入计数初值的低字节 outportb(PORT_T2,tone.d[1]); //写入计数初值的高字节#include<dos.h>#include<dos.h>函数名:
inportb功能:返回从指定硬件端口读入的一个8位二进制〔一个字节〕。用法:int
inportb(intport);函数名:
outportb功能:输出字节到硬件端口中用法:
voidoutportb(intport,charbyte);2音乐程序编写2.1扬声器驱动原理图2.1扬声器硬件原理图在PC机中,8253的通道2与计算机的扬声器相连,由通道2工作于方式3产生一定频率的方波信号去驱动扬声器按一定频率发声。其中8253是否工作取决于其片选信号GATE2,输出的频率大小受控于编程时写入的计数初值。其原理如图2.1所示。8253的端口地址为40H~43H。从图中可见,系统使用并行I/O接口8255A中PB端口的最低两位用作两个开关,来控制该发声驱动系统:PB0作为8253通道2的门控信号GATE2,控制通道2定时计数的启停;PB1与通道2的OUT2信号相与后去控制扬声器接通与断开。PC中8255A的端口地址为60H~63H。可见,要使扬声器发声,PB0置1,通道2才能工作;PB1置1,OUT2上产生的一定频率的方波信号才能通过与门送到驱动器,从而使扬声器发声。 在明白了如何通过驱动扬声器的原理后,我们应该明白,实现本次实验,关键点就在与两个方面了:一是如何控制8253定时器,使其输出音频波形;二是如何控制8255A,使其起到控制开关的作用。接下来我们来深入探讨。2.2音符频率确实定乐曲是按照一定的上下、长短和强弱关系组成的音调。在一首乐曲中,每个音符的音高与频率有关。组成乐曲的每个音符的频率值是乐曲程序发声所需要的数据。音符的频率根据不同的音乐是不同的,可以预先查知,但实际送入计数器的是输入频率1.193MHz(1193180)与音符频率相除的值。8度音:8度音:1234567i1300Hz1462.5Hz1625Hz1733Hz1950Hz2166.7Hz2437.5Hz2600Hz918 816 734 689612550489469音符频率表音符频率初值例如我们计算扬声器发出音符1时的计数初值,音符1的频率为1300Hz,那么计数初值就为1193180/1300,各个音符的频率以及相关8253的计数初值在上表中。2.3定时器8253编程定时器8253主要实现音乐频率的产生。在8253的三个独立的计数器中,计数器2用于控制扬声器,两外两个计数器分别用于控制系统软时钟和动态存储器刷新。在音乐播放程序中,首先要初始化8253,使计数器2工作在方式3,随后对计数器2赋初值,它就根据系统时钟对初始值进行减1计数,当计数值到0时,定时器就向扬声器发出一个脉冲,同时重新从初始值开始减计数。总之,定时器能根据要求的频率向扬声器发出脉冲,于是扬声器就产生指定频率的声音。定时器的输入频率固定为1193180,计数初值决定了向扬声器发出脉冲的时间间隔,他们之间的关系如下公式计算:频率=1193180/计数初值计数初值=1193180/频率其中各个音符的频率,可参考2.2小节中的音符频率表,表中给出了各个音符的频率,以及相应的计数器的初值。定时器8253的编程可参考代码1.1。2.4并口8255A编程声音的停顿以及开关是由8255A来实现的。8255A是通用可编程并口芯片。片内有3个8位并行I/O口,分别称为PA口、PB口和PC口,可以通过编程对8255A输入不同的指令改变I/O口的工作方式。在音乐播放程序中,并口8255A中的PB口中d0和d1两位控制着定时器8253的GATE2和扬声器,其作用相当于一个开关。只有当d0为1时,8253的计数器2才允许计数,因此d0作为8253工作与否的开关;同时d1位控制着8253的计数器2的OUT信号是否能够顺利送达扬声器,因此,当音乐播放的时候,PB口的d0、d1位要置1。代码2.1代码2.1 unsignedcharvalue;value=inportb(PORT_PB); //取出8255A的PB口状态 outportb(PORT_PB,(value|0x03)); //将PB口的低2位值1 u_delay(ms); //延时子函数,控制音符的节拍 outportb(PORT_PB,value); //恢复PB口状态,即关闭在代码2.1中,定义了一个unsignedchar型变量value,用于读取8255APB口的状态,随后将value与0x3相与写入PB口,等待一个延时,这个延时控制着一个音符发声的时长,即节拍。随后将value值再写入PB口。这样就防止了对PB口中其他位产生影响。在代码2.1中,有个延时子程序u_delay(),这个延时主要是控制每个音符发声的长短,从而实现整个音乐的节拍。该延时子程序的实现与CPU主频无关,能够到达不依赖于硬件主频的准确延时。有兴趣同学可以分析下该延时程序,代码如下:代码2.2代码2.2voidu_delay(unsignedintms){ structtimetimep; floattime0,time1; gettime(&timep); time0=timep.ti_hour*3600+timep.ti_min*60+timep.ti_sec+timep.ti_hund*1.00/100; do { gettime(&timep); time1=timep.ti_hour*3600+timep.ti_min*60+timep.ti_sec+timep.ti_hund*1.00/100; if(time1<time0) { time1+=86400; } }while(time1-time0<ms*1.00/1000);}2.5音乐程序流程图〔参考music.asm源码〕读取音符频率读取音符频率开始音乐结束?调用SOUND子程序结束图2.2主程序music.asm流程图NY设置8253状态和分频初值设置8253状态和分频初值读入8255A的PB口状态8255A的PB口D0和D1置1延时恢复8255A的PB口状态保护现场返回图2.3SOUND子程序流程图保护现场3实验步骤〔汇编代码music.asm为例〕a.编辑汇编源程序music.asm
b.将文件music.asm放入masm5.0目录下
c.计算机重启进入MAXDOS
d.输入命令ntfsdos加载NTFS分区
e.进入masm.5.0目录
f.汇编:输入命令masmmusic.asm
g.链接:输入命令linkmusic
h执行:输入命令music〔C语言为例〕a.在dos环境下,进入turboc2目录,输入命令tc启动turboc2。b.编辑C语言源代码〔或者用其他C代码编辑器编辑后,在turboc2中加载〕。c.编译C源程序,生成可执行程序。d.假设编译有错,根据turboc提示,查错修改。亦可使用调试功能查错。e.重启进入MAXDOS,输入命令ntfsdos加载NTFS分区f.进入可执行文件所在文件夹,输入可执行文件的文件名,执行程序4Turboc2的安装与使用4.1turboc2的安装同学们得到turboc2的压缩包后,可以直接解压即可使用。本人将turboc2解压在了F分区下,因此以此路径为例进行讲解。如果你turboc2解压的位置与我的不同,请注意相关路径,以你实际路径为准。图4.1在图4.1中,显示了进入turboc2安装目录的情况,可以看到turboc2目录下有两个文件夹INCLUDE和LIB。在使用turboc2之前,我们需要先设置turboc2的头文件和库文件的路径,设置方法稍后会介绍。4.2集成环境介绍进入dos环境进入dos环境f:cdturboc2tc图4.2输入tc命令,就开始执行turboc2的集成开发环境。图下列图所示:编辑区编辑区图4.3如图4.3所示,集成环境有四个区域组成:主菜单、编辑区、信息窗口、状态行。主菜单包括File、Edit、Run、Compile、Options、Debug、Break/watch子菜单。编辑区用来编辑文件的,也是turboc2的主窗口,在次窗口可以输入、编辑和调试C语言文件。在编辑状态下,闪烁的“_”为光标,表示当前输入文字将出现的位置。信息窗口在编译、调试程序的时候会显示出相关的信息。在编译/连接时输出编译/连接的结果,在程序调试中,此窗口又称为跟踪窗口,用于显示跟踪表达式或变量的当前值。编辑窗口和信息窗口的切换通过功能键F6实现。状态行即图4.3红线处,为用户提供最根本的帮助信息,以及当前键盘状态。在turboc2的集成环境中,是不能用鼠标的,只能使用键盘。在图4.3中,可以看到主菜单File的背景色为黑色,按下回车,即可展开File下的子菜单。如图4.4图4.4在File的子菜单中,可以使用键盘上下方向键来选择子选项。退到主菜单可按“ESC”键,也可使用“F10”快捷键切到主菜单。 在不同的子菜单中切换,可以在主菜单下使用左右方向键,黑色背景即为当前操作的子菜单。也可以使用“Alt”快捷键,如我想进入Compile子菜单,可以使用“Alt+C”即可,在主菜单中每个子菜单的首字母都是大写红色,Alt和各个子菜单的首字母组合都可进入相应的子菜单。如图4.5所示。图4.5 如果要退出turboc2集成环境,可以进入File子菜单中,选择Quit即可,也可使用“Alt+X”快捷键。4.3turboc2的配置在4.1小节我们提到需要配置turboc2的一些路径,这里我们来完成这个任务。进入turboc2集成环境,切到Options子菜单,选择Directories选项。如图4.6所示:图4.6进入Directories后如图4.7所示:图4.7如图4.7显示,有四个工程,如果你的安装路径和我的不同,请做相应的修改。Includedirectories:头文件的路径,如图4.1所示,设为turboc2目录下的INCLUDE文件夹。Librarydirectories:库文件路径,设为turboc2目录下LIB文件夹。Outputdirectories:输出文件夹,即用来存放编译程序时的生成文件,包括目标文件和可执行文件等。由于turboc2目录下文件太多,为了方便程序管理,我在turboc2目录下新建了一个Project文件夹,来存放源程序和编译生成的程序。TurboCdirectory:该路径为turboc2的安装目录即可。到此,turboc2环境就可以正常使用了。4.4根本编程操作创立一个C源文件在每次启动turboc2后,系统会自动创立名为NONAME.C的新文件。在编辑窗口输入程序代码,并保存,就可以创立一个C源文件。另外,在File菜单下“New”选项也可创立一个新文件。如图4.8所示:图4.8程序文本输入在插入点处输入文档的内容。如果当前的编辑状态为Insert〔插入〕,输入程序文本后,插入点自动向后移动。如果当前的编辑状态为改写,输入程序文本后,当前输入的文本会显示在窗口中,并自动覆盖插入点后的文本,直到停止输入。插入和改写状态切换是通过按Insert功能键来实现的,在编辑窗口上的提示行中有“Insert”信息时表示当前的状态为插入状态,否那么为改写状态。在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 税务培训与技能提升
- 桑拿会所前台服务心得
- 餐具行业设计理念培训体会
- 园林绿化单位卫生整治方案
- 2024年认识电的教案6篇
- 2024年秋天的怀念教案(15篇)
- 《民族国家的兴起》课件
- 农村自建房贴瓷砖合同(2篇)
- 中国液晶材料行业市场全景评估及投资方向研究报告
- 2025有关写树木买卖合同范本
- 中国通 用技术集团招聘笔试题库
- 【MOOC】工程材料学-华中科技大学 中国大学慕课MOOC答案
- 银行贷款保证合同范本
- 《汽车胶粘剂》课件
- 手绘pop教学课件
- 2024脑血管病指南
- 2022年海南公务员考试申论试题(B卷)
- 企业三年营销规划
- 教师资格考试高中历史面试试题及解答参考
- 2024年社区工作者考试试题库
- 工厂设备工程师年终总结
评论
0/150
提交评论