当前位置: 首页 > news >正文

嵌入式开发学习(STC51-5-数码管)

内容

静态数码管:最左端显示0
动态数码管:从左到右,显示0-9

数码管简介

数码管是一种半导体发光器件,其基本单元是发光二极管;

类别:

  • 数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要
    显示的内容;
  • 按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管;
  • 按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管;

共阳数码管和共阴数码管:

  • 共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮;
  • 共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮;

显示原理

我们开发板上使用的数码管是2个四位一体的共阴极数码管(即8个LED的阳极全部并联一起引出,阴极分别引出如A、B、……、DP);

如果要让共阴数码管显示数字0,即对应的段ABCDEF要点亮即给它高电平,其他的段熄灭即给它低电平,其他的数字显示方式一样;

共阴和共阳数码管的0-F段码数据表

  • 共阴数码管码表
0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f0x770x7c0x390x5e0x790x710x00
0123456789ABCDEF无显示
  • 共阳数码管码表
0xC00xF90xA40xB00x990x920x820xF80x800x900x880x830xC60xA10x860x8E0xFF
0123456789ABCDEF无显示

从上述共阳和共阴码表中不难发现,它们的数据正好是相互取反的值;

共阴数码管数字0段码,0x3f,其二进制是0011 1111,该段码数据由来,是将dp段做为最高位,a段作为最低位,共8位,正好和51单片机的一组端口数一样,因此可以直接使用某一组端口控制数码管的段选数据口,比如P0口

静态数码管显示原理

每个数码管的段选接一个8位数据线来保持显示的字形码,当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止;

优点是占用CPU时间少,显示便于监测和控制;

缺点是硬件电路比较复杂,成本较高,比如使用4个静态数码管,那么就得32个IO来控制,这对51单片机来说是无法承受的;

动态数码管显示原理

将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效;

选亮数码管采用轮流显示的方式,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示;

动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路的电阻;

原理图

线路图
在这里插入图片描述
在这里插入图片描述

由原理图可以看出,P00-07管脚控制数码管显示的图形,P22-24控制哪个数码管被点亮;

因为单片机IO口外部都增加了外部上拉电阻,因此P22、P23、P24引脚默认就是高电平,根据74HC138译码器输出特点,此时Y7脚输出有效(即LED8点亮),为低电平;

而数码管的段选a-dp连接在74HC245驱动芯片输出口,由P0端口控制,所以只要控制P0口输出高电平,SMG1最左边那个数码管默认就可以显示;

静态数码管

思路

让P0口设置为0的的段码数据,即可在最左端显示数字0

编码

main.c

/** @Description: 静态数码管-最左端显示0*/
#include "reg52.h"typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;#define SMG_A_DP_PORT P0 // 使用宏定义数码管段码口// 共阴极数码管显示0~F的段码数据
u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void main()
{SMG_A_DP_PORT = gsmg_code[0]; // 将数组第1个数据赋值给数码管段选口while (1){}
}

编译和结果

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

结果:数码管最左端显示0
在这里插入图片描述

动态数码管

思路

人的肉眼正常情况下只能分辨变化超过24ms间隔的运动;

所以我们可以循环点亮各个数码管,并且这个循环间隔不超过24ms,这样看起来就是每个数码管都被点亮了;

编码

main.c

