51单片机74HC595实现LED交替亮以及级联

文章目录

  • 学习单片机经常忘记所以想记录一下
  • 一、74HC595介绍
  • 二、实现LED的亮暗亮交替
    • 原理图的设计
    • 实现代码
  • 三、595级联的实现
    • 原理图的设计
    • 实现代码
  • 总结


前言

学习单片机的过程刚好学到了74HC595,就想记录下来以免忘记了。


一、74HC595的简单介绍?

74HC595是什么?

74hc595是具有8位移位寄存器可一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。
工作原理:
数据在SHcp的上升沿输入,在STcp的上升沿进入的存储器中去,如果两个是中联在一起,则移位寄存器总是比存储器早一个脉冲。

这里用我自己的话再解释一下哈(以下说的数据均是串行输入的值转换成二进制之后的数据)

1.我们给DS引脚一个值,作为输入数据来源

2.串行数据的存入:我们需要利用移位寄存器,将数据一位一位地输入进去,需要知道的是我们需要将SHCP保持在一个处于上升沿状态,否则会存不进去。

对于如何将数据一位一位存进去:这里可能有点难以理解,就是595它的输入和输出的对应有点像数据结构中栈的特点(先进后出,后进先出)。又或者可以理解成一个只有入口的圆筒,我们从最后一位开始依次放进去,全部放进去之后在从圆筒的表面依次拿出。

例如:输入的数据转换成二进制是01010101, 如果按照我们常规的逻辑,输出的并行数据可能是(高到低)      01010101。但是实际上经过处理之后并行输出的数据就是    (低到高)      01010101


74HC595元件图片以及相关引脚显示:

 (注:左边的名称从上到下依次对应元件左边的引脚,右边很明显,就用说了嘿嘿)

二、实现LED的亮暗交替

1.原理图的设计

2.实现代码

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

//Òý½ÅÉèÖÃ
sbit SHCP=P2^0;
sbit STCP=P2^2;
sbit DS=P2^1;



	//595ʵÏÖº¯Êý
void SendBy595(uchar value)
{
	uchar i;
	
	SHCP=STCP=0;

	
	for(i=0;i<8;i++)
	{
		
		DS=value>>7;
		value<<=1;
		SHCP=1;
		_nop_();
		_nop_();
		SHCP=0;
	}
	
	
	
		STCP=1;
		_nop_();
		_nop_();
		STCP=0;
	
}
	
void main()
{
	
	P2=0x00;
	SendBy595(85);
	while(1);
}
	

三、595级联的实现

1.原理说明:

两个595级联就不只是连接8个LED灯了,而是16个LED灯。但是我们知道的是595输入的串行数据是一个8位的二进制数,那这个要怎么设计呢?

这就不得不将Q7'使用起来,它的作用就是当移位寄存器中的数据多于8位时,我们将多余的数据进行移出。因此在原理图的设计中,我们需要将第一个595的控制移出为引脚与第二个595的串行数据输入引脚进行连接,同时第二个595的SHTP,SCTP依旧和前面一个595的相同引脚连接到单片机上的同一引脚。

2.原理图设计


3.实现代码

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

//ÉèÖÃÒý½Å
sbit SHCP=P2^0;
sbit STCP=P2^1;
sbit DS=P2^2;



	
void SendBy595(uchar value)
{
	uchar i;
	uchar j=value;
	//³õʼSHCP  STCPÒý½Å
	SHCP=STCP=0;


	for(i=0;i<8;i++)
	{
		
		DS=value>>7;
		value<<=1;
		SHCP=1;
		_nop_();
		_nop_();
		SHCP=0;
	}
	
	//½øÐÐÏÂÒ»¸ö°Ëλ¶þ½øÖƵĴ®ÐÐÊý¾ÝÊäÈë
	for(i=0;i<8;i++)
	{
		
		DS=j>>7;
		j<<=1;
		SHCP=1;
		_nop_();
		_nop_();
		SHCP=0;
	}
	//²¢ÐÐÊä³öÌõ¼þÉèÖÃ
	STCP=1;
		_nop_();
		_nop_();
		STCP=0;
}
	
void main()
{
	
	P2=0xff;
	SendBy595(85);
	while(1);
}
	

总结

以上就是我个人目前对于74HC595的原理及使用方法的一个理解,可能存在一些错误认识,欢迎各位指出。

作者:Vuko-wxh

地址: 单片机芯片之——图解74HC595(第一部分)_Vuko-wxh的博客-CSDN博客

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以为您解答这个问题。 首先,您需要将 74hc595 芯片连接到 Arduino UNO 上。连接方式如下: - 将 74hc595 的 VCC 引脚连接到 Arduino UNO 的 5V 引脚。 - 将 74hc595 的 GND 引脚连接到 Arduino UNO 的 GND 引脚。 - 将 74hc595 的 SER 引脚连接到 Arduino UNO 的数字引脚 11。 - 将 74hc595 的 SRCLK 引脚连接到 Arduino UNO 的数字引脚 13。 - 将 74hc595 的 RCLK 引脚连接到 Arduino UNO 的数字引脚 10。 - 将 74hc595 的 OE 引脚连接到 Arduino UNO 的 GND 引脚。 接下来,您需要将 16 个 LED 连接到 74hc595 芯片的输出引脚上。具体连接方式可以参考以下代码中的注释。 ```C++ int SER_Pin = 11; // 定义74hc595的SER引脚 int RCLK_Pin = 10; // 定义74hc595的RCLK引脚 int SRCLK_Pin = 13; // 定义74hc595的SRCLK引脚 byte LED[16] = { // 定义16个LED的状态,0表示灭,1表示 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; void setup() { pinMode(SER_Pin, OUTPUT); pinMode(RCLK_Pin, OUTPUT); pinMode(SRCLK_Pin, OUTPUT); } void loop() { for (int i = 0; i < 16; i++) { // 循环控制16个LED的状态 digitalWrite(SER_Pin, LED[i]); // 将LED状态写入74hc595芯片 digitalWrite(SRCLK_Pin, LOW); // 时钟信号下降沿 digitalWrite(SRCLK_Pin, HIGH); // 时钟信号上升沿 } digitalWrite(RCLK_Pin, LOW); // 时钟信号下降沿 digitalWrite(RCLK_Pin, HIGH); // 时钟信号上升沿 delay(1000); // 延时1秒 } ``` 以上代码将控制 16 个 LED 的状态,每隔 1 秒钟更新一次状态。您可以根据自己的需要修改 LED 的状态和更新时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值