LED 流水灯到动态数码管显示,可以看到这些外围设备已经占据了很多的 IO 口,而 51单片机 IO 口非常有限,如果想要连接更多外围设备,此时可以通过 IO 扩展来实现。
一种 IO 口扩展方式-串转并,使用的芯片是 74HC595。开发板板载 1 个 74HC595 芯片,仅需单片机 3 个 IO 口即可扩展 8 个,如果需要还可以将 2 个 74HC595 级联扩展出 16 个 IO,这就实现用少数 IO 资源控制多个设备。
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);
}
}
}