【MCS-51】外接数码管

news2024/11/25 15:44:18

   单片机可以连的显示外设有很多种,我们常用到的就是连接LED显示,但是除了LED以外,我们还有很多外部的显示元件,包括数码管、点阵屏等由圆管或者方管LED组成的显示屏,接下来我们着重来看如何使用51单片机外接数码管进行显示。

目录

🐱数码管物理结构

🐱编程点亮数码管

🐱数码管静态 / 动态显示


🐱数码管物理结构

数码管我们以单联的和双联的为例子,而其它的数码管都是由双联相同原理扩展即可。

首先来看单联,一个数码管由8个LED组成,它们包括组成一个“8”字型的7个LED和1个位于右下角的“ . ”点号LED,所以一共有8给LED。其中前面7个分为序号a~g,点为dp,控制这8个口会伸出8个引脚,但是注意到下图的话我们会发现其实还会多出两个引脚com。而对于单联LED数码管这两个引脚在内部会汇总到一起形成一条线上,这两个COM引脚统一接一种电位,作为公共端,然后再根据各伸出去的引脚a~g和dp来输入不同的电位以实现对数码管的控制。一般来说根据公共端接的是二极管的阳极还是阴极我们就可以判断该数码管是共阳极还是共阴极型数码管

而对于双联LED的数码管就不同了,它的结构如下图所示。可以看到,它的LED有两个公共的COM端,而它各个数码管的a~g和dp引脚都是连到一个数码管上面。其实更多的多联LED数码管的连接方式也是类似:几个LED数码管就有几个公共COM端,而它们的单独引脚a~g和dp引脚都是统一连到一个数码管上。

看到这就很容易有疑问了,既然每一个数码管的a~g和dp引脚都连到一个数码管上面,那么我们平时使用到的假如四联LED数码管是怎么同时显示不同的四个数字的呢?其实这里用到了视觉残留的原理,其实我们每一次都是在动态点亮一个数码管!假如我们想要让四联LED数码管显示数字1234,那么在时刻1我会让第一个数码管的COM引脚导通,其它的数码管COM引脚接反电位,然后通过a~g和dp引脚输入数字1的显示信号让数码管显示数字1;再下一时刻2我会让第二个数码管的COM引脚导通,其它数码管的COM引脚接反电位,然后再向a~g和dp引脚输入数字2的显示信号让数码管显示数字2,以此类推...让四个LED数码管都快速显示一遍,而由于四个LED数码管显示的速度太快了,所以我们人眼是分辨不出在一个短暂的瞬间哪个数码管在亮,在我们看来是他们四个同时在亮!

⭐数码管内部的LED要接限流保护电阻吗?

因为数码管内部还是由LED组成,所以限流电阻是不可或缺的!外接5V电压时一般选择的限流电阻是在150Ω-700Ω左右。

接下来我们来细看一下数码管的共阴极和共阳极的意义。数码管的共阴极和共阳极是由COM公共接口接的是数码管内部LED的阳极还是阴极决定,如果COM接的是内部LED的阳极,那么该数码管就被称为共阳极数码管,而如果COM接的是内部LED的阴极,那么该数码管就被称为是共阴极数码管。共阳极数码管的COM端接的是高电平,它的a~g和dp引脚接的是低电平会点亮;而共阴极数码管的COM端接的是低电平,当它的a~g和dp引脚接的是高电平时会点亮。

🐱编程点亮数码管

 我们先来看如何使用软件编程点亮一个数码管,下面是一个简单的代码:

	ORG 00H
	AJMP MAIN
	ORG 30H
MAIN:
	MOV P0, #92H
	AJMP MAIN
	END

其对应的测试结果:

其实对于我们使用编程方式来点亮数码管来说,如果数码管的位a~g对应单片机输出引脚px1~px7,那么我们会有一个单片机并口16进制状态对应的数码管显示的编码表:

数码管显示字符共阴极引脚输出共阳极引脚输出
03FHC0H
106HF9H
25BHA4H
34FHB0H
466H99H
56DH92H
67DH82H
707HF8H
87FH80H
96FH90H

但是我们点亮数码管往往采用的不是这种方式,我们一般会在单片机里面找个位置制作一个表,这个表就存储着不同的数字显示信息。例如下面的例子是让数码管显示从0-9循环显示的代码(老师课件上的例子):

	ORG 0000H
	LJMP START
	ORG 0030H
START:	MOV DPTR, #TABLE
FUNC1:	MOV A, #00H
	MOVC A, @A+DPTR
	CJNE A, #01H, FUNC2
	SJMP START
FUNC2:	MOV P0, A
	LCALL DELAY
	INC DPTR
	SJMP FUNC1
DELAY:	MOV R5, #20
D2:	MOV R6, #20
D1: MOV R7, #248
	DJNZ R7, $
	DJNZ R6, D1
	DJNZ R5, D2
	RET
TABLE:	DB	0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H
	    DB 01H
	   END

分析代码可以看出代码大概的思路,我们从下面看起,首先是下面的一个表,这个表中放的是让共阳极数码管显示从0-9的对应输出引脚的16进制状态码,它还有一个表尾值是01H,用来判断是否已经到达表尾。这个表可以方便我们找出数码管要显示的数值对应的段码,直接地址定位。

