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

51单片机教程(九)- 数码管的动态显示

1、项目分析

  • 通过演示数码管动态显示的操作过程。

2、技术准备

1、 数码管动态显示

  • 4个1位数码管和单片机如何连接

    • a、静态显示的连接方式

      • 优点:不需要动态刷新;
      • 缺点:占用IO口线多。

    • b、动态显示的连接方式

      • 连接:所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效;
      • 缺点:需要动态刷新;
      • 优点:占用IO口线少。
        在这里插入图片描述

2、动态扫描的原理

  • 动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果(就像看的电影是有一帧一帧的画面显示的,当速度够快的时候看到它就是动态的,当显示数码管的速度够快的时候,也就可以看到它们是同时显示了)
  • 所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
  • 动态显示的亮度比静态显示的亮度低,所以在选择限流电阻时应小于静态显示电路中电阻值。

3、项目实施

1 一位数码管动态显示

  • 实验需求:

    • 第1位数码管从 0 - 9 循环显示

  • 实验分析
    在这里插入图片描述

    • 位选:第1位数码管(P2.4)工作设置为1,其他3个数码管不工作设置为0
    • 段选:需要数码管显示0-9,则可使用数组存储 0-9 的十六进制值。
    • 设置段选,循环中遍历数组中的值,并赋值给段P0。
  • 实验代码

    #include<reg52.h> #define pos P2// 显示数值表0-9
    unsigned char code dofly_table[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};// 函数声明
    void Delay(unsigned int t); void main()
    {unsigned char i;  pos = 0x18;while (1) {       for (i = 0; i < 10; i++) { P0 = dofly_table[i];  Delay(60000);     }}
    }/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535
    ------------------------------------------------*/
    void Delay(unsigned int t)
    {while (--t);
    }
    

2 数码管左移流动显示

  • 实验需求:
    • 在左数第4位数码管显示4,过1秒,
    • 在左数第3位数码管显示3,过1秒,
    • 在左数第2位数码管显示2,过1秒,
    • 在左数第1位数码管显示1,过1秒,
    • 上述过程不断循环

  • 实验分析
    在这里插入图片描述
    • 位选:循环让4个数码管工作
    • 段选:让对应的位分别显示 4 3 2 1

  • 实验代码
  • 方式1:按位逐一设置显示
    #include <REGX52.H>#define par P0
    #define pos P2#define uchar unsigned char
    #define void delay(unsigned int xms);// 分别对应:1/2/3/4
    uchar code sz[] = {0x06, 0x5b, 0x4f, 0x66};void main()
    {while (1){pos = 0x88;par = sz[3];delay(1000);pos = 0x48;par = sz[2];delay(1000);pos = 0x28;par = sz[1];delay(1000);pos = 0x18;par = sz[0];delay(1000);}
    }void delay(unsigned int xms)
    {unsigned int i, j;for(i=xms; i>0; i--){for(j=112; j>0; j--);}return 0;
    }
    

  • 方式2:定时器 + 数组遍历
    #include <reg52.h>#define uint unsigned int// 定义端口:P2/P0、2个数组(存储位选与段选值)、定时器次数、数组索引
    #define pos P2
    #define par P0uint posValues[] = {0x18, 0x28, 0x48, 0x88};
    uint parValues[] = {0x06, 0x5b, 0x4f, 0x66};uint count = 0;uint index = 3;void main2()
    {// 3.1 设置工作模式TMOD = 0x01;// 3.2 设置初值 - 50ms  --> 次数 * 机器周期 = 0.05s  -> 次数 = 0.05 * 12 * 10^6 / 12TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;// 3.3 打开“开关”EA = 1;TR0 = 1;ET0 = 1;while(1);
    }// 中断函数
    void timer0() interrupt 1
    {TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;count++;if(count == 20)   // 1s{count = 0;pos = posValues[index];par = parValues[index];if(index <= 0){index = 4;}index--;}
    }
    

3 数码管数字0转圈显示

  • 实验要求

    • 使用第1位数码管的 a b c d e f 六段依次点亮

  • 实验分析

    效果hgfedcba
    a亮00000001
    b亮00000010
    c亮00000100
    d亮00001000
    e亮00010000
    f亮00100000
  • 代码实现

    #include <reg52.h>#define pos = P2;  unsigned int temp;
    unsigned char i;void delay(unsigned int t);void main()
    {pos = 0x18;while (1) {P0 = 0xff;for (i = 0; i < 6; i++) {delay(10000);temp = 0x01 << i;P0 = temp & 0xff;}}
    }void delay(unsigned int t)
    {while (t--);
    }
    

