【51单片机系列】74HC595实现对LED点阵的控制

2023-12-09 12:15

本文主要是介绍【51单片机系列】74HC595实现对LED点阵的控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是关于LED点阵的使用,使用74HC595模块实现对LED点阵的控制。

文章目录

  • 一、8x8LED点阵的原理
    • 1.1 LED点阵显示原理
    • 1.2 LED点阵内部结构图
    • 1.3 开发板上的LED点阵原理图
    • 1.4 74HC595芯片
  • 二、使用74HC595模块实现流水灯效果
  • 三、 使用74HC595模块控制LED点阵对角线亮

一、8x8LED点阵的原理

1.1 LED点阵显示原理

LED点阵是由发光二极管排列组成的显示器件,被广泛应用于汽车报站器、广告屏等。如下所示:

image-20231208092451292

proteus中的8x8点阵如下:

PROTEUS中的LED点阵

通常应用较多的是8x8点阵,使用多个8x8点阵可组成不同分辨率的LED点阵显示屏,比如16x16点阵可以使用4个8x8点阵构成。

1.2 LED点阵内部结构图

8x8LED点阵内部结构图如下,这两种图片只是接法不同,要点亮LED,左图需要行置为高电平,列置为低电平;右图则需要行置为低电平,列置为高电平。

8x8LED点阵内部结构图

8x8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置高电平,某一列置低电平,则相应的二极管将点亮。

比如对于左图,如果要将第一个点点亮,则将第一行的⑨脚接高电平,第一列的13脚接低电平,第一个点就会点亮;如果要将第一行点亮,则第一行的⑨脚接高电平,所有列(13、3、4、10、6、11、15、16脚)接低电平,第一行就会点亮;如果要将第一列点亮,则第一列的13脚接低电平,所有行(9、14、8、12、1、7、2、5脚)接高电平,第一列就会点亮;如果要将对角线点亮,可以动态显示,首先点亮第一个点,然后点亮第2行第2列的点…这样依次循环点亮,就可以显示对角线的点。

如果要显示数字或字符,在需要的位置点亮,比如显示0(如下),可以循环点亮如下位置的LED。

LED点阵显示0

1.3 开发板上的LED点阵原理图

开发板上使用了74HC595芯片实现串转并,接到LED点阵模块,原理图如下:

LED点阵原理图

74HC595起到了扩展IO口的功能,从原理图可以看到74HC595使用3个IO口输入,有8个IO口输出。这8个IO口控制LED点阵的行(从第一行到最后一行分别是D7-D0),使用P0口控制LED点阵的列(从第一列到最后一列分别是P07-P00)。

比如对于如上结构图左图所示,如果要点亮第一个LED,那么P0口应该置为0x7f,D7-D0应该置为0x80。

1.4 74HC595芯片

74HC595芯片具有8为串行输入/输出或者并行输出移位寄存器,具有三态输出(高电平、低电平、高阻态)。是总线驱动的并行输出。通常用于串行输入到并行输出的数据转换。

74HC595引脚说明如下:

符号引脚描述
Q0…Q7(QA…QH)15,1-7并行数据输出
GND8逻辑地
Q7’9串行数据输出
/MR(/SRCLR)10主复位(低电平有效),接到GND就处于复位状态,要接到电源处于高电平状态
SHCP(SRCLK)11移位寄存器时钟输入
STCP(RCLK)12存储寄存器时钟输入
/OE13输出有效(低电平有效),在开发板上有一个端子,如果要使输出有效,就短接到GND,如果要使输出无效,就短接到VCC。也可以连接到一个IO口进行控制。进行LED点阵实验时要短接到地,使输出有效。
DS(SER)14串行数据输入,输入的数据经过74HC595芯片转换为并口输出
VCC16电源

74HC595功能如下,H=高电平,L=低电平,↑=上升沿,↓=下降沿,Z=高阻态,NC=无变化,X=无效

输入输入输入输入输入输出输出功能
SHCPSTCPOEMRDSQ7’Qn
XXLXLNCMR为低电平时仅影响移位寄存器
XLLXLL移位寄存器到输出寄存器,STCP上升沿会将数据输出
XXHLXLZ清空移位寄存器,并行输出为高阻态
XLHHQ6’NC逻辑高电平移入移位寄存器状态0,包含所有的移位寄存器状态移入
XLHXNCQn移位寄存器的内容到达存储寄存器并从并口输出
LHXQ6’Qn’移位寄存器内容移入,先前的移位寄存器的内容到达存储寄存器并输出

从上表可以知道,当主复位MR为高电平,输出使能OE为低电平时,数据在SHCP上升沿进入移位寄存器,在STCP上升沿输出到并行端口。

74HC595的数据端:

Q0-Q7:八位并行输出端,可以直接控制数码管的8个段。

Q7’:级联输出端,可以接下一个595的SER端。

SER:串行数据输入端。

