51 单片机[4]:数码管显示

目标:

  1. 一次显示一个数字:在数码管第三位显示6.
  2. 同时显示多个不同数字:在数码管前三位分别显示1, 2, 3.

一、认识数码管

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

1. 原理图

开发板原理图中的数码管和74HC138译码器

img

img

它们都是用来控制数码管显示的。

2. 引脚定义

img

由数码管的引脚定义可知,89C52开发板上的数码管是4位一体的,4个数码管共阴极,通过位选确定哪个位显示数字,通过段选确定显示什么数字。P07是高位,P00是低位。

这种做法节约了I/O口,但是限制了数码管的显示,因为在4个数码管中,无论几位显示,都会显示相同的数字。

事实真是这样吗?

事实上,我们可以利用数码管的余辉和人眼的视觉暂留来同时显示不同的数字。

3. 74HC138译码器:位选,3线减为8线

在数码管模块中,可以看到LED1~LED8是提供位选的

img

LED1~LED8由谁控制呢?

可以看到,在74HC138译码器的输出端接了LED1~LED8。这8个输出由P22, P23, P24三个I/O口控制。

img

A, B, C为输入端,G1, G2 ‾ A \overline{\text{G2}}\text{A} G2A, G2 ‾ B \overline{\text{G2}}\text{B} G2B 为使能端, Y0 ‾ \overline{\text{Y0}} Y0~ Y7 ‾ \overline{\text{Y7}} Y7为输出端。

G1接1、G2接0,它才可以工作。

输入端由低位到高位的顺序为C B A,CBA组成2进制数,这个2进制数转换成的10进制数决定哪个端口有效。如,组成000时,Y0有效,此时输出端为0111 1111;组成101时,Y5有效,此时输出端为1111 0111。

4. 74HC245双向数据缓冲器

img

OE ‾ \overline{\text{OE}} OE是使能端,接地工作,接高电平不工作。
DIR选择方向,接高电平时,把数据从左往右缓冲过来,接低电平时,把数据从右往左读取过来。

简单来说,就是给P0送什么数据,它都会原封不动地在B0~B7输出。

二、静态数码管显示

打开Keil5,新建工程,添加main.c,插入头文件,编写主函数。

1. 普通方法

我们要想让第三位显示数字,就要让LED6=0。那么就要让74HC138译码器的 Y5 ‾ \overline{\text{Y5}} Y5=0,那就要让CBA=101,即P2_4=1, P2_3=0, P2_2=1.

要想显示数字6,就要让a, c, d, e, f, g为1,b和dp为0,即B0~B7=1011 1110。要想让B0~B7=1011 1110,就得让A7~A0=0111 1101,此时P0=0x7D。

img

代码如下:

#include <REGX52.H>

void main()
{
	P2_4 = 1;
	P2_3 = 0;
	P2_2 = 1;
	P0 = 0X7D;
    while(1)
    {

    }
}

此时,由于引脚冲突,D3和D4也会亮,不用管。

2. 高级方法

通过定义和调用子函数实现数码管显示数字。

使用switch(){…case:…;break;}进行位选,使用数组进行段选。

代码如下:

#include <REGX52.H>

unsigned char NumTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void digital(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 = NumTable[number];
}

void main()
{
	digital(7, 2);
	while(1)
	{
		
	}
}

可以看到第七个数码管显示2.
img

三、动态数码管显示

要同时显示多个不同数字,就要让数码管不断扫描,所以数码管的位选和段选应该移入while(1)循环中。

void main()
{
	while(1)
	{
		digital(1, 1);
		digital(2, 2);
		digital(3, 3);
	}
}

此时1, 2, 3的位置有些错乱:

img

所以还要添加一个延时函数:

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

在主函数中调用延时函数。当延时200毫秒时,可以看到1, 2, 3交替闪烁。

void main()
{
	while(1)
	{
		digital(1, 1);
		Delay(200);
		digital(2, 2);
		Delay(200);
		digital(3, 3);
		Delay(200);
	}
}

