时钟计时的关键问题是秒的的生,因为秒是最小时钟单位,但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;
} |