本文是江协科技up的课堂笔记!大家可以去bilibili配合这位up的51单片机入门教程食用,效果更佳~

我这里进行详细介绍,希望你忘记数码管的时候来这里看看!(你猜我为什么写这个TAT)

一.基本介绍

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件

下面介绍引脚连接和段的概念

单个数码管

这个图显示的是数码管从A-DP这八个段,对应一个字节的八个比特位

这是引脚定义,类似单片机,一号引脚也是在左下角,呈逆时针排列

这个叫做共阴极连接,右边的叫做共阳极连接,我们观察引脚分布和各个段的引脚链接,我们发现在电路上是就近原则的

3.8引脚是公共的阴极

二.显示一个数字

比如说我们要显示数字六:ACDEFG点亮,其他熄灭就可以(以共阴极为例!!!)

步骤:

1.公共端接地(位选端选中)——决定哪个数字“8”亮起

2.把下面棕色的数字输入进去(段码)——决定哪根LED亮起

接下来看看更复杂的四位一体数码管!

上图是共阴极,下图是共阳极

相信聪明的你发现规律了:单个数码管是八个段引脚加上两个阴极的引脚,而四位一体就是把相同的引脚连在一起控制,然后再支出另外四个引脚作为每个数码管的阴极(还是以共阴极为例)

自然想到通过控制阴极端口的电平高低来控制哪一个数码管亮啦(负极接正极,那他就必然不会亮啊),然后控制其余引脚来控制他亮起来的数字是几

但是就出现了一个问题,我的数码管无论同时亮起几个都只能显示一个数字(比如我让第一个和第三个亮起,但是如果让1号亮起数字‘6’,第3号也只能亮起6)毕竟段的选择是公用的引脚

公用引脚可以减少io口的使用,但是如何让多位数字同时显示呢?

U4的用途是双向数据缓冲器,最下面的四个东西:

VCC:正极,GND:负极;OE:把它理解为下面的那个使能端得了,低电平有效,不用管;

DIR:方向选择,看是把左边的数据缓冲到右边还是把右边的数据输送到左边

(其实是接高电平就把数据输送到右边,这个是我买的电路,他是没有跳线改变输送方向的,直接连接正极,有些带有跳线的是可以改变它的方向的)

不用这个芯片的话,左侧的信号就是驱动,加入芯片他就是信号源;只需要低强度信号,让芯片接受,再加上芯片有自己的电源,就可以加强信号啦

那些电阻是排阻,四位一体的电阻元件

原理已知,首先我要在LED1-8这些个引脚里来进行位选,如何进行?

138译码器解决这个问题,它使用三个端口就可以解决问题

具体怎么做?

ABC表示输入端,右侧就是输出端,左下角就是使能端(其实不用管,知道这么接他就会工作就行)CBA是一次高位到低位

因为2^3=8,所以在abc处用二进制表示后,转换到0-7这八个数,分别对应LED1-8(这里有个很无语的错位哈。)

下图标的Y0一杠的横线表示0有效,就是说比如CBA顺序是000,就是Y0有效,即Y0是0,其他都是1

(问题又来了,这样搞得话,不就只有一个数码管可以亮了吗)

代码实现:

