找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 43274|回复: 190
收起左侧

用单片机制作最高精度时间系统,可移植到任何时钟程序中

  [复制链接]
ID:57657 发表于 2016-9-27 18:36 | 显示全部楼层 |阅读模式
用单片机制作最高精度时间系统,可移植到任何时钟程序中
可移植到任何数字时钟程序中,根据单片机型号以及晶振频率修改TH0和TL0的值。
智能日期时间累加,平闰年判断,当月天数判断功能,年计数值0~9999。
使用1秒的延迟函数,再加上时间判断计数函数的时间,误差非常大。
采用5毫秒定时器中断计数,中断触发后重置计数值并且5毫秒计数加1。
处理5毫秒计数以及时间判断计数函数,定时器仍在计数,准确触发高精度的5毫秒中断。
5毫秒计数加到200时,5毫秒计数清零并且触发时间计数函数,包含所有判断日期时间的指令在5毫
秒内完成,如5毫秒内无法完成请改成更长毫秒时间中断1次,避免出现中断重入等问题。
若发现bug或其他建议意见请及时在楼下回复。
下面是源码:


  1. #include "reg51.h"
  2. #include "intrins.h"
  3. sfr AUXR   = 0x8E;
  4. sbit led=P3^2; //秒闪烁指示灯
  5. #define ui unsigned int
  6. #define uc unsigned char
  7. ui y; //定义变量年
  8. uc m,d,h,i,s,w; //定义变量月、日、时、分、秒、周
  9. uc ms5; //5毫秒定时器中断计数
  10. void InitTimer0(void){ //初始化5毫秒定时器,根据晶振频率修改TH0和TL0的值。
  11.     TMOD = 0x01;
  12.     TH0 = 0x28;
  13.     TL0 = 0x00;
  14.     EA = 1;
  15.     ET0 = 1;
  16.     TR0 = 1;
  17. }

  18. bit if_leap_year(ui y){ //平闰年检测,闰年返回1,平年返回0
  19.   //闰年是4的倍数且不是100的倍数或者是400的倍数,否则是平年。
  20. if((y%4 == 0 && y%100 != 0) || y%400 == 0){
  21. return 1; //返回1表示闰年
  22. } else { //否则就是平年
  23. return 0; //返回0表示平年
  24. }
  25. }
  26. uc get_mon_day_nbr(ui y,uc m){ //通过年月获取该月有多少天
  27. if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) { //大
  28. 月则31天
  29.   return 31;
  30. }
  31. if(m == 4 || m == 6 || m == 9 || m == 11){ //小月则30天
  32.   return 30;
  33. }
  34.   if(m == 2){ //2月
  35.    if(if_leap_year(y) == 1){ //闰年29天
  36.    return 29;
  37.    } else { //平年28天
  38.    return 28;
  39.    }
  40.   }
  41. return 0;
  42. }

  43. bit dt_is_ok(ui y,uc m,uc d,uc w,uc h,uc i,uc s){ //检测设置的日期时间格式是否有效 1有
  44. 效0无效
  45. if(w > 7 || w < 1) return 0; //星期大于7或小于1 返回0
  46. if(y > 9999 || m > 12 || m < 1 || d < 1) return 0; //年大于999 或 月大于12 或
  47. 月小于1 或日小于1 返回0
  48. if(d > get_mon_day_nbr(y,m)) return 0; //通过年月获取当月天数 大于该值 返回0
  49. if(h > 23 || i > 59 || s > 59) return 0; //时大于23 或 分大于59 或秒大于59 返回
  50. 0
  51. return 1; //检测有效 返回1
  52. }
  53. bit set_time(ui yy,uc mm,uc dd,uc ww,uc hh,uc ii,uc ss){ //设置日期时间
  54.   if(dt_is_ok(yy,mm,dd,ww,hh,ii,ss) == 1){  //检查日期时间格式有效
  55.   y=yy;m=mm;d=dd;w=ww; //设置年月日周
  56.   h=hh;i=ii;s=ss; //设置时分秒
  57.   return 1;  //设置成功 返回1
  58.   } else { //格式无效 返回0
  59.   return 0;
  60. }
  61. }

  62. void add_time(){ //时间步进1秒
  63. s++; //秒加1
  64. if(s>=60){ //秒加到60
  65. s=0; //秒清零
  66. i++; //分加1
  67.   if(i>=60){ //分加到60
  68.   i=0; //分清零
  69.   h++; //时加1
  70.    if(h>=24){ //时加到24
  71.    h=0; //时清零
  72.    d++; //日加1
  73.    w++; //星期加1
  74.    if(w > 7){ //星期超过7
  75.    w=1; //星期等于1
  76.    }
  77.     if(d > get_mon_day_nbr(y,m)){  //日超过当前年月的天数
  78.     d=1; //日清1
  79.     m++; //月加1
  80.      if(m > 12){ //月加到12以上
  81.      m=1; //月清1
  82.      y++; //年加1
  83.       if(y >= 10000){ //年加到10000
  84.       y=0; //年清零
  85.       }
  86.      }
  87.     }
  88.    }
  89.   }
  90. }
  91. }
  92. void main(){ //入口函数,上电复位后在此开始执行指令。
  93. P3=0xFF; //设置P3口全部为高电平
  94. set_time(2000,1,1,6,0,0,0); //设置日期时间
  95.     AUXR |= 0x80;  //关闭定时器0的12分频
  96.     InitTimer0(); //初始化5毫秒定时器
  97. //死循环内可添加其他程序,只有中断触发后退出,中断返回后继续在原地运行程序。
  98.   while(1);

  99.   }
  100. void Timer0Interrupt(void) interrupt 1{ //5毫秒定时器中断
  101. //重置TH0与TL0的值,根据晶振频率修改TH0和TL0的值。
  102.     TH0 = 0x28;
  103.     TL0 = 0x00;
  104.    ms5++; //5毫秒中断计数加1
  105.     if(ms5%100 == 0)led=~led;
  106.      //5毫秒中断计数加到200 200*5=1000毫秒 1秒触发1次
  107.     if(ms5 >= 200){
  108.     ms5=0; //5毫秒计数清零
  109.     add_time(); //时间步进1秒
  110.     }
  111.    

  112. }
