⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 自动检测电容值
💻 C
📖 第 1 页 / 共 2 页
字号:
	TestData[i]=f;
} */
long Tests(char i,unsigned int wt)
{
	char n;
	unsigned long ul,ulc;
	ul=2;
	for(n=0;n<4;n++)
	{
		DelayMs(10);
		ulc=Test0(i,wt);
		if(ulc==-1) return(-1);
		ul+=ulc;
	}
	ul>>=2;
	return(ul);
}
void  LedSend8(char d) 
{
	uchar i;
	CLK=0;
	for(i=0;i<8;i++)
	{
		 d<<=1;
		 DA=CY;delay (10); 	 
	     CLK=1;delay (10);   
	     CLK=0;delay (10);
	}
}
void  LedShow(char hb,char lb) 
{
	CS=0;
	delay(10);
//	hb>>=1;
//	if(CY)
//	{
//		lb|=0x80;
//	}
//	else
//	{
//		lb&=~0x80;
//	}
	LedSend8(hb);	
	LedSend8(lb);	
	CS=1;
	delay (20);
	CS=0;
}
void LedTest(void)
{
	char d;
	char i;
//	twingle=1;
	d=1;
	LedShow(0xff,~0x40);DelayMs(400);
	LedShow(~0x40,0xff);DelayMs(400);
	for(i=0;i<6;i++)
	{
		LedShow(0xff,~(d));DelayMs(400);
		d<<=1;
	}
	d=1;
	for(i=0;i<6;i++)
	{
		LedShow(~(d),0xff);DelayMs(400);
		d<<=1;
	}
	LedShow(0x7f,0);DelayMs(800);
	LedShow(0,0x7f);DelayMs(800);
	LedShow(0x7f,0x7f);
}
void Bell(unsigned int t)
{
	BELL=0;
	DelayMs(t);
	BELL=1;
}
void Timer0 (void) interrupt TIMER0INT // using 1
{
	TL0=CYCLE % 256;
	TH0=CYCLE/256;	
//	TF2=0;
//	EXF2=0;
//	if(wtt) wtt--;
	if(td) td--;
//	if(StartTest) return;
//	if(twingle) twingledo=1;
//	if(twingledo)
//	{
//		if(!(dt--))
//		{
//			dt=30;
//			if(Dis=!Dis)
//			{
//				LedShow(0xff,0xff);
//			}
//			else
//			{
//				LedShow(OkLed,~OkLed);
//				if(!twingle) twingledo=0;
//			}
//		}
//	}
}
long Test0(char i,unsigned int wt)
{
	bit rc;
	bit Testing;
	long ul;
	unsigned char j;
	char BIE;
	unsigned char tc;
	bit lowint;
	if(i>=16) return(0);
	CB=0;							//CB=0时主测节点电容(侧电阻时)接+VCC充电,或接+VCC充电停振(测电容时)
	EX1=ET1=TR1=0;					//
	switch(i)					  	//0,1,2,3为4被测电阻 4,5,6,7为4被测电容 8为标准电阻 9为标准电容
	{
	case 0:
	case 1:
	case 2:
	case 3:
	case RstdNo:
		TMOD|=GATE1;			 	//电阻测试,TIMER1 INT1选通计时,为高开始计时
		rc=1;					 
		CA=0;					 	//CA=0:选择电阻
		tc=0;					 	//测量次数-1
		break;	//R:rc=1 C:rc=0
	default:
		TMOD&=~GATE1;		  		//电容测试,TIMER1 软件控制计时
		CA=1;						//CA=0:选择电容
		tc=200;						//测量次数-1
		rc=0;
		break;
	}
	P2=(P2&0XF0)|i|0XC0;					//通道设定
	tn=TH1=TL1=0;					//TIMER1 数值设为0
	if(!rc) 						
	{
		DelayMs(50);
		CB=1;						//测电容,断开充电,让测电容电路先振荡
	}	   	//rc=0为电容测定
	else
	{
		DelayMs(200);
	}
	//begin Test
	StartTest=0;
	Testing=0;
	td=wt;  //等待 
	j=0;
	BIE=IE;
	IE=0x80;
	ET0=1;							//定时中断保持
	lowint=INT1;
	while(td)
	{
		if(Testing)
		{
			if(lowint==INT1) {j=0;continue;}
			if(++j<1) continue;
			j=0;
			lowint=INT1;
			if(!lowint)
			{
				if(tc--)
				{
					TR1=1;
					continue;
				}
				else
				{
					TR1=0;
					ET1=0;
					break;
				}
			}
		}
		else
		{
			if(!INT1) {j=0;continue;}
			j++;
			if(j<1) continue;
			StartTest=1;
			Testing=1;
			IE1=0;
			TF1=0;	
			ET1=1;
			if(rc)
			{
				TR1=1;	  //测电阻
			}
			CB=1;
			j=0;
		}
	}
	IE=BIE;
	CB=0;
	TR1=0;
	EX1=0;
	if(td)
	{
		ul=256L*(tn*256L+TH1)+TL1;
	}
	else
	{
		ul=-1;
	}
//	if (ul<80000)
//		ul=ul;

	StartTest=0;
	return(ul);
}
void Test(char i)
{
	long ul;
	if(i<0||i>=10) return;
	ul=Test0(i,50);
	if(i>=4||i==CstdNo)
	{
		if(ul<ParamC0[i])
		{
			TestData[i]=0;
		}
		else
		{
			TestData[i]=(float)nC*(ul-ParamC0[i])/StdC+0.5;
		}
	}
	else
	{
		if(ul==-1)
		{
			TestData[i]=-1;
		}
		else
		{
//			if(ParamC0[i]==-1)
//			{
				TestData[i]=(float)nR*ul/StdR+0.5;
//			}
//			else
//			{
//				if(ul>ParamC0[i])
//				{
//					TestData[i]=0;
//				}
//				else
//				{
//					TestData[i]=1000.0*ul*ParamC0[i]/(ParamC0[i]-ul)/StdR+0.5;
//				}
//			}
		}
	}
}
void Check(char i)
{
	//char i;
	//OkLed=0;
	if(i<6)
	{
		if(i<4)
		{
			if(TestData[i]>MinR&&TestData[i]<MaxR)
			{
				OkLed|=1<<i;
			}
		}
		else
		{
			if(TestData[i]>MinC&&TestData[i]<MaxC)
			{
				OkLed|=1<<i;
			}
		}
		LedShow((OkLed)|(0xfe<<i),(~(OkLed))|(0xfe<<i));
//		OkLed=(OkLed)|(0xfe<<i);
//		NgLed=(~(OkLed))|(0xfe<<i);
	}
	else
	{
		if((OkLed&=0x3f)==0x3f)
		{
			OkLed|=ALLOK;
		}
		LedShow(OkLed,~OkLed);
	}
}
void Display(char i)
{
	switch(i)
	{
	case 0:LcdPrint("R1=");ComPrint("R1=  ");DisplayData(i,TestData[i]);LcdPrint(" ");ComPrint(" MΩ\n");break;
	case 1:LcdPrint("R2=");ComPrint("R2=  ");DisplayData(i,TestData[i]);LcdPrint("\n");ComPrint(" MΩ\n");break;
	case 2:LcdPrint("R3=");ComPrint("R3=  ");DisplayData(i,TestData[i]);LcdPrint(" ");ComPrint(" MΩ\n");break;
	case 3:LcdPrint("R4=");ComPrint("R4=  ");DisplayData(i,TestData[i]);LcdPrint("\n");ComPrint(" MΩ\n");break;
	case 4:LcdPrint("C1=");ComPrint("C1=  ");DisplayData(i,TestData[i]);LcdPrint(" ");ComPrint(" PF\n");break;
	case 5:LcdPrint("C2=");ComPrint("C2=  ");DisplayData(i,TestData[i]);LcdPrint("\n");ComPrint(" PF\n");break;
	case 6:LcdPrint("C3=");ComPrint("C3=  ");DisplayData(i,TestData[i]);LcdPrint(" ");ComPrint(" PF\n");break;
	case 7:LcdPrint("C4=");ComPrint("C4=  ");DisplayData(i,TestData[i]);LcdPrint("\n");ComPrint(" PF\n");break;
	//case 0x90:ComPrint("Parameter:\n");break;
	//case 0x80:ComPrint("MinR= ");DisplayData(i,MinR);ComPrint("0 KΩ\n");break;
	//case 0x81:ComPrint("MaxR= ");DisplayData(i,MaxR);ComPrint("0 KΩ\n");break;
	//case 0x82:ComPrint("MinC=  ");DisplayData(i,MinC);ComPrint(" PF\n");break;
	//case 0x83:ComPrint("MaxC=  ");DisplayData(i,MaxC);ComPrint(" PF\n");break;
	}
}
void DisplayData(unsigned char i,unsigned int n)
{
	#define BUFLEN 6
	char bf[BUFLEN];
	char j;
	bf[BUFLEN-1]=0;
	if(i<0x80 && n>3000)
	{
		for(j=0;j<BUFLEN-1;j++) bf[j]='-';
	}
	else
	{
		for(j=1;j<BUFLEN-1;j++) bf[j]='0';
		bf[0]=' ';
		for(j=BUFLEN-2;j>0;j--)
		{
			bf[j]=n%10+'0';
			n/=10;
		}
		bf[0]=n+'0';
		if(i<4)
		{
			if(bf[1]!='0')
			{
				bf[4]=bf[3];
				bf[3]='.';
			}
			else
			{
				bf[1]=bf[2];
				bf[2]='.';
			}
		}
		else
		{
			for(j=0;j<BUFLEN-2;j++)
			{
				if(bf[j]=='0')
				{
					bf[j]=' ';
				}
				else
				{
					break;
				}
			}
		}
	}
	if(i<0x80)
	{
		bf[0]=' ';
		LcdPrint(& bf[1] );
	}
	ComPrint(bf);
}
void LongPrint(unsigned long d)
{
	char bf[11],i,dv;
	bit e;
	e=0;
	for(i=0;i<9;i++) bf[i]=' ';
	i=9;
	for(i=9;i>=0;i--)
	{
		dv=d % 10;
		d/=10;
		bf[i]=dv+'0';
		if(d==0) break;
	}
	bf[10]=0;
	ComPrint(bf);
}
void Timer1 (void) interrupt TIMER1INT  using 1
{
	tn++;
}
char Remote(void)
{
	if(RI)
	{
		RI=0;
		return(SBUF);
	}
	return(0);
}
bit CheckAuto(bit AUTO)
{
	char i,j;
	i=0;j=0;
	while(AUTO!=AUTOSTEP)
	{
		DelayMs(10);
		if(++i>3)
		{
			AUTO=AUTOSTEP;
			break;
		}
		if(++j>20)	break;
	}
	return(AUTO);
}
char WaitKey(void)
{
	char i,c;
	ComPrint("Waiting Key\n");
	twingle=0;
	while(!STEP)
	{
		c=Remote();
		if(c) return(c);
	}
	while(1)
	{
		c=Remote();
		if(c) return(c);
		if(STEP)
		{
			i=0;
		}
		else
		{
			i++;
			DelayMs(10);
		}
		if(i>3) break;
	}				
	AUTO=CheckAuto(AUTO);
	if(AUTO)
	{
		return('A');
	}
	else
	{
		return('S');
	}
}

