51单片机——IO拓展(串转并)-74HC595 小白详解

news2024/11/18 19:41:04

74HC595 芯片介绍

74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三 态输出(即高电平、低电平和高阻抗)。芯片管脚及功能说明如下:图1

上面两张都是 74HC595 芯片管脚图,细心的朋友就会发现左侧的 1 脚是 QB, 而右侧芯片的 1 脚是 Q1,左侧芯片的 11 脚是 SCK,而右侧芯片的 11 脚是 SH_CP, 还有很多其他管脚不一样,其实这个都没有什么,每个人在绘制芯片管脚图时命 名可能不一样而已,看一个芯片重点是管脚功能。( 小白学习小计:刚开始学习的时候,以为上面两张图是一起的,搞得纠结了好久,才明白这是两张独立的4HC595 芯片管脚图,只是名称不一样,管脚,功能是一样的  
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 模块电路如下图所示:图2(1)74HC595 模块 (2)8*8LED 点阵模块
        从上图中可以看出,74HC595 需要用到的控制管脚 SER、RCLK、SRCLK 直接连 接到 51 单片机的 P3.4-P3.6 IO 口上,输出端则是直接连接到 LED 点阵模块的行 端口上,即为 LED 发光二极管的阳极,LED 点阵的列则为发光二极管的阴极。
        要想控制 LED 点阵,可以将单片机管脚按照 74HC595 芯片的通信时序要求来 传输数据,这样即可控制 LED 点阵的行数据。根据 LED 发光二极管导通原理,当 阳极为高电平,阴极为低电平则点亮,否则熄灭。因此通过单片机 P0 口可控制 点阵列,74HC595 可控制点阵行。
  • 小白学习小计:
  • 1,图2先刨开点阵的图不管,只看74HC595图,从图1我们得知,15 和 1 到 7 脚 QA--QH:并行数据输出,对应图2的5 和 1 到 7 脚,就是QA---AH是并行输出数据,
  • 2,对应图1我们就可以知道:11 脚 SRCLK : 移位寄存器时钟输入。12 脚 RCLK : 存储       寄 存器时钟输入 。13 脚 G 非( OE) : 输出有效  。14 脚 SER( DS): 串行数据输入
  • 3,此时得知14 脚 SER( DS) : 串行数据输入,7/Q7(QH)是一个串行输出。意思就是从       14 脚输入,到1脚输出.
  • 4,SER输入的数据在 SHCP 上升沿进入移位寄存器,在 STCP 上升沿才能输出输出到并行        端口7脚(QH)。
  • 5,输入输出逻辑就是,从14 脚 SER输入数据,储存到移位寄存器11 脚 SRCLK ,在通过移位寄存器传输到存储寄存器12 脚 RCLK,在通过存储寄存器传输给QH
  • 6,从图2,15 和 1 到 7 脚连接到LED的DPa--DPh,所用通过控制15 和 1 到 7 脚就可以控制LED灯
  • 7,这里把QA--QH看成一个字节八位的二进制(0000 0000),芯片工作时候通过向SER传入这个二进制数据来控制QA--QH,QA到QH输出SER的八位。QA为最低位,QH为最高位,例如我们给QH传入高电平就是10000000(0x80)、SER数据的每一位在SRCLK的时钟脉冲上升沿每上升一次存储一位数据在寄存器SCK中,在RCLK上升沿时一次性传输到存储器RCK中(这里怎么看QA为最低位,QH为最高位,我还不知道,哪位知道怎么看留言哈)

软件设计:
通过 74HC595 模块控制 LED 点阵以一行循环滚动显 示。代码如下:每行根据自己的理解都写了解释,请仔细阅读,不对的地方请指出。谢谢
/********************************************************************
****************** 实验名称:IO 扩展(串转并)实验-74HC595
接线说明
实验现象:下载程序后,8*8LED 点阵以一行循环滚动显示
注意事项:LED 点阵旁的 J24 黄色跳线帽短接到 GND 一端
*********************************************************************
******************/
#include "reg52.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 //宏定义LED点阵列控制端口
//定义ghc595_buf[]数组把每次输出的数据储存在里面,传入到hc595_write_data函数
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
* 输 出 : 无
* for(j=110;j>0;j--)在for(i=ms;i>0;i--)嵌套这,delay_ms(500),
* 时候ms=500,i=ms 所以i=500,进入for(i=ms;i>0;i--),
* 然后在执行for(j=110;j>0;j--),进行循环110次一直到j=0,
* 在退出for(j=110;j>0;j--),
* 在重新执行for(i=ms;i>0;i--),一直到到i=0时候,退出for(i=ms;i>0;i--)
*********************************************************************
**********/
void delay_ms(u16 ms)
{
    u16 i,j;
    for(i=ms;i>0;i--)
        for(j=110;j>0;j--);
}
/********************************************************************
***********
* 函 数 名 : hc595_write_data(u8 dat)
* 函数功能 : 向 74HC595 写入一个字节的数据
* 输 入 : dat:数据
* 输 出 : 无
*********************************************************************
**********/

/********************************************************************
*******************SER=dat>>7(dat向右移7位后赋值给SER)详解*************
dat是后面要输入的一个字节的数据,hc595_write_data(0x00)如后面的
hc595_write_data(0x01),这时候dat就是(0x01)当dat=00000001(0x01)时候,
高位是0,低位是1 ,对应按照QH-QA,就是QH低电平,QA高电平,但是74HC595的传输
规律是先从高位在到低位的传输,左移1就传给了QH,这样QH高电平,QA为低电平,我们
想要QH输入低电平怎么办呢?就用把dat>>7,按照右移的规则(对于不带字符的数值,
向右移位时,会在左边的空位填充0。)那(0x01)就变成0(0X00)一个字节八位都是0
这样传输给QH就是低电平,
*********************************************************************
**********/
/********************************************************************
*******************dat<<=1(dat向左移一位后在赋值给dat)详解*************
但是for(i=0;i<8;i++)循环8次,八位就都是0,QH-QA都是低电平,这样是不对的,
我们是要QA输入高电平,这时候就需要每次循环的时候dat<<=1,每次SER=dat>>7;
执行完dat<<=1,例如开始dat=(0x01),执行完SER=dat>>7后,在把dat<<=1(dat向
左移一位后在赋值给dat),这样下次在进入SER=dat>>7时候,dat就是dat<<=1(0X02)
一直倒循环到第7次时候dat也左移了7位,dat变成了10000000(0x80),这时候在进入
SER=dat>>7时候,SER就等于1,对应QA传输,就按照hc595_write_data(0x01)的一样
低位1,其余都是0的输入。
*********************************************************************
**********/
/********************************************************************
*******************SRCLK=0,SRCLK=1详解*******************************
74HC595芯片的传输规则,SER写入数据后,要移位寄存器(SRCLK)时钟上升沿,才能把
数据送到存储寄存器进行输出,所有我们要先给SRCLK一个低电平,在给一个高电平,就产
生了上升沿,那我们就先SRCLK=0送入低电平;中间延时下,在SRCLK=1送入高电平,
一低一高,这样就产生时钟上升沿,就把数据送入到存储寄存器,每次循环都送入存储寄存器,
循环8次,就把8位的数据都送到存储寄存器中了。
中间的delay_10us(1);这里的延时,不要也可以,但是以防出错这里延时下
*********************************************************************
**********/
/********************************************************************
*******************rCLK=0,rCLK=1详解*******************************
74HC595芯片的传输规则,如果将前面写入存储寄存器数据输出,那存储寄存器时钟要
上升沿才能输出,那我们就先rCLK=0送入低电平;中间延时下,在rCLK=1送入高电平,
一低一高,这样产生时钟上升沿,就将前面写入到寄存器的数据输出了。
中间的delay_10us(1);这里的延时,不要也可以,但是以防出错这里延时下
*********************************************************************
**********/
void hc595_write_data(u8 dat)
{
    u8 i=0;
    for(i=0;i<8;i++)//循环 8 次即可将一个字节写入寄存器中
    {
        SER=dat>>7;//优先传输一个字节中的高位
        dat<<=1;//将低位移动到高位        
        SRCLK=0;
        delay_10us(1);
        SRCLK=1;
        delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
    }
    rCLK=0;
    delay_10us(1);
    rCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}
/********************************************************************
***********
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
/********************************************************************
*******************LEDDZ_COL_PORT=0x00详解*******************************
我们在DPa---DPh输入的是高电平,如果我们要将LED灯点亮,我们要把P0端口全部设为低电
平,即 LED 阴极为低电平,前面我们宏定义了P0端口,所以这里LEDDZ_COL_PORT=0x00就可以
*********************************************************************
**********/
/********************************************************************
*******************hc595_write_data(ghc595_buf[i])详解***************
我们定义了,数组ghc595_buf[],把每次输出的数据储存在里面,通过for循环,依次
输出,每次写入新数据之前,要先消除前面输出数据点亮LED进行消影,所以每次在输入
数据之前,我们先把所有DPa---DPh输入低电平,来消除前面寄存器缓存数据,之后在
在写入新的数据:这样就产生了,LED点阵,从下到上,每行依次点亮
*********************************************************************
**********/
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
        }
    }
}
代码还是比较简单易懂的,首先定义好 74HC595 控制管脚,以及点阵列控制 口,代码中重新定义了一个 ms 级延时函数 delay_ms,该函数与前面 delay_10us 类似,都是利用循环占用 CPU 起到延时效果。然后又定义了 74HC595 的控制函数 hc595_write_data,该函数完全按照 74HC595 的通信时序要求编写,主要要注意 的是 74HC595 是先传输字节的高位后传输低位,所以需要将字节低位移动到高位 传输,在传输数据时,要注意移位寄存器时钟和存储寄存器时钟的先后顺序,将 要写入的数据先传输到 74HC595 寄存器中,即在准备好每位数据时要将 SRCLK 进行一个上升沿变化,此时即可将数据传输到寄存器内,待循环 8 次即一个字节 传输到寄存器中时,就可以来一个存储时钟上升沿,此时就可以将 74HC595 寄存 器中的数据全部一次传输到 595 端口输出。最后就是在 main 函数中调用 74HC595 的控制函数,将实验中要实现的效果数据写入进去,从而控制 LED 点阵的阳极, 而阴极由 P0 口控制,默认初始化时已经设置为 0,也就是说只要 595 输出高电 平,那么对应的行就会点亮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+django在线考试系统39n99

