在一般的单片机教材中,对蜂鸣器的使用都有简单的说明。这里就详细展开不同蜂鸣器,不同芯片的蜂鸣器写法了。
不过,在开发项目的时候发现,教材中的蜂鸣器使用存在很大的局限。
在教材中,对于蜂鸣器的长短都是用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;