1、频率计#include #include #define uint unsigned int #define uchar unsigned char uchar f_str15; uchar unit4; uint rang=1; uint th0=0; uint tl0=0; uint n_f1=0; uint n_f2=0; double time1=0; double ff=0; uchar s05_flag=0; double timer_count1=0; double timer_count2=0; uchar cs_flag=0; void switch_rang (); voi
2、d delay1(unsigned int k); void delay(uint z); void fraction_to_str(float a,uchar* pStr); void float_to_str(float a,uchar* pStr); void display(unsigned char x,unsigned char y,unsigned char *str); void Write_Data(uchar dat); void Set_Cursor(unsigned char x, unsigned char y); sbit xz_key=P06; sbit sc_k
3、ey=P07; sbit td_a=P20; sbit td_b=P21; sbit td_c=P22; sbit buzz=P23; /lcd显示定义 #define LCD_DATA P1 /*数据口 */ sbit RS = P00; /*并行的指令/数据选择信号, H数据, L命令*/ sbit RW = P01; /*并行读写选择信号, H读, L写*/ sbit E = P02; /*并行使能端, H有效, L无效*/ /sbit PSB=P04; /*串并行选择端,H选择并行,L选择串行*/ /sbit RST=P03; /bit busy=0; /*忙碌标志*/ /*lcd显示
4、程序*/ void display(unsigned char x,unsigned char y,unsigned char *str) unsigned char i=0; Set_Cursor(x,y); /设置显示的起始地址 while(stri!=0) Write_Data(stri); /写入需要显示字符的显示码 i+; void delay1(unsigned int k) unsigned int i; unsigned char j; for(i=0;ik;i+) for(j=0;j=100) /*0.5秒标志*/ s05_flag=1; / timer_count1=0;
5、/外部中断计数 void int0() interrupt 0 n_f1+; if(n_f1=1) /*第一个下降沿时开始计数*/ TH0=0xd8; TL0=0xf0; timer_count1=0; TR0=1; else if(s05_flag=1) /*当5ms标志为一且下降沿时开始读数*/ cs_flag=1; /*频率计算标志*/ TR0=0; /*关掉T0*/ n_f2=n_f1-1; th0=TH0-0xd8; tl0=TL0-0xf0; timer_count2=timer_count1; n_f1=0; /*初值清零*/ s05_flag =0; timer_count1=
6、0; /频率测量 void fre_text() if(cs_flag=1) cs_flag=0; time1=(timer_count2*500.705 +(tl0+th0*255)*0.05)*0.01; ff=(n_f2)/time1; / ff=ff-0.270; switch_rang (); time1=(timer_count2*500.705 +(tl0+th0*255)*0.05)*0.01; ff=(n_f2)/time1; ff=ff*100000; if(ff500000) if(ff500000) & (ff600000) & (ff700000) & (ff8000
7、00) & (ff900000) & (ff1000000)ff=ff+ff*0.0130 ; else if(ff100)ff=ff-ff*0.00112 ; else ff=ff-ff*0.00228; delay(50); ff=ff/100; switch(rang) case 0: ff=ff; break; case 1: ff=ff*100; break; case 2: ff=ff*10000;break; default: break; /ff=ff-270; rang=1; /1ms延时子函数/ void delay(uint z) uint i,j; for(i=0;i=
8、z;i+) for(j=0;j110;j+); /自动换挡程序/ void switch_rang () if(ff=1000000)=1) if(ff=10)=1) rang-; if(ff=10000)&(ff=1000000)=1) rang+; switch(rang) case 0: td_a=0;td_b=0;td_c=0;break; /*1100HZ*/ case 1: td_a=1;td_b=0;td_c=0;break; /*10010000HZ*/ case 2: td_a=0;td_b=1;td_c=0;break; /*100001000000HZ*/ default: break;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1