未使用中断的定时器会出现不准确的问题吗?

大家好,定时器定时1ms,然后累积到1000次,秒数加一,构成一个动态数码管显示的秒表,我没有使用到中断。但是,下载到学习板上,间隔的时间远大于1s,这是为什么呢?
#include

typedef unsigned char u8;
typedef unsigned int u16;

#define GPIO_LED P0

sbit LSA = P2^4;
sbit LSB = P2^5;
sbit LSC = P2^6;

u8 code smgduan[16]=
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
u8 LEDduan[8]=
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

void delay(u8 i)
{
while(i--);
}

void display()
{
u8 i = 0;
for(i=0; i<8; i++)
{
switch(i)
{
case(0): LSA = 0; LSB = 0; LSC = 0; break;
case(1): LSA = 1; LSB = 0; LSC = 0; break;
case(2): LSA = 0; LSB = 1; LSC = 0; break;
case(3): LSA = 1; LSB = 1; LSC = 0; break;
case(4): LSA = 0; LSB = 0; LSC = 1; break;
case(5): LSA = 1; LSB = 0; LSC = 1; break;
case(6): LSA = 0; LSB = 1; LSC = 1; break;
case(7): LSA = 1; LSB = 1; LSC = 1; break;
}
GPIO_LED = LEDduan[i];
delay(100);
GPIO_LED = 0x00;
}
}

void main()
{
u16 cnt = 0;
u16 num = 0;
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x18;//定时器定时1ms
TR0 = 1;
while(1)
{
if(TF0 == 1)
{
TH0 = 0xFC;
TL0 = 0x18;
TF0 = 0;
cnt++;
if(cnt == 1000)
{
cnt = 0;
num++;
}
}
LEDduan[0] = smgduan[num/10000000%10];
LEDduan[1] = smgduan[num/1000000%10];
LEDduan[2] = smgduan[num/100000%10];
LEDduan[3] = smgduan[num/10000%10];
LEDduan[4] = smgduan[num/1000%10];
LEDduan[5] = smgduan[num/100%10];
LEDduan[6] = smgduan[num/10%10];
LEDduan[7] = smgduan[num/1%10];
display();
}
}

代码段比较少,我说一下我的怀疑点。
1. 下面代码1ms执行一次,从代码量上和计算除法上认为,比较消耗执行时间。你可以把这部分临时去除,看看有没有关系。

        LEDduan[0] = smgduan[num / 10000000 % 10];
        LEDduan[1] = smgduan[num / 1000000 % 10];
        LEDduan[2] = smgduan[num / 100000 % 10];
        LEDduan[3] = smgduan[num / 10000 % 10];
        LEDduan[4] = smgduan[num / 1000 % 10];
        LEDduan[5] = smgduan[num / 100 % 10];
        LEDduan[6] = smgduan[num / 10 % 10];
        LEDduan[7] = smgduan[num / 1 % 10];
        display();
  1. 如果问题一的处理时间长,下面TF0 == 1,可能在判断之前就满足了。你把定时设定长一些,读取TF0看看时间。
    while (1)
    {
        if (TF0 == 1)
        {
  1. 不使用中断的话,如果是单片机,可以使用指令数量做时间,我觉得也还算准确。项目中常用晶振实现。