蜂鳴器在單片機(jī)驅(qū)動(dòng)原理與設(shè)計(jì)
蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,本文介紹如何用單片機(jī)驅(qū)動(dòng)蜂鳴器,他廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電話機(jī)等電子產(chǎn)品中作發(fā)聲器件。
蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類(lèi)型。
電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動(dòng)膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過(guò)電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng),振動(dòng)膜片在電磁線圈和磁鐵的相互作用下,周期性地振動(dòng)發(fā)聲。
壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。多諧振蕩器由晶體管或集成電路構(gòu)成,當(dāng)接通電源后(1.5~15v直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHz的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。
下面是電磁式蜂鳴器的外形圖片及結(jié)構(gòu)圖
電磁式蜂鳴器實(shí)物圖: 電磁式蜂鳴器結(jié)構(gòu)示意圖:
電磁式蜂鳴器內(nèi)部構(gòu)成:
1. 防水貼紙
2. 線軸
3. 線圈
4. 磁鐵
5. 底座
6. 引腳
7. 外殼
8. 鐵芯
9. 封膠
10. 小鐵片
11. 振動(dòng)膜
12.電路板
一、電磁式蜂鳴器驅(qū)動(dòng)原理
蜂鳴器發(fā)聲原理是電流通過(guò)電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)來(lái)驅(qū)動(dòng)振動(dòng)膜發(fā)聲的,因此需要一定的電流才能驅(qū)動(dòng)它, 單片機(jī) io引腳輸出的電流較小,單片機(jī)輸出的ttl電平基本上驅(qū)動(dòng)不了蜂鳴器,因此需要增加一個(gè)電流放大的電路。s51增強(qiáng)型單片機(jī)實(shí)驗(yàn)板通過(guò)一個(gè)三極管c8550來(lái)放大驅(qū)動(dòng)蜂鳴器,原理圖見(jiàn)下面圖3:
s51增強(qiáng)型 單片機(jī) 實(shí)驗(yàn)板蜂鳴器驅(qū)動(dòng)原理圖:
蜂鳴器的正極接到vCC(+5v)電源上面,蜂鳴器的負(fù)極接到三極管的發(fā)射極e,三極管的基級(jí)b經(jīng)過(guò)限流電阻r1后由 單片機(jī) 的p3.7引腳控制,當(dāng)p3.7輸出高電平時(shí),三極管t1截止,沒(méi)有電流流過(guò)線圈,蜂鳴器不發(fā)聲;當(dāng)p3.7輸出低電平時(shí),三極管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過(guò)程序控制p3.7腳的電平來(lái)使蜂鳴器發(fā)出聲音和關(guān)閉。
程序中改變 單片機(jī) p3.7引腳輸出波形的頻率,就可以調(diào)整控制蜂鳴器音調(diào),產(chǎn)生各種不同音色、音調(diào)的聲音。另外,改變p3.7輸出電平的高低電平占空比,則可以控制蜂鳴器的聲音大小,這些我們都可以通過(guò)編程實(shí)驗(yàn)來(lái)驗(yàn)證。
二、蜂鳴器列子
下面我們舉幾個(gè)簡(jiǎn)單的 單片機(jī) 驅(qū)動(dòng)蜂鳴器的編程和電路設(shè)計(jì)的列子。
1、簡(jiǎn)單的蜂鳴器實(shí)驗(yàn)程序:本程序通過(guò)在p3.7輸出一個(gè)音頻范圍的方波,驅(qū)動(dòng)實(shí)驗(yàn)板上的蜂鳴器發(fā)出蜂鳴聲,其中delay延時(shí)子程序的作用是使輸出的方波頻率在人耳朵聽(tīng)覺(jué)能力之內(nèi)的20khz以下,如果沒(méi)有這個(gè)延時(shí)程序的話,輸出的頻率將大大超出人耳朵的聽(tīng)覺(jué)能力,我們將不能聽(tīng)到聲音。更改延時(shí)常數(shù),可以改變輸出頻率,也就可以調(diào)整蜂鳴器的音調(diào)。大家可以在實(shí)驗(yàn)中更改#228為其他值,聽(tīng)聽(tīng)蜂鳴器音調(diào)的改變。
org 0000h
ajmp main ;跳轉(zhuǎn)到主程序
org 0030h
main: cpl p3.7 ;蜂鳴器驅(qū)動(dòng)電平取反
lcall delay ;延時(shí)
ajmp main ;反復(fù)循環(huán)
delay: MOV r7,#228 ;延時(shí)子程序,更改該延時(shí)常數(shù)可以改變蜂鳴器發(fā)出的音調(diào)
de1: djnz r7,de1
ret
end
2、倒車(chē)警示音實(shí)驗(yàn)程序:我們知道各種卡車(chē)、貨柜車(chē)在倒車(chē)時(shí)候,會(huì)發(fā)出倒車(chē)的蜂鳴警示提示音,同時(shí)警示黃燈也同步閃爍,提醒后面的人或車(chē)輛注意。本實(shí)驗(yàn)例程就實(shí)現(xiàn)倒車(chē)警示功能,通過(guò)實(shí)驗(yàn)板上的蜂鳴器發(fā)出警示音,同時(shí)通過(guò)實(shí)驗(yàn)板上p1.2和p1.5上的兩個(gè)黃色發(fā)光二極管來(lái)發(fā)出黃色警示燈。
org 0000h
ajmp start ;跳轉(zhuǎn)到初始化程序
org 0033h
start:
MOV sp,#60h ;sp初始化
MOV p3,#0ffh ;端口初始化
main: acall sound ;蜂鳴器發(fā)聲
acall ys500m ;延時(shí)
ajmp main
sound:
MOV p1,#11011011b ;點(diǎn)亮2個(gè)警示黃色發(fā)光二極管
MOV r2,#200 ;響200個(gè)周期
snd1: clr p3.7 ;輸出低電平t1導(dǎo)通,蜂鳴器響
acall ys1ms ;延時(shí)
setb p3.7 ;輸出高電平t1截止,蜂鳴器不響
acall ys1ms ;延時(shí)
djnz r2,snd1
MOV p1,#0ffh ;熄滅黃色警示燈
ret
ys1ms: ;1ms延時(shí)子程序
MOV r0,#2
yl1: MOV r1,#250 ;改變r(jià)0的數(shù)值可改變聲音頻率
djnz r1,$
djnz r0,yl1
ret
ys500m: ;500ms延時(shí)子程序
MOV r0,#6
yl2: MOV r1,#200
yl3: MOV r2,#250
djnz r2,$
djnz r1,yl3
djnz r0,yl2
ret
end
3、“叮咚”電子門(mén)鈴實(shí)驗(yàn)程序:常見(jiàn)的家用電子門(mén)鈴在有客人來(lái)訪時(shí)候,如果按壓門(mén)鈴按鈕時(shí),室內(nèi)會(huì)發(fā)出“叮咚”聲音,本實(shí)驗(yàn)程序模擬電子門(mén)鈴的發(fā)音,當(dāng)我們按壓實(shí)驗(yàn)板上的k1按鈕時(shí)候,蜂鳴器發(fā)出“叮咚”音樂(lè)聲,是一個(gè)比較實(shí)用的程序。
“叮咚”電子門(mén)鈴實(shí)驗(yàn)asm源程序: “叮咚”電子門(mén)鈴c語(yǔ)言源程序:
org 0000h
ljmp start ;跳轉(zhuǎn)到初始化程序
org 000bh
ljmp pgt0 ;跳轉(zhuǎn)到t0中斷服務(wù)程序
start:
obuf1 equ 30h ;初始化程序
obuf2 equ 31h
obuf3 equ 32h
obuf4 equ 33h
flagb bit 00h
stopb bit 01h
k1 bit p3.2 ;定義按鈕k1,作為門(mén)鈴按鈕
MOV tmod,#02h ;定時(shí)器初始化
MOV th0,#06h
MOV tl0,#06h
setb et0 ;啟動(dòng)定時(shí)器t0
setb ea ;啟動(dòng)總中斷
main: ;主程序
jb k1,main ;檢測(cè)k1按鈕
lcall ys10m ;延時(shí)去抖動(dòng)
jb k1,main
setb tr0 ;按鈕有效
MOV p1,#00h ;點(diǎn)亮按鈕指示燈
MOV obuf1,#00h
MOV obuf2,#00h
MOV obuf3,#00h
MOV obuf4,#00h
clr flagb
clr stopb
jnb stopb,$
MOV p1,#0ffh
ljmp main ;發(fā)出“叮咚”完畢,返回重新檢測(cè)按鈕
ys10m: ;10ms延時(shí)子程序
MOV r6,#20
d1: MOV r7,#248
djnz r7,$
djnz r6,d1
ret
pgt0: ;定時(shí)器t0中斷服務(wù)程序
inc obuf3 ;中斷服務(wù)程序中發(fā)出一聲“叮咚”響聲
MOV a,obuf3
cjne a,#100,next
MOV obuf3,#00h
inc obuf4
MOV a,obuf4
cjne a,#20,next
MOV obuf4,#00h
jb flagb,pgstp
cpl flagb
ajmp next
pgstp:
setb stopb
clr tr0
ljmp int0ret
next: jb flagb,sou2
inc obuf2
MOV a,obuf2
cjne a,#03h,int0ret
MOV obuf2,#00h
cpl p3.7
ljmp int0ret
sou2: inc obuf1
MOV a,obuf1
cjne a,#04h,int0ret
MOV obuf1,#00h
cpl p3.7
ljmp int0ret
int0ret:
reti
end
#include
unsigned char obuf1;
unsigned char obuf2;
unsigned int obuf3;
bit stopb;
bit flagb;
void main(void)
{
unsigned char i,j;
tmod=0×02; //定時(shí)器t0初始化
th0=0×06;
tl0=0×06;
et0=1;
ea=1; //允許總中斷
while(1)
{
if(p3_2==0) //檢測(cè)k1按鍵
{
p1=0×00;
for(i=10;i>0;i–)
for(j=248;j>0;j–);
if(p3_2==0)
{
obuf1=0;
obuf2=0;
obuf3=0;
flagb=0;
stopb=0;
tr0=1; //啟動(dòng)定時(shí)器t0,發(fā)出“叮咚”聲
while(stopb==0);
p1=0xff;
}
}
}
}
void t0(void) interrupt 1 using 0
{
obuf3++;
if(obuf3==2000)
{
obuf3=0;
if(flagb==0)
{
flagb=~flagb;
}
else
{
stopb=1;
tr0=0;
}
}
if(flagb==0)
{
obuf2++;
if(obuf2==3)
{
obuf2=0;
p3_7=~p3_7;
}
}
else
{
obuf1++;
if(obuf1==4)
{
obuf1=0;
p3_7=~p3_7;
}
}
}