有源蜂鳴器和無源蜂鳴器
這里的“源”不是指電源。而是指震蕩源
我們知道,紙盆揚聲器能發(fā)出聲音是因為紙盆的振動,要想紙盆振動,就要讓經(jīng)過揚聲器線圈的電流“通”、“斷”、“通”、“斷”......

有源蜂鳴器內(nèi)部有震蕩源,只要給它施加電流,它就會自動地“通”、“斷”、“通”、“斷”......,發(fā)出聲音,所以編程的時候只需令它兩端有電壓差就行了。但是它的震蕩源的頻率是固定的,故發(fā)出聲音的頻率不能變,即只能發(fā)出一種音調(diào)。
無源蜂鳴器內(nèi)部沒有震蕩源,想使它發(fā)出聲音,要在編程時使它兩端的電壓差是“高”、“低”、“高”、“低”......雖然在編程的時候復(fù)雜一點,但是我們可以通過控制蜂鳴器兩端電壓的頻率來控制其發(fā)出聲音的音調(diào)。
簡敘三極管
三極管分為PNP型和NPN型。B(BASE)基極,E(EMITTER)發(fā)射極,C(COLLECTOR)集電極。這兩型只是C和E位置不同,可以進行類比。這里我只拿PNP型來說。

三極管的用處簡單來說就是小電流驅(qū)動大電流。
小電流有多小呢?當(dāng)然也不能太小,假設(shè)這個小電流需要大于1mA吧。


蜂鳴器用小電流驅(qū)動不起來,但是單片機不能輸出大電流,需要額外的電源為蜂鳴器提供大電流。通過三極管,我們就可以通過單片機輸出的小電流控制通過蜂鳴器的大電流。
所以蜂鳴器的電路長這個模樣

P23引腳內(nèi)部接有上拉電阻。(通俗解釋,“上拉”,電壓往上拉,即高電平5V?!半娮琛保@條支路上接有一個電阻)

編程思路
VCC電位也是5V,R10電阻兩端不存在壓差,電流為0A,沒有達到所需的“小電流”。編程P23引腳為低電平,達到“小電流”,蜂鳴器支路導(dǎo)通,發(fā)出聲音。
#include <reg52.h>
sbit beep = P2^3; //P23引腳位定義,命名為beep
void delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > 0; x--)
for(y = 114; y >0; y--);
}
void main()
{
while(1)
{
beep = ~beep; //按位取反,原來是0就變1;原來是1,就變0
delay(100); //延時100ms,不要讓它一直叫
}
}