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

📄 7135.c

📁 7135.C:用89C52单片机配合7135作电压检测
💻 C
字号:
#include <AT89X52.H>
#include<intrins.h>
#define PERIOD 0x59
#define SECOND 4000
sbit Dwon_Key=P3^1;                      //下调
sbit Set_Key=P3^0;                       //设置
sbit Up_Key=P1^7;                        //上调
sbit LED_Segment=P2^0;                   //字段
sbit LED_Location=P2^1;                  //位
sbit Dog_Out=P2^3;                      //喂狗
sbit dp=P0^7;                             //点
sbit fk=P0^6;                             //负号
sbit POL=P1^5;                           //极性
sbit BUSY=P3^2;                         //BUSY输入
sbit CD=P1^3;                           //充电
sbit FD=P1^2;                           //放电
sbit CM=P2^5;                           //充满

unsigned char H,L,dog,sec,js,KeyCount,Bat=1,N=1;
int Value,count,MAX_V;
unsigned char code LED_Show[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xab,0x89,0xc7};
unsigned char code LED_Bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char bdata bData;
sbit YC=bData^0;
sbit FDdone=bData^1;
sbit Full=bData^2;
sbit Puse=bData^3;


void iniINT0(void){
  IT0=1;
  EX0=1;
  BUSY=1;
}

void iniTimer0(void)                    //初始化Timer0
{
 TMOD=TMOD | 0x0d;
 TH0=0xD8;
 TL0=0xEF;
 TR0 = 1;
}


/*------------------------------------定时器T1初始化----------------------------*/
void iniTimer1(void){
       TH1 = PERIOD;
       TL1 = PERIOD;
       TMOD = TMOD | 0x20;  
       TR1 = 1;            /* 启动T1 */
       EA = 1;             /* 开中断 */
       ET1 = 1;            /* 允许T1中断 */
}
/*----------------------------------------------------------------------------------*/

/*------------------------------------定时器T1中断服务程序----------------------------*/
timer1() interrupt 3 using 2
{ 
  ++dog;++KeyCount;
  if(dog<50){
    Dog_Out=0;
  }
  if(dog>50){
    Dog_Out=1;
  }
  if(dog>100){
    dog=0;
  }
  if(++count == SECOND){
     count=0;
	  if(++sec==60){
	    sec=0;
	  }
	}
 if(!Full && !Puse && FDdone && Bat==1){
  if(count<=3940){
	 CD=0;
  }
  if(count>3940 && count <=3948){
	 CD=1;
  }
  if(count>3948 && count <=3988){
	 FD=0;
  }
  if(count>3988){
	 FD=1;
  }
 }
}  

/***************************************外部中断0中断程序****************************************************/
Int0() interrupt 0 using 1
{ 
  int temp;
  H=TH0;L=TL0;
  TH0=0xD8;TL0=0xEF;
  temp=H;
  temp=(temp<<8);
  temp=temp | L;
  if(temp<=19999){
    Value=temp;
    YC=0;
  }
  if(temp>=20000){
     YC=1;                  //置溢出标志位
  }
}


void Delay50us(char z){
    char j,i;
       for(j=0;j<z;j++)
         for(i=0;i<1;i++)
              ;
}


/*-----------------------------字段显示触发脉冲--------------------------------------*/
void Segment_Pulse(void){
  	LED_Segment=1;
   _nop_();_nop_();_nop_();
	LED_Segment=0;
   _nop_();_nop_();_nop_();
}
/*----------------------------------------------------------------------------------*/

/*-----------------------------位显示触发脉冲--------------------------------------*/
void Location_Pulse(void){
  	LED_Location=1;
   _nop_();_nop_();_nop_();
	LED_Location=0;
   _nop_();_nop_();_nop_();
}
/*----------------------------------------------------------------------------------*/

void Location_0(void){
   P0=0;
   Location_Pulse();
}

void Show_V(void){             //显示电压
	 unsigned char x,y;
	 int j,z,k;
	 j=Value%10000;z=j%1000;k=z%100;
	 for(x=0;x<8;x++){
	  switch(x+1){
	    case 1:
          if(Bat==1){
			   y=12;
			 }
			 if(Bat==2){
			   y=13;
			 }
			 if(Bat==3){
			   y=14;
			 }
		 break;
       case 2:y=N;break;
	    case 3:
		    if(!YC){
			   y=10;
			 }
		    if(YC){
	         if(count<2500){
	           y=1;
	         }
	         if(count>2500&&count<5000){
	           y=10;
	          }
			 }
		 break;
       case 4:y=Value/10000;break;
	    case 5:y=j/1000;break;
       case 6:y=z/100;break;
	    case 7:y=k/10;break;
       case 8:y=k%10;break;
		 default:break;
	  }
	 if(x==3|x==4|x==5|x==6|x==7){
	  if(YC){
	    y=10;
	  }
	 }
	 P0=LED_Show[y];
	 if(!POL && x==2){
      fk=0;
	 }
	 Segment_Pulse();
	 P0=LED_Bit[x];
	 Location_Pulse();
    Delay50us(20);
    Location_0();
   }
}  


void AutoCD1(void){              //镍镉自动充电
  if(!FDdone && !Full){ 
	if(Value > (950*N)){
	  CD=1;FD=0;
	}
	if(Value < (950*N)){
	  FD=1;FDdone=1;
	}
  }
  if(FDdone && !Full){
    if(sec==57){
	   CD=0;FD=1;Puse=1;
	 }
	 if(sec==59){
	   if(Value>MAX_V){
		  MAX_V=Value;         //最大值存于MAX_V
		}
		if((MAX_V-Value)>(7*N)){     //-△V停止充电检测(脉冲充电)
		  CM=0;CD=1;FD=1;Full=1;
		}
      Puse=0;
	 }
  }
}

void AutoNH(void){            //镍氢电池自动充电
  if(!FDdone && !Full){ 
	if(Value > (1000*N)){
	  CD=1;FD=0;
	}
	if(Value < (1000*N)){
	  FD=1;CD=0;FDdone=1;
	}
  }
  if(FDdone && !Full){
	  if(Value>MAX_V){
	    MAX_V=Value;           //最大值存于MAX_V
	  }
	   if((MAX_V-Value)>(3*N)){       //-△V停止充电检测(恒流充电)
         Full=1;CM=0;CD=1;FD=1;
	   }
	}
}

void BatCD(void){
  if(Bat==1){
    AutoCD1();
  }
  if(Bat==2){
    AutoNH();
  }
  if(Bat==3){
    ;
  }
}

void KEY(void){
  if(!Up_Key){                     //启动充电
    Full=0;CM=1;
  }
  if(!Dwon_Key){                   //设置电池节数
    if(++KeyCount>200){
	   N++;KeyCount=0;
		if(N==11){
		   N=1;
		}
	 }
  }
  if(!Set_Key){                     //设置电池种类
    if(++js > 25){
     Bat++;js=0;
	 if(Bat>3){
	   Bat=1;
    }
  }
 }
}

void main(void){
  iniINT0();
  iniTimer0();
  iniTimer1();
  Full=1;
  while(1){
    Show_V();
	 BatCD();
	 KEY();
  }
}

⌨️ 快捷键说明

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