历史上的今天

今天是:2024年08月31日(星期六)

2020年08月31日 | 用单片机制作最高精度时间系统,可移植到任何时钟程序中

发布者:见贤思奇异果 来源: 51hei关键字:单片机  高精度时间系统  移植  时钟程序 手机看文章 扫描二维码
随时随地手机看文章

可移植到任何数字时钟程序中,根据单片机型号以及晶振频率修改TH0和TL0的值。


智能日期时间累加,平闰年判断,当月天数判断功能,年计数值0~9999。


使用1秒的延迟函数,再加上时间判断计数函数的时间,误差非常大。


采用5毫秒定时器中断计数,中断触发后重置计数值并且5毫秒计数加1。


处理5毫秒计数以及时间判断计数函数,定时器仍在计数,准确触发高精度的5毫秒中断。


5毫秒计数加到200时,5毫秒计数清零并且触发时间计数函数,包含所有判断日期时间的指令在5毫秒内完成,如5毫秒内无法完成请改成更长毫秒时间中断1次,避免出现中断重入等问题。


若发现bug或其他建议意见请及时在楼下回复。


下面是源码:

#include "reg51.h"

#include "intrins.h"

sfr AUXR   = 0x8E;

sbit led=P3^2; //秒闪烁指示灯

#define ui unsigned int

#define uc unsigned char

ui y; //定义变量年

uc m,d,h,i,s,w; //定义变量月、日、时、分、秒、周

uc ms5; //5毫秒定时器中断计数

void InitTimer0(void){ //初始化5毫秒定时器,根据晶振频率修改TH0和TL0的值。

    TMOD = 0x01;

    TH0 = 0x28;

    TL0 = 0x00;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

}


bit if_leap_year(ui y){ //平闰年检测,闰年返回1,平年返回0

  //闰年是4的倍数且不是100的倍数或者是400的倍数,否则是平年。

if((y%4 == 0 && y%100 != 0) || y%400 == 0){

return 1; //返回1表示闰年

} else { //否则就是平年

return 0; //返回0表示平年

}

}

uc get_mon_day_nbr(ui y,uc m){ //通过年月获取该月有多少天

if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) { //大

月则31天

  return 31;

}

if(m == 4 || m == 6 || m == 9 || m == 11){ //小月则30天

  return 30;

}

  if(m == 2){ //2月

   if(if_leap_year(y) == 1){ //闰年29天

   return 29;

   } else { //平年28天

   return 28;

   }

  }

return 0;

}


bit dt_is_ok(ui y,uc m,uc d,uc w,uc h,uc i,uc s){ //检测设置的日期时间格式是否有效 1有

效0无效

if(w > 7 || w < 1) return 0; //星期大于7或小于1 返回0

if(y > 9999 || m > 12 || m < 1 || d < 1) return 0; //年大于999 或 月大于12 或

月小于1 或日小于1 返回0

if(d > get_mon_day_nbr(y,m)) return 0; //通过年月获取当月天数 大于该值 返回0

if(h > 23 || i > 59 || s > 59) return 0; //时大于23 或 分大于59 或秒大于59 返回

0

return 1; //检测有效 返回1

}

bit set_time(ui yy,uc mm,uc dd,uc ww,uc hh,uc ii,uc ss){ //设置日期时间

  if(dt_is_ok(yy,mm,dd,ww,hh,ii,ss) == 1){  //检查日期时间格式有效

  y=yy;m=mm;d=dd;w=ww; //设置年月日周

  h=hh;i=ii;s=ss; //设置时分秒

  return 1;  //设置成功 返回1

  } else { //格式无效 返回0

  return 0;

}

}


void add_time(){ //时间步进1秒

s++; //秒加1

if(s>=60){ //秒加到60

s=0; //秒清零

i++; //分加1

  if(i>=60){ //分加到60

  i=0; //分清零

  h++; //时加1

   if(h>=24){ //时加到24

   h=0; //时清零

   d++; //日加1

   w++; //星期加1

   if(w > 7){ //星期超过7

   w=1; //星期等于1

   }

    if(d > get_mon_day_nbr(y,m)){  //日超过当前年月的天数

    d=1; //日清1

    m++; //月加1

     if(m > 12){ //月加到12以上

     m=1; //月清1

     y++; //年加1

      if(y >= 10000){ //年加到10000

      y=0; //年清零

      }

     }

    }

   }

  }

}

}


void main(){ //入口函数,上电复位后在此开始执行指令。

P3=0xFF; //设置P3口全部为高电平

set_time(2000,1,1,6,0,0,0); //设置日期时间

    AUXR |= 0x80;  //关闭定时器0的12分频

    InitTimer0(); //初始化5毫秒定时器

//死循环内可添加其他程序,只有中断触发后退出,中断返回后继续在原地运行程序。

  while(1);


  }

void Timer0Interrupt(void) interrupt 1{ //5毫秒定时器中断

//重置TH0与TL0的值,根据晶振频率修改TH0和TL0的值。

    TH0 = 0x28;

    TL0 = 0x00;

   ms5++; //5毫秒中断计数加1

    if(ms5%100 == 0)led=~led;

     //5毫秒中断计数加到200 200*5=1000毫秒 1秒触发1次

    if(ms5 >= 200){

    ms5=0; //5毫秒计数清零

    add_time(); //时间步进1秒

    }

   


}


