资源简介
使用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测试工具
- 下一篇:双网卡切换软件
相关资源
- STC8951系列单片机中方指南
- 基于MCS_51单片机的工业屏柜散热方案
- MCS_51单片机与8255A的接口设计
- 飞思卡尔单片机MC9S12XS12G128驱动(硬件
- 51单片机PWM程序,占空比、周期可调整
- 单片机和adc0809数字电压表
- PIC单片机完成的电子密码锁
- 单片机、ADC0808809设计简易数字电压表
- 51单片机多功能自行车测速仪
- 单片机做的6位时分秒数字钟
- 单片机电子时钟 闹钟 日历
- proteus仿真 AT89C51输出各种波形
- 音乐代码转换软件 单片机编程时用
- 单片机课程设计 篮球计分器
- 00
- 用51单片机实现G代码翻译
- 简易的电阻电容测量电路
- 单片机与温度传感器DS18B20的程序设计
- 51单片机基于protues的几个仿真实例
- 基于52单片机的直流电压测量
- 38k单片机红外发送代码、keil
- 51单片机PCB设计图
- PC -- 单片机的串口数据传输系统设计
- 51单片机控制舵机程序
- 武汉理工大学 单片机课程设计 16*16点
- 51单片机读取温度数据存储到SD卡中并
- 【单片机】51单片机数码管显示万年历
- 浙江工业大学2005-2006学年单片机习题
- 单片机与PC机串口通讯仿真
- 毕业设计 单片机 对讲机 protues仿真
评论
共有 条评论