高级会员
 
主题
帖子
积分981
阅读权限30
注册时间2012-2-14
最后登录1970-1-1
在线时间 小时
|
一直以来喜欢430的低功耗特性最近折腾了个MSP430G2与DS2784的库伦计,代码在已经调通的18B20基础上参照别人的51半成品+数据手册下编写,但是目前读取数据不正确,不知道有没有感兴趣的伙伴一起看看?
代码中添加了判断1wire是否正常连接的检测逻辑,绿灯正常红灯未接入。
正常连接后经过分位运算得到的值:
其中温度 容量 电压来自2784读取数值,ADC来自G2553自带ADC从P1.1检测到运算得出的实际值。
该项目在CCS 10.4下开发
主循环:
DS2784 数据读取
/*读取数据值并转换-----------------------------------------------------------*/
//温度,放大了10倍,单位是度
unsigned int get_temperature(void)
{
unsigned char MSB,LSB,pos_neg;
unsigned int Temp;
DS_Init();
DS_write_byte(Skip_ROM);
DS_write_byte(Read_data);
DS_write_byte(TEMPMSB);
copy_data_ds2784(TEMPMSB);
__delay_cycles(10000);
recall_data_ds2784(TEMPMSB);
LSB=DS_read_byte();
MSB=DS_read_byte();
//MSB = read_byte_data(TEMPMSB);
/*n=((raw[TEMPMSB]<<8)|(raw[TEMPLSB]))>>5;
Temp=(n*10)/8;*/
Temp = MSB;
if(MSB&0x80)//放电此时是负数,则为补码
{
pos_neg = 0; //正数
}
else
{
pos_neg = 1; //负数
}
Temp >>=8;
__delay_cycles(450);
LSB = read_byte_data(TEMPLSB);
Temp |= LSB<<5;
Temp = Temp&0x7fe0;
if( pos_neg == 0 )//算出原码
{
Temp =(~(Temp-1))&0x7fe0;
Temp = Temp*12.5;
//return Temp|0x8000;
return Temp;//
}
Temp = Temp*0.125;
return Temp;
}
//得到电压
int get_voltage(void)
{
DS_Init();
DS_write_byte(Skip_ROM);
DS_write_byte(Read_data);
DS_write_byte(VOLTMSB);
/*copy_data_ds2784(VOLTMSB);
__delay_cycles(10000);
recall_data_ds2784(VOLTMSB);*/
unsigned char v_h,v_l;
unsigned int voltage,volt;
v_h=DS_read_byte();
v_l=DS_read_byte();
volt=v_h;
volt<<=8;
volt=volt | v_l;
volt>>=5;
voltage= volt*(4.88);
return voltage;
}
//得到剩余的电量,电量是mah
unsigned int get_RAAC(void)
{
DS_Init();
DS_write_byte(Skip_ROM);
DS_write_byte(Read_data);
DS_write_byte(RAACMSB);
copy_data_ds2784(RAACMSB);
__delay_cycles(1000);
recall_data_ds2784(RAACMSB);
unsigned char MSB,LSB;
unsigned int accumulate;
MSB = read_byte_data(RAACMSB);
accumulate = MSB;
accumulate <<=8;
__delay_cycles(10000);
LSB = read_byte_data(RAACLSB);
accumulate |= LSB;
//accumulate = accumulate*1.6;
return accumulate;
}
//显示数据
void LCD_data_display(int t_x, int s_x, int v_x)
//void LCD_data_display(int v_x,int s_x,int d_x)
{
unsigned int a;
a=t_x; //温度
LCD_P8x16Str_sel(33,0,a/100%10+16);
LCD_P8x16Str_sel(40,0,a/10%10+16);
LCD_P8x16Str(47,0,".");//小数点
LCD_P8x16Str_sel(54,0,a%10+16);
a=s_x; //容量
LCD_P8x16Str_sel(70,0,a/10000%10+16);
LCD_P8x16Str_sel(78,0,a/1000%10+16);
LCD_P8x16Str_sel(85,0,a/10%10+16);
LCD_P8x16Str_sel(92,0,a%1+16);
a=v_x;
LCD_P8x16Str_sel(33,2,a/10000%10+16);
LCD_P8x16Str_sel(40,2,a/1000%10+16);
LCD_P8x16Str_sel(47,2,a/100%10+16);
LCD_P8x16Str_sel(54,2,a/10%10+16);
LCD_P8x16Str_sel(61,2,a%10+16);
}
详细代码参看附件内容
OLED.zip
(142.21 KB, 下载次数: 2)
|
|