Feng HanXiu
Articles9
Tags0
Categories0

Archive

2024开源蓝桥系列(二):基础外设(LED,蜂鸣器,继电器)学习

2024开源蓝桥系列(二):基础外设(LED,蜂鸣器,继电器)学习

前言

学习单片机(如C51和STM32)时,控制LED灯通常是第一个项目。这一基础项目不仅象征着新的学习阶段的开始,也是深入理解单片机工作原理的关键。通过掌握LED控制,学生可以更好地理解数字信号输出、IO口控制及基本电路连接。这为后续学习更复杂的单片机应用打下了坚实的基础,例如显示系统、指示灯和信号传输等应用场景。

序言:基础知识

1.LED是什么,怎么控制

(1)元器件介绍

发光二极管,简称为LED,是一种常用的发光器件,其特点是单向导通,意思就是在LED两端形成压差,就能够使得LED发光。

二极管的特点是单向导电性,电流只允许从一个方向通过,二极管当中的正向电流从无色环流向有色环当中。LED亮度的颜色和工作电压根据所选择的发光二极管来决定,越鲜艳的颜色二极管的工作电压也就越高。

(2)控制原理

对LED来说,亮灯的条件是两端有电势差。

img

下图为LED的符号图:当LED灯的正极接正电压,负极接负电压或接地时,LED便能够发光。

img

2.继电器是什么,怎么控制

(1)元器件介绍

继电器,开关电器的一种,在控制电路中用的非常多:

  • 继电器是一种电控制器件,可以给予规定输入量并保持足够长的时间,在电气输出电路中使被控量发生预定的阶跃变化。当输入量降至一定程度并保持足够长的时间后,再恢复到初始状态。(弱电控制强电)
  • 它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。
  • 通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用
  • img

(2)控制原理

当RELAY接上低电平0时,继电器闭合。

img

3.蜂鸣器是什么,怎么控制

(1)元器件介绍

蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型,蜂鸣器的发声原理为:

  • 1、无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出。
  • 2、有源自激型蜂鸣器的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。
  • 3.有源蜂鸣器和无源蜂鸣器的主要差别是:二者对输入信号的要求不一样,有源蜂鸣器工作的理想信号是直流电,一般标示为VDD、VDC等。因为蜂鸣器内部有一个简单的振荡电路,可以把恒定的直流电转变成一定频率的脉冲信号,从而产生磁场交变,带动钼片振动发出声音。

img

(2)控制原理

BUZZ接上低电平0,则蜂鸣器鸣叫。

img

一、总体介绍

LED(发光二极管)作为一种常见的光电器件,在单片机学习中广泛应用。掌握LED的工作原理和控制方法,可以帮助学生理解单片机如何与外部设备进行交互。此外,LED学习还有助于培养学生对数字信号输出和硬件控制的基本概念,是单片机编程入门的重要步骤。

二、硬件部分

  1. 74HC138译码器

    • 原理图:74HC138的电路图展示了其输入和输出端的连接关系。
      img
    • 功能:74HC138是一种3-8译码器,它能够将三位地址码(C、B、A 上图中)转换为八个输出端口。根据输入的地址码,译码器会选定一个输出端口为低电平,其他输出端口则为高电平,这种选择性控制是实现复杂电路的基础。
    • 真值表:真值表详细列出了不同输入条件下的输出状态,使得理解译码器的工作原理更加直观。
      img
    • 使用
      • 引脚重映射:通过使用sbit关键字重新定义引脚名称,使得代码更加清晰,便于后续的操作和调试。
      • 锁存器选择:通过特定的函数控制译码器的输出通道,从而实现不同锁存器的选择,这有利于对多通道的控制。
  2. SN74HC02DRG4四路二输入或非门

    • 原理图:此部分展示了四个或非门的连接图。
      img
    • 功能:SN74HC02是一种常用的数字逻辑芯片,主要用于执行或非 (NOR) 逻辑运算。它的输出状态可以有效控制连接的锁存器是否工作,从而实现更复杂的逻辑功能。
  3. 74HC573锁存器

    • 原理图:展示了74HC573锁存器的连接方式及工作原理。
      img
    • 功能:74HC573锁存器主要用于数据存储和输出控制。当时钟信号到达时,锁存器会将输入的数据输出到相应的引脚,实现对数据流的有效管理。此外,它还支持并行数据传输,这对于处理多条数据信号非常重要。
    • 使用:通过对P0引脚进行赋值,可以控制锁存器的输出状态。例如,当需要使Q1输出高电平时,可以直接通过赋值来实现。

