• 大小: 27KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-20
  • 语言: 其他
  • 标签: C51  单片机  

资源简介

使用51单片机通过SMBUS总线读记录的锂电池电量,包含一个c51程序代码和原理图。测试通过,对设计使用锂电池供电的仪器的人员非常有帮助!

资源截图

代码片段和文件信息

#include 
#include 
#include 

sbit  SMBC=P1^6;//sbit  SMBC=P1^4;          //bq2040中SMbus的时钟端
sbit  SMBD=P1^7;//sbit  SMBD=P1^5;          //bq2040中SMbus的数据端
sbit  led3=P1^3;          //LED指示灯的最高位,4位中的第3位,0表示指示灯亮,1表示指示灯灭,即对读出数据取反
sbit  led2=P1^2;          //LED指示灯4位中的第2位
sbit  led1=P1^1;          //LED指示灯4位中的第1位
sbit  led0=P1^0;          //LED指示灯的最低位,4位中的第0位
sbit  power_led=P1^4;//sbit  power_led=P1^7;
sbit  speaker=P1^5;//sbit  speaker=P1^6;

unsigned char bq2040_Command_RC=0x0f;     //读剩余电量的指令
signed char bq2040_Command_C=0x0a;     //读电流的指令
unsigned char bq2040_Command_BS=0x16;     //读电池状态
unsigned char ReceiveData_LReceiveData_HCurrent_H_7BatteryStatus_L_6BatteryStatus_L_5;
      //从BQ2040接收数据的低位,高位,电流正负位(正表示充电,负表示放电),电池状态充放电判断(0表示充电,0x40表示放电),电池状态满充判断(0表示未充满,0x20表示充满)
unsigned char ack;      //用于判断接收确认是否超时,超时为1,未超时为0

unsigned char ADAPTER=0ERROR; //用于判断仪器采用电池供电或者采用电源适配器供电

void Delay(void)   //延时子程序
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

//以下函数详见SMbus原理
void Star(void)  //开始子程序      当SMBC为高电平时,SMBD上出现一个下降沿。该条件启动一次传输过程
{
  SMBC=0;
  Delay();
  SMBD=1;
  Delay();
  SMBC=1;
  Delay();
  SMBD=0;
  Delay();
}


void Stop(void)  //停止子程序      当SMBC为高电平时,SMBD上出现一个上升沿。该条件停止一次传输过程
{
  SMBC=0;
  Delay();
  SMBD=0;
  Delay();
  SMBC=1;
  Delay();
  SMBD=1;
  Delay();
}


void Ackw(void)  //ACKNOWLEDGE写子程序     SMBC为高时,采样到SMBD为低电平
{
  unsigned char a=0;
  ack=0;
  SMBC=0;
  Delay();
  SMBD=1;
  Delay();
  SMBC=1;
  Delay();
  while(SMBD)
  {
    a++;
ack=0;
    if(a==250)     //   向串口发送EE,表示发送出错,未收到确认。利用串口助手可以看到
    {
      ADAPTER++;
  if(ADAPTER==20)
  {
        ERROR=0xEE;
ADAPTER=0;
      }
      else
    ERROR=0;
  ack=1;
      SBUF=0xEE;
      while(!TI);
      TI=0;
      break;
    }
  }
}

void Ackr(void) //ACKNOWLEDGE读子程序     SMBC为高时,采样到SMBD为低电平
{
  SMBC=0;
  Delay();
  SMBD=0;
  Delay();
  SMBC=1;
  Delay();
}


void Nack(void)  //NOT ACKNOWLEDGE子程序    SMBC为高电平时,采样到SMBD为高电平
{
  SMBC=0;
  Delay();
  SMBD=1;
  Delay();
  SMBC=1;
  Delay();
}


void Send(unsigned char b)  //发送子程序      将b按从最高位到最低位的顺序,逐位的发送给bq2040
{
  unsigned char ixyz;
  z=0x80;
  for(i=1;i<9;i++)
  {
    x=b&z;
    if(x==0)
      y=0;
    else
      y=1;
    SMBC=0;
    Delay();
    SMBD=y;
    Delay();
    SMBC=1;
    Delay();
    z>>=1;
  }
}

unsigned char Receive(void)  //接收子程序     将bq2040中的数据逐位的读出
{
  unsigned char ig=0x00;
  for(i=1;i<9;i++)
  {
    SMBC=0;
    _nop_();
    _nop_();
    SMBD=1;
    Delay();
    SMBC=1;
    Delay();
    g<<=1;
    if(SMBD)
      g++;
    Delay();
  }
  return g;
}




void Read(unsigned char Command)   //读剩余电量子程序
{
  unsigned int a; 
  Star();      //开始
  a=0x16;
  Send(a);    //发送器件地址0x16
  Ackw();     //发送确

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       9685  2009-02-28 16:22  单片机读BQ2040电池电量\2051Readbq2040.c

     文件     403456  2009-03-27 11:25  单片机读BQ2040电池电量\单片机读BQ2040电池电量.DDB

     目录          0  2009-08-07 09:14  单片机读BQ2040电池电量

----------- ---------  ---------- -----  ----

               413141                    3


评论

共有 条评论