51单片机实践之数码管电子时钟/时间呈现及其设置

news/2025/10/22 20:07:26/文章来源:https://www.cnblogs.com/ljbguanli/p/19158859

51单片机实践之数码管电子时钟/时间呈现及其设置

以下源码在keil内可直接使用,注意板子的型号(AT89C52)即可。

代码如下:

/*
需求:两个独立按键分别控制加减(KEY2和KEY3),一个独立按键控制移位(KEY1),且在移动到该位置时该位置闪烁。
开发板:普中-A2
*/
#include 
#define leds P0
typedef unsigned int uint;
typedef unsigned char uchar;
//独立按键模块
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
//0-F再加一个 - .数码管显示数字的数组
uchar leds_body [] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
uchar time[] = {6,3,16,0,4,16,1,2};//时间数组,每个数字和符号都占一个数码管
uchar h = 0,m = 0,s = 0;//时分秒初始化
uint count = 0;//计数量
uchar set_pos = -1;//控制显示位置的变化
void caculate()//计算时分秒,将其每一位放到相应位置
{time[0] = s%10;time[1] = s/10;time[3] = m%10;time[4] = m/10;time[6] = h%10;time[7] = h/10;
}
void delay(uint xms)		//@11.0592MHz,1ms  延迟:以1ms为单位
{unsigned char k, j;while(xms){k = 2;j = 199;do{while (--j);} while (--k);xms--;}
}
void dynamic_hms()//动态显示时分秒
{if(count==1000)//for循环决定这里得是8的倍数{count = 0;if(set_pos == -1)//只有位置不变化时,才进行时间流动{s++;if(s == 60){s = 0;m++;if(m == 60){m = 0;h++;if(h == 24){h = 0;}}}}}
}
void showtime()//控制时间显示在数码管上
{uchar i = 0;caculate();for(i=0;i<8;i++){P2 = i<<2;//控制数码管的显示位置if(count<500 && set_pos==i){leds = 0;//使得该位置的数码管闪烁,半秒内的每一轮都会处理该位置,使得该位置半秒不显示。}else{leds = leds_body [time[i]];//没有选中的位置内容每一次循环都会显示,半秒后,位置全部正常显示。}delay(1);//显示1mscount++;//动态显示时分秒的关键,在1ms后每次加上1,等差不多到1000ms后即为1秒}leds = 0;//消影
}
void button_control()//控制移位
{if(KEY1 == 0){delay(50);//使频率稳定while(KEY1 == 0);//判断是否松开delay(50);//使得频率稳定set_pos++;//数码管进入闪烁阶段if(set_pos == 2)set_pos++;else if(set_pos == 5)set_pos++;else if(set_pos == 8)set_pos = -1;}if(KEY2 == 0)//控制数字加{delay(50);while(KEY2 == 0);delay(50);if(set_pos==0){s++;s = s % 60;caculate();}else if(set_pos==1){s = s + 10;s = s % 60;caculate();}else if(set_pos==3){m++;m = m % 60;caculate();}else if(set_pos==4){m = m + 10;m = m % 60;caculate();}else if(set_pos==6){h++;h = h % 24;caculate();}else if(set_pos==7){h = h + 10;h = h % 24;caculate();}}if(KEY3 == 0)//控制数字减{delay(50);while(KEY3 == 0);delay(50);if(set_pos==0){if(s>0){s--;}else{s = 0;}s = s % 60;//使s在[0,59]这个区间内,后面类似caculate();}else if(set_pos==1){if(s>10){s = s - 10;}else{s = 0;}s = s % 60;caculate();}else if(set_pos==3){if(m>0){m--;}else{m = 0;}m = m % 60;caculate();}else if(set_pos==4){if(m>10){m = m - 10;}else{m = 0;}m = m % 60;caculate();}else if(set_pos==6){if(h>0){h--;}else{h = 0;}h = h % 24;caculate();}else if(set_pos==7){if(h>10){h = h - 10;}else{h = 0;}h = h % 24;caculate();}}
}
void main()
{while(1){showtime();//展示时间dynamic_hms();//时间流动button_control();//按键控制}
}

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

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

相关文章

LGP3694 邦邦的大合唱站队 学习笔记

LGP3694 邦邦的大合唱站队 学习笔记 \(\texttt{Luogu Link}\) 前言 状压热身题。\(\texttt{Warm up!}\) 另外,你知道吗,设定上,邦邦已经火了…… 题意简述 \(n\) 个偶像排成一列,他们来自 \(m\) 个不同的乐队。每个…

2025.10.22学习记录

2025.10.22课程总结 本次学习聚焦 设计规范、查询技术、高级功能 三大模块,目标是掌握从表结构设计到复杂数据查询的全流程能力,为后续数据分析、系统开发奠定基础。 范式理论 核心观点:范式是电商数据结构化的基础…

LeeCode_101对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1:输入:root = [1,2,2,3,4,4,3] 输出:true class Solution { public:bool isSameTree(TreeNode* p, TreeNode* q){if(p == nullptr || q == nullptr){retu…

TRAE 设计团队如何玩转 Vibe Coding(上)|高美感页面生成篇

资料来源:火山引擎-开发者社区本内容分为上下两篇,主要和大家分享 TRAE 设计团队基于 TRAE 工具的 Vibe Coding 探索实践,包括三类场景的搭建和价值收益的案例,帮助设计师探索如何通过 Vibe Coding 放大设计价值 /…

详细介绍:观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

详细介绍:观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。2025-10-22 19:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre …

LeeCode_226反转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1:输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] //法一: class Solution { public:TreeNode* invertTree(TreeNode* root){if(root =…

TRAE 设计团队如何玩转 Vibe Coding(下)|设计工具生成与提效篇

资料来源:火山引擎-开发者社区本内容分为上下两篇,主要和大家分享 TRAE 设计团队基于 TRAE 工具的 Vibe Coding 探索实践,包括三类场景的搭建和价值收益的案例,帮助设计师探索如何通过 Vibe Coding 放大设计价值 /…

衡量效率,质量,运维的效率指标

目录背景和价值一、效率类指标(一)开发效率(二)运维效率二、质量类指标(一)代码质量(二)产品质量(三)测试质量(四)运维质量参考资料 背景和价值 在IT团队中,衡量效率和质量的指标可从多个维度进行定义,以…

2025多校冲刺CSP模拟赛7 总结

比赛:2025多校冲刺CSP模拟赛7 日期:\(25.10.22\),场地:\(\text{accoder}\),排名:\(56/73\)! 估分:\(30+0+[80,100]+0=110\) 终分:\(30+0+80+0=110\) 应该得分:\(100+100+[80,100]+?=280\) 失分 比赛决策问题…

详细介绍:wpf之 Popup

详细介绍:wpf之 Popuppre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

? #4

100 + 60 + 50 + 100 = 310, Rank 1/6.怎么 swap(min(B,C),D) /wx2024暑期CSP-S&NOIP模拟赛第2套 链接:link 题解:link 的题解区 时间:4h (2025.10.22 14:00~18:00) 题目数:4 难度:A B C D\(\color{#F39C11} …

结对项目-生成四则运算

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13479姓名 学号 GitHu…

CSS3 超实用属性:pointer-events (可穿透图层的鼠标事件)

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 CSS3 pointer-events 属性:实现可穿透图层的鼠标事件 在网页开发中,我们通常会遇到多个元素重叠的情况。在这种情况下,如何使得被遮挡的元素仍然能够响应鼠标…

C++开源库使用:nlohmann/json - 指南

C++开源库使用:nlohmann/json - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

实用指南:JAVA学习-预科部分(路线、博客、预备基础)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【比赛记录】2025CSP+NOIP 冲刺模拟赛合集Ⅱ

2025CSP-S模拟赛65(HZOJ CSP-S模拟37)A B C D Sum Rank100 40 15 - 155 7/12HZOJ 上也有这场比赛,但我没看见。放过去大概是个 14/24 左右吧。 A. gcd&xor (gcdxor) 首先打表,发现对于所有合法的 \((x,y)\),都…

取证-windbg和dmp,以及文件分析基本流程

.dmp文件及Dump Flie,是一种内存快照文件 说到内存快照就不得不提一下文件类型 说明 常见用途.raw 原始磁盘映像文件(Raw Image),完整保存磁盘或内存的原始二进制数据。 虚拟机快照、数字取证、系统备份。.dmp 内存…

20232422 2025-2026-1 《网络与系统攻防技术》实验二实验报告

后门原理与实践 1.1实验内容 这次的实验主要练了几种获取主机操作权限和收集信息的方法。先是用netcat配合Linux的cron定时任务,还有socat搭配系统任务计划,分别搞到了主机的操作Shell,拿到了控制主机的入口。然后用…

羊驼二次免疫的六大风险:纳米抗体制备不可忽视的 “隐形陷阱”

随着纳米抗体在肿瘤治疗、病原体检测、工业酶固定化等领域的应用拓展,对羊驼免疫及 VHH 筛选的需求持续攀升。羊驼因饲养、运输、免疫成本显著高于小鼠、兔子,市场上逐渐出现 “二次免疫” 操作 —— 即利用已免疫过…