CT107D 开发板蜂鸣器使用教程

本文对锁存器进行了简要的描述,并介绍了蓝桥杯 CT107D 开发板上蜂鸣器的使用方法。

如果有任何疑问,请使用“评论”功能在文章下方评论,我会及时回复问题。

锁存器

在使用蜂鸣器之前,我们需要了解一个基本的概念:锁存器(latch)。锁存器是一种可以“记住”、“保持”脚位的高低电平的芯片。在蓝桥杯 CT107D 开发板上,使用到了一种锁存器芯片: M74HC573M1R (点击可打开 datasheet)。这是一个 8 通道的锁存器。来看看它的脚位图:

M74HC573

其中,10 脚 GND 是接地(负极),20 脚 Vcc 是电源(正极)。1 脚 OE 用于控制其是否工作,在蓝桥杯开发板 CT107D 上,这个脚连接到了 GND,始终处于低电平,表示芯片始终工作。D0 – D7 为输入引脚,Q0 – Q7 为输出引脚,LE(Latch Enable)为锁存控制引脚。

锁存器芯片最关键的引脚是 LE 引脚,这个引脚决定了锁存器的工作模式。当 LE 引脚为高电平时,锁存器工作在“直通”模式,这时候所有输出引脚(Q0 – Q7)的电平直接由输入引脚(D0 – D7)来控制,即 Q0 和 D0 的电平相同,Q1 和 D1 相同,依此类推。而当 LE 引脚切换到低电平时,所有输出引脚的电平会被“锁住”,一直停留在之前的值,输入引脚的变化并不会引起输出引脚的变化。

你还可以观察锁存器的真值表(Truth Table),来理解它的工作模式(H 为高电平,L 为低电平):

M74HC573 真值表

观察单片机开发板的电路图,可以发现单片机的 P0 除了控制蜂鸣器之外,还被用于很多其他用途(如控制 LED、显示屏、数码管)。锁存器可以让单片机使用单个 IO 口操作多个设备,且每次只操作一个设备,保持其他设备状态不变。

蜂鸣器跳线

在使用蜂鸣器之前,需要将电路板上的 JSP 跳线(位于蜂鸣器旁边)连通,如图所示:

蜂鸣器跳线 JSP(位于图片左上方)

不使用蜂鸣器时,可以将这个跳线断开,防止在下载程序时蜂鸣器发出令人不适的声音。

蜂鸣器的控制

我们看到电路板上蜂鸣器所对应的元件编号为 SP1,可以在开发板电路图(CT107D_SCH.pdf)中找到它:

电路图中蜂鸣器的符号

SP1 的一端连接到 VCC(供电正极),另一端连接到 N_BUZZ 网络。为了探究蜂鸣器的控制方法,我们按下 Ctrl+F,在整个 PDF 中寻找 N_BUZZ 网络,发现 N_BUZZ 网络接到了一个 ULN2003 芯片(见下图)。ULN2003 是一个达林顿驱动芯片,能够将控制芯片提供的小电流,放大到蜂鸣器、继电器所需较大的工作电流。进一步分析发现,蜂鸣器的 N_BUZZ 网络接到了 OUT7,而 OUT7 受 IN7 控制。IN7 接到了 M74HC573M1R 锁存器的 Q7 脚,而 Q7 对应的输入脚 D7 则接到了 P0.6 网络。P0.6 网络连接到了单片机的 P0.6 口。


单片机的 P0.6 口控制了蜂鸣器的通断

经过上述分析,可以推断出,单片机的 P0.6 口经过锁存器控制了蜂鸣器的通断。

在控制蜂鸣器时,我们首先需要将锁存器的 LE 脚置于“高”状态,以便让锁存器“解锁”;然后我们需要将 P0.6 设置为我们需要控制的值(高电平或低电平);最后需要重新将 LE 脚置于“低”状态,“锁住”锁存器。实际操作时,也可以先将 P0.6 置于需要控制的电平,然后先解锁锁存器,经过一小段时间(使用 _nop_() 函数进行短暂的延时),再锁住锁存器。

锁存器 U9 的 LE 引脚由 Y5C 网络控制,该网络是一个 74HC138 芯片控制的。我们在此不赘述如何控制这个引脚,只需要知道在下面代码中,SetY5Low() 函数会将 Y5C 置为低电平从而解锁锁存器,同样 SetY5High() 会锁住锁存器。

如下代码可以让蜂鸣器以 100ms 为周期开关。

#include "intrins.h"
#include "reg52.h"

sbit BUZZER = P0 ^ 6;
 
#define Y0 0x1f
#define Y1 0x3f
#define Y2 0x5f
#define Y3 0x7f
#define Y4 0x9f
#define Y5 0xbf
#define Y6 0xdf
#define Y7 0xff
 
void delay(int ms)
{
    unsigned char i, j;
    for (i = 0; i < 220; i++)
    {
        for (j = 0; j < ms; j++)
        {
            ;
        }
    }
}
 
void SetY5Low() { P2 = Y5; }
 
void SetY5High() { P2 = Y0; }
 
void LatchRefresh()
{
    SetY5Low();
    _nop_(); // 短暂延时
    _nop_();
    SetY5High();
}
 
void main()
{
    SetY5High();
    while (1)
    {
        BUZZER = 1; // 使 P0.6 处于高电平
        LatchRefresh(); // 更新锁存器
        // 此时可任意修改 P0.6 的电平,而不会影响蜂鸣器的状态
        delay(100);
        BUZZER = 0;
        LatchRefresh();
        delay(100);
    }
}

CC BY-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.

《CT107D 开发板蜂鸣器使用教程》有2个想法

    1. 如果没有延迟,那么电平的变化持续时间太短,锁存器可能没法正常解锁、更新状态。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据