51单片机8位数码管显示数字电子钟

该程序写入单片机后,开发板显示时间过快,请问是什么问题呢?
#include<reg52.h> //数码管显示电子时钟
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6; //段选
sbit wela = P2^7; //位选
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //段码
uint minute, hour , second,h1, h2, m1, m2, s1 ,s2, count;
void delay(uint z) //延时函数
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函数
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
hour = 0;
minute = 0;
second = 0;
count = 0;
}
void display() //显示函数
{
dula=1;//控制段选
P0=table[s2]; //秒个位
dula=0;
P0=0xff;//消影先不送
wela=1;//控制位选
P0=0X7f;
wela=0;
delay(1);

    dula=1;//控制段选
    P0=table[s1]; //秒十位
    dula=0;
    P0=0xff;//消影先不送
    wela=1;//控制位选
    P0=0Xbf;
    wela=0;
    delay(1);

    dula=1;//控制段选
    P0=table[m2];//分个位数
    dula=0;
    P0=0xff;
    wela=1;//控制位选
    P0=0Xef;
    wela=0;
    delay(1);
    
    dula=1;//控制段选
    P0=table[m1];//分十位数
    dula=0;
    P0=0xff;
    wela=1;//控制位选
    P0=0Xf7;
    wela=0;
    delay(1);

    dula=1;//控制段选
    P0=table[h2];//时个位数
    dula=0;
    P0=0xff;//消影先不送
    wela=1;//控制位选
    P0=0Xfd;
    wela=0;
    delay(1);

    dula=1;//控制段选
    P0=table[h1];//时十位数
    dula=0;
    P0=0xff;//消影先不送
    wela=1;//控制位选
    P0=0Xfe;
    wela=0;
    delay(1);

}
void timer0() interrupt 1//定时器0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count == 40)
count = 0;
second ++ ;
if(second == 60)
{
second = 0;
minute ++;
if(minute == 60)
{
minute = 0;
hour ++;
if(hour == 24)
{
hour = 0;
}
}
}
s2 = second % 10;
s1 = second / 10;
m2 = minute % 10;
m1 = minute /10;
h2= hour % 10;
h1 = hour / 10;
}
void main()
{
dula = 0;
wela = 0;
init();
while(1)
{
display();
}
}

太快肯定是因为定时器中断频率太高了,可能是定时器设置参数与系统时钟不对应。
比如,你这个代码的使用场合是12M时钟频率的情况下,但你实际的硬件是24M频率,那就快了一倍。