关键字:单片机  高精度时间系统  移植  时钟程序 引用地址:用单片机制作最高精度时间系统,可移植到任何时钟程序中

上一篇:单片机+LCD1602+HR-04显示屏显示超声波测距工作原理
下一篇:STC15408AS单片机的EEPROM测试程序

推荐阅读

据CNET报道,一封流出的Faraday Future(法拉第未来)CEO办公室邮件显示,周一成功试产了第一辆全功能的FF91电动SUV,他们在计划的时间之内做到了这一点。 FF公司定于当地时间8月28日上午11点(北京时间8月29日凌晨2点)在加州的汉福德工厂举行庆祝活动,不过仅有少量人可以出席。 全球CEO贾跃亭在信中表示,FF91将为用户打造第三个互联网生活空间。 ...
2015年,达芬奇手术机器人剥葡萄皮的视频在YouTube上公布,一时技惊四座。而今,现有的手术机器人已经可以做到在不破坏薄膜前提下剥鹌鹑蛋,缝合2毫米超细胶管后无液体渗漏,而这一次,背后技术力量来自国内的器械企业深圳市精锋医疗科技有限公司。 了解到,精锋医疗研发的单孔手术机器人突破了达芬奇手术机器人在中国的专利封锁,并早在2018年5月就开...
今年,一加推出了OnePlus Nord,这是该品牌自2015年 OnePlus X以来的第一款中端智能手机,不过最新消息确认这款产品并不会在中国大陆发售。不过,Nord 的推出标志着一加战略的转变:制造高性价比的智能手机。不过,除了智能手机之外,一加已经推出了 OnePlus Buds 耳机、OnePlus TV 智能电视等其它产品,提供多样化的产品组合。目前,一加似乎还...
近日,紫光国微发布公告,北京一中院裁定对紫光集团及其子公司北京紫光通信、北京紫光资本管理有限公司、西藏紫光大器投资有限公司、西藏紫光卓远、西藏紫光通信投资有限公司、西藏紫光春华投资有限公司(合称 " 紫光集团等七家公司 ")实质合并重整,并指定紫光集团管理人担任紫光集团等七家公司实质合并重整管理人。今年7月中旬,紫光股份等公司曾披...

史海拾趣

问答坊 | AI 解惑

傅立叶-Philips西安嵌入式技术研讨会

时间、地点:7月5日13:00-18:00   西安  交通大学学术报告厅 会议内容: 一.  JTAG仿真器在项目研发中的应用,游刃有余完成任务!详细讲解JTAG仿真器的工作原理详细讲解基于ARM芯片的JTAG调试原理高效使用JTAG仿真器完成项 ...…

查看全部问答∨

基于SDA80D51的以太电话机的设计

本文提出了一种新型以太电话机的设计,采用SDA80D51芯片作为主控单元,同时使用RTL8019AS作为网络接口模块,实现了高度集成、具有较高性价比的话机。同时,还针对嵌入式系统硬件资源受限的特点,提出了一系列优化代码和数据存储空间的方法和技巧。…

查看全部问答∨

QUARTUS怎么设置全局信号?

在QUARTUS里设置全局信号,是不是只要在ASSIGNMENT EDITOR把某一信号设置成全局信号就成,我这么设置,为什么编译的时候说没有声明?…

查看全部问答∨

如何更改DSP头文件的路径?

默认情况下DSP的头文件同PJt工作文件在一个目录下,如果要更改头文件的目录的话,如何实现啊?…

查看全部问答∨

求助:芯片时序图的详细介绍?

---〓×〓×〓×〓×〓---Addr/DATA 请问上述地址与数据复用时序图中,为什么会有上下两根信号线? 一般的不都是一根的信号线吗,如:s0 s1 s2____/---\\_______ 不知道哪有芯片时序图的详细介绍书籍没?麻烦知道的给指点下,谢谢…

查看全部问答∨

淘宝上买的山寨ST-LINK,出现灵异现象

贪便宜,在淘宝上买了个山寨的ST-LINK。 现在出现了奇怪的问题。 我用的是STM8S207S6,单片机工作电压是5V. ST-LINK的SWIM口,其供电电压时3.3V。 当我的板子不供电的时候,我直接连ST-LINK,由它来供电,我可以把软件down到单片机,并且在 ...…

查看全部问答∨

电子大赛需准备的模块,还有一些其他资料,各人觉得还可以

本帖最后由 paulhyde 于 2014-9-15 03:17 编辑 希望 大家有啥好资料 能分享,, 另外为了下载里面的资料  本尊只有给宝典定个价了,希望大家理解      …

查看全部问答∨

设计一个基于msp430的容积式流量计

具有4~20mA ,RS485,脉冲,三种输出。…

查看全部问答∨

2012 年 6 月份编程语言排行榜

亮点:Haskell迅速接近前20上个月我们问道哪种语言将会成为下一个新的热门语言?我们提出了Scala,Erlang和Clojure。很明显,新语言来自函数式编程领域。一 种面向过程的语言,Haskell没有被明显得提及。这个月它从35名上升到25名。从Tiobe趋势图来 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved