《简易数字频率计程序.doc》由会员分享,可在线阅读,更多相关《简易数字频率计程序.doc(17页珍藏版)》请在金锄头文库上搜索。
1、#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#defin
2、e 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,外部计数方式,计数个数是2
3、50个*/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;/*/*int
4、1的初始化 工作于下降沿响应模式*/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 E
5、XF2=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
6、; 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)
7、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