函式聲音C語言的發聲程式

2021-09-06 09:40:49 字數 2761 閱讀 5489

近期一直在查詢函式聲音之類的問題,上午正好有機會和大家分享一下.

c語言盤算機發音程式

[ 問題的提出]  曲譜的1 、2 、3 、4、5 、6 、7 ,加上高低音可以譜出動人的曲子,請編寫程

硬體揚聲器電路有關。

[ 解答]  處理這一程式設計問題,讓我們首先簡單了解一下盤算機發聲的道理。在 pc 機的系統

板上裝有定時與計數器8253 晶元,還有 8255 可程式設計並行介面晶元,由它們構成的硬體電路

可用來發生pc機內揚聲器的聲音,對於 286、386、486、586 等pc微機,由於採取了超大

規模積體電路,因而看不到這些晶元,它們均整合在外圍電路晶元上了。

當我們操作盤算機時,常常聽到的發聲,就是由軟體控制這些電路而發生的。聲音的

長短和聲調的高低,均可由程式進行控制。在揚聲器電路中,定時器的頻率決議了揚聲器發

音的頻率,所以可通過設定定時器電路的頻率來使揚聲器發出不同的聲音。對定時器電路進

行頻率設定時,首先對其命令暫存器( 口位址為0x43)寫命令字,如寫入0xb6,這可用

outporb(0x43,0xb6);來實現,則表示選擇該定時器的第二個通道,計數頻率先送低8 位(二

進製),後送高8 位。接著用口位址0x42送頻率計數值,先送低 8 位,後送高8 位,即用

outportb(0x42 ,低8 位頻率計數值)和outportb(0x42 ,高8 位頻率計數值)來實現。通過這兩

步使定時器電路發生一系列方波訊號,此訊號是否能推進揚聲器發音,還要看由8255發生

的門控訊號和送數訊號是否為1 ,而它們也可程式設計,口位址為0x61。為了不影響 8255口地

址61h 中的其他高位,應先輸入口位址 6lh 的現有值 bits,即用bits= inportb(0x61) 來實現,

然後就可用outportb(0x61 ,bits|3)來答應發聲,而用outportb(0x61 ,bits&0xfc)來制止發聲,

且不轉變8255 其它位本來的值,關於這方面的詳細內容可以參閱ibm pc/xt 接**術方面

書籍有關內容。

關發聲的函式sound()和nosound()。sound()函式用於發生聲音,其原型如下:

void sound(unsigned frequency) ;

該函式的入口引數為揚聲器要發生聲音的頻率。

與sound()函式相反,nosound ()函式用於關閉揚聲器,其原型為:

void nosound(void) ;

該函式沒有入口和出口引數,它只是簡單地把口位址61h 中的低2 位清0 。

每日一道理

春蠶死去了,但留下了華貴絲綢;蝴蝶死去了,但留下了漂亮的衣裳;畫眉飛去了,但留下了美妙的歌聲;花朵凋謝了,但留下了縷縷幽香;蠟燭燃盡了,但留下一片光明;雷雨過去了,但留下了七彩霓虹。

在利用函式sound 發生指定頻率的聲音後,一般要過一段時光後再呼叫函式 nosound 關

閉揚聲器,這樣我們才能清楚地聽到乙個聲音。如果揚聲器剛開啟就關閉,我們是很難聽到

乙個聲音的。某個頻率的聲音連續時光的長短是重要的,它將直接影響音響效果。這需要使

用turboc供給了專門的延時函式delay,其原型說明如下:  

void delay (unsigned milliseconds);

該函式中斷程式的執行,中斷的時光由milliseconds指定。

例程  :該程式每間隔10000 milliseconds pc揚聲器發出不同頻率的聲音,直到頻率大於

5000hz 。

#include

main()

int freq;

for(freq=50;freq<5000;freq+=50)

sound (freq);

delay(10000);

nosound();   

如果不能應用上述現成的函式sound()和nosound(),當然我們也可以採取上節中的方法,

用i/o 介面的輸入輸出函式,自己編寫發生聲音和關閉聲音的函式。下面可供參考的函式

sound()與turboc供給的發生聲音函式sound()的演算法類似:首先函式sound()中應用

了乙個由乙個整數和兩個字元構成的聯合,其目的在於方便地把乙個16位數分解成兩個 8

位數。為了開啟揚聲器,需要把口位址 61h 的低 2 位置位,但又不能影響其他高位,為此,

先輸入口位址61h 中的現有值,與3 邏輯或後再輸出到口位址61h 。

void sound(unsigned frequency)

union  tone;

tone.divisor=119328/frequency ; /*  盤算該頻率對應的定時器計數值 */

outportb(0x43 ,0xb6); /* 通知定時器採取新的計數 */

outportb(0x42 ,tone.c[0]) ; /*  計數低位元組先送到定時器 */

outportb(0x42 ,tone.c[1]);  /*  計數高位元組後送到定時器 */

outportb(0x61, inportb(0x61) | 3 );   /*  使定時器到喇叭的輸出有效 */

址6lh 的現有值.在遮蔽掉低2 位後再輸出到口位址61h 。

void nosound(void)

outportb(0x61 ,inportb(0x61) & 0xfc));  /*  使定時器到喇叭的輸出無效 */

文章結束給大家分享下程式設計師的一些笑話語錄: 賈伯斯:怎麼樣還是咱安全吧!黑客:你的瀏覽器支援國內網銀嗎?蘋果可以玩國內的網遊嗎賈伯斯:......不可以黑客:那我研究你的漏洞幹嘛,我也需要買奶粉!

C 中發聲函式Beep詳解

by zhcs 首先我們來beep的函式原型 bool beep dword dwfreq dword dwduration 引數說明 beep 523,400 do beep 578,400 re beep 659,400 mi beep do,400 beep re,400 beep mi,40...

C語言中的程式終止函式

在c語言的標準庫中提供了一些與正常或者不正常的程式終止有關的函式,下面分別對其進行簡單介紹。1 c和指標,p298,342 2 c程式語言現代方法 第2版 p489 3 atexit函式和exit函式的理解 1 abort abort 函式用於不正常地終止乙個正在執行的程式。函式原型如下 void ...

乙個聲音的程式

include include include include include include include include 設定預設值 define default freq 10000 設定乙個合適的頻率 define default length 1000 200 微秒,發聲的長度是以微秒為...