【蓝桥杯—单片机学习笔记(二)】蜂鸣器与继电器的基本控制

本文介绍了在蓝桥杯CT107D单片机训练平台上,如何实现蜂鸣器和继电器的控制。通过8路LED的闪烁、点亮、熄灭以及蜂鸣器的鸣叫,展示了对74HC138译码器和74HC573锁存器的使用。内容包括芯片介绍、硬件电路分析和程序设计,强调了ULN2003芯片的极性注意和译码器的控制要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、要求

在CT107D单片机训练平台上实现蜂鸣器与继电器的基本控制,首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,继电器吸合一会后断开,然后依次熄灭LED指示灯,蜂鸣器鸣叫一会后关闭,不断循环此过程。

(重点:学会对74HC138译码器和74HC573编码器的控制)

二、芯片介绍

关于74HC138译码器74HC573锁存器的相关认识,可以参考以下这篇博文:【蓝桥杯—单片机学习笔记(一)】LED指示灯的基本控制_Backlight__的博客-CSDN博客

uln2003芯片—复合晶体管阵列:

该芯片的输出与输入极性相反,在进行程序设计时要注意!uln2003具体情况可以参考: uln2003有什么作用_引脚图及功能_工作原理及驱动应用电路-电子发烧友网 (elecfans.com)

三、硬件电路分析

如下图所示,蜂鸣器和发光二极管并不是直接与单片机的IO口相连,而是经过了一个uln2003复合晶体管和74HC573锁存器再与单片机的IO口相连。而驱动74HC573工作的使能端口LE的使能信号是来自Y5C,继续往前推,即可得到要想驱动锁存器进行工作,则需要译码器Y5输出为低电平(控制译码器的输入引脚CBA状态决定输出哪一路)。

由以上分析知:我们在进行编程时,要控制的单片机IO口就是P2.5~P2.7和P0口。

四、程序

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char


void delay_ms(uchar xms)		//@11.0592MHz
{
	uchar i,j;
    while(xms)
    {    
        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
}

void channel(uchar n)   //74HC138输出通道选择
{
    switch(n)
    {
        case 4 :
            P2 = (P2 & 0x1f) | 0x80;    //获取P2口状态(不理解的可以参看:https://blog.csdn.net/weixin_52901292/article/details/119959975?spm=1001.2014.3001.5501)
        break;
        case 5 :
            P2 = (P2 & 0x1f) | 0xa0;
        break;
        case 6 :
            P2 = (P2 & 0x1f) | 0xc0;
        break;
        case 7 :
            P2 = (P2 & 0x1f) | 0xe0;
        break;
        
    }
}

void mode(uchar n, uchar m) //n-通道,m-P0口状态
{
    channel(n); //选择通道
    P0 = m;     //对P0口赋值
}

void led_control()
{
    uchar i;
    for(i = 0; i < 3; i++)//连续亮灭三次
    {
        mode(4, 0x00);
        delay_ms(1000);
        mode(4, 0xff);
        delay_ms(1000);
    }
    
     //控制继电器和蜂鸣器
    mode(5, 0x10);
    delay_ms(1000);
    mode(5, 0x00);
    delay_ms(1000);
    
    //控制LED灯
    
    for(i = 0;i < 8;i++)//逐个点亮
    {
        mode(4, 0xff << i);
        delay_ms(1000);
    }
    
    for(i = 0;i < 9;i++)//逐个熄灭
    {
        mode(4, ~(0xff << i)); 
        delay_ms(1000);
    }
    
    //控制继电器和蜂鸣器
    mode(5, 0x40);
    delay_ms(1000);
    mode(5, 0x00);
    delay_ms(1000);
}

void system_init()  //系统初始化,关闭蜂鸣器继电器
{
    mode(5, 0x00);
}

void main()
{
    system_init();
    while(1)
    {
        led_control();
    }
}
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值