文章目录
- 一、74HC595
-
- [ 1、芯片引脚](# 1、芯片引脚)
- [ 2、内部框图](# 2、内部框图)
- [ 3、时序操作](# 3、时序操作)
- 二、单芯片工模式
-
- [ 1、原理图](# 1、原理图)
- [ 2、驱动代码](# 2、驱动代码)
-
- [ 1)、74hc595.h](# 1)、74hc595.h)
- [ 2)、74hc595.c](# 2)、74hc595.c)
- [ 3)、mian.c](# 3)、mian.c)
- 三、级联工作模式
-
- [ 1、原理图](# 1、原理图)
- [ 2、驱动代码](# 2、驱动代码)
-
- [ 1)、main.c](# 1)、main.c)
一、74HC595
74HC595 是一个8位串行输入、并行输出的位移缓存器,其中并行输出为三态输出(即高电平、低电平和高阻抗)。
1、芯片引脚


2、内部框图
74HC595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是单独的时钟。

3、时序操作

工作时序由串行数据(DS)、移位时钟(SHCP)、存储时钟(STCP) 三个核心信号控制,部分型号还支持输出使能(OE) 和清零(MR) 信号。
74HC595 的时序分为 移位阶段 和 锁存阶段:
移位阶段:
数据DS在移位时钟SHCP的上升沿输入,在SHCP的上升沿进入到存储器中,(高位D7先入,低位D0后入)。
锁存阶段:
当 8 位数据全部移入后,一个 ST_CP 上升沿会将移位寄存器的数据锁存到输出寄存器,驱动并行引脚输出。
输出使能(OE):低电平有效,需在锁存前拉低,否则输出为高阻态;若保持低电平,锁存后数据会立即输出。
异步清零(MR):低电平有效,无需时钟触发,拉低时直接清空移位寄存器;正常工作时需接高电平或通过上拉电阻固定。

二、单芯片工模式
1、原理图

2、驱动代码
1)、74hc595.h
c
#ifndef _74HC585_H_
#define _74HC585_H_
#include<reg52.h>
#include<intrins.h>
// 引脚定义(可根据实际硬件修改)
sbit HC595_DS = P3^4; // 串行数据输入
sbit HC595_SH_CP = P3^6; // 移位时钟
sbit HC595_ST_CP = P3^5; // 锁存时钟
// 延时函数(简单延时,可根据主频调整)
void HC595_Delay(unsigned int t);
/**
* @brief 向74HC595发送一个字节数据(高位先行)
* @param dat 要发送的8位数据
*/
void HC595_Send_Byte(unsigned char dat);
/**
* @brief 锁存数据到输出寄存器(并行输出)
*/
void HC595_Latch(void);
/**
* @brief 发送多个字节数据(级联74HC595时使用)
* @param pdat 数据数组指针
* @param len 数据长度(级联个数)
*/
void HC595_Send_Multi_Byte(unsigned char *pdat, unsigned char len);
/**
* @brief 清空74HC595输出(输出全0)
*/
void HC595_Clear(void);
#endif
2)、74hc595.c
c
#include<74hc595.h>
// 延时函数(简单延时,可根据主频调整)
void HC595_Delay(unsigned int t)
{
unsigned int i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
/**
* @brief 向74HC595发送一个字节数据(高位先行)
* @param dat 要发送的8位数据
*/
void HC595_Send_Byte(unsigned char dat)
{
unsigned char i;
HC595_SH_CP = 0; // 移位时钟初始低电平
for(i = 0; i < 8; i++) // 逐位发送8位数据
{
HC595_DS = dat & 0x80; // 取最高位
dat <<= 1; // 左移一位,准备下一位
// 移位时钟上升沿,将DS数据移入移位寄存器
HC595_SH_CP = 1;
_nop_(); // 空操作,保证时钟宽度
HC595_SH_CP = 0;
}
}
/**
* @brief 锁存数据到输出寄存器(并行输出)
*/
void HC595_Latch(void)
{
HC595_ST_CP = 1;
_nop_(); // 保证锁存时钟宽度
HC595_ST_CP = 0;
}
/**
* @brief 发送多个字节数据(级联74HC595时使用)
* @param pdat 数据数组指针
* @param len 数据长度(级联个数)
*/
void HC595_Send_Multi_Byte(unsigned char *pdat, unsigned char len)
{
unsigned char i;
// 从最后一个芯片开始发送(级联时高位在前)
for(i = len; i > 0; i--)
{
HC595_Send_Byte(pdat[i-1]);
}
HC595_Latch(); // 所有数据移位完成后统一锁存
}
/**
* @brief 清空74HC595输出(输出全0)
*/
void HC595_Clear(void)
{
HC595_Send_Byte(0x00);
HC595_Latch();
}
3)、mian.c
c
#include<reg52.h>
#include "74hc595.h"
void main()
{
unsigned char test_dat = 0x01;
HC595_Clear(); // 初始化为全0
while(1)
{
HC595_Send_Byte(test_dat); // 发送数据
HC595_Latch(); // 锁存输出
HC595_Delay(500); // 延时
test_dat <<= 1; // 左移一位,流水灯效果
if(test_dat == 0)
test_dat = 0x01; // 复位,重新开始
}
}
三、级联工作模式
1、原理图

2、驱动代码
1)、main.c
c
#include<reg52.h>
#include "74hc595.h"
void main()
{
unsigned char test_dat[2] = {0xAA,0x55}; // 低8位0x55,高8位0xAA
HC595_Clear(); // 初始化为全0
HC595_Send_Multi_Byte(test_dat, 2); // 发送2字节,自动锁存
HC595_Latch(); // 锁存输出
while(1)
{
}
}