📄 chepin.c
字号:
#include <reg52.H>
unsigned char code Tab[]={ 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,
0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00,};
unsigned char cfDispPos=0;
unsigned long ifTimes=0;
unsigned long Freq=0;
unsigned long DispNow;
bit bfComplete=0;
bit bfTesting=0;
unsigned char Method=0;
sbit KEY=P3^7;
void Delay(int t)
{
while(t--);
}
void StartFreq(unsigned char Method)
{
switch(Method)
{
case 0:
{
EX0=1; //从中断开定时器,测周法
IT0=1;
TMOD=0x51; //Timer0 for precise Time
EA=1;
break;
}
case 1:
{
//计数测频法
TH0=0xf8;TL0=0x30; //1ms
ifTimes=0;
TMOD=0x51; //Time0 for precise Time ,Timer1 for counter
TH1=0;TL1=0;
EA=1; ET0=1; TR0=1;TR1=1;ET1=1;
PT1=1;
}
default:break;
}
}
void timer0 (void) interrupt 1
{
switch(Method)
{
case 0: //用于计数功能
ifTimes++;
break;
case 1: //work with T1
TH0=0xf8; TL0=0x30; //1ms
ifTimes++;
if(ifTimes>2000) //2s
{
TR1=0;
TR0=0;
EA=0;
ET0=0;
ET1=0;
Freq+=(TH1*256+TL1);
Freq=Freq*10/2; //Keep One bit for '.'
if(Freq>900000)Freq=0;
bfComplete=1;
}
break;
default:break;
}
}
void timer1(void) interrupt 3
{
Freq+=65536;
}
void EX0_IRQ(void) interrupt 0 //测周法使用
{
if(!bfTesting) //first falling edge
{
TH0=0x0;TL0=0x0; //1ms
ifTimes=0;
ET0=1; TR0=1; //Timer0 for Time
bfTesting=1;
}
else //second falling edge
{
EA=0;TR0=0; ET0=0; EX0=0;
Freq=(ifTimes*65536+256*TH0+TL0)*1/2;// us S
Freq=10000000/Freq; //Keep one bit for '.'
bfComplete=1;
}
}
void SystemInitial(void)
{
SCON=0X00;
//TH0=0xfc;TL0=0x18; //0.5ms
StartFreq(Method);
}
void main(void)
{
SystemInitial();
while(1)
{
if(!KEY)
{
Delay(2000);
if(!KEY)
{
while(!KEY);
if(Method)
Method=0;
else Method=1;
DispNow=0;
StartFreq(Method);
}
}
if(bfComplete)//开始测量
{
DispNow=Freq;
Freq=0;
bfComplete=0;
bfTesting=0;
StartFreq(Method);
}
{//显示
switch(cfDispPos)
{
case 0:P2=0x6E; P0=0xFE;break;
case 1:P2=Tab[DispNow/1%10]; P0=0xFD;break;
case 2:P2=Tab[DispNow/10%10]|(~Tab[8]); P0=0xFB;break;
case 3:P2=Tab[DispNow/100%10]; P0=0xF7;break;
case 4:P2=Tab[DispNow/1000%10]; P0=0xEF;break;
case 5:P2=Tab[DispNow/10000%10]; P0=0xDF;break;
case 6:P2=Tab[DispNow/100000%10]; P0=0xBF;break;
case 7:if(Method)P2=0x02;else P2=0; P0=0x7F;break;
}
Delay(100);cfDispPos++;
if(cfDispPos>=8){cfDispPos=0;}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -