实验平台:普中A2开发板,STC89C51RC芯片,11.0592M晶振。
前言
74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。。
引脚说明:
- QA–QH(15脚、1-7脚): 八位并行输出端,可以直接控制数码管的 8 个段。
- GND(8脚)
- QH’(9 脚): 级联输出端。我将它接下一个 595 的 SER 端。
- SCLR(10 脚): 低点平时将移位寄存器的数据清零。通常我将它接 Vcc。
- SCK(11 脚):即SHCP,上升沿时数据寄存器的数据移位;(脉冲宽度:5V 时,大于几十纳秒就行了。)
- RCK(12 脚):即STCP,上升沿时移位寄存器的数据进入数据存储寄存器,通常我将RCK 置为低点平,当移位结束后,在 RCK 端产生一个正脉冲(5V 时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
- /G(13 脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
- SER(14 脚): 串行数据输入端。
VCC(16脚)
管脚图
时序图
引脚说明
级联图
一、代码
1.main.c
代码如下(示例):
/**************************************************************************************
实验平台:普中A2开发板(STC89C51RC芯片)
74HC595模块
试验现象:
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include <intrins.h>
#include <SelfDef.h>
#include <HC595.h>
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
SHCP=0;
STCP=0;
SDA=0;
Delay1ms();
HC595_Send_One_Byte(0xf2);
}
2.HC595.c
代码如下(示例):
#include <HC595.h>
#include <SelfDef.h>
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
/***
*74HC595 发送一个字节
*即往74HC595的DS引脚发送一个字节
*/
void HC595_Send_Byte(u8 byte)
{
u8 i;
for (i = 0; i < 8; i ++) //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
{
/**** 步骤1:将数据传到DS引脚 ****/
if (byte & 0x80) //先传输高位,通过与运算判断第八是否为1
SDA=1; //如果第八位是1,则与 595 DS连接的引脚输出高电平
else //否则输出低电平
SDA=0;
/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
SHCP=0; // SHCP拉低
Delay10us(); // 适当延时
SHCP=1; // SHCP拉高, SHCP产生上升沿
Delay10us();
byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
}
}
/**
*74HC595输出锁存 使能
**/
void HC595_CS(void)
{
/** 步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器 **/
STCP=0; // 将STCP拉低
Delay10us(); // 适当延时
STCP=1; // 再将STCP拉高,STCP即可产生一个上升沿
Delay10us();
}
/**
*发送多个字节
*便于级联时数据的发送
*级联N级,就需要发送N个字节控制HC595
***/
void HC595_Send_Multi_Byte(u8 *dat,u16 len)
{
u8 i;
for (i = 0; i < len; i ++ ) // len 个字节
{
HC595_Send_Byte(dat[i]);
}
HC595_CS(); //先把所有字节发送完,再使能输出
}
/**
*发送1个字节,无级联
***/
void HC595_Send_One_Byte(u8 byte)
{
u8 i;
for (i = 0; i < 8; i ++) //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
{
/**** 步骤1:将数据传到DS引脚 ****/
if (byte & 0x80) //先传输高位,通过与运算判断第八是否为1
SDA=1; //如果第八位是1,则与 595 DS连接的引脚输出高电平
else //否则输出低电平
SDA=0;
/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
SHCP=0; // SHCP拉低
Delay10us(); // 适当延时
SHCP=1; // SHCP拉高, SHCP产生上升沿
Delay10us();
byte <<= 1; // 右移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
}
HC595_CS();
}
2.HC595.h
#ifndef __HC595_H_
#define __HC595_H_
#include <reg52.h>
#include <SelfDef.h>
sbit SHCP=P1^0;
sbit STCP=P1^1;
sbit SDA=P1^2;
void HC595_Send_Multi_Byte(u8 *dat, u16 len);
void HC595_Send_One_Byte(u8 byte);
#endif
总结
提示:这里对文章进行总结:
例如: