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

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单片机开发板实现&#xff1a;使用2位数码管循环显示00-99&#xff0c;每次间隔1s&#xff0c;并且当计数到20时&#xff0c;则蜂鸣器鸣响1次。 2、实验分析 程序实现分析&#xff1a; 1、定义数码管位选引脚&#xff08;P2.4、P2.5、P2.6、…...

【教3妹学编程-java实战5】结构体字段赋值的几种方式

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 2哥 :3妹&#xff0c;考考你&#xff0c;你知道java结…...

阿里蚂蚁淘宝等多次一面面试面经

一面采用电话面试笔试链接做算法题&#xff08;可能开视频&#xff09;的形式 蚂蚁第一次&#xff1a; 自我介绍 技术一般使用开源技术还是自己研发 开源spring cloud等 流水线用来做什么 用户是什么人 应用场景 是toB的对吧 学到的最前沿的技术有哪些 gateway全局权限…...

UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解

目录 0 引言1 全局对象&#xff08;全局变量&#xff09;1.1 游戏实例 GameInstance1.1.1 介绍1.1.2 使用 GameInstance 1.2 玩家控制器 PlayerController1.3 游戏世界类 UWorld &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&…...

c#使用ExifLib库提取图像的相机型号、光圈、快门、iso、曝光时间、焦距信息等EXIF信息

近期公司组织了书画摄影比赛&#xff0c;本人作为摄影爱好者&#xff0c;平时也会拍些照片&#xff0c;这次比赛当然不能错过。为了提高获奖概率&#xff0c;选了19张图像作为参赛作品。但是&#xff0c;摄影作品要提交图像的光圈、曝光时间等参数。一两张还可以通过电脑自带软…...

C++入门05—指针

1. 指针的基本概念 指针的作用&#xff1a; 可以通过指针间接访问内存 内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示 可以利用指针变量保存地址 2. 指针变量的定义和使用 指针变量定义语法&#xff1a; 数据类型 * 变量名&#xff1b; 示例&#xff1a; …...

Go学习第十六章——Gin文件上传与下载

Go web框架——Gin文件上传与下载 1. 文件上传1.1 入门案例&#xff08;单文件&#xff09;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 模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP 跟踪等&#xff0c;帮助我们监控和管理Spring Boot 应用。 这个模块是一个采集应用内部信息暴露给外部的模块&…...

【MATLAB】安装Psychtoolbox

目录 一、下载Psychtoolbox工具包 1. 一个是这个ZTP文件 2. 分别下载 Subversion 1.7.x command-line client 和 gstreamer.freedesktop.org 二、解压工具包&#xff0c;保存至同一文件 三、安装到matlab 1. 安装psychtoolbox 2. 检查是否安装成功 一、下载Psychtoolbox…...

【Python机器学习】零基础掌握GradientBoostingClassifier集成学习

什么能有效地解决分类问题,特别是在数据复杂、特征多样的情况下? 面对这个问题,许多人可能会想到复杂的神经网络或深度学习方法。然而,有一种称为“梯度提升分类器”(Gradient Boosting Classifier)的算法,以其高准确度、灵活性和易用性赢得了大量用户的青睐。 假设在…...

RFNet模型数据集采集处理流程

文章目录 cityscapes数据集内容如何标注数据得到标签图片 cityscapes数据集内容 训练模型的时候下载了cityscapes里的disparity、gtFine和leftImg8bit。 共5000张图片。2975张训练&#xff0c;500张验证&#xff0c;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/ 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人…...

如何在深度学习领域取得个人的成功

要在深度学习领域取得个人的成功&#xff0c;可以考虑以下建议&#xff1a; 学习深度学习的基础知识&#xff1a;首先&#xff0c;建立坚实的深度学习基础知识是非常重要的。你可以学习深度学习的基本概念、神经网络的原理、常用的深度学习框架&#xff08;如TensorFlow、PyTor…...

数据结构【DS】B树

m阶B树的核心特性: Q&#xff1a;根节点的子树数范围是多少&#xff1f;关键字数的范围是多少&#xff1f; A&#xff1a;根节点的子树数∈[2, m],关键字数∈[1, m-1]。 Q&#xff1a;其他结点的子树数范围是多少&#xff1f;关键字数范围是多少&#xff1f; Q&#xff1a;对任…...

Chatgpt网页版根据关键词自动批量写原创文章软件【可多开自动登录切换gpt账号】

