简易数字频率计c程序清单_简易数字频率计仿真
简易数字频率计c程序清单由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“简易数字频率计仿真”。
河池学院2004届本科生毕业论文(设计)简易数字频率计
附件
源程序如下: #include unsigned char data key,flag_ft,point,buffer,j,INT1_ready,couter0,couter1,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[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80};//字形码 /*
0
.*/ unsigned char data DispBuf[4];//待显示数据寄存 sbit P2_0=P2^0;//位变量定义 sbit P2_1=P2^1;sbit P2_2=P2^2;sbit P2_3=P2^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 P0_7=P0^7;sbit P3_3=P3^3;/////////////////////////////////////////////////////////////////// void Ft();//1KHZ/16KHZ门限频率判决函数 void Ft_10();//10KHZ门限频率判决函数 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河池学院2004届本科生毕业论文(设计)简易数字频率计 {
//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;);
TF1=0;for(;TF1==0;);
TF1=0;
TR0=0;
TR1=0;
k=TL0|(TH0
if(k>131)flag_ft=3;
else if(k>10)flag_ft=2;
else flag_ft=1;} //////////////////////////////////////////////////////////////////////////////// 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
if(k
else flag_ft=5;} //////////////////////////////////////////////////////////////////////////////// void test_af(void)//测量小于1KHZ的频率,用INT1和CT0。{
F=0;河池学院2004届本科生毕业论文(设计)简易数字频率计
test_at();P1=P1|0xff;
//清除上次单位指示
F=1000000/T_T;
if(F
{
F*=1000;point=1;}
else if(F
{
F*=100;point=2;
}
else if(F
{
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
W*=100;point=2;P1_1=0;//us指示灯亮
} else if(W
河池学院2004届本科生毕业论文(设计)简易数字频率计
W*=10;point=3;P1_1=0;//us指示灯亮
} else if(W
point=4;P1_1=0;//us指示灯亮
}
else if(W
{
W/=10;point=2;P1_0=0;//ms指示灯亮
}
else if(W
{
W/=100;point=3;P1_0=0;//ms指示灯亮
} else if(W
W/=1000;point=4;P1_0=0;//ms指示灯亮
}
else
{
point=0;} } ////////////////////////////////////////////////////////////////// void test_bf(void)//测量1KHZ~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;couter0=0;bus1=0;
for(;couter0
TR1=0;TR0=0;
F=bus1*65536;//取CT1记数值
F+=TL1|(TH1
河池学院2004届本科生毕业论文(设计)简易数字频率计
F_F=F;if(F
point=1;}
else if(F
{
F/=10;point=2;}
else
{
point=0;} P1_3=0;//KHZ指示灯亮 } /////////////////////////////////////////// void test_z(){
Z=0;Ft();if(flag_ft==1)test_at();
else test_bt();
test_w();P1=P1|0xff;//清上次单位指示
Z=(unsigned int)((W/T)*100);
if(Z
{
Z*=1000;point=1;}
else if(Z
{
Z*=100;point=2;}
/*else if(Z
{
Z*=10;point=3;}*/ else {
point=2;
} } /////////////////////////////////////////////////////////////////////////////////// void test_at(void)//测量小于1KHZ的周期河池学院2004届本科生毕业论文(设计)简易数字频率计 {
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
T=bus0*65536;
T+=TL0|(TH0
if(T
T=T*10;point=3;P1_1=0;//us指示灯亮
} else if(T
point=4;P1_1=0;//us指示灯亮
}
else if(T
{
T/=10;point=2;P1_0=0;//ms指示灯亮
}
else if(T
{
T/=100;point=3;P1_0=0;//ms指示灯亮
} else if(T
T/=1000;point=4;P1_0=0;//ms指示灯亮
}
else
{
point=0;} } ////////////////////////////////////////////////////////////////////////////////// void test_bt(void)//测量测量1KHZ~16KHZ周期河池学院2004届本科生毕业论文(设计)简易数字频率计 {
T=0;
test_bf();P1=P1|0xff;//清上次单位指示
T=1000000/F_F;
if(T
{
T=T*10;point=3;} else if(T
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;couter1=0;bus0=0;
for(;couter1
F+=TL0|(TH0
河池学院2004届本科生毕业论文(设计)简易数字频率计
F/=10;point=2;}
else if(F
{
F/=100;point=3;} else if(F
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
{
T*=1000;point=1;
}
else if(T
T*=100;point=2;
}
else if(T
T*=10;point=3;}
else
{
point=0;}
P1_1=0;//us指示灯亮 } ///////////////////////////////////////////////////////////////////////////////////////////// void Display()//显示驱动程序 {
buffer=BitTab[j];河池学院2004届本科生毕业论文(设计)简易数字频率计
P2=P2|0xf0;
P2=P2&buffer;
buffer=DispBuf[j];
buffer=DispTab[buffer];
P0=buffer;
switch(point)
{
case 1:if(j==0)P0_7=1;//第一位小数点亮
break;
case 2:if(j==1)P0_7=1;//第二位小数点亮
break;
case 3:if(j==2)P0_7=1;//第三位小数点亮
break;
default:break;
}
j++;
if(j==4)j=0;} //////////////////////////////////////////////////////////////// void Delay_5m(){
for(delay=0;delay
TH0=0;TL0=0;TH1=0;TL1=0;F=0;T=0;W=0;Z=0;
switch(key)
{
case 0xef:P2=P2|0x0f;
P2_1=0;//F指示灯亮
Ft();//flag_ft=Ft();///////////////////////////////////?
switch(flag_ft)
{
case 1:test_af();//测量小于1KHZ频率
break;
case 2:test_bf();//测量1KHZ~16KHZ频率河池学院2004届本科生毕业论文(设计)简易数字频率计
break;
case 3:test_cf();//测量大于16KHZ频率
break;
default:break;
}
break;
case 0xdf:P2=P2|0x0f;
P2_2=0;//T指示灯亮
Ft();//flag_ft=Ft();
switch(flag_ft)
{
case 1:test_at();//测量小于1KHZ周期
break;
case 2:test_bt();//测量1KHZ~16KHZ周期
break;
case 3:test_ct();//测量大于16KHZ周期
break;
default:break;
}
break;
case 0xbf:P2=P2|0x0f;
P2_3=0;//W指示灯亮
Ft_10();
switch(flag_ft)
{
case 4:test_w();//测量脉冲宽度
break;
default:break;
}
break;
case 0x7f:P2=P2|0x0f;
P2_0=0;//Z指示灯亮
Ft_10();
switch(flag_ft)
{
case 5:test_z();//测量占空比
break;
default:break;
}
break;
default:break;
}
break;}河池学院2004届本科生毕业论文(设计)简易数字频率计 //////////////////////////////////////////////////////////////////////////////// void INT_0(void)interrupt 0 {
P1=0xff;
key=P1;
Measure();} ///////////////////////////////////////////////////////////////////////////////// void CT1(void)interrupt 3 {
bus1+=1;couter1++;} ///////////////////////////////////////////////////////////////////////////////// void INT_1(void)interrupt 2 {
TR0=~TR0;
INT1_ready=INT1_ready+1;} ///////////////////////////////////////////////////////////////////////////////// void CT0(void)interrupt 1 {
bus0+=1;
//用于记数
couter0++;
//用于1S定时 } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// void main(void){
P1=0xff;
P2=0xff;//开关状态标志灯灭
IT0=0;
EX0=1;
EA=1;
IP=0x0e;
//设定中断优先级INT0最低,两层嵌套时允许打断按键中断
//显示主循环
for(;;)
{
P2=P2|0xf0;
TH0=0;
TL0=0;
TH1=0;
TL1=0;河池学院2004届本科生毕业论文(设计)简易数字频率计
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();河池学院2004届本科生毕业论文(设计)简易数字频率计
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;} } }