历史上的今天
返回首页

历史上的今天

今天是:2025年03月19日(星期三)

正在发生

2020年03月19日 | 单片机中蜂鸣器的多种运用

2020-03-19 来源:eefocus

在一般的单片机教材中,对蜂鸣器的使用都有简单的说明。这里就详细展开不同蜂鸣器,不同芯片的蜂鸣器写法了。


不过,在开发项目的时候发现,教材中的蜂鸣器使用存在很大的局限。


在教材中,对于蜂鸣器的长短都是用delay这种忙循环来控制的,但实际中,这种函数不仅对CPU资源有极大浪费,而且会延后其他函数的运行,如果有些时间相关的函数,会造成时间错乱。


此外在蜂鸣器响的过程中,不能进行除了中断之外的任何操作。严格来说,除了主函数是无限循环外,其他的任何对CPU空转的忙循环必须小心使用,而且时间不能过长。一般来说,毫秒级别的忙循环已经是不能容忍了。


另外,这种写法不能灵活的配置长响短响,每隔一定时间响几下等高级功能。


不过经过查阅发现,蜂鸣器的开和关是两个不同的过程。


因此我的实现了蜂鸣器开/关两个函数和配套的其他相关函数。


蜂鸣器开函数的作用是开蜂鸣器,设置时间(长响,短响,中响),设置次数。


蜂鸣器关函数的作用是查询开函数的设置量,决定什么时候关蜂鸣器,什么时候再次开蜂鸣器,什么时候不再开蜂鸣器。


局部全局变量控制次数,定时器全局变量控制时间。


看上面的描述可以确定开函数是随意使用的,而关函数却必须在主函数中不断的循环查询设置量。


下面是函数示例。


一,必要的初始化


//////////////////蜂鸣器时长变量声明/////////////////////

typedef enum //开启时间

{

  BEEP_SHORT  = SEC_01, //100ms

  BEEP_MIDDLE = SEC_03, //300ms

  BEEP_LONG   = SEC_04  //400ms

} BEEP_LAST;

typedef enum //关闭间隔

{

BEEP_FAST = SEC_03,

BEEP_SLOW = SEC_05

} BEEP_SHUT;


static uint8_t tmp_beep_cnt; //蜂鸣器计数临时存储

static BEEP_LAST tmp_beep_on; //蜂鸣器开启临时存储

static BEEP_SHUT tmp_beep_period; //蜂鸣器周期临时存储


二,蜂鸣器开

/************************************************************************/

/* 功能:蜂鸣器响

 * 描述:

 * 形参:开启的持续时间,关闭的持续时间(响一次随意),响次数(>0)

 * 返回:

 * 注意:次数不能写0                             */

/************************************************************************/

void beep_on(BEEP_LAST last, BEEP_SHUT off, uint8_t times)

{

BEEP_CSR |=1<<5; //开启蜂鸣器

freq.beep_on  = last; //响持续

freq.beep_period = last + off; //一次开和关的周期

 

tmp_beep_on = last;

tmp_beep_period = last + off;

if(times > 0)

tmp_beep_cnt = times - 1;

else

tmp_beep_cnt = 0;

}


三,蜂鸣器关

/************************************************************************/

/* 功能:蜂鸣器关闭

 * 描述:检测时间flag,为0时关闭,同时将次数减1

 * 形参:

 * 返回:

 * 注意:这是主循环里面的                             */

/************************************************************************/

void beep_off(void)

{

if (freq.beep_on == 0) //如果持续时间到了,关闭

{

BEEP_CSR &=~(1<<5); //关闭

if (tmp_beep_cnt) //蜂鸣器关闭,但是次数还有,等待条件满足重新打开

{

if (freq.beep_period == 0) //蜂鸣器周期已到

{

BEEP_CSR |=1<<5; //打开蜂鸣器

freq.beep_on  = tmp_beep_on; //赋值上一次持续时间

freq.beep_off = tmp_beep_period; //蜂鸣器周期重新计数

s_beep_cnt--; //次数减1

}

}

}

}


四,定时器处理,10ms中断一次。


/*蜂鸣器相关定时*/

if (freq.beep_on)

freq.beep_on--; //蜂鸣器开的持续时间

if(freq.beep_period)

freq.beep_period--; //蜂鸣器周期

推荐阅读

史海拾趣

达方(DARFON)公司的发展小趣事

随着市场竞争的加剧,达方电子意识到单一产品线的风险。因此,公司开始实施多元化战略,逐步拓展至电源元件、整合通讯元件等领域。通过多元化战略的实施,达方电子成功降低了经营风险,并为公司带来了新的增长点。

Frequency Devices公司的发展小趣事

为了进一步扩大市场份额,Frequency Devices公司积极实施国际化战略。公司通过参加国际电子展会、建立海外销售网络、与国际知名企业建立合作关系等方式,不断提升品牌国际影响力。同时,公司还根据不同国家和地区的市场特点,定制化开发符合当地需求的高频电子产品。这些努力使得Frequency Devices公司的产品成功打入多个国际市场,实现了全球化布局。

安普康(AMPCOM)公司的发展小趣事

在电子行业竞争日益激烈的背景下,安普康深知创新是企业发展的核心动力。因此,公司始终将研发投入作为重要战略之一。通过引进先进的生产设备和技术,安普康不断提升产品的品质和性能。同时,公司还积极与国内外知名企业和研究机构合作,共同开展技术研发和创新。这些努力使得安普康在光纤产品、布线产品等领域取得了多项专利,并成功推出了一系列具有市场竞争力的新产品。

广州盛炬(GZSJ)公司的发展小趣事

随着业务的不断发展,安普康开始积极寻求市场拓展和战略合作的机会。公司在香港市场取得了显著的成绩后,决定进一步拓展内地市场。通过设立深圳安普康科技有限公司等分支机构,安普康逐步在内地市场建立了完善的销售网络和服务体系。同时,公司还与多家知名企业建立了长期合作关系,共同开拓市场、分享资源。这些合作不仅提升了安普康的市场地位,也为其未来的发展奠定了坚实的基础。

锋鸣电子(Fengming)公司的发展小趣事

福斯特(FIRST)公司在光伏封装材料领域取得了显著成就。自2003年公司前身杭州福斯特热熔胶膜有限公司成立以来,团队成功研发出EVA太阳能电池胶膜,正式进军光伏行业。此后,公司不断投入研发,扩大产能,光伏胶膜(EVA/POE胶膜)的设计产能已达10.51亿平米。至2020年,公司光伏胶膜销量达8.65亿平米,占据全球市场份额约55%-60%,大幅领先其他竞争对手。这一成就不仅巩固了福斯特在光伏胶膜市场的领导地位,还推动了整个行业的发展。

ABCO公司的发展小趣事

在技术创新的基础上,ABCO公司开始积极拓展市场。公司通过与大型电子设备制造商建立合作关系,将产品应用于汽车、医疗、工业等多个领域。同时,ABCO公司还加强了品牌建设,通过参加国际电子展会、举办技术研讨会等方式,提升了品牌知名度和影响力。

问答坊 | AI 解惑

PDF——电源管理技术的飞跃

PDF——电源管理技术的飞跃!这个帖子如何??请留下您的意见。…

查看全部问答>

关于STK的疑问

这段时间要做STK相关的应用,之前没有什么经验,啃完了GSM11.14,还是有些疑问请教论坛的高手! Proactive SIM会在一次APDU交互过程中以91**代替9000表示一次APDU交互的成功,同时也是告知ME,自己有命令要传送。ME收到91**的状态字符之后,就会在 ...…

查看全部问答>

请要去中嵌学院学习嵌入式的朋友们注意了,你们千万不要受骗了,那个老板叶贵明是骗子啊!

我就是中嵌远程教学的学员,中嵌真的是骗人的,一开始什么都说好,老师态度也好,可是到后面这个远程学习平台根本就用不了,于是我就申请退学费,他们那个什么叶总(叶贵明)说得好听得很,说说什么这件事情完全是他们的问题,学费一定退,只是现在 ...…

查看全部问答>

物理基地址如何映射到应用程序可访问的空间?

物理基地址如何映射到应用程序可访问的空间? 我要访问研华PCM3724的PC104 I/O卡输入输出,其基地址为0x300. BYTE* PCMMem=(BYTE*)LocalAlloc(LPTR,10*sizeof(BYTE)); DWORD dwRegBase=0x0300; PHYSICAL_ADDRESS PhyAddr={dwRegBase,0}; DWORD ...…

查看全部问答>

求救请问在继电器触点保护用哪种电容,比较好,是高压电容,还是普通电容呀?

下图是我的继电器触点电路,里面用的是RC电路,不知道这样行不行,我的触点为12V/3A,请大家把我看看,如果用RC电路,不知道用哪种电容和电阻比较好?请指导我一下,谢谢了。   …

查看全部问答>

PC13为什么不能输出秒脉冲?

ST32F101的PC13口能输出校准时钟却不能输出秒脉冲是怎么回事?    /* Enable PWR and BKP clocks */     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);     /* Allow access to ...…

查看全部问答>

怪现象?串口发送丢数

使用STM32F103VC控制器,使用串口2,9600波特率,使用2.03库,程序很简单,用串口把一个数组顺序发出去, //和上位机通信 void uart2_send_byte(u8 ch) {   USART_SendData(USART2, ch);   /* Loop until the end of ...…

查看全部问答>

歡迎大家來討論:MCU 的 IO 口封裝為什麼不按順序排列?

以前 89C51 的 IO 口在封裝上都是都是從 0 到 7 的順序來排列,但是現在很多 MCU 的 IO 口都不是這樣排列的了,感覺一個字\"亂\".. 這其中有什麼奧秘嗎? 希望大家來討論討論.…

查看全部问答>

请问脉冲整形电路

想把一个正弦波(频率几十KHz,峰峰值-1.5V——+1.5V)通过脉冲整形电路处理成方波给FPGA处理,看了几款施密特芯片(74LS132……),输入要求都是0V——5V左右请问这种情况该如何处理? …

查看全部问答>

TI Sitara 的AM18系列入门-编译

Sitara  有强大的HMI,HMI设备包括硬件与软件。这里的软件也就是组态软件,硬件我更关心的是他的串口和以太网接口。  在有些的情况下可能要使用的串口会非常的多,可能会达到七八个之多,这是就很少有CPU可以达到这个程度,这时 ...…

查看全部问答>