📄 bat.c
字号:
#include<pic16f7x.h>
#define curr_ch 0x51 //设置AN2为电流采样电阻上电压输入通道
#define volt_ch 0x41 //设置AN0为电流采样电阻上电压输入通道
#define interp 0x19
static unsigned char R,RE;
static unsigned char RES[20];
void pwm(void);
void shut_p(void);
void ad_int(unsigned char);
void delay(long);
void lart(void);
void lartv(void);
unsigned char try();
void charge(void);
void juan(void);
unsigned char ad(unsigned char,unsigned char);
//main
void main()
{
unsigned char m=2;
TRISC2=0;
delay(1000);
RC2=0;
RB7=0;
TRISB7=0;
RB7=1;
delay(300);
RB7=0;
delay(300);
RB7=1;
delay(300);
RB7=0;
delay(300);
RB7=1;
delay(300);
RB7=0;
delay(300);
RB7=1;
delay(300);
RB7=0;
delay(300);
RB7=1;
delay(300);
RB7=0;
delay(300);
RB7=1;
delay(300);
RB7=0;
delay(300);
RB7=1;
delay(300);
while(1)
{
shut_p();
pwm();
delay(10);
RB7=1;
RE=ad(curr_ch,1);
if(ADRES>0x05){
shut_p();
break;
}
}
shut_p();
RE=ad(volt_ch,1);
//
//0x99->3.0v,0xe6->4.5v
if(RE<0xe6&&RE>0x99)charge();
else{
if(RE<0x99)m=try();
else lart();
}
if(m==0)lartv();
if(m==1)charge();
}
//
//试充电程序
unsigned char try()
{
unsigned char t0,t1;
for(t0=5;t0>0;t0--){
for(t1=90;t1>0;t1--)
{
pwm();
ad_int(curr_ch);
delay(150);
shut_p();
delay(100);
}
}
shut_p();
RE=ad(volt_ch,1);
if(RE>0x99)return 1;
else return 0;
}
//
//sunhaibaojing
void lartv()
{
for(;;){ shut_p();
RB6=1;
RB7=1;
delay(1000);
RB6=0;
RB7=0;
delay(800);//glitter the red led to show the high voltage
pwm();
RE=ad(curr_ch,1);
if(RE<0x04)break; //check the battery per 2seconds
}
}
//
//guoya报警程序
void lart()
{
for(;;){ shut_p();
RB6=1;
RB7=1;
delay(1000);
RB6=0;
RB7=0;
delay(800);//glitter the yellow led to show the high voltage
pwm();
RE=ad(curr_ch,1);
if(RE<0x04)break; //check the battery per 2seconds
}
}
//
//charge progam
void charge()
{
static unsigned char c1,c2,i;
RB7=0;
i=0;
for(c1=1;c1>0;c1--)
{
for(c2=20;c2>0;c2--)
{
pwm();
ad_int(curr_ch);
delay(150);
shut_p();
delay(100);
}
}
/*
//for(c1=24;c1>0;c1--)
for(c1=1;c1>0;c1--)
{
for(c2=20;c2>0;c2--)
{
pwm();
ad_int(curr_ch);
delay(200);
shut_p();
delay(100);
}
}
//for(c1=24;c1>0;c1--)
for(c1=1;c1>0;c1--)
{
for(c2=20;c2>0;c2--)
{
pwm();
ad_int(curr_ch);
delay(250);
shut_p();
delay(100);
}
}*/
while(1)
{
TRISC2=0;
shut_p();
pwm();
RB7=1;
delay(300);
RB7=0;
delay(300);
RB7=1;
delay(300);
RB7=0;
delay(300);
RB7=1;
delay(300);
for(c1=7;c1>0;c1--){
for(c2=10;c2>0;c2--)
{
pwm();
ad_int(curr_ch);
delay(300);
shut_p();
delay(100);
}//for(c2=20;c2>0;c2--) over
shut_p();
pwm();
delay(10);
ad(curr_ch,1);
if(ADRES<0x06)
{
R=0xaa;
break;
}
}
if(R==0xaa)break;
shut_p();
ad(volt_ch,1);
if(ADRES>=0xd6)break;//0xd6->4.2V
}
if(R!=0xaa)
{
while(1){
if(i>18)i=0;
//
//check the voltage of BAT per 4 minutes
for(c1=75;c1>0;c1--){
for(c2=10;c2>0;c2--)
{
pwm();
ad_int(curr_ch);
delay(300);
shut_p();
delay(100);
}//for(c2=20;c2>0;c2--) over
shut_p();
pwm();
delay(10);
ad(curr_ch,1);
if(ADRES<0x06)
{
R=0xee;
break;
}
} //for(c1)over
if(R==0xee)break;
shut_p();
RES[i]=ad(volt_ch,1);
i++;
if(i>1){
R=RES[i-1]-RES[i-2];
if(R==0){
juan();
break; //0xde->4.35v and 0xdb->4.3 and
}
}
}//while(1)over
}
//if()over
}//chaerge()over
//
//shut up the pwm and AD convert
void shut_p()
{
RC2=0;
CCP1CON=0x00;
RC2=0;
ADON=0;
RC2=0;
}
//
//the yanshi program
void delay(long temp)
{OPTION=0x07; //分频设置为1:256
temp=temp-62;
for(;temp>0;temp--)
{
T0IF=0;
TMR0=0xfc; //循环一次为1ms
while(T0IF==0);
}
}
//
//中断程序
static void interrupt ISR(void)
{
if(ADIF&&ADIE){
ADIF=0;
if(ADRES>=interp)CCPR1L=CCPR1L-1;
else CCPR1L=CCPR1L+1;
for(R=2;R>0;R--){;}
ADGO=1;
}
}
//
//中断使能的AD程序
void ad_int(unsigned char tem)
{
ADCON0=tem;
TRISA=0xff;
ADCON1=0x01; //AN3为参考电压
PEIE=1; //开放外设中断
ADIE=1; //开放AD中断
GIE=1; //开放总中断
ADIF=0;
for(R=5;R>0;R--){;} //等待采集时间
ADGO=1;
}
//
//PWM程序
void pwm(){
TMR2=0x00; // CLEAR
PR2=0x18; //设定PWM周期为1ms 1b
CCPR1L=0x10; // SET initial periods
CCP1CON=0x0c; //SET IT AS PWM
T2CON=0x04; //预分频为1:1 start!
}
//
//AD convert program without INT.
char ad(char tem,char tm)
{
ADCON0=tem;
TRISA=0xff;
ADCON1=0x01; //AN3为参考电压
ADIF=0;
if(tm==1)delay(100); //等待采集时间,电池电压需要关断一定时间后才能采集
else delay(1);
ADGO=1;
while(ADIF==0);
ADIF=0;
return ADRES;
}
//
//little current charge program
void juan()
{
char j;
RB7=0;
while(1)
{
//check the battery per 2seconds
for(j=8;j>0;j--)
{
pwm();
ad_int(curr_ch);
delay(80);
shut_p();
delay(350);
}
shut_p();
pwm();
delay(10);
ad(curr_ch,1);
if(ADRES<0x06)break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -