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

📄 bat.c

📁 用于pic16f73单片机
💻 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 + -