【芯片使用】74HCHC595

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


总结

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

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值