51单片机实验:数码管动态显示00-99
1、实验要求
利用STC89C52RC单片机开发板实现:使用2位数码管循环显示00-99,每次间隔1s,并且当计数到20时,则蜂鸣器鸣响1次。
2、实验分析

程序实现分析:
1、定义数码管位选引脚(P2.4、P2.5、P2.6、P2.7)
2、定义个位、十位显示函数(用来未选第1、2位显示个位、十位上的数字)
3、定义延时函数(使用for循环嵌套实现空语句执行,从而达到延时的效果)
4、定义计数变量,分别计算出个位、十位的数,将其传入到个位、十位显示的函数
5、结合延时函数,实现数字的显示
6、判断计数变量大于99,则重新赋值为0
3、代码实现
(1)导入头文件及引脚定义
#include <reg52.h>sbit pos1 = P2^4; // 第1为数码管位选控制位
sbit pos2 = P2^5; // 第2为数码管位选控制位
sbit pos3 = P2^6; // 第3为数码管位选控制位
sbit pos4 = P2^7; // 第4为数码管位选控制位
sbit fmq = P2^3; // 蜂鸣器控制位
(2)定义个位、十位显示函数
// 分别对应:0/1/2/3/4/5/6/7/8/9
int code_sz[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};// 宏定义:简写 unsigned int
#define uint unsigned int// 函数声明
void show_ge(uint x);
void show_shi(uint y);// 显示个位数字:左起第2位数码管
void show_ge(uint x) // x:计算的个位数的值,对应数组中的索引,从而取到对应的值
{P0 = 0x00; // P0(段选位)复位pos1 = 0;pos2 = 1; // 选择第2位数码管pos3 = 0;pos4 = 0;P0 = code_sz[x]; // 数组索引取到对应的数字值赋值给P0
}void show_shi(uint y) // y:计算的十位数的值,对应数组中的索引,从而取到对应的值
{P0 = 0x00; // P0(段选位)复位pos1 = 1; // 选择第1位数码管pos2 = 0;pos3 = 0;pos4 = 0;P0 = code_sz[y]; // 数组索引取到对应的数字值赋值给P0
}
(3)定义延时函数
void delay(uint ms); // 延时函数声明void delay(uint ms) // 延时指定的毫秒(错略延时)
{uint i, j;for(i=ms; i>0; i--){for(j=112; j>0; j--);}
}
(4)编写主函数逻辑
uint val = 0;
uint ge, shi;void main()
{while (1){ge = val % 10; // 计算个位的值shi = val / 10; // 计算十位的值show_shi(shi); // 调用显示十位的函数delay(100); // 延时100ms,让十位数显示保持show_ge(ge); // 调用显示个位的函数delay(900); // 延时900ms,让十位数显示保持fmq = 1; // 关闭蜂鸣器鸣叫pos1 = 0; // 位选复位(避免出现位选错乱,产生乱码)pos2 = 0;pos3 = 0;pos4 = 0;val++; // 计数值增加1if (val > 99) val =0; // 如果计数值大于99,则重新从0开始if (val == 20) fmq=0; // 如果计数值等于20,则蜂鸣器鸣叫}
}
【单片机显示问题】数码管显示不同的值需要考虑2个问题:
(1)十位、个位显示不同值:由于P0段选共用,则需要实现位选调整才能实现。
(2)要保证个位、十位的数同时显示。
【单片机显示现象】十位数字很暗,基本无法显示,个位可以正常,但会出现闪烁情况,无法看到00--99的数字。
【单片机显示分析】十位(第1位数码管)显示由于延时时间过短(100ms),造成还未显示,程序就执行到了显示个位的代码,从而位选就切换至第2位数(个位)码管,则P0对应的取值则会显示到第1位数码管,此时添加的900ms延时,也只能显示个位上的数字。
【单片机显示调整】
A、个位、十位显示的时间间隔不能过大这样(10s),由于代码执行较快(us),这样就能因为视觉停留现象则就会感觉数字是一直显示,同时也不会出现闪烁情况。
B、个位、十位数值变化时间要保证1s:则计数变量则1s内需要计数50次再增加1(1000 / (10 + 10) = 50), 这样就能让个位十位数码管1s内更新50次后显示下一个数。
uint times = 0;void main()
{while (1){times++;if(times == 50) // 每50次,计数增加1{ times = 0; // 次数50次后复位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,让十位数显示保持fmq = 1; // 关闭蜂鸣器鸣叫pos1 = 0; // 位选复位(避免出现位选错乱,产生乱码)pos2 = 0;pos3 = 0;pos4 = 0;if (val == 20) fmq=0; // 如果计数值等于20,则蜂鸣器鸣叫}
}
4、完整代码
#include <reg52.h>// 宏定义:简写 unsigned int
#define uint unsigned intsbit pos1 = P2^4; // 第1为数码管位选控制位
sbit pos2 = P2^5; // 第2为数码管位选控制位
sbit pos3 = P2^6; // 第3为数码管位选控制位
sbit pos4 = P2^7; // 第4为数码管位选控制位
sbit fmq = P2^3; // 蜂鸣器控制位// 分别对应: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 times = 0;
uint val = 0;
uint ge, shi;void main()
{while (1){times++;if(times == 50) // 每50次,计数增加1{ times = 0; // 次数50次后复位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,让十位数显示保持fmq = 1; // 关闭蜂鸣器鸣叫pos1 = 0; // 位选复位(避免出现位选错乱,产生乱码)pos2 = 0;pos3 = 0;pos4 = 0;if (val == 20) fmq=0; // 如果计数值等于20,则蜂鸣器鸣叫}
}// 显示个位数字:左起第2位数码管
void show_ge(uint x) // x:计算的个位数的值,对应数组中的索引,从而取到对应的值
{P0 = 0x00; // P0(段选位)复位pos1 = 0;pos2 = 1; // 选择第2位数码管pos3 = 0;pos4 = 0;P0 = code_sz[x]; // 数组索引取到对应的数字值赋值给P0
}void show_shi(uint y) // y:计算的十位数的值,对应数组中的索引,从而取到对应的值
{P0 = 0x00; // P0(段选位)复位pos1 = 1; // 选择第1位数码管pos2 = 0;pos3 = 0;pos4 = 0;P0 = code_sz[y]; // 数组索引取到对应的数字值赋值给P0
}void delay(uint ms) // 延时指定的毫秒(错略延时)
{uint i, j;for(i=ms; i>0; i--){for(j=112; j>0; j--);}
}
5、实验总结
要明确数码管的显示要解决的问题(显示不同的值的数据保持、不同位的数据同时显示),着重问题的本身出发,设计对应的程序:通过多次判断实现对计数的修改,同时要明确程序执行的速度较快,人有视觉暂停现象, 结合这些因素实现对应逻辑分步操作。
【结语】以上整个程序的实现逻辑,还存在很多不全面的地方,欢迎各位大佬指点;如果觉得笔者不易,欢迎关注和点赞,给予我记录更多文章的动力!!
相关文章:
51单片机实验:数码管动态显示00-99
1、实验要求 利用STC89C52RC单片机开发板实现:使用2位数码管循环显示00-99,每次间隔1s,并且当计数到20时,则蜂鸣器鸣响1次。 2、实验分析 程序实现分析: 1、定义数码管位选引脚(P2.4、P2.5、P2.6、…...
【教3妹学编程-java实战5】结构体字段赋值的几种方式
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 2哥 :3妹,考考你,你知道java结…...
阿里蚂蚁淘宝等多次一面面试面经
一面采用电话面试笔试链接做算法题(可能开视频)的形式 蚂蚁第一次: 自我介绍 技术一般使用开源技术还是自己研发 开源spring cloud等 流水线用来做什么 用户是什么人 应用场景 是toB的对吧 学到的最前沿的技术有哪些 gateway全局权限…...
UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解
目录 0 引言1 全局对象(全局变量)1.1 游戏实例 GameInstance1.1.1 介绍1.1.2 使用 GameInstance 1.2 玩家控制器 PlayerController1.3 游戏世界类 UWorld 🙋♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏&…...
c#使用ExifLib库提取图像的相机型号、光圈、快门、iso、曝光时间、焦距信息等EXIF信息
近期公司组织了书画摄影比赛,本人作为摄影爱好者,平时也会拍些照片,这次比赛当然不能错过。为了提高获奖概率,选了19张图像作为参赛作品。但是,摄影作品要提交图像的光圈、曝光时间等参数。一两张还可以通过电脑自带软…...
C++入门05—指针
1. 指针的基本概念 指针的作用: 可以通过指针间接访问内存 内存编号是从0开始记录的,一般用十六进制数字表示 可以利用指针变量保存地址 2. 指针变量的定义和使用 指针变量定义语法: 数据类型 * 变量名; 示例: …...
Go学习第十六章——Gin文件上传与下载
Go web框架——Gin文件上传与下载 1. 文件上传1.1 入门案例(单文件)1.2 服务端保存文件的几种方式SaveUploadedFileCreateCopy 1.3 读取上传的文件1.4 多文件上传 2. 文件下载2.1 快速入门2.2 前后端模式下的文件下载2.3 中文乱码问题 1. 文件上传 1.1 …...
2.MySQL的调控按钮——启动选项和系统变量
2.MySQL的调控按钮——启动选项和系统变量 1.启动选项和配置文件1.1 在命令行上使用选项1.2 配置文件中使用选项1.2.1 配置文件路径1.2.2 配置文件的内容1.2.3 特定 MySQL 版本的专用选项组1.2.4 配置文件的优先级1.2.5 同一个配置文件中多个组的优先级1.2.6 defaults-file 的使…...
故障诊断模型 | Maltab实现CNN卷积神经网络故障诊断
文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现CNN卷积神经网络故障诊断 模型描述 卷积神经网络(convolutional neural network)是具有局部连接、权重共享等特性的深层前馈神经网络,最早主要是用来处理图像信息。 相比于全…...
qt高精度定时器的使用停止线程应用
##线程停止 //线程停止应用 public: explicit WorkerThread(QObject *parent 0) :QThread(parent), m_bStopped(false){qDebug() << "Worker Thread : " << QThread::currentThreadId();}~WorkerThread(){stop();quit();wait();}void stop() {qDebug()…...
Spring Boot Actuator 介绍
Spring Boot Actuator是什么 Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理Spring Boot 应用。 这个模块是一个采集应用内部信息暴露给外部的模块&…...
【MATLAB】安装Psychtoolbox
目录 一、下载Psychtoolbox工具包 1. 一个是这个ZTP文件 2. 分别下载 Subversion 1.7.x command-line client 和 gstreamer.freedesktop.org 二、解压工具包,保存至同一文件 三、安装到matlab 1. 安装psychtoolbox 2. 检查是否安装成功 一、下载Psychtoolbox…...
【Python机器学习】零基础掌握GradientBoostingClassifier集成学习
什么能有效地解决分类问题,特别是在数据复杂、特征多样的情况下? 面对这个问题,许多人可能会想到复杂的神经网络或深度学习方法。然而,有一种称为“梯度提升分类器”(Gradient Boosting Classifier)的算法,以其高准确度、灵活性和易用性赢得了大量用户的青睐。 假设在…...
RFNet模型数据集采集处理流程
文章目录 cityscapes数据集内容如何标注数据得到标签图片 cityscapes数据集内容 训练模型的时候下载了cityscapes里的disparity、gtFine和leftImg8bit。 共5000张图片。2975张训练,500张验证,1525test。每个目录下都有train、test和val的子目录,这些子…...
sql-50练习题6-10
sql练习题6-10题 前言数据库表结构介绍学生表课程表成绩表教师表 0-6 查询"李"姓老师的数量0-7 查询学过"李四"老师授课的同学的信息0-8 查询没学过"李四"老师授课的同学的信息0-9 查询学过编号为"01"并且也学过编号为"02"的…...
【刷题宝典NO.1】
Nim游戏 https://leetcode.cn/problems/nim-game/description/ 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头。 你们轮流进行自己的回合, 你作为先手 。 每一回合,轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人…...
如何在深度学习领域取得个人的成功
要在深度学习领域取得个人的成功,可以考虑以下建议: 学习深度学习的基础知识:首先,建立坚实的深度学习基础知识是非常重要的。你可以学习深度学习的基本概念、神经网络的原理、常用的深度学习框架(如TensorFlow、PyTor…...
数据结构【DS】B树
m阶B树的核心特性: Q:根节点的子树数范围是多少?关键字数的范围是多少? A:根节点的子树数∈[2, m],关键字数∈[1, m-1]。 Q:其他结点的子树数范围是多少?关键字数范围是多少? Q:对任…...
Chatgpt网页版根据关键词自动批量写原创文章软件【可多开自动登录切换gpt账号】
Chatgpt网页版根据关键词自动批量写原创文章软件介绍: 1、需要放入GPT账号和密码放入在账号库.txt里,可以放入多组账号密码,账号切换轮流使用。 2、可以自定义回答指令,也可多个回答指令随机切换。 3、可以给关键词加双标题&…...
研发效能认证学员作品:快速进行持续集成应用实践丨IDCF
作者:赖嘉明 研发效能(DevOps)工程师认证学员 随着数字化转型的推进及市场竞争的加剧,越来越多的企业也意识到持续集成的重要性。 而持续集成作为一种先进的软件开发实践和工具链,可以帮助企业实现自动化构建、集成和…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
