stm32有源蜂鸣器程序,高效简洁优雅。

很多设备都需要使用蜂鸣器,来提示设备的操作有效或故障信息,例如DI一下代表设备按键单击有效,DI两下代表按键双击,长鸣代表设备出现故障;

蜂鸣器原理图如上图所示:BEEP=1时,蜂鸣器响;BEEP=0时,蜂鸣器不响。

最简单的办法就是采用软件延时处理,例如:

BEEP_ON();
Delay_ms(1000);
BEEP_OFF;

但是执行蜂鸣器程序时,会导致其他程序无法运行,例如按键扫描程序就无法正常工作。

所以我们可以用定时器来定时驱动和关闭蜂鸣器。

为了方便修改蜂鸣器的持续鸣叫时间,间隔时间,和鸣叫次数,我们采用数组的形式,驱动蜂鸣器的鸣叫。

Buzzer.c代码如下:

#define END 0xff //蜂鸣器驱动函数结束符号

u8 B_Sound_Enable;//蜂鸣器驱动函数使能
u8 on_time,off_time; //鸣叫时间,停止时间
u8 Index;            //数组元素索引
u8 Sound_Page;       //数组指针索引

uc8 Sound_Di[]={2,5,END};								 
uc8 Sound_Di_Di[]={2,5,2,5,END}; 
uc8 Sound_Di_Di_Di[]={2,5,2,5,2,5,END};
uc8 Sound_Di_Di_Di_Di_Di[]={2,5,2,5,2,5,2,5,2,5,END};
uc8 Sound_Di_2s[]={20,5,END};
uc8 Sound_Di_5s[]={50,5,END};

uc8 *const SoundMenu[]={Sound_Di,
						Sound_Di_Di,
					    Sound_Di_Di_Di,
					    Sound_Di_Di_Di_Di_Di,
						Sound_Di_2s,
						Sound_Di_5s};

//调用一次Sound_Set_int,蜂鸣器驱动函数就会执行一次,
//例如想让蜂鸣器Di一声,调用Sound_Set_int(d_Sound_Di)一次,蜂鸣器就会响一声。
void Sound_Set_int(u8 I)
{
	Sound_Page=I;
	Index=0;
	on_time=0;
	off_time=0;
	B_Sound_Enable=1;
}

//蜂鸣器驱动函数,放在定时器中断函数里面,100ms执行一次
void Sound_Output(void)
{
  if(B_Sound_Enable)
	{
		if(on_time)
		{
			on_time--;
			BEEP_ON();//蜂鸣器响
		}
		else if(off_time)
		{
			off_time--;
			BEEP_OFF();//蜂鸣器关
		}
		else
		{
			if(SoundMenu[Sound_Page][Index]==END)//读取结束符号END,关闭蜂鸣器,失能驱动函数
			{
				BEEP_OFF();
				B_Sound_Enable=0;
			}
			else
			{
				on_time=SoundMenu[Sound_Page][Index];
				off_time=SoundMenu[Sound_Page][Index+1];
				Index+=2;
			}
		}
  }
}

Buzzer.h代码如下:

#ifndef _BUZZER_H
#define _BUZZER_H
#include "user_define.h"

typedef unsigned char u8;
typedef const unsigned char uc8;

#define d_Sound_Di							0
#define d_Sound_Di_Di						1
#define d_Sound_Di_Di_Di				    2
#define d_Sound_Di_Di_Di_Di_Di	            3
#define d_Sound_Di_2s						4
#define d_Sound_Di_5s						5	

extern	void Sound_Set_int(u8 I);
extern	void Sound_Output(void);

#endif

代码使用手册:

1、把上面的.c和.h添加到自己的工程

2、开启定时器中断,在定时器中断函数调用Sound_Output(),定时时间决定了蜂鸣器的鸣叫时间和间隔,建议100ms,当然也可以修改uc8 Sound_Di[]={2,5,END};中的数值修改鸣叫时间

3、举例:uc8 Sound_Di_Di[]={2,5,2,5,END};中

      Sound_Di_Di[0]代表响的时间 2*100ms=200ms;

      Sound_Di_Di[1]表示不响的时间5*100ms=500ms;

      Sound_Di_Di[2]代表响的时间 2*100ms=200ms;

      Sound_Di_Di[3]表示不响的时间5*100ms=500ms;

      Sound_Di_Di[4]=END是结束符号,表示本次蜂鸣器的动作结束。

      以此类推其他数组的功能,用户可以自行添加数组,实现各种鸣叫方式。

4、用户添加数组后,需要把数组名放进 uc8 *const SoundMenu[]中,并且注意元素序号。

       例如添加 滴8s
        uc8 Sound_Di_8s[]={80,5,END};
        uc8 *const SoundMenu[]={Sound_Di,                        //序号0
                                                  Sound_Di_Di,                   //序号1     
                                                  Sound_Di_Di_Di,              //序号2
                                                  Sound_Di_Di_Di_Di_Di,   //序号3
                                                  Sound_Di_2s,                   //序号4
                                                  Sound_Di_5s                    //序号5
                                                  Sound_Di_8s };//新添加的元素,序号为6

#define d_Sound_Di_8s   6         //调用Sound_Set_int(d_Sound_Di_8s)

5、调用Sound_Set_int()一次,蜂鸣器响一次。不可一直调用,否则蜂鸣器长鸣。

       Sound_Set_int(d_Sound_Di)//滴一声

        Sound_Set_int(d_Sound_Di_Di)//滴两声

  • 8
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值