51单片机教程(九)- 数码管的动态显示
1、项目分析
- 通过演示数码管动态显示的操作过程。
2、技术准备
1、 数码管动态显示
-
4个1位数码管和单片机如何连接
-
a、静态显示的连接方式
- 优点:不需要动态刷新;
- 缺点:占用IO口线多。
-
b、动态显示的连接方式
- 连接:所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效;
- 缺点:需要动态刷新;
- 优点:占用IO口线少。
-
2、动态扫描的原理
- 动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果(就像看的电影是有一帧一帧的画面显示的,当速度够快的时候看到它就是动态的,当显示数码管的速度够快的时候,也就可以看到它们是同时显示了)
- 所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
- 动态显示的亮度比静态显示的亮度低,所以在选择限流电阻时应小于静态显示电路中电阻值。
3、项目实施
1 一位数码管动态显示
-
实验需求:
- 第1位数码管从 0 - 9 循环显示
- 第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 六段依次点亮
- 使用第1位数码管的 a b c d e f 六段依次点亮
-
实验分析
效果 h g f e d c b a a亮 0 0 0 0 0 0 0 1 b亮 0 0 0 0 0 0 1 0 c亮 0 0 0 0 0 1 0 0 d亮 0 0 0 0 1 0 0 0 e亮 0 0 0 1 0 0 0 0 f亮 0 0 1 0 0 0 0 0 -
代码实现
#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开始
- 使用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、静态显示的连接方式 优点:不需要动态刷新;缺点:占用IO口线多。 b、动态显示的连接方式 连接:所有位数码…...
golang支持线程安全和自动过期map
在 Golang 中,原生的 map 类型并不支持并发安全,也没有内置的键过期机制。不过,有一些社区提供的库和方案可以满足这两个需求:线程安全和键过期。 1. 使用 sync.Map(线程安全,但不支持过期) Go…...
机器学习之RLHF(人类反馈强化学习)
RLHF(Reinforcement Learning with Human Feedback,基于人类反馈的强化学习) 是一种结合人类反馈和强化学习(RL)技术的算法,旨在通过人类的评价和偏好优化智能体的行为,使其更符合人类期望。这种方法近年来在大规模语言模型(如 OpenAI 的 GPT 系列)训练中取得了显著成…...
泷羽sec---shell作业
作业一 写计算器 使用bc命令 需要进行安装bc 代码如下: #!/bin/bash echo "-----------------------------------" echo "输入 f 退出" echo "可计算小数和整数" echo "用法如:1.12.2" echo "------…...
华为海思2025届校招笔试面试经验分享
目前如果秋招还没有offer的同学,可以赶紧投递下面这些公司,都在补招。争取大家年前就把后端offer拿下。如果大家在准备秋招补录取过程中有任何问题,都可以私信小编,免费提供帮助。如果还有部分准备备战春招的同学,也可…...
摆脱复杂配置!使用MusicGPT部署你的私人AI音乐生成环境
文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 今天给大家分享一个超酷的技能:如何在你的Windows电脑上快速部署一款文字生成音乐的AI创作服务——MusicGPT,并且通过cpolar内网穿透工具&…...
嵌入式Linux中的GPIO编程
GPIO(General Purpose Input Output)是嵌入式系统中非常常见的一种硬件资源,它允许开发者直接控制微处理器或微控制器的引脚。通过设置这些引脚的状态,可以实现对硬件设备的控制,如LED灯的开关、传感器数据的读取等。 …...
js:函数
函数 函数:实现抽取封装,执行特定任务的代码块,方便复用 声明 函数命名规范 尽量小驼峰 前缀应该为动词,如getName、hasName 函数的调用 函数体是函数的构成部分 函数传参 参数列表里的参数叫形参,实际上写的数据叫实…...
低代码平台审批流程设计
审批流程设计 在此界面设置审批单从发起、到审批、再到结束的流转步骤。 6.1 添加节点 点击两个节点间连线的 图标可添加 审批人、抄送人、办理人、条件分支。 6.2 节点类型 提交节点 点击提交节点,可在右侧弹窗中设置提交节点的抄送人,实现审批在发…...
OpenCV相机标定与3D重建(8)相机标定函数calibrateCamera()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从校准图案的多个视图中找到相机的内参和外参参数. cv::calibrateCamera 是 OpenCV 中用于相机标定的一个非常重要的函数。它通过一系列已知的世…...
Linux信号量的编程
一,用信号量来实现是父进程先进行,还是子进程先进性 信号量的没有P,V操作之前,我们不知道如何控制: #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>…...
“Yaker,你可以全局配置插件环境变量!“
周四周四,Vme50(bushi 大家好,这里是疯狂超级牛(功能上新版) 经常有用户问 “牛牛如何为不同插件配置相同的变量值呢?” “能有一个一波搞定插件变量的方式就好了” 超级牛听到了广大用户的声音,默默地拿起…...
SAAS美容美发系统架构解析
随着技术的不断发展,SAAS(Software as a Service,软件即服务)模式在各个行业的应用逐渐深化,美容美发行业也不例外。传统的美容美发店面通常依赖纸质记录、手动操作和复杂的管理流程,而随着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文件,该文件会在连接之后自动生成,用于验证远程服务器的身份。 konwn_host和id_rsa,id_rsa.pub的关系 (1)konwn_host用于客户端验证远程服务…...
智慧防汛平台在城市生命线安全建设中的应用
随着城市化进程的加快,城市基础设施的复杂性和互联性不断增强,城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分,通过现代信息技术提升城市防汛应急管理的智能化水平,保障城市安全。 …...
python实现TCP Socket控制测试仪器
python实现TCP Socket控制测试仪器 说明前提条件代码 说明 本例是用python实现TCP Socket,最终目的是为了控制LCR电容测试仪器。 前提条件 测试仪器 配备了以太网接口,支持TCP/IP协议栈 用户可以通过IP地址和端口号连接到仪器,建立TCP通信…...
51c自动驾驶~合集38
我自己的原文哦~ https://blog.51cto.com/whaosoft/12358456 #GaussianPretrain 万能3D高斯预训练表示!爆拉3D检测、Occ、高精地图等四大任务! 受Tesla的技术的推动,越来越多的厂商开始走"纯视觉"的路线,多数方案还…...
电脑显示器拔插DVI线后副屏不显示
问题:台式机副屏显示器插拔DVI线后副屏无法检测到,不显示 其他现象:电脑设备管理器“显示适配器”中只有独显,未显示集显。 尝试方法: 1、 重新插拔并拧紧DVI线、更换DVI线、将DVI线替换为VGA线、调换DVI线及VGA线两…...
Bash脚本常用命令
1.Bash常用快捷键 2.通配符 3.Bash其他特殊符号 4.位置参数 5.预定义变量 6.常用变量比较 7.基础正则表达式 8.文件类型判断 9.文件权限判断 10.整数比较命令 11.字符串判断 其他常用参考: https://zhuanlan.zhihu.com/p/748857250...
《Unity Shader 入门精要》高级纹理
立方体纹理 图形学中,立方体纹理(Cubemap)是环境映射(Environment Mapping)的一种实现方法。环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层金属一样反射出周围的环境。 对立…...
vue3实现自定义导航菜单
一、创建项目 1. 打开HBuilder X 图1 2. 新建一个空项目 文件->新建->项目->uni-app 填写项目名称:vue3demo 选择项目存放目录:D:/HBuilderProjects 一定要注意vue的版本,当前选择的版本为vue3 图2 点击“创建”之后进入项目界面 图…...
[2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(2))
方法一(string): #include <iostream> #include <string> using namespace std;// 检查是否为回文数 bool isPalindrome(int n) {string str to_string(n);int left 0, right str.size() - 1;while (left < right) {if (s…...
EDA软件研发的DevOps平台
1:什么是DevOps DevOps是十几年前,在互联网比较火的词,实际上就是ci/cd平台的另外一种说法,核心是说打破研发,测试,运维的边界,能够将整个产品开发的流程快速循环起来,随时可发版&a…...
从单机缓存到分布式缓存那些事
作者:秦怀 1 缓存前世今生 1.1 故事从硬件开始 Cache 一词来源于 1967 年的一篇电子工程期刊论文。其作者将法语词“cache”赋予“safekeeping storage”的涵义,用于电脑工程领域。当时没有 Cache,CPU 和内存都很慢,CPU 直接访…...
[Ubuntu20] Gym入门,Mujoco
OpenAI Gym是 OpenAI 出的研究强化学习算法的 toolkit,对于强化学习算法来说,大部分的论文环境都已经被 OpenAI 的 gym 环境集成,我们可以很便利的使用该工程来测试自己的强化学习算法,与他人的算法做一个对比。 Gym 官网 Github…...
Linux(ubuntu)系统的一些基本操作和命令(持续更新)
操作: Ctrl Alt T(打开命令终端) Ctrl Shift (放大命令终端窗口) Ctrl c(退出当前在终端运行的程序) 在命令终端窗口按Tab键可以补全要写的命令 命令: pwd(查…...
【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化?
【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化? 重要性:★★ NLP Github 项目: NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&am…...
android 安全sdk相关
前述 在网上有看到许多android安全sdk相关的内容,有重复的也有比较新鲜的内容,这里做一个整体的合集,以及后续又看到一些比较新的东西会一起放在这里。 android内sdk目前可以分为以下几个部分(有一些部分可能会存在一些重合&#…...
NVR监测软件EasyNVR多个NVR同时管理:录播主机的5条常见问题与解决办法
视频监控广泛应用于城市治安、交通管理、商业安保及家庭监控等领域。在使用EasyNVR平台管理多个NVR设备时,尤其是涉及到海康录播主机的场景中,使用者可能会遇到一些常见问题。本文将探讨海康录播主机的五个常见问题及其解决办法。 1、海康录播主机的5条常…...
用java做网站教程/烟台seo外包
Android:自定义View(一) 自定义View: 就是继承系统的View,通过添加绘制元素,逻辑以实现自己想要实习的效果的控件。在Android开发过程中,我们想要的效果大多数情况下可以直接使用系统提供的控件来实现&…...
哪家网站建设公司靠谱/手机百度正式版
今天在看王爽的《汇编语言》,看到地址总线的时候,由于那个图画的是并行传输,于是我就去搜了下地址总线是不是并行总线,结果看到一篇文章说现在串行总线的传输速度比并行总线要快,我就奇怪了。 在我的印象中,…...
昆明云南微网站搭建/爬虫搜索引擎
首先安装newman和newman-reporter-html winr打开命令窗口 npm install -g newman npm install -g newman-reporter-html 在postman中导出用例集 导出环境变量 生成报告步骤: 1、导出用例(建议,创建空目录存储用例集,不建议目录…...
新闻头条新闻/北京关键词优化报价
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 支持向量机是由间隔最大化和高维映射两大部件组成。间隔最大化是目标,支持向量机的损失函数…...
做网站需要代码吗/持续优化疫情防控举措
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义: /* struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {} };*/ class Solution { pub…...
专门做优选的网站/深圳推广服务
我们知道,swoole中有两大进程,分别是 master 主进程和 manager 管理进程。 (推荐学习:swoole视频教程)其中 master 主进程中会有一个主 reactor 线程和多个 reactor 线程,主要的作用就是用来维护TCP连接,处理网络IO&am…...