延时改为20毫秒后,1, 2, 3闪得更快了。
延时改为2毫秒后,肉眼已经看不出1, 2, 3在闪了。

加入延时函数这种操作叫“消影”。单片机动态显示数字时,工作状态是:位选、段选、位选、段选、位选、段选。单片机的工作频率很快,在本次段选结束,下次位选开始时,数字会窜到下一位,因为下次的段选还没开始。

常见的消影方法是在每次段选之后"清零"。加入延时函数,延时1毫秒,并给段选赋值0x00.

完整代码如下:

#include <REGX52.H>

unsigned char NumTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void digital(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 = NumTable[number];
	Delay(1);
	P0 = 0x00;
}

void main()
{
	while(1)
	{
		digital(1, 1);
//		Delay(2);
		digital(2, 2);
//		Delay(2);
		digital(3, 3);
//		Delay(2);
	}
}

四、数码管驱动方式

单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间。本文中的数码管显示方式就是单片机直接扫描。

专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零拷贝(Zero-Copy)

1.背景 现在有这样一个场景&#xff0c;我们需要在本地选择一个文件后&#xff0c;然后上传到网络上。 我们再看看文件的内容数据的具体搬运过程&#xff1a; 你会发现&#xff0c;在整个文件搬运的过程中&#xff0c;发生了多次的数据拷贝和上下文转换。 4次数据拷贝&#…

amis 联动效果触发的几种方式

联动效果实现主要俩种方式: 1.表达式实现联动,基于组件内或数据链的变量变化的联动 比如&#xff1a; "source": "/amis/api/mock2/options/level2?name${name} " (必须是这种字符串拼接形式,在data数据映射中表达式不会触发联动) 所有初始化接口链…

【Linux】中的常见的重要指令(中)

目录 一、man指令 二、cp指令 三、cat指令 四、mv指令 五、more指令 六、less指令 七、head指令 八、tail指令 一、man指令 Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是 man 语法: m…

【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理&#xff0c;以及遇到的困难和总结 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 什么是搜索引…

基于SpringBoot+Vue的人事管理系统

引言 目前,人事管理的系统大都是CS架构的大型系统,很少有面向机关,事业单位内部的基于BS架构的微型人事系统,因此.开发一个基于BS架构的人事信息管理系统是非常必要的.但是基于BS架构的人事系统对于安全是一个大的考验点.在人事信息系统中,功能需简单清晰,可操作性强,其次安全…

站在ESG“20+”新起点上,看中国ESG先锋探索力量

全链减碳、建设绿色工厂、打造零碳产品、守护生物多样性、向受灾群众捐助……不知你是否察觉&#xff0c;自“双碳”目标提出以来&#xff0c;一股“可持续发展热潮”正覆盖各行各业&#xff0c;并且渗透到我们衣食住行的方方面面。在资本市场&#xff0c;ESG投资热潮更是席卷全…

外汇天眼:风险预警!以下平台监管牌照被撤销!

监管信息早知道&#xff01;外汇天眼将每周定期公布监管牌照状态发生变化的交易商&#xff0c;以供投资者参考&#xff0c;规避投资风险。如果平台天眼评分过高&#xff0c;建议投资者谨慎选择&#xff0c;因为在外汇天眼评分高不代表平台没问题&#xff01; 以下是监管牌照发生…

Leetcode | 5-21| 每日一题

