| 
高级会员 主题
回帖0
积分981
阅读权限30
注册时间2012-2-14
最后登录1970-1-1
在线时间 小时
 
 | 
 
| 一直以来喜欢430的低功耗特性最近折腾了个MSP430G2与DS2784的库伦计,代码在已经调通的18B20基础上参照别人的51半成品+数据手册下编写,但是目前读取数据不正确,不知道有没有感兴趣的伙伴一起看看? 
 代码中添加了判断1wire是否正常连接的检测逻辑,绿灯正常红灯未接入。
 
 ![IMG_20220312_164654[1].jpg IMG_20220312_164654[1].jpg](forum.php?mod=attachment&aid=NDQ2NzE1fGJlNjM1ZGUyfDE3NjE2MTY1MTF8MHw5MDc2Ng%3D%3D&noupdate=yes)  ![IMG_20220312_165354[1].jpg IMG_20220312_165354[1].jpg](forum.php?mod=attachment&aid=NDQ2NzE2fDZiNWY0NzI3fDE3NjE2MTY1MTF8MHw5MDc2Ng%3D%3D&noupdate=yes)  
 正常连接后经过分位运算得到的值:
 
 ![IMG_20220312_164647[1].jpg IMG_20220312_164647[1].jpg](forum.php?mod=attachment&aid=NDQ2NzE4fDk5M2QxMDE4fDE3NjE2MTY1MTF8MHw5MDc2Ng%3D%3D&noupdate=yes)  
 其中温度 容量 电压来自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, 下载次数: 3) | 
 |