#include <REGX52.H>unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void Nixie(unsigned char Location,Number)
{switch(Location){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=NixieTable[Number];
}void main()
{
//	//CBA的顺序读
//	//6号led对应的是Y5
//	P2_4=1;
//	P2_3=0;
//	P2_2=1;
//	//数据的高位对应端口的高位
//	P0=0x7D;Nixie(1,10);while(1){;}
}

各位要注意,数字是从下往上读的!!!高位对高位

三.动态数码管显示

多个位显示不同的数字,如何做到

原理就是让数码管不断循环,这一个是1,下一个是2,在下一个是3,这样的话借着快速移动的数字加上他熄灭的时间以及人眼的视觉暂留就可以达到效果

初次尝试:

#include <REGX52.H>
#include <intrins.h>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void Delay(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);}
}void Nixie(unsigned char Location,Number)
{switch(Location){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=NixieTable[Number];}void main()
{Nixie(1,10);while(1){Nixie(1,1);
//		Delay(20);Nixie(2,2);
//		Delay(20);Nixie(3,3);
//		Delay(20);}
}

这个会出现数字串位的情况,因为数码管的消影过程中
//位选 段选 位选 段选
 //在这个过程中,位变了,但是还没来得及变化段,所以上一个数字会串到下一位
//所以我们可以对段选清零

从而我们对函数进行了优化

#include <REGX52.H>
#include <intrins.h>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void Delay(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);}
}void Nixie(unsigned char Location,Number)
{switch(Location){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=NixieTable[Number];Delay(1);//先让他稳定的亮一会,否则就会亮度过低P0=0x00;//让他熄灭
}void main()
{Nixie(1,10);while(1){Nixie(1,1);
//		Delay(20);Nixie(2,2);
//		Delay(20);Nixie(3,3);
//		Delay(20);//数码管的消影//位选 段选 位选 段选//     【       】//在这个过程中,位变了,但是还没来得及变化段,所以上一个数字会串到下一位//所以我们可以对段选清零}
}

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

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

相关文章

Apache Camel 简介

相关文档地址 https://camel.apache.org/components/next/index.htmlhttps://camel.apache.org/components/4.10.x/languages/simple-language.htmlhttps://camel.apache.org/manual/exception-clause.htmlhttps://camel.apache.org/manual/index.htmlhttps://camel.apache.org…

IP离线库 输入IP地址立即返回IP所在地址信息(支持Java、Python)

描述 本文实现&#xff1a; 1、离线查询IP地址 2、IP地址精确到区域 3、IP地址支持国外IP 此时需要一个创建&#xff0c;比如我输入一个8.8.8.8的IP立马就需要返回给我一个中文地址信息&#xff0c; 类似于百度的IP搜索&#xff1a; 113.111.186.123如果现在离线环境或者在…

解决MySQL删除/var/lib/mysql下的所有文件后无法启动的问题

删除 MySQL 数据目录 /var/lib/mysql 下的所有文件后&#xff0c;MySQL 将无法启动&#xff0c;因为该目录包含了数据库的所有数据文件、配置文件和系统表。当这些文件被删除时&#xff0c;MySQL 无法找到必要的数据和配置&#xff0c;从而无法正常启动。本文将详细介绍解决这个…

苍穹外卖项目学习——day1(项目概述、环境搭建)

文章目录一、软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境分类二、苍穹外卖项目介绍2.1 定位2.2 功能架构2.3 技术选型三、开发环境搭建3.1 前端环境3.2 后端环境3.3 前后端联调3.4 登录功能优化四、接口文档管理4.1 YApi4.2 Swagger (Knife4j)一、软件开发整体介…

【QT】Qt信号与槽机制详解信号和槽的本质自定义信号和槽带参数的信号和槽

文章目录前言一、信号的本质二、槽的本质三、 信号和槽的使⽤3.1 连接信号和槽四、使用步骤4.1 通过QtCreator⽣成信号槽代码五、 ⾃定义信号和槽5.1 ⽰例1&#xff1a;信号和槽函数初步使用5.2 ⽰例2 两个类使用5.3 示例3 按钮使用触发信号六、 带参数的信号和槽6.1 ⽰例1&…

【OD机试题解法笔记】文件缓存系统

题目描述 请设计一个文件缓存系统&#xff0c;该文件缓存系统可以指定缓存的最大值&#xff08;单位为字节&#xff09;。 文件缓存系统有两种操作&#xff1a; 存储文件&#xff08;put&#xff09;读取文件&#xff08;get&#xff09; 操作命令为&#xff1a; put fileName …

Python中的sys.path与PYTHONPATH全解析:模块导入路径的底层机制与最佳实践

在Python项目开发中&#xff0c;很多人遇到过类似“模块导入失败”、“路径找不到”、“相对导入与绝对导入混乱”等问题。而这些问题的根源&#xff0c;几乎都绕不开一个核心概念——Python模块搜索路径。 今天&#xff0c;我们围绕sys.path 和 PYTHONPATH环境变量&#xff0…

python:如何调节机器学习算法的鲁棒性,以支持向量机SVM为例,让伙伴们看的更明白

鲁棒性&#xff08;Robustness&#xff09;指模型在噪声数据或异常值干扰下保持性能稳定的能力。想详细了解的可参考本人之前的博文 python机器学习&#xff1a;评价智能学习算法性能与效果的常见术语&#xff1a;不收敛、过拟合、欠拟合、泛化能力、鲁棒性一句话、一张图给您…

号源加锁升级思路(解决高并发问题)

原先逻辑链接&#xff1a;号源预约加锁思路_java 预约 接口加锁-CSDN博客 一、进行治疗项目和号源数据缓存 1.新建一个定时任务&#xff0c;主要在凌晨时缓存治疗项目和号源数据 1.1.类中使用redission获取锁&#xff08;用于分布式系统获取数据&#xff0c;保证原子性&…

MCP革命:AI世界的“USB-C”接口如何重塑智能体与外部工具的连接

> 一条标准化的数据通道,让AI从“对话专家”蜕变为“行动专家”,背后是一场由协议驱动的工具连接革命。 2024年11月,Anthropic公司开源了**Model Context Protocol(MCP)**。在短短9个月内,这项技术彻底改变了AI与外部世界的交互方式。截至2025年8月,MCP服务数量**从…

启用“安全登录”组合键(Ctrl+Alt+Delete)解锁

文章目录背景目标功能操作步骤效果背景 在日常工作中&#xff0c;我们有时需要让电脑长期开机运行&#xff08;如处理长任务、作为服务器等&#xff09;。然而&#xff0c;这其中存在一个潜在风险&#xff1a;当电脑处于锁屏或登录界面时&#xff0c;如果有人无意中触碰键盘比…

【08】C++实战篇——C++ 生成动态库.dll 及 C++调用DLL,及实际项目中的使用技巧

文章目录一、创建动态库dll (方法一)1 生成C 动态库dll1.1 创建项目MyDLL1.2 编写.h 和 .cpp文件1.3 设置 及 生成 DLL2 调用 C 动态库dll2.1 创建C 空项目DLLtest2.2 动态库配置 及代码调用测试3 实际项目中的使用技巧3.1 设置dll输出路径3.2 设置头文件引入路径3.3 改进后 测…

kettle插件-kettle http client plus插件,轻松解决https接口无法调用文件流下载问题

场景&#xff1a;小伙伴在使用kettle调用https接口过程中无法正常调用&#xff0c;程序出错问题&#xff0c;今天演示下用自研插件轻松解决这个问题。1、使用openssl 生成自签名证书openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3652、使用…

C#中的除法

在C#中&#xff0c;除法操作可以通过使用 / 运算符执行。这个运算符可以进行整数除法或浮点除法&#xff0c;这取决于操作数的类型。整数除法当两个整数相除时&#xff0c;结果将自动向下取整到最接近的整数。这意味着结果是一个整数&#xff0c;而不是小数。int a 10; int b …

PPT文件密码解密工具推荐:Tenorshare PassFab for PPT绿色免安装一键解除密码限制,附详细教程和下载地址

前段时间&#xff0c;我帮朋友做一个商业演示的 PPT&#xff0c;为了防止文件被误操作或者内容泄露&#xff0c;我给 PPT 设置了密码。结果等朋友来拿文件的时候&#xff0c;我居然把密码忘得干干净净&#xff0c;这下可把我俩都急坏了。朋友那边马上就要用这个 PPT 去参加重要…

【数据结构】二叉树接口实现指南:递归方法的高效运用 (附经典算法OJ)

文章目录 1、前置说明 1、定义二叉树结点结构 2、创建新节点 3、手动创建二叉树 2、二叉树的遍历 1、前序&#xff0c;中序和后序遍历 1.1、二叉树前序遍历 1.2、二叉树中序遍历 1.3、二叉树后序遍历 2、二叉树层序遍历 3、二叉树的基础操作 1、二叉树节点总数 2、…

自动驾驶控制算法——LQR控制算法

自动驾驶控制算法——LQR控制算法 文章目录自动驾驶控制算法——LQR控制算法**一、LQR 是什么&#xff1f;**二、LQR 原理2.1 线性状态空间模型 (State–Space Model)2.2 二次型性能指标 JJJ2.3 代数黎卡提方程 (ARE)2.4 特点总结2.5 一句话总结 LQR 原理&#xff1a;2.5.1 场景…

Jotai:React轻量级原子化状态管理,告别重渲染困扰

简介 Jotai 是一个为 React 提供的原子化状态管理库&#xff0c;采用自下而上的方法来进行状态管理。Jotai 受 Recoil 启发&#xff0c;通过组合原子来构建状态&#xff0c;并且渲染基于原子依赖性进行优化。这解决了 React 上下文的额外重新渲染问题&#xff0c;并消除了对 m…

C语言数据结构(7)贪吃蛇项目2.贪吃蛇项目实现

8. 核心逻辑实现分析 8.1 游戏主逻辑 程序开始就设置程序支持本地模式&#xff0c;然后进入程序的主逻辑。 主逻辑分为3个过程&#xff1a; • 游戏开始&#xff08;GameStart&#xff09;完成游戏的初始化。 • 游戏运行&#xff08;GameRun&#xff09;完成游戏运行逻辑的…

知识蒸馏 - 最小化KL散度与最小化交叉熵是完全等价的

知识蒸馏 - 最小化KL散度与最小化交叉熵是完全等价的 flyfish KL散度与交叉熵的数学关系 对于两个概率分布 PPP&#xff08;真实分布&#xff09;和 QQQ&#xff08;模型预测分布&#xff09;&#xff0c;KL散度的定义是&#xff1a; DKL(P∥Q)∑xP(x)log⁡(P(x)Q(x)) D_{KL}(P…