#include "reg51.h"

//--------------------主程序--------------------------------
void main()
{
 //单片机定时器及外部端口技术设置  
      TMOD=0x51; 		//设置定时器0,方式1:16位定时器
      TH1=0; 
      TL1=0; 
      TH0=(65536-2000)/256; 
      TL0=(65536-2000)%256; 
      TR0=1; 
      TR1=1; 
      ET1=1; 
      ET0=1;
      EA=1;
//----电阻档-------
      A0=1; 
     LCD_initial();//液晶屏初始化
      RX=0;
	LCD_cursor(0x00);
 	LCD_prints("   MEASURE Rx-1 ");
    Value_to_ASCII(RX,0x46);//显示阻值
    Up=0;
    while(1) 
	{	Key_SM(); 
	    if(flag==1){//查到标志
        flag=0;//归零
        x=Pulsenum*65536+TH1*256+TL1;//读取1s内的频率

    if(K2==1)        
{   	 
if(Up==0){
        RZ=(Z1/x);//测量1K到1000K
        RX=RZ-1000;
        RX=RX>>1;
        RX=RX*10;
   if(RX>=10107){
        RX=RX-10107;
    }else{RX=0;}
if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;}//无脉冲后所有的数字归零
  if(RX>9999999)
  {
  	RX=9999999;
  	B0=0;
	delay_1ms(25);
	B0=1;
	}//RX大于9999999,则RX=999999
              RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度
RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX;		   
             //保存上一次的阻值
//单位换算及显示刷新         
if(RX2<=999)Value_to_ASCII(RX2,0x46);
if(RX2>999&&RX2<=9999)Value_to_ASCII1(RX2,0x46);  
if(RX2>9999&&RX2<=99999)Value_to_ASCII2(RX2,0x46);     
if(RX2>99999&&RX2<=999999)Value_to_ASCII3(RX2,0x46);    
if(RX2>999999&&RX2<=9999999)Value_to_ASCII4(RX2,0x46);    
}
if(Up==1){
        RZ=(Z2/x);//测量1M到10M
        RX=RZ-1000;//测量值减1K
        RX=RX>>1;//RX除以2
        RX=RX-1008;
        if(RX<0)RX=0;//限制数字小于0
   		if(x==0)RX=0; //归零
 		if(RX>9999999)RX=x; //显示电阻M		
        Value_to_ASCII5(RX,0x46);//显示器更新显示 
}
}
  		if(K2==0)
{
	LCD_cursor(0x00);
	LCD_prints("     DIANRONG   ");  
	RZ=(Z3/x);
	if(x>0){RX=RZ+1;} else{RX=0;}
    if(RX>9999){RX=999999; }
	Value_to_ASCII6(RX,0x46);	  

}

         cnt2ms=0;//归0
         Pulsenum=0;//归零
         TH1=0;//脉冲技术归零
         TL1=0;
         TR1=1;//开启中断
    
	
	}
	}
}
/*******函 数 名: Exti0_interrupt函数功能: /T0引脚下降沿进入中断*********/
void T1_interrupt(void) interrupt 3 using 0 
{
  Pulsenum++;	//脉冲大于65536个,溢出标志置1
	}
/*******函数功能:定时器/计数器1中断处理************/
void Timer0IntProc() interrupt 1 using 0 //2ms
{
  TH0=(65536-1000)/256; //中断定时器重置
  TL0=(65536-1000)%256; 
    cnt2ms++;//计数器加1
	if(cnt2ms==999)	//1s计时到
	{
                TR1=0;//关闭定时器功能
		cnt2ms = 0;//计时数置0
	            flag=1;//打1S定时标志
	}
}