BS86D20C合泰芯片教程04——驱动蜂鸣器
上一篇教程中我们初步学习了芯片如何配置输出引脚,在这一篇我们会学到如何配置输入引脚和中断程序为什么要不断喂狗。开始配置前我们先看一下电路原理图,PA7控制三极管的开关来控制蜂鸣器,典型的小信号控制大电流电路,可以注意到这里还有个0R电阻,因为PA7引脚也可以用作串口通信的TX引脚,在芯片的引脚不够用的情况下这里复用为蜂鸣器的控制电路,我们需要把0R电阻焊上或者用跳线短接,而后可以控制蜂鸣器。芯片引脚图在手册第12页,可以看到PA3和PA7可以实现多种通信,TX/RX的串口通信,SCL/SDA的I2C通信,SCK/SDI的SPI通信,以及最基础的通用输入输出引脚。

接下来让我们找到芯片手册76页,我们用到PA7作为输出口需要配置四个寄存器,PA,PAC,PAPU,PAWU。我们需要先把控制蜂鸣器的PA7配置为输出接口,所以根据上一篇所学的知识,将PAC7配置为输出引脚,内部上拉,唤醒和芯片默认电平都配置为0,芯片默认为0,都可以不用写。
然后配置检测按键,在这里我们使用到的是SW1按键,因为芯片没有接外部上拉电阻,所以我们需要使用到芯片的内部上拉功能,把PBPU0配置为1,然后芯片引脚默认会变成高电平。当按键按下后,引脚会被拉低为低电平,这时需要芯片检测到外部电压变化,所以将引脚作为输入口,PBC0寄存器配置为1。

配置完PA7和PB0,我们已经搞定了硬件基础,然后开始写一个简单的逻辑,按下SW1按键,蜂鸣器开始报警,松开按键蜂鸣器停止工作。
//蜂鸣器测试
#include "BS86D20C.h"
#define IN 1//引脚配置
#define OUT 0//引脚配置
void main(void)
{
_wdtc=0xa8;
_pbc0=IN;//设置为输入模式
_pbpu0=IN;//硬件内上拉
_pac7=OUT;//蜂鸣器驱动
while (1)
{
_clrwdt(); // 喂狗 → 重新装载 WDT 计数器
if(_pb0==0)
{
_pa7 = 1; // 蜂鸣器
}
else
{
_pa7 = 0; // 蜂鸣器
}
}
}
把代码烧录进板子后,按下按键可以发现已经正常运行,此时可能有朋友会有疑问while循环中的喂狗程序是干什么的,这就是我们的下一个问题:看门狗。
看门狗全称是看门狗定时器,在一段时间内没有给看门狗复位信号,看门狗到时间后就会复位整个硬件,防止程序死循环或者进入未知情况。让我们看到芯片手册65页关于看门狗的解释,可以看到WDTC是配置看门狗的定时时间,代码初始化程序里面配置WDTC寄存器为0xa8,也就是0x10101000,使能WDT和把WDT溢出周期配置为2^8/fsub,当系统时钟为8M时,溢出周期为2^8/8Mhz=32us,也就是说32us内如果没有喂狗就会溢出然后复位单片机。

从手册65到66的几个寄存器中不难发现,这里没有关闭看门狗的选项,所以在程序中必须一直喂狗,否则程序将反复重启,芯片会无法正常工作。如果有兴趣可以把喂狗的代码注释掉,然后按下按键,可以发现蜂鸣器的声音是中间有中断的,并且频率很高,假如觉得不好分辨可以把看门狗的溢出周期拉长,但是如果这里是控制LED亮灭就不一定能看出来,LED频率闪烁太高人眼无法分辨。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)