代码编织梦想

序言

通过对LED的学习,相信大家的对74HC138译码器74HC573锁存器有了较为详细的了解,但是只对其中的一个74HC573锁存器进行了学习,此次我们会学习控制蜂鸣器的继电器的锁存器,同时也会对在74HC138译码器上选择74HC573锁存器的选择代码进行优化处理。

让我们开始吧~

一、实物图

图中左侧的为蜂鸣器模块,右侧为L10(继电器吸合时点亮,断开时关闭)。

特别注意:红色箭头所指内容为继电器和蜂鸣器开关,记得要把键帽插在ON上。

二、原理图及硬件部分

此处可以得知,控制蜂鸣器引脚(BUZZ)和继电器引脚(RELAY)的锁是“Y5” 。

1. 74HC573锁存器的功能

  1. 数据存储:573锁存器可以将输入的数据在时钟信号的作用下暂时存储起来,以便后续处理或输出。

  2. 数据输出控制:当时钟信号到来时,锁存器会将存储的数据输出,实现对数据输出的控制。这对于确保数据在特定时刻得到正确输出非常重要。

  3. 并行数据传输:573锁存器通常具有多个并行输入和输出引脚,可以实现并行数据的传输,适用于需要处理多个数据信号的场合。

  4. 时序控制:通过控制时钟信号的频率和时序,可以精确地控制数据存储和输出的时间,确保系统的稳定性和可靠性。

2.  74HC573锁存器的使用

数据输入端(D1~D8)的输入=数据输出端(Q1~Q8)的输出,且输出端的电平状态不影响输入端。

3.ULN2003达林顿管

(1)特点

ULN2003芯片具有以下特点:

  1. 多通道输出:ULN2003芯片具有7个高电压、高电流输出通道,每个通道都有一个达林顿对输出。这使得它能够同时控制多个负载。

  2. 达林顿对输出:每个输出通道都包含了一个达林顿对,它是一种高效率的电流放大器,能够承受较高的负载电流。

  3. 内部反向电压保护二极管:ULN2003芯片的每个输出引脚都内置了反向电压保护二极管,用于保护输出引脚免受感性负载的损害。

  4. 大功率能力:ULN2003芯片能够承受较高的电流和电压,适用于驱动各种类型的高功率负载,如继电器、步进电机等。

(2)功能

  1. 电流放大和负载驱动:ULN2003内部集成了7个达林顿对输出,能够提供高电流放大和电流输出,使其适合驱动各种高功率负载,如继电器、步进电机等。

  2. 多通道控制:ULN2003具有7个输出通道,每个通道都可以独立控制,这使得它可以同时控制多个负载,提高了系统的灵活性和多功能性。

  3. 电压反向保护:每个输出通道都内置了反向电压保护二极管,可以保护输出引脚免受感性负载的损害,提高了系统的稳定性和可靠性。

  4. 适应性强:ULN2003能够承受较高的电流和电压,适用于各种工业和消费电子应用,如汽车电子、家电控制、机器人等领域。

  5. 简化电路设计:ULN2003的集成设计简化了电路设计过程,减少了外部元件的数量和复杂性,降低了系统成本并提高了系统的可靠性。

 此处,我们可以直接将其理解为“非门”

三、代码部分

1. 选择锁存器

