嵌入式开发学习(STC51-8-IO扩展-串转并)

内容

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

74HC595简介

51单片机IO口非常有限,如果想要连接更多外围设备,可以通过IO扩展来实现;其中一种IO口扩展方式-串转并,使用的芯片是74HC595;

1个74HC595芯片,仅需单片机3个IO口即可扩展8个,如果需要还可以将2个74HC595级联扩展出16个IO,这就实现用少数IO资源控制多个设备;

74HC595具有8位移位寄存器和一个存储器,能够8位串行输入、并行输出,其中并行输出为三态输出(即高电平、低电平和高阻抗)

移位寄存器和存储器是单独的时钟;
嵌入式开发学习(STC51-8-IO扩展-串转并)_第1张图片
管脚说明:

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

通信时序:数据在SCK的上升沿输入RCK,在RCK的上升沿输出到并行端口;如果两个时钟连在一起,则移位寄存器总是比存储器早一个脉冲;

原理图

嵌入式开发学习(STC51-8-IO扩展-串转并)_第2张图片
嵌入式开发学习(STC51-8-IO扩展-串转并)_第3张图片
由线路图得知,74HC595的控制管脚SER、RCLK、SRCLK连接到51单片机的P34-36口上,输出端则是直接连接到LED点阵模块的行端口上,即为LED发光二极管的阳极,LED 点阵的列则为发光二极管的阴极;

要想控制LED点阵,可以将单片机管脚按照74HC595芯片的通信时序要求来传输数据,这样即可控制LED点阵的行数据;

根据LED发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭,因此可以通过P0口控制列,74HC595口行;

思路

根据通信时序写出数据输入函数;

输出数据的口对应led点阵的行,P0口对应led点阵的列,让P0口全为0,然后根据输出数据循环点亮每一行即可;

编码

main.c

/*
 * @Description: 通过74HC595模块控制LED点阵,以一行循环滚动显示
 */
#include "reg52.h"

typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;

// 定义74HC595控制管脚
sbit SCK = P3 ^ 6; // 移位寄存器时钟输入
sbit RCK = P3 ^ 5;	 // 存储寄存器时钟输入
sbit SER = P3 ^ 4;	 // 串行数据输入

#define LEDDZ_COL_PORT P0 // 点阵列控制端口

u8 ghc595_buf[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 表示显示第一行到第八行

/**
 * @description: 延时函数(循环一次大约10us)
 * @param {u16} ten_us
 * @return {*}
 */
void delay_10us(u16 ten_us)
{
	while (ten_us--)
		;
}

/**
 * @description: 延时函数(循环一次大约1ms)
 * @param {u16} ms
 * @return {*}
 */
void delay_ms(u16 ms)
{
	u16 i, j;
	for (i = ms; i > 0; i--)
		for (j = 110; j > 0; j--)
			;
}

/**
 * @description: 向74HC595写入一个字节的数据
 * @param {u8} dat 要写入的数据
 * @return {*}
 */
void hc595_write_data(u8 dat)
{
	u8 i = 0;

	for (i = 0; i < 8; i++) // 循环8次即可将一个字节写入寄存器中
	{
		SER = dat >> 7; // 优先传输一个字节中的高位
		dat <<= 1;		// 将低位移动到高位
		SCK = 0;
		delay_10us(1);
		SCK = 1; // 移位寄存器SCK时钟上升沿将端口数据送入存储寄存器RCK中
		delay_10us(1);
	}
	RCK = 1; // 存储寄存器RCK时钟上升沿将前面写入到寄存器的数据输出
	delay_10us(1);
	RCK = 0;
}

void main()
{
	u8 i = 0;

	LEDDZ_COL_PORT = 0x00; // 将LED点阵列全部设置为0,即LED阴极为低电平
	while (1)
	{
		for (i = 0; i < 8; i++)
		{
			hc595_write_data(0x00);			 // 消除前面寄存器缓存数据
			hc595_write_data(ghc595_buf[i]); // 写入新的数据
			delay_ms(500);					 // 延时500ms
		}
	}
}

编译和结果

按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机

需要把LED点阵旁的J24黄色跳线帽短接到GND一端

结果:led点阵每行依次点亮,且一直循环
嵌入式开发学习(STC51-8-IO扩展-串转并)_第4张图片

你可能感兴趣的:(嵌入式开发学习,学习,51单片机)