文档库 最新最全的文档下载
当前位置:文档库 › 合泰源码

合泰源码

#include "HT66f004.h"
//#include "LCD.h"
#include "MY_MCU_15102.h"
//#define EEP
//#define DUG

u16 VAR_cha_delay_cnt;
u8 power_on,VAR_DC_OUT_cnt;

u8 usb_ld_fg,pwm_set_fg;
u8 dc_ld_fg;

u8 dc_oc_fg;
u8 usb_oc_fg;
u16 Var_lamp_dc;
u8 VAR_scan_cnt;

u16 pwm_num;


u16 VAR_RS_temp; //charging current temp

//u16 VAR_CHA_I_acc; //charging current accumlation
u16 VAR_CHA_I_aver; //charging current average
u16 VAR_CHA_I_temp; //charging current temp

u16 VAR_LD_I_acc; //discharging current accumlation
u16 VAR_LD_I_aver; //discharging current average
u16 VAR_LD_I_temp; //discharging current temp

//u16 VAR_BAT_V_max; //battery voltage max.
u16 VAR_BAT_V_aver; //battery voltage average
u16 VAR_BAT_V_temp; //battery voltage temp

//u16 VAR_BAT_T_max; //battery temperature max.
u16 VAR_BAT_T_aver; //battery temperature average
//u16 VAR_BAT_T_temp; //battery temperatrue temp

u8 VAR_remain; //
u8 VAR_remain_current; //

u8 VAR_remain_h; //remain 10bit for lcd code
u8 VAR_remain_l;

u8 VAR_remain_cnt; //capacity acc cnt 2.048*244=499.712ms
u8 VAR_remain_cnt_h; //capacity acc cnt hight bit

//u8 VAR_remain_dir; //capacity acc direction: 0:idle;1: dec cap; 2:add cap

u8 VAR_cha_cnt; //capacity acc cnt 2.048*244=499.712ms
u16 VAR_cha_cnt_h; //capacity acc cnt hight bit

u8 VAR_updata_remain_FG;
u8 VAR_cha_remain_FG;
//u16 VAR_vp_current; //

u16 VAR_pd_cnt; //休眠计数器
u8 VAR_pd_cnt_h;

u16 VAR_power_cnt;
u16 VAR_oc_cnt;
u16 VAR_oc_rl_cnt;

//u8 buff;
u8 VAR_seg5;
u8 VAR_flash_FG;
u8 VAR_flash_cnt;
u8 VAR_flash_cnt_h;
u8 VAR_flash_seg_cnt;
u8 VAR_full_FG;

u8 Var_skey_FG;
u8 Var_lkey_FG;
u8 Var_pkey_cnt;

u8 Var_keytimes_cnt;

u8 buff_seg4;
u8 VAR_ot_FG;
u8 Led_flash_cnt;
u8 Led_flash_FG;

u8 Clr_delay_cnt;
//u16 acca; //pwm

//u8 AD_H,AD_L;
u8 v_cnt;

//u8 Pd_FG,Pd_io_stu;
/*********************/
u8 Model_FG;
/*********************/
u8 VAR_remain_low_cnt;
u16 ms;

void eeprom_wrb(u8 add,u8 data);
/**********************************/
//read: Lo byte then Hi byte
//write: Hi byte then Lo byte
/**********************************/
void set_ccr0a(u16 duty0)

