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

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

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

代码如下:

/*
需求:两个独立按键分别控制加减(KEY2和KEY3),一个独立按键控制移位(KEY1),且在移动到该位置时该位置闪烁。
开发板:普中-A2
*/
#include <REGX52.H>
#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.dtcms.com/a/399111.html

相关文章:

  • 条款9:优先选用别名声明,而非typedef
  • Matlab调用GPT-5 API示例
  • 猪八戒网站做软件让你有做黑客感觉的网站
  • 毕业设计指导网站建设揭阳网站推广教程
  • 安全多方计算 联邦学习 同态加密
  • 宁波新亚建设内部网站wordpress开发文档下载
  • GWO-Transformer灰狼算法优化编码器多特征分类预测/故障诊断,Matlab实现,代码解析+运行效果一览
  • 2025 化工 PLM 市场图鉴:软件厂商技术布局与行业应用,助力企业数字化转型
  • 竞品网站分析微信网站需要备案吗
  • 大模型-LLM-large language model
  • 探索生成式纠错在构音障碍语音识别中的应用
  • SCARA 机器人轨迹运动奇异点规避方法
  • 【Linux】自动化构建--make/Makefile
  • 建设银行手机网站wordpress电台
  • 同一种激光模式 高阶模式的产生会降低基模的功率吗 能降低多少?
  • 设计模式-责任链模式详解
  • CentOS7安装mysql最简单教程
  • 垂直网站建设方案南庄建网站服务
  • 【LVS入门宝典】LVS DR模式深度解析:直接路由(DR)的高性能秘诀,MAC地址欺骗与ARP隔离
  • 自做网站视频潍坊免费网站制作
  • 代理通讯篇无外网或不可达SockS全协议规则配置C2正反向上线解决方案
  • 做网站麻烦吗网页创意与设计50例
  • 建筑公司网站需求h5个人网站代码
  • Qwen-image-edit在ComfyUI部署使用
  • 跨云镜像迁移实战:阿里云 → 腾讯云
  • 二、更新源(阿里云)(更新成阿里云后,再执行上面的系统更新)
  • 域名访问网站怎么下载书籍设计网站推荐
  • Playwright UI自动化实战速成指南
  • 【11408学习记录】考研数学线性代数核心突破:初等变换与初等矩阵完全攻略
  • 两学一做知识竞赛试题网站怎样做营销型网站推广ppt