day41 51单片机最小系统、GPIO控制、时序逻辑器件(74HC138/595)与LED点阵驱动原理


一、嵌入式系统基础概念

1.1 嵌入式系统定义

先设计硬件,基于硬件设计软件实现一个具体的功能 —— 专用的计算机系统

  • 硬件/软件可剪裁:根据功能需求裁剪软硬件资源。
  • 主流方案:ARM + Linux(当前主流)
  • 早期方案:单片机 + C语言(至今仍广泛用于教学与简单控制)

1.2 软件操作硬件的核心特点

  • 软件可以直接操作硬件寄存器/引脚电平
  • 程序执行需要时间 → 引入延时函数、定时器、中断机制
  • 接口类型
    • 输入/输出(采集/控制/通信)
    • 模拟量(需ADC/DAC)
  • 关键技术模块
    • 定时器(Timer)
    • 中断(Interrupt)
    • UART(串口通信)

1.3 开发思维三要素(独立思考)

  • 做什么? —— 明确目标(如:点亮LED、显示数字)
  • 怎么做? —— 方法/步骤(如:查原理图→找引脚→写电平)
  • 会不会? —— 评估能力(如:是否掌握GPIO、时序控制)

二、单片机最小系统与电平基础

2.1 最小系统必备组件

  • 电源:直流5V(部分支持3.3V)
  • 晶振:提供标准时钟信号(方波)
  • 复位电路:高电平或低电平复位
  • 51单片机必须外接以上三部分

2.2 电平标准(5V系统)

电压范围逻辑电平
< 0.8V低电平 (0)
> 2.4V高电平 (1)
0.8V ~ 2.4V不确定状态(应避免)

注:实际中,0V = GND = 逻辑0;5V = 逻辑1

2.3 时钟与机器周期

  • 时钟频率决定处理器工作速率
  • STC89C52RC特性
    • 工作电压:5.5V–3.3V
    • 频率:0–40MHz(等效8051的0–80MHz,实际可达48MHz)
    • 6T/12T模式可选(指令周期)
    • 4K–64K ROM,1280/512字节RAM
    • 35/39个I/O口,P0开漏需上拉,其余为准双向口
    • 支持ISP/IAP,通过串口下载程序
    • 内置EEPROM、看门狗、MAX810复位电路(可省外部复位)

在这里插入图片描述

标准时钟信号:方波,协调数字系统各部分时序,保证有序运行。

在这里插入图片描述

晶振波形:正弦波形态,为系统提供稳定基准频率。


三、裸机硬件开发流程

3.1 开发三步骤

  1. 理解硬件工作原理(如LED、数码管、点阵、74HC595等)
  2. 查看原理图 → 找连接关系
    • 在开发板上找器件丝印(白色小字)
    • 在原理图中按丝印定位元器件
    • 查看引脚连接关系(网络标号成对出现)
  3. 控制对应引脚输出电平(高/低)

原理图:逻辑连接关系
PCB:物理连接关系

3.2 复位电路示例

在这里插入图片描述

高电平复位阻容电路

  • 元件:VCC、RSTK1(复位键)、C14(10μF)、R9(10kΩ)、GND
  • 未按键:C14充电 → RST高电平 → 复位
  • 按键:强制拉低 → 释放后重新充电复位

3.3 排阻与灌电流

在这里插入图片描述

  • 排阻:如 RP9、RP10,阻值 471 = 47 × 10¹ = 470Ω
  • 引脚灌电流能力弱 → 需外接驱动或限流电阻

四、GPIO控制与LED点亮实践

4.1 单片机端口结构

  • P0(0x80)、P1(0x90)、P2(0xA0)、P3(0xB0)
  • 每个端口8位,支持读(输入)和写(输出)

4.2 Keil工程与代码示例

#include <reg51.h>  // 包含51单片机寄存器定义头文件

void main(void)
{
	P2 = 0x55; // 0b 0101 0101,P2口输出交替高低电平
}

编译输出

Build target 'Target 1'
assembling STARTUP.A51...
compiling main.c...
"test1" - 0 Error(s), 0 Warning(s).

下载成功提示(STC-ISP):

操作成功 !(2025-09-13 14:30:51)

在这里插入图片描述

示波器实测波形:正弦波,50kSa/s,2V/div,最大值5.20V


五、延时函数与方波生成

5.1 延时函数实现

#include <reg51.h>

// 延时函数,参数i控制延时长度
void delay(unsigned int i)
{
    unsigned int num = i;  // 初始化计数值
    int j = 0;             // 循环变量
    for(j = 0; j < 10; j++) // 外层循环放大延时
    {
        num = i;           // 重置内层计数
        while(num--);      // 空循环消耗时间
    }
}

void main(void)
{
    while(1)
    {
        P2 = 0;            // 输出全低电平
        // P2 = 0xff;      // 若取消注释,将输出全高电平,形成方波
    }
}

在这里插入图片描述

示波器实测方波

  • 2μs/div,250MSa/s采样率
  • 2V/div(10X探头),最大值5.04V
  • 波形稳定,高低电平分明

六、数码管与74HC138译码器驱动

6.1 数码管段码

  • P0 = 0x5b; // 显示数字“2”

在这里插入图片描述

74HC138译码器电路

  • 输入:A(P22)、B(P23)、C(P24) → 组合0~7
  • 输出:Yn低电平有效(选中第n个LED/数码管)
  • G1=VCC,G2A=G2B=GND → 使能译码器

在这里插入图片描述

74HC138真值表:输入组合决定哪个Yn输出低电平

在这里插入图片描述

动态数码管模块:P0口控制段码,P2口经74HC138控制位选

6.2 动态扫描代码

#include <reg51.h>

void delay(unsigned int i)
{
    unsigned int num = i;
    int j = 0;
    for(j = 0; j < 10; j++)
    {
        num = i;
        while(num--);
    }
}

void main(void)
{
    while(1)
    {
        P2 = 0;          // 选中第0位
        P0 = 0x5b;       // 显示数字2
        delay(10000);

        P2 = (1 << 2);   // 选中第1位(P2.2=1, P2.3=0, P2.4=0 → ABC=001)
        P0 = 0x5b;
        delay(10000);

        P2 = (2 << 2);   // 选中第2位(ABC=010)
        P0 = 0x5b;
        delay(10000);

        P2 = (3 << 2);   // 选中第3位(ABC=011)
        P0 = 0x5b;
        delay(10000);
    }
}

6.3 优化:循环扫描0~7位

void main(void)
{
    unsigned char i = 0;
    while(1)
    {
        for(i = 0; i < 8; i++)
        {
            P2 = i << 2;     // 位选:i左移2位送P2口(控制ABC)
            P0 = 0x5b;       // 段码:显示数字2
            delay(6000);
        }
    }
}

6.4 显示0~7数字

// 数码管0~9的段码表(共阴)
unsigned char digit_data[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void main(void)
{
    unsigned char i = 0;
    while(1)
    {
        for(i = 0; i < 8; i++)
        {
            P2 = i << 2;           // 位选第i个数码管
            P0 = digit_data[i];    // 显示数字i
            delay(1);              // 短暂延时
            P0 = 0;                // 熄灭,避免残影(动态扫描关键)
        }
    }
}

七、8×8 LED点阵驱动原理

在这里插入图片描述
175775507819211.png&pos_id=img-ptGkiVTP-1757759177008)
8×8 LED点阵模块

  • 行:A1-A8(DPa-DPh)→ 接P0口
  • 列:K1-K8 → 接P2口(或其他控制口)
  • 显示“1”示例:
    • a=0, b=1, c=1, d=0, e=0, f=0, g=0 (需根据实际连接推导)

7.1 控制原理(以共阳点阵为例)

  • 共阳极:行接VCC(高电平),列接地(低电平)则LED亮
  • 共阴极:列接VCC(高电平),行接地(低电平)则LED亮
  • 扫描方式:逐行/逐列扫描 + 视觉暂留 → 显示完整图案

八、74HC595 串转并移位寄存器详解

在这里插入图片描述

74HC595模块电路

  • SER (P34):串行数据输入
  • SRCLK (P36):移位寄存器时钟
  • RCLK (P35):存储寄存器时钟(与OE共用P35,实际应分开)
  • OE (P35):输出使能(低电平有效)
  • QA-QH → DPa-DPh(并行输出)

在这里插入图片描述

引脚功能表

  • Q0~Q7 (15,1,7…):并行输出
  • MR (10):主复位(低有效,通常接VCC)
  • SHCP (11):移位时钟(SCK)
  • STCP (12):存储时钟(RCK)
  • OE (13):输出使能(低有效)
  • DS (14):串行数据输入(SER)
  • Q7’ (9):串行数据输出(级联用)

8.1 控制端说明

  • /SCLR (MR, 10脚):低电平时清零移位寄存器。通常接VCC。
  • SCK (SHCP, 11脚)
    • 上升沿:数据移位 QA→QB→…→QH
    • 下降沿:数据保持不变
    • 脉宽 > 几十纳秒(5V系统)
  • RCK (STCP, 12脚)
    • 上升沿:移位寄存器 → 存储寄存器
    • 下降沿:存储寄存器保持
    • 通常先置低,移位完成后给一个正脉冲(微秒级)更新输出
  • /G (OE, 13脚)
    • 高电平:输出高阻态(禁止输出)
    • 低电平:正常输出
    • 用单独引脚控制可轻松实现闪烁效果(比数据移位更高效)

在这里插入图片描述

工作逻辑示意图

  • 输入数据:0b 11001010
  • 步骤:
    1. RCLK=0; SRCLK=0;
    2. 8次 SRCLK 上升沿 → 数据逐位移入 QA~QH
    3. 1次 RCLK 上升沿 → 数据锁存到输出端
    4. 输出:DPa=QA, DPb=QB, …, DPh=QH

本日知识点:嵌入式概念、最小系统、电平标准、GPIO控制、延时函数、74HC138译码器、数码管动态扫描、8×8点阵原理、74HC595串转并驱动 —— 构成单片机外设控制核心知识体系。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