📄 pinlvji3.c
字号:
#include<reg51.h>
unsigned char data key,flag_ft,point,buffer,j,INT1_ready,couter,couter0,bus0,bus1,cycle;
//键盘,频率判决结果,判决频率寄存,小数点位置标志,显示缓冲变量,显示循环变量,边沿触发界定,定时器0定时寄存,定时器1定时寄存,显示刷新循环寄存CT0计数值寄存,CT1计数值寄存
unsigned int data Z,delay,k,turn;//脉宽,占空比,程序延迟循环变量,
float data T,F,T_T,F_F,W;//周期,频率
unsigned char code BitTab[4]={0x7f,0xbf,0xdf,0xef};//位驱动码
unsigned char code DispTab[]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0xf7};//字形码
/* 0 1 2 3 4 5 6 7 8 9 - */
unsigned char data DispBuf[4];//待显示数据寄存
sbit P0_0=P0^0;//位变量定义
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_5=P2^5;
sbit P3_3=P3^3;
///////////////////////////////////////////////////////////////////
void Ft();//1KHZ/16KHZ门限频率判决函数
void Ft_10();//10KH门限频率判决函数
void test_af();//小于1KHZ的频率测量函数
void test_w();//小于10KHZ脉冲宽度测量函数
void test_bf();//1KHZ~16KHZ频率测量函数
void test_z();//占空比测量函数
void test_at();//小于1KHZ的周期测量函数
void test_bt();//1KHZ~16KHZ周期测量函数
void test_cf();//16KHZ以上频率测量函数
void test_ct();//16KHZ以上周期测量函数
void Display();//显示驱动函数
void Delay_5m();//软件延迟约5ms函数
void Measure();//按键处理与对应测量函数
/////////////////////////////////////////////////////////////////////
void Ft()//判决1KHZ/16KHZ
{
//unsigned char p;
TMOD=0x15;
TL1=0xb0;
TH1=0x3c;
TH0=0;
TL0=0;
TR1=1;
TR0=1;
for(;TF1==0;);
TF1=0;
for(;TF1==0;);
TR0=0;
TR1=0;
k=TL0|(TH0<<8);
if(k>131) flag_ft=3;//p=1;
else if(k>10) flag_ft=2;//p=2;
else flag_ft=1;//p=3;
//return(p);
}
////////////////////////////////////////////////////////////////////////////////
void Ft_10()//判决10KHZ函数
{
TMOD=0X15;
TL1=0XC0;
TH1=0XE0;
TH0=0;
TL0=0;
TR1=1;
TR0=1;
for(;TF1==0;);
TF1=0;
TR0=0;
TR1=0;
k=TL0|(TH0<<8);
if(k<=5) flag_ft=4;
else flag_ft=5;
}
////////////////////////////////////////////////////////////////////////////////
void test_af(void)//测量小于1KHZ的频率,用INT1和CT0。
{
F=0;
test_at();
P1=P1|0xff;//情上次单位指示
F=1000000/T_T;
if(F<10)
{
F*=1000;point=1;
}
else if(F<100)
{
F*=100;point=2;
}
else if(F<1000)
{
F*=10;point=3;
}
else
{
point=4;
}
P1_2=0;//HZ指示灯亮
}
/////////////////////////////////////////////////////////////////////////////////////
void test_w()//测量脉冲宽度
{
W=0;
TMOD=0x90;//初始化
TH1=0x00;
TL1=0x00;
ET1=1;//开中断
EA=1;
bus1=0;
for(;P3_3==1;);//等待无效高电平过去
TR1=1;
for(;P3_3==0;);//等待高电平
for(;P3_3==1;);//等待低电平关闭计数器
TR1=0;
W=bus1*65536;
W+=TL1|(TH1<<8);
if(W<100)
{
W*=100;point=2;P1_1=0;//us指示灯亮
}
else if(W<1000)
{
W*=10;point=3;P1_1=0;//us指示灯亮
}
else if(W<10000)
{
point=4;P1_1=0;//us指示灯亮
}
else if(W<100000)
{
W/=10;point=2;P1_0=0;//ms指示灯亮
}
else if(W<1000000)
{
W/=100;point=3;P1_0=0;//ms指示灯亮
}
else if(W<10000000)
{
W/=1000;point=4;P1_0=0;//ms指示灯亮
}
else
{
point=0;
}
}
//////////////////////////////////////////////////////////////////
void test_bf(void)//测量测量1~16KHZ频率T1记数,T0定时
{
F=0;
TMOD=0x51;
TL1=0x00;
TH1=0x00;
TL0=0xbc;
TH0=0xbd;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
couter=0;
bus1=0;
for(;couter<16;);
TR1=0;
TR0=0;
F=bus1*65536;//取CT1记数值
F+=TL1|(TH1<<8);
F_F=F;
if(F<10000)
{
point=1;
}
else if(F<100000)
{
F/=10;point=2;
}
else
{
point=0;
}
P1_3=0;//KHZ指示灯亮
}
///////////////////////////////////////////
void test_z()
{
Z=0;
Ft();//flag_ft=Ft();
if(flag_ft==1) test_at();
else test_bt();
test_w();
P1=P1|0xff;//情上次单位指示
Z=(unsigned int)((W/T)*100);
if(Z<10)
{
Z*=1000;point=1;
}
else if(Z<=100)
{
Z*=100;point=2;
}
/*else if(Z<1000)
{
Z*=10;point=3;
}*/
else
{
point=2;
}
}
///////////////////////////////////////////////////////////////////////////////////
void test_at(void)//测量小于1KHZ的周期
{
T=0;
TMOD=0x01;
IT1=1;
EX1=1;
ET0=1;
EA=1;
TL0=0x00;
TH0=0x00;
bus0=0;
TR0=0;//新加的
INT1_ready=0;
for(;INT1_ready<2;);
EX1=0;//关INT1中断
T=bus0*65536;
T+=TL0|(TH0<<8);
T_T=T;//传递给频率测量函数
if(T<1000)
{
T=T*10;point=3;P1_1=0;//us指示灯亮
}
else if(T<10000)
{
point=4;P1_1=0;//us指示灯亮
}
else if(T<100000)
{
T/=10;point=2;P1_0=0;//ms指示灯亮
}
else if(T<1000000)
{
T/=100;point=3;P1_0=0;//ms指示灯亮
}
else if(T<10000000)
{
T/=1000;point=4;P1_0=0;//ms指示灯亮
}
else
{
point=0;
}
}
//////////////////////////////////////////////////////////////////////////////////
void test_bt(void)//测量测量1~16KHZ周期
{
T=0;
test_bf();
P1=P1|0xff;//情上次单位指示
T=1000000/F_F;
if(T<1000)
{
T=T*10;point=3;
}
else if(T<10000)
{
point=4;
}
else
{
point=0;
}
P1_1=0;//us指示灯亮
}
//////////////////////////////////////////////////////////////////////////////////////
void test_cf(void)/*大于16KHZ频率,分频,T0记数,T1定时*/
{
F=0;
TMOD=0x15;
TL0=0x00;
TH0=0x00;
TL1=0xbc;
TH1=0xbd;
ET0=1;
ET1=1;
EA=1;
TR1=1;
TR0=1;
couter0=0;
bus0=0;
for(;couter0<16;);
TR0=0;
TR1=0;
F=bus0*65536;
F+=TL0|(TH0<<8);
F=F*16;
F_F=F;
if(F<100000)
{
F/=10;point=2;
}
else if(F<1000000)
{
F/=100;point=3;
}
else if(F<10000000)
{
F/=1000;point=4;
}
else
{
point=0;
}
P1_3=0;//KHZ指示灯亮
}
void test_ct(void)//大于16KHZ频率
{
T=0;
test_cf();
P1=P1|0xff;//情上次单位指示
T=1000000/F_F;
if(T<10)
{
T*=1000;point=1;
}
else if(T<100)
{
T*=100;point=2;
}
else if(T<1000)
{
T*=10;point=3;
}
else
{
point=0;
}
P1_1=0;//us指示灯亮
}
/////////////////////////////////////////////////////////////////////////////////////////////
void Display()//显示驱动程序
{
buffer=BitTab[j];
P0=P0|0xf0;
P0=P0&buffer;
buffer=DispBuf[j];
buffer=DispTab[buffer];
P2=buffer;
switch(point)
{
case 1:if(j==0) P2_5=0;//第一位小数点亮
break;
case 2:if(j==1) P2_5=0;//第二位小数点亮
break;
case 3:if(j==2) P2_5=0;//第三位小数点亮
break;
default:break;
}
j++;
if(j==4) j=0;
}
////////////////////////////////////////////////////////////////
void Delay_5m()
{
for(delay=0;delay<800;delay++);
}
/////////////////////////////////////////////////////////////////
void Measure()
{
TH0=0;
TL0=0;
TH1=0;
TL1=0;
F=0;
T=0;
W=0;
Z=0;
switch(key)
{
case 0xef:P0=P0|0x0f;
P0_1=0;//F指示灯亮
Ft();//flag_ft=Ft();///////////////////////////////////?????????????????
switch(flag_ft)
{
case 1:test_af();//测量小于1KHZ频率
break;
case 2:test_bf();//测量1~16KHZ频率
break;
case 3:test_cf();//测量大于16KHZ频率
break;
default://DispBuf[3]=10;
//DispBuf[2]=10;
//DispBuf[1]=10;
//DispBuf[0]=10;//超量程处理
break;
}
break;
case 0xdf:P0=P0|0x0f;
P0_2=0;//T指示灯亮
Ft();//flag_ft=Ft();
switch(flag_ft)
{
case 1:test_at();//测量小于1KHZ周期
break;
case 2:test_bt();//测量1~16KHZ周期
break;
case 3:test_ct();//测量大于16KHZ周期
break;
default://DispBuf[3]=10;//超量程处理
//DispBuf[2]=10;
//DispBuf[3]=10;
//DispBuf[0]=10;
break;
}
break;
case 0xbf:P0=P0|0x0f;
P0_3=0;//W指示灯亮
Ft_10();
switch(flag_ft)
{
case 4:test_w();//测量脉冲宽度
break;
default://DispBuf[3]=10;//超量程处理
//DispBuf[2]=10;
//DispBuf[1]=10;
//DispBuf[0]=10;
break;
}
break;
case 0x7f:P0=P0|0x0f;
P0_0=0;//Z知指示灯亮
Ft_10();
switch(flag_ft)
{
case 4:test_z();//测量占空比
break;
default://DispBuf[3]=10;//超量程处理
//DispBuf[2]=10;
//DispBuf[1]=10;
//DispBuf[0]=10;
break;
}
break;
default://DispBuf[3]=10;
//DispBuf[2]=10;
//DispBuf[1]=10;
//DispBuf[0]=10;//Over_flow();//超量程处理
break;
}
}
////////////////////////////////////////////////////////////////////////////////
void INT_0(void) interrupt 0
{
P1=0xff;
key=P1;
Measure();
}
/////////////////////////////////////////////////////////////////////////////////
void CT1(void) interrupt 3
{
bus1+=1;
couter0++;
}
/////////////////////////////////////////////////////////////////////////////////
void INT_1(void) interrupt 2
{
TR0=~TR0;
INT1_ready=INT1_ready+1;
}
/////////////////////////////////////////////////////////////////////////////////
void CT0(void) interrupt 1
{
bus0+=1;//用于记数
couter++;//用于1S定时
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void main(void)
{
P1=0xff;
P0=0xff;//开关状态标志灯灭,三极管关闭
IT0=0;
EX0=1;
EA=1;
IP=0x0e;//设定中断优先级INT0最低,两层嵌套时允许打断按键中断
//显示主循环
for(;;)
{
P1=P1|0xf0;
TH0=0;
TL0=0;
TH1=0;
TL1=0;
switch(key)
{
case 0xef:turn=(unsigned int)F;
DispBuf[3]=turn%10;
turn=turn/10;
DispBuf[2]=turn%10;
turn=turn/10;
DispBuf[1]=turn%10;
DispBuf[0]=turn/10;
Display();
Delay_5m();
break;
case 0xdf:turn=(unsigned int)T;
DispBuf[3]=turn%10;
turn=turn/10;
DispBuf[2]=turn%10;
turn=turn/10;
DispBuf[1]=turn%10;
DispBuf[0]=turn/10;
Display();
Delay_5m();
break;
case 0xbf:turn=(unsigned int)W;
DispBuf[3]=turn%10;
turn=turn/10;
DispBuf[2]=turn%10;
turn=turn/10;
DispBuf[1]=turn%10;
DispBuf[0]=turn/10;
Display();
Delay_5m();
break;
case 0x7f:turn=Z;
DispBuf[3]=turn%10;
turn=turn/10;
DispBuf[2]=turn%10;
turn=turn/10;
DispBuf[1]=turn%10;
DispBuf[0]=turn/10;
Display();
Delay_5m();
break;
default:DispBuf[3]=10;
DispBuf[2]=10;
DispBuf[1]=10;
DispBuf[0]=10;
Display();
Delay_5m();
break;
}
cycle++;
if(cycle==500)
{
Measure();
cycle=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -