蜂鳴器發(fā)聲原理是電流通過電磁線圈,使電磁線圈產(chǎn)生磁場來驅(qū)動振動膜發(fā)聲的,因此需要一定的電流才能驅(qū)動它,單片機IO引腳輸出的電流較小,單片機輸出的TTL電平基本上驅(qū)動不了蜂鳴器,因此需要增加一個電流放大的電路。三極管的作用為驅(qū)動,通過三極管放大驅(qū)動電流,從而可以讓蜂鳴器發(fā)出聲音。
有源蜂鳴器和無源蜂鳴器的區(qū)別:
這里的“源”不是指電源。而是指震蕩源。 也就是說,有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會叫。
而無源內(nèi)部不帶震蕩源,所以如果用直流信號無法令其鳴叫。必須用2K~5K的方波去驅(qū)動它。
有源蜂鳴器往往比無源的貴,就是因為里面多個震蕩電路。
無源蜂鳴器的優(yōu)點是:1。便宜,2。聲音頻率可控,可以做出“多來米發(fā)索拉西”的效果。3。在一些特例中,可以和LED復(fù)用一個控制口 有源蜂鳴器的優(yōu)點是:程序控制方便 。
例程,參考自網(wǎng)絡(luò)。
1 /************************************************************************
2 [文件名] C51音樂程序(八月桂花)
3 [功能] 通過單片機演奏音樂
4
5 /**********************************************************************/
6 #include
7 #include
8 //本例采用89C52, 晶振為11.0592MHZ
9 //關(guān)于如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.
10 //頻率常數(shù)即音樂術(shù)語中的音調(diào),而節(jié)拍常數(shù)即音樂術(shù)語中的多少拍;
11 //所以拿出譜子, 試探編吧!
12
13 sbit Beep = P1^5 ;
14
15 unsigned char n=0; //n為節(jié)拍常數(shù)變量
16 unsigned char code music_tab[] ={
17 0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數(shù), 節(jié)拍常數(shù), 頻率常數(shù), 節(jié)拍常數(shù),
18 0x20, 0x40, 0x1C , 0x10,
19 0x18, 0x10, 0x20 , 0x10,
20 0x1C, 0x10, 0x18 , 0x40,
21 0x1C, 0x20, 0x20 , 0x20,
22 0x1C, 0x20, 0x18 , 0x20,
23 0x20, 0x80, 0xFF , 0x20,
24 0x30, 0x1C, 0x10 , 0x18,
25 0x20, 0x15, 0x20 , 0x1C,
26 0x20, 0x20, 0x20 , 0x26,
27 0x40, 0x20, 0x20 , 0x2B,
28 0x20, 0x26, 0x20 , 0x20,
29 0x20, 0x30, 0x80 , 0xFF,
30 0x20, 0x20, 0x1C , 0x10,
31 0x18, 0x10, 0x20 , 0x20,
32 0x26, 0x20, 0x2B , 0x20,
33 0x30, 0x20, 0x2B , 0x40,
34 0x20, 0x20, 0x1C , 0x10,
35 0x18, 0x10, 0x20 , 0x20,
36 0x26, 0x20, 0x2B , 0x20,
37 0x30, 0x20, 0x2B , 0x40,
38 0x20, 0x30, 0x1C , 0x10,
39 0x18, 0x20, 0x15 , 0x20,
40 0x1C, 0x20, 0x20 , 0x20,
41 0x26, 0x40, 0x20 , 0x20,
42 0x2B, 0x20, 0x26 , 0x20,
43 0x20, 0x20, 0x30 , 0x80,
44 0x20, 0x30, 0x1C , 0x10,
45 0x20, 0x10, 0x1C , 0x10,
46 0x20, 0x20, 0x26 , 0x20,
47 0x2B, 0x20, 0x30 , 0x20,
48 0x2B, 0x40, 0x20 , 0x15,
49 0x1F, 0x05, 0x20 , 0x10,
50 0x1C, 0x10, 0x20 , 0x20,
51 0x26, 0x20, 0x2B , 0x20,
52 0x30, 0x20, 0x2B , 0x40,
53 0x20, 0x30, 0x1C , 0x10,
54 0x18, 0x20, 0x15 , 0x20,
55 0x1C, 0x20, 0x20 , 0x20,
56 0x26, 0x40, 0x20 , 0x20,
57 0x2B, 0x20, 0x26 , 0x20,
58 0x20, 0x20, 0x30 , 0x30,
59 0x20, 0x30, 0x1C , 0x10,
60 0x18, 0x40, 0x1C , 0x20,
61 0x20, 0x20, 0x26 , 0x40,
62 0x13, 0x60, 0x18 , 0x20,
63 0x15, 0x40, 0x13 , 0x40,
64 0x18, 0x80, 0x00
65 };
66
67 void int0() interrupt 1 //采用中斷0 控制節(jié)拍
68 { TH0=0xd8;
69 TL0=0xef;
70 n--;
71 }
72
73 void delay (unsigned char m) //控制頻率延時
74 {
75 unsigned i=3*m;
76 while(--i);
77 }
78
79 void delayms(unsigned char a) //豪秒延時子程序
80 {
81 while(--a); //采用while(--a) 不要采用while(a--); 各位可編譯一下看看匯編結(jié)果就知道了!
82 }
83
84 void main()
85 { unsigned char p,m; //m為頻率常數(shù)變量
86 unsigned char i=0;
87 TMOD&=0x0f;
88 TMOD"=0x01;
89 TH0=0xd8;TL0=0xef;
90 IE=0x82;
91 play:
92 while(1)
93 {
94 a: p=music_tab[i];
95 if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到結(jié)束符,延時1秒,回到開始再來一遍
96 else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延時100ms,繼續(xù)取下一音符
97 else {m=music_tab[i++], n=music_tab[i++];} //取頻率常數(shù) 和 節(jié)拍常數(shù)
98 TR0=1; //開定時器1
99 while(n!=0) Beep=~Beep,delay(m); //等待節(jié)拍完成, 通過P1口輸出音頻(可多聲道哦!)
100 TR0=0; //關(guān)定時器1
101 }
102 }