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 开发三步骤
- 理解硬件工作原理(如LED、数码管、点阵、74HC595等)
- 查看原理图 → 找连接关系
- 在开发板上找器件丝印(白色小字)
- 在原理图中按丝印定位元器件
- 查看引脚连接关系(网络标号成对出现)
- 控制对应引脚输出电平(高/低)
原理图:逻辑连接关系
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; // 显示数字2delay(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; // 段码:显示数字2delay(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]; // 显示数字idelay(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
- 步骤:
RCLK=0; SRCLK=0;
- 8次
SRCLK
上升沿 → 数据逐位移入 QA~QH- 1次
RCLK
上升沿 → 数据锁存到输出端- 输出:DPa=QA, DPb=QB, …, DPh=QH
✅ 本日知识点:嵌入式概念、最小系统、电平标准、GPIO控制、延时函数、74HC138译码器、数码管动态扫描、8×8点阵原理、74HC595串转并驱动 —— 构成单片机外设控制核心知识体系。