简易数字频率计程序.docx
- 文档编号:27526532
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:24
- 大小:217.90KB
简易数字频率计程序.docx
《简易数字频率计程序.docx》由会员分享,可在线阅读,更多相关《简易数字频率计程序.docx(24页珍藏版)》请在冰豆网上搜索。
简易数字频率计程序
简易数字频率计程序(总23页)
#include<>
#include<>
#include<>
sbitPa=P1^2;
sbitPb=P1^3;
sbitPc=P1^4;
sbitP1_0=P1^0;
sbitP1_1=P1^1;
sbitP1_5=P1^5;
sbitP1_6=P1^6;
sbitP1_7=P1^7;
sbitP2_3=P2^3;
sbitP2_4=P2^4;
sbitP2_5=P2^5;
sbitP2_6=P2^6;
sbitP2_7=P2^7;
sbitP3_1=P3^1;
sbitP3_5=P3^5;
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
#defineucharunsignedchar
#defineuintunsignedint
externucharm[9]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe};
externucharflag1=0;
uintflag2=0;
ucharflag3=0;
ucharcount2=0;
uintcount3=0;/*flag1记录频段划分,flag2用来标识测量是否完成*/
ucharcount1=0;/*count1用于记录T0里的脉冲个数*/
unsignedlongcount4=0;
/******************************************************/
/*中断程序初始化*/
/******************************************************/
/*T0的初始化,工作模式是方式2,外部计数方式,计数个数是250个*/
voidt0init()
{TMOD=0x06;
TH0=6;
TL0=6;
ET0=1;
EA=1;/*TR0没有开*/
}
/******************************************************/
/*T1的初始化工作于定时模式*/
voidt1init()
{TMOD=0x10;
ET1=1;
TH1=63436/256;/*定时时间是*/
TL1=63436%256;
EA=1;/*TR1没有开*/
count1=0;
}
/******************************************************/
/*T2的初始化工作于捕获模式*/
voidt2init()
{T2CON=0x01;
ET2=1;
EA=1;
TH2=0;
TL2=0;/*TR2,EXEN2没有开*/
RCAP2H=0;
RCAP2L=0;
}
/******************************************************/
/*int1的初始化工作于下降沿响应模式*/
voidint1init()
{EX1=1;
EA=1;
IT1=1;
}
/******************************************************/
/*int0的初始化工作于下降沿响应模式*/
//voidint0init()
//{EX0=1;
//EA=1;
///IT0=1;
//PT0=1;
//}
/******************************************************/
/*T2工作于频段2和3,测周,测频,测占空比*/
/*只是求得测量值*/
voidt2cx()
{flag2=0;
while(P1_1==1);
EXEN2=1;
while(P1_1==0);
TR2=1;
/*flag2判断是否测量完成,不是继续等待*/
}
/******************************************************/
/*中断程序*/
/******************************************************/
/*T2的中断响应程序*/
voidT2xy()interrupt5
{EXF2=0;
count2=RCAP2L-count2;/*低位*/
count3=RCAP2H-count3;/*高位*/
flag2+=1;/*完成一次脉冲宽度的测量,如果是测占空比,可以重新再开中断,保留count2,和count3的值后。
*/
}
/******************************************************/
/*INT0的中断响应程序*/
voidint0xy()interrupt0
{flag3=1;}
/******************************************************/
/*INT1的中断响应程序*/
voidint1xy()interrupt2
{count1=count1+1;
}
/******************************************************/
/*T1的中断响应程序*/
voidt1xy()interrupt3
{TR1=0;
EX1=0;
flag2=1;
PT1=0;
}
/******************************************************/
/*T0的中断响应程序*/
voidT0xy()interrupt1
{count1+=1;
count4+=1;
}
/******************************************************/
/***************************************************/
voidDelayms(uintms)
{
uchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
ucharBusy_Check()
{
ucharLCD_Status;
RS=0;
RW=1;
EN=1;
Delayms
(1);
LCD_Status=P0;
EN=0;
returnLCD_Status;
}
voidWrite_LCD_Command(ucharcmd)
{
while((Busy_Check()&0x80)==0x80);
RS=0;
RW=0;
EN=0;
P0=cmd;
EN=1;
Delayms
(1);
EN=0;
}
voidWrite_LCD_Data(uchardat)
{
while((Busy_Check()&0x80)==0x80);
RS=1;
RW=0;
EN=0;
P0=dat;
EN=1;
Delayms(10);
EN=0;
}
voidInitialize_LCD()
{
Write_LCD_Command(0x30);
Delayms
(1);
Write_LCD_Command(0x01);
Delayms
(1);
Write_LCD_Command(0x06);
Delayms
(1);
Write_LCD_Command(0x0c);
Delayms
(1);
}
/****************************************************/
/******************************************************/
/*粗测部分的程序*/
voidcuce()
{unsignedchari=0;
int1init();/*int1工作于下降沿模式,每次触发就执行一次中断函数,也就是count1+1*/
t1init();/*t1工作于定时模式*/
Pa=0;
Pb=1;
Pc=1;/*第7路信号,10分频*/
TR1=1;
EX1=1;
PT1=1;
while(flag2==0);
if(count1>2){flag1=1;flag2=0;count1=0;}/*flag1=1,>=10khz*/
while(flag1==0){count1=0;
t1init();
Pb=0;/*第5路信号,不分频了*/
flag2=0;
TR1=1;
EX1=1;
break;
}
if(flag1==0){while(flag2==0);
if(count1>4){flag1=2;flag2=0;count1=0;}/*flag1=2,1khz~10khz*/
}/*如果第一次就测出来,flag1就不为0,然后往下运行*/
while(flag1==0){t1init();
count1=0;TH1=55536/256;TL1=55536%256;flag2=0;
if(P1_0==0){TR1=1;
while(P1_0==0){if(flag2==1){TH1=35536/256;TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5)continue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){TH1=35536/256;TL1=35536%256;TR1=1;
while(P1_0==1){if(flag2==1){TH1=35536/256;TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5)continue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){flag1=2;flag2=0;TR1=0;}
}/**/
if(flag2==3){flag1=3;flag2=0;TR1=0;}
if(flag2==2){flag1=4;flag2=0;TR1=0;}
}
if(flag1==0){TR1=1;
while(P1_0==1){if(flag2==1){TH1=35536/256;TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5)continue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){TH1=35536/256;TL1=35536%256;TR1=1;
while(P1_0==0){if(flag2==1){TH1=35536/256;TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5)continue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){flag1=2;flag2=0;TR1=0;}
}/**/
if(flag2==3){flag1=3;flag2=0;TR1=0;}
if(flag2==2){flag1=4;flag2=0;TR1=0;}
}
}/*已经粗测完*/
TR1=0;
}
/******************************************************/
/*高频部分的精测*/
unsignedlongjingce()
{
unsignedlongb,a;
unsignedlongc=0;
t2init();
t2cx();
while(flag2==0);
a=RCAP2L;
b=RCAP2H;
while(flag2==1);/*等待第二次下降沿的到来*/
while(RCAP2H<200);/*判断待测周期是不是超过10ms,不是就接着等待,这是为了防止单片机最小工作时间1us这个误差而设的*/
TR2=0;
a=RCAP2L-a;
b=RCAP2H-b;
c=b*256+a;/*这里还没除去周期个数,转换函数里转换*/
count2=0;
count3=0;
return(c);
}
/******************************************************/
/*低频部分的精测*/
unsignedlongjingche()
{unsignedlongc;
unsignedchari,j;
t0init();
if(flag1==3){j=10;}
if(flag1==4){j=1;}
while(P1_1==1);
TR0=1;
for(i=j;i>0;i--){while(P1_0==1);
while(P1_0==0);
}
while(P1_1==1);
P1_7=0;
TR0=0;
c=count4*250+(TL0-6);/*计数模式,每250个溢出一次*/
TR0=0;
count1=0;
count4=0;
return(c);
}
/******************************************************/
/*转换函数*/
/******************************************************/
voidzhuanhuan(unsignedlongb,unsignedlonga,unsignedchard)
{unsignedlongf=0;
unsignedlonge=0;
unsignedchari,j=0;
a=a-1;
if(d==1){e=b/a;
if(flag1==1|flag1==2){if(e<1000){e=(b*1000)/a;}
if(e<10000){e=(b*100)/a;}/*还要考虑到a的大小的会有影响,因为a越大,误差越大,所以放大原来的数进行运算*/
if(e<100000){e=(b*10)/a;}
for(i=0;i<=4;i++){m[i]=e/100000;e=(e%100000)*10;}/*测周期的*/
f=1;
if(flag1==1)f=100;/*判断是几分频,补回来*/
e=b/a;
e=e/f;
j=1;
if(e>10)j=2;/*这个是用来判断实际的数值到底多大,来确定该在第几个数值后加小数点*/
if(e>100)j=3;
if(e>1000)j=4;
if(e>10000)j=5;
for(i=5;i>j;i--){m[i]=m[i-1];}/*小数点前的数据移位,空出一位给小数点*/
m[i]=0x2e;
m[6]=0;
m[7]=0x75;
m[8]=0x73;
}/*小数点,单位是us*/
if(flag1==3|flag1==4){if(e<100000)e=b*2;
if(e>=100000)e=b*2/10;
for(i=0;i<=4;i++){m[i]=e/10000;e=(e%10000)*10;}
f=1;
if(flag1==3)f=10;
e=b*2/f;
j=5;
if(e<=1000000)j=4;
if(e<=100000)j=3;
if(e<10000)j=2;
for(i=5;i>j;i--){m[i]=m[i-1];}
m[i]=0x2e;
m[6]=0;
m[7]=0x6d;
m[8]=0x73;
}/*测周期的*/
}
if(d==2){e=b/a;
if(flag1==1|flag1==2)
{if(e<100)e=(b*1000)/a;
if(e<1000)e=(b*100)/a;
if(e<10000)e=(b*10)/a;
if(e>100000){e=b/a;e=e/10;}
e=0/e;
for(i=0;i<=4;i++){m[i]=e/1000;e=(e%1000)*10;/*测频率的*/
}
f=1;
if(flag1==1)f=100;
e=b/a;
e=e/f;
//if(e<100)j=2;/*超出量程了*/
j=3;
if(e>10)j=2;/*大于100khz,这个是用来判断实际的数值到底多大,来确定该在第几个数值后加小数点*/
if(e>100)j=1;/*大于10khz*/
if(e>1000)j=4;/*小于1khz*/
if(e>10000)j=5;
if(j<4){for(i=5;i>j;i--){m[i]=m[i-1];}/*小数点前的数据移位,空出一位给小数点*/
m[i]=0x2e;
m[6]=0x4b;
m[7]=0x48;
m[8]=0x7a;
}
if(j==4){for(i=5;i>=j;i--){m[i]=m[i-1];}/*小数点前的数据移位,空出一位给小数点*/
m[i]=0x2e;
m[7]=0x48;
m[8]=0x7a;}
if(j==5){j=3;
for(i=5;i>=j;i--){m[i]=m[i-1];}/*小数点前的数据移位,空出一位给小数点*/
m[i]=0x2e;
m[7]=0x48;
m[8]=0x7a;}
}
if(flag1==3|flag1==4){
j=0;
if(e<10000){e=b*200;j=2;}
elseif(e<100000){e=b*20;j=1;}
else{e=b*2;}
for(i=0;i<=4;i++){m[i]=1000000/e;e=(1000000%e)*10;}
if(flag1==3)j=j+1;
for(i=5;i>j;i--)m[i]=m[i-1];/*小数点前的数据移位,空出一位给小数点*/
if(j==0){for(i=6;i>0;i--)m[i]=m[i-1];m[0]=0;m[1]=0x2e;m[7]=0x48;m[8]=0x7a;}
else{m[j]=0x2e;m[6]=0x48;m[7]=0x7a;}
}
}/*小数点*/
}
/******************************************************/
/*数组转换为液晶显示里的数值*/
/******************************************************/
unsignedcharxianshi(unsignedchara)
{unsignedcharb;
switch(m[a])
{case0:
{b=0x30;}break;
case1:
{b=0x31;}break;
case2:
{b=0x32;}break;
case3:
{b=0x33;}break;
case4:
{b=0x34;}break;
case5:
{b=0x35;}break;
case6:
{b=0x36;}break;
case7:
{b=0x37;}break;
case8:
{b=0x38;}break;
case9:
{b=0x39;}break;
default:
{b=m[a];}break;/*空格号或者返回吧*/
}
returnb;
}
/******************************************************/
voidmain()
{unsignedchard=0,m,n[5]={0x30,0x31,0x32,0x33,0x34};
unsignedlongb,e;
floatq,w;
unsignedlonga;
unsignedchari,dat=0;
P3_1=0;
P1_5=0;P1_6=0;P1_7=0;
Initialize_LCD();
for(i=0;i<=4;i++)
{Write_LCD_Data(n[i]);}
P1_5=1;P1_6=1;P1_7=1;
while
(1){
if(P2_3==0){
Delayms(5);
if(P2_3==0){cuce();
d=1;P1_6=~P1_6;
if(flag1==1){Pa=1;Pb=0;Pc=1;b=jingce();a=flag2;flag2=0;}
if(flag1==2){Pa=0;Pb=0;Pc=1;b=jingce();a=flag2;flag2=0;}
if(flag1==3){Pa=0;Pb=1;Pc=0;b=jingche();a=2;}
if(flag1==4){Pa=1;Pb=0;Pc=0;b=jingche();a=2;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 数字频率计 程序