简易数字频率计程序

上传人:痛*** 文档编号:83424766 上传时间:2022-05-01 格式:DOC 页数:17 大小:178KB
返回 下载 相关 举报
简易数字频率计程序_第1页
第1页 / 共17页
简易数字频率计程序_第2页
第2页 / 共17页
简易数字频率计程序_第3页
第3页 / 共17页
点击查看更多>>
资源描述
word#include #include #include sbit Pa=P12;sbit Pb=P13;sbit Pc=P14;sbit P1_0=P10;sbit P1_1=P11;sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17;sbit P2_3=P23;sbit P2_4=P24;sbit P2_5=P25;sbit P2_6=P26;sbit P2_7=P27;sbit P3_1=P31;sbit P3_5=P35;sbit RS=P20;sbit RW=P21;sbit EN=P22;#define uchar unsigned char#define uint unsigned intextern uchar m9=0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe;extern uchar flag1=0;uint flag2=0;uchar flag3=0;uchar count2=0;uint count3=0; /*flag1记录频段划分,flag2用来标识测量是否完成 */uchar count1=0;/*count1 用于记录T0里的脉冲个数*/unsigned long count4=0;/*/ /* 中断程序初始化 */*/*T0的初始化,工作模式是方式2,外部计数方式,计数个数是250个*/void t0init() TMOD=0x06; TH0=6; TL0=6; ET0=1; EA=1;/*TR0没有开*/ /*/ /*T1的初始化 工作于定时模式*/void t1init()TMOD=0x10; ET1=1; TH1=63436/256;/*定时时间是2.1ms*/ TL1=63436%256; EA=1;/*TR1没有开*/ count1=0;/*/ /*T2的初始化 工作于捕获模式*/void t2init()T2CON=0x01;ET2=1;EA=1;TH2=0;TL2=0;/*TR2,EXEN2 没有开*/RCAP2H=0;RCAP2L=0;/*/*int1的初始化 工作于下降沿响应模式*/void int1init()EX1=1;EA=1;IT1=1;/*/*int0的初始化 工作于下降沿响应模式*/void int0init()/EX0=1;/EA=1;/IT0=1;/PT0=1;/*/*T2工作于频段2和3,测周,测频,测占空比*/*只是求得测量值*/void t2cx() flag2=0; while (P1_1=1); EXEN2=1; while (P1_1=0); TR2=1; /*flag2 判断是否测量完成,不是继续等待*/*/ /* 中断程序 */*/*T2的中断响应程序*/void T2xy() interrupt 5 EXF2=0; count2=RCAP2L-count2;/*低位*/ count3=RCAP2H-count3;/*高位*/ flag2+=1;/*完成一次脉冲宽度的测量,如果是测占空比,可以重新再开中断,保存count2,和count3的值后。*/ /*/*INT0的中断响应程序*/ void int0xy() interrupt 0 flag3=1;/*/*INT1的中断响应程序*/ void int1xy() interrupt 2 count1=count1+1; /*/*T1的中断响应程序*/ void t1xy() interrupt 3 TR1=0; EX1=0; flag2=1; PT1=0; /*/*T0的中断响应程序*/void T0xy() interrupt 1 count1+=1; count4+=1; /*/*/void Delayms(uint ms) uchar i;while(ms-) for(i=0;i2) 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 (count14)flag1=2;flag2=0;count1=0;/*flag1=2,1khz10khz*/ /*如果第一次就测出来,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; /*/ /* 高频局部的精测 */unsigned long jingce() unsigned long b,a; unsigned long c=0; t2init(); t2cx(); while(flag2=0); a=RCAP2L; b=RCAP2H; while(flag2=1);/*等待第二次下降沿的到来*/ while(RCAP2H0;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); /*/ /* 转换函数 */*/ void zhuanhuan(unsigned long b, unsigned long a,unsigned char d) unsigned long f=0; unsigned long e=0;unsigned char i,j=0; a=a-1; if(d=1) e=b/a; if(flag1=1|flag1=2)if(e1000) e=(b*1000)/a; if(e10000)e=(b*100)/a;/*还要考虑到a的大小的会有影响,因为a越大,误差越大,所以放大原来的数进展运算*/ if(e100000)e=(b*10)/a; for(i=0;i10)j=2;/*这个是用来判断实际的数值到底多大,来确定该在第几个数值后加小数点*/ if(e100)j=3; if(e1000) j=4; if(e10000) j=5; for(i=5;ij;i-)mi=mi-1;/*小数点前的数据移位,空出一位给小数点*/ mi=0x2e;m6=0; m7=0x75; m8=0x73; /*小数点,单位是us*/ if(flag1=3|flag1=4) if(e=100000) e=b*2/10; for(i=0;i=4;i+)mi=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(ej;i-)mi=mi-1; mi=0x2e; m6=0; m7=0x6d; m8=0x73; /*测周期的*/ if(d=2) e=b/a; if( flag1=1|flag1=2) if(e100) e=(b*1000)/a; if(e1000) e=(b*100)/a; if(e100000) e=b/a;e=e/10; e=100000000/e; for(i=0;i=4;i+)mi=e/1000;e=(e%1000)*10;/*测频率的*/ f=1; if(flag1=1)f=100; e=b/a; e=e/f; / if(e10)j=2;/*大于100khz,这个是用来判断实际的数值到底多大,来确定该在第几个数值后加小数点*/ if(e100) j=1;/*大于10khz*/ if(e1000) j=4; /*小于1khz*/ if(e10000) j=5; if(jj;i-) mi=mi-1;/*小数点前的数据移位,空出一位给小数点*/ mi=0x2e; m6=0x4b; m7=0x48; m8=0x7a; if(j=4) for(i=5;i=j;i-) mi=mi-1;/*小数点前的数据移位,空出一位给小数点*/ mi=0x2e; m7=0x48; m8=0x7a; if(j=5) j=3; for(i=5;i=j;i-) mi=mi-1;/*小数点前的数据移位,空出一位给小数点*/ mi=0x2e; m7=0x48; m8=0x7a; if( flag1=3|flag1=4) j=0; if(e10000) e=b*200;j=2; else if(e100000) e=b*20;j=1; else e=b*2; for(i=0;ij;i-) mi=mi-1;/*小数点前的数据移位,空出一位给小数点*/ if(j=0) for(i=6;i0;i-) mi=mi-1;m0=0;m1=0x2e; m7=0x48; m8=0x7a; else mj=0x2e; m6=0x48; m7=0x7a; /*小数点*/*/ /*数组转换为液晶显示里的数值*/*/ unsigned char xianshi (unsigned char a) unsigned char b; switch (ma) case 0:b=0x30;break; case 1:b=0x31;break; case 2:b=0x32;break;case 3:b=0x33;break;case 4:b=0x34;break;case 5:b=0x35;break;case 6:b=0x36;break;case 7:b=0x37;break;case 8:b=0x38;break;case 9:b=0x39;break;default:b=ma;break;/*空格号或者返回吧*/ return b; /*/void main() unsigned char d=0,m,n5=0x30,0x31,0x32,0x33,0x34; unsigned long b, e; float q,w; unsigned long a; unsigned char i,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(ni); 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 goto L2; /*测周*/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 goto L3; /*测频*/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+) ni=e/100; e=(e%100)*10;n3=n2;n2=0x2e; n4=0x25;/*百分号%*/for(i=0;i=4;i+)switch (ni) case 0:ni=0x30;break; case 1:ni=0x31;break; case 2:ni=0x32;break; case 3:ni=0x33;break; case 4:ni=0x34;break; case 5:ni=0x35;break; case 6:ni=0x36;break; case 7:ni=0x37;break; case 8:ni=0x38;break; case 9:ni=0x39;break; case 0x25:ni=0x25;break; case 0x2e:ni=0x2e;break; m=ni;Write_LCD_Data(m); d=0;b=0;e=0;count4=0;count1=0; /*测占空比*/ else goto L4; 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;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!