当前位置:文档之家› 微机8086课程设计实验报告 网工1502

微机8086课程设计实验报告 网工1502

课程设计说明书课程名称:《微机原理及接口技术》课程设计设计题目:定时与计数:利用8253控制扬声器发声,播放一段音乐班级:网络工程1502姓名:潘万丁开始时间:_2018_____年_01___月_15___日完成时间:_2018_____年_01___月_19___日成绩评定指导教师签名:___年__月__日目录摘要随着科技的高速发展,计算机已经经过了好几代的更新,然而计算机的运行的基本原理依然没有改变的。

而今,我们通过一个学期的学习,已经初步了解了计算机的基本结构和原理,并且已经学会了用汇编语言进行基本的程序编写。

一、概述汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。

借助于汇编程序,计算机本身可以自动地把汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。

而本次课程设计的主要目的就是巩固所学过的知识,用汇编语言熟练地运用三大结构,进一步掌握一些指令的功能、掌握子程序的定义及调用和INT 21H、INT10H中断的使用,同时熟练运用通用寄存器和堆栈来进行编写一个完整的具有某种特定功能的程序。

二、方案设计1.功能分析在此次设计中,第一个重点就是音乐播放的控制,要想能按照正常的频率和节拍播放出音乐,就需要合理的设计出给蜂鸣器的频率值和播放的时间。

这样就能比较准确的把音乐按一定的节奏播放出来。

如果我们要想加快播放速度,我们可以改变每一节拍的播放时间,如果我们改变了播放的频率值,那么歌曲也就相应的改变了。

我们根据上面的功能分析,同时通过查阅相关资料,了解了计算机的内部结构的同时还清楚的理解了DOS中的21H和10H中断的调用,因此我们设计出如下方案:(1)音乐的代码化我们首先收集了一首简单的歌曲《两只老虎》,同时还带有相应的音谱,通过查阅相关的音乐资料,了解了节拍的概念和各音符所对应的频率,而后我们把每一首歌曲都转化成两个数据段,一个是把各个音符翻译成相应的频率值,第二是把相应的节拍转化成对应的时间值,来控制播放每一个音符所对应的时间。

这样我们在播放歌曲时,同时调用频率值和时间值就可以把相应的歌曲播放出来了。

(2)音乐演奏的硬件配合我们了解到在计算机的主板上有8253、8255和蜂鸣器,同时了解到蜂鸣器的驱动是通过8255和8253共同控制的,我们通过对8253的通道2进行写数据来控制蜂鸣器的声音频率,再通过8255来控制播放时间的长短,就通过这样的巧妙配合来达到播放完整音乐的效果。

(3)音乐演奏的软件设计软件设计是本设计的重点,在软件设计中,我们要给8253和8255写数据,执行相应的代码来控制音乐的播放。

三、软件设计在介绍音乐的播放之前,先来说说PC机的小喇叭是怎样与机器相连的呢?下面的“发声原理图”表示了喇叭与机器简单的相连情况。

喇叭的一端连接在电源正极,另一端与机器的61H端口的bit位相连。

可以想象,若能连续改变61H端口的bit位0,1状态,就可以使喇叭线圈内的电流时有时无,从而使喇叭发声。

我们编制的汇编程序的工作,就是连续改变61H端口的bit位状态。

我们使用PC机有一个专门用于定时的电路,型号为8253。

它有三个通道,第一个通道用于控制始终正常运转;第二个通道用于存储器刷新;这两个通道与我们现在要讨论的问题无关。

第三个就是一组电路域喇叭相连。

如下图所示就是PC机中完整的发声电路,定时器通道3的G端与61H端口的bit0位相连,如果把61H端口的bit0位置为1,那么定时器通道3就会被启动,此时将有一组信号从OUT输出,信号的频率可以用程序控制;若61H的端口bit0位为0,则定时器被关闭,out端就恒为1.发声原理图:发声程序设计原理:PC机发声系统以8253的2号计数器为核心。

