一、 项目需求 目前一个项目需要控制蜂鸣器发声,目前有两种方案可供选择:第一种方案就是使用有源蜂鸣器,直接使用管脚高低电平控制一颗三极管,从而去控制蜂鸣器响与不响;第二种方案就是使用无源蜂鸣器,单片机输出一定频率,一定占空比的PWM波,去控制一颗三极管开关,从而控制蜂鸣器的响与不响。这两种方案都是可行的。进一步调查发现,有源蜂鸣器都比无源蜂鸣器贵不少,为了降低成本,不得不优先选择无源蜂鸣器。 二、 项目评估 使用无源蜂鸣器,那么单片机就必须能够输出PWM波,并且这个PWM波还能够控制频率、占空比。而且还能控制其关闭。经过查阅SC92F7250这款单片机的技术手册发现,其提供了一个独立的计数器,它可以支持6路的PWM输出(这里所说的6路指SC92F7252芯片,SC92F7250由于只有8个脚,它只支持一路PWM输出),8位PWM精度。无源蜂鸣器控制频率一般在2KHz左右,这完全符合要求啊。
三、 项目实施 通过阅读【SC92F7252_7251_7250v1.1cn.pdf】文档中关于PWM章节的描述,配合着官方提供的DEMO,很容易就理解了每一个寄存器以及每一位的作用。于是就开始编写测试代码。 边测试边修改,不一会就完美实现了。 看,这PWM波多么好看啊。来,控制一下蜂鸣器看看效果^_^。非常的完美,可惜你们听不见。哈哈哈!!! 废话少说,初始化代码以及蜂鸣器打开与关闭的代码奉上。
/* 使能蜂鸣器鸣叫 */ #defineBEEP_ENABLE() PWMDTY4 = 45 /* 禁止蜂鸣器鸣叫 */ #define BEEP_DISABLE() PWMDTY4 = 0
/* ********************************************************************************************************* * 函 数名: bsp_initbeep * 功能说明: 配置beep PWM输出 * 形 参:无 * 返 回值: 无 ********************************************************************************************************* */ voidbsp_initbeep(void) { /* 设置P2.6推挽输出 */ P2CON |= 0x40;
PWMCON = 0x04; //PWM关闭,Fsys/32频率; PWMCFG0 = 0x02; //PWM4输出到I/O PWMCFG1 = 0x00; //PWM3\PWM4\PWM5不反向 PWMPRD = 89; //PWM周期=(89+1) PWMDTY4 = 0; //PWM4的Duty = 0/90 = 0 默认关闭 PWMCON |= 0x80; //启动PWM工作 }
打开蜂鸣器只需调用BEEP_ENABLE()即可;关闭蜂鸣器只需调用BEEP_DISABLE()即可。
|