欢迎光临散文网 会员登陆 & 注册

单片机应用实践篇之单总线上单个DS18B20的温度读取显示编程(基于数码管...

2023-07-12 22:31 作者:无数碎片寻你  | 我要投稿

我找到规律了,我发现, 正数是没问题的,然后负数,如果这个负数是整数的话, 整数部分,就是根据补码的规则去求的,取反,然后加一,

但是如果负数,并且后面带有小数的话,整数部分就是反码, 不是补码了,可能需要区分一下,我也没手册,我是看老师截图,换算得到的结论,并且我验算了,可以实现,总结一下,正数,是本身,没问题,负数的话,如果小数点后面有数字,那么整数部分,是原码的反码,不是补码,小数点后面是0的话,那整数部分就是补码,取反加一就可以了

//xiao是小数部分,就是区分,当负数的情况下,补码和反码

if(xiao == 0x00)

{

zheng = ((~dat)+1) ;

}

else

{

zheng = ((~dat) ) ;

}

完整的处理函数

/处理整数部分


unsigned char chuli(int dat, unsigned char *str,int xiao)

{

unsigned char i = 0;

unsigned char len = 0;

unsigned char buf[7];

//提取符号

unsigned char sign;

unsigned char zheng;

sign = dat >> 7; //将整数部分移走,此时sign代表符号位

//然后开始提取整数部分

zheng = dat & 0x007F; //消除了符号位

//此时zheng 有可能是负数(补码),也有可能是整数,所以需要判断

if(sign > 0)

{

*str++ = '-';

len++;

//如果是负数, 说明是补码, 所以需要还原成源码

//现在我们只需要 整数取反, 并且保留七位整数,然后加一即可

// zheng = ((~dat) & 0x07F +1) ;

if(xiao == 0x00)

{

zheng = ((~dat)+1) ;

}

else

{

zheng = ((~dat) ) ;

}

}



//下面把整数填进数组

do

{

buf[i++] = zheng %10 + '0'; //dat%10 + 0x30; buf[0] = '8' buf[1] = '7'

zheng /= 10;

}while(zheng > 0); //每取到一位数, 就截取掉

len += i;

while(i-- > 0)

{

*str++ = buf[i];

}

*str = '\0';

return len;

}


单片机应用实践篇之单总线上单个DS18B20的温度读取显示编程(基于数码管...的评论 (共 条)

分享到微博请遵守国家法律