电池容量测试仪电路与源码(PIC16F1938单片机+AD623实现)

2019-11-11来源: 51hei关键字:电池容量测试仪  PIC16F1938  单片机  AD623

分享一个由PIC16F1938单片机芯片和AD623构成的电池容量测试仪.

电路原理图如下:

电池容量测试仪的pic单片机源码:

#include    "main.h" 

//------------------------32MHZ---------------------------------------------- 

__CONFIG(FOSC_INTOSC & CLKOUTEN_OFF & BOREN_ON & PWRTE_ON & CPD_OFF

          &CP_ON & MCLRE_ON & LVP_OFF & WDTE_ON );  //此处有关32MHz的设置与1829不同,PLL使能位必须在寄存器OSCCON里面设置SPLLEN

                                                                        //而不是在配置字里面设置PLLEN_ON      

/***eeprom 数据存储地址分配**************


0X00 0X01 充电电流

0X02 0X03 充电截止电压

0X04 0X05 放电电流

0X06 0X07 放电截止电压

0X08      循环次数


0X09      充满多久后放电

0X0A      已循环次数

0X0B 0X0C 充电时间

0X0D 0X0E 放电时间

0X0F 0X10 总容量


0xf0 掉电前的状态:0放电/1充电

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

         

//---------非精确延时1ms函数------------

void delay_ms(uint16_t  time)

{

  uint16_t k, j=0;

  for(k=0;k<189;k++)

  {

    for(;j

     {CLRWDT();}

  }  

}          

//--------端口及时钟初始化--------------

void Init(void)

{

asm("CLRWDT"); 

PORTA=0X00;

LATA=0X00;

TRISA=0B00000111;

ANSELA=0B00000111;//RA0 RA1 RA2作为模拟输入,其余为数字输出


PORTB=0X00;

LATB=0X00;

TRISB=0B00111100; 

ANSELB=0B00000000;


PORTC=0X00;

TRISC=0B00000000;

LATC=0X00;


screen_status=4;

i=0;

j=0;

FLAG_RUN=0;

}


//-------------串口初始化------------------

void Init_Uart(void)

{

TRISC6=0;

//TRISC7=1;

SPBRG=0xcf;

BRG16=1;

BRGH=0;


TX9=0;

SYNC=0;

SPEN=1;

TXEN=1; 


TXIF=0;

TXIE=0;

CREN=1;

SYNC=0;


RCIF=0;

RCIE=0;


GIE=1;

PEIE=1;


}


void putch(unsigned char byte) 

{

        /* output one byte */

        //CLRWDT();

        while(!TXIF)        /* set when register is empty */

                continue;

        TXREG = byte;

}


void Set32MHZ(void)

{

  SCS1=0;        //配置字中若已经设置了FOSC<2:0>  那么在此必须将SCS<1:0>=00

  SCS0=0;

  IRCF3=1;      //16MHZ分频后得到8MHZ再4倍频到32MHZ

  IRCF2=1;

  IRCF1=1;

  IRCF0=0;

  OSTS=0;

  PLLR=1;

  HFIOFS=1;

  SPLLEN=1;//必须在此处设置此位,否则系统时钟频率不为8MHz  

}


void interrupt isr(void)                

