【51单片机】数码管的静态与动态显示(含消影)

数码管在现实生活里是非常常见的设备,例如在这里插入图片描述
这些数字的显示都是数码管的应用。

目录

  • 静态数码管:
    • 器件介绍:
      • 数码管的使用:
      • 译码器的使用:
      • 缓冲器:
    • 实现原理:
    • 完整代码:
  • 动态数码管:
    • 消影:
    • 完整代码:

静态数码管:

器件介绍:

在这里插入图片描述
注意:数码管有共阴共阳的区分。
在这里插入图片描述
在自己设计电路时,应当选用一种数码管时需要选用相应的译码器(共阴配共阴,共阳同理)


数码管的使用:

数码管其实就是一段一段LED构成的,51单片机使用的是共阴数码管,即图中的上侧表示,其中的标号怎样理解呢?
在这里插入图片描述
3和8为一个端子引出去的两个引脚,都是接地,
其余引脚的虽然右图看似杂乱无章,实则有点就近原则的意思,一个引脚控制一段LED,从上侧左图就可以看出。


但是这是一个数码管,51单片基中的数码管是下图这样的
看着复杂,无非就是多了7个共阴端,这时我们就需要译码器来进行选择哪个管子亮,这个过程叫做位选
在这里插入图片描述
在学习数电时,会接触到译码器,其中最经典的就是138译码器

译码器的使用:

大概说一下它的功能,
使能端让译码器正常工作情况下(51单片机的译码器可以看到三个使能端已经达到此效果),我们通过输入端A B C来进行控制Y端子的输出,每次输出一位有效,有效的会输出0
正好符合我们共阴的配置,一次可以选择一个数码管的亮灭1在这里插入图片描述


缓冲器:

选择完管子,就轮到每个管子应该输出什么数字了,
这个过程叫做段选
回到这张图片,我们发现每个管子的数字是通过P0端来实现显示数字
74HC245的作用主要是缓冲,增加电流,让灯更亮,
电阻的作用是限流,防止烧坏
在这里插入图片描述

实现原理:

元器件的使用知道了,现在就可以操作了
现在梳理一下流程

  1. 通过译码器控制指定的管子亮灭
  2. 控制P0寄存器控制显示的数字

技巧:

在需要一个实现固定功能的代码情况下,可以将其封装成一个函数,使用时更方便,便捷

我们这里就选择将控制第几个灯亮,显示什么数字的功能封装成一个函数

注意:

赋值时应当注意译码器的高低位等器件的高低位,防止最后的结果不符合预期

#include <REGX52.H>
//延时函数
void Delay(unsigned char xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}
}char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };//loc代表选择灯亮的位置,num代表你要显示的数字
void NixieTube(unsigned char loc, num)
{switch(loc){case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;}//数字的显示通过数组,我们再控制LED灯时普遍喜欢用数组实现P0 = arr[num];
}

完整代码:

#include <REGX52.H>void Delay(unsigned char xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}
}char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };void NixieTube(unsigned char loc, num)
{switch(loc){case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;}P0 = arr[num];
}void main()
{NixieTube(1, 1);while(1){	}
}

动态数码管:

先来科普一下:

动态数码管不是动态的显示数字(表面理解),而是一次显示多个数字

有了以上的基础,动态数码管可谓是信手拈来
我们将封装好的函数放在while(1)循环中,在循环中放入你想控制的位置与数字

消影:

运行后发现会有重影的现象在这里插入图片描述
产生原因:
我们静态显示一个数码管时是位选–>段选,最后死循环完成的,
但是动态的显示的顺序是 位选 -->段选–>位选–>段选–>位选 这样循环,而问题就出现在段选–>位选这里,因单片机的速度非常快,导致上一次的段选与下一次的位选相结合,造成了重影

消影方法:
对封装好的函数进行一点改进,
现状态稳定1ms,在次状态开始前进行清0的操作

void NixieTube(unsigned char loc, num)
{switch(loc){case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;}P0 = arr[num];Delay(1);P0 = 0x00;
}

完整代码:

#include <REGX52.H>void Delay(unsigned char xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}
}char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };void NixieTube(unsigned char loc, num)
{switch(loc){case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;}P0 = arr[num];Delay(1);P0 = 0x00;
}void main()
{while(1){	NixieTube(1, 1);NixieTube(2, 2);NixieTube(3, 3);}
}

有不好的地方尽情留言

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

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

相关文章

Docker 安装 MySQ

Docker 安装 MySQL MySQL 是世界上最受欢迎的开源数据库。凭借其可靠性、易用性和性能&#xff0c;MySQL 已成为 Web 应用程序的数据库优先选择。 1、查看可用的 MySQL 版本 访问 MySQL 镜像库地址&#xff1a;https://hub.docker.com/_/mysql?tabtags 。 可以通过 Sort b…

写点东西《什么是网络抓取?》

写点东西《什么是网络抓取&#xff1f;》 什么是网络抓取&#xff1f; 网络抓取合法吗&#xff1f; 什么是网络爬虫&#xff0c;它是如何工作的&#xff1f; 网络爬虫示例 网络抓取工具 结论 您是否曾经想同时比较多个网站上同一件商品的价格&#xff1f;或者自动提取您最喜欢的…

生成式对抗网络GAN

Generative Adversarial Nets由伊恩古德费洛&#xff08;Ian J.Goodfellow&#xff09;等人于2014年发表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是机器学习和计算神经科学领域的顶级国际学术会议之一。 1. GAN在哪些领域大放异彩 图像生…

Rust之旅 - Rust概念、Windows安装、环境配置

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

手动添加测试用例配置输入参数和期望值

