markdown复制## 1. 项目背景与核心价值
74HC165作为经典的8位并行输入/串行输出移位寄存器,在嵌入式开发中广泛用于IO扩展场景。这个日期标注为2021-10-28的项目代码,实际上解决了一个非常实际的问题:当单片机GPIO引脚不足时,如何用最经济的方式扩展数字输入接口。
我在多个工业控制项目中验证过,一片74HC165的价格不到1元,却可以节省7个宝贵的MCU引脚资源。尤其像51单片机这类引脚资源紧张的芯片,通过级联多片74HC165,甚至可以实现几十个按钮或开关状态的采集,而成本仅增加几元钱。
## 2. 硬件连接原理详解
### 2.1 典型电路连接方式
74HC165的标准接法需要5个控制信号:
- SH/LD(移位/装载):低电平时并行装载数据,高电平时允许移位
- CLK(时钟):上升沿触发数据移位
- CLK INH(时钟禁止):高电平时禁用时钟
- SER(串行数据输出)
- QH'(级联输出)
实际应用中,CLK INH通常直接接地,SER悬空(仅级联时使用)。典型接线示例如下:
```c
P1.0 -> SH/LD // 51单片机P1.0控制数据装载
P1.1 -> CLK // P1.1输出时钟信号
P1.2 -> QH // P1.2读取串行数据
2.2 关键时序参数
必须注意的时序特性(Vcc=5V时):
- tsu(Setup Time):数据建立时间 ≥20ns
- th(Hold Time):数据保持时间 ≥5ns
- tpd(Propagation Delay):时钟到输出延迟 ≤36ns
这意味着在51单片机(12MHz晶振)环境下,每条指令执行时间约1μs,完全满足时序要求。但在STM32等高速MCU上使用时,需要适当增加延时。
3. 驱动代码逐行解析
3.1 初始化设置
c复制sbit LOAD = P1^0; // 移位/装载控制线
sbit CLK = P1^1; // 时钟线
sbit DATA = P1^2; // 数据输入线
void Init_74HC165(void) {
LOAD = 1; // 初始置高,准备移位模式
CLK = 0; // 时钟初始低电平
}
