按键控制蜂鸣器(有源和无源)(三)

目录

一 按键介绍

二 软件消抖 

三 有源蜂鸣器和无源蜂鸣器的区别

四 案例:按键控制蜂鸣器(无源发出不同频率的声音)

main.c

beep.c


一 按键介绍

轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开

一般情况下,按键按下后,电路导通,电路低电平 

按键控制蜂鸣器(有源和无源)(三)_第1张图片

 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动

二 软件消抖 

 这种抖动无法利用硬件设计解决,所以我们需要进行软件消抖,防止误差

因为按下和弹起都有抖动,所以都需要延时,将此段抖动过滤了

消抖代码

if(BT1 == 0)//检测第一个按键是否首次按下
		{
			delay(10);//延时消抖
			while(BT1 == 0);//检测松手
		    delay(10);//延时消抖
}

按键控制蜂鸣器(有源和无源)(三)_第2张图片

三 有源蜂鸣器和无源蜂鸣器的区别

和无源蜂鸣器的差异。首先这里的“源”不是指电源,而是指震荡源。不管是有源还是无源的,在原理图上都可以画成一样的。

 有源蜂鸣器内部带震荡源,所以一触发就会发声,发声频率固定。有源蜂鸣器的优点是程序控制方便,声压高。有源蜂鸣器要比无源蜂鸣器贵,贵在里面多了震荡源。有源自激型蜂鸣器工作发声原理如下:直流电源输入经过振荡系统的放大和取样电路在谐振装置作用下产生声音信号。

有源蜂鸣器只需要看原理图,看需要低电平导通还是高电平导通

sbit beep = P3^0; //定义引脚
beep = 0;   //将此IO口置低电平导通

四 案例:按键控制蜂鸣器(无源发出不同频率的声音)

main.c

#include 
#include "delay.h"
#include "beep.h"


typedef unsigned char u8;

sbit BUZZER=P1^0;//BUZZER代表有源蜂鸣器

u8 speed=1;//控制驱动无源蜂鸣器脉冲信号的周期,周期为2*speed毫秒,
           //一共由4种周期:2毫秒、4毫秒、8毫秒和16毫秒

sbit BT1=P2^0;//控制PNP三极管驱动的有源蜂鸣器的轻触按键,给低电平就能发声
sbit BT2=P2^1;//控制NPN三极管驱动的无源蜂鸣器的轻触按键,给一定频率的脉冲信号才能发声


void main()
{
	BUZZER=1;//开始让有源蜂鸣器不发声,PNP三极管是低电平导通
	while(1)
	{
		if(BT1 == 0)//检测第一个按键是否首次按下
		{
			delay(10);//延时消抖
				while(BT1 == 0);//检测松手
					delay(10);//延时消抖
					BUZZER=0;//按键松手时有源蜂鸣器开始发声
					delay(1000);//延时1秒钟
					BUZZER=1;//有源蜂鸣器停止发声
		}
		if(BT2 == 0)//每按键一次,发声一次,周期翻倍,频率减半,声音由清脆到雄浑循环
		{
		    delay(10);//延时消抖
				while(BT2 == 0);//检测松手
					delay(10);//延时消抖
					beep(speed);//以不同频率的脉冲信号驱动无源蜂鸣器发声,脉冲信号的周期为2*speed毫秒。
					speed*=2;//下次周期翻倍,频率减半
					if(speed>8)//只允许四种周期的脉冲信号:2毫秒、4毫秒、8毫秒和16毫秒,并周而复始地循环
						speed=1;
			
		}
	}
}

beep.c

#include 
#include "delay.h"
typedef unsigned char u8;
typedef unsigned int u16;


sbit SOUNDER=P3^0;//SOUNDRE代表无源蜂鸣器


/****************************************
函数名称  : beep    
函数功能  : 以一定频率驱动无源蜂鸣器发声
函数参数  : x表示一个周期内高低电平各占的时间,单位是毫秒,脉冲信号的周期为2x毫秒  
函数返回值: 无
****************************************/
void beep(u8 x)
{
	u16 i;
	for(i=0;i<200;i++)//所有的脉冲信号持续200/2=100个周期
	{
		delay(x);//延时x毫秒,也就是一个周期内高低电平各占x毫秒,
		SOUNDER=~SOUNDER;//取反,高电平变低电平,低电平变高电平
		//如果x=1,则脉冲的周期T为2毫秒,f=1/T=1/0.002=500Hz。
		//脉冲信号持续200/2=100个周期,也就是200毫秒
		//如果x=2,则脉冲的周期T为4毫秒,f=1/T=1/0.004=250Hz。
		//脉冲信号持续200/2=100个周期,也就是400毫秒
		//如果x=4,则脉冲的周期T为8毫秒,f=1/T=1/0.008=125Hz。
		//脉冲信号持续200/2=100个周期,也就是800毫秒
		//如果x=8,则脉冲的周期T为16毫秒,f=1/T=1/0.016=62.5Hz。
		//脉冲信号持续200/2=100个周期,也就是1600毫秒
	}
	
}

此案列的效果是但按键BT1按下后,有源蜂鸣器响,按键BT2按下后,每四下声音频率不一样,循环往复

你可能感兴趣的:(单片机学习,单片机,51单片机,c语言)