目录
橙色
单片机 IO 扩展(串转并)
本章就来介绍另外一种 IO 口扩展方式-串转并, 使用的芯片是 74HC595。 开发板板载 1 个 74HC595 芯片, 仅需单片机 3 个 IO 口即可扩展 8 个, 如果需要还可以将 2 个 74HC595 级联扩展出 16 个 IO, 这就实现用少数 IO 资源控制多个设备。
本章所要实现的功能是: 通过 74HC595 模块控制 LED 点阵以一行循环滚动显示。
为什么不直接通过51单片机的引脚来驱动LED矩阵呢?最重要的一点就是,通过74HC595芯片控制LED矩阵可以大大减少所需的引脚数量。74HC595是一个串行输入、并行输出的移位寄存器,
使用三个引脚(时钟、数据、锁存)即可控制多个输出引脚。
74HC595 芯片介绍
74HC595 是一个 8 位串行输入、 并行输出的位移缓存器, 其中并行输出为三态输出(即高电平、 低电平和高阻抗) 。芯片管脚及功能说明如下:

不同人绘制芯片管脚图时可能命名不一样,但这没什么,主要是看芯片的管脚功能
- 15 和 1 到 7 脚 QA–QH: 并行数据输出
- 9 脚 QH 非: 串行数据输出
- 10 脚 SCLR 非 : 低电平复位引脚
- 11 脚 SCK : 移位寄存器时钟输入
- 12 脚 RCK : 存储寄存器时钟输入
- 13 脚 G 非 : 输出有效
- 14 脚 SER : 串行数据输入
移位寄存器 (Shift Register):1、移位寄存器用于接收串行输入数据。数据通过一个引脚(通常是DS或SER)以位的形式输入芯片,按照顺序存储在移位寄存器中。通过时钟信号(通常是SHCP或SCK)的边沿触发,数据从输入端串行地移入寄存器。2、
当新的数据输入时,原有数据会向左移位,为新的数据腾出空间。这种移位的过程可以持续进行,直到将所有位的数据加载到寄存器中。
存储寄存器 (Storage Register):1、存储寄存器用于存储移位寄存器中的数据,并在需要时并行输出到多个引脚。存储寄存器的更新是通过时钟信号(通常是STCP或RCK)的边沿触发的。当时钟信号触发时,移位寄存器中的数据被复制到存储寄存器中。2、存储寄存器的输出通过并行输出引脚(通常是Q0至Q7)完成。每个输出引脚对应存储寄存器中的一个位,它们可以设置为高电平、低电平或高阻抗状态。
74HC595 是具有 8 位移位寄存器和一个存储器, 三态输出功能。 移位寄存器和存储器是分别的时钟。 数据在 SCK 的上升沿输入, 在 RCK 的上升沿进入到存储器中。 如果两个时钟连在一起, 则移位寄存器总是比存储器早一个脉冲。 移位寄存器有一个串行输入(DS) , 和一个串行输出(Q7 非) , 和一个异步的低电平复位, 存储寄存器有一个并行 8 位的, 具有三态的总线输出, 当 MR 为高电平, OE 为低电平时, 数据在 SHCP 上升沿进入移位寄存器, 在 STCP 上升沿输出到并行端口。
硬件设计
本文使用到硬件资源如下:
(1) 8X8LED 点阵模块
(2) 74HC595 模块

从上图中可以看出, 74HC595 需要用到的控制管脚 SER、 RCLK、 SRCLK (14、12、11管脚)直接连接到 51 单片机的 P3.4-P3.6 IO 口上, 输出端则是直接连接到 LED 点阵模块的行端口上, 即为 LED 发光二极管的阳极, LED 点阵的列则为发光二极管的阴极。
要想控制 LED 点阵, 可以将单片机管脚按照 74HC595 芯片的通信时序要求来传输数据, 这样即可控制 LED 点阵的行数据。 根据 LED 发光二极管导通原理, 当阳极为高电平, 阴极为低电平则点亮, 否则熄灭。 因此通过单片机 P0 口可控制点阵列, 74HC595 可控制点阵行。
软件实验
本章所要实现的功能是: 通过 74HC595 模块控制 LED 点阵以一行循环滚动显示。
#include "reg51.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义74HC595控制管脚
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit RCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
#define LEDDZ_COL_PORT P0 //点阵列控制端口
//0x01: 00000001 0x02: 00000010 0x04: 00000100
u8 ghc595_buf[8]={
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时函数,ms=1时,大约延时1ms
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>

和 LED点阵实验&spm=1001.2101.3001.5002&articleId=135892032&d=1&t=3&u=0189e25d6bb14e6698a585f9177247f2)
2996

被折叠的 条评论
为什么被折叠?



