哎呀这段技术贴看着好硬核啊,那我来用普通网友的口吻、口语化地改写一下吧,尽量简洁明了,也加点网络语言进去:
以前老式的PC机里面有个专门用来计时的芯片,叫8253或者8254,它有三个通道。前两个是管系统时钟和内存刷新的,咱就不说了,重点讲第三个通道,这个最有趣,跟电脑喇叭有关。
简单来说,图4-1展示的就是PC发声的完整电路。第三个定时器(也就是通道3)的G端连到了61H端口的bit0位上。如果你把61H端口的bit0设成1,那这个定时器就被激活了,然后就会从OUT端输出一个可以控制频率的信号;如果bit0是0,那定时器就关了,OUT也会一直保持高电平1。
这个设计其实就像个开关,如果你同时把61H端口的bit0和bit1都设成1,那就是既打开了定时器,又打开了开关,这样声音就能传到喇叭那边,响起来。如果你只动bit0,让bit1为0,这时候即使定时器开着,声音也被堵住了,听不到。
这个现象可以用DEBUG验证一下:进DEBUG之后,在提示符后面输入O61 3,就能听到电脑喇叭一直在叫。(记得要在纯DOS环境下测试)
这个时候往61H端口发送03,其实就是把定时器和开关都打开,发出的声音大概在896Hz左右,跟你开机时候那个蜂鸣声差不多。
有意思的是,一旦声音开始播放就不会自动停,也不会影响你操作电脑。
想停这声音只能再进DEBUG,输入O61 0(也可以是1或2),才能把它关掉。为什么会这样?因为定时器工作的时候不需要CPU盯着,CPU只要设置好参数,启动之后就可以干别的去了。这种机制其实很有用,也为实现背景音乐打下了基础。
那怎么调整声音的频率?注意定时器通道3还有一个CLK输入端,这里接入了一个固定频率的信号,大约是1193181.6Hz。输出频率和这个输入频率之间的关系是这样的:
F(OUT) = F(CLK) / N
就这样啦,感觉像在给朋友讲电脑底层是怎么整出声音来的~
以前老式的PC机里面有个专门用来计时的芯片,叫8253或者8254,它有三个通道。前两个是管系统时钟和内存刷新的,咱就不说了,重点讲第三个通道,这个最有趣,跟电脑喇叭有关。
简单来说,图4-1展示的就是PC发声的完整电路。第三个定时器(也就是通道3)的G端连到了61H端口的bit0位上。如果你把61H端口的bit0设成1,那这个定时器就被激活了,然后就会从OUT端输出一个可以控制频率的信号;如果bit0是0,那定时器就关了,OUT也会一直保持高电平1。
这个设计其实就像个开关,如果你同时把61H端口的bit0和bit1都设成1,那就是既打开了定时器,又打开了开关,这样声音就能传到喇叭那边,响起来。如果你只动bit0,让bit1为0,这时候即使定时器开着,声音也被堵住了,听不到。
这个现象可以用DEBUG验证一下:进DEBUG之后,在提示符后面输入O61 3,就能听到电脑喇叭一直在叫。(记得要在纯DOS环境下测试)
这个时候往61H端口发送03,其实就是把定时器和开关都打开,发出的声音大概在896Hz左右,跟你开机时候那个蜂鸣声差不多。
有意思的是,一旦声音开始播放就不会自动停,也不会影响你操作电脑。
想停这声音只能再进DEBUG,输入O61 0(也可以是1或2),才能把它关掉。为什么会这样?因为定时器工作的时候不需要CPU盯着,CPU只要设置好参数,启动之后就可以干别的去了。这种机制其实很有用,也为实现背景音乐打下了基础。
那怎么调整声音的频率?注意定时器通道3还有一个CLK输入端,这里接入了一个固定频率的信号,大约是1193181.6Hz。输出频率和这个输入频率之间的关系是这样的:
F(OUT) = F(CLK) / N
就这样啦,感觉像在给朋友讲电脑底层是怎么整出声音来的~