📄 test._c
字号:
tem[0]=0x90;
tem[1]=0x00;
tem[2]=DA_SET/4;
tem[3]=DA_SET%4;
tem[3]=tem[3]<<6;
Start_I2c();
for(i=0;i<4;i++)
{
SendByte(tem[i]);
if((temp&(1<<ack))==0)return(0);
}
Stop_I2c();
return(1);
}
/********************************************************************/
TC1321_SET_1(unsigned int DA_SET)
{
unsigned char i;
unsigned char tem[4];
tem[0]=0x90;
tem[1]=0x00;
tem[2]=DA_SET/4;
tem[3]=DA_SET%4;
tem[3]=tem[3]<<6;
Start_I2c();
for(i=0;i<4;i++)
{
SendByte(tem[i]);
if((temp&(1<<ack))==0)return(0);
}
Stop_I2c();
return(1);
}
/********************************************************************/
void Delay(unsigned int ddd) //Delay50Ms() i=0xF8F;
{
//ddd=100;
while(--ddd){;}
}
/********************************************************************/
void temp_det(void)
{
adc_mux=0X02;
Delay(0xff); //A/D采样延时
ad_reulst();
if(adc_old <=139 ) //当前温度为80-90
{temp_step=80;
temp_start=139;
temp_dange=3;
}
if(adc_old > 139 && adc_old <=178 ) //当前温度为70-80
{temp_step=70;
temp_start=178;
temp_dange=4;
}
if(adc_old > 178 && adc_old <=230 ) //当前温度为60-70
{temp_step=60;
temp_start=230;
temp_dange=5;
}
if(adc_old > 230 && adc_old <=293 ) //当前温度为50-60
{temp_step=50;
temp_start=293;
temp_dange=6;
}
if(adc_old > 293 && adc_old <=371 ) //当前温度为40-50
{temp_step=40;
temp_start=371;
temp_dange=8;
}
if(adc_old > 371 && adc_old <=462 ) //当前温度为30-40
{temp_step=30;
temp_start=462;
temp_dange=9;
}
if(adc_old > 462 && adc_old <=562 ) //当前温度为20-30
{temp_step=20;
temp_start=562;
temp_dange=10;
}
if(adc_old > 562 && adc_old <=663 ) //当前温度为10-20
{temp_step=10;
temp_start=663;
temp_dange=10;
}
if(adc_old > 663 && adc_old <=758 ) //当前温度为0-10
{temp_step=0;
temp_start=758;
temp_dange=9;
}
if(adc_old > 758 && adc_old <=839 ) //当前温度为-10~0
{temp_step=-10;
temp_start=839;
temp_dange=8;
}
now_temp=(temp_step+(temp_start-adc_old)/temp_dange);
if(adc_old > 839 )
{
now_temp=-11;
}
}
/**********************A/D循环采样60次取平均值********************/
void ad_reulst(void)
{
abc=61;
adc_old=0;
while(--abc)
{Delay(0xff);
adc_old=(adc_old+adc_rel);
}
adc_old=adc_old/60;
}
/********************************************************************/
void alarm(void)
{
adc_mux=0X01;
Delay(0xff); //A/D采样延时
ad_reulst();
while(adc_old > 440) //检测当前电压是不是大于16.5V
{
temp |= (1<<LED_yes);
PORTD &= ~(1<<Green); //绿色指示灯灭
PORTB &= ~(1<<P0); //关断P0 0.16A恒流充电
PORTD |= (1<<P1); //打开P1 0.16A恒流充电
PORTB &= ~(1<<P2); //关断P2 0.16A恒流充电
PORTB &= ~(1<<P3); //关断P3 0.16A恒流充电
TC1321_SET_1(999); // D/A送电压10V
adc_mux=0X01;
Delay(0xff); //A/D采样延时
ad_reulst();
adc_old=adc_rel;
}
temp &= ~(1<<LED_yes);
adc_mux=0X02;
Delay(0x4ff); //A/D采样延时
ad_reulst();
while(adc_old < 0x7A) //检测温度有没有大于85摄氏度 0.42V
{
PORTD &= ~(1<<Green); //绿色指示灯灭
PORTD |= (1<<Red);
PORTB &= ~(1<<P0); //关断P0 0.16A恒流充电
PORTD |= (1<<P1); //打开P1 0.16A恒流充电
PORTB &= ~(1<<P2); //关断P2 0.16A恒流充电
PORTB &= ~(1<<P3); //关断P3 0.16A恒流充电
TC1321_SET_1(999); // D/A送电压10.0V
adc_mux=0X02;
Delay(0x4ff); //A/D采样延时
ad_reulst();
adc_old=adc_rel;
}
if((temp&(1<<anther))==0x20) //0电流检测使能位
{
adc_mux=0X07;
Delay(0xff); //A/D采样延时
ad_reulst();
if(adc_old < 27){Second_count_3=00;} //27
while(adc_old < 27) //检测当前电流是不是为0
{temp |= (1<<LED_yes);
PORTD &= ~(1<<Green); //绿色指示灯灭
PORTB &= ~(1<<P0); //关断P0 0.16A恒流充电
PORTD |= (1<<P1); //打开P1 0.16A恒流充电
PORTB &= ~(1<<P2); //关断P2 0.16A恒流充电
PORTB &= ~(1<<P3); //关断P3 0.16A恒流充电
TC1321_SET_1(999); // D/A送电压10.0V
if(Second_count_3>5)
{
Second_count_3=00;
TC1321_SET_1(735); // D/A送电压15.8V
Delay(0xff);
adc_mux=0X07;
Delay(0xff); //A/D采样延时
ad_reulst();
adc_old=adc_rel;
if(adc_old > 6)
{
TC1321_SET_1(735); // D/A送电压15.8V
Delay(0xff);
}
}
adc_mux=0X07;
Delay(0xff); //A/D采样延时
ad_reulst();
adc_old=adc_rel;
}
}
temp &= ~(1<<LED_yes);
}
/******************************************************************/
//MAIN程序
void main(void)
{
unsigned char i;
ADMUX=00; //防止两个基准原短路
PORTB = 0x00; // I/O口初始化
DDRB = 0xFF; // I/O口初始化 老版本是FB
PORTC = 0x00; // I/O口初始化
DDRC = 0x70; // I/O口初始化 老版本是F0
PORTD = 0x00; // I/O口初始化
DDRD = 0x2C; // I/O口初始化 老版本是FF
Second_count_3=0;
TC1321_SET_1(780); // 14.78,不补偿
if(Second_count_3<6){;}
cycle=0x00; //第五次到第一次之间循环次数清零
temp &= ~(1<<plus_charge); //上电后不允许进行脉冲充电
temp &= ~(1<<LED_yes); //开始不允许红灯闪烁
temp &= ~(1<<anther); //测试用
//temp |= (1<<anther);
//temp |= (1<<LED_yes); //允许红灯闪烁
temp |= (1<<Charge_Sel); //选择warmup_charger方式
SEI(); //使能全局中断
timer1_init(); //timer 1 interrupt sources
TIMSK1 = 0x01; //timer 1 interrupt sources
TCNT1H = 0xFE; //reload counter high value
TCNT1L = 0xAA; //reload counter low value
PORTD &= ~(1<<Red); //关闭红色指示灯
PORTD &= ~(1<<Green); //关闭绿色指示灯
adc_init();
adc_old=0;
adc_rel=0;
PORTB &= ~(1<<P0); //关断P0 0.8A恒流充电
PORTD &= ~(1<<P1); //关断P1 0.8A恒流充电
PORTB &= ~(1<<P2); //关断P2 0.8A恒流充电
PORTB |= (1<<P3); //打开P3 0.8A恒流充电
temp |= (1<<anther);
alarm(); //检测过流、低压、过温
//------------------ 开始进入主流层 --------------------/
//------------------在2A负载情况下,-------------------/
// 电池电压15.55V ADC1=421 充电器输出15.8V 电池电压15.55V
// 电池电压14.4V ADC1=390
// 电池电压13.8V ADC1=374
// 电池电压13.2V ADC1=358
// 电池电压13.0V ADC1=353
// 电池电压12.6V ADC1=342
// 电池电压12.0V ADC1=326
// 电池电压11.5V ADC1=313
// 电池电压10V ADC1=273
// 2A ADC7=229
//-----------------在0.16A负载情况下,------------------//
// 电池电压15.55V ADC1=411
// 电池电压14.4V ADC1=380
// 电池电压13.8V ADC1=364
// 电池电压13.2V ADC1=348
// 电池电压13.0V ADC1=343
// 电池电压12.6V ADC1=332
// 电池电压12.0V ADC1=316
// 电池电压11.5V ADC1=303
// 电池电压10.0V ADC1=263
// 0.16A ADC7=31
//------------------------------------------------------/
// 电流2A情况下,充电输出电压 15.8 V ;TC132=2.820 V 000 00000000
// 电流2A情况下,充电输出电压 14.4 V ;TC132=2.978 V 878 00000000
// 电流2A情况下,充电输出电压 13.8 V ;TC132=3.015 V 892 00000000
// 电流2A情况下,充电输出电压 13.2 V ;TC132=3.047 V 903 00000000
// 电流2A情况下,充电输出电压 13.0 V ;TC132=3.056 V 893
// 电流2A情况下,充电输出电压 12.6 V ;TC132=3.075 V 899
// 电流0.16A情况下,充电输出电压 12.6 V ;TC132=3.100 V 906
// 电流0.16A情况下,充电输出电压 12.0 V ;TC132=3.127 V 921 00000000
// 电流0.16A情况下,充电输出电压 11.5 V ;TC132=3.148 V 930 00000000
// 电流0.16A情况下,充电输出电压 10.0 V ;TC132=3.211 V 950 00000000
//------------------------------------------------------/
while(1)
{
goto step_3; //开始应该 goto step_3进入恒流充电
/***** 第一步 去硫化、脉冲、14.4V&13.8V 0.8A 1Hz 脉冲充电 红色指示灯*****/
step_1:
goto step_3;
/****************** 第二步 软启动、14.4V/0.8A 红色指示灯***********************/
step_2:
goto step_3;
/********************* 第三步 恒流4A、红色灯**************************/
step_3:
Second_count_1=00; //延时24小时,等于86400秒
Second_count_2=00; //Second_count_1*Second_count_2=60*1660
while(1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -