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

发布者:见贤思奇异果最新更新时间: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测试程序

推荐阅读最新更新时间:2024-11-10 13:16

基于tiny4412的Linux内核移植 -- PWM子系统学习(七)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 概述 Exynos4412一共可以输出4路PWM(timer0、timer
[单片机]
基于tiny4412的Linux内核<font color='red'>移植</font> -- PWM子<font color='red'>系统</font>学习(七)
PIC单片机该如何选型?PIC单片机选型参考
单片机的选型是一件重要而费心的事,如果选型得当,则做出来的产品就会性价比较高,且工作稳定;反之,则可能会造成产品成本过高或影响产品正常运行,甚至可能根本就达不到预先设计要求。 PIC12CXXX家族产品为Microchip功能强大的基于RISC的PICmicro系列8号|脚DIP及SOIC封装。PIC12CXXX产品具有12或14位宽指令集,2.5V低运行电压,小封装引脚,中断处理,深硬件堆栈,多通道以及EEPROM数据存储器。这些智能级特性由于价格与尺寸的原因在以前的产品中是不具备的。 PIC单片机该如何选型?PIC单片机选型参考 PIC16C5X家族具有全套基础产品,为您提供最有效的价格解决方案。PIC16C5X产品具
[单片机]
PIC<font color='red'>单片机</font>该如何选型?PIC<font color='red'>单片机</font>选型参考
基于单片机控制的温度智能控制系统
一、引言 针对实验室等对温度极其敏感的一些大型公共场合,为达到对其温度的良好控制,本文从实用的角度以AT89C51为核心设计了一套温度智能控制系统。实践证实,本系统运行情况良好且经济可靠。 二、硬件组成: 本系统主要是针对实验室等一些大型公共场所的温度进行控制。因此我们要求的温度不是一个点,而是一个范围,因此我们设定了一个温度点,在此温度点的上下限四周设定一个回差带,如下图所示。 图1温度越限控制示意图 针对以上情况,本系统以AT89C51单片机为核心,组成一个集温度的采集、处理、显示、自动控制为一身的闭环控制系统,其原理框图见图2。图中硬件组成主要由以下几部分组成:单片机信息处理、温度采集、信号转换、显示、
[单片机]
基于<font color='red'>单片机</font>控制的温度智能控制<font color='red'>系统</font>
PIC单片机学习遇到的一些问题
1、中断优先级 中断优先级的设置虽然能够比较合理的管理资源,但是如果在中断里写太多内容会导致另一个中断可能永远进不去的现象。比如在定时器中断里定20ms,但是中断里面处理的代码量太多超过20ms,则会出现另一个中断优先级低的刚等待定时器执行完要开始执行时,定时时间到了又进定时中断。如此循环低优先级的中断永远也进不去。(给低优先级中断IE位重新复位可以在短时间无视优先级执行,不过过一段时间也会出现上述情况。作者亲身试过的bug) 2、AD采样出现波动大的问题 有时程序出现AD采样的数值波动大往往是因为可能这时候的供电情况不同,可能你跟原先状态比关闭了什么开启了什么。如开关GPS、开关功放导致的。 3、XC编译器与系统不兼容问
[单片机]
555定时器芯片实现单片机看门狗电路
1、程序跑飞现象 随着单片机在能源领域中的广泛应用,单片机的抗干扰问题越来越突出,煤矿井下环境一般比较恶劣,这便会为单片机控制系统带来各种干扰,以致系统不能正常工作。单片机应用系统的抗干扰性能主要取决于硬件的抗干扰设计,但软件 抗干扰设计作为硬件抗干扰的完善和补充,作用也非常重要,因为大量的干扰通常并不能影响系统内硬件的运作,却常会使系统的软件无法正常运行,单片机应用的一个突出问题,便是单片机运行过程中经常出现的程序跑飞现象。 在单片机系统中,因为干扰的原因,在非预期的情况下,使得程序计数器PC 的值发生随机的变化,从而使得程序的流向指向不确定区域,这便是程序的跑飞。程序跑飞后或者会使指令的地址码和操作码发生改变,PC 把操作数当作
[单片机]
555定时器芯片实现<font color='red'>单片机</font>看门狗电路
51单片机最小系统制作步骤
这篇博客就来分享一下51单片机最小系统的制作以及怎么下载程序 首先准备的材料有:一块板子,一块89c51/52的芯片,一个51芯片插座,12MHZ的晶振,一个10的电阻,一个10uf的电解电容 两个20-33pf的瓷片电容,线若干,小开关一个 电路图如下: 那个小开关就是复位开关,制作好了大家可以下载一个小程序看看。。。。。。 最小系统制作非常容易,但是我下载程序时都是先把程序放到开发板上烧好在插入底座中,但是一般的底座由于结构问题,和51单片机芯片针脚太软了,多插几次容易就断掉,所以接下来我就来分享一下怎么不把芯片拔出来就可以任意烧程序(当然有usb转串口就忽视这个方法) 首先把开发板的芯片拔下来,把自己焊的最小系
[单片机]
51<font color='red'>单片机</font>最小<font color='red'>系统</font>制作步骤
第24节:乘法运算的5种常见格式
从业十年,教你单片机入门 第24讲: 请先看以下的乘法语法格式: 保存变量 = 被乘数1 * 乘数2 *... * 乘数N ; 含义是:右边的 被乘数 与各 乘数 相乘,并且把最终的运算结果赋值给左边的 保存变量 。注意,这里的符号 = 不是等于号的意思,而是赋值的意思。左边的 保存变量 必须是变量,不能是常量,否则编译时会报错。右边的 被乘数 和 乘数 既可以是变量,也可以是常量,也可以是 保存变量 本身自己。多说一句,何谓变量和常量?变量是可以在程序中被更改的,是被分配的一个RAM空间。常量往往是数字,或者是被分配在ROM空间的一个具体数值。下面根据右边 被乘数 与 乘数 的不同组合,列出了乘法运算的5种常见格式。 第1种
[单片机]
你了解GD32 MCU的命名规则吗
下面为大家介绍GD32 MCU的通用命名规则,以GD32F303ZGT6为例,其中,GD32代表GD32 MCU,F代表通用系列产品类型,303代表303产品子系列,Z代表144引脚数,G代表1MB Flash容量,T代表LQFP封装,6代表-40-85°温度等级。 命名规则详细说明如下表所示。 字符 说明 列举 GD32 代表GigaDevice 32位MCU 无 F 代表产品类型 F:SIP通用系列;E:eFlash嵌入式增强系列;L:超低功耗系列;VF:RISC-V系列;W:Wi-Fi无线系列;H:H7高性能系列;A:车规系列。 303 代表产品子系列 GD32F10X、GD32F1X0、GD32F20X、GD
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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