目錄
前言
一、蜂鳴器介紹
二、蜂鳴器的工作原理
三、示例代碼
總結(jié)
前言
? ? ? ? 這節(jié)來看點輕松的,51單片機的蜂鳴器。
一、蜂鳴器介紹
????????蜂鳴器是一種將電信號轉(zhuǎn)換為聲音信號的器件,常用來產(chǎn)生設(shè)備的按鍵音、報警音等。
????????蜂鳴器按驅(qū)動方式可分為有源蜂鳴器和無源蜂鳴器。
????????有源蜂鳴器:內(nèi)部自帶振蕩源,將正負極接上直流電壓即可持續(xù)發(fā)聲,頻率固定。
????????無源蜂鳴器:內(nèi)部不帶振蕩源,需要控制器提供振蕩脈沖才可發(fā)聲,調(diào)整提供振蕩脈沖的頻率,可發(fā)出不同頻率的聲音,通常是低電平觸發(fā),我們開發(fā)板上的蜂鳴器就是無源蜂鳴器。
? ? ?
二、蜂鳴器的工作原理
? ? ? ? 它的工作原理也很簡單,通過不斷反轉(zhuǎn)BEEP引腳的電平來發(fā)出聲音,而且隨著電平翻轉(zhuǎn)頻率的變化,它的音調(diào)也會變化,依據(jù)此原理可以用蜂鳴器來播放音樂。如果電平不變,那它是不響的,這就好比人敲鼓,把鼓錘放在鼓面上肯定是不會響的哈。
????????不過有源蜂鳴器接電就能響,是因為它內(nèi)部有固定的振蕩源,所以大多有源蜂鳴器音調(diào)也是固定的。我手頭剛好有一塊:
? ? ? ? 連好VCC和GND后,IO端檢測到低電平即可鳴叫。
三、示例代碼
? ? ? 第一個示例:按鍵提示音
#include <REGX52.H>
#include <Delay.H> //該Delay函數(shù)是1ms
//蜂鳴器端口:
sbit Buzzer=P1^5; //蜂鳴器引腳定義,看開發(fā)板原理圖上是幾就寫幾
void Buzzer_Time(unsigned int ms) //傳入的參數(shù)為響的時間,單位ms
{
unsigned int i;
for(i=0;i<ms;i++)
{
Buzzer=!Buzzer;
Delay(1); //該參數(shù)可以決定鳴叫的音調(diào)和時間
}
}
void Delay(unsigned int xms) //1ms的延時函數(shù)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Buzzer.h"
unsigned char KeyNum;
void main()
{
Nixie(1,0);
while(1)
{
KeyNum=Key();
if(KeyNum)
{
Buzzer_Time(100); //當按鍵按下時響100ms
Nixie(1,KeyNum); //同時數(shù)碼管顯示鍵值
}
}
}
第二個示例:播放音樂
? ? ? ? 在定時器中設(shè)置不同的初值以實現(xiàn)不同的頻率,蜂鳴器的音調(diào)也是不同的,需要看著譜子將每個節(jié)拍音調(diào)一一寫進數(shù)組,然后在循環(huán)中輸出到蜂鳴器。
? ? ? ? 這部分需要了解一些樂理知識哈,這是一首《天空之城》的代碼
#include <REGX52.H>
void Timer0Init(void);
void Delay(unsigned int xms);
//蜂鳴器端口定義
sbit Buzzer=P2^5;
//播放速度,值為四分音符的時長(ms)
#define SPEED 500
//音符與索引對應(yīng)表,P:休止符,L:低音,M:中音,H:高音,下劃線:升半音符號#
#define P 0
#define L1 1
#define L1_ 2
#define L2 3
#define L2_ 4
#define L3 5
#define L4 6
#define L4_ 7
#define L5 8
#define L5_ 9
#define L6 10
#define L6_ 11
#define L7 12
#define M1 13
#define M1_ 14
#define M2 15
#define M2_ 16
#define M3 17
#define M4 18
#define M4_ 19
#define M5 20
#define M5_ 21
#define M6 22
#define M6_ 23
#define M7 24
#define H1 25
#define H1_ 26
#define H2 27
#define H2_ 28
#define H3 29
#define H4 30
#define H4_ 31
#define H5 32
#define H5_ 33
#define H6 34
#define H6_ 35
#define H7 36
//索引與頻率對照表
unsigned int FreqTable[]={
0,
63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
};
//樂譜
unsigned char code Music[]={
//音符,時值,
//1
P, 4,
P, 4,
P, 4,
M6, 2,
M7, 2,
H1, 4+2,
M7, 2,
H1, 4,
H3, 4,
M7, 4+4+4,
M3, 2,
M3, 2,
//2
M6, 4+2,
M5, 2,
M6, 4,
H1, 4,
M5, 4+4+4,
M3, 4,
M4, 4+2,
M3, 2,
M4, 4,
H1, 4,
//3
M3, 4+4,
P, 2,
H1, 2,
H1, 2,
H1, 2,
M7, 4+2,
M4_,2,
M4_,4,
M7, 4,
M7, 8,
P, 4,
M6, 2,
M7, 2,
//4
H1, 4+2,
M7, 2,
H1, 4,
H3, 4,
M7, 4+4+4,
M3, 2,
M3, 2,
M6, 4+2,
M5, 2,
M6, 4,
H1, 4,
//5
M5, 4+4+4,
M2, 2,
M3, 2,
M4, 4,
H1, 2,
M7, 2+2,
H1, 2+4,
H2, 2,
H2, 2,
H3, 2,
H1, 2+4+4,
//6
H1, 2,
M7, 2,
M6, 2,
M6, 2,
M7, 4,
M5_,4,
M6, 4+4+4,
H1, 2,
H2, 2,
H3, 4+2,
H2, 2,
H3, 4,
H5, 4,
//7
H2, 4+4+4,
M5, 2,
M5, 2,
H1, 4+2,
M7, 2,
H1, 4,
H3, 4,
H3, 4+4+4+4,
//8
M6, 2,
M7, 2,
H1, 4,
M7, 4,
H2, 2,
H2, 2,
H1, 4+2,
M5, 2+4+4,
H4, 4,
H3, 4,
H3, 4,
H1, 4,
//9
H3, 4+4+4,
H3, 4,
H6, 4+4,
H5, 4,
H5, 4,
H3, 2,
H2, 2,
H1, 4+4,
P, 2,
H1, 2,
//10
H2, 4,
H1, 2,
H2, 2,
H2, 4,
H5, 4,
H3, 4+4+4,
H3, 4,
H6, 4+4,
H5, 4+4,
//11
H3, 2,
H2, 2,
H1, 4+4,
P, 2,
H1, 2,
H2, 4,
H1, 2,
H2, 2+4,
M7, 4,
M6, 4+4+4,
P, 4,
0xFF //終止標志
};
unsigned char FreqSelect,MusicSelect;
void main()
{
Timer0Init();
while(1)
{
if(Music[MusicSelect]!=0xFF) //如果不是停止標志位
{
FreqSelect=Music[MusicSelect]; //選擇音符對應(yīng)的頻率
MusicSelect++;
Delay(SPEED/4*Music[MusicSelect]); //選擇音符對應(yīng)的時值
MusicSelect++;
TR0=0;
Delay(5); //音符間短暫停頓
TR0=1;
}
else //如果是停止標志位
{
TR0=0;
while(1);
}
}
}
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Timer0Init(void)
{
TMOD &= 0xF0; //設(shè)置定時器模式
TMOD |= 0x01; //設(shè)置定時器模式
TL0 = 0x18; //設(shè)置定時初值
TH0 = 0xFC; //設(shè)置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1;
EA=1;
PT0=0;
}
void Timer0_Routine() interrupt 1
{
if(FreqTable[FreqSelect]) //如果不是休止符
{
/*取對應(yīng)頻率值的重裝載值到定時器*/
TL0 = FreqTable[FreqSelect]%256; //設(shè)置定時初值
TH0 = FreqTable[FreqSelect]/256; //設(shè)置定時初值
Buzzer=!Buzzer; //翻轉(zhuǎn)蜂鳴器IO口
}
}
????????欣賞下:
51單片機蜂鳴器文章來源:http://www.zghlxwxcb.cn/news/detail-492813.html
總結(jié)
? ? ? ? 主要了解蜂鳴器的分類和驅(qū)動原理就可以了。文章來源地址http://www.zghlxwxcb.cn/news/detail-492813.html
到了這里,關(guān)于51單片機蜂鳴器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!