{

//-----------TMER0中断--------------------        

if((TMR0IF)&&(TMR0IE))           

{

  TMR0=0x07;                    

  TMR0IF=0; //0.25ms  

}

//-----------TMER1中断-------------------

if((TMR1IF)&&(TMR1IE))//定时50ms           

{

  TMR1H=0x3C;             

  TMR1L=0xB5;                    

  TMR1IF=0; 

  second--;

  if(second==0)

  {

          second=20;

    FLAG_SECOND=1;

  }


  if(second==10||second==20)

  {

   flag_work=1;

  }

  if(WORKING&&loop_temp

  {

        

          if(second==20)

            {LATB7=1;}

          else if(FLAG_RUN)

          {

            if(second==10)

                  {LATB7=1;}

      else if(!FLAG_CHARGE&&(second==5||second==15))

                  {LATB7=1;}

            else

                    {LATB7=0;}

          }

    else

      {LATB7=0;}

  }

  /*if(++count1>99)

  {

        

          count1=0;

          printf("%d rn",bat_voltage);

  }*/

}

//--------------------TMER4中断-----------

if((TMR4IF)&&(TMR4IE))   

{

  TMR4=0x57;                    

  TMR4IF=0; //0.5ms

}

if((TMR6IF)&&(TMR6IE))          

{

  TMR6=0x6F;//1ms进入中断一次

  TMR6IF=0; 

    if((FLAG_RUN)&&(screen_status==0)&&(loop_temp

    {

     if(++keydelay1>1000)

     {

          keydelay1=0;

          m++;

          if(m>3)

      {

           m=0;

       lcd_write_char(12,0,' ');

       lcd_write_char(13,0,' ');

       lcd_write_char(14,0,' ');

      }

      else

      {lcd_write_char(11+m,0,'.');}

      lcd_write_char(15,0,' ');

     }

    }

    

  if(KEYDOWNING)

   {

    if(++keydelay>10)

    {

         keydelay=0;

     KEYDOWNING=0;

    }

   }

  

}

}

//-----------判断按键状态-------------------------

unsigned char getkey(void)

{        

        unsigned char keytemp;

        keytemp=LATB;//不能用keytemp=PORTB;

        return (~keytemp) & 0X3C;        

}

//------------按键初始化-----------------

void Keyinit(void)

{

     KEY_MAIN.KEY_BIT.ReadData_ON_OFF=(ON_OFF^1);

     KEY_MAIN.KEY_BIT.ReadData_DEC=(DEC^1);

     KEY_MAIN.KEY_BIT.ReadData_ADD=(ADD^1);

     KEY_MAIN.KEY_BIT.ReadData_MENU=(MENU^1);

     KEY_MAIN.KEY_BIT.TRG_ON_OFF=KEY_MAIN.KEY_BIT.ReadData_ON_OFF & (KEY_MAIN.KEY_BIT.ReadData_ON_OFF ^ KEY_MAIN.KEY_BIT.COUT_ON_OFF);

     KEY_MAIN.KEY_BIT.TRG_DEC=KEY_MAIN.KEY_BIT.ReadData_DEC & (KEY_MAIN.KEY_BIT.ReadData_DEC ^ KEY_MAIN.KEY_BIT.COUT_DEC);

     KEY_MAIN.KEY_BIT.TRG_ADD=KEY_MAIN.KEY_BIT.ReadData_ADD & (KEY_MAIN.KEY_BIT.ReadData_ADD ^ KEY_MAIN.KEY_BIT.COUT_ADD);

     KEY_MAIN.KEY_BIT.TRG_MENU=KEY_MAIN.KEY_BIT.ReadData_MENU & (KEY_MAIN.KEY_BIT.ReadData_MENU ^ KEY_MAIN.KEY_BIT.COUT_MENU);

     KEY_MAIN.KEY_BIT.COUT_ON_OFF=KEY_MAIN.KEY_BIT.ReadData_ON_OFF;

     KEY_MAIN.KEY_BIT.COUT_DEC=KEY_MAIN.KEY_BIT.ReadData_DEC;

     KEY_MAIN.KEY_BIT.COUT_ADD=KEY_MAIN.KEY_BIT.ReadData_ADD;   

     KEY_MAIN.KEY_BIT.COUT_MENU=KEY_MAIN.KEY_BIT.ReadData_MENU; 

       

}

//-------按键扫描-------------------------

unsigned char  KeyScan(void)

Keyinit();

if(KEY_MAIN.KEY_ALL_BITS==0X0007)  //ON/OFF

{

  return 1;

}

else if(KEY_MAIN.KEY_ALL_BITS==0X0038)  //DEC

{

  return 2;

}

else if(KEY_MAIN.KEY_ALL_BITS==0X01C0)  //ADD

{

  return 3;

}

else if(KEY_MAIN.KEY_ALL_BITS==0X0E00)  //MENU

{

  return 4;

}

return 0;

}

void KeyProcess(void)

{

if(getkey())//判断有按键按下

  {

   if(!KEYDOWNING)

          {

            KEYDOWNING = 1;

            keyvalue=KeyScan();//提取具体按键值

          } 

  }

else

  {

          KEYDOWNING = 0;

  }

if(keyvalue)   

  {

   if(STARTUP)        

           count=60;

   if(keyvalue==1) //ON_OFF

    {

     switch(screen_status)

     {

      case 0:     screen_status=2;

                  i=0;

                  read_data();

                  menu_2(); break;

      case 1:    if(i==0)

                 {

                  FLAG_RUN=1;

                  WORKING=1;

                  finish_discharge=0;

                  finish_charge=0;

                  screen_status=0;

                  i=0;

                  lcd_write_com_busy(0x01);

                  menu_0(); break;

                 }

                 else if(i==1)

                 {

                  screen_status=3;

                  i=0;

read_data();

[1] [2] [3] [4] [5] [6] [7]
关键字:电池容量测试仪  PIC16F1938  单片机  AD623 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479586.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:用PIC18F4520与发电机上的电表实现MUDBUS通信
下一篇:基于PICf16877的ADC源码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PIC16F1937-PC通讯协议
;                  *//* 主控芯片:PIC16F1937                                                   
发表于 2019-11-14
PIC16F684 对输入脉冲进行计数和脉冲宽度测量
。是否我的设计架构方案不对。#include <pic.h>__CONFIG(0x3004);//(0X30C4);#define T0_40MS 100    // 定义 TMR0 延时10MS 的时间常数 #define T1_100MS 40536#define        DN                        RA5        //Motor rise  
发表于 2019-11-13
PIC12F675两通道的AD转换的汇编程序
;程序功能:上电开机:PIN5为高电平,绿灯亮;PIN2,PIN3为低电平,红灯灭;;        轮流检测PIN6,PIN7脚电平,欠压3.9V,10V,红灯亮,绿灯灭,过压5.9V,15.9V;        红灯亮,绿灯灭,alram为TTL高电平,过压锁死  LIST P=12F675INCLUDE <P12F675.INC> __CONFIG(B'11000101110100');Highest band gap voltage,0,0,Data memory is not protected
发表于 2019-11-12
PIC16F873A单片机的照度测量项目原理图与源代码
基于PIC16F873A的照度测量C语言代码。可以使用Labview以RS232接口和PC通信,并获取实时数据 单片机源程序如下:#include <pic.h>           //调用PIC16F87XA单片机的头文件__CONFIG(HS&WDTDIS&LVPDIS);#define U5A  RC0           //4位数码管单元的U5(74HC138)的A脚接在RB0口上#define U5B  RC1      
发表于 2019-11-12
PIC16F873A单片机的照度测量项目原理图与源代码
用PIC18F4520与发电机上的电表实现MUDBUS通信
则无1个停止位(有校验时),2个Bit(无校验时)错误检测域· LRC(纵向冗长检测)RTU模式当控制器设为在Modbus网络上以RTU模式通信,在消息中的每个8Bit字节按照原值传送,不做处理,如63H,RTU将直接发送01100011。这种方式的主要优点是:数据帧传送之间没有间隔,相同波特率下传输数据的密度要比ASCII高,传输速度更快。代码系统8位二进制,十六进制数0...9,A...F消息中的每个8位域都是一或两个十六进制字符组成每个字节的位1个起始位8个数据位,最小的有效位先发送1个奇偶校验位,无校验则无1个停止位(有校验时),2个Bit(无校验时)(4)数据校验方式CRC校验CRC域是两个字节,包含一16位的二进制值
发表于 2019-11-11
用PIC18F4520与发电机上的电表实现MUDBUS通信
小家电热销带动盛群,新唐单片机出货量激增
由于今年白色小家电需求依旧热络,10月开始一波急单带动IC设计盛群(6202)、新唐(4919)MCU出货量增,加上年底耶诞节购物需求,及上半年库存去化告一段落,第四季业绩将优于第三季,全年营运可望倒吃甘蔗。10月相关白牌小家电零组件IC出现节前急单拉货潮,盛群表示,10月开始,已感受到订单回流迹象,客户及终端库存去化、中国双11及年底拉货旺季到来,且中国去美化政策逐季发酵,客户拉货态度转趋积极。上半年受到贸易战影响,客户拉货态度观望,下半年库存水位已降至低点,MCU厂在客户要求下,于10月备妥急单需求,主要以小家电商品IC为主,第四季进入全年出货旺季,法人预估今年第四季MCU厂业绩可望成为全年最高点。
发表于 2019-11-11
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved