资源简介
使用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
- 上一篇:modsan32测试工具
- 下一篇:双网卡切换软件
相关资源
- 51单片机最小系统Protel99SE原文件
- 51单片机汇编语言音乐程序
- C51的单片机底层串口程序
- 单片机英文参考文献有中文对照
- 单片机花样流水灯
- 基于单片机的TDS水质测试仪
- 51单片机迷宫小车
- 单片机与西门子S7-200通信
- 基于51单片机的记分器
- AT89C51RC2驱动TFT320240显示图片
- 单片机温度测量,与protues仿真
- 基于51单片机的比赛用记分器
- 用DS1302与LCD12864设计的可调电子钟及仿
- 单片机串口通信程序.rar
- 单片机图形
- ADF4350单片机MSP430控制程序
- PROTUSE仿真自动避障or寻迹小车
- 基于MSP430单片机的交流电压测量设计
- 51单片机nrf24L01遥控小车
- 51单片机的数字温度,使用DS18B20,数
- 51单片机的步进电机控制,lcd1602显示
- 强大的液晶菜单
- 基于C8051F340单片机通过串口升级的解
- 模拟IIC读写at24c512
- 单片机气缸控制电路
- stc 51单片机实现的交通灯包括keil程序
- 51单片机光敏电阻寻光程序
- 用CPLD实现单片机并行I/O接口的扩展
- 十天学会单片机100
- 单片机课程设计--数字温度计
评论
共有 条评论