//频率计
#include<reg51.h>
sbit RESET=P1^0;
unsigned char code scandisp[]={0x07,0x0b,0x0d,0x0e}; //选择数码管控制口
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char dispbuf[4]={0,0,0,0};
unsigned int count;
unsigned char i,timecount,restar=0;
//显示程序
void display()
{
for(i=0;i<4;i++)
{
P2=0xff;
P0=dispcode[dispbuf[i]];
P2=scandisp[i];
}
}
//延时程序
void delay(unsigned char us)
{
while(us--);
}
//主程序
void main(void)
{
while(1)
{
TMOD=0x15;
TH0=0;
TL0=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
ET0=0;
TR1=1;
TR0=1;
restar=0;
while(1)
{
if(RESET==0)//复位键是否按下?
{
delay(100); //防止按键抖动
if(RESET==0)
{
restar=1; //频率计重启,清零
while(RESET==0)
{
TR0=0;
TR1=0;
for(i=0;i<4;i++) dispbuf[i]=0;
display();
}
}
}
display();
if(restar==1)
break;
}
}
}
void t1(void) interrupt 3 using 1 //定时器周期为50ms
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
timecount++;
if(timecount==20) //1s周期
{
TR0=0;
TR1=0;
count=TH0*256+TL0; //1s计数器所计算的脉冲数
dispbuf[0]=count%10;
dispbuf[1]=(count/10)%10;
dispbuf[2]=(count/100)%10;
dispbuf[3]=(count/1000)%10;
TH0=0;
TL0=0;
timecount=0;
TR0=1;
TR1=1;
}
}