历史上的今天
返回首页

历史上的今天

今天是:2024年11月11日(星期一)

正在发生

2019年11月11日 | 电池容量测试仪电路与源码(PIC16F1938单片机+AD623实现)

2019-11-11 来源:51hei

分享一个由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();

                  menu_3(); break;

                 } 

                 else if(i==2)

                 {

                  read_data();

                  screen_status=5;

                  i=0;

                  menu_5(); break;

推荐阅读

史海拾趣

ASM公司的发展小趣事

近年来,随着全球半导体市场的竞争加剧和技术的不断更新换代,ASM公司也面临着巨大的挑战。为了保持竞争优势,公司不断调整其战略和业务结构,加大研发力度,推出更具竞争力的新产品。同时,公司还积极寻求与其他企业的合作与共赢,共同推动半导体产业的发展。

Global Mixed-Mode Technology Inc公司的发展小趣事
三相缺相报警灯电路在需要稳定三相电源供电的场合下非常重要。例如,在工业生产中,三相电动机、变压器等设备对电源的稳定性要求很高,一旦发生缺相,可能会导致设备损坏或生产事故。因此,在这些场合下需要安装三相缺相报警灯电路来及时监测并报警缺相情况。
DAQ Electronics LLC公司的发展小趣事

随着国内外市场的不断拓展和客户需求的不断增长,DAQ Electronics LLC公司开始积极探索国际化发展道路。公司积极参加国际展会和技术交流活动,与全球同行建立了广泛的联系和合作。同时,公司也加大了对海外市场的投入力度,不断拓展海外市场份额。这种国际化的发展战略不仅为公司带来了更多的商业机会和合作伙伴也为公司未来的发展提供了更广阔的空间和机遇。

请注意,以上故事均为虚构内容,仅供参考。如有需要,建议直接联系DAQ Electronics LLC公司获取其真实的发展历程和故事。

CLANDELL公司的发展小趣事

CLANDELL公司初创时,市场上已有众多成熟的电子产品制造商。面对激烈的竞争,CLANDELL公司创始人凭借对技术的敏锐洞察和对市场的深入理解,决定专注于研发高性能、高可靠性的电子产品。初创期资金匮乏,但团队凭借对技术的执着和对市场的信念,不断攻克技术难关,逐步在市场上站稳脚跟。

FerriShield公司的发展小趣事

为了进一步推动技术创新和产品研发,FerriShield积极寻求与高校和研究机构的合作。公司与多所知名大学建立了产学研合作关系,共同开展新材料、新工艺的研究和开发。这些合作不仅提升了FerriShield的技术实力,还为公司培养了一批高素质的研发人才。

Aydin Corp公司的发展小趣事

随着电子技术的快速发展,Aydin Corp意识到只有不断创新才能在市场中立于不败之地。公司投入大量资源用于研发,不断推出具有创新性和竞争力的产品。这些产品不仅性能卓越,而且设计独特,迅速赢得了消费者的青睐。同时,Aydin Corp还注重产品升级和迭代,以满足市场不断变化的需求。

问答坊 | AI 解惑

电子系统设计基本知识

本文有模拟电路、数字电路、单片机电路、ARM硬件、ARM编程等基础知识,里面还有电阻、电容、半导体二级管三极管等元器件的介绍,还有电源电路、电路设计、通信系统等。欢迎想学电子基础知识的人下载。…

查看全部问答>

我的超声波带原理图与PCB

本帖最后由 paulhyde 于 2014-9-15 03:46 编辑 我的超声波带原理图与PCB  …

查看全部问答>

大家A有整体方案了没有

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 大家A有整体方案了没有  …

查看全部问答>

单片机C语言交流群

各位,本人创建了单片机C语言开发交流群,希望各位多多交流:69698592…

查看全部问答>

三星S3C241O的中断问题

我最近在学华恒ARM9,用的是三星S3C2410当做到中断这个问题的时候,遇到了问题,还请各位大虾帮忙 问题如下: 1、不管我把中断置一还是置零都没看到区别,和芯片资料有出入,为什么会这样 2、我把中断待决寄存器和源待决寄存器的值读出来,发现 ...…

查看全部问答>

请问哪里有无线协议的详细文档下载?

刚学GPRS开发,想找些无线通讯协议看看,google了一下,没找到,所以想请教一下,哪里有这一类的完整文档下载,谢谢!…

查看全部问答>

MDK对于CORTEX3在C中插入汇编的问题?ADC?

MDK对于CORTEX3在C中插入汇编的问题?我使用ARM公司(keil)的MDK软件,CPU使用STM32F103,我想在C语言中插入汇编语言,按照MDK提供的帮助文件插入汇编的方法写如下语句:int qadd(int i, int j){     ...…

查看全部问答>

超新手弱弱问题----关于定时器的问题

这几天在看书,发现里面说到定时器a和定时器b,我想问一下,定时器是不是属于单片机里面一个硬件呢?应该不是在msp430芯片里面的吧???…

查看全部问答>

液晶屏初始化时花屏了,求助!

液晶屏初始化时花屏了!(LCD12864带字库的)LCD12864 带字库的。在我对液晶屏初始化时,设置到“进入设定点”这一步,用api函数SSIDataPut(SSI_BASE, data) 发送命令字0x06,就花屏了!这是为什么? …

查看全部问答>

请各位朋友来帮小弟看看这段代码

代码如下: /  UART初始化 void uartInit(void) {     SysCtlPeriEnable(SYSCTL_PERIPH_UART1);                  //  使能UART模块   &nbs ...…

查看全部问答>