在应用中传感器输出的是16bit的 2’s complement (即补码)形式表示的数据,这是带符号的数据,定义一个16位int变量保存该数据即可。
但是在单片机中通常我们使用无符号数据进行运算,所以,获得传感器的值后需要转换为无符号型数据,在需要把这些数据进行发送或保存时再把数据转换成有符号型数据。
现在以一款传感器的输出数据来具体说明数据转换过程。输出的数据格式是补码形式表示的数据,范围从0xF800到0x07FF,如果超出量程则输出-4096.
把传感器数据转换为无符号型数据,即-2048到2047转换为0到4095,假定数组XYZ[]存放的是传感器数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | for(i=0;i<3;i++) { if((XYZ[i]&0xF800)==0xF800) //是负数、且在量程范围内 { XYZ[i]=((~XYZ[i])+1); //补码取反加一,得到其原码 XYZ[i]=(2048-XYZ[i]); } else if(XYZ[i]==0xf000) //量程溢出 { ; } else if(XYZ[i]<0x800) //是正数,且在量程范围内 { XYZ[i]=XYZ[i]+2048; } } |
把无符号的数据转换为有符号的正常数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | for(i=0;i<3;i++) { if(XYZ[i]<2048) //原来是负数 { XYZ[i]=(XYZ[i]|0xf800); //应该减2048,即+(-2048)=+(0xF800) } else if(XYZ[i]<4096) //原来是正数 { XYZ[i]=(XYZ[i]-2048); } else //溢出 { XYZ[i]=0xF000; } } |