当前位置: 首页 > 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;可以帮助企业实现自动化构建、集成和…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...