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 P0void 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()
{// 关闭所有ledled_all_off();while(1){hc595_show_row();hc595_show_column();}
}

2. 显示一个点

void hc595_show_point(u8 x, u8 y){// 把 LED_MATRIX_PORT 对应的x位置设置为0x = 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 P0void 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()
{// 关闭所有ledled_all_off();led_matrix_init();while(1){hc595_show_char(gled_row);}
}

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

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

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

相关文章

蓝桥杯刷题|03普及-真题

[蓝桥杯 2017 省 B] k 倍区间 题目描述 给定一个长度为 N 的数列&#xff0c;​,,⋯&#xff0c;如果其中一段连续的子序列 ​,,⋯ (i≤j) 之和是 K 的倍数&#xff0c;我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗&#xff1f; 输入格式 …

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 是…

抖音视频爬虫提取工具界面|视频批量下载软件

抖音视频爬虫界面解析 一&#xff1a;概述 抖音视频爬虫是一款功能强大的工具&#xff0c;主要提供关键词批量提取视频和单独视频提取的功能&#xff0c;并支持提取后的视频下载操作。 二&#xff1a;功能解析 2.1&#xff1a;关键词批量提取视频的解析 用户可以通过输入关键…

Kotlin中单例模式和Java的对比浅析

前言 单例模式&#xff0c;一直以来是我们在日常开发中最常用的一种设计模式&#xff0c;更是面试中非常重要&#xff0c;也非常容易被问到的问题。在日常开发中&#xff0c;大家常用的语言还是Java&#xff0c;但今天我给大家带来的是在Kotlin语言中&#xff0c;单例模式是怎…

计算机服务器中了faust勒索病毒怎么办?Faust勒索病毒解密工具流程

在科技技术飞速发展的今天&#xff0c;网络计算机技术也得到了极大发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;越来越多的企业利用网络开展各项工作业务&#xff0c;许多企业离开了网络几乎很难运转&#xff0c;这也导致了企业越来越重视网络安全问题。近日&a…

第二证券策略:股指预计维持震荡格局 关注汽车、半导体等板块

第二证券指出&#xff0c;方针组合拳齐下&#xff0c;商场蓄势待起&#xff0c;短期指数或向上挑战3100点&#xff0c;低位业绩板块、叠加AI或是3月商场主要出资主线&#xff0c;尽管商场情绪高涨&#xff0c;但不主张情绪化追涨&#xff0c;究竟上方还有压制&#xff0c;放量打…

2024.3.19

1.哈希表 代码&#xff1a; #include"hash.h"//申请结点 node_p create_node(int data) {node_p new (node_p)malloc(sizeof(node));new->data data;return new; } //存入哈希表 void insert(node_p H[],int key) {//数据要存入哈希表中指定下标的位置int i …

【Mysql数据库基础03】分组函数(聚合函数)、分组查询

分组函数(聚合函数&#xff09;、分组查询 1 分组函数1.1 简单的使用1.2 是否忽略null值1.3 和关键字搭配使用1.4 count函数的详细介绍1.5 练习 2 分组查询Group by2.1 简单的分组查询2.2 练习 3 格式投票:yum: 1 分组函数 1.1 简单的使用 COUNT(expression)&#xff1a;计算符…

一维小波包的分解与重构程序深入学习——Matlab

绘制上述图的matlab程序为&#xff1a; clear all; close all; load noisdopp; xnoisdopp; wptwpdec(x,3,db1,shannon) %返回小波包树&#xff0c;设置采用的熵为shannon plot(wpt); %% 学习目标&#xff1a;一维小波包的分解和重构深入学习 %% 获取小波树上某个节点的小…

代码随想录day21(1)二叉树:平衡二叉树(leetcode110)

题目要求&#xff1a;判断一棵树是否为平衡二叉树 思路&#xff1a;递归地比较左右子树&#xff0c;只要有一棵子树不满足条件就说明这棵树不是平衡二叉树。本题采用迭代法较为复杂。 leetcode实战&#xff1a; 代码实现&#xff1a; 递归&#xff1a; 迭代&#xff1a;

python失物招领系统-安卓-flask-django-nodejs-php

对于本失物招领 的设计来说&#xff0c; 它是应用mysql数据库、安卓等技术动态编程以及数据库进行努力学习和大量实践&#xff0c;并运用到了 建设中在整个系统的设计当中&#xff0c;具体根据网上失物招领的现状来进行开发的&#xff0c;具体根据用户需求实现网上失物招领网络…

Java 设计模式系列:行为型-状态模式

简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;允许一个对象在其内部状态改变时改变其行为。状态模式中类的行为是由状态决定的&#xff0c;在不同的状态下有不同的行为。 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂…

[Labtools 27-1429] XML parser encountered a problem in file

平台&#xff1a;Vivado2108.3 最近在使用vivado的debug过程中发现&#xff0c;编译好工程后打开open hardware manager出现如下错误。 [Labtools 27-1429] XML parser encountered a problem in file E:/githome/xxxx/hw_1/hw.xml at line 1 : XML character encoding not su…

智能合约语言(eDSL)—— 使用rust实现eDSL的原理

为理解rust变成eDSL的实现原理&#xff0c;我们需要简单了解元编程与宏的概念,元编程被描述成一种计算机程序可以将代码看待成数据的能力&#xff0c;使用元编程技术编写的程序能够像普通程序在运行时更新、替换变量那样操作更新、替换代码。宏在 Rust 语言中是一种功能&#x…

机器人离散化阻抗控制

机器人离散化阻抗控制是一种控制策略&#xff0c;它结合了阻抗控制的思想与离散化方法&#xff0c;以实现对机器人运动与外力之间动态关系的精细调节。这种控制方法旨在使机器人在与环境交互时能够表现出期望的阻抗特性&#xff0c;从而实现对接触力和位置的精确控制。 在离散…

STM32—控制蜂鸣器(定时器)

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c tim_irq.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 定时器中断是利用定时器的计数功能&#xff08;向上计数或向下计…

算法---二分查找练习-3(山脉数组的顶峰索引)

山脉数组的顶峰索引 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 初始化两个指针 left 和 right&#xff0c;分别指向数组的起始位置和结束位置。 进入循环&#xff0c;循环条件为 left < right。 在每次循环中&…

Visual Studio - 添加快捷键图标

Visual Studio - 添加快捷键图标 1. Text Editor Toolbar Options -> Add or Remove Buttons -> Customize2. Toolbars3. Commands -> Debug4. Add Command...References 1. Text Editor Toolbar Options -> Add or Remove Buttons -> Customize 2. Toolbars B…

机器学习-05-特征工程

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中特征工程部分。 参考 机器学习之特征工程详解 特征工程&#xff08;Feature Engineering&#xff09; 特征工程是指使用专业的背景知识和技巧处理数据&#xff0c;使得特征能在机器学习算法上发生更好的…

Lvs+keepalived+nginx搭建高可用负载均衡集群

环境配置 master主机192.168.199.149&#xff0c;虚拟IP192.168.199.148 back备机192.168.199.150 真实服务器1 192.168.199.155 真实服务器2 192.168.199.156 关闭防火墙和selinux master配置&#xff08;149&#xff09; 添加虚拟IP ip addr add 192.168.199.148/24 …