51单片机学习笔记7 串转并操作方法

51单片机学习笔记7 串转并操作方法

  • 一、串转并操作简介
  • 二、74HC595介绍
    • 1. **功能**:
    • 2. **引脚**:
    • 3. **工作原理**:
    • 4. 开发板原理图
      • (1)8*8 LED点阵:
      • (2)74HC595 串转并:
  • 三、代码示例
    • 1. LED 滚动显示程序
      • (1)led_matrix_utils.c
      • (2)main.c
    • 2. 显示一个点
    • 3. 显示字符程序
      • (1) led_matrix_utils.c
      • (2)main.c

在这里插入图片描述

一、串转并操作简介

由于单片机的I/O资源有限,在进行一些外围设备通讯时,如LED点阵、数码管操作,需要大量的I/O资源,为了减少单片机的资源占用,可以使用串转并的操作,通过引入专用芯片,用较少的单片机I/O引脚,控制大量的外围I/O引脚设备。

在串转并操作中,串行数据首先经过一个串行转并行转换器,该转换器将串行数据拆分为多个并行数据。
这些并行数据同时传输到并行数据接收器,每个并行数据接收器负责接收并处理其中的一部分数据。
最后,这些处理后的并行数据再通过并行数据输出端口一起输出,形成并行数据流。

二、74HC595介绍

74HC595是一种串行输入/并行输出(SIPO)移位寄存器,常用于扩展微控制器的输出端口:

1. 功能

  • 74HC595具有8位并行输出端口,可以同时控制8个输出设备,如LED、数码管等。
  • 它具有串行输入端口,可以通过串行输入将数据加载到内部寄存器中。
  • 74HC595还具有控制引脚,用于控制数据的加载和输出使能。
  • 74HC595的并行输出为三态输出:高电平、低电平

2. 引脚

在这里插入图片描述

  • DS(串行数据输入):用于接收串行输入数据。
  • SH_CP(时钟输入):用于接收时钟脉冲,控制数据的移位。
  • ST_CP(存储时钟输入):用于接收存储时钟脉冲,控制数据的加载到寄存器中。
  • OE(输出使能):用于控制输出端口的使能状态。
  • Q7’(串行输出):输出从DS端输入的数据,用于级联多个74HC595。
  • Q0-Q7(并行输出):8位并行输出端口。

其中Q7’可以级联下一个74HC595,这样通过3个单片机的IO口,可以控制更多的外设IO。

3. 工作原理

  • 74HC595的工作过程分为两个阶段:移位阶段和存储阶段。
  • 移位阶段:在时钟信号的作用下,串行输入的数据从DS端依次移位到寄存器中。
  • 存储阶段:当存储时钟信号触发时,寄存器中的数据被加载到并行输出端口,并同时输出到外部设备。

4. 开发板原理图

(1)8*8 LED点阵:

在这里插入图片描述

  • 通过P0 端口控制列是否有效,设置P0=0,可以启用全部列。
  • 通过 DPa~DPh控制每一行是否有效,行的数值通过 74HC595传过来。

(2)74HC595 串转并:

在这里插入图片描述
传送一个数据的过程:

  1. OE 置低使能芯片;
  2. SER传一个BIT数据;
  3. 给SR_CLK 一个上升沿,将SER的数据移到QA;
  4. 重复第2步,更多数据移入寄存器,先移入的数据放入A,其它B、C、D…依次向后移动;
  5. 传完8个bit数据,给 R_CLK一个上升沿,将数据推到DPn的并口输出。

三、代码示例

1. LED 滚动显示程序

本代码实验现象是: LED 点阵从最下行向上,每次滚动显示一行。
显示到第一行后,改从最右列向左,每次滚动显示一列。

(1)led_matrix_utils.c

#include "led_matrix_utils.h"
#include "common_utils.h"

// 时钟输入引脚,用于控制数据的移位操作
sbit SR_CLK = P3^6;
// 数据数据推到输出寄存器的引脚
sbit R_CLK = P3^5;
// 串行数据输入
sbit SER = P3^4;

u8 gc595_buf[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

// 低电平有效,开启列
#define LED_MATRIX_PORT P0

void hc595_show_data(u8 show_data)
{
    u8 i = 0;
    for (i = 0; i < 8; i++)
    {
        SER = show_data >> 7 ;
        show_data <<= 1;
        // 移位寄存器时钟上升沿,进行移位操作
        SR_CLK = 0;
        delay_10us(1);
        SR_CLK = 1;
        delay_10us(1);
    }
    // 输出寄存器时钟上升沿,将移位寄存器的数据复制到输出寄存器
    R_CLK = 0;
    delay_10us(1);
    R_CLK = 1;
    delay_10us(1);
}
void hc595_show_row(void){
    u8 i=0;
    LED_MATRIX_PORT = 0;
    for(i=0;i<8;i++){
        hc595_show_data(0x00);
        hc595_show_data(gc595_buf[i]);
        delay_ms(500);
    }
}
void hc595_show_column(void){
    u8 i=0;
    hc595_show_data(0xFF);
    for(i=0;i<8;i++){
        LED_MATRIX_PORT = ~gc595_buf[i];
        delay_ms(500);
    }
}

(2)main.c

#include <reg52.h>
#include "led_utils.h"
#include "common_utils.h"
#include "led_matrix_utils.h"

/**
* @brief 主函数
*/
main()
{
	// 关闭所有led
	led_all_off();

	while(1)
	{
		hc595_show_row();
		hc595_show_column();
	}
}

2. 显示一个点

void hc595_show_point(u8 x, u8 y){
    // 把 LED_MATRIX_PORT 对应的x位置设置为0
    x = 8-x;
    y = 8-y;
    LED_MATRIX_PORT = ~(0x01 << x);

    hc595_show_data(gc595_buf[x]);
    delay_ms(1000);
}

3. 显示字符程序

(1) led_matrix_utils.c

#include "led_matrix_utils.h"
#include "common_utils.h"
#include <reg52.h>

// 时钟输入引脚,用于控制数据的移位操作
sbit SR_CLK = P3^6;
// 数据数据推到输出寄存器的引脚
sbit R_CLK = P3^5;
// 串行数据输入
sbit SER = P3^4;

u8 gled_column[8] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};

// 低电平有效,开启列
#define LED_MATRIX_PORT P0

void led_matrix_init(void){
    LED_MATRIX_PORT = 0x00;
}
void hc595_show_data(u8 show_data)
{
    u8 i = 0;
    for (i = 0; i < 8; i++)
    {
        SER = show_data >> 7 ;
        show_data <<= 1;
        // 移位寄存器时钟上升沿,进行移位操作
        SR_CLK = 0;
        delay_10us(1);
        SR_CLK = 1;
    }
    // 输出寄存器时钟上升沿,将移位寄存器的数据复制到输出寄存器
    R_CLK = 0;
    delay_10us(1);
    R_CLK = 1;
}
void hc595_show_char(u8* gled_row){
    u8 i =0;
    for(i=0;i<8;i++){
        LED_MATRIX_PORT = gled_column[i];
        hc595_show_data(gled_row[i]);
        delay_10us(280);
        hc595_show_data(0x00);
    }
}

(2)main.c

#include <reg52.h>
#include "led_utils.h"
#include "common_utils.h"
#include "led_matrix_utils.h"
#include "types.h"
// 数据0
u8 gled_row[8] = {0x00, 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00};
/**
* @brief 主函数
*/
main()
{
	// 关闭所有led
	led_all_off();

	led_matrix_init();
	while(1)
	{
		hc595_show_char(gled_row);
	}
}

本文开源地址:https://gitee.com/xundh/learn51

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt-pdf-viewer-library 编译过程记录

1.qtpdfviewerinitializer.h 中 类模板问题需要修改为下面代码: https://github.com/develtar/qt-pdf-viewer-library 下载代码&#xff1a; 编译出现错误 修改代码&#xff0c;如下: 2.无法触发onViewerLoaded 事件&#xff0c;就是界面无法显示PDF文件 修改下面代码&#…

在线播放视频网站源码系统 带完整的安装代码包以及搭建教程

在线播放视频网站源码系统的开发&#xff0c;源于对当前视频市场的深入洞察和用户需求的精准把握。随着视频内容的爆炸式增长&#xff0c;用户对视频播放的需求也日益多样化。他们希望能够随时随地观看自己感兴趣的视频内容&#xff0c;同时还希望能够在观看过程中享受到流畅、…

vue2 vue3 diff算法比较

目录 1&#xff1a;没key 补充1&#xff1a;为什么不建议用index作为key值&#xff1f; 2&#xff1a;有key 2.1&#xff1a;vue2diff 2.2&#xff1a;vue3diff 补充2&#xff1a;vue3的最长递增子序列 补充3&#xff1a;vue2diff和vue3diff的比较 补充4&#xff1a;虚…

Linux 服务升级:MySQL 主从(半同步复制) 平滑升级

目录 一、实验 1.环境 2.Mysql-shell 检查工具兼容性 3.逻辑备份MySQL数据 4.备份MySQL 数据目录、安装目录、配置文件 5.MySQL 升级 6.master节点 使用systemd管理mysql8 7. slave1 节点升级 8. slave2 节点升级 9.半同步设置 二、问题 1.mysqldump备份报错 2.Inn…

推荐一个Java学习路线图

今天给大家推荐一个Java 学习路线, Java 要学的知识点、对应的学习资源和预计要花费的时间&#xff0c;都安排的明明白白的&#xff0c;不用再盲目的选了&#xff0c;有计划了&#xff0c;也别再迷茫和纠结了&#xff0c;就跟着学就行了。 1.1阶段一练气筑基--Java基础&#xf…

分布式砖题

雪花算法 变动位数&#xff0c;性能佳&#xff0c;灵活调整bit位划分&#xff0c;灵活 zk 临时节点和watch机制实现注册中心 &#xff0c;数据都在内存&#xff0c;nio 多线程模型&#xff1b; cp注重一致性&#xff0c;集群数据不一致时集群不可用 数据一致性模型 cap 强…

Nanya(南亚科技)DRAM芯片选型详解

一、DRAM产品选型 普通SDRAM只在时钟的上升期进行数据传输&#xff0c;DDR内存能够在时钟的上升期和下降期各传输一次数据&#xff0c;因此性能翻倍&#xff0c;被称为双倍速率同步动态随机存储器。因此DDR内存可以在与SDRAM相同的总线频率下达到更高的数据传输率。DDR是一种掉…

十一、MYSQL 基于MHA的高可用集群

目录 一、MHA概述 1、简介 2、MHA 特点 3、MHA 工作原理&#xff08;流程&#xff09; 二、MHA高可用结构部署 1、环境准备 2、安装MHA 监控manager 3、在manager管理机器上配置管理节点&#xff1a; 4、编master_ip_failover脚本写 5、在master上创建mha这个用户来访…

32位ARM微控制器: TLE9877QTW40XUMA1、CY9BF416NPMC-G-JNE2、CY9BF316NPMC-G-JNE2描述、器件参数

1、TLE9877QTW40 IC MCU 32BIT 64KB FLASH 48TQFP 描述&#xff1a;TLE9877QTW40属于TLE987x产品系列。TLE9877QTW40是一款单芯片三相电机驱动器&#xff0c;集成了行业标准的Arm Cortex -M3内核&#xff0c;能够实现先进的电机控制算法&#xff0c;例如磁场定向控制。它包括六…

【SpringSecurity】十三、基于Session实现授权认证

文章目录 1、基于session的认证2、Demosession实现认证session实现授权 1、基于session的认证 流程&#xff1a; 用户认证成功后&#xff0c;服务端生成用户数据保存在session中服务端返回给客户端session id (sid&#xff09;&#xff0c;被客户端存到自己的cookie中客户端下…

进阶了解C++(5)——搜索二叉树

1. 什么是搜索二叉树&#xff1a; 在之前针对数据结构的文章中&#xff0c;对数、二叉树以及堆进行了介绍&#xff0c;在本部分&#xff0c;将针对二叉搜索树进行介绍。对于二叉搜索树&#xff0c;其于二叉树相比&#xff0c;最大的特点就是结点的排布是存在规则的。在搜索二叉…

seleniumUI自动化实例(登录CSDN页面)

今天分享一个CSDN登录模块的登录场景 1.配置文件 CSDNconf.py&#xff1a; from selenium import webdriver options webdriver.ChromeOptions() options.binary_location r"D:\Program Files\360\360se6\Application\360se.exe" # 360浏览器安装地址 driver w…

Spark 3.5.0 特性速览

介绍 Spark 3系列已经发布了第六版3.5.0&#xff0c;目前最新3.5.1。 使用最广泛的大数据可扩展计算引擎。数以千计的公司&#xff0c;包括 80% 的财富 500 强企业&#xff0c;都在使用 Apache Spark。来自业界和学术界的 2000 多名开源项目贡献者。 Apache Spark 3.5.0 是…

单片机——数电复习(1)

1逻辑门电路的分类 2高电平与低电平的含义 1逻辑门电路的分类 1.1按了逻辑功能分 与门 或门 非门 异或门 与非门 或非门 与或非门 与门&#xff08;全1为1&#xff09;YAB 全为高电平才输出高电平 使用仿真看现象 当只有一个输入只有一个为1时小灯不亮 当输入都为1时 &a…

【RabbitMQ | 第四篇】基于RabbitMQ实现延迟队列

文章目录 4.基于RabbitMQ实现延迟队列4.1延迟队列定义4.2基于DLX&#xff08;死信交换机&#xff09;实现延迟队列4.2.1实现思路4.2.2主要流程4.2.3实战&#xff08;1&#xff09;创建两个消息队列&#xff1a;原始消息队列、死信队列 and 为原始消息队列关联私信交换机&#x…

搜维尔科技:OptiTrack提供了一个通用、精确、灵活和可监控的系统!

MELS集成OptiTrack与最前沿的虚拟生产阶段 在加拿大蒙特利尔&#xff0c;MELS Studios and Postproduction设有20个工作室&#xff0c;以满足各种规模的电影和电视项目的需求。凭借先进的技术设施和专业的技术团队&#xff0c;梅尔斯为电影行业的合作伙伴提供从摄影棚和设备租…

Python分析无人驾驶汽车在桂林市文旅行业推广的问卷

【项目背景】 通过市场调研、文本分析、访谈和问卷调查等方法&#xff0c;探讨&#xff1a; 网民对无人驾驶汽车出行服务的态度。无人驾驶安全员的行业背景。不同人群在旅游时的交通选择偏好。游客及当地居民对桂林市文旅路线的交通满意度。乘客对无人驾驶汽车的满意度。桂林…

策略模式实战

项目推荐最近开发完成的项目中使用到了策略模式&#xff0c;实现多种支付方式&#xff0c;避免了后期支付方式if-else代码的冗余&#xff0c;也有利于后期支付的一个扩展。同时这个项目非常适合于做毕设&#xff0c;想了解这个项目的同学可以联系我QQ&#xff1a;3808898981 前…

【项目管理后台】Vue3+Ts+Sass实战框架搭建一

项目管理后台 建立项目最好是卸载Vetur 新建.env.d.ts文件安装Eslint安装校验忽略文件添加运行脚本 安装prettier新建.prettierrc.json添加规则新建.prettierignore忽略文件 安装配置stylelint新建.stylelintrc.cjs 添加后的运行脚本配置husky配置commitlint配置husky 强制使用…

【十三】【算法分析与设计】二分查找(1)

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…
最新文章