日志文章

2006年09月26日 09:20:04

PC主板上扬声器的控制方法

   现在我们用的主板,都带有一个Intel8254兼容的可编程定时器/计数器。它提供了三个独立的16位计数通道。Intel8254在PC上的IO口说明如下:
0040H R/W 计数器0,系统时间计数器,产生18.2Hz的时钟频率(中断8)
0041H R/W 计数器1,RAM刷新计数器,乱改此计数器可能会发生系统崩溃
0042H R/W 计数器2,主板扬声器的频率发生器
0043H R/W 模式设置端口
   要想进一步了解Intel8254的编程方法可以去找它的datasheet看,也可以找找一些教科书。对于控制扬声器,我们只要用其中的第三通道就可以了。另外,与扬声器控制有关的端口还有:
0061H R/W bit0: 计数器2的GATE引脚(可以当作计数器2计数的使能位)
       bit1: 扬声器的控制开关(通过与门和放大器接在扬声器上)
0061H端口的其他位用于控制其他硬件,操作扬声器时不能随便修改。
   下面是从DOS下反汇编出来的C函数sound和nosound,可以用做控制扬声器。可见扬声器使用计数器2的方式3(方波速率发生器),且PC上8254的CLK脉冲频率是1.193181MHz。
sound:
 mov  bx, freq
 mov  ax, 0x34dd
 mov  dx, 0x0012
 cmp  dx, bx
 jnb  exit
 div  bx
 mov  bx, ax
 in  al, 0x61
 test al, 0x03
 jne  set_freq
 or  al, 0x03
 out  0x61, al
 mov  al, 0xb6
 out  0x43, al
set_freq:
 mov  al, bl
 out  0x42, al
 mov  al, bh
 out  0x42, al
exit:
 ret

nosound:
 in  al, 0x61
 and  al, 0xfc
 out  0x61, al
 ret
当然,以上代码是不可能在WinNT以上的系统中运行成功的,Win95/Win98中可以。

Tags: PC主板   扬声器  

类别: 一般编程 |  评论(0) |  浏览(2354) |  收藏
发表评论
看不清楚,换一张