目 录 目 录 III 第一章 概述 1 1.1 研究背景 1 1.2 开发意义 1 1.3 研究现状 1 1.4 研究内容 2 1.5 论文结构 2 第二章 开发技术介绍 1 第三章 系统分析 1 3.1 可行性分析 1 3.1.1 技术可行性 1 3.1.2 操作可行性 1 3.1.3 经济可行性 …

STM32频率测量

频率测量是个最基本的且常见的工业需求. 但是这种简单的需求却不是那么的好实现. 总体来看, 目前的单片机还是有很大的改进空间. 很少有频率测量能够覆盖所有的频率范围. 而使用 STM32F103 性能有限. 根据待测频率, 我分成低中高, 三个阶段. 分别对应着3种不同的测量方法. 低频…

springboot 协同办公OA管理系统源码带文字安装教程【免费分享】

Java协同办公OA管理系统源码带文字安装教程 文末获取源码&#xff01; 框架&#xff1a;springboot freemark jpa mybatis mysql 环境&#xff1a;jdk8 mysql5.7 IntelliJ IDEA maven nginx 宝塔面板 这是一套OA办公系统&#xff0c;使用Maven作项目管理&#xff0c;基…

NETCAD GIS快速而简单的搜索引擎

NETCAD GIS快速而简单的搜索引擎 NETCAD GIS是一种支持国际标准的CAD和GIS软件&#xff0c;旨在为用户设计和使用地理信息系统。它还提供了CAD、GIS和光栅与未来的强大连接。 该程序也是一个快速而简单的搜索引擎&#xff0c;只能通过向查看器键入几个单词来访问&#xff0c;并…

