51单片机实验:数码管动态显示00-99

news2024/9/21 4:33:46

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++;             // 计数值增加1
        if (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++;                   // 计数值增加1
			if (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 int

sbit 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++;                   // 计数值增加1
			if (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、实验总结

        要明确数码管的显示要解决的问题(显示不同的值的数据保持、不同位的数据同时显示),着重问题的本身出发,设计对应的程序:通过多次判断实现对计数的修改,同时要明确程序执行的速度较快,人有视觉暂停现象, 结合这些因素实现对应逻辑分步操作。


结语以上整个程序的实现逻辑,还存在很多不全面的地方,欢迎各位大佬指点;如果觉得笔者不易,欢迎关注和点赞,给予我记录更多文章的动力!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1135513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ BinarySercahTree for version

搜索二叉树定义 搜索二叉树模拟实现 首先写一个模版&#xff0c;然后写一个搜索二叉树的类 BSTree&#xff0c;类里面给 BSTe进行重命名为&#xff1a;Node。 template<class K> class BSTree {tyepdef BSTree<K> Node; private:Node* root nullptr; };再写一个…

Qt中的枚举变量,Q_ENUM,Q_FLAG以及Qt中自定义结构体、枚举型做信号参数传递

Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他 理论基础&#xff1a;一、Q_ENUM二、QMetaEnum三、Q_FLAG四、示例 Chapter1 Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他前言Q_ENUM的使用Q_FLAG的引入解决什么问题&#xf…

怎么在Python爬虫中使用IP代理以避免反爬虫机制?

在进行网络爬虫的过程中&#xff0c;尤其是在大规模批量抓取数据时&#xff0c;需要应对各种反爬虫技术&#xff0c;其中最常用的就是IP封锁。为了避免IP被封锁&#xff0c;我们可以使用IP代理来隐藏自己的真实IP地址&#xff0c;从而让爬虫活动看起来更像正常的浏览器行为。 I…

Table-GPT:让大语言模型理解表格数据

llm对文本指令非常有用&#xff0c;但是如果我们尝试向模型提供某种文本格式的表格数据和该表格上的问题&#xff0c;LLM更有可能产生不准确的响应。 在这篇文章中&#xff0c;我们将介绍微软发表的一篇研究论文&#xff0c;“Table-GPT: Table- tuning GPT for Diverse Table…

虹科 | 解决方案 | 汽车示波器 远程诊断方案

车厂总部专家实时指导你修车 当一线汽修技师遇到疑难问题无从下手时&#xff0c;可以准备好pico汽车示波器套装&#xff0c;并戴上我们的M400智能AR眼镜&#xff0c;通过语音操作&#xff0c;呼叫主机厂的技术支持老师&#xff1b;老师通过AR眼镜上的摄像头老师可以实时看到现…

Python数据挖掘:入门、进阶与实用案例分析——基于非侵入式负荷检测与分解的电力数据挖掘

文章目录 摘要01 案例背景02 分析目标03 分析过程04 数据准备05 属性构造06 模型训练07 性能度量08 推荐阅读赠书活动 摘要 本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功率等情况&#xff0c;分析各电力设备的实际用电量&#xff0c;进而为电…

财务RPA机器人真的能提高效率吗?

财务部门作为一个公司的管理职能部门承担着一个公司在商业活动中各个方面的重要职责。理论上来说&#xff0c;一个公司的财务部门的实际工作包含但不限于对企业的盈亏情况进行评估、对风险进行预测、通过数据分析把握好公司的财务状况、税务管理等。 然而&#xff0c;实际上在…

分析主题帆软决策报表控件实现点击查询按钮后才能查询

点击「我的分析」即进入分析主题的管理界面&#xff0c;如下图所示&#xff1a; 2.1.1 分析列表区域 「分析列表」存放着当前用户创建的和其他用户协作给该用户的所有分析主题。 可以对分析列表和分析主题进行管理&#xff0c;详情参见&#xff1a;管理我的分析、管理分析主…

oa系统是什么?有哪些功能和作用?

本文将为大家讲解&#xff1a;1、oa系统是什么&#xff1f;有哪些功能和作用&#xff1f; 一、什么是OA系统 OA系统全称为Office Automation&#xff0c;即办公自动化系统。它是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台&#xff0c;具有信息管理、流程管…

微信小程序实现文章内容详情

方案一、使用微信小程序官方提供的webview 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 方案二、把网页转成pdf直接展示 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 实现思路是发起网络请求拿到pdf下载地址&#xff0c;然后wx.download…

Linux (KDE) 中使用Network Settings设置静态ip

在 Linux (KDE) 中使用 Network Settings 设置s5静态IP详细教程 。 首先&#xff0c;打开 KDE 的设置面板。可以通过点击桌面上的设置图标&#xff0c;或者在开始菜单中搜索 “Settings” 并打开。 在设置面板中&#xff0c;点击 “Network” 选项。 接下来&#xff0c;你会看…

AD20生产Gerber文件

1、打开所要导出文件的PCB文件。并选择制造输出Gerber文件。 2、选择单位和格式 3、设置需要输出的图层 点击确定后&#xff0c;就可以生成Gerber文件。如下图所示。 4、生成钻孔文件 5&#xff0c;选择PCB窗口&#xff0c;跟第一步一样&#xff1b; 6&#xff0c;点击菜单 文…

讲座记录|1024学科周讲座分享

前言&#xff1a;2023年10月24日&#xff0c;我参加了学院举办的学科周活动&#xff0c;本篇文章记录一下参加本次活动的收获。 本次活动中&#xff0c;我主要参加了黄萱菁教授和高跃教授的讲座以及几位老师的Panel环节&#xff0c;然后聆听了网络空间安全分论坛的报告。在本次…

MySQL进阶(再论事务)——什么是事务 事务的隔离级别 结合MySQL案例详细分析

前言 MySQL最为最流行的开源数据库&#xff0c;其重要性不言而喻&#xff0c;也是大多数程序员接触的第一款数据库&#xff0c;深入认识和理解MySQL也比较重要。 本篇博客阐述MySQL的事务的定义和特性&#xff0c;原子性&#xff0c;一致性&#xff0c;隔离性&#xff0c;持久…

在 Windows 用 Chrome System Settings 设置代理

在 Windows 用 Chrome System Settings 设置代理 贴心提示&#xff1a;在设置代理之前&#xff0c;请确保您已经安装了 浏览器。 &#x1f527; 设置代理的详细步骤如下&#xff1a; 打开 浏览器&#xff0c;输入 //settings/system 并回车。 在「系统和网络设置」页面中&am…

突然发现柚子租车v1.42的小程序后端代码竟然内核文件全加密了!记录我的解密过程

因客户需求&#xff0c;需要定制租车小程序源码&#xff0c;找了很多要么很贵要么功能不满足需求&#xff0c;为啥这么折腾&#xff1f;还不是因为客户给的资金有限&#xff01; 翻来覆去找到了柚子租车这个小程序功能各方面都能满足需求&#xff0c;然后我就尝试找最新版&…

Find My眼镜|苹果Find My技术与眼镜结合,智能防丢,全球定位

近年来&#xff0c;得益于国家政策的大力支持和技术的不断进步&#xff0c;眼镜产品的发展取得了长足的进步&#xff0c;正朝着高质量、多元化方向迈进。在这个趋势下&#xff0c;眼镜的功能性、时尚性、舒适性等方面都有了明显的提升&#xff0c;同时为了满足不同年龄段消费者…

[黑马程序员SpringBoot2]——基础篇2

目录&#xff1a; 模块创建实体类快速开发(lombok)数据层标准开发&#xff08;基础CRUD)开启MP运行日志分页数据层标准开发(条件查询)业务层标准开发&#xff08;基础CRUD)业务层标准开发&#xff08;基于MyBatisPlus构建)表现层标准开发表现层数据一致性处理&#xff08;R对象…

阿里云企业邮箱基于Spring Boot快速实现发送邮件功能

邮件在项目中经常会被用到&#xff0c;比如用邮件发送通知。比如&#xff0c;通过邮件注册、认证、找回密码、系统报警通知、报表信息等。本篇文章带大家通过SpringBoot快速实现一个发送邮件的功能。 邮件协议 下面先简单了解一下常见的邮件协议。常用的电子邮件协议有SMTP、…

xxl-job项目集成实战,全自动项目集成,可以直接使用到项目中

如果你看官方文档&#xff0c;在研究透&#xff0c;至少也得几天时间&#xff0c;如果你直接看我的文档&#xff0c;快速用到项目中&#xff0c;也就10分钟就搞好了。 xxl-job功能确实很强大&#xff0c;而且使用的人比较多&#xff0c;既然在使用xxl-job&#xff0c;那肯定是…