夏超群
(武汉工程职业技术学院 湖北 武汉:430080)
计算机系统中,由可编程定时/计数器集成芯片,可以为处理器和外设提供时间标记,也可以对外部事件进行计数。而计数和定时两个概念如果联系起来,很容易让人联想到频率,由频率的振动可以产生声音,频率的高低,决定声音音调的高低。在考虑发声频率高低时,如果还考虑发声时间的长短,或将二者灵活结合,便会产生不同节拍、不同音调的声音,若声音按乐谱输出即为音乐。下面从PC系统发声原理及实现方法上,说明如何使用PC键盘八个数字键,代替钢琴键弹奏音乐的程序设计。
定时/计数器8253有3个内置的计数器,3个计数器的数据端口地址分别是40H、41H、42H,命令端口地址43H。3个计数器硬件结构基本相同,每个计数器内有一个16位存放初始值的寄存器;一个16位的输出锁存器,在写入锁存命令时,锁定计数器的当前值;一个16位可对初始值进行减1的减法计数器,其内的值不断递减,减到0时,从端口OUT输出一个脉冲信号。
定时/计数器8253的0号计数器作为日时钟计时,它每秒约发出18次中断以修正时间;1号计数器采用DMA传送数据;2号计数器控制扬声器发声,它其实是一个振荡电路,此振荡电路向扬声器发送用户设定频率的脉冲,当扬声器驱动电路的输出端口控制扬声器为接通状态时,就让OUT2信号通过,经滤波和功放电路,使扬声器发出指定频率的声音[3]。
计算机上大多数数据的输入/输出,都是由系统主板上的8255可编程外围接口芯片或等效电路管理。8255内有三个8位寄存器,分别用于输入或输出功能,其输出寄存器的低两位用来选择扬声器的驱动方式,不采用8255的计算机,通过等效电路选择扬声器的驱动方式,它们所使用的端口地址是61H[2]。具体连接见扬声器驱动电路图1。
图1 扬声器驱动电路图
由扬声器驱动电路图可以看出,8255或等效电路输出寄存器第0位,控制8253/8254定时器门控信号(GATE2)的状态,即是否允许2号计数器开始工作;输出寄存器第1位,控制扬声器的与门电路是否接通,即控制扬声器是否能接收2号计数器的输出信号(OUT2)。综合上面分析知,8255或等效电路输出寄存器第0位为1时,选通GATE2门电路,选用8253/8254定时器芯片内的2号计数器,2号计数器产生一个振荡电路,该电路向扬声器发送指定频率的脉冲。当8255或等效电路输出寄存器第1位为1时,扬声器为接通状态,可以接收2号计数器输出的脉冲信号,从而控制扬声器器发出一定频率的声音。当8255端口或等效电路输出寄存器低两位至少有一位为0时,可使扬声器停止发声[2]。由于2号计数器输出信号可以输出不同频率,但输出振幅相同,因此可控制扬声器发出不同的音调,不能控制声源的音量。
因此,利用控制定时/计数器及8255或等效电路输出寄存器端口的方法,可控制扬声器发出不同频率的声音,用软件实现则该发声控制,可分如下三步进行:
(1)将一特定数0B6H送2号计数器中的命令口43H,这个数对2号计数器的方式寄存器进行初始化,使2号计数器准备接收计时常数。
(2)将16位二进制计时常数装入2号计数器的数据口42H,这个常数即是将要产生的声音频率。
(3)把8255或等效电路输出端口61H的低两位置1,控制扬声器连通,使其能发出声音[1]。
按上述步骤控制发声时,声音的持续的默认时间很短,实际在控制发声时,要求声音持续时间长短根据用户要求设定,故程序内需要指定延时时间,最终让计算机按设计者的指定时间和指定频率,发出不同节拍、不同音调的声音。假定发声频率存放在DI寄存器中,发出指定频率声音的程序段如下。
如果要求声音持续一定的时间,可在程序中加上延时的程序段。假定延时值存放在BX、CX寄存器中,代码如下:
音乐的音调是按照一定的高低、长短和强弱关系组成,在一首音乐乐曲中,音符的音高和节拍与频率和声音持续时间相关联,所以组成音乐乐曲的每个音符的频率和持续时间,是设计音乐程序所必须的数据。如果按照乐曲的曲谱,将每个音符的频率和持续时间分别定义成数据表,在程序中依次取出表内频率和持续时间,就可以编写用户需要的音乐程序。
如果将计算机键盘上相应数字键和设定的音符、频率形成一种对应关系,就可以通过键盘控制扬声器发出所设定音符的声音,相当于将计算机键盘转换成钢琴键,实现用计算机键盘弹奏音乐或演奏程序设定的音符乐曲。因为钢琴的音符较多,以设计一个音域有限(只有八个音符)的弹奏程序为例,介绍利用键盘1~8八个数字键控制扬声器发出八个音符的实现过程。
由键盘控制发声,要求按下键盘上的某一数字键,就发出对应的音调,表1列出了键盘八个数字键位和音符之间的关系[1]。
表1 键盘数字键与钢琴的八个音符对应表
由上表的对应关系可以看出,当按下数字键1时,程序接收这个键的ASCII码值,由该值与频率数据表的对应关系,取出此键对应的频率值262Hz,传给发声程序发出指定时间长短的声音,该声音与钢琴键C音调对应。依次类推,按下不同数字键时,发出表中对应频率的音调。
程序中首先将音符的频率表作为数据按顺序定义在数据段中,对于声音的持续时间,统一设定相同值,只需使用相同程序段实现延时控制,不需要额外的数据表。程序的功能是接收键盘键入,根据键入的数字信息,查找数据表,获取其对应的频率值,将所得到的频率值传送给发声子程序,以发出相应音调的声音。程序算法流程图如图2。
图2 键盘弹奏程序流程图
数据表的定义程序段:
接收键入数字,根据数字信息决定取频率值,并将频率值送至DI寄存器,将声音的持续时间值送BX寄存器的程序段:
确定好声音的频率和节拍后,直接调用发声子程序,控制扬声器发出用户所需要的声音:
call sound
[1] 沈美明,温冬婵.IBM-PC汇编语言程序设计[M].北京:清华大学出版社,2001.
[2] 刘乐善.微型计算机接口技术及应用[M].武汉:华中科技大学出版社,2000.
[3] 方风波,黄鹤鸣.微机原理与接口技术及实训[M].北京:科学出版社,2006.