嵌入式开发学习之--中断应用概览

文章目录前言一、什么是NVIC1.1NVIC 简介1.2 NVIC 寄存器简介二、中断优先级2.1优先级定义2.2优先级分组三、中断编程总结前言 中断是系统逻辑十分常用的&#xff0c;学好中断&#xff0c;以及中断优先级的合理配置&#xff0c;才能使自己的项目更加稳定。 提示&#xff1a;以…

rdd 相关信息整理

RDD 是什么&#xff1f; 官网描述 A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable, partitioned collection of elements that can be operated on in parallelRDD 是三个单词的首字母缩写&#xff0c;它表示弹性分布式数…

火爆全网的ChatGPT上手体验,文尾免费送账号!

文章目录1. ChatGPT公开信息2. ChatGPT上手体验3. ChatGPT目前趋势4. 福利派送1. ChatGPT公开信息 近期关于网路上对 ChatGPT&#xff08;OpenAI发布的一款人工智能对话引擎&#xff09;的讨论比较多。官方对ChatGPT的定义如下&#xff1a; We’ve trained a model called Cha…

[Linux打怪升级之路]-文件操作

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、认识操…

python -- PyQt5(designer)中文详细教程(七)控件2

控件2 本章我们继续介绍PyQt5控件。这次的有 QPixmap &#xff0c; QLineEdit &#xff0c; QSplitter &#xff0c;和 QComboBox 。 图片 QPixmap 是处理图⽚的组件。本例中&#xff0c;我们使用 QPixmap 在窗⼜⾥显示⼀张图片。 from PyQt5.QtWidgets import (QWidget, QH…

