51单片机IINA219 测电流电压和功率。
#include "LCD1602\LCD1602.h"
#include "INA219_DRV\INA219_DRV.h"
#include "common\common.h"
#define TH0_VALUE 0x4B
#define TL0_VALUE 0xFF //50ms per cycle.
sbit BtnRefreshMode = P3^2;
bit RefreshRate = 0; //0: 0.8s, 1: 0.5s
bit RefreshFlag = 0;
void RefreshData(void)
{
unsigned short BusVolt, Current, Power;
unsigned short OffsetCurrent, OffsetPower;
BusVolt = INA219_GetBusVolt();
PrintChar(0, 0, BusVolt/10000+48);
PrintChar(1, 0, (BusVolt000)/1000+48);
PrintChar(3, 0, (BusVolt00)/100+48);
PrintChar(4, 0, (BusVolt0)/10+48);
PrintChar(5, 0, BusVolt+48);
OffsetCurrent = (BusVolt >> 9) + 2; //Gather statistics of the measured current under various voltage conditions when no load is connected to the output port. Use Excel to do curve fitting.
Current = INA219_GetCurrent();
if(Current > OffsetCurrent)
Current -= OffsetCurrent;
else
Current = 0;
PrintChar(10, 0, Current/1000+48);
PrintChar(12, 0, (Current00)/100+48);
PrintChar(13, 0, (Current0)/10+48);
PrintChar(14, 0, Current+48);
OffsetPower = ((BusVolt >> 3) * OffsetCurrent)/125 + 6;
Power = INA219_GetPower();
if(Power > OffsetPower)
Power -= OffsetPower;
else
Power = 0;
PrintChar(0, 1, Power/10000+48);
PrintChar(1, 1, (Power000)/1000+48);
PrintChar(3, 1, (Power00)/100+48);
PrintChar(4, 1, (Power0)/10+48);
PrintChar(5, 1, Power+48);
}
int main(void)
{
INA219_Init();
LCD_Init();
TMOD &= 0xF0;
TMOD |= 0x01; //Timer 0 works in Mode 1 (16-bit Timer).
TH0 = TH0_VALUE;
TL0 = TL0_VALUE;
PrintChar(2, 0, '.');
PrintChar(6, 0, 'V');
PrintChar(11, 0, '.');
PrintChar(15, 0, 'A');
PrintChar(2, 1, '.');
PrintChar(6, 1, 'W');
PrintStr(10, 1, "R:0.8s");
RefreshData();
EA = 1; //Global Interrupt Enable
ET0 = 1; //Timer 0 Interrupt Enable
TR0 = 1; //Enable Timer 0.
while(1)
{
if(RefreshFlag)
{
RefreshData();
RefreshFlag = 0;
}
if(BtnRefreshMode == 0) //If the