TABLE:	DB	0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H
	    DB 01H
	   END

然后就是一个普通的延迟函数:

DELAY:	MOV R5, #20
D2:	MOV R6, #20
D1: MOV R7, #248
	DJNZ R7, $
	DJNZ R6, D1
	DJNZ R5, D2
	RET

接下来我们从头看起:前面程序定位置和跳转就不看了,从START开始看起。START函数一进来我们就将表的地址赋给DPTR,也就是说DPTR此时指向表头。然后进入FUNC1,把A+DPTR的值赋给累加器A,实际上就是DPTR的值(因为A是00H),因为CJNE比较的操作数是累加器A所以我们采用A来代替DPTR。然后判断A是否到达表尾01H,如果没有到达则跳转到FUNC2里面将此时DPTR(A)指向的表里的数据输出到数码管中显示,显示完后让DPTR自增指向表中的下一个数据,以此实现对表中每一个数据的遍历。当DPTR指向表尾01H时,程序不会从FUNC1进入FUNC2,而回从来一遍,即重新实现一次0-9的过程。

	ORG 0000H
	LJMP START
	ORG 0030H
START:	MOV DPTR, #TABLE
FUNC1:	MOV A, #00H
	MOVC A, @A+DPTR
	CJNE A, #01H, FUNC2
	SJMP START
FUNC2:	MOV P0, A
	LCALL DELAY
	INC DPTR
	SJMP FUNC1

输出结果: 

🐱数码管静态 / 动态显示

数码管静态显示就是将数码管要显示的数值提早确定,然后单片机通过IO口将显示信息输出给数码管,然后利用锁存器(CD4511)与输出相连实现将显示字符锁存起来。这种方式只适用于少量数码管的不变化显示,其具有对IO口资源要求大、显示数值无法变化等缺点。

而我们平时常用到的是动态显示:该显示方式就是我们一开始提到的以人眼残留效应为原理的显示方式(但是下面的例子当时的参数设置不好,导致闪的很慢,看起来就是一个个闪的,应该将延迟函数的参数设置得小一点!)。这种显示方式中无论有多少个数码管都只需要8个IO口进行输出,因为它们公用a~g和dp引脚,变化的是COM引脚的状态。我们通过改变这8给引脚的状态输出不同的数值信息,然后通过改变不同的数码管的COM引脚状态来决定哪个数码管接收该信息。

下面我们来编程实现一下动态显示,不难看出,动态显示和前面循环点亮的区别就是动态显示是数据在多个数码管之间选择,而我们之前是只用一个数码管输出。

	ORG 0000H
	LJMP START
	ORG 0030H
START:	MOV DPTR, #TABLE
		MOV R1, #7FH
FUNC1:	MOV A, #00H
	MOVC A, @A+DPTR
	CJNE A, #01H, FUNC2
	SJMP START
FUNC2:	MOV B, A
	MOV A, R1
	RL A
	MOV P2, A
	MOV R1, A	
	MOV P0, B
	LCALL DELAY
	INC DPTR
	SJMP FUNC1
DELAY:	MOV R5, #20
D2:	MOV R6, #20
D1: MOV R7, #248
	DJNZ R7, $
	DJNZ R6, D1
	DJNZ R5, D2
	RET
TABLE:	DB	3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
	    DB 01H
	   END

输出结果:


图片来源及参考资料:

老师上课的课件

科普:LED数码管的驱动原理介绍 (360doc.com)

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

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

相关文章

chatgpt赋能python:Python如何打开Word文档?

Python 如何打开 Word 文档? Python 是一种强大的编程语言,可以帮助我们完成各种重复性工作,其中包括自动化文件的处理。在这篇文章中,我们将学习如何使用 Python 打开 Word 文档。本文将介绍三种不同的方式:使用 Pyt…

05-修建数据殿堂:Golang struct的艺术架构

📃个人主页:个人主页 🔥系列专栏:Golang基础 💬Go(又称Golang)是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性,拥有高效的并发编程能力和简洁的语法。G…

【送书福利-第十一期】清华社 IT BOOK 图书活动:前端、后端、C++、Python、人工智能 ~(共送5本)!

大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我! 本文目录 一、前言二、内容介绍1、《C高性…

chatgpt赋能python:Python怎么批量加注释

Python怎么批量加注释 作为一名有10年python编程经验的工程师,我觉得注释是程序开发过程中最为重要的一部分。注释能够提高代码的可读性,让其他开发者更容易理解和阅读代码,并且也方便后续维护和修改。但很多时候,我们可能需要在…

“怎样提高学习效率——介绍一款适合大学生的多功能平台【WRITE-BUG数字空间】“

作为一名大学生,我深刻体会到在学习和写作过程中所面临的诸多挑战和困难。在这个过程中,我发现了一个非常好用和实用的平台——【WRITE-BUG数字空间】。在我的使用经历中,Writebug帮助我一站式地管理和创作一些内容,包括学习作业、…

详解c++---set的介绍