1.选中函数&#xff0c;点击右键选择插入测试用例。这里所选择的插入测试用例区别于之前的测试用例的地方在于&#xff0c;这里插入测试用例是手动配置的&#xff0c;之前的是自动生成的。手动配置可以自定义选择输入参数和期望值。 2.添加测试用例后&#xff0c;点击测试用例&…

克魔助手工具详解、数据包抓取分析、使用教程

目录 摘要 引言 克魔助手界面 克魔助手查看数据捕获列表 数据包解析窗口 数据包数据窗口 克魔助手过滤器表达式的规则 抓包过滤器实例 总结 参考资料 摘要 本文介绍了克魔助手工具的界面和功能&#xff0c;包括数据包的捕获和分析&#xff0c;以及抓包过滤器的使用方…

电梯节能落座-智慧停车场️,电梯不仅可载人也可以载汽车!

电梯不仅可载人也可以载汽车哦&#xff01; 在北京市丰台区&#xff0c;有这么一个智慧停车场&#x1f17f;️ &#xff0c;共298个停车位&#xff0c;全部智能一体化&#xff0c;简直是“豪华” “智能” 的象征。 523能源&#xff1a;小伍&#xff0c;你跑题了... 小伍&am…

MySQL核心SQL

一.结构化查询语言 SQL是结构化查询语言&#xff08;Structure Query Language&#xff09;&#xff0c;它是关系型数据库的通用语言。 SQL 主要可以划分为以下 3 个类别&#xff1a; DDL&#xff08;Data Definition Languages&#xff09;语句 数据定义语言&#xff0c;这…

Discuz论坛网站登录账号操作慢,必须强制刷新才会显示登录怎么办?

飞飞发现在登录服务器大本营账号时&#xff0c;输入账号密码登录后还是显示的登录框&#xff0c;强制刷新后才知道已经登录了&#xff0c;每次都要刷新才能正常显示&#xff0c;非常影响用户体验&#xff0c;于是在网上找了类似的问题故障解决方法&#xff0c;目前问题已经解决…

AWS边缘媒体安全交付方案

企业如何在AWS上的边缘站点&#xff0c;安全的将优质视频内容交付给用户&#xff0c;并且禁止哪些未经过授权的访问&#xff1f;九河云将基于AWS平台提供边缘媒体安全交付解决方案 解决方案详情 在通过 Amazon CloudFront 交付时&#xff0c;免受未经授权的访问。基于添加到交…

多标签节点分类

Multi-Label Node Classification on Graph-Structured Data,TMLR’23 Code 学习笔记 图结构数据的多标签分类 节点表示或嵌入方法 通常会生成查找表&#xff0c;以便将相似的节点嵌入的更近。学习到的表示用作各种下游预测模块的输入特征。 表现突出的方法是基于随机游走(ran…

docker部署项目,/var/lib/docker/overlay2目录满了如何清理?

docker部署项目&#xff0c;/var/lib/docker/overlay2目录满了如何清理&#xff1f; 一、问题二、解决1、查看 /var/lib/docker 目录&#xff08;1&#xff09;、containers 目录&#xff08;2&#xff09;、volumes 目录&#xff08;3&#xff09;、overlay2 目录 2、清理&…

台灯护眼有用吗?分享备考专用的护眼台灯

说到台灯相信大家都不陌生&#xff0c;如今基本是每个家庭都会备上一台。很多家长会买上一台给孩子学习使用&#xff0c;还有些学生党、办公族夜晚学习工作时也会用得上它。但普通的台灯会出现光照范围不够大、光线过度集中、光线均匀度不足、产生眩光等问题&#xff0c;可能会…

基于 IDEA 进行 Maven 依赖管理

一、依赖管理概念 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中&#xff0c;避免出现版本冲突和依赖缺失等…

Redis--Zset使用场景举例(滑动窗口实现限流)

文章目录 前言什么是滑动窗口zset实现滑动窗口小结附录 前言 在Redis–Zset的语法和使用场景举例&#xff08;朋友圈点赞&#xff0c;排行榜&#xff09;一文中&#xff0c;提及了redis数据结构zset的指令语法和一些使用场景&#xff0c;今天我们使用zset来实现滑动窗口限流&a…

IOS-高德地图SDK接入-Swift

申请key 这个要前往高德开发平台注册成为个人开发者然后在控制台创建一个应用&#xff1a; 高德开发平台 注册步骤就不写了&#xff0c;写一下创建应用的步骤&#xff1a; 1、点击应用管理——>我的应用 2、点击右上角的创建新应用 3、输入内容&#xff1a; 4、点击添加ke…

【设计模式之美】重构(三)之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?

文章目录 一. “解耦”概述二. 如何给代码“解耦”&#xff1f;1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用&#xff0c;能够让开发和重构同步进行&#xff0c;不互相干扰。 3. 模块化4. 其他设计思想和原则4.…

【STM32】| 02——常用外设 | I2C

系列文章目录 【STM32】| 01——常用外设 | USART 【STM32】| 02——常用外设 | I2C 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. 简介2. I2C协议2.1 I2C物理连接2.2 I2C通信协议2.2.1 起始和停止信号2.2.2 数据有效性2.2.3 数据传输格式2.2.4 从机地址/数据方…

QT中操作word文档

QT中操作word文档&#xff1a; 参考如下内容&#xff1a; C(Qt) 和 Word、Excel、PDF 交互总结 Qt对word文档操作总结 QT中操作word文档 Qt/Windows桌面版提供了ActiveQt框架&#xff0c;用以为Qt和ActiveX提供完美结合。ActiveQt由两个模块组成&#xff1a; QAxContainer模…