只能测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忙不过来了。显示程序几乎不会工作,全在忙活中断程序了。