在LED部分中我们学习了74HC138译码器的使用(详情见我的作品:1.1LED流水灯http://t.csdnimg.cn/nBlFU)。

例如此处我们选择Y5通道对应的锁存器:

sbit HC138_A2=P2^7;    //重新定义HC138_A2连接P27引脚
sbit HC138_A1=P2^6;    //重新定义HC138_A1连接P26引脚
sbit HC138_A0=P2^5;    //重新定义HC138_A0连接P25引脚

void SelectHC573()//定义函数名称
{
    HC138_A2=1;   //P2^7引脚输出高电平1
    HC138_A1=0;   //P2^6引脚输出高电平0
    HC138_A0=1;   //P2^5引脚输出高电平1
}

如此对应的二进制数为:101,即十进制数5,因此选择了Y5通道。

2. 74HC138译码器代码优化

在前文中我们说过如此写代码过于冗杂,此处我们对代码进行优化。

首先我们先观察一下74HC138译码器的原理图:

(1) 由图中我们可以得知A、B、C所对于的引脚分别为P25、P26、P27,因此我们只对这三个引脚进行赋值,以免造成不必要的错误。

P2=P2 & 0x1f; //0001 1111

(2) 然后,我们将高三位的值清0(即P25,P26,P27),然后第五位保持不变,我们在此基础上对高三位进行赋值。

若:A2、A1、A0组成的二进制数为100,即十进制数4,因此选择通道4

若:A2、A1、A0组成的二进制数为101,即十进制数5,因此选择通道5

若:A2、A1、A0组成的二进制数为110,即十进制数6,因此选择通道6

若:A2、A1、A0组成的二进制数为111,即十进制数7,因此选择通道7

(3) 将二进制某一位上的数字置“1” ,我们通常使用“或”(|)操作。此处举例我们所选的为Y4:

P2= P2 | 0x80; //P2 | 1000 0000

此时P2的高三位的值为100,十进制数为4(此处我们已将P2的高三位单独拿出来分析,因此读者不必纠结实际上P2的值)

(4)因此我们可以延伸写出其他寄存器的选择:

void SelectHC573(unsigned char n)  //定义函数,调用时写入需要调用的寄存器号
{
    switch(n)
    {
        case 4:
            P2=(P2 & 0x1f) | 0x80;  //选择寄存器4 (100)
        break;
        case 5:
            P2=(P2 & 0x1f) | 0xa0;  //选择寄存器5 (101)
        break;
        case 6:
            P2=(P2 & 0x1f) | 0xc0;  //选择寄存器6 (110)
        break;
        case 7:
            P2=(P2 & 0x1f) | 0xe0;  //选择寄存器7 (111)
        break;
    }
}

至此我们74HC138译码器的优化代码已完成(后续会有更进一步的优化)。

3.继电器和蜂鸣器的使用

首先我们选择其对应的寄存器:

SelectHC573(5);

由原理图可知,我们若想在BUZZ处输出高电平,则需要ULN2003达林顿管输出高电平,因此74HC573锁存器输出低电平,即P06口输出低电平、

P0=0x40; //1011 1111 蜂鸣器工作

同样,我们打开继电器,则需使P04口输入低电平

P0=0x10; //1110 1111 继电器工作

 这样,继电器和蜂鸣器都可以工作了!

四、代码纯享版

此处写一个先打开蜂鸣器,一段时间后关闭,再打开继电器,一段时间后关闭。

#include <STC15F2K60S2.H>  //引入头文件
void SelectHC573(unsigned char n)  //定义函数,调用时写入需要调用的寄存器号
{
    switch(n)
    {
        case 4:
            P2=(P2 & 0x1f) | 0x80;  //选择寄存器4 (100)
        break;
        case 5:
            P2=(P2 & 0x1f) | 0xa0;  //选择寄存器5 (101)
        break;
        case 6:
            P2=(P2 & 0x1f) | 0xc0;  //选择寄存器6 (110)
        break;
        case 7:
            P2=(P2 & 0x1f) | 0xe0;  //选择寄存器7 (111)
        break;
    }
}

void Delay(unsigned int t)
{
    while(t--);
}

void main()
{
    SelectHC573(5);    //选择寄存器
    while(1)
    {
        P0=0x40;       //打开蜂鸣器
        Delay(60000);
        P0=0x40;       //关闭蜂鸣器
        Delay(60000);
        P0=0x10;       //打开继电器
        Delay(60000);
        P0=0x10;       //关闭继电器
        Delay(60000);
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2301_80281610/article/details/139050903

蓝桥杯第八届省赛试题--“电子时钟”-爱代码爱编程

题目要求 一、 基本要求 1.1 使用 CT107D 单片机竞赛板,完成“电子钟”功能的程序设计与调试; 1.2 设计与调试过程中,可参考组委会提供的“资源数据包” ; 1.3 Keil 工程文件以准考证号命名,完成设计后,提交完整、可编译的 Keil 工程文件到服务器。二、 硬件框图三、 功能描述3.1 初始化 1)关闭蜂鸣器、继电器等无关外设; 2)

【蓝桥杯】CT107D-关闭烦人的蜂鸣器及LED灯-爱代码爱编程

先给代码再讲原因 代码: #include <STC15F2K60S2.H> void close() { P2 = 0XA0;//打开Y5C P06 = 0;//关闭蜂鸣器 P2 = 0X00;//关闭Y5C P2 = 0X80;//打开Y4C P0 = 0XFF;//关闭LED P2 = 0X00;

蓝桥杯—stm32g431rbt6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)-爱代码爱编程

