智能型磷酸铁锂电池快速充电控制器设计

 

先给整体设计框图:

 

智能型磷酸铁锂电池快速充电控制器设计_第1张图片

 

废话不多说了,

程序框图:

智能型磷酸铁锂电池快速充电控制器设计_第2张图片

 

源码:

/************************************
*********STC89C51**********
**********12MHz晶振********/

#include "reg51.h"

#define uint8 unsigned char
#define uint16 unsigned int
#define uchar unsigned char
#define uint unsigned int




/********************寄存器内部地址定义********************/
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;

sfr ADC_CONTR = 0xBC;
sfr ADC_RES   = 0xBD;
sfr ADC_RESL  = 0xBE;
sfr P1ASF     = 0x9D;

sfr CCON     = 0xD8; //PCA控制寄存器
sfr CMOD     = 0xD9; //PCA模式寄存器
sfr CCAPM0   = 0xDA; //PCA模块0模式寄存器 //模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)   
sfr CCAPM1   = 0xDB; //PCA模块1模式寄存器 //模块1对应P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列)
sfr CL       = 0xE9;    //PCA 定时寄存器 低位
sfr CH       = 0xF9; //PCA 定时寄存器 高位
sfr CCAP0L   = 0xEA; //PCA模块0的 捕获寄存器 低位
sfr CCAP0H   = 0xFA;    //PCA模块0的 捕获寄存器 高位
sfr CCAP1L   = 0xEB; //PCA模块1的 捕获寄存器 低位
sfr CCAP1H   = 0xFB; //PCA模块1的 捕获寄存器 高位
sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0
sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1
sbit CF   = CCON^7;     //PCA计数溢出标志位
sbit CR   = 0xDE;     //PCA计数器 运行控制位
sbit CCF1 = CCON^1;     //PCA模块1中断标志
sbit CCF0 = CCON^0;     //PCA模块0中断标志
/************************************************************/







#define TIMER0_HIGHT 0xE5	//设置定时器0工作方式1自动装载初值,定时5ms,Fosc=12MHZ
#define TIMER0_LOW   0xF3



#define LCD_Data P0           //LCD的数据口
sbit    LCD_BF=LCD_Data^7;    //LCD忙信号位
sbit    LCD_RS=P2^6;
sbit    LCD_RW=P2^5;
sbit    LCD_EN=P2^4;
sbit    BEEP=P2^3;//控制喇叭
sbit    RED=P2^1;//控制红灯
sbit    YELLOW=P2^0;//控制黄灯
sbit    OPEN=P2^2;//控制继电器

unsigned int  I_DATA=0;
unsigned int  V_DATA=0;
unsigned char Time5ms=0;             


unsigned char tp=0;
unsigned int  ad_average_result,R,Vin;
unsigned char Start=0;
unsigned char D2=0; 
unsigned char D1=0;        
unsigned int  U_SET=370;


unsigned int  I_D[3];



unsigned char Ms_flag=0;

/*-------------------延时子函数-------------------------*/
#define XTAL 16                       //晶振频率,单位MHz
void delay_1us(void)                 //1us延时函数
  {
  // a_nop_();
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i11){RED=1;YELLOW=0;}//开始充电
          if(I_DATA<10&&V_DATA>365){//表示充满

RED=0;YELLOW=1;OPEN=1;//报警,开启继电器
BEEP=0;

}
      
if(V_DATA<20&&I_DATA==0){BEEP=1;Start=0;OPEN=1;RED=0;YELLOW=1;}//电流=0,电压小于0.2V表示电池已经拔掉
}
          

}		 		  

//--------------------主程序--------------------------------
void main()
{
  

//------------------P1口配置---------------
   P1M0=0X18;
   P1M1=0XE7;
//------------------PWM配置---------------  
   CMOD=0X0E;      //f=7.8Khz
   CL=0;
   CH=0;
   
   
  
   CCAPM1=0X42;
   CCAPM0=0X42;  


   CCAP1H=124-(float)((U_SET-420)/3.2);//设置电压PWM

 
   
   CCAP0H=62;//设置电流PWM
   

   CR=1;

//------------------AD配置---------------
    ADC_Power_On();      //AD转换电

//---------------中断配置----------------
	TMOD &= 0xF0;
	TMOD |= 0x01;		//设置定时器0,方式1:16位定时器
	TH0 = TIMER0_HIGHT;	//设置定时器0高字节初值
	TL0 = TIMER0_LOW;	//设置定时器0低字节初值
	TR0 = 1;			//启动定时器0
    ET0 = 1;			//开定时器0中断
	EA = 1;         	//开总中断
//---------------------------------------
 
    RED=0;
    YELLOW=1;
    BEEP=1;
    Start=0;//关闭充电
    LCD_initial();
 	
    LCD_cursor(0x00);//写地址
              
    LCD_prints("Battery Charger ");

    LCD_cursor(0x40);//写地址

    LCD_prints("I=     ");

    LCD_cursor(0x49);//写地址

    LCD_prints("U=     ");
     
    EA = 1;  //使能全局中断
  
	while(1)
	{

//按键检测------------------
if((P1&0x01)==0x00){
         delay_nms(10);
		  if((P1&0x01)==0x00){
         
          Start=!Start;
       if(Start==1){
          caiyangP1_7();
          
          OPEN=0;//开启继电器
          CCAP0H=230;
          delay_nms(200);//延时
          caiyangP1_6();
          caiyangP1_7();
          delay_nms(200);
          caiyangP1_6();
          caiyangP1_7();
          delay_nms(200);
          caiyangP1_6();
          caiyangP1_7();
          delay_nms(200);
          caiyangP1_6();
          caiyangP1_7();
          delay_nms(200);
          caiyangP1_6();
          caiyangP1_7();
          
          }else{OPEN=1;RED=0;YELLOW=1;BEEP=1;}
          
          while((P1&0x01)==0x00);//等待按键释放
        
	}
}

  if(Ms_flag){//查询中断标志
     Ms_flag=0;
     

             D1++; 

               caiyangP1_6();//AD
               caiyangP1_7();//AD
              
              I_D[1]= I_D[1]+I_DATA;//求和
               I_D[2]= I_D[2]+V_DATA;
             if(D1==20){

               I_DATA=I_D[1]/20;//求平均
               V_DATA=I_D[2]/20;
               I_D[1]=0;I_D[2]=0;
               D1=0;
            
               Value_to_ASCII_I(I_DATA,0x40);//更新液晶显示电流值
               Value_to_ASCII_U(V_DATA,0x49);//更新液晶显示电压值
            

               }
             D2++;
             if(D2==5){
			 D2=0;
			 Change();//充电检测
			 }      

          }
      
  }


}

/********************************************************************
函数功能:定时器/计数器0中断处理
入口参数:null
返    回:null
备    注:null
********************************************************************/
void Timer0IntProc() interrupt 1
{
	TH0 = TIMER0_HIGHT;	//设置定时器0高字节初值
	TL0 = TIMER0_LOW;	//设置定时器0低字节初值
    
    Time5ms++;
     if(Time5ms==10){Ms_flag=1;Time5ms=0;}

  
}


 

 

 

你可能感兴趣的:(单片机)