目录标题 set容器的介绍set的构造函数insert函数的介绍find函数erase函数count函数lower_boundupper_boundmultiset set容器的介绍 set容器可以看成我们上一篇文章学习的K结构的搜索二叉树,所以set容器不仅可以存储数据,还可以对数据进行排序和去重&…

DAY22:二叉树(十二)二叉搜索树最小绝对差+二叉搜索树中的众数

文章目录 530.二叉搜索树的最小绝对差思路完整版双指针优化写法:不用创建数组遍历pre root为什么是指向当前遍历的前一个节点 501.二叉搜索树中的众数(这道题要知道普通二叉树怎么写)思路完整版普通二叉树的写法sort自定义比较函数cmp的情况…

[论文阅读笔记77]LoRA:Low-Rank Adaptation of Large Language Models

1. 基本信息 题目论文作者与单位来源年份LoRA: Low-Rank Adaptation of Large Language ModelsmicrosoftInternational Conference on Learning Representations2021 524 Citations 论文链接:https://arxiv.org/pdf/2106.09685.pdf 论文代码:https://…

IMX6ULL裸机篇之SPI实验

一. SPI 实验 SPI实验:学习如何使用 I.MX6U 的 SPI 接口来驱动 ICM-20608,读取 ICM-20608 的六轴数据。 本文学习 SPI主控芯片的代码编写。其中,包括SPI工作模式设置,主从模式设置,时钟配置等实现。 二. SPI 主控芯…

EBU5476 Microprocessor System Design 知识点总结_2 Arm architecture

ARM架构 ARM是一个指令集,前面讲的几个汇编指令这些都算做指令。 ARM公司有意思的地方是,他们不做ARM设备,他们只设计指令集架构,然后授权(知识产权核,IP核)给其他半导体厂商做。 A&#xff…

大数据分析与机器学习:技术深度与实例解析【上进小菜猪大数据系列】

上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货。 大数据分析与机器学习已成为当今商业决策和科学研究中的关键组成部分。本文将深入探讨大数据技术的背景和原则,并结合实例介绍一些常见的大数据分析和机器学习技术。 …

chatgpt赋能python:Python如何拟合直线:使用最小二乘法

Python如何拟合直线:使用最小二乘法 在数据分析和机器学习领域,拟合一个最佳的直线是很常见和有用的。Python中有很多库可以拟合直线,但最小二乘法是其中最常用的一种方法。在本文中,我们将介绍最小二乘法的原理和如何在Python中…

【Goalng 开源项目】还在手写重复的 CRUD 吗?这个开源项目帮你解放双手

gormpher Gormpher 介绍快速开始WebObject 接口约定查询单条数据删除单条数据创建单条数据编辑单条数据条件查询多条数据 进阶WebObject 配置项动态接口函数Gorm 泛型函数Admin 源码handleEditObjecthandleQueryObject Gormpher 介绍 gormpher 是一个轻量级的 Golang 库 基于…

编译原理及应用期末复习

杂 3型文法 右线性文法 短语、直接短语、句柄 、判断是否是二义性文法 1、证明是二义性文法:证明存在一个句子有两颗不同的语法树 ① 画语法分析树 ② 、NFA、DFA K:所有状态,包含初始状态 Σ:终结字符集 M:状…

chatgpt赋能python:Python中替换字符串成int类型的方法

Python中替换字符串成int类型的方法 简介 在Python编程过程中,经常需要对字符串进行处理。有时候我们需要将字符串中的某些字符替换成int型数据,以便于进行一定的数值计算或其他操作。本文将介绍如何在Python中找出需要替换的字符,并将其转…

Python实现将txt文件转换成对应的excel或csv文件

前言 本文是该专栏的第29篇,后面会持续分享python的各种干货知识,值得关注。 工作上可能会遇到这样的情况,使用python将某个txt文本,按照行索引和列索引转换成对应的excel文件或者是csv文件。 那对于这样的需求,用python如何实现呢?跟着笔者直接往下看解决方法。(附完…

UART协议总结

UART( Universal Asynchronous Receiver-Transmitter,通用异步收发器),是异步串行通信协议,用来传输串行数据。 1、UART原理说明 UART是全双工工作模式,其数据传输方法如下: 发送数据时&…

Hive 和 Oracle 中 Decode 函数的用法差异

前言 在数仓构建过程中,需要从业务那边进行数据的迁移!数仓大多数公司都是使用Hive,而业务那边使用的是Oracle数据库居多。最近就有个小伙伴在迁移的时候碰到了问题: 从报错来看,在使用 Decode() 函数的时候,传参有问题! 既然问题来了,我们就来解决一下呗,只有不断地…

基础知识学习---牛客网C++面试宝典(五)操作系统--第一节

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应…

LeetCode_Day6 | 四数相加||、赎金信、三数之和、四数之和!

LeetCode_哈希表 454.四数相加1.题目描述2.思路3.代码实现 383.赎金信1.题目描述2.暴力法3.哈希法思路代码实现 15.三数之和1.题目描述 454.四数相加 1.题目描述 详情leetcode链接 2.思路 解题步骤: 首先定义 map,key放a和b两数之和,valu…