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

📄 2.1 main.c

📁 自动检测电容值
💻 C
字号:
#include <reg52.h>
//#include <string.h>
#include <intrins.h>
#include <stdio.h> 


#define uint  unsigned int
#define uchar unsigned char
//#include  "VI2C_C51.h"
#include "ocm4x8c串.h"

#define Debugging 1


sbit  Rf=P3^2;
sbit  Cf=P3^3;

sbit  BELL=P3^5;

sbit  DAT=P1^0;
sbit  CLK=P1^1;
sbit  CS=P1^2;

sbit  LDM_CS=P1^5;
sbit  LCM_STD=P1^6;
sbit  LDM_SCLK=P1^7;

sbit  RA=P2^0;
sbit  RB=P2^1;
sbit  RC=P2^2;
sbit  CA=P2^3;
sbit  CB=P2^4;

sbit  STEP=P0^1;
sbit  AUTOSTEP=P0^2;

sbit  Mouse1=P0^5;
sbit  Mouse2=P0^6;
sbit  Mouse3=P0^7;

sbit  MD=P0^4;

bit   TestModel;

uchar OKLED;
uchar NGLED;

#define OK 33
#define NG 44
uchar   Test_timer;
uchar   Test_OKNG;
uchar   Test_012;
 
uchar Test_Order;
uchar STEP_check;
uchar cycle;
uchar BELL_temp;
uchar BELL_Flash;
#define BELL_timer 6




unsigned long RC_timer;
unsigned long RCr_timer;


#define FN 12
uint RCtemp[FN];



//LED显示
void  LEDshow(void) 
{
   uchar i;
 

   for(i=0;i<7;i++)
	{
	 if((NGLED>>(6-i))&1) DAT=1;  
     else  DAT=0; 
	  delay (5); 	 
     CLK=1;
	 delay (5);   
     CLK=0;
	 delay (5);
	}

	for(i=0;i<7;i++)
	{
	  if((OKLED>>(6-i))&1)DAT=1;   /*判断发送位*/
       else  DAT=0;  
	  delay (5);   
     CLK=1;
	delay (5);  
     CLK=0;
	delay (5); 
	}
     CS=1;
	 delay (5);
     CS=0;
}									 	



//串口初始化
void init_serialcomm(void)
{
    SCON  = 0x50;       //串口模式:  模式1 接收允许
    TMOD |= 0x20;       //定时器模式:定时器工作在模式2
    PCON |= 0x80;       //SMOD=1; 倍波特率
    TH1   = 0xF3;       //Baud:9600fosc=24MHz
   // ES    = 1;          //串行中断允许
    TI = 1;
    TR1   = 1;          //定时器1启动 

/*	SCON = 0x50; //串口方式1,允许接收
	TMOD = 0x20; //定时器1定时方式2
	TCON = 0x40; //设定时器1开始计数
	TH1 = 0xE8;	//11.0592MHz 1200波特率
	TL1 = 0xE8;
	
	TR1 = 1; //启动定时器	*/

}



//初始化定时器
void init_timer(void)
{
  TH0=0;
  TL0=0;

  TMOD|=0x01; //工作方式1 16位计数方式
  ET0=1;     //定时器0中断允许
 // TR0=1;     //定时器0启动
  
}


//定时器0中断
void timer0(void) interrupt 1 using 1
{
  if(++Test_timer>30) //超时1秒 
  {
    IE0=0;
    IE1=0;
    TF0=0;

	EX0=0;
    EX1=0;
    TR0=0;
    Test_OKNG=NG;

 	}



   if(BELL_temp>0)
	{
      Test_timer=0;
	 if(--BELL_temp==0) 
     { 
	    if(BELL_Flash>0)
		 {
		    BELL_Flash--;
            BELL_temp=BELL_timer;
			BELL=~BELL;
		  }
	  else	
	  {
	    BELL=1;
		TR0=0;
		}
      }
	 }
	 else  BELL=1;
 
}
 

//初始外部中断
void init_int(void)
{
   IT0=1;  //外部中断0边沿触发
//	EX0=1;  //外部中断0允许中断

	IT1=1;
 //  EX1=1;

}

//外部中断0
void int0(void) interrupt 0 using 2
{
  uint temp;

  temp=TH0;
  temp=(temp<<8)+TL0; 
  TH0=0;
  TL0=0;
   
   cycle++;
   if(cycle>=50)
   {
     RCtemp[cycle-50]=temp;
	 if(cycle==(FN+50-1))
	 { 
	   TF0=0;
	   IE0=0;
	   TR0=0;
       EX0=0;
 	   cycle=0;
       Test_OKNG=OK;
	 }
   } 

}

//外部中断1
void int1(void) interrupt 2 using 3
{
  uint temp;

  temp=TH0;
  temp=(temp<<8)+TL0; 
  TH0=0;
  TL0=0;
   
   cycle++;
   if(cycle>=50)
   {
     RCtemp[cycle-50]=temp;
	 if(cycle==(FN+50-1))
	 { 
	   TF0=0;
	   IE1=0;
	   TR0=0;
       EX1=0; 
 	   cycle=0;
       Test_OKNG=OK;
	 }
   } 
}


void TEST_GO(void)
{
  
  BELL=1;
  BELL_Flash=0;
  BELL_temp=0;

  Test_timer=0;
  Test_OKNG=0;
  cycle=0;

  IE0=0;
  IE1=0;
  TF0=0;
  
  if(Test_Order<5) EX0=1;
  else             EX1=1;

  TH0=0;
  TL0=0;
  TR0=1;
}

void BB(uchar i)
{
 
  BELL=0;
  TH0=0;
  TL0=0;
  TR0=1; 
   
  if(i==OK)
	 {
	   BELL_temp=BELL_timer*2; 
	 }
   else 
   {
	  BELL_temp=BELL_timer;
	  BELL_Flash=2;
	 }
 
}

uint Filtering(uint *RCi)
{
	 unsigned long  temp;
	 uchar i,j;

	for (j=0;j<FN-1;j++)
	{
		for (i=0;i<FN-j;i++)
		{
			if (RCi[i]>RCi[i+1])
			{
			  temp=RCi[i];
			  RCi[i]=RCi[i+1]; 
			  RCi[i]=temp;
			}
		}
	}
	temp=0;
	for(i=2;i<FN-2;i++)	temp+=RCi[i];
	return (uint)(temp>>3);
  
}


uint code RCmaxmin[6][2]= //上下限
{
  {12672,8448},  //10560  +-20%
  {12672,8448},  //
  {12672,8448}, //
  {12672,8448},	//
  {700, 300},   //500   +-40%
  {700, 300}    //
};   

#define  Rr 10000
#define  Cr 497
#define  Cc 30

void TEST(uchar Order)
{
    unsigned long  temp;
	uchar  LCM_ASCII[16];
	 

	 if(Test_OKNG==NG)
		{
	//	 P2=0xff;
		 Test_012=2;
         NGLED&=~(1<<(Order-1));
         Test_OKNG=0;

           if(TestModel==0) BB(NG);

           if(Order==6)
			   {
                if(OKLED==0xc0) 
				   { 
					   OKLED&=~(1<<6);
				    	if(TestModel==1) BB(OK);                 
					 }
				  else           
				    { 
			          NGLED&=~(1<<6);
                   if(TestModel==1)  BB(NG);             
				    }
			   }
		   LEDshow();
		   
		 
		   switch(Order)
	         {
	          case 1: 
			         printf("R1:∞K NG\n");//测试
					 chn_disp3("R1:∞K NG\n",0x80);
			  break;
			  case 2: 
			         printf("R2:∞K NG\n");//测试
					 chn_disp3("R2:∞K NG\n",0x90);
			  break;
			  case 3: 
			         printf("R3:∞K NG\n");//测试
					 chn_disp3("R3:∞K NG\n",0x88);
			  break;
			  case 4: 
			         printf("R4:∞K NG\n");//测试
					 chn_disp3("R4:∞K NG\n",0x98);
			  break;
			  case 5: 
			         clrram();
					 printf("C5:0p NG\n");//测试
					 chn_disp3("C5:0p NG\n",0x80);
			  break;
			  case 6: 
			         printf("C6:0p NG\n");//测试
					 chn_disp3("C6:0p NG\n",0x90);
					 printf("\n");
			  break;
		     }

       }



	        if(Test_OKNG==OK)
			  {
			     // P2=0xff;
				  Test_OKNG=0;

					switch(Test_012)
	              {
	               case 0:			
							 
							 RCr_timer=Filtering(RCtemp);

                             if(Order<5) P2=Order|0xf8;
                             else        P2=((Order-4)<<3)|0xe7;
							 Test_012=1;

					      	    
							//	RC_timer=Filtering(RCtemp);
							//	printf("%u,\n" ,RC_timer);//测试
								  
							  // P2=0;
							  // Test_012=0;
							  				  
							  
							  TEST_GO();
				      break;
					  case 1:
                               Test_012=2; 
							  RC_timer=Filtering(RCtemp); 
		            
								if(Order<5)  temp=RC_timer*Rr/RCr_timer;
								else        
								{
								   temp=RC_timer*(Cr+Cc)/RCr_timer;
								   if(temp>Cc) temp-=Cc;
                                   else temp=0;
								  }
   
                               if((RCmaxmin[Order-1][0]>=temp)&&(temp>=RCmaxmin[Order-1][1])) 
								         {
								               OKLED&=~(1<<(Order-1));
                                               if(TestModel==0) BB(OK);                  //BB 

											   switch(Order)
											   {
											    case 1:
												      printf("R1:%uK OK\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"R1:%uK OK\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x80);  
											    break;
											    case 2:
												      printf("R2:%uK OK\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"R2:%uK OK\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x90);
											    break;
											    case 3:
												      printf("R3:%uK OK\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"R3:%uK OK\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x88);
											    break;
											    case 4:
												      printf("R4:%uK OK\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"R4:%uK OK\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x98); 
											    break;
											    case 5:
												      printf("C5:%up OK\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"C5:%up OK\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x80);  
											    break;
											    case 6:
												      printf("C6:%up OK\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"C6:%up OK\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x90);  
											    break;
		                                       }
									    }
								    else                                                               
							           {
									        NGLED&=~(1<<(Order-1));
									       if(TestModel==0)	 BB(NG);                 //BB

			                                 switch(Order)
											   {
											    case 1:
												      printf("R1:%uK NG\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"R1:%uK NG\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x80);  
											    break;
											    case 2:
												      printf("R2:%uK NG\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"R2:%uK NG\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x90);
											    break;
											    case 3:
												      printf("R3:%uK NG\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"R3:%uK NG\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x88);
											    break;
											    case 4:
												      printf("R4:%uK NG\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"R4:%uK NG\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x98); 
											    break;
											    case 5:
												      clrram();
													  printf("C5:%up NG\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"C5:%up NG\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x80);  
											    break;
											    case 6:
												      printf("C6:%up NG\n",(uint)temp);//测试
													  sprintf(LCM_ASCII,"C6:%up NG\n",(uint)temp);
													  chn_disp3(LCM_ASCII,0x90);  
											    break;
		                                       }
								   	  }


                          if(Order==6)
				            {
                               if(OKLED==0xc0) 
					              { 
					                OKLED&=~(1<<6);
						            if(TestModel==1) BB(OK);                 //BB 
									printf("OK\n",(uint)temp);//测试
									chn_disp3("     OK     \n",0x98);  
					           	 }
					           else           
				                 { 
				 	                NGLED&=~(1<<6);
                                    if(TestModel==1)  BB(NG);              //BB 
								    printf("NG\n",(uint)temp);//测试
									chn_disp3("    NG      \n",0x98); 
						         }
								 printf("\n");
					         }	 
    
						    	LEDshow();	               
						break;
						}
					
				 }
				
			  
		if(Test_012==2)
		 {
				    
           if(STEP==0)
			    { 
			      if(STEP_check<0xff) STEP_check++;
			    }
			 else 		 
			 {
			     if(Test_Order<6)
				   { 
				   	if((STEP_check>50)||(TestModel==1)) 
			          {
                          Test_012=0;
						  Test_Order++;
					      if(Test_Order<5) P2=0xf8; 
						  else    P2=0xe7;
						  if(Test_Order==5) clrram(); 
						  TEST_GO();
						}
				   }
				   else
				   {
					 STEP_check=100; //测试
					 if(STEP_check>50)
					   {
						   Test_Order=0;
                           Test_012=0;
						   P2=0xff;
	                       clrram();
					  	   chn_disp3("  STANDBY   \n",0x80);
					    } 
					   
				    }
                 STEP_check=0;
			  }	 
	  }
          
}
 
 


void main(void)
{
  uchar i,j;
  

  init_serialcomm();  //初始化串口
  init_timer();
  init_int();

  EA=1;

  
  init_lcd();
  chn_disp3("  珠海晶研力信  \n",0x80);
  chn_disp3("  简易高压测试仪\n",0x90);
  chn_disp3("            V2.1\n",0x98);

  printf("珠海晶研力信自动化设备有限公司\n" );
  printf("简易高压测试仪 V2.1\n\n" );

  for(i=0;i<7;i++)
   {
	  OKLED=NGLED=~(1<<i);
	  LEDshow();
	  BELL=0;
	  delay (0xffff);
	  OKLED=NGLED=0xff;
	  LEDshow();
	  BELL=1;
	  delay (0xffff);
	}


   	for(j=0;j<250;j++)
   {
	 if(MD==0)
	 {
	   if(++i==50)
	   {
		 P2=0; 
		 while(1);
	   }
	 }

   }
  	clrram();
	chn_disp3("  STANDBY   \n",0x80);


 while(1)
 {

	switch(Test_Order)
	 {
	  case 0:
			if(AUTOSTEP)TestModel=1;	//自动
            else        TestModel=0;	//单步

	         STEP_check=100; //测试

	       if(STEP==0)
			 { 
			    if(STEP_check<0xff) STEP_check++;
			 }
			 else 		 
			 {
			   if(STEP_check>50)
				{
				  STEP_check=0;

			  	  P2=0xf8;
				//  P2=1;
                  Test_Order=1;
				  Test_012=0;
				  clrram();
				  TEST_GO();
				}
                STEP_check=0;
			  }	 
			  OKLED=0xff;
              NGLED=0xff;
			 LEDshow();
	  break;
	  case 1:    
	  case 2:
	  case 3:
	  case 4: 
	  case 5: 
	  case 6:
             
			 TEST(Test_Order);
	  break;
	  }


 }

}

⌨️ 快捷键说明

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