实验平台:普中A2开发板,STC89C51RC芯片,11.0592M晶振。
文章目录
- 前言
- 一、代码
- 1.main.c
- 2.HC595.c
- 2.HC595.h
- 总结
前言
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) //先传输高位,通过与运算判断第八是否为1SDA=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) //先传输高位,通过与运算判断第八是否为1SDA=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
总结
提示:这里对文章进行总结:
例如:















