为什么用这个程序C51只能测31.25kHz的信号,测62.5kHz的信号,数码管不输出

只能测31.5kHz,62.5kHz就不显示了,
原理是一秒时间内对信号计数。


#include<reg51.h>
#include<stdio.h>
#include<intrins.h>

code unsigned char stop[3] _at_ 0x3b; 

unsigned char n1=0,time_i=0,x0,x10,x100,x1000,x10000;
unsigned  int x=0;
unsigned char cod[]={
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void xianshi();
void delay(int xms);
void main()
{
    TMOD=0x01;
    TH0=0x4c;
    TL0=0x00;
    EA=1;
    ET0=1;
    TR0=1;
    EX0=1;
    IT0=1;
    while(1)
    {
        if(n1) 
        {
        xianshi();
        }
    }
}

void xianshi()
{
    x0=(x-50)%10;
    x10=((x-50)%100)/10;
    x100=((x-50)%1000)/100;
    x1000=((x-50)%10000)/1000;
    x10000=(x-50)/10000;
    
    P2=cod[x0];
    P1=0xfe;
    delay(1);
    P1=0xff;
    delay(10);
    
    P2=cod[x10];
    P1=0xfd;
    delay(1);
    P1=0xff;
    delay(10);
    
    P2=cod[x100];
    P1=0xfb;
    delay(1);
    P1=0xff;
    delay(10);
    
    P2=cod[x1000];
    P1=0xf7;
    delay(1);
    P1=0xff;
    delay(10);
    
    P2=cod[x10000];
    P1=0xef;
    delay(1);
    P1=0xff;
    delay(10);
}
void time0_int(void) interrupt 1
{
    TH0=0x4c;TL0=0x00;
    time_i++;
    if(time_i==20)
    {n1=1;EA=0;}
}

void INT0_int(void) interrupt 0
{
    x++;
}


void delay(int xms)
{
    unsigned int xt,y;
    for(xt=xms;xt>0;xt--)
    for(y=14;y>0;y--);
}

第9行 改成
unsigned long x=0;
没看出啥毛病,感觉 x 只有 2字节 太小,改下试试

有个可能,c51的速率跟不上了,测不了这么大的频率。
一般c51执行一条指令大概1us,进出中断及响应中断,中断执行程序的时间大概13-19us。
62.5khz 周期大概15-16us,c51忙不过来了。显示程序几乎不会工作,全在忙活中断程序了。