PLC远程监控助力食品废水处理智能化管理

食品加工行业是用水大户&#xff0c;因其原料广泛、成品丰富&#xff0c;中间需要多种不同的加工工艺&#xff0c;因此排放的废水差异很大&#xff0c;废水量也不一样&#xff0c;对污水处理厂提出不同的要求。为了保证污水处理工作的稳定进行&#xff0c;保证视频废水的净化效…

Matplotlib入门[06]——figures,subplots,axes和ticks对象

Matplotlib入门[06]——figures&#xff0c;subplots&#xff0c;axes和ticks对象 参考&#xff1a; https://ailearning.apachecn.org/Matplotlib官网matplotlib xticks yticks import matplotlib.pyplot as pltfigures,axes和ticks的关系 这些对象的关系可以用下图表示&…

基于jsp+mysql+ssm服装商城平台-计算机毕业设计

项目介绍 实现一个基于SSM框架的服装商城平台的的设计与开发。实现用户从浏览服装&#xff0c;搜索服装&#xff0c;加入购物车&#xff0c;下订单&#xff0c;评论服装一整个购物流程的功能,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统使用mysql…

Matter中国开发者大会实录(2022年12月2日,深圳)

目录 背景介绍 Nodic-Matter Silicon Labs-Matter Telink-Matter NXP-Matter BEKEN-Matter ESP32-Matter 背景介绍 2022年12月2日&#xff0c;Matter中国区开发者大会在深圳举行。大概有300多位开发者到会&#xff0c;我也是其中的300分之一。这次大会从早上9点半开始&a…

pybind11的Hello World

pybind11的Hello World pybind11 是用来将c的函数\类等封装为python模块的。从而在python中就可以调用C的库。 安装 pybind11是个C的header-only的库。因此无需安装&#xff0c;只需要有头文件即可。 自己新建一个C文件夹。在文件夹内将pybind作为一个外部库&#xff0c;使…

第七次更新,Spring Cloud Alibaba,迎接微服务生态的下一个十年

Spring Cloud Alibaba是什么&#xff1f; 2022年都快过完了&#xff0c;我相信大家肯定不用我说Spring Cloud Alibaba是什么了&#xff01; 近期阿里最新开源了一份&#xff0c;Spring Cloud Alibaba&#xff08;全解第7版&#xff09;&#xff0c;我大概看了一下&#xff0c…

JAMA Neurology:帕金森病跨疾病阶段的新兴神经成像生物标记物

意义&#xff1a;帕金森病(PD)的成像生物标记物在临床试验中的发病进程监测方面起到越来越重要&#xff0c;也具有改善临床护理和管理的潜力。这篇综述阐述了临床医生和研究人员需要明确在临床过程中使用的PD诊断和发病进程的成像生物标记物的时间相关性。磁共振成像(扩散成像、…

目标检测算法——人体姿态估计数据集汇总(附下载链接)

&#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余收集整理了一批人体姿态估计数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&#x1f388;&#x1f388; 一、KTH 多视图足球数据集 数据集链接&#xff1a…

python快速实现NPV净现值计算

净现值指未来资金&#xff08;现金&#xff09;流入&#xff08;收入&#xff09;现值与未来资金&#xff08;现金&#xff09;流出&#xff08;支出&#xff09;现值的差额&#xff0c;是项目评估中净现值法的基本指标。未来的资金流入与资金流出均按预计折现率各个时期的现值…

2023年天津仁爱学院专升本报名确认缴费考试流程

2023年天津仁爱学院专升本报名确认缴费操作流程说明及考试时间一、报名操作流程 1. 报名注册 请考生于2022年12月7日上午9点—12月11日中午12&#xff1a;00点登录报名系统https://jw.tjrac.edu.cn/zsb&#xff0c;点击“注册”按钮后进入报名登录界面&#xff0c;先请仔细阅读…

多线程学习笔记(三)

一、缓存行 缓存行&#xff1a;从缓存中读取数据是按照一块来读取的&#xff0c;这一块叫做缓存行&#xff0c;64字节大小缓存一致性协议&#xff1a;当两个数位于同一个缓存行时&#xff0c;有两个线程需要同时读取了缓存行中的数据后进行修改&#xff0c;需要和另一个线程的…