/** @Description: 动态数码管-从左到右,显示0-9*/
#include "reg52.h"typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;#define SMG_A_DP_PORT P0 // 使用宏定义数码管段码口// 定义数码管位选信号控制脚
sbit LSA = P2 ^ 2;
sbit LSB = P2 ^ 3;
sbit LSC = P2 ^ 4;// 共阴极数码管显示0~F的段码数据
u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};/*** @description: 延时函数(循环一次大约10us)* @param {u16} ten_us* @return {*}*/
void delay_10us(u16 ten_us)
{while (ten_us--);
}/*** @description: 循环点亮各个数码管* @return {*}*/
void smg_display(void)
{u8 i = 0;for (i = 0; i < 8; i++){switch (i) // 位选{case 0:LSC = 1;LSB = 1;LSA = 1;break;case 1:LSC = 1;LSB = 1;LSA = 0;break;case 2:LSC = 1;LSB = 0;LSA = 1;break;case 3:LSC = 1;LSB = 0;LSA = 0;break;case 4:LSC = 0;LSB = 1;LSA = 1;break;case 5:LSC = 0;LSB = 1;LSA = 0;break;case 6:LSC = 0;LSB = 0;LSA = 1;break;case 7:LSC = 0;LSB = 0;LSA = 0;break;}SMG_A_DP_PORT = gsmg_code[i]; // 传送段选数据delay_10us(100);			  // 延时一段时间,等待显示稳定SMG_A_DP_PORT = 0x00;		  // 消影}
}void main()
{while (1){smg_display();}
}

编译和结果

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

结果:
在这里插入图片描述

相关文章:

嵌入式开发学习(STC51-5-数码管)

内容 静态数码管&#xff1a;最左端显示0 动态数码管&#xff1a;从左到右&#xff0c;显示0-9 数码管简介 数码管是一种半导体发光器件&#xff0c;其基本单元是发光二极管&#xff1b; 类别&#xff1a; 数码管按段数可分为七段数码管和八段数码管&#xff0c;八段数码管…...

JavaScript |(四)正则表达式 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 文章目录 &#x1f4da;正则表达式&#x1f4da;正则表达式字面量方式&#x1f4da;字符串&正则表达式&#x1f407;split()&#x1f407;search()&#x1f407;match()&#x1f407;replace()…...

docker-compose实现mysql主从复制

利用docker-compose实现mysql主从复制 1.首先创建挂载的目录以及配置信息 1.1 主 mkdir -p /opt/mysql/master/data mkdir -p /opt/mysql/master/config # 编写配置文件 vim /opt/mysql/master/config/my.cnfmy.cnf配置信息 [mysqld] usermysql default-storage-engineINNO…...

hbase基础

hbase安装 tar -zxvf hbase-2.4.11-bin.tar.gz -C . ln -s f hbase-2.4.11-bin hbasemv /export/server/hbase/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar /export/server/hbase/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar.bakvim conf/regionser…...

【GitOps系列】如何实施自动化渐进式交付?

文章目录 前言自动渐进式交付概述自动渐进式交付准备创建生产环境创建 AnalysisTemplate访问生产环境安装Prometheus配置 Ingress-Nginx 和 ServiceMonitor验证 Ingress-Nginx 指标 自动渐进式交付实战自动渐进式交付成功自动渐进式交付失败 结语 前言 在实施金丝雀发布的过程中…...

【网络】网络层(IP协议)

目录 一、基本概念 二、协议头格式 三、网段划分 四、特殊的IP地址 五、IP地址的数量限制 六、私有IP地址和公网IP地址 七、路由 一、基本概念 IP协议&#xff1a;提供一种能力&#xff0c; 将数据从A主机送到B主机&#xff0c;&#xff08;TCP协议&#xff1a;确保IP协议…...

Unity数字可视化学校_昼夜(一)

maya2022:链接&#xff1a;https://pan.baidu.com/s/1cvB438UKsv_tU37NsOaNow 3dmax软件合集:百度网盘 请输入提取码 1180 1、 2、unity3d 导入插件 &#xff1a; &#xff08;1&#xff09;UniStorm - Volumetric Clouds Sky 5.3.0.unitypackage &#xff08;天气&…...

QWidget样式

1、设置边框样式&#xff1a; QWidget {font-family:Microsoft YaHei UI;background:#ffffff;/*border:3px solid rgba(207, 209, 208, 170);设置整体边框*/border-bottom: 3px solid rgba(207, 209, 208, 170);/*设置底部边框*/border-top: 3px solid rgba(207, 209, 208, 1…...

TypeScript基础学习

目录 一、安装 1、下载国内镜像 2、安装 3、查看安装情况 4、使用例子 二、变量声明 1、规则 2、声明的四种方式 3、注意 4、类型断言 5、类型推断 6、变量作用域 三、基础类型&#xff08;共11种&#xff09; 1、Any 类型 2、Null 和 Undefined 3、never 类型…...

AOF日志:宕机了,Redis如何避免数据丢失

当服务器宕机后&#xff0c;数据全部丢失&#xff1a;我们很容易想到的一个解决方案是从后端数据库恢复这些数据&#xff0c;但这种方式存在两个问题&#xff1a;一是&#xff0c;需要频繁访问数据库&#xff0c;会给数据库带来巨大的压力&#xff1b;二是&#xff0c;这些数据…...

【编程】典型题目:寻找数组第K大数(四种方法对比)

【编程】典型题目&#xff1a;寻找数组第K大数&#xff08;四种方法对比&#xff09; 文章目录 【编程】典型题目&#xff1a;寻找数组第K大数&#xff08;四种方法对比&#xff09;1. 题目2. 题解2.1 方法一&#xff1a;全局排序&#xff08;粗暴&#xff09;2.2 方法二&#…...

Vue3 对比 Vue2 的变化

Vue3 对比 Vue2 的变化 1.源码组织方式变化&#xff1a;使用 TS 重写 2.支持 compositionAPI&#xff0c;基于函数的 api&#xff0c;更灵活组织组件逻辑(Vue2 使用 options api) 3.响应式系统提升&#xff1a;Vue3 的响应式数据原理改成了 Proxy&#xff0c;可以监听动态新增删…...

harbor搭建

回到目录 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务 通俗的讲&#xff0c;harbor是一个私人镜像存储服务器 1 下载安装 进入官网&#xff0c;下载一个离线安装包,harbor官网下载 这…...

机器学习05-数据准备(利用 scikit-learn基于Pima Indian数据集作数据预处理)

机器学习的数据准备是指在将数据用于机器学习算法之前&#xff0c;对原始数据进行预处理、清洗和转换的过程。数据准备是机器学习中非常重要的一步&#xff0c;它直接影响了模型的性能和预测结果的准确性 以下是机器学习数据准备的一些常见步骤&#xff1a; 数据收集&#xff…...

【枚举+trie+dfs】CF514 C

Problem - 514C - Codeforces 题意&#xff1a; 思路&#xff1a; 其实是trie上dfs的板题 先把字符串插入到字典树中 对于每次询问&#xff0c;都去字典树上dfs 注意到字符集只有3&#xff0c;因此如果发现有不同的字符&#xff0c;去枚举新的字符 Code&#xff1a; #in…...

【计算机视觉】BLIP:统一理解和生成的自举多模态模型

文章目录 一、导读二、背景和动机三、方法3.1 模型架构3.2 预训练目标3.3 BLIP 高效率利用噪声网络数据的方法&#xff1a;CapFilt 四、实验4.1 实验结果4.2 各个下游任务 BLIP 与其他 VLP 模型的对比 一、导读 BLIP 是一种多模态 Transformer 模型&#xff0c;主要针对以往的…...

【Ansible】Ansible自动化运维工具之playbook剧本搭建LNMP架构

LNMP 一、playbooks 分布式部署 LNMP1. 环境配置2. 安装 ansble3. 安装 nginx3.1 准备 nginx 相关文件3.2 编写 lnmp.yaml 的 nginx 部分3.3 测试 nginx4. 安装 mysql4.1 准备 mysql 相关文件4.2 编写 lnmp.yaml 的 mysql 部分4.3 测试 mysql5. 安装 php5.1 编写 lnmp.yaml 的 …...

Spring中的事务

一、为什么需要事务&#xff1f; 事务定义 将一组操作封装成一个执行单元&#xff08;封装到一起&#xff09;&#xff0c;要么全部成功&#xff0c;要么全部失败。 为什么要用事务&#xff1f; 比如转账分为两个操作&#xff1a; 第一步操作&#xff1a; A 账户 -100 元…...

38 非法地址访问的 segment fault 的调试

前言 在前面一篇文章 coredump 的生成和使用 中, 我们看到 "测试用例2 - 非法地址访问" 产生了一个 segment fault 我们这里 就来调试一下 这个 segment fault 是怎么回事 测试用例 #include "stdio.h"int main(int argc, char** argv) {int x 2; i…...

c++中c_str()的用法详解

c_str()就是将C的string转化为C的字符串数组&#xff01;&#xff01;&#xff01; C中没有string&#xff0c;所以函数c_str()就是将C的string转化为C的字符串数组&#xff0c;c_str()生成一个const char *指针&#xff0c;指向字符串的首地址。 下文通过3段简单的代码比较分析…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...