void Initial(void)
{
	EA=0;
	IE=0;
	P0=0xff;
	IT0=IT1=1;
	P1=P2=P3=0xff;
//	INPORT=0XFF;
	TMOD=0X11;	//timer0:mode1(low 4bit),timer1:mode1(high 4bit)
	EX0=0;
	EX1=0;

	ET0=1;
	TR0=1;
	TL0=CYCLE % 256;
	TH0=CYCLE/256;
//	TL2=RCAP2L=CYCLE % 256;
//	TH2=RCAP2H=CYCLE/256;
//	T2CON=0;
//	TR2=1;
//	ET2=1;

	TL2=RCAP2L=0xb1;
	TH2=RCAP2H=0xff;
    SCON  = 0x50;       //串口模式:  模式1 接收允许
	T2CON=0x30;
	TI=1;
	TR2=1;
//    SCON  = 0x50;       //串口模式:  模式1 接收允许
//    TMOD |= 0x20;       //定时器模式:定时器工作在模式2
//    PCON |= 0x80;       //SMOD=1; 倍波特率
//    TH1   = 0xF3;       //Baud:9600fosc=24MHz
//   	ES    = 0;          //串行中断允许
//    TI = 1;
//    TR1 = 1;          //定时器1启动 

	EA=1;
} 
void LcdClear(void)
{
	LCM_RST=0;
	delay(10);
	LCM_RST=1;
	init_lcd();
	CurrentX=CurrentY=0;
	ComPrint("\n");
}
void LcdPrint(char * DisBuf)
{
	code unsigned char Line[]={0x80,0x90,0x88,0x98}; 
	char kk=0;
//	printf(DisBuf);
	wr_lcd(comm,0x30);
	while(DisBuf[kk])
	{
		if(DisBuf[kk]=='\n'||CurrentX>=16)
		{
			CurrentX=0;
			CurrentY++;
			if(CurrentY<4) wr_lcd(comm,Line[CurrentY]);
		}
		else
		{
			if(CurrentY>=4)
			{
				LcdClear();
			}
			wr_lcd(dat,DisBuf[kk]);
			CurrentX++;
		}
	 	kk++;
	}
//	ComPrint(DisBuf);
	return;
}
void DelayMs(int a)
{
	td=a/5;
	while(td);
} 


