哎呀這段技術貼看著好硬核啊,那我來用普通網友的口吻、口語化地改寫一下吧,盡量簡潔明了,也加點網絡語言進去:
以前老式的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
就這樣啦,感覺像在給朋友講電腦底層是怎么整出聲音來的~