视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
单片机驱动蜂鸣器原理与编程
2025-10-02 08:09:58 责编:小OO
文档
蜂鸣器是一种一体化结构的电子讯响器,本文介绍如何用单片机驱动蜂鸣器,他广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件。

蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。

下面是电磁式蜂鸣器的外形图片及结构图。。

电磁式蜂鸣器实物图:电磁式蜂鸣器结构示意图:

图 1

图 2

电磁式蜂鸣器内部构成:
1. 防水贴纸

2. 线轴

3. 线圈

4. 磁铁

5. 底座

6. 引脚

7. 外壳

8. 铁芯

9. 封胶

10. 小铁片

11. 振动膜

12. 电路板

一、电磁式蜂鸣器驱动原理

蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。S51增强型单片机实验板通过一个三极管C8550来放大驱动蜂鸣器,原理图见下面图3:

S51增强型单片机实验板蜂鸣器驱动原理图:

图 3

如图所示,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的P3.7引脚控制,当P3.7输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P3.7输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P3.7脚的电平来使蜂鸣器发出声音和关闭。

程序中改变单片机P3.7引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变P3.7输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程实验来验证。

二、蜂鸣器列子

下面我们举几个简单的单片机驱动蜂鸣器的编程和电路设计的列子。

1、简单的蜂鸣器实验程序:本程序通过在P3.7输出一个音频范围的方波,驱动实验板上的蜂鸣器发出蜂鸣声,其中DELAY延时子程序的作用是使输出的方波频率在人耳朵听觉能力之内的20KHZ以下,如果没有这个延时程序的话,输出的频率将大大超出人耳朵的听觉能力,我们将不能听到声音。更改延时常数,可以改变输出频率,也就可以调整蜂鸣器的音调。大家可以在实验中更改#228为其他值,听听蜂鸣器音调的改变。

ORG 0000H

AJMP MAIN ;跳转到主程序

ORG 0030H

MAIN: CPL P3.7 ;蜂鸣器驱动电平取反

LCALL DELAY ;延时

AJMP MAIN ;反复循环

DELAY:MOV R7,#228 ;延时子程序,更改该延时常数可以改变蜂鸣器发出的音调

DE1: DJNZ R7,DE1

RET

END

2、倒车警示音实验程序:我们知道各种卡车、货柜车在倒车时候,会发出倒车的蜂鸣警示提示音,同时警示黄灯也同步闪烁,提醒后面的人或车辆注意。本实验例程就实现倒车警示功能,通过实验板上的蜂鸣器发出警示音,同时通过实验板上P1.2和P1.5上的两个黄色发光二极管来发出黄色警示灯。

ORG 0000H

AJMP START ;跳转到初始化程序

ORG 0033H

START:

MOV SP,#60H ;SP初始化

MOV P3,#0FFH ;端口初始化

MAIN: ACALL SOUND ;蜂鸣器发声

ACALL YS500M ;延时

AJMP MAIN

SOUND:

MOV P1,#11011011B ;点亮2个警示黄色发光二极管

MOV R2,#200 ;响200个周期

SND1: CLR P3.7 ;输出低电平T1导通,蜂鸣器响

ACALL YS1ms ;延时

SETB P3.7 ;输出高电平T1截止,蜂鸣器不响

ACALL YS1ms ;延时

DJNZ R2,SND1

MOV P1,#0FFH ;熄灭黄色警示灯

RET

YS1ms: ;1ms延时子程序

MOV R0,#2

YL1: MOV R1,#250 ;改变R0的数值可改变声音频率

DJNZ R1,$

DJNZ R0,YL1

RET

YS500M: ;500ms延时子程序

MOV R0,#6

YL2: MOV R1,#200

YL3: MOV R2,#250

DJNZ R2,$

DJNZ R1,YL3

DJNZ R0,YL2

RET

END

3、“叮咚”电子门铃实验程序:常见的家用电子门铃在有客人来访时候,如果按压门铃按钮时,室内会发出“叮咚”声音,本实验程序模拟电子门铃的发音,当我们按压实验板上的K1按钮时候,蜂鸣器发出“叮咚”音乐声,是一个比较实用的程序。

“叮咚”电子门铃实验ASM源程序:

“叮咚”电子门铃C语言源程序:

ORG 0000H

LJMP START ;跳转到初始化程序

ORG 000BH

LJMP PGT0 ;跳转到T0中断服务程序 

START:

OBUF1 EQU 30H ;初始化程序

OBUF2 EQU 31H

OBUF3 EQU 32H

OBUF4 EQU 33H

FLAGB BIT 00H

STOPB BIT 01H

K1 BIT P3.2 ;定义按钮K1,作为门铃按钮

MOV TMOD,#02H ;定时器初始化

MOV TH0,#06H

MOV TL0,#06H

SETB ET0 ;启动定时器T0

SETB EA ;启动总中断

MAIN: ;主程序

JB K1,MAIN ;检测K1按钮

LCALL YS10M ;延时去抖动

JB K1,MAIN

SETB TR0 ;按钮有效

MOV P1,#00H ;点亮按钮指示灯

MOV OBUF1,#00H

MOV OBUF2,#00H

MOV OBUF3,#00H

MOV OBUF4,#00H

CLR FLAGB

CLR STOPB

JNB STOPB,$

MOV P1,#0FFH

LJMP MAIN ;发出“叮咚”完毕,返回重新检测按钮

YS10M: ;10ms延时子程序

MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

PGT0: ;定时器T0中断服务程序

INC OBUF3 ;中断服务程序中发出一声“叮咚”响声

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=0x02; //定时器T0初始化

TH0=0x06;

TL0=0x06;

ET0=1;

EA=1; //允许总中断

while(1)

{

if(P3_2==0) //检测K1按键

{

P1=0x00;

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; //启动定时器T0,发出“叮咚”声

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;

}

}

}

下载本文
显示全文
专题