/*------------------初始化-----------------*/
void init_lcd (void)
{
  rst=1;
 // psb=0;
  wr_lcd (comm,0x30);  /*30---基本指令动作*/   
  wr_lcd (comm,0x01);  /*清屏,地址指针指向00H*/
  delay (100);
  wr_lcd (comm,0x06);  /*光标的移动方向*/
  wr_lcd (comm,0x0c);  /*开显示,关游标*/
}

/*----------------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  uchar a,i,j;
  delay (50);
  a=content;
  cs=1;
  sclk=0;
  std=1;
  for(i=0;i<5;i++)		//先输入五个连续的1   -----》是同步位字符串,此时输入记数被重置并且串行传输被同步。
  {
    sclk=1;
    sclk=0;
  }
  std=0;				//RW位
  sclk=1;
  sclk=0;
  if(dat_comm)		   //RS位
    std=1;   //data
  else
    std=0;   //command
  sclk=1;
  sclk=0;			   //第8位规定为0
  std=0;
  sclk=1;
  sclk=0;
  for(j=0;j<2;j++)
  {
    for(i=0;i<4;i++)   //每一个8位指令将被分为两个字节接收到.
    {
      a=a<<1;
      std=CY;
      sclk=1;
      sclk=0;
    }
    std=0;
    for(i=0;i<4;i++)
    {
      sclk=1;
      sclk=0;
    }
  }
}
/*-----------------------------------*/
void delay (uint us)   //delay time
{
  while(us--);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -