蓝桥杯-蜂鸣器与继电器的基本控制

该文描述了一个使用单片机控制的实验电路,通过ULN2003驱动8路LED闪烁3次后熄灭,继电器吸合并随后断开,以及蜂鸣器鸣叫后停止。代码示例展示了如何利用C语言和HC138译码器来实现这一系列操作的循环执行。
摘要由CSDN通过智能技术生成

任务:在上一节的基础下在8路LED闪烁3遍后熄灭,接着依次点亮LED灯,继电器吸合一会后断开,然后依次熄灭LED灯,蜂鸣器鸣叫一会后关闭。(使其循环实现)

实验电路:

来看看图中涉及到的芯片等元件:

1️⃣ULN2003:是高耐压、大电流复合晶体管阵列,由七个硅NPN复合晶体管组成,每一对达林顿管都串联一个2.7K的基极电阻,在5V的工作电压下他能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。(也可理解为放大倍数较大的三极管)

从其内部结构可以知道:输入端与输出端电位相反。由于输入与输出端通过一个非门连接,所以对应一组输入与输出结果是相反的。(ULN2003详细介绍

2️⃣BUZZER:由原理图可知当N-BUZZ脚接低电平时蜂鸣器鸣叫。

3️⃣继电器:当N-RELAY接低电平时继电器吸合。

由图可知:首先锁存器需要设置为同步模式,由P04、P06分别控制N-BUZZ和N-RELAY脚输出低电平就可以实现控制蜂鸣器的鸣叫和继电器的吸合。其他操作同LED灯的点亮。

接下来上代码。

#include"reg52.h"
 
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
 
void Delay(unsigned int t)
{
    while(t--);
}
 
void LEDRunning()
{
    unsigned char i;
    HC138_C = 1;
    HC138_B = 0;
    HC138_A = 0;//使Y4输出低电平
 
    for(i = 0; i < 3; i++)
    {
        P0 = 0x00;
        Delay(60000);
        Delay(60000);
        P0 = 0xff;
        Delay(60000);
        Delay(60000);
    }
 
    for(i = 1; i <= 8; i++)
    {
        P0 = 0xff << i;
        Delay(60000);
        Delay(60000);
    }
 
    HC138_C = 1;
    HC138_B = 0;
    HC138_A = 1;//使Y5输出低电平
    P0 = 0x10;
    Delay(60000);
    Delay(60000);
    P0 = 0x00;

    HC138_C = 1;
    HC138_B = 0;
    HC138_A = 0;//使Y4输出低电平
    for(i = 1; i <= 8; i++)
    {
        P0 = ~(0xff << i);
        Delay(60000);
    }
    HC138_C = 1;
    HC138_B = 0;
    HC138_A = 1;//使Y5输出低电平
    P0 = 0x40;
    Delay(60000);
    Delay(60000);
    P0 = 0x00;
}

void InitSystem()
{
    HC138_C = 1;
    HC138_B = 0;
    HC138_A = 1;//使Y5输出低电平

    P0 = 0x00;
    
}

void main()
{
    InitSystem();
    while(1)
    {
         LEDRunning();
    }
}

简化后:

#include"reg52.h"
 
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
 
void Delay(unsigned int t)
{
    while(t--);
}
 
void ChooseHC138(unsigned int n)
{
    switch(n)
    {
        case 4:
        HC138_C = 1;
        HC138_B = 0;
        HC138_A = 0;//让Y4输出低电平
        break;
        case 5:
        HC138_C = 1;
        HC138_B = 0;
        HC138_A = 1;//让Y5输出低电平
        break;
        case 6:
        HC138_C = 1;
        HC138_B = 1;
        HC138_A = 0;//让Y6输出低电平
        break;
        case 7:
        HC138_C = 1;
        HC138_B = 1;
        HC138_A = 1;//让Y7输出低电平
        break;
    }
}

void OutputHC138AndP0(unsigned int num,unsigned char number)
{
    ChooseHC138(num);
    P0 = number;
}

void LEDRunning()
{
    unsigned char i;
 
    for(i = 0; i < 3; i++)
    {
        OutputHC138AndP0(4,0x00);
        Delay(60000);
        OutputHC138AndP0(4,0xff);
        Delay(60000);
    }
 
    for(i = 1; i <= 8; i++)
    {
        OutputHC138AndP0(4,(0xff << i));
        Delay(60000);
    }
    OutputHC138AndP0(5,0x10);
    Delay(60000);
    OutputHC138AndP0(5,0x00);

    for(i = 1; i <= 8; i++)
    {
        OutputHC138AndP0(4,~(0xff << i));
        Delay(60000);
    }
    OutputHC138AndP0(5,0x40);
    Delay(60000);
    OutputHC138AndP0(5,0x00);
}

void InitSystem()
{
    OutputHC138AndP0(5,0x00);    
}

void main()
{
    InitSystem();
    while(1)
    {
         LEDRunning();
    }
}

好啦,代码大概就是这样,其中还有一个地方可以简化:

void ChooseHC138(unsigned int n)
{
    switch(n)
    {
        case 4:
        HC138_C = 1;
        HC138_B = 0;
        HC138_A = 0;//让Y4输出低电平
        break;
        case 5:
        HC138_C = 1;
        HC138_B = 0;
        HC138_A = 1;//让Y5输出低电平
        break;
        case 6:
        HC138_C = 1;
        HC138_B = 1;
        HC138_A = 0;//让Y6输出低电平
        break;
        case 7:
        HC138_C = 1;
        HC138_B = 1;
        HC138_A = 1;//让Y7输出低电平
        break;
    }
}

-------------->
void ChooseHC138(unsigned int n)
{
    switch(n)
    {
        case 4:
        P2 = (P2 & 0x1f) | 0x80;
        break;
        case 5:
        P2 = (P2 & 0x1f) | 0xa0;
        break;
        case 6:
        P2 = (P2 & 0x1f) | 0xc0;
        break;
        case 7:
        P2 = (P2 & 0x1f) | 0xe0;
        break;
    }
}

但是我还没搞明白,所以就没改,而且我觉得不改看着也还行改了反而看着麻烦😳(如果有大佬知道就教教我,感谢!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值