当前位置:看商机 > 行业资讯 > 资讯 > 单片机有源蜂鸣器驱动之效率编程

单片机有源蜂鸣器驱动之效率编程

发布时间:2020-12-28 11:21:21 点击次数:392

蜂鸣器是十分常见的装置,分成无源和有源,根据项目需要选项不同种类的蜂鸣器,在最近的项目中很有用有源蜂鸣器对有源蜂鸣器,它依然是旧的,完成绘图电路板然后编程。

该项目示意图如下:

1.jpg

如果不能确保I/O的输出性能,则可以根据状况添加上拉或下拉电阻。

让我们指出一点:程序中的蜂鸣器驱动器是高电平和低电平驱动器,高电平晶体管开启,蜂鸣器发出声音,低电平晶体管关闭,蜂鸣器从未声音。这真的很简单,我在程序的开头写了这个:

1.jpg

当然,如果微控制器的I/O跳变函数不好,也可以这样改动它:

2.jpg

这里有一些解释:

1)

功能功能:蜂鸣器声驱

传入参数:蜂鸣器声音时间

2)

函数中传入的cnt的数目需要加倍,这是因为传入的参数是蜂鸣器连续发声的,但是当蜂鸣器不发声时,它也不会发声。蜂鸣器每次响起时都需要关闭。如果从未关闭操作,将不会发出声音,只有连续的声音。这也很容易推测。

3)

while循环终止后,需要添加蜂鸣器以关闭操作。

如果此处传送的参数为2,目的是使蜂鸣器响两次,根据程序的执行步骤:

cnt2变为4。

第一次while(4)蜂鸣器开cnt自减到3

while(3)蜂鸣器关cnt第二次减少为2

第三次while(2)蜂鸣器开cnt自减到1

第四while(1)蜂鸣器关cnt减少为0

第5while(0)跳出

可以见到while之后早就关闭了蜂鸣器状况,但是为了安全起见,请保证在调用该函数后关闭了蜂鸣器,例如第一个函数I/Ojumping需要受到更多保护,因为代码只能见到跳转,而跳转后的状况则看不到。

至此,对简单的蜂鸣器电路和驱动器开展了审查,然后对干货展开了审查:

在编撰程序时,很多时候都在关心程序的效率,例如蜂鸣器驱动程序,在驱动过程中效率会减低,有能力的人迅速就会发现这是Delay延迟疑问。前面提到过,它不会随即工作,因此它往往会更高效,我尝试了一种不同的方法来驱动蜂鸣器。

代码显示如下:

3.jpg

它的实现也十分简单,只需简短说明一下法则即可:

1)首先是提供蜂鸣器驱动的I/O配置,

2)接下来是定时器的配置

3)最终,定时器interrupt函数实现

我选取的定时器是项目微控制器中最简单的定时器。它被配置为1ms中断并可以提供溢出中断。其实,此定时器i一般而言会测算系统运行时间Systick_ms。,但是项目不使用系统时间,请使用此定时器做文章。

实现方法:

1.调用蜂鸣器驱动程序时,同一功能的界面相同,输入参数依然是蜂鸣器的声音数目。

2.函数体已改动,这是两个变量的赋值,第一个BELL_@CNT在一般而言方法中与cnt2相同,因此在此不再赘述。第二个是FLAG_BELL是用以保存是否需要驱动蜂鸣器的状况变量,因此由于它正在调用驱动程序函数,因此此变量须要为true。

3.定时器静态变量被添加到NOW中断功能。他的效用是通过Systic_ms生成一个50ms的时间片。为什么使用它?须要是蜂鸣器开关的时间延迟。模拟软件延迟。然后让我们分析一下这段代码:

1)首先,需要无条件分派NOW和Systic_@ms以保证50ms的时间片,相应的代码为NOW=Systick_ms+50;

2)判断蜂鸣器是否驱动状况变量,如果不正确,请关闭蜂鸣器,这也是无条件的。

3)如果状况变量为真:蜂鸣器先跳变Bell_Tog();当然,如果从未此跳转功能,也可以使用上面的cnt判断方法,不写多写也是一样,同时@nz的次数减少@_cnt--;同时判断是否减为0。如果减为0,则表示声音早已终结,则将状况变量赋值为false。再度进入时,无论蜂鸣器是否在开启或关闭,它将关闭。这与上述保险相同。

4)最终,这两个变量是全局变量,此处以构造形式表示,因为在很多状况下这两个函数不在同一个c中。如果您坚持用c编纂,则可以忽视本文。