目录 上一页 下一页 下一章

-46- PC机汇编语言实战精解

  此电路用在这里相当一个"可控开关",如果将61H端口的bit0、bit1位都置成1,则相当于既打开了定时器又打开了开关,这时候定时器产生的声音信号就会送到放大器推动喇叭发声;若将bit0位置0,则定时器关闭,此时OUT端为1,这时候如果连续改变bit1位的状态,也可以从喇叭中听到声音,这就是我们在第二章中所用的方法;若将bit1位置0,则开关关闭,此时即使打开定时器也不能听到声音。
  这一点可以通过DEBUG加以验证:进入DEBUG,在"-"后打入"O61 3",即可听到喇叭发出连续的叫声。
O(OUT)命令用于直接向端口输出数据,使用很简单:O端口号 数值。和O命令相对的是I(IN)命令,I命令用于从端口取数据并显示在屏幕上,使用方法:I端口号。
  向61H端口输出"03",相当于打开定时器和开关,此时将有连续的声音发出,这个声音的频率约是896Hz,和我们刚开机时听到的蜂鸣音频率一样。
  有趣的是声音一旦发出就不会停止,而且不干扰用户的任何操作,用户可以退出DEBUG去"DIR"或"FORMAT A:",声音决不会停止也不会使机器速度变慢。
  停止这种声音的唯一方法就是进入DEBUG,打入命令"O61 0(也可以是1或2)"。之所以有这种现象是因为定时器的工作并不需CPU直接参与,CPU只要给定时设定好工作状态和频率值并打开定时器,此时定时器就会自主工作,CPU即可去做别的事情。这个特性十分有用,它是实现"背景音乐"的前提。
  那么如何改变声音的频率呢?请注意定时器的通道3还有一个输入端CLK,这一端输入了一个固定的信号,频率是1193181.6Hz。输出信号与此信号具有如下关系:

F(OUT)=F(CLK)/N
  其中N是一个16bit数据,它的值可以由程序设定。方法很简单:将此16位数据分成高、低两个8位,先把低8位送至42H端口,紧接着再把高8位送至42H端口,输出信号的频率就会改变。我们可以试一下:
C:\ASM\>DEBUG[Enter]   设定新的N值是300H,对应的F(OUT)是1193191.6/300H=1553Hz。声音马上变尖了。
  有一点必须说明,定时器具有多种工作状态,并非每种工作状态都能产生声音,所以当我们想通过定时器产生声音时,我们应首先"初始化"定时器,为其建立正确的工作状态。初始
-O61 3[Enter]
-O42 0[Enter]
-O42 3[Enter]
  化定时器并不复杂,向端口43H输出数据0B6H即可。这个数据的二进制形式是10110110,有些书籍把这个数称为"幻数"(MAGIC BYTE)。用这样一个数的原因笔者不作过多讨论,大家可以查阅别的参考书。
  有了上面介绍的这些知识,我们就可以编程控制定时器发出给定频率的声音。程序PROG6可以使喇叭发出1000Hz的声音,这个程序中有一个新的逻辑操作指令:
助记符:OR(or)
用 途:将两个数据作"或"逻辑操作
格 式:OR 寄存器,立即数
    OR 寄存器,寄存器
    OR 寄存器,存储器
    OR 存储单元,寄存器

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章