附 录
_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=0; Delay(); SMBD=0; Delay(); SMBC=1; Delay(); SMBD=1; Delay(); }
SMBC为高电平时,SMBD上出现一个上升沿。该28
当南昌工程学院本科毕业设计(论文)
void Ackw(void) //ACKNOWLEDGE写子程序 SMBC为高时,采样到SMBD为低电平 {
unsigned char a=0; ack=0; SMBC=0; Delay(); SMBD=1; Delay(); SMBC=1; Delay(); }
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();
29
附 录
}
void Send(unsigned char b) //发送子程序 将b按从最高位到最低位的顺序,逐位的发送给bq2040 {
unsigned char i,x,y,z; 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) {
unsigned char i,g=0x00; for(i=1;i<9;i++) {
SMBC=0; _nop_(); _nop_();
//接收子程序 将bq2040中的数据逐位的读出 30
南昌工程学院本科毕业设计(论文)
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(); //发送确认 if(ack) //未确认则重新发送 return;
Send(Command); //发送读剩余电量指令 Ackw(); //发送确认 if(ack) //未确认则重新发送 return; Star();
a=0x17; //发送器件地址0x17 Send(a);
Ackw(); //发送确认 if(ack) //未确认则重新发送 return;
31
附 录
ReceiveData_L=Receive(); //接收剩余电量低8位数据 Ackr(); //接收确认
ReceiveData_H=Receive(); //接收剩余电量高8位数据 Nack(); //非确认 Stop(); //结束 }
void Delay2(void) //4s显示延时 {
unsigned char i,j,k; for(i=0;i<255;i++) for(j=0;j<255;j++) for(k=0;k<20;k++); } main() {
unsigned char RemainingCapacity_H,RemainingCapacity_L,Current_H,BatteryStatus_L; TMOD=0x20; //串口波特率9600bps,方式3,无校验,数据位8,停止位1. TH1=0xFD; TL1=0xFD; PCON=0x00; TR1=1; SCON=0xD8; power_led=0; while(1) {
Read(bq2040_Command_C);
// 向串口发送当前电流,利用串口助手可以看到 if(ack==0) //读数据成功,则执行赋值 Current_H=ReceiveData_H; SBUF=bq2040_Command_C;
32