三、片选和点亮一个 LED

如下是蓝桥杯单片机上的LED模块的电路图。要实现LED灯的点亮,必须先确保选中LED相关的锁存器,在给相应LED低电平。
img
以下是实现点亮L1灯的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <STC15F2K60S2.H>  // 引入单片机头文件

void HC138_Init(unsigned char channel)
{
P2 = P2 & 0x1f | channel << 5;
P2 &= 0x1f;
}
void main(void) {
P0 = 0xfe;
HC138_Init(4);

while(1) {

}
}

在这段代码中,首先引入了相关头文件,先配置LED电平即1111 1110,然后通过HC138_Init()函数配置译码器的输出通道。

四、蜂鸣器和继电器

蜂鸣器和继电器实现思路和LED类似,图中的N_BUZZ和N_RELAY分别为蜂鸣器和继电器,ULN2003会将电平取反,所以蜂鸣器和继电器均为P0端输入高电平触发。
img
img
功能:打开蜂鸣器和继电器,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <STC15F2K60S2.H>  // 引入单片机头文件

void HC138_Init(unsigned char channel)
{
P2 = P2 & 0x1f | channel << 5;
P2 &= 0x1f;
}
void main(void) {
P0 = 0x50;
HC138_Init(5);

while(1) {

}
}

五、流水灯

流水灯功能的实现使得L1至L8灯依次点亮和熄灭,形成动态的灯光效果。实现流水灯的基本思路如下:

  • 使用循环结构和延时函数,控制LED灯依次亮起和熄灭。例如,可以通过一个for循环,结合延时函数,让每个LED灯在一定时间内保持亮状态。在这里用到stc-isp下载器预设的软件延时函数,并对其做了一定的修改,在学习定时器之前可以这么对程序进行延时操作。

在程序运行前,我们一般要求系统LED全灭,蜂鸣器和继电器不工作,所以会有Init_system(void)的函数,涉及蜂鸣器和继电器后面会讲到,流水灯代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <STC15F2K60S2.H>

void Delay(unsigned int t) //@12.000MHz
{
unsigned char i, j;

while (t--) {
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}

void HC138_Init(unsigned char channel)
{
P2 = P2 & 0x1f | channel << 5;
P2 &= 0x1f;
}

void Init_system(void)
{
P0 = 0xff;
HC138_Init(4);

P0 = 0x00;
HC138_Init(5);
}

void main()
{
unsigned char i;

Init_system();

while (1)
{
for (i=0; i<9; i++) {
P0 = ~(0x01 << i);
HC138_Init(4);
Delay(500);
}

for (i=0; i<9; i++) {
P0 = ~(0x80 >> i);
HC138_Init(4);
Delay(500);
}
}
}

六、代码纯享版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
演示效果
led来回以0.5秒为间隔展示流水灯
最后led熄灭蜂鸣器鸣响1秒
接着蜂鸣器关闭,继电器闭合1秒
*/

#include <STC15F2K60S2.H>

void Delay(unsigned int t) //@12.000MHz
{
unsigned char i, j;

while (t--) {
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}

void HC138_Init(unsigned char channel)
{
P2 = P2 & 0x1f | channel << 5;
P2 &= 0x1f;
}

void Init_system(void)
{
P0 = 0xff;
HC138_Init(4);

P0 = 0x00;
HC138_Init(5);
}

void main()
{
unsigned char i;

Init_system();

while (1)
{
for (i=0; i<9; i++) {
P0 = ~(0x01 << i);
HC138_Init(4);
Delay(500);
}

for (i=0; i<9; i++) {
P0 = ~(0x80 >> i);
HC138_Init(4);
Delay(500);
}

P0 = 0x40;
HC138_Init(5);
Delay(1000);

P0 = 0x10;
HC138_Init(5);
Delay(1000);

P0 = 0x00;
HC138_Init(5);
}
}

Author:Feng HanXiu
Link:http://example.com/2024/11/05/2024%E5%BC%80%E6%BA%90%E8%93%9D%E6%A1%A5%E7%B3%BB%E5%88%97%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9A%E5%9F%BA%E7%A1%80%E5%A4%96%E8%AE%BE%EF%BC%88LED%EF%BC%8C%E8%9C%82%E9%B8%A3%E5%99%A8%EF%BC%8C%E7%BB%A7%E7%94%B5%E5%99%A8%EF%BC%89%E5%AD%A6%E4%B9%A0/
版权声明:本博客采用由开源协会搭建