系统初始化时,2号计数器I 作在“方波发生器”方式,初值为二进制数,,写入顺序为先低后高,CLK2为1.193182MHz,当计数初值为533H时,OUT2输出的方波大约为900Hz,经过简单的滤波之后,送至扬声器。

改变1、4号计数器的计数初值就可以使扬声器发出不同频率的音响。

ROM BIOS 中有个BEEP子程序,这能根据BL中组出的时间计数值控制8253定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。

为此我们需要做两点修改,首先,BEEP程序只能产生896HZ的声音,我们的通用发声程序应能产生任一频率的声音。

其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。

我们知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为:533H×896÷给定频率=123280H÷给定频率发声程序包括4个步骤:(1)在8253中的42端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。

(2)在8253中的42H端口(Timer2)装入一个16位的计数值(533H×895/频率),以建立将要产生的声音频率。

(3)把输出端口61H的PB0、PB1两位置1,发出声音。

对于发音部分。

PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。

PPI包括3个8位寄存器,两个用于输入功能,一个用于输出功能。

输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。

由PPI输出寄存器中的0、1两位来选择扬声器的驱动方式。

(4)注意音乐节拍表的频率表的设定。

一个频率对应一个节拍,如果频率表和节拍表有问题,同样不会发出声音。

对于发音部分。

PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。

PPI只有PB0和PB1同时为“1”时,才能驱动扬声器地声。

当从8255中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表。

把相应的频率送到一个寄存器上,通过公式:计数值=533H×896÷ f=1234DCH÷ f算出计数值,再把算得的计数值送给8253,就可产生所要频率的方波。

在把计数值送8253前,必须先把8253进行初始化:使其选用通道2,工作在方式3下。

就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而8个开关都接在8255的A口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波。

这个方波经驱动放大就可以使扬声器发出相应的声音。

所以8255在这里完成两个任务,它不仅从A口中采集到数据,而且B口的PB1和PB0两个位要控制发声。

8253的主要任务就是产生所要求发声的不同频率的方波。

本例程序是由8253芯片控制发声的音阶和节拍,由8255 芯片控制扬声器的器来控制主板发声。

1.算法描述流程图:2. 主程序流程图实现代码如下:;************************************************************************** *;程序名称:ceshi;两只老虎乐曲;************************************************************************** *stack segment para stack 'stack'db 64 dup('stack...')stack ends;*******************************************************************dseg segment para 'data'mus_freq dw 262,294,330,262,262,294,330,262dw 330,349,392,330,349,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294,196,262,-1mus_time dw 25,25,25,25,25,25,25,25,25,25dw 50,25,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,50dseg ends;*******************************************************************cseg segment para 'code'assume cs:cseg,ss:stack,ds:dseg;-------------------------------------------------------------------music proc farmov ax,dsegmov ds,axlea si,mus_freqlea bp,ds:mus_timefreq:mov di,[si]cmp di,-1je end_musmov bx,ds:[bp]call soundfadd si,2add bp,2jmp freqend_mus:mov ax,4c00hint 21hmusic endp;-------------------------------------------------------------------------- soundf proc nearpush axpush bxpush cxpush dxpush dimov al,0b6hout 43h,almov dx,12hmov ax,348chdiv diout 42h,almov al,ahout 42h,alin al,61hmov ah,alor al,3out 61h,alwait1:mov cx,6630call waitfdec bxjnz wait1mov al,ahout 61h,alpop dipop dxpop cxpop bxpop axretsoundf endp;--------------------------------------------------------------------------waitf proc nearpush axwaitf1:in al,61hand al,10hcmp al,ahje waitf1mov ah,alloop waitf1pop axretwaitf endp;--------------------------------------------------------------------------cseg ends;************************************************************************** *end music;************************************************************************** *四、调试过程1.编辑源程序,假定源文件名为YINYUE.ASM。

相关主题