蜂鸣器在电子产品中很常见,几乎现在的家电中都有,主要用来做声音提示。
8 ^- E) h% h! f5 p6 t4 }$ S$ b+ C% |6 o7 y% @
蜂鸣器从材料上分可以分为压电式蜂鸣器和电磁式蜂鸣器。
8 D/ F4 d! J6 r0 K7 B4 N" H; Q
8 m8 Y6 \; S1 b 压电式蜂鸣器: 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
8 _/ x- A+ o) q+ R
' C) ~2 I2 F) A% A* |) P; U& b! K 电磁式蜂鸣器:电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
( i n+ I8 S7 w; X0 V7 {: e
$ q. ~; X- B" k9 q$ @6 i蜂鸣器从驱动方式上可以分为有源蜂鸣器和无源蜂鸣器。; O: F$ D$ I4 H4 T
8 U5 _5 L/ l a) E6 P
有源蜂鸣器:内部自己带有驱动电路,只要在外部供上点之后,内部电路就会工作,驱动蜂鸣器内部分线圈进行振动,从而发出声音。. L& y% D1 S: C( e2 W% b
f) J! t* y7 k 无源蜂鸣器:内部没有振荡电路,直接给蜂鸣器供直流电时,蜂鸣器不会响,只有外部给蜂鸣器提供一个方波,蜂鸣器才能发出声音。6 C/ H9 M& t6 a4 W! ?( C& I
' K+ t8 V# X9 N4 O
驱动方式:
! w: m, b5 o, n+ R/ k7 |: l) C; Z3 w+ K1 m u; _
无源蜂鸣器驱动比较简单,直接用单片机IO口给蜂鸣器发送方波信号就行。7 W" [9 h8 s3 `6 `
( h% @$ I& L* A6 `5 H
/ y$ e5 u% s+ S* W2 c
, R3 w* B& H& \; k+ l 有源蜂鸣器驱动时,外部需要驱动电路。
6 v" }1 B5 ~* q' C% t. }' R$ ~; L/ e. O; r) F% L5 N0 h9 I& f
?. v! F, Z- h5 f0 r5 F' P8 Q! J g' p0 v1 W
常用的驱动方式就是直接通过三极管来驱动,三极管主要是用来放大电流,因为蜂鸣器响的时候需要的电流比较大,一般单片机口直接提供不了那么大的电流,给蜂鸣器反向并联一个二极管用来延长蜂鸣器的使用寿命。由于蜂鸣器内部有线圈,相当于一个电感,当蜂鸣器关闭的时候,会在线圈上产生一个反向电动势,这个二极管在蜂鸣器关闭的时候可以给线圈进行放电。# i1 K/ w/ M3 }
3 R1 H4 M% o; N% T: r1 ?+ b 用这个驱动电路驱动蜂鸣器的时候,在上电的一瞬间,有时候会听见蜂鸣器嘀的响一声,这时因为在单片机上电时,IO口未初始化之前,有的IO口默认会是高电平,这样当单片机上电的一瞬间,三极管基极就会瞬间又一个高电平,这时候蜂鸣器就会响一声,当IO口初始化完成之后,IO口设置为低电平,这时候三极管不导通,蜂鸣器就不响了,为了避免这种情况发生,一般都会给基极加一个比较大的下拉电阻。
. D$ k4 b, B7 k6 n' Q6 T* N2 T9 v! S
; W) |0 \) I$ m+ ^8 |% O* [
4 u9 g) k* b6 K/ d, T# J# M 给基极加一10K的下拉电阻这样在上电的瞬间,这个下拉电阻就会将三极管基极的电平拉为0,在上电的一瞬间蜂鸣器就不会响了。- ?2 t* O0 C% W8 @/ u' f
4 |: R/ Z3 T5 k) Q& K( ~: Q1 @* b4 V 这里驱动蜂鸣器使用的是有源蜂鸣器,虽然驱动电路复杂了一点,但是程序控制比较简单,只需要给IO口高低电平,就可以控制蜂鸣器响或者不响。蜂鸣器初始化代码如下:: [& Z: q/ w6 L* j% l$ o& {5 X$ b
0 |0 Z: i( }6 w; i6 Y! X
- #define BEEP PBout(8) //BEEP 蜂鸣器接口
4 ]( f- t3 ?6 Z( p% T; L* ` Z
$ j5 g. q7 s$ B5 f( X7 Z- void BEEP_Init(void)
& X$ l9 H1 E- b( L% ? - {
$ u2 ?3 f' r% `- t; s - GPIO_InitTypeDef GPIO_InitStructure; M- a+ ]; g7 ]9 K2 a% [
1 X; ?/ o# D1 t" O/ |- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
9 f( `/ _' X/ V8 u
" W( t- e! Q) W3 h- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
. p2 U# Q: y Q9 Y2 B5 X) e: _; \ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;4 _# u1 Q% ?5 b- X4 M, R2 s
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 [* a( @/ F$ S) R5 w0 H" u3 u& E/ O
- GPIO_Init(GPIOB, &GPIO_InitStructure); \ d5 Z6 Y$ s+ M, K7 c
- 3 n( ], j8 I" f0 ^
- GPIO_ResetBits(GPIOB, GPIO_Pin_8);
4 G) w% L$ f: `) \ s5 W - }
复制代码
1 C/ W( z& k! w5 d2 H将驱动蜂鸣器的口PB8设置为普通IO口,推挽输出就可以了。要蜂鸣器响的时候,直接给PB8口给高电平就行了。- int main(void)' s% s. x( h9 O: e
- {
, y* G& ]& X0 ?" e9 V - delay_init(); //延时函数初始化& s- h0 P3 e- h* m/ J* r0 j
- LED_Init(); //初始化与LED连接的硬件接口- e+ u. m; K b, k/ t9 ~% U
- BEEP_Init(); //初始化蜂鸣器
% j! V) F% A$ {" B - while(1)+ k8 R- @2 C, L7 n2 K. F
- {
) ?! E, F/ R5 [5 o- _ - BEEP = 1;
0 V( o* z" A1 _' V4 F - delay_ms(200); //延时300ms ' ^! R( h- S( W4 `$ N
- BEEP = 0;% p ?) T* c1 l( a
- delay_ms(200); //延时300ms
1 p4 d, @ I& D - }
, s0 `1 J, w, k& q- P - }
复制代码 ! Z% b }+ I9 s$ Q; S
在主程序中循环的让蜂鸣器一开一关,这样就可以听到蜂鸣器发出的嘀嘀嘀嘀的声音了。
) [% R" x; p k
; K: M9 S3 W2 |( P h* L; b* s8 y* r9 v8 z; v' q
|