2769. 找出最大的可达成数字 考点: 暴力 数学式子计算 思维 题解 通过式子推导: 第一想法是二分确定区间在区间内进行查找是否符合条件的, 本题最关键的便是 条件确定 , 第二种方法: 一般是通过数学公式推导的,这种题目我称为数学式编程题 代码 条件判断式 class Solution { …

ViT:1 从DETR说起

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提供了大模型领域最新技…

探索微软Edge开发者工具:优化前端开发的艺术与科学

探索微软Edge开发者工具&#xff1a;优化前端开发的艺术与科学 引言&#xff1a;Edge开发者工具概览一、基础操作&#xff1a;步入DevTools的大门1.1 启动与界面布局1.2 快速导航与定制 二、元素审查与样式调整2.1 精准元素选取2.2 实时CSS编辑2.3 自动完成与内联文档 三、Java…

Spring Web MVC(2)

响应 Http响应的结果可以是数据也可以是静态页面可以针对响应设置状态码 Header信息 返回静态页面注解RestController和Controller 我们创建一个前端页面 package com.example.demo.demos.web.controller;import org.springframework.web.bind.annotation.RequestMapping; i…

【C++】<图形库> 三人成棋(面向对象写法)

目录 一、游戏需求 二、程序架构 三、代码实现 四、实现效果 五、已知BUG 一、游戏需求 构建一个五子棋游戏&#xff0c;在自定义棋盘宽度和高度的基础上&#xff0c;实现三人对战功能&#xff0c;并且能判定谁输谁赢。 二、程序架构 (1) 对象分析&#xff1a; 【1】 需…

Kata Containers零基础学习从零到一

文章目录 docker和Kata Containers的区别Docker容器共享宿主机内核每个容器实例运行在轻量级虚拟机&#xff08;MicroVM&#xff09;总结 通俗例子Kata Containers架构实际Kata Containers架构图解容器技术栈总结 agent和shim家长&#xff08;shim进程&#xff09;的角色保姆&a…

【开源】多语言大型语言模型的革新:百亿参数模型超越千亿参数性能

大型人工智能模型&#xff0c;尤其是那些拥有千亿参数的模型&#xff0c;因其出色的商业应用表现而受到市场的青睐。但是&#xff0c;直接通过API使用这些模型可能会带来数据泄露的风险&#xff0c;尤其是当模型提供商如OpenAI等可能涉及数据隐私问题时。私有部署虽然是一个解决…

【CSP CCF记录】201909-1 小明种苹果

题目 过程 #include<bits/stdc.h> using namespace std; int N,M; long long tree[1010]; int main() {cin>>N>>M;long long result0,max0;//result剩余苹果&#xff0c;max最大疏果个数 int id0;//id最大疏果的果树编号 for(int i1;i<N;i){long long b0…

手把手一起学习Python NumPy

NumPy 是用于处理数组的 python 库&#xff0c;NumPy 中的数组对象称为 ndarray&#xff0c;它提供了许多支持函数&#xff0c;使得利用 ndarray 非常容易。Numpy官方网址 NumPy 安装 使用pip安装NumPy 模块&#xff1a; pip install numpyNumPy 入门 创建numpy数组&#x…

Qt 在windows下显示中文

Qt在windows平台上显示中文&#xff0c;简直是一门玄学&#xff0c;经过测试&#xff0c;有如下发现&#xff1a; 1&#xff0c; 环境&#xff1a;Qt 5.15.2 vs2019 64位 win11系统 默认用Qt 创建的文件使用utf-8编码格式&#xff0c;此环境下 中文没有问题 ui->textE…

当面试官问出“Unsafe”类时,我就知道这场面试废了,祖坟都能给你问出来!

一、写在开头 依稀记得多年以前的一场面试中&#xff0c;面试官从Java并发编程问到了锁&#xff0c;从锁问到了原子性&#xff0c;从原子性问到了Atomic类库&#xff08;对着JUC包进行了刨根问底&#xff09;&#xff0c;从Atomic问到了CAS算法&#xff0c;紧接着又有追问到了…

用本地大模型(llama3)进行数据分类标记|LLM 用例

001&#xff5c;背景 这是我最新发布的导航站点 https://aiwith.me 这个站点由于第一版数据来源于第三方&#xff0c;只有站点基础数据&#xff0c;没有对数据进行分类&#xff0c;最近站点上线了&#xff0c;主体框架都搭建完成了&#xff0c;这才有空去对数据做分类. 目前的…

USART串口通信(stm32)

一、串口通信 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 STM32F103C8T6 USART资源&#xff1a; USART1、 USART2、 USART3 自带波特率发生器&…