简易数字频率计c程序清单_简易数字频率计仿真

2020-02-28 其他范文 下载本文

简易数字频率计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;} } }

《简易数字频率计c程序清单.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
简易数字频率计c程序清单
点击下载文档
相关专题 简易数字频率计仿真 频率计 简易 清单 简易数字频率计仿真 频率计 简易 清单
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文