{
u8 tmp_l,tmp_h;

tmp_l=(u8)(duty0&0x0ff);
tmp_h=(u8)((duty0/256)&0x03);
_ptm0al=tmp_l;//(u8)(duty0&0x0ff); //d7 d6 d5 d4 d3 d2 d1 d0
_ptm0ah=tmp_h;//(u8)((duty0>>8)&0x03); //d9 d8
}
void set_ccr0p(u16 period0)
{
u8 tmp_l,tmp_h;

tmp_l=(u8)(period0&0x0ff);
tmp_h=(u8)((period0/256)&0x03);

_ptm0rpl=tmp_l;//(u8)(period0&0x0ff);
_ptm0rph=tmp_h;//(u8)((period0>>8)&0x03);
}
void set_ccr1a(u16 duty1)
{
u8 tmp_l,tmp_h;

tmp_l=(u8)(duty1&0x0ff);
tmp_h=(u8)((duty1/256)&0x03);
_ptm1al=tmp_l;//(u8)(duty0&0x0ff); //d7 d6 d5 d4 d3 d2 d1 d0
_ptm1ah=tmp_h;//(u8)((duty0>>8)&0x03); //d9 d8
}
void set_ccr1p(u16 period1)
{
u8 tmp_l,tmp_h;

tmp_l=(u8)(period1&0x0ff);


tmp_h=(u8)((period1/256)&0x03);

_ptm1rpl=tmp_l;//(u8)(period0&0x0ff);
_ptm1rph=tmp_h;//(u8)((period0>>8)&0x03);
}
void pwm0_dec()
{
u8 tmp_l,tmp_h;
u16 acca;

tmp_h=_ptm0ah;
tmp_l=_ptm0al;
acca=256*tmp_h+tmp_l;

if(acca>PWM_MIN)
{
acca--;
}
//set_ccr0a(acca);
tmp_l=(u8)(acca&0x0ff);
tmp_h=(u8)((acca/256)&0x03);
_ptm0al=tmp_l;//(u8)(duty0&0x0ff); //d7 d6 d5 d4 d3 d2 d1 d0
_ptm0ah=tmp_h;//(u8)((duty0>>8)&0x03); //d9 d8
}
void pwm0_inc()
{
u8 tmp_l,tmp_h;
u16 acca;

tmp_h=_ptm0ah;
tmp_l=_ptm0al;
acca=256*tmp_h+tmp_l;
if(acca<200)
{
acca++;
}
//set_ccr0a(acca);
tmp_l=(u8)(acca&0x0ff);
tmp_h=(u8)((acca/256)&0x03);
_ptm0al=tmp_l;//(u8)(duty0&0x0ff); //d7 d6 d5 d4 d3 d2 d1 d0
_ptm0ah=tmp_h;//(u8)((duty0>>8)&0x03); //d9 d8
}

