打印

软件日历时钟的实现

[复制链接]
1539|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangfeng33|  楼主 | 2012-4-4 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
时钟计时的关键问题是秒的的生,因为秒是最小时钟单位,但MCS51的定时器,其最大定时时间也只能达到65ms ,离1s还很远。为此要把秒计时用硬件定时和软件计数相结合的方法来实现,即:把定时器的定时时间定为50ms,这增计数溢出20次就可能得到1s.


****************************************************************************
本节程序主要通过定时器完成软件计时,实时显示时间。
缺点:断电后或者复位后,实践需要重新设置
******************************************************************************
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
Uchar sec ,min,hour               ; 参数时、分、秒
Uchar  cnter1  cnter2
Void main(void)
{
    Settime();
    While(1)
{;}
}
/* 定时器0中断服务子程序 */
void timer0() interrupt 1 using 1
{
while(cnter1--)                  ;20次中断未到中断退出
{
ET0=0;            //关T0中断允许
TR0=0;        //关闭定时器T0
              TH0 = -5000/256;  // 重设计数初值
          TL0 = -5000%256;
TR0=1;           ;开启定时器T0
return;
}
cnter1=0x14;
sec++;
if(sec>=60)
    {
min++;
if(min>=60)                  小于60分时中断退出
{
hou++
if(hour>=24)
  {hour=0x00;}           ;大于或等于24小时小时计时单元清0
return;
}
ET0=1;
          return;
}
}
         
                                       
/* 定时器1中断服务子程序,实现0.4s定时刷新
void timer1() interrupt 3 using 3
{
while(cnter2--)
{
ET1=0;            //关T0中断允许
TR1=0;        //关闭定时器T0
              TH1 = -5000/256;  // 重设计数初值
          TL1 = -5000%256;
         return;
}
   timenum();         //时、分、秒的显示数据计算
   display();          //调用显示时间程序
cnter=0x08
return;
}

相关帖子

沙发
拿起书本| | 2012-4-7 17:49 | 只看该作者
软件时钟程序设计的关键是1s定时时间修正,对于C语言程序,很难对程序运行时间作比较精确的计算,从而对定时间作精确的修正。用汇编可以通过分析程序代码执行时间进行修正,得到比较精确的1s定时时间。

使用特权

评论回复
板凳
tianli1980| | 2012-4-7 21:53 | 只看该作者
通过定时器完成软件计时,实时显示时间,但有个缺点。
断电后或者复位后,时间需要重新设置。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