Chatgpt网页版根据关键词自动批量写原创文章软件介绍&#xff1a; 1、需要放入GPT账号和密码放入在账号库.txt里&#xff0c;可以放入多组账号密码&#xff0c;账号切换轮流使用。 2、可以自定义回答指令&#xff0c;也可多个回答指令随机切换。 3、可以给关键词加双标题&…...

研发效能认证学员作品:快速进行持续集成应用实践丨IDCF

作者&#xff1a;赖嘉明 研发效能&#xff08;DevOps&#xff09;工程师认证学员 随着数字化转型的推进及市场竞争的加剧&#xff0c;越来越多的企业也意识到持续集成的重要性。 而持续集成作为一种先进的软件开发实践和工具链&#xff0c;可以帮助企业实现自动化构建、集成和…...

抖音批量下载工具高效应用全攻略:从单视频到批量采集的完整指南

抖音批量下载工具高效应用全攻略&#xff1a;从单视频到批量采集的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…...

攻克模电难点(一):多级放大电路与差动放大电路实战解析

1. 多级放大电路的设计基础 第一次接触多级放大电路时&#xff0c;我被各种耦合方式绕得头晕。直到在实验室烧坏几个三极管后&#xff0c;才真正理解其中的门道。多级放大电路的核心思想很简单&#xff1a;把多个单级放大电路像搭积木一样连接起来&#xff0c;但实际设计时却要…...

AI编程革命:重塑程序员未来(一)

AI编程时代到来AI不会让程序员消失&#xff0c;但会深刻重塑这个职业。当代码生成变得轻而易举&#xff0c;程序员 的角色将从“代码编写者”升级为“问题解决者”与“架构设计师”。未来的核心竞争力&#xff0c;在于 理解复杂业务、设计系统逻辑&#xff0c;并用人类独有的创…...

旺季仓容紧张跨境卖家如何提前规划备货与入仓

决胜销售旺季&#xff1a;跨境卖家的备货与入仓战略指南随着全球电商购物节日益临近&#xff0c;无论是年末的“黑色星期五”、圣诞季&#xff0c;还是区域性的大促活动&#xff0c;一个共同的挑战悄然浮现&#xff1a;仓库容量告急。对于跨境卖家而言&#xff0c;旺季不仅是销…...

别让SDF警告淹没你!芯片后仿真中那些‘不起眼’却至关重要的VCS编译选项详解

别让SDF警告淹没你&#xff01;芯片后仿真中那些‘不起眼’却至关重要的VCS编译选项详解 当数字IC设计进入后仿真阶段&#xff0c;工程师们常常会陷入海量警告信息的泥潭。特别是当SDF&#xff08;Standard Delay Format&#xff09;文件反标时产生的各类警告&#xff0c;往往…...

OpenClaw更新操作

文章名称 目录文章名称前言一、OpenClaw更新26.3.31版本二、飞书更新26.3.31版本我的龙虾日记前言 OpenClaw由于每个版本都有大量内容&#xff0c;更新的时候会出很多问题。记录一下出现过的问题 一、OpenClaw更新 推荐采用重装的方式进行更新,由于会进行新手教程.如果你不想再…...

3个颠覆性策略实现网站到Figma设计的智能双向转换

3个颠覆性策略实现网站到Figma设计的智能双向转换 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 你是否曾为设计还原度低、开发周期长、团队协作效率低下而困扰&#xff1f;Figm…...

高效Windows注册表分析工具实战指南:如何用RegRipper3.0突破注册表数据提取瓶颈?

高效Windows注册表分析工具实战指南&#xff1a;如何用RegRipper3.0突破注册表数据提取瓶颈&#xff1f; 【免费下载链接】RegRipper3.0 RegRipper3.0 项目地址: https://gitcode.com/gh_mirrors/re/RegRipper3.0 ▶ 核心价值&#xff1a;为什么RegRipper3.0是注册表分析…...

森利威尔SL3041B替换LM5018 100V降压3.3V5V12V恒压芯片

在工业、汽车及电池供电的电子系统中&#xff0c;高压降压转换器的选择往往需要在性能、可靠性与成本之间取得平衡。传统上&#xff0c;LM5018等进口芯片凭借其高输入电压范围和稳定的性能占据一定市场&#xff0c;但随着国内半导体技术的成熟&#xff0c;国产替代方案已具备与…...

如何彻底解决Windows快捷键冲突:Hotkey Detective完整指南

如何彻底解决Windows快捷键冲突&#xff1a;Hotkey Detective完整指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是…...