历史上的今天
返回首页

历史上的今天

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

2020年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秒

    }

   


}


推荐阅读

史海拾趣

DALLAS公司的发展小趣事

随着全球电子市场的不断扩大和变化,Dallas公司积极实施全球化战略布局。公司在全球范围内设立研发中心和生产基地,以便更好地服务全球客户。同时,Dallas公司还加强与国际知名企业的合作与交流,共同推动半导体技术的创新和应用。这种全球化战略布局不仅增强了Dallas公司的国际竞争力,也为公司的长期发展提供了广阔的空间。

南晶电子(DGNJDZ)公司的发展小趣事

南晶电子(DGNJDZ)成立于2011年,起初只是一家专注于半导体分立器件研发和生产的小型企业。创始人毛姬娜凭借其敏锐的市场洞察力和技术背景,带领团队攻克了一个又一个技术难关,逐渐在电子行业崭露头角。公司初期面临着资金短缺、技术瓶颈等重重困难,但毛姬娜和团队凭借坚韧不拔的精神,一步步走出了困境。

Advanced Optoelectronic Technology Corp公司的发展小趣事

为了进一步提高竞争力,AOTC开始寻求与上下游企业的合作。通过与原材料供应商、生产设备制造商以及销售渠道商建立紧密的合作关系,公司成功实现了产业链的整合,降低了生产成本,提高了生产效率。此外,公司还与其他科技公司开展战略合作,共同研发新产品,拓展新市场。

Dialog Semiconductor(戴乐格半导体)公司的发展小趣事

为了进一步增强市场影响力,Dialog Semiconductor通过一系列的收购策略来扩大其业务范围。例如,在2020年,公司收购了Adesto Technologies,这是一家专注于非易失性存储器(NVM)解决方案的公司。此次收购为Dialog Semiconductor带来了近5,000家新客户,并补充了其在无线连接产品之外的有线连接解决方案。同年,Dialog Semiconductor还收购了另一家公司,获得了强大的核心IC产品组合和经验丰富的工程师团队,进一步巩固了其在IoT市场的地位。

苏州锋驰(Feng)公司的发展小趣事
通过调整电阻来实现稳流控制,适用于较小的电流范围。其优点是电路简单、噪声低,但效率相对较低,特别是在输入输出电压差较大的情况下。
ET Enterprises Ltd公司的发展小趣事

随着技术的不断进步和市场需求的增长,ET Enterprises Ltd公司开始推出多种类型的光电倍增管产品,包括普通可见光型、紫外灵敏型、日盲型等。同时,公司也积极拓展国际市场,与全球各地的客户建立合作关系,进一步巩固了其在光电倍增管领域的领先地位。

问答坊 | AI 解惑

变频彩电、变频技术与逐行扫描技术

变频彩电、变频技术与逐行扫描技术 变频彩电是近几年新推出的一种无闪烁、高清晰度彩电,收视效果可与HDTV相媲美,它能够兼容数字和模拟电视标准,可以接收普通电视信号,并显示比普通电视清晰度更高、更稳定的图象;也能作为数字电视信号的显示器。因 ...…

查看全部问答>

取字模软件

取字模软件自己买[url=https://bbs.eeworld.com.cn/viewthread.php?tid=72780&extra=page%3D2&page=1&2]开发板[/url]时送的取字摸软件 很好用    要的快下啊…

查看全部问答>

PIC单片机应用专题

PIC单片机应用专题一:键盘操作 键盘是人机对话的桥梁,通过它可以实现应用系统的参数查询、修改。单片机应用系统的键盘一般用按钮或薄膜开关,本公司开发板利用RB口组成4*4=16个矩阵键盘(图1),PIC单片机的RB口一般具有有高、低电平中断功能, ...…

查看全部问答>

做好医疗电子设备的电子元器件的维修

从上世纪八十年代以来,医疗行业引进了许多先进的大型电子仪器及设备, 大到0)、核磁等,小到各种彩超、监护仪等。 随着它们的所有年限增加,陆续地从保修期进入了维修期,也有一些的设备已经进入了维修高峰期。这一点和国外发达国家医疗设备服役 ...…

查看全部问答>

GPRS频繁掉线call ready(请大侠指教)

GPRS链接上服务器后,接收数据几秒或几分钟就call ready重启了,我观察了一下出现call ready的时间间隔,没规律,随机,说明服务器没问题,用万用表测电源也没感到有问题(偶看到以前几位仁兄的帖子了),CIPSTATUS查询状态,是IP INITIAL,除了电 ...…

查看全部问答>

从PC拷贝文件到PDA和从PDA拷贝文件到PC,在PC端运行的程序和在PDA端运行的程序,如何实现?

PDA操作系统是WINCE或PPC 我用的开发环境是VS2005 如题,我一直用的文件同步功能,但是不好控制 给用户使用效果不好。 而且我想主动从电脑上拷贝一些文件到PDA没法直接做。觉得很不方便。 …

查看全部问答>

SignalTapII的使用问题

请教各位大侠关于SignalTapII应用的一个小问题。 看过一些教程,应用SignalTapII的时候直接将工程和sof文件一起编译下载到FPGA中。 那要怎样去设置输入信号的数值呢。 我要做的设计是一个编码器,需要在特定的测试用例下观测输出结果。 而调入S ...…

查看全部问答>

STM32 库函数FLASH_Erase函数的使用

假如调用FLASH_Erase的函数的参数是一个不是2KB倍数的地址,那么它会擦除成功么?具体会怎么操作?e.g.对于STM32107芯片,调用FLASH_Erase(0x0800 0400)会发生什么事情?…

查看全部问答>

【晒心得】STM32F0Discovery 收到并安装驱动

收到货啦上照片: 下面谈下我的开发环安装: 首先下载MDK V5,我是在百度云网盘上下的。大家自己找找。 然后安装一个安装包,见下图:这个安装包要用什么就装什么,我比较很把F0-F4全装 然后可以找破解文件也可不破。反正32K限制。 下面这个 ...…

查看全部问答>