////////////////////////////////////////////////////////////
void pwm1_dec()
{
u8 tmp_l,tmp_h;
u16 acca;

tmp_h=_ptm1ah;
tmp_l=_ptm1al;
acca=256*tmp_h+tmp_l;

if(acca>0)
{
acca--;
}
//set_ccr0a(acca);
tmp_l=(u8)(acca&0x0ff);
tmp_h=(u8)((acca/256)&0x03);
_ptm1al=tmp_l;//(u8)(duty0&0x0ff); //d7 d6 d5 d4 d3 d2 d1 d0
_ptm1ah=tmp_h;//(u8)((duty0>>8)&0x03); //d9 d8
}
void pwm1_inc()
{
u8 tmp_l,tmp_h;
u16 acca;

tmp_h=_ptm1ah;
tmp_l=_ptm1al;
acca=256*tmp_h+tmp_l;
if(acca{
acca++;
if(acca>25)//最大占空设定,防止过流
acca--;

}
//set_ccr0a(acca);
tmp_l=(u8)(acca&0x0ff);
tmp_h=(u8)((acca/256)&0x03);
_ptm1al=tmp_l;//(u8)(duty0&0x0ff); //d7 d6 d5 d4 d3 d2 d1 d0
_ptm1ah=tmp_h;//(u8)((duty0>>8)&0x03); //d9 d8
}
///////////////////////////////////////////////////////////////////////////////

void set_pwm(u16 pwm_cnt)
{
u8 tmp_l,tmp_h;
u16 acca;

tmp_h=_ptm1ah;
tmp_l=_ptm1al;
acca=256*tmp_h+tmp_l;

// if(acca>0)
// {
// acca--;
// }

acca=pwm_cnt;
tmp_l=(u8)(acca&0x0ff);
tmp_h=(u8)((acca/256)&0x03);
_ptm1al=tmp_l;//(u8)(duty0&0x0ff); //d7 d6 d5 d4 d3 d2 d1 d0
_ptm1ah=tmp_h;//(u8)((duty0>>8)&0x03);



}


void pwm0_disable()
{
_pt0on=0;
_pas0=0;
_pa0=0;

}
void pwm1_disable()
{
_pt1on=0;
_pas6=0;

_pa7=0;

}
void delaynms(u16 nms) //nms*(5+769)=
{
u8 VAR_temp=0;
while(nms--)
{
while(--VAR_temp) //(1+2)*256+1=769
{
asm("nop");
}

}

}




void ini_io(void)
{
_pa=0;//
_pac=0b00110110; //1011 0110 pa7:charger in;pa6 out_on pa0:pwm
_papu=0b00010110;
// _papuk=0b00000110;
_pasr=0b01001101; //01 00 11 0 1

_pb=0;
_pbc=0b10000111; //1 000 0111
_pbpu=0;
_pbsr=0b00000111;

_pc=0x00;
_pcc=0x0; //1111 1 100
_pcpu=0x00; //1111 1 100
}

/*********************数据初始化*******************************************/
void ram_ini(void)
{

//u8 Ram_0add @ 0x41 ;
//Ram_0add=0;
//_mpr=&Ram_0add;

for(_mp0=0x40;_mp0<0X0A0;_mp0++)
{

//_mpr=Ram_0add+Ram_0add;
_iar0=0;
//*_mpr=0;

}
VAR_flash_FG=1;
VAR_flash_seg

_cnt=244;
VAR_flash_cnt=244;

}

void ini_sys(void)
{
if(0)//(_wrf)
{
_wrf=0;
if((VAR_remain==0)&&(_pa7==1))
{
;
}


}
_rstc=0b10101010;//用做复位脚
_wdtc=0b10101111;
_smod=0x01; //系统时钟8M
_smod1=0x00;
// VAR_flash_FG=1;
// VAR_flash_seg_cnt=244;
// VAR_flash_cnt=244;

}

/**************************125ms****************************************/
void ini_tb0(void)
{
_tbc=0X0B5; //10110101 1:TBon 0:TBCK:Fltb 11:TB1 2^15/Ftb 0 111:TB0:2^13/Ftb
_tb0f=0;
_tb0e=1;
}
/******************************************************************/
void time1_ini(void)
{
//_tmr0c=0x86;//定时器0初始化 T=250*64*(1/8)/1000=2.0ms
//_tmr0=0x00;
_intc0=0x00;
_intc1=0x01; //mf0e enable
_mfi0=0x04; //ptmp1e enable
//_tb1e=1;
//_tmr1c|=0x81;//定时器0初始化
//_tmr1|=0x9b;
//_intc1|=0x0d;
_ptm1c1=0x0c0;//11 00 0 0 0 0 timer 匹配ccrp 定时器模式
_ptm1c0=0x30;//0 011 0 000 fH/64 8M/64
//set_ccr1a(0);
_ptm1al=0;
_ptm1ah=0;
//set_ccr1p(50);
_ptm1rpl=250;
_ptm1rph=0;
_pt1on=1;
}
/*********************************************************************/
void ini_pwm0(void)
{
_ptm0c1=0x0A8;//10 10 1 0 0 0
_ptm0c0=0x30; //0 011 0 000
//_pwmsel=0;
//_pwmc0=1;
//_pac4=0;
//_pa4=1;
//_pa4=0;
//_ccrp=100;
_ptm0al=0;
_ptm0ah=0;
//set_ccr1p(50);
_ptm0rpl=200;
_ptm0rph=0;
_pt0on=0;//计数器 On/Off 控制位

}
/*********************************************************************/
void ini_pwm1(void)
{
_ptm1c1=0x0A8;//10 10 1 0 0 0
_ptm1c0=0x10; //0 001 0 000
// _ptm1c0=0b00100000; // 654位设定计数时钟位:
//000: fSYS/4
//001: fSYS
//010: fH/16
//011: fH/64
//100: fTBC

//_pwmsel=0;
//_pwmc0=1;
//_pac4=0;
//_pa4=1;
//_pa4=0;
//_ccrp=100;
_ptm1al=0;
_ptm1ah=0;
//set_ccr1p(50);
_ptm1rpl=100;
_ptm1rph=0;
_pt1on=0;

}
/******************************************************************/
//AD初始化:
/******************************************************************/
void ADC_ini()
{
_ade=0; //关ADC中断,采用查询模式

_sadc0=0;//0 0 1

_adrfs=0; //左对齐
//_enadc=1;

_sadc1=0x05; //000 外部模拟通道输入
// 00 未使用,读为“0”
// 101:fSYS/64 8uS

//_sadc2=0x0cc;//enopa:1;vbgen:1;00;1100:Vbg*4:1.04*4=4.16
_sadc2=0;//0b11001100;
/* 0010: VREF×2
0011: VREF×3
0100: VREF×4\
0000: AVDD*/

_enadc=1;
}
/******************************************************************/
//AD转换函数:返回转换值,int
/******************************************************************/
unsigned int ADC_convert(unsigned char chanel)
{
u8 AD_H,AD_L;
u16 AD_BUFF;
switch(chanel)
{
case 0:
_sacs0=0;
_sacs1=0;
_sacs2=0;
break;
case 1:
_sacs0=1;
_sacs1=0;

_sacs2=0;
break;
case 2:
_sacs0=0;
_sacs1=1;
_sacs2=0;
break;
case 3:
_sacs0=1;
_sacs1=1;
_sacs2=0;
break;
case 4:
_sacs0=0;
_sacs1=0;
_sacs2=1;
break;

default:
_enadc=0;
break;
}
// _start=0;
// _start=1;
// _start=0;
// while(_adbz);//等待转换完成
// AD_H=_sadoh;//数据高
// AD_L=_sadol;//数据低
// AD_BUFF=AD_H;
// AD_BUFF=(AD_BUFF<<4)+(AD_L>>4);
// asm("nop");
// asm("nop");
// asm("nop");
// asm("nop");
// asm("nop");
// asm("nop");
// asm("nop");
// asm("nop");
_start=0;
_start=1;
_start=0;
//while(_adbz);//等待转换完成
//AD_H=_sadoh;//数据高
//AD_L=_sadol;//数据低
//AD_BUFF=AD_BUFF+AD_H*16+(AD_L>>4);
//AD_BUFF=AD_BUFF>>1;
while(_adbz);//等待转换完成
AD_H=_sadoh;//数据高
AD_L=_sadol;//数据低
AD_BUFF=AD_H;
AD_BUFF=(AD_BUFF<<4)+(AD_L>>4);
return(AD_BUFF);//(AD_H*16+AD_L/16);//右移4位
}
void scan_charge(void)
{
if(CHA_IO)
{
CHA_FG=0;
VAR_full_FG=0;
VAR_ot_FG=0;
VAR_flash_cnt=0;
}
else
{
CHA_FG=1;
LV_FG=0;
UV_FG=0;

//VAR_cha_delay_cnt=0;
_pa0=0;
}

}
/////////////////////////////////////////////////////////////////////////////////////

void eeprom_wrb(u8 add,u8 data) //写字节
{
_eea=add;
_eed=data;
_mp1=0x40;
_bp=1;
iar1_3=1;
iar1_2=1;
while(iar1_2)
{
;//GCC_CLRWDT();
}
_iar1=0;
}

void eeprom_wrw(u8 add,u16 data)
{
u8 data_h,data_l;
data_h=(u8)((data/256)&0x0ff);
data_l=(u8)(data&0x0ff);
eeprom_wrb(add,data_h);
eeprom_wrb((add+1),data_l);
}

//eeprom_wrw(EEP_ADD_REMAIN,VAR_BAT_V_aver);

///////////////////////////////////////////////////////////////////////////////






void scan_key(void)
{
if(LAMP_KEY_IO==0)
{
delaynms(4);
if(LAMP_KEY_IO==0)
{
while(!LAMP_KEY_IO);
delaynms(4);
VAR_power_cnt=0;
pwm_num=0;
// chek_times=0;//用于整改LED频闪问题
// led_pwm_fg=0;
//_ptm1al=_ptm1ah=0;//SET PWM 0
set_pwm(0);
// set_pwm1(0);
// set_pwm_fg=1;

Var_keytimes_cnt++;
if(Var_keytimes_cnt>3)
{
Var_keytimes_cnt=0;
VAR_flash_seg_cnt=244;
}
}
}



/* if(LAMP_KEY_IO==0)
{
delaynms(4);
if(LAMP_KEY_IO==0)
{

while(!LAMP_KEY_IO);

delaynms(5);
set_pwm(0);//每次按键按下,PWM从0加起,防止开启时PWM值过大损坏电路。
pwm_num=0;
pwm_set_fg=1;

Var_keytimes_cnt++;
if(Var_keytimes_cnt>3)
{
Var_keytimes_cnt=0;
VAR_flash_seg_cnt=244;
}
}
}*/
// eeprom_wrw(0,Var_keytimes_cnt);
//if((POWER_KEY_IO==0)&&(Var_keytimes_cnt==0))//if the Lamp is turn on,power_key disabled;
if(POWER_KEY_IO==0)
{
delaynms(2);
if(POWER_KEY_IO==0)
{

while(!POWER_KEY_IO);
delaynms(4);

OUT_ON;
Var_skey_FG=1;
VAR_power_cnt=0;

power_on=!power_on;

if(Var_keytimes_cnt==0)
_pa7=0;

}
if(Var_pkey_cnt>LKEY_TIME)
{
Var_lkey_FG=1;
}
}
else
{
Var_skey_FG=0;
Var_pkey_cnt=0;

}


}



/******************************************************************/
void scan_voltage(void)
{

v_cnt++;

VAR_BAT_V_temp+=ADC_convert(AD_CN_VBAT);
if(v_cnt>3)
{
v_cnt=0;
VAR_BAT_V_temp=VAR_BAT_V_temp>>2;
VAR_BAT_V_aver=(VAR_BAT_V_aver+VAR_BAT_V_temp)>>1;
VAR_BAT_V_temp=0;
}



}
void scan_current(void)
{
// u8 usb_ld_fg;
// u8 dc_ld_fg;
//
// u8 dc_oc_fg;
// u8 usb_oc_fg;

/*============DC load check==========================*/
// 12v load check:
VAR_LD_I_temp=ADC_convert(AD_CN_DC);//discharging current temp load check:
VAR_LD_I_aver=(ADC_convert(AD_CN_DC)+VAR_LD_I_temp)>>1;
// buff_16=VAR_LD_I_aver;

if(VAR_LD_I_aver>DC_MAX)//电流值若大于最大充许电流 设为2A
{
if(VAR_oc_cnt>400)//VAR_CHA_I_temp=400;
{
dc_oc_fg=1;
}
if(VAR_LD_I_aver>DC_SHORT)//短路保护设为6A
{
dc_oc_fg=1;
}
}
else
{
//OC_FG=0;
dc_oc_fg=0;
if(VAR_LD_I_aver>20)//判断dc是否有负载
{
//LD_FG=1;
VAR_oc_cnt=0;
dc_ld_fg=1;
}
else
{
//LD_FG=0;
dc_ld_fg=0;
}
}



/*============usb load check==========================*/

VAR_LD_I_temp=ADC_convert(AD_CN_DC_B);//discharging current temp load check:
VAR_LD_I_aver=(ADC_convert(AD_CN_DC_B)+VAR_LD_I_temp)>>1;

if(VAR_LD_I_aver>USB_I_MAX)//电流值若大于最大充许电流 设为2A
{
usb_oc_fg=1;

}
else
{
usb_oc_fg=0;
if(VAR_LD_I_aver>USB_I_MIN)//USB是否有负载
{
//LD_FG=1;
VAR_oc_cnt=0;
usb_ld_fg=1;
}
else
{
//LD_FG=0;
usb_ld_fg=0;
}

}

/*======================================*/
if((usb_ld_fg)||(dc_ld_fg))
{
LD_FG=1;

}

else
{
LD_FG=0;

}


if((usb_oc_fg)||(dc_oc_fg))
{
OC_FG=1;

}
else
{

OC_FG=0;

}

}
//eeprom_wrw(0x02,VAR_LD_I_aver);

void scan_tempratrue(void)
{
//VAR_BAT_T_aver=ADC_convert(AD_CN_TEMP);
//VAR_BAT_T_aver=(VAR_BAT_T_aver+ADC_convert(AD_CN_TEMP))>>1;

}
//**************************
/*
void check_lamp(void)
{
u16 Var_lamp_dc_min;//,Var_lamp_dc_max,Var_lamp_dc;
Var_lamp_dc_min=ADC_convert(AD_CN_LAMP_DC);
//Var_lamp_dc=ADC_convert(AD_CN_LAMP_DC);
Var_lamp_dc=(Var_lamp_dc+Var_lamp_dc_min)>>1;





if(1)//(chek_times<2)
{

switch(Var_keytimes_cnt)
//switch(1)
{
case 0:
default:
_pas6=0;
_pa7=0;
break;
case 1:
_pas6=1;
if(Var_lamp_dc>LAMP1_CC_MAX)
{
pwm1_dec();

}
else if(Var_lamp_dc
{
pwm1_inc();
}

//Var_lamp_dc_min=LAMP1_CC_MIN;
//Var_lamp_dc_max=LAMP1_CC_MAX;
// Var_lamp_dc_min=25;
// Var_lamp_dc_max=30;


break;
case 2:
//Var_lamp_dc_min=LAMP2_CC_MIN;
//Var_lamp_dc_max=LAMP2_CC_MAX;
_pas6=1;
if(Var_lamp_dc>LAMP2_CC_MAX)
{
pwm1_dec();
}
else if(Var_lamp_dc{
pwm1_inc();
}
break;
case 3:
//Var_lamp_dc_min=LAMP3_CC_MIN;
//Var_lamp_dc_max=LAMP3_CC_MAX;
_pas6=1;
if(Var_lamp_dc>LAMP3_CC_MAX)
{
pwm1_dec();
}
else if(Var_lamp_dc{
pwm1_inc();
}
break;
}
}


}*/




//*******************************

//******************************

void check_lamp(void)
{
u16 Var_lamp_dc_min,Var_lamp_dc_max,Var_lamp_dc;

//Var_lamp_dc=ADC_convert(AD_CN_LAMP_DC);
switch(Var_keytimes_cnt)
//switch(1)
{
case 0:
default:
//break;
case 1:
Var_lamp_dc_min=LAMP1_CC_MIN;
Var_lamp_dc_max=LAMP1_CC_MAX;
// Var_lamp_dc_min=25;
// Var_lamp_dc_max=30;


break;
case 2:
Var_lamp_dc_min=LAMP2_CC_MIN;
Var_lamp_dc_max=LAMP2_CC_MAX;
break;
case 3:
Var_lamp_dc_min=LAMP3_CC_MIN;
Var_lamp_dc_max=LAMP3_CC_MAX;
break;
}

// if(VAR_cha_delay_cnt>250)//设定PWM调制时间
// {
//
// VAR_cha_delay_cnt=0;
// pwm_set_fg=1;
// pwm_num=0;
// set_pwm(0);
//
// }



if(Var_keytimes_cnt)//&&(pwm_set_fg))//(!LD_FG))
{
_pas6=1;
_pt1on=1;
//Var_lamp_dc=ADC_convert(AD_CN_LAMP_DC);

//pwm_num++;
//pwm1_inc();
Var_lamp_dc=ADC_convert(AD_CN_LAMP_DC);
// if(Var_lamp_dc>Var_lamp_dc_max)
// {
//
//
// if(pwm_num>25)//最大PWM值限定
// {
// pwm_num=25;
// }
// set_pwm(pwm_num);
// pwm_set_fg=0;
//
// //eeprom_wrw(2,pwm_num);
// }

if(1)//
{

if(Var_lamp_dc>Var_lamp_dc_max)
{
//_pt1on=1;
pwm1_dec();
}
else if(Var_lamp_dc{
//_pt1on=1;
pwm1_inc();
}

}
//delaynms(100);
}
else
{

if(!Var_keytimes_cnt)
{
_pas6=0;
_pa7=0;
}


if(0)
//if(VAR_cha_delay_cnt>500)//
{

VAR_cha_delay_cnt=0;

set_pwm(0);//每次按键按下,PWM从0加起,防止开启时PWM值过大损坏电路。
pwm_num=0;
pwm_set_fg=1;


// pwm1_inc();
// Var_lamp_dc=ADC_convert(AD_CN_LAMP_DC);
// if(Var_lamp_dc>Var_lamp_dc_max)
// {
// //_pt1on=1;
// pwm1_dec();
// }
// else if(Var_lamp_dc// {
// //_pt1on=1;
// pwm1_inc();
// }
// pwm1_dec();

}

}

}


void pwm0_set(u8 duty)
{
u8 tmp_l,tmp_h;
u16 acca;

tmp_h=_ptm0ah;
tmp_l=_ptm0al;
acca=256*tmp_h+tmp_l;

//if(acca>PWM_MIN)
if(1)
{
acca=duty;
}
//set_ccr0a(acca);
tmp_l=(u8)(acca&0x0ff);
tmp_h=(u8)((acca/256)&0x03);
_ptm0al=

tmp_l;//(u8)(duty0&0x0ff); //d7 d6 d5 d4 d3 d2 d1 d0
_ptm0ah=tmp_h;//(u8)((duty0>>8)&0x03); //d9 d8




}

void check_full(void)
{
//if((CHA_FG)&&(VAR_cha_delay_cnt>20))//T1S))
if(CHA_FG)
{
_pas0=0;
if(VAR_BAT_V_aver>VBAT_MAX)
{
if(0)//(_pwm0>20)
{
pwm0_dec();
}
_pa0=0;

// VAR_full_FG=1;
// VAR_remain=7;//决定LED闪烁方式

}
else if(VAR_BAT_V_aver{

if(0)//(_pwm0<250)
{
pwm0_inc();
}
_pa0=1;
VAR_full_FG=0;
}
}

}




//void check_full(void)
//{
// if(CHA_FG)
// {
//
//
// if(VAR_BAT_V_aver>VBAT_MAX_DIC)
// {
// VAR_full_FG=1;
// VAR_remain=7;//决定LED闪烁方式
//
//
// }
//
// if(1)
// {
//// _pt0on=0;//开PWM
//// _pas0=1;
//
//
// if(VAR_BAT_V_aver>VBAT_MAX)
// {
// pwm0_dec();
// }
//
// else if(VAR_BAT_V_aver// {
// pwm0_inc();
// //delaynms(2000);
// // delaynms(500);
// }
// }
//
//
//
// }
//
//
//}






//******************************
//void check_charging(void)
//{
//
//
// if((CHA_FG)&&(!VAR_full_FG))//正常恒压充电
//
// {
// _pas0=1;
// _pt0on=1;
// if(1)//
// {
//
// if(VAR_BAT_V_aver>VBAT_MAX)
// {
// pwm0_dec();
// }
//
// else if(VAR_BAT_V_aver// {
// pwm0_inc();
// }
//
// }
//
// }
// else
// {
// //pwm0_set(10);
//
//// _pas0=0;
//// _pa0=0;
// }
//
//}









//******************************
void scan_remain(void)
{

//if(VAR_BAT_V_aver<)


// if(VAR_BAT_V_aver// {
// VAR_remain=0;
// LV_FG=1;
// UV_FG=1;
//
//
//
// }
if(VAR_BAT_V_aver{
VAR_remain=1;
LV_FG=1;
UV_FG=1;
}
else if(VAR_BAT_V_aver{
VAR_remain=2;
LV_FG=1;
}
else if(VAR_BAT_V_aver{
VAR_remain=3;
}
else if(VAR_BAT_V_aver{
VAR_remain=4;
}
else if(VAR_BAT_V_aver{
VAR_remain=5;
}
//*****************

//**************************
else //LED1 led2 led3 led4 on
{
//if(VAR_BAT_V_aver>VBAT_MAX)//VBAT_MAX_DIC
if(VAR_BAT_V_aver>VBAT_MAX_DIC)
{
VAR_full_FG=1;
VAR_remain=7;
}
else
{
VAR_remain=6;
}

}
if(UV_FG)
{
if(VAR_BAT_V_aver>VBAT_RLV)
{
UV_FG=0;
}
}
if(VAR_remain>2)
{
LV_FG=0;
/*
if(VAR_remain>VBAT_RLV)
{
UV_FG=0;
}
*/
}




//eeprom_wrw(0x02,VAR_remain);


}
void wake_up(void)
{
_enadc=1;
delaynms(20);
_pawu1=0;
_pawu2=0;
_pawu4=0;
VAR_power_cnt=0;
_pasr=0b01001101; //01 00 11 0 1
_pt0on=1;
//_pt1on=1;
_tbon=1;//定时器1中断
_emi=1;


dc_oc_fg=0;
usb_oc_fg=0;
dc_oc_fg=0;


}
//*
void dc_out_off( void)//无负载自动关机程序
{

if(LD_FG==1)
VAR_DC_OUT_cnt=0;
if(VAR_DC_OUT_cnt>107)
{
power_on=0;
VAR_DC_OUT_cnt=0;
}

}





void power_down(void)
{

if((CHA_FG)||(LD_FG==1))
{
//VAR_power_cnt=0;

if(VAR_power_cnt>18)
{
Var_lkey_FG=0;
VAR_power_cnt=19;

}
if(CHA_FG)
VAR_power_cnt=0;



}
// VAR_power_cnt=1;
if(Var_keytimes_cnt>0)//若灯亮,不进入休眠
{
if(VAR_power_cnt>18)
{
Var_lkey_FG=0;
VAR_power_cnt=19;

}
}




if((VAR_power_cnt>108)||(Var_lkey_FG))
{

Var_lkey_FG=0;
VAR_power_cnt=0;

if(1)
{

pwm0_disable();
pwm1_disable();

_pa=0x00;
_pc=0x00;
_pb=0x00;

_emi=0;
_tbon=0; //关定时器1
_enadc=0; //关定AD

_pawu1=1;
_pawu2=1;
_pawu4=1;

_hlclk=0;

//LED2_ON;
USB_OFF;
OUT_OFF;
power_on=0;

_idlen=0;
asm("HALT");
_hlclk=1;


wake_up();
//delaynms(250);
//delaynms(250);
}
}

}




/********************************125mS中断一次***********************/
void __attribute((interrupt(0x08))) isr_tb0(void)
{
_tb0f=0;

VAR_cha_delay_cnt++;
VAR_oc_cnt++;
VAR_cha_cnt++;
VAR_power_cnt++;
VAR_scan_cnt++;
VAR_remain_cnt++;

VAR_DC_OUT_cnt++;

if(VAR_flash_seg_cnt)
{
VAR_flash_seg_cnt--;
}

if(1)
//if((CHA_FG)||(VAR_flash_seg_cnt))
{
VAR_remain_current=VAR_remain;
if(CHA_FG)
{
VAR_flash_cnt++;
if(VAR_flash_cnt>2) //
{
if(VAR_remain_current>2)
{
VAR_remain_current-=1;
}
else
{
VAR_remain_current=3;
}

if(VAR_flash_cnt>3)//
{
VAR_flash_cnt=0;
}
}

}

else
{

VAR_flash_cnt=0;
}
//if(VAR_BAT_V_aver<956)//956=11.3
if(LV_FG) //低压报警闪烁
{

if(!UV_FG)//电压低于最小电压时无电量指示
{
Led_flash_cnt++;
if(Led_flash_cnt>5)
{
Led_flash_cnt=0;
}

if(Led_flash_cnt>2)
{
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;

}
else
{
LED1_ON;
LED2_OFF;
LED3_OFF;
LED4_OFF;
}
}
else if(UV_FG==1)
{
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
}

}
else
{
if(VAR_power_cnt>18)//电量指示仅亮5秒,输出30秒无负载关断
{
if(LV_FG==0)
{
//VAR_remain=2;
VAR_remain_current=2;//电压低于最小电压且无恢复电压时无电量指示
}

}

if(UV_FG)
VAR_remain_current=2;//

//Led_flash_cnt=0;
switch(VA

R_remain_current)
// switch(VAR_remain)
{
case 0:
//break;
case 1:
//break;
case 2:
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
break;
case 3:
LED1_ON;
LED2_OFF;
LED3_OFF;
LED4_OFF;
break;
case 4:
LED1_ON;
LED2_ON;
LED3_OFF;
LED4_OFF;
break;
case 5:
LED1_ON;
LED2_ON;
LED3_ON;
LED4_OFF;
break;
case 6: //>P75
default:
LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
//break;

break;
}



}


}

if(Var_skey_FG)
{
Var_pkey_cnt++;
}

if(OC_FG)
{
VAR_oc_rl_cnt++;
if(VAR_oc_rl_cnt>20) //2S解除过流保护
{
OC_FG=0;
}
}
else
{
VAR_oc_rl_cnt=0;
}
}
/********************************2mS中断一次***********************/
void __attribute((interrupt(0x10))) isr_ptm1p(void)
{
//_t0on=0;
_ptmp1f=0;//清除定时器2中断标志
ms++;
}
//****************************************************************************//
void main()
{
power_on=0;
ini_sys();
ini_io();
//delaynms(50);
//B_LED_ON;
ram_ini();
ini_pwm0();
ini_pwm1();
ADC_ini();
ini_tb0();
//scan_current();

#ifdef TEST_LCD
OUT_OFF;
Model_FG=1;
time1_ini();
_emi=1;
while(1)
{
//VAR_remain++;
//if(VAR_remain>100)VAR_remain=0;
CHA_FG=1;
VAR_full_FG=1;
VAR_seg5=0x0F0;
B_LED_ON;
R_LED_OFF;

}

#endif
VAR_BAT_V_aver=ADC_convert(AD_CN_VBAT);
scan_voltage();
scan_voltage();
scan_voltage();
scan_remain();
//time1_ini();
//OUT_ON;
//USB_ON;
_tbon=1;
_emi=1;
/*******************test***********************/
//set_ccr0a(50);
//_pt1on=1;
if(1)
{
_emi=0;//

LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;

delaynms(1000);

OUT_ON;
LED1_OFF;
delaynms(500);
LED2_OFF;
delaynms(500);
LED3_OFF;
delaynms(500);
LED4_OFF;

delaynms(1000);

VAR_BAT_V_aver=ADC_convert(AD_CN_VBAT);

if(VAR_remain>100)VAR_remain=0;
//pwm0_dec();

//while(1){;}
_emi=1;
}

_emi=1;

while(0)

{
check_lamp();
scan_key();

}
while(1)
{
scan_charge();//标志位设定
check_full();
//check_charging();

scan_key();

if((UV_FG)||(OC_FG)||(!power_on))
// if((UV_FG)||(OC_FG))
{
OUT_OFF;
USB_OFF;
//Var_keytimes_cnt=0;
if((UV_FG)||(OC_FG))
{
Var_keytimes_cnt=0;
}
//delaynms(1000);

}
else
{
OUT_ON;
USB_ON;
}
check_lamp();
scan_voltage();
scan_current();

scan_remain();
dc_out_off();
power_down();



//while(1);

}
}


相关文档