一、蜂鳴器介紹
蜂鳴器是一種將電信號轉(zhuǎn)換為聲音信號的器件,常用來產(chǎn)生設(shè)備的按鍵音、報警音等提示信號
蜂鳴器按驅(qū)動方式可分為有源蜂鳴器和無源蜂鳴器
有源蜂鳴器:內(nèi)部自帶振蕩源,將正負(fù)極接上直流電壓即可持續(xù)發(fā)聲,頻率固定
無源蜂鳴器:內(nèi)部不帶振蕩源,需要控制器提供振蕩脈沖才可發(fā)聲,調(diào)整提供振蕩脈沖的頻率,可發(fā)出不同頻率的聲音
二、驅(qū)動電路
2.1 三極管驅(qū)動
2.2 集成電路驅(qū)動
三、蜂鳴器播放音樂
3.1 鍵盤與音符對照
3.2 音符與頻率對照
3.3 簡譜
四、代碼演示
4.1 按鍵蜂鳴器播放提示音
main.c
#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);
Nixie(1,KeyNum);
}
}
}
Nixie.c
#include <REGX52.H>
#include "Delay.h" //包含Delay頭文件
//數(shù)碼管段碼表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//數(shù)碼管顯示子函數(shù)
void Nixie(unsigned char Location,Number)
{
switch(Location) //位碼輸出
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number]; //段碼輸出
// Delay(1); //顯示一段時間
// P0=0x00; //段碼清0,消影
}
Buzzer.c
#include <REGX52.H>
#include <INTRINS.H>
#include "Delay.h"
//蜂鳴器端口
sbit Buzzer=P2^5;
/**
* @brief 蜂鳴器私有延時函數(shù),延時500us
* @param 無
* @retval 無
*/
void Buzzer_Delay500us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 247;
while (--i);
}
/**
* @brief 蜂鳴器發(fā)聲
* @param ms 發(fā)聲時長
* @retval 無
*/
void Buzzer_Time(unsigned int ms)
{
unsigned int i;
for(i=0;i<ms*2;i++)
{
Buzzer=!Buzzer;
Buzzer_Delay500us();
}
}
Buzzer.h
#ifndef __BUZZER_H__
#define __BUZZER_H__
void Buzzer_Time(unsigned int ms);
#endif
Nixie.h
#ifndef __NIXIE_H__
#define __NIXIE_H__
void Nixie(unsigned char Location,Number);
#endif
key.c
#include <REGX52.H>
#include "Delay.h"
unsigned char Key()
{
unsigned char KeyNumber=0;
if(P3_1==0)
{
Delay(20);while(P2_1==0);Delay(20);KeyNumber=1;
}
if(P3_0==0)
{
Delay(20);while(P2_0==0);Delay(20);KeyNumber=2;
}
if(P3_2==0)
{
Delay(20);while(P2_2==0);Delay(20);KeyNumber=3;
}
if(P3_3==0)
{
Delay(20);while(P2_3==0);Delay(20);KeyNumber=4;
}
return KeyNumber;
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
unsigned char Key();
#endif
Delay.c
void Delay(unsigned int i)
{
while(i--);
}
Delay.h文章來源:http://www.zghlxwxcb.cn/news/detail-781256.html
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int i);
#endif
4.2 小星星
#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"
//蜂鳴器端口定義
sbit Buzzer=P2^5;
//播放速度,值為四分音符的時長(ms)
#define SPEED 50
//索引與頻率對照表
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 Music[]={
13,4,
14,4,
20,4,
20,4,
22,4,
22,4,
20,4+4,
0,4,
18,4,
18,4,
17,4,
17,4,
15,4,
15,4,
13,4+4,
0xFF,
};
unsigned char FreqSelect,MusicSelect;
void main()
{
Timer0_Init();
while(1)
{
if(Music[MusicSelect]!=0xFF) //如果不是停止標(biāo)志位
{
FreqSelect=Music[MusicSelect]; //選擇音符對應(yīng)的頻率
MusicSelect++;
Delay(SPEED/4*Music[MusicSelect]); //選擇音符對應(yīng)的時值
MusicSelect++;
TR0=0;
Delay(5); //音符間短暫停頓
TR0=1;
}
else //如果是停止標(biāo)志位
{
TR0=0;
while(1);
}
}
}
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口
}
}
注意:一定要看
千萬不要直接復(fù)制代碼,因為是模塊化編寫,模塊的代碼沒有往上復(fù)制,大家一定要自己動手跟著教學(xué)視屏自己寫?。。。。?/strong>文章來源地址http://www.zghlxwxcb.cn/news/detail-781256.html
到了這里,關(guān)于MCU-51:單片機蜂鳴器播放音樂和提示音的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!