新建工程教程见http://t.csdnimg.cn/JySLg 点亮LED教程见http://t.csdnimg.cn/Urlj5 末尾含所有代码 目录 按键原理图 一、按键使用需要解决的问题 1.抖动      1.什么是抖动      2.抖动类型      3.如何去消除抖动 FIRST.延时函数消抖(缺点:浪费CP

单片机(microcontroller)原理及应用-爱代码爱编程

单片机(Microcontroller)原理及应用是一个广泛而深入的话题,涵盖了单片机的硬件结构、工作原理、应用领域以及开发方法等多个方面。以下是对单片机原理及应用的详细阐述,旨在为读者提供一个全面而深入的理解。 一、单片

交流电力控制电路之交流调压电路-爱代码爱编程

目录 一、单相交流调压电路 1. 相控调压电路 2. 斩控调压电路 二、三相交流调压电路 1. 星形联结(Y型联结) 2. 支路控制三角形联结 交流变交流大纲 交流调压电路用于调节交流电的输出电压,广泛应用于照明、加热、电机调速等领域。根据不同的相数,交流调压电路可分为单相和三相交流调压电路。下面详细讲述这两种电路: 一、单相

led灯、蜂鸣器、继电器的控制-爱代码爱编程

LED灯的控制 该专栏所有文章都默认使用STM32F103ZET6开发板 目录 LED灯的控制 一、简单的LED灯控制 1、初始化函数 led灯 2、应用函数 2、蜂鸣器 3、继电器 一、简单的LED灯控制 编程框架:初始化函数和应用函数 1、初始化函数 初始化函数一般包括:时钟 IO 外设 中断 其他(用哪个写

电机纹波电流与pwm控制周期关系-爱代码爱编程

目录 1 PWM控制周期的基本概念2 电机纹波电流的定义与影响3 电机纹波电流与PWM控制周期的关系4 结论 1 PWM控制周期的基本概念 PWM是一种通过微处理器的数字输出来对模拟电路进行控制的技

蓝桥杯单片机竞赛led、蜂鸣器、继电器控制程序设计_led灯 继电器控制继电器-爱代码爱编程

目录 一、电路原理分析 二、程序设计 1、LED灯程序设计 (1)变量定义 (2)数码管程序中添加部分 (3)S7键功能 2、蜂鸣器、继电器程序设计 (1)变量定义 (2)数码管程序中添加部分 (3)S6键功能 (4)S5键功能 程序包链接 一、电路原理分析                     图1  LED灯电原理图路

24年蓝桥杯及攻防世界赛题-爱代码爱编程

21 reverseMe 复制图片,在线ocr识别,https://ocr.wdku.net/,都不费眼睛。 22 misc_pic_again ┌──(holyeyes㉿kali2023)-[~/Misc/to

24年蓝桥杯及攻防世界赛题-爱代码爱编程

11 Railfence fliglifcpooaae_hgggrnee_o{cr} 随波逐流编码工具 分为5栏时,解密结果为:flag{railfence_cipher_gogogo} 12 Caesar rxm

蓝桥杯-爱代码爱编程

蓝桥杯单片机组备赛指南请查看 :本专栏第1篇文章 本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。 型号:国信天长4T开发板(绿板),芯片:IAP15F2K61S2 (使用国信天长蓝板也可以完美兼容,与绿板几乎无差别) 开发板由于布线局限,开机蜂鸣器就会响吵死人,因此可以在开发板上将J6跳线帽接到OFF端,可以避免插电就

19-爱代码爱编程

环境搭建 STCMCUDATABASE的添加:https://jingyan.baidu.com/article/75ab0bcb9f7614d6864db2c9.html 过程:https://zhuanlan.zhihu.com/p/104196848 stc15f2k60s2单片机开发环境构建 - JavaShuo stc15f2k60s2单