• 003_IO 扩展(串转并)-74HC595


    LED 流水灯到动态数码管显示,可以看到这些外围设备已经占据了很多的 IO 口,而 51单片机 IO 口非常有限,如果想要连接更多外围设备,此时可以通过 IO 扩展来实现。

    一种 IO 口扩展方式-串转并,使用的芯片是 74HC595。开发板板载 1 个 74HC595 芯片,仅需单片机 3 个 IO 口即可扩展 8 个,如果需要还可以将 2 个 74HC595 级联扩展出 16 个 IO,这就实现用少数 IO 资源控制多个设备。

    74HC595 芯片介绍

    74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三态输出(即高电平、低电平和高阻抗)。芯片管脚及功能说明如下:
    在这里插入图片描述
    上面两张都是 74HC595 芯片管脚图,细心的朋友就会发现左侧的 1 脚是 QB,而右侧芯片的 1 脚是 Q1,左侧芯片的 11 脚是 SCK,而右侧芯片的 11 脚是 SH_CP,还有很多其他管脚不一样,其实这个都没有什么,每个人在绘制芯片管脚图时命名可能不一样而已,看一个芯片重点是管脚功能。

    15 和 1 到 7 脚 QA–QH:并行数据输出
    9 脚 QH 非:串行数据输出
    10 脚 SCLK 非( MR) : 低电平复位引脚
    11 脚 SCK( SHCP) : 移位寄存器时钟输入
    12 脚 RCK( STCP) : 存储寄存器时钟输入
    13 脚 G 非( OE): 输出有效
    14 脚 SER( DS) : 串行数据输入

    74HC595 是具有 8 位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是单独的时钟。数据在 SCK 的上升沿输入,在 RCK 的上升沿进入到存储器中。如果两个时钟连在一起,则移位寄存器总是比存储器早一个脉冲。移位寄存器有一个串行输入(DS),和一个串行输出(Q7 非),和一个异步的低电平复位,存储寄存器有一个并行 8 位的,具有三态的总线输出,当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在 STCP 上升沿输出到并行端口。

    本实验使用到硬件资源如下:
    (1)8*8LED 点阵模块
    (2)74HC595 模块

    开发板上的 74HC595 模块电路如下图所示:
    在这里插入图片描述
    从上图中可以看出,74HC595 需要用到的控制管脚 SER、RCLK、SRCLK 直接连接到 51 单片机的 P3.4-P3.6 IO 口上,输出端则是直接连接到 LED 点阵模块的行端口上,即为 LED 发光二极管的阳极,LED 点阵的列则为发光二极管的阴极。要想控制 LED 点阵,可以将单片机管脚按照 74HC595 芯片的通信时序要求来传输数据,这样即可控制 LED 点阵的行数据。根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。因此通过单片机 P0 口可控制点阵列,74HC595 可控制点阵行。

    通过 74HC595 模块控制 LED 点阵以一行循环滚动显示:

    #include "reg52.h"
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    //定义 74HC595 控制管脚
    sbit SRCLK = P3^6; 	//移位寄存器时钟输入
    sbit RCLK_2  = P3^5; 	//存储寄存器时钟输入
    sbit SER   = P3^4; 	//串行数据输入
    
    #define LED_COL_PORT P0
    
    void delay(u16 us)
    {
    	while(us--);
    }
    
    void hc_74_595_write(u8 dat)
    {
    	//dat 一个字节  分八次传输(移位寄存器每次只能移动一位);
    	u8 i = 0;
    	LED_COL_PORT=0x00;
    	for (i=0; i < 8; i++)
    	{
    		SER = dat >> 7;  //得到最高位
    		dat <<= 1;       //次高位左移到最高位
    		SRCLK = 0;
    		delay(1);  //10us
    		SRCLK = 1;
    		delay(1);  //10us
    	}
    	RCLK_2 = 0;
    	delay(1);
    	RCLK_2 = 1;
    }
    
    void main()
    {
    	u8 j;
    	u8 dat[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
    	while(1)
    	{
    		for(j = 0;j < 8;j++)
    		{
    			hc_74_595_write(0x00);//消除前面寄存器缓存数据
    			hc_74_595_write(dat[j]);
    			delay(50000);
    		}
    	}
    }
    
    • 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
  • 相关阅读:
    Fiddler抓包工具是最强大最好用的 Web 调试工具之一
    【Leetcode】15. 三数之和
    Vue项目实战之人力资源平台系统(四)路由模块
    【SLAM】3三维刚体运动
    HTML5特殊属性
    大数据数据压缩和企业优化
    【SG滤波】三阶滤波、五阶滤波、七阶滤波(Matlab代码实现)
    摩尔线程推出首款数据中心级全栈功能GPU:MTT S2000
    Error:Failed to start LSB: Bring up/down networking的解决方法
    【多线程进阶】--- 常见锁策略,CAS,synchronized底层工作原理,JUC,线程安全的集合类,死锁
  • 原文地址:https://blog.csdn.net/weixin_42581177/article/details/127822264