4 数码管显示00-99

  • 实验要求

    • 使用2位数码管显示00-99,每次间隔1s,如果到99则重新从0开始

  • 实验分析
    在这里插入图片描述

    • 位选:使用第1位数码管显示十位,第2位数码管显示个位
    • 段选:使用变量记录两位数,在每1秒中对该变量加1,同时分别取出个位与十位,对应到存储0-9的数组中取出对应的数,用于段选的值。

  • 实验代码:

    #include <reg52.h>// 宏定义:简写 unsigned int
    #define uint unsigned intsbit pos = P2; // 分别对应:0/1/2/3/4/5/6/7/8/9
    int code_sz[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};// 函数声明
    void show_ge(uint x);
    void show_shi(uint y);
    void delay(uint xms);   uint val = 0;  // 记录显示的2位数
    uint ge, shi;void main()
    {while (1){val++;                   // 计数值增加1if (val > 99) val =0;    // 如果计数值大于99,则重新从0开始ge = val % 10;     // 计算个位的值shi = val / 10;    // 计算十位的值show_shi(shi);     // 调用显示十位的函数delay(10);         // 延时10ms,让十位数显示保持show_ge(ge);       // 调用显示个位的函数delay(10);         // 延时10ms,让十位数显示保持pos = 0;          // 位选复位(避免出现位选错乱,产生乱码)}
    }// 显示个位数字:左起第2位数码管
    void show_ge(uint x)   // x:计算的个位数的值,对应数组中的索引,从而取到对应的值
    {P0 = 0x00;     // P0(段选位)复位pos = 0x28;    // 第2位数码管P0 = code_sz[x];   // 数组索引取到对应的数字值赋值给P0
    }void show_shi(uint y)  // y:计算的十位数的值,对应数组中的索引,从而取到对应的值
    {P0 = 0x00;     // P0(段选位)复位pos1 = 0x18;      // 选择第1位数码管P0 = code_sz[y];    // 数组索引取到对应的数字值赋值给P0
    }void delay(uint ms)   // 延时指定的毫秒(错略延时)
    {uint i, j;for(i=ms; i>0; i--){for(j=112; j>0; j--);}
    }
    

相关文章:

51单片机教程(九)- 数码管的动态显示

1、项目分析 通过演示数码管动态显示的操作过程。 2、技术准备 1、 数码管动态显示 4个1位数码管和单片机如何连接 a、静态显示的连接方式 优点&#xff1a;不需要动态刷新&#xff1b;缺点&#xff1a;占用IO口线多。 b、动态显示的连接方式 连接&#xff1a;所有位数码…...

golang支持线程安全和自动过期map

在 Golang 中&#xff0c;原生的 map 类型并不支持并发安全&#xff0c;也没有内置的键过期机制。不过&#xff0c;有一些社区提供的库和方案可以满足这两个需求&#xff1a;线程安全和键过期。 1. 使用 sync.Map&#xff08;线程安全&#xff0c;但不支持过期&#xff09; Go…...

机器学习之RLHF(人类反馈强化学习)

RLHF(Reinforcement Learning with Human Feedback,基于人类反馈的强化学习) 是一种结合人类反馈和强化学习(RL)技术的算法,旨在通过人类的评价和偏好优化智能体的行为,使其更符合人类期望。这种方法近年来在大规模语言模型(如 OpenAI 的 GPT 系列)训练中取得了显著成…...

泷羽sec---shell作业

作业一 写计算器 使用bc命令 需要进行安装bc 代码如下&#xff1a; #!/bin/bash echo "-----------------------------------" echo "输入 f 退出" echo "可计算小数和整数" echo "用法如&#xff1a;1.12.2" echo "------…...

华为海思2025届校招笔试面试经验分享

目前如果秋招还没有offer的同学&#xff0c;可以赶紧投递下面这些公司&#xff0c;都在补招。争取大家年前就把后端offer拿下。如果大家在准备秋招补录取过程中有任何问题&#xff0c;都可以私信小编&#xff0c;免费提供帮助。如果还有部分准备备战春招的同学&#xff0c;也可…...

摆脱复杂配置!使用MusicGPT部署你的私人AI音乐生成环境

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 今天给大家分享一个超酷的技能&#xff1a;如何在你的Windows电脑上快速部署一款文字生成音乐的AI创作服务——MusicGPT&#xff0c;并且通过cpolar内网穿透工具&…...

嵌入式Linux中的GPIO编程

GPIO&#xff08;General Purpose Input Output&#xff09;是嵌入式系统中非常常见的一种硬件资源&#xff0c;它允许开发者直接控制微处理器或微控制器的引脚。通过设置这些引脚的状态&#xff0c;可以实现对硬件设备的控制&#xff0c;如LED灯的开关、传感器数据的读取等。 …...

js:函数

函数 函数&#xff1a;实现抽取封装&#xff0c;执行特定任务的代码块&#xff0c;方便复用 声明 函数命名规范 尽量小驼峰 前缀应该为动词&#xff0c;如getName、hasName 函数的调用 函数体是函数的构成部分 函数传参 参数列表里的参数叫形参&#xff0c;实际上写的数据叫实…...

低代码平台审批流程设计

审批流程设计 在此界面设置审批单从发起、到审批、再到结束的流转步骤。 6.1 添加节点 点击两个节点间连线的 图标可添加 审批人、抄送人、办理人、条件分支。 6.2 节点类型 提交节点 点击提交节点&#xff0c;可在右侧弹窗中设置提交节点的抄送人&#xff0c;实现审批在发…...

OpenCV相机标定与3D重建(8)相机标定函数calibrateCamera()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从校准图案的多个视图中找到相机的内参和外参参数. cv::calibrateCamera 是 OpenCV 中用于相机标定的一个非常重要的函数。它通过一系列已知的世…...

Linux信号量的编程

一&#xff0c;用信号量来实现是父进程先进行&#xff0c;还是子进程先进性 信号量的没有P&#xff0c;V操作之前&#xff0c;我们不知道如何控制&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>…...

“Yaker,你可以全局配置插件环境变量!“

周四周四&#xff0c;Vme50(bushi 大家好&#xff0c;这里是疯狂超级牛&#xff08;功能上新版&#xff09; 经常有用户问 “牛牛如何为不同插件配置相同的变量值呢&#xff1f;” “能有一个一波搞定插件变量的方式就好了” 超级牛听到了广大用户的声音&#xff0c;默默地拿起…...

SAAS美容美发系统架构解析

随着技术的不断发展&#xff0c;SAAS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;模式在各个行业的应用逐渐深化&#xff0c;美容美发行业也不例外。传统的美容美发店面通常依赖纸质记录、手动操作和复杂的管理流程&#xff0c;而随着SAAS平台的出现&…...

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间 一、引言二、检查当前磁盘和分区状态1. 使用 `df` 命令检查磁盘使用情况2. 使用 `lsblk` 命令查看分区结构3. 使用 `fdisk` 或 `parted` 命令查看详细的分区信息三、扩展逻辑卷(如果使用 LVM)1. 检查 LVM …...

vscode远程连接ssh

一. 使用vscode里的ssh查件连不上远程的解决方法 删除Windows上的known_host文件&#xff0c;该文件会在连接之后自动生成&#xff0c;用于验证远程服务器的身份。 konwn_host和id_rsa&#xff0c;id_rsa.pub的关系 &#xff08;1&#xff09;konwn_host用于客户端验证远程服务…...

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快&#xff0c;城市基础设施的复杂性和互联性不断增强&#xff0c;城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分&#xff0c;通过现代信息技术提升城市防汛应急管理的智能化水平&#xff0c;保障城市安全。 …...

python实现TCP Socket控制测试仪器

python实现TCP Socket控制测试仪器 说明前提条件代码 说明 本例是用python实现TCP Socket&#xff0c;最终目的是为了控制LCR电容测试仪器。 前提条件 测试仪器 配备了以太网接口&#xff0c;支持TCP/IP协议栈 用户可以通过IP地址和端口号连接到仪器&#xff0c;建立TCP通信…...

51c自动驾驶~合集38

我自己的原文哦~ https://blog.51cto.com/whaosoft/12358456 #GaussianPretrain 万能3D高斯预训练表示&#xff01;爆拉3D检测、Occ、高精地图等四大任务&#xff01; 受Tesla的技术的推动&#xff0c;越来越多的厂商开始走"纯视觉"的路线&#xff0c;多数方案还…...

电脑显示器拔插DVI线后副屏不显示

问题&#xff1a;台式机副屏显示器插拔DVI线后副屏无法检测到&#xff0c;不显示 其他现象&#xff1a;电脑设备管理器“显示适配器”中只有独显&#xff0c;未显示集显。 尝试方法&#xff1a; 1、 重新插拔并拧紧DVI线、更换DVI线、将DVI线替换为VGA线、调换DVI线及VGA线两…...

Bash脚本常用命令

1.Bash常用快捷键 2.通配符 3.Bash其他特殊符号 4.位置参数 5.预定义变量 6.常用变量比较 7.基础正则表达式 8.文件类型判断 9.文件权限判断 10.整数比较命令 11.字符串判断 其他常用参考&#xff1a; https://zhuanlan.zhihu.com/p/748857250...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

性能优化中,多面体模型基本原理

1&#xff09;多面体编译技术是一种基于多面体模型的程序分析和优化技术&#xff0c;它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象&#xff0c;通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中&#xff0…...