
#pragma cd pl(9999)
#include <reg51.h>

typedef unsigned char u8;

//#define	XTAL	12e6
#define	XTAL	11.0592e6

#define TH0_RELOAD	(XTAL / 12 / 256 * 50e-3)
#define TH0_REMAIN	((TH0_RELOAD - (u8)TH0_RELOAD) * 20 + 0.5)

bit one_second;
u8 count_50ms;


void t0_init( void )
{
  TMOD = 1;	// T0: Mode 1 (16 Bit)
  TR0 = 1;
  ET0 = 1;
}


void t0_int( void ) interrupt INT_T0
{
  TH0 = -TH0_RELOAD;

  if( count_50ms <= (u8)TH0_REMAIN )	// handle remainder
    TH0--;

  if( --count_50ms )
    return;

  count_50ms = 20;		// 1sec = 20 * 50msec
  one_second = 1;
}


void main( void )
{
  t0_init();
  EA = 1;
  for(;;){
    if( one_second ){
      one_second = 0;
      P2++;
    }
  }
}


#if 0

at 12MHz:

~50msec: 49.92 msec
~1sec:   0.999936 sec (5sec/day)

#endif
