单片机有源蜂鸣器驱动之效率编程
发布时间: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编纂,则可以忽视本文。

