当前位置:   article > 正文

【芯片使用】74HCHC595

hc595

实验平台:普中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);

	
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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();
}




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

总结

提示:这里对文章进行总结:
例如:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/801770
推荐阅读
相关标签
  

闽ICP备14008679号