复制代码


评分

参与人数 7黑币 +155 收起 理由
得不到 + 5 共享资料的黑币奖励!
h832ea + 9 赞一个!
liyz + 5 很好的代码
ssfc + 5 赞一个!
1007327969 + 1 很给力!
sunlei058378 + 30 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:941265 发表于 2021-7-29 09:13 | 显示全部楼层
51黑有你更精彩
回复

使用道具 举报

ID:57657 发表于 2021-7-29 07:24 | 显示全部楼层
刀客猫 发表于 2021-7-27 11:58
楼主 这个没有显示吧,只是内部计数

没有的,显示自己加。
回复

使用道具 举报

ID:469239 发表于 2021-7-27 11:58 | 显示全部楼层
楼主 这个没有显示吧,只是内部计数
回复

使用道具 举报

ID:243748 发表于 2017-11-25 16:42 来自触屏版 | 显示全部楼层
看不懂,来学习下
回复

使用道具 举报

ID:198298 发表于 2017-5-8 23:46 | 显示全部楼层
一起学习
回复

使用道具 举报

ID:77498 发表于 2017-5-1 20:41 | 显示全部楼层

看看吧,反正也不懂
回复

使用道具 举报

ID:149764 发表于 2017-4-1 16:27 | 显示全部楼层
蛮不错的
回复

使用道具 举报

ID:155746 发表于 2017-2-27 00:53 | 显示全部楼层
谢谢分享啊!!
回复

使用道具 举报

ID:99612 发表于 2017-2-23 21:28 | 显示全部楼层
学习了
回复

使用道具 举报

ID:22995 发表于 2017-2-22 20:38 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:71508 发表于 2017-2-22 19:35 | 显示全部楼层
谢谢~~~~~~~~~~~~
回复

使用道具 举报

ID:161933 发表于 2017-2-22 19:12 | 显示全部楼层
用单片机制作最高精度时间系统,可移植到任何时钟程序中
回复

使用道具 举报

ID:165913 发表于 2017-2-22 15:19 | 显示全部楼层
看看  总是对自己有帮助
回复

使用道具 举报

ID:161785 发表于 2017-2-22 09:46 来自触屏版 | 显示全部楼层
很需要,谢谢。
回复

使用道具 举报

ID:165878 发表于 2017-2-22 09:16 | 显示全部楼层
观摩观摩。。。。
回复

使用道具 举报

ID:165792 发表于 2017-2-21 22:52 | 显示全部楼层
很好的代码
回复

使用道具 举报

ID:21740 发表于 2017-2-18 08:18 | 显示全部楼层
谢谢分享!!!!!!
回复

使用道具 举报

ID:112517 发表于 2017-2-18 00:34 | 显示全部楼层
这个要学习学习,谢谢楼主
回复

使用道具 举报

ID:112517 发表于 2017-2-18 00:24 | 显示全部楼层

看看是什么好东东
回复

使用道具 举报

ID:65893 发表于 2017-2-17 17:39 | 显示全部楼层
误差来源晶振的精度
回复

使用道具 举报

ID:91162 发表于 2017-2-17 09:29 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:164579 发表于 2017-2-16 15:06 | 显示全部楼层
刚入门,向高手学习学习
回复

使用道具 举报

ID:164735 发表于 2017-2-16 10:36 | 显示全部楼层
新手学习中,谢谢分享源码参考。
回复

使用道具 举报

ID:164089 发表于 2017-2-15 21:45 来自触屏版 | 显示全部楼层
shawengang 发表于 2017-2-14 18:44
我以前下载过了吗?

看看研究一下。
回复

使用道具 举报

ID:163480 发表于 2017-2-14 18:44 | 显示全部楼层
我以前下载过了吗?
回复

使用道具 举报

ID:164483 发表于 2017-2-14 18:00 | 显示全部楼层
怎么能看到?
回复

使用道具 举报

ID:164483 发表于 2017-2-14 17:59 | 显示全部楼层
非常想看看。
回复

使用道具 举报

ID:162242 发表于 2017-2-14 15:53 | 显示全部楼层
成更长毫秒时间中断1次
回复

使用道具 举报

ID:47652 发表于 2017-2-14 08:08 | 显示全部楼层
看看,有新意?
回复

使用道具 举报

ID:139093 发表于 2017-2-13 20:51 | 显示全部楼层
很好。。。。。
回复

使用道具 举报

ID:59202 发表于 2017-2-13 01:53 | 显示全部楼层
加上误差校正就完美了
回复

使用道具 举报

ID:14052 发表于 2017-2-12 15:04 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:164151 发表于 2017-2-10 16:38 | 显示全部楼层
一定很不错
回复

使用道具 举报

ID:55584 发表于 2017-2-10 15:07 | 显示全部楼层
赞一个!赞赞赞
回复

使用道具 举报

ID:55584 发表于 2017-2-10 15:04 | 显示全部楼层
很好的代码赞一个!
回复

使用道具 举报

ID:47286 发表于 2017-2-9 18:43 | 显示全部楼层
我也想学习楼主的程序
回复

使用道具 举报

ID:74145 发表于 2017-2-8 21:07 | 显示全部楼层
来学习学习~~~
回复

使用道具 举报

ID:65286 发表于 2017-2-7 19:24 | 显示全部楼层
谢谢分享!!!!!
回复

使用道具 举报

ID:137676 发表于 2017-2-1 01:49 | 显示全部楼层
给力,正是我需要的,谢谢分享
回复

使用道具 举报

ID:163075 发表于 2017-1-29 13:24 | 显示全部楼层
感谢分享啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表