复习单片机:IO串转并(内含:1. 74HC595 芯片介绍+2. 硬件设计+3. 软件设计+4.原始代码+5. 实验现象)

简介: 复习单片机:IO串转并(内含:1. 74HC595 芯片介绍+2. 硬件设计+3. 软件设计+4.原始代码+5. 实验现象)

在前面章节实验中,我们是直接使用单片机 IO 口控制外围设备,从 LED 流

水灯到动态数码管显示,可以看到这些外围设备已经占据了很多的 IO 口,而 51

单片机 IO 口非常有限,如果想要连接更多外围设备,此时可以通过 IO 扩展来实

现。本章就来介绍另外一种 IO 口扩展方式-串转并,使用的芯片是 74HC595。开

发板板载 1 个 74HC595 芯片,仅需单片机 3 个 IO 口即可扩展 8 个,如果需要还

可以将 2 个 74HC595 级联扩展出 16 个 IO,这就实现用少数 IO 资源控制多个设

备。通过本章的学习,让大家学会使用 74HC595 芯片来扩展 IO 口。本章所要实

现的功能是:通过 74HC595 模块控制 LED 点阵以一行循环滚动显示。学习本章可

以参考前面的实验章节内容。本章分为如下几部分内容:

1 74HC595 芯片介绍

2 硬件设计

3 软件设计

4 实验现象

1. 74HC595 芯片介绍

74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三

态输出(即高电平、低电平和高阻抗)。芯片管脚及功能说明如下:


cb17f716f5d34ba794d3e5a50ab2133c.png


注:上面两张都是 74HC595 芯片管脚图,有很多其他管脚不一样,看一个芯片重点是管脚功能。


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 上升沿输

出到并行端口。

2 硬件设计

本实验使用到硬件资源如下:

(1)8*8LED 点阵模块

(2)74HC595 模块

开发板上的 74HC595 模块电路如下图所示:


6df2629090894ca79e2ebdca95e68a88.png


从上图中可以看出,74HC595 需要用到的控制管脚 SER、RCLK、SRCLK 直接连

接到 51 单片机的 P3.4-P3.6 IO 口上,输出端则是直接连接到 LED 点阵模块的行

端口上,即为 LED 发光二极管的阳极,LED 点阵的列则为发光二极管的阴极。

要想控制 LED 点阵,可以将单片机管脚按照 74HC595 芯片的通信时序要求来

传输数据,这样即可控制 LED 点阵的行数据。根据 LED 发光二极管导通原理,当

阳极为高电平,阴极为低电平则点亮,否则熄灭。因此通过单片机 P0 口可控制

点阵列,74HC595 可控制点阵行。

3 软件设计

本章所要实现的功能是:通过 74HC595 模块控制 LED 点阵以一行循环滚动显

示。

首先定义好 74HC595 控制管脚,以及点阵列控制

口,代码中重新定义了一个 ms 级延时函数 delay_ms,该函数与前面 delay_10us

类似,都是利用循环占用 CPU 起到延时效果。然后又定义了 74HC595 的控制函数

hc595_write_data,该函数完全按照 74HC595 的通信时序要求编写,主要要注意

的是 74HC595 是先传输字节的高位后传输低位,所以需要将字节低位移动到高位

传输,在传输数据时,要注意移位寄存器时钟和存储寄存器时钟的先后顺序,将

要写入的数据先传输到 74HC595 寄存器中,即在准备好每位数据时要将 SRCLK

进行一个上升沿变化,此时即可将数据传输到寄存器内,待循环 8 次即一个字节

传输到寄存器中时,就可以来一个存储时钟上升沿,此时就可以将 74HC595 寄存

器中的数据全部一次传输到 595 端口输出。最后就是在 main 函数中调用 74HC595

的控制函数,将实验中要实现的效果数据写入进去,从而控制 LED 点阵的阳极,

而阴极由 P0 口控制,默认初始化时已经设置为 0,也就是说只要 595 输出高电

平,那么对应的行就会点亮。

4.原始代码如下:


#include"reg52.h"
//对系统默认数据类型进行重定义
typedef unsigned char u8;
typedef unsigned int u16;
//定义 74HC595 控制管脚
//移位寄存器时钟输入
sbit SRCLK=P3^6;
//存储寄存器时钟输入
sbit rCLK=P3^5;
 //串行数据输入
sbit SER=P3^4;
//点阵列控制端口
#define LEDDZ_COL_PORT P0
u8 ghc595_buf[8]={0x01,0x02,0x04,0x08,
                  0x10,0x20,0x40,0x80};
void delay_10us(u16 ten_us)
{
    while(ten_us--);
}
void delay_ms(u16 ms)
{
    u16 i,j;
    for(i=ms;i>0;i--)
    {
        for(j=110;j>0;i--);
    }
}
//向 74HC595 写入一个字节的数据
void hc595_write_data(u8 dat)
{
    u8 i=0;
    //循环 8 次即可将一个字节写入寄存器中
    for(i=0;i<8;i++)
    {
        //优先传输一个字节中的高位
        SER=dat>>7;
        //将低位移动到高位
        dat<<=1;
        SRCLK=0;
        delay_10us(1);
        SRCLK=1;
        delay_10us(1);
        //移位寄存器时钟上升沿将端口数据
        //送入寄存器中
    }
    rCLK=0;
    delay_10us(1);
    rCLK=1;
    //存储寄存器时钟上升沿将前面写入到
    //寄存器的数据输出
}
void main()
{
    u8 i=0;
    //将 LED 点阵列全部设置为 0,
    //即 LED 阴极为低电平
    LEDDZ_COL_PORT=0x00;
    while(1)
    {
        for(i=0;i<8;i++)
        {
            //消除前面寄存器缓存数据
            hc595_write_data(0x00);
            //写入新的数据
            hc595_write_data(ghc595_buf[i]);
            //延时 500ms
            delay_ms(500);
        }
    }
}

5. 实验现象

使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口),

把编译后产生的.hex 文件烧入到芯片内,实现现象如下:8*8LED 点阵以一行循

环滚动显示。

215d22e181c440c580357afb4f912eda.png

注意:做 LED 点阵实验时,一定要将 LED 点阵旁的 J24 黄色跳线帽短接到 GND

一端。

相关文章
|
3月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
100 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
5月前
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
|
5月前
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
120 1
|
8月前
|
传感器
51单片机循迹小车原理介绍和代码示例
51单片机循迹小车原理介绍和代码示例
51单片机循迹小车原理介绍和代码示例
|
8月前
|
存储 算法 安全
【基础IO】结合代码理解软硬链接(超详细)
【基础IO】结合代码理解软硬链接(超详细)
|
5月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
6月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
4月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
270 12
|
5月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
62 2
|
5月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。