51单片机:蜂鸣器

时间:2024-11-14 06:58:12

小白向单片机笔记二:蜂鸣器

  • 前言
  • 一、蜂鸣器原理
  • 二、蜂鸣器原理图
    • 1.蜂鸣器代码
    • 2.代码解释
      • 1. 为什么蜂鸣器响,和LED6闪烁中有两个delay()函数?
      • 2. 为什么BEEP=1是关闭LED6, 而i=0是关闭蜂鸣器?
  • 总结


前言

蜂鸣器原理及代码


一、蜂鸣器原理

知识拓展: 根据蜂鸣器发声方式不同,主要分为压电式和电磁式。同时根据蜂鸣器结构,分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器自带震荡电路,接通电源即可发声。

振荡器电路的作用:产生脉冲信号。

无源蜂鸣器 需要提供一定频率的脉冲信号才能发声,频率一般在 1.5-5KHZ

通过调节脉冲频率可改变音调,通过改变高低电平占空比可以调节音量。

二、蜂鸣器原理图

蜂鸣器正常工作需要约30mA电流,C51芯片是用来控制,如果用C51芯片驱动蜂鸣器,无法保证其他器件正常工作。所以使用时要放大电流来驱动蜂鸣器(使用三级管或下图的ULN2003D)。

ULN2003D 其中一个功能就是放大电流。
在这里插入图片描述
通过C51芯片的P2^5引脚持续输出脉冲信号(即高低电平交替),经过ULN2003D芯片放大电流从BEEP引脚输出到蜂鸣器即可发声。

注意P2^5引脚同时控制着LED6,当脉冲信号在一定频率时,可以观察到LED6的闪烁,这就是为什么在LED实验中会有滴答滴答的声音。

1.蜂鸣器代码

#include ""
typedef unsigned int uint  ;
typedef unsigned char uchar	;
sbit BEEP = P2^5 ;

void delay(uint i){
	 while(i--){
	 }
}

void main(){
	uint i=100;//调整脉冲频率
	while(1){
		while(i--){//当i减为0即蜂鸣器关闭,因无脉冲电流
			/*//蜂鸣器响,和LED6闪烁
			delay(1000);
			BEEP = !BEEP;
			delay(1000);
			 */

			 /*调整空占比,从而调整音量,空占比:高电平占一个周期的比例*/
			 BEEP=1;
			 delay(100);
			 BEEP=0;
			 delay(10);
		}
		BEEP=1;	 //关闭第六个LED
		//i=0;//关闭蜂鸣器	
	}
}

2.代码解释

1. 为什么蜂鸣器响,和LED6闪烁中有两个delay()函数?

因为在实验过程中可以顺便同时观察LED6的闪烁,如果不考虑LED6的情况,可以只使用一个delay()函数。

2. 为什么BEEP=1是关闭LED6, 而i=0是关闭蜂鸣器?

因为BEEP是由P2^5引脚控制,P2^5同时控制LED6,对于蜂鸣器BEEP为高电平还是低电平都没有关系,因为只有脉冲信号才能使无源蜂鸣器工作。将BEEP设置为高电平,是因为P2^5默认输出的就是高电平。

i=0是因为不执行内循环,从而不产生脉冲信号,从而使得蜂鸣器关闭。单片机配套的开发攻略这部分代码注释有点问题。


总结

如果要自己做些小玩意,数模电很重要,可惜学不会。