简易数字频率计程序_第1页
简易数字频率计程序_第2页
简易数字频率计程序_第3页
简易数字频率计程序_第4页
简易数字频率计程序_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

简易数字频率计程序简易数字频率计程序简易数字频率计程序xxx公司简易数字频率计程序文件编号:文件日期:修订次数:第1.0次更改批准审核制定方案设计,管理制度#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#defineuintunsignedintexternucharm[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;}zhuanhuan(b,a,d); for(i=0;i<=8;i++){a=i;dat=xianshi(a);Write_LCD_Data(dat);} d=0; b=0; flag1=0; } else{gotoL2;} }/*测周*/L2: if(P2_4==0){Delayms(5); if(P2_4==0){ cuce(); d=2; 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;}zhuanhuan(b,a,d); for(i=0;i<=8;i++){a=i;m=xianshi(a);Write_LCD_Data(m);} d=0; b=0; flag1=0; }else{gotoL3;} }/*测频*/ L3: if(P2_5==0){Delayms(5); if(P2_5==0){cuce();if(flag1==2){Pa=0;Pb=0;Pc=1;t2init();t2cx();while(flag2==0);q=RCAP2H*0xff+RCAP2L;/*第一次的时间值,只记录了高电平*/while(flag2==1); //e=RCAP2H*256+RCAP2L-e;w=(q*1000)/(RCAP2H*0xff+RCAP2L-q);/*分母是整个周期的时间,b*1000是为了放大计算*/flag2=0;/*归零*/ RCAP2H=0; RCAP2L=0;count2=0;count3=0; flag1=0;TR2=0;EXEN2=0;/*用T2*/}if(flag1==3|flag1==4){Pa=0;Pb=0;Pc=0;P1_5=0; t0init();while(P1_0==0);/*等待上升沿*/while(P1_0==1);while(P1_0==0);TR0=1;while(P1_0==1);TR0=0;b=count4*250+(TL0-6)-3;/*计数模式,每250个溢出一次*/count4=0;/*第一次的脉冲个数,高电平*/ Pa=1;/*反相信号输入*/ TL0=6; //while(P1_0==1);/*等待上升沿*///while(P1_0==0);while(P1_0==1);TR0=1;while(P1_0==0);TR0=0;w=count4*250+(TL0-6)-3;/*计数模式,每250个溢出一次*/count1=0;/*第一次的脉冲个数,高电平*/w=(b*1000)/(b+w);/*用T0,(b+e)是整个周期的宽度*/ }/*接下来数据处理*/ e=w;flag1=0; for(i=0;i<=2;i++){n[i]=e/100; e=(e%100)*10;} n[3]=n[2]; n[2]=0x2e;n[4]=0x25;/*百分号%*/ for(i=0;i<=4;i++){switch(n[i]){ case0:{n[i]=0x30;}break; case1:{n[i]=0x31;}break;case2:{n[i]=0x32;}break; case3:{n[i]=0x33;}break; case4:{n[i]=0x34;}break; case5:{n[i]=0x35;}break; case6:{n[i]=0x36;}break; case7:{n[i]=0x37;}break; case8:{n[i]=0x38;}break; case9:{n[i]=0x39;}break; case0x25:{n[i]=0x25;}break; case0x2e:{n[i]=0x2e;}break; } m=n[i]; Write_LCD_Data(m); } d=0;b=0;e=0;count4=0;count1=0; }/*测占空比*/ else{gotoL4;}}L4: if(P2_6==0){Delayms(5); if(P2_6==0){Pa=0;Pb=0;Pc=1;/*第五路信号*/t2init();while(P1_0==0);/*等待高电平*/TR2=1;EXEN2=1;while(flag2==0);/*等待下降沿*/TR2=0;b=RCAP2H*256+RCAP2L+3; a=2;d=1;count2=0;count3=0; flag1=2;/*接下来的数据的处理*/ zhuanhuan(b,a,d); for(i=0;i<=8;i++){a=i;m=xianshi(a);Write_LCD_Data(m);} a=0;b=0;d=0;flag1=0; flag2=0; } else{gotoL5;} }/*测脉冲宽度*/ L5: if(P2_7==0){Delayms(5); if(P2_7==0)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论