74HC595控制端说明

  • /SCLR(10脚):主复位脚,低电平时清空移位寄存器,通常接VCC。
  • SCK(11脚):上升沿数据寄存器移位,下降沿移位寄存器数据保持不变。
  • RCK(12脚):上升沿时移位寄存器的数据进入存储寄存器,下降沿存储寄存器数据不变。
  • /OE(13脚):输出使能,高电平时禁止输出。

二、使用74HC595模块实现流水灯效果

在proteus中硬件设计如下,实现的功能为使用74HC595芯片实现流水灯效果。

74HC595实现流水灯效果

根据上面对74HC595的介绍,DS引脚是输入的串行数据,SHCP上升沿会进行移位寄存器的移位操作,STCP上升沿时会将数据输出到并行端口。

软件代码如下:

/*实现功能:74HC595芯片控制LED点阵实现LED流水灯的效果[2023-12-08] zoya
*/
#include "reg52.h"
#include "intrins.h"typedef unsigned char u8;
typedef unsigned int u16;sbit DS = P3^4;  // 74HC595输入数据端口
sbit STCP = P3^5;  // 74HC595存储寄存器端口,上升沿时移位寄存器进入存储寄存器
sbit SHCP = P3^6;  // 74hc595移位寄存器端口,上升沿时移入数据// 延时函数,i=1延时10us
void Delay(u16 i)
{while(i--);
}// 74HC595芯片将输入的串行数据转换为并行数据输出
void HC595SendByte(u8 dat)
{u8 i;STCP = 1;  // 高电平时存储寄存器数据保持不变SHCP = 1;  // 高电平时移位寄存器数据保持不变for(i=0;i<8;i++){DS = dat >> 7;  // 每次输入最高位数据dat <<= 1;  // 移位后将dat数据左移一位,保证下一次移入的数据在最高位// 实现移位寄存器的时序,需要SHCP有一个上升沿,所以先将SHCP置0,然后置1SHCP = 0;_nop_();  // 空指令,不做任何操作,当做延时使用_nop_();SHCP = 1;}// 数据已经在移位寄存器了,现在将移位寄存器的数据输出到存储寄存器// STCP上升沿时将数据从移位寄存器输出到存储寄存器STCP = 0;_nop_();_nop_();STCP = 1;
}void main()
{u8 ledNum = ~0x01;  // 首先点亮D0// HC595SendByte(0xff);while(1){HC595SendByte(ledNum);ledNum = _crol_(ledNum,1);  // 左移,逐个点亮D0-D7Delay(50000);}
}

仿真结果:

74HC595实现LED流水灯效果

三、 使用74HC595模块控制LED点阵对角线亮

在proteus中设计如下LED点阵,实现使用74HC595控制LED点阵对角线灯亮的功能。

image-20231208151820036

代码实现如下:

/*实现功能:74HC595芯片控制LED点阵实现对角线点亮[2023-12-08] zoya
*/
#include "reg52.h"
#include "intrins.h"#define GPIO_LED P0  // LED点阵列控制IO口typedef unsigned char u8;
typedef unsigned int u16;sbit DS = P3^4;  // 74HC595输入数据端口
sbit STCP = P3^5;  // 74HC595存储寄存器端口,上升沿时移位寄存器进入存储寄存器
sbit SHCP = P3^6;  // 74hc595移位寄存器端口,上升沿时移入数据
u8 ledNum = 0x01;// 延时函数,i=1时延时10us
void Delay(u16 i)
{while(i--);
}// 74HC595芯片将输入的串行数据转换为并行数据输出
void HC595SendByte(u8 dat)
{u8 i;STCP = 1;  // 高电平时存储寄存器数据保持不变SHCP = 1;  // 高电平时移位寄存器数据保持不变for(i=0;i<8;i++){DS = dat >> 7;  // 每次输入最高位数据dat <<= 1;  // 移位后将dat数据左移一位,保证下一次移入的数据在最高位// 实现移位寄存器的时序,需要SHCP有一个上升沿,所以先将SHCP置0,然后置1SHCP = 0;_nop_();  // 空指令,不做任何操作,当做延时使用_nop_();SHCP = 1;}// 数据已经在移位寄存器了,现在将移位寄存器的数据输出到存储寄存器// STCP上升沿时将数据从移位寄存器输出到存储寄存器STCP = 0;_nop_();_nop_();STCP = 1;
}void main()
{// 点亮LED点阵的第一个灯,P00=0,其它为1u8 dNum = ~0x01;GPIO_LED = ledNum;while(1){HC595SendByte(dNum);GPIO_LED = ledNum;Delay(200);dNum = _crol_(dNum,1);ledNum = _crol_(ledNum,1);}
}

仿真结果:

74HC595实现LED点阵对角线亮的效果

这篇关于【51单片机系列】74HC595实现对LED点阵的控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/473720

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja