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

📄 jcb.c

📁 绝缘检测系统
💻 C
字号:
/************************************************* 
********
********
********
********初稿:2005/1/4
********
********修改:2005-10-31
**************************************************/
#include<stdio.h>
#include<reg51.h>
#include<string.h>
#include<intrins.h>

#define Uchar unsigned char
#define Uint  unsigned int

Uchar m1,dis,n1,n2,light;

sbit  alarm=P3^5;       //alarm--->报警继电器
sbit  alarm1=P3^6;      //alarm1-->蜂鸣器 
sbit  alarm2=P3^7;      //alarm2-->报警灯
sbit  SD=P1^0;          //试验
sbit  XY=P1^1;          //消音输入
bit   flash;
bit   sign1,sign2;

sbit  DCLK1  =P3^2;     	//7816 电压
sbit  DCS1   =P3^4;
sbit  DOUT1  =P1^6; 
sbit  DOUT2  =P3^3;      	//7816 电流    
                           
sbit SI=P1^4;  				//41010
sbit SCK=P1^3;
sbit CS2=P1^2;

sbit  AD1=P0^5;     	    //选择开关
sbit  AD2=P0^6;
sbit  AD3=P0^7;
Uchar select;               //选择档位

sbit  cathode=P1^7;   	    //负极
sbit  anode=P1^5;           //正极
Uint num,num5,num1;
Uint turn,state;

Uint  av1,av2;

Uint  VOLT,CURR,aa,aa1,aa2,aa3,aa4,aa5;    //电压,电流
unsigned long  int mid1,mid2,mid3;
Uchar n;
void VIads7816(void)
{
Uchar i;
Uchar al=0,ah=0;
Uchar bl=0,bh=0;
av1=0;av2=0;
DOUT1=1;
DOUT2=1;
DCS1=0;

DCLK1=1;
DCLK1=0;
DCLK1=1;
DCLK1=0;

for(i=0;i<4;i++)
{
DCLK1=1;
DCLK1=0;
ah=(ah<<1);
bh=(bh<<1);
if(DOUT1)
{
ah=ah|0x01;
}
if(DOUT2)
{
bh=bh|0x01;
}
}

for(i=0;i<8;i++)
{
DCLK1=1;
DCLK1=0;
al=(al<<1);
bl=(bl<<1);
if(DOUT1)
{
al=al|0x01;
}
if(DOUT2)
{
bl=bl|0x01;
}

}
DCS1=1;
av1=ah;av1<<=8;av1|=al;//得到AD值
av2=bh;av2<<=8;av2|=bl;//得到AD值
}


void MCP41010(void)          //量程0-255
	{	
	unsigned char k,p,x;		
            x=turn;
           
		k=0x13;    //控制字,写数据,两个都有效
		CS2=0;		
for(p=0;p<8;p++)
   { 
     		SCK=0;
     		_nop_();		
     		_nop_(); 
            		
			SI=(bit)(k&0x80);
     		SCK=1;		
     		_nop_();
     		_nop_(); 
     		k<<=1;			
   }
	 		_nop_();
     		_nop_(); 
			_nop_();
     		_nop_(); 
			_nop_(); 
for(p=0;p<8;p++)
	{	
			SCK=0;			
     		_nop_();
     		_nop_();      
  			SI=(bit)(x&0x80);			
     		SCK=1;			
     		_nop_();
     		_nop_();           
   			x<<=1;
    }
			_nop_();
     		_nop_(); 
			_nop_();
     		_nop_(); 
			_nop_();
 		   
			CS2=1;
		
}


void begin(void)
{ 
SCON=0x50;
TMOD|=0X21;
TH1=0xFF;
TL1=0xFF;
//TH0=0xFA;
//TL0=0xFA;
PCON=PCON|0X80;
TR1=1;
TI=1;
ET0=1; 					/*T0 Enable*/
TR0 = 1;
EA=1;
alarm=1;
alarm1=alarm2=1;
}

main()
{
Uint z1;
begin();
while(1)
   {
    if(XY==0)
	{
	  if(sign1|sign2)
	  z1=1;
	  else
	  z1=0;
	}

if(((XY==0)|(SD==0)|(sign1||sign2))==0)
{alarm=1;alarm1=1;alarm2=1;}
else
{
 if(SD==0)	alarm1=0;
 else		alarm1=((((SD==0)|((sign1|sign2)&flash)|z1)));


//alarm1=(((!(SD==0)|((sign1|sign2)&flash)|z1)));
alarm2=!((((SD==0)|((sign1|sign2)&flash)|z1)));
alarm=!((SD==0)|(sign1&sign2));}

  if((sign1|sign2)==0)
  {
  z1 = 0;
  }
 }
}



void intt3(void) interrupt 1
{ static  Uchar count;
   			  
  if(AD1&AD2&AD3)   select=0;
  if(AD1&AD2&!AD3)	select=1;
  if(AD1&!AD2&AD3)	select=2;
  if(AD1&!AD2&!AD3)	select=3;
  if(!AD1&AD2&AD3)	select=4;



    if(num<31) num++;
  else{num=0;count++;}

if(num<=15)						//测量正
  	{cathode=1; anode=0;} 
            
		

if(num>15)						//测量负
  	{cathode=0; anode=1;} 	

  if(num==10) { VIads7816();				 
				mid1=av1;				
                mid2=av2;				
                mid3=(mid1*47/mid2);
		if(mid3>3000) mid3=3000;
                aa1=mid3;              
               }
 if(num==25) { VIads7816();				 
				mid1=av1;				
       	        mid2=av2;				
                mid3=(mid1*47/mid2);
		if(mid3>3000) mid3=3000;
                aa2=mid3;               
               }  

 if(aa1<=aa2) aa3=aa1;
   else       aa3=aa2;     
            
		num5++;
	    	if(num5<=10) {
		 aa5+=aa3;}
		else {aa=aa5/10;
			 aa5=0;
			 num5=0;}

  if(count<3)
  aa=250;
  else
  count=11;

				               
if((num==10)||(num==25))
            {   printf("num=%d\n",num);
			       
		printf("aa=%d\n",aa);
		      
		printf("turn=%d\n",turn);
				
		MCP41010();
		 }
	



if(((num>=5)&(num<15))|((num>=20)&(num<30)))  //取样范围内
{if(select==0)      //10K 档
{
	{if (aa<40){if(num<15)   sign1=1; else  sign2=1;}
 	else			{if(num<15)   sign1=0; else  sign2=0;}
	}
}


if(select==1)      //20K 档
{
	{if (aa<51){if(num<15)   sign1=1; else  sign2=1;}
 	else			{if(num<15)   sign1=0; else  sign2=0;}
	}
}



if(select==2)      //50K 档
{
	{if (aa<81){if(num<15)   sign1=1; else  sign2=1;}
 	else			{if(num<15)   sign1=0; else  sign2=0;}
	}
}


if(select==3)     //100 K
{
	{if (aa<132){if(num<15)   sign1=1; else  sign2=1;}
 	else			{if(num<15)   sign1=0; else  sign2=0;}
	}
}

if(select==4)     //200 K
{
	{if (aa<240){if(num<15)   sign1=1; else  sign2=1;}
 	else			{if(num<15)   sign1=0; else  sign2=0;}
	}
}
}


if(aa3<25000) {turn=(aa-30)/160+232;}           //1000K-无穷大
if(aa3<=1100) {turn=(aa-30)/40+212;}            //500-1000K
if(aa3<=550)  {turn=((aa-30)*34+51816)/300;}            //200-500K
if(aa3<=237)  {turn=((aa-30)*36+12000)/100;}            //100-200K
if(aa3<=132)  {turn=((aa-30)*122+19176)/200;}            //90-1000K
if(aa3<=122)  {turn=((aa-30)*153+16422)/200;}            //80-90K
if(aa3<=112)  {turn=((aa-30)*173+14790)/200;}            //70-80K
if(aa3<=101)  {turn=((aa-30)*183+14076)/200;}            //60-70K
if(aa3<=91)   {turn=((aa-30)*234+11010)/200;}            //50-60K
if(aa3<=81)   {turn=((aa-30)*295+7956)/200;}            //40-50K
if(aa3<=71)   {turn=((aa-30)*32+660)/20;}            //30-40K
if(aa3<=61)   {turn=((aa-30)*429+3672)/200-3;}            //20-30K
if(aa3<=51)   {turn=(aa-30)*11*51/200+2;}          //10-20K
if(aa3<=40)   {turn=(aa-30)*13*51/200-1;}     //10K
if(aa3<=31)   {turn=2;}    

if(turn>=255) turn=254;
if(turn<=1)   turn=0;

  if(num1<10) num1++;
  else{num1=0;flash=!flash;}


}

⌨️ 快捷键说明

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