資源簡介
使用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測試工具
- 下一篇:雙網卡切換軟件
評論
共有 條評論