2011年英语四级成绩查询
7.0 14位,12位或10位数据流和数据转换
MMA8451Q具有14位的XYZ数据。 MMA8452Q具有12位XYZ数据而MMA8453具有10位的数据。本节概述了如何根据不同的MCU以及不同的数据格式来处理这些不断产生的14位数据数据。 “示例将以14位数据为例给出,但读者可以理解对于12位数据或10位数据应当作出怎样的变化。驱动程序代码具有所有的数据格式的所有功能。
事件标志可以通过读状态寄存器(0×00)来监视。监视事件标志可以通过本文件的第9.0节中所讨论的轮询或中断技术来完成。完全没有必要读状态寄存器来将其清除。读取数据将会清除状态寄存器。
表9。0X00 状态寄存器:数据状态寄存器(只读)
每当有新的数据在任何轴出现时,ZYXDR标志将被置位。下面的示例代码演示了如何监视这个标志位,当检测到新的数据时,通过一个单次的多字节I2C访问,将14/12/10-bit的XYZ数
chee
据读取到RAM中的一个数组(value[])。然后这些值被复制到16-bit变量以进行进一步加工。
Code Example:
/*
** Poll the ZYXDR status bit and wait for it to t.
*/
RegisterFlag.Byte = IIC_RegRead(STATUS_00_REG);
if (RegisterFlag.ZYXDR_BIT == 1)
{
/*
** Read 14/12/10-bit XYZ results using a 6 byte IIC access.
*/
IIC_RegReadN(OUT_X_MSB_REG, 6, &value[0]);
/*
** Copy and save each result as a 16-bit left-justified value.
*/
苏武牧羊翻译x_value.Byte.hi = value[0];
x_value.Byte.lo = value[1];
y_value.Byte.hi = value[2];
y_value.Byte.lo = value[3];
z_value.Byte.hi = value[4];
z_value.Byte.lo = value[5];
}
下面的例子展示了一个与寄存器对应的左对齐的16bit X轴数据结果
表10。0X00 x_value.B yte.hi:MMA8451Q X_MSB寄存器(只读)
表11。0X01 x_value.B yte.lo:MMA8451Q X_LSB寄存器(只读)
表12。 x_value16位二进制结果
7.1将14位二进制数转换成十六进制有符号整数(计数)
转换为有符号数值意味着,二进制的十六进制数转换为有+或 - 符号的整数。
例如:0xABCC=-1349
0x5443=1349
正负号可以通过检查高字节的值是否大于0x7F来确定。如果大于0x7F,则值是一个负数,并需要通过执行一个二进制补码操作来转换。这涉及到执行1的补码(即取反操作,将所有的“1”换成“0”并且将所有“0”换成“1”),并将结果加1。
下面的代码演示了这种转换。它也增加了额外的输出格式化步骤,用空格字符替换每一个前导零的数字,这是通过传递0xF0到SCI_NibbOut()函数来实现的。仔细研究后可以看出,此例程将把0x30加到0xF0,得到的结果0x120被截断为0x20- 空格字符的ASCII码值。
pest是什么意思Code Example:
void SCI_s14dec_Out (tword data)
{
byte a, b, c, d;
word r;
/*
** Determine sign and output
*/
if (data.Byte.hi > 0x7F)
{
SCI_CharOut ('-');
data.Word = ~data.Word + 1;
}
el
{
SCI_CharOut ('+');
}
/*
** Calculate decimal equivalence:
** a = thousands
** b = hundreds
** c = tens
** d = ones
*/flat什么意思
a = (byte)((data.Word >>2) / 1000);
r = (data.Word >>2) % 1000;
b = (byte)(r / 100);
r %= 100;
c = (byte)(r / 10);
d = (byte)(r % 10);
/*
** Format adjustment for leading zeros
*/
if (a == '0')
模糊数学模型{
英语谜语及答案
a = 0xF0;
if (b == '0')
{
b = 0xF0;
if (c == '0')
{
gugu5
c = 0xF0;
}
}
}
/*
* Output result
*/
SCI_NibbOut (a);
SCI_NibbOut (b);
SCI_NibbOut (c);
SCI_NibbOut (d);
}
7.2将14位二进制的十六进制数转换成以重力加速度g为单位的单精度浮点数
将结果转换成以重力加速度g为单位的单精度浮点数与上面例程的操作步骤相类似,但需要添加处理整数和小数部分值的过程。加速度计主动模式(即,无论是2G,4G或8G)的量程设置决定了小数点的位置以及传感器的灵敏度和精度。在任何情况下,最重要的位,第13位,代表结果的符号(正或负)。
••在2g主动模式1g=4096计数。因此,12位是唯一的整数位,决定了整数值是0或1。 212 = 4096。 11至0位是小数的数值。
•在4g主动模式1g= 2048个字。因此,位12和位11将表示整数值0,1,2,或3。 10到0位是小数的数值。
••在8g的主动模式1g=1024个。因此,位12,11和10将表示整数值是0,1,2,3,4,5,6,和7。 9至0位是小数的数值。
表13。满量程值与相应的整数位和小数位
7.2.1 2G主动模式
在表14中可以看出,在2g主动模式时的结果调整数据转换成16位的左对齐格式后,小数点
baby中文歌词隐含于13和14位之间。表格中标记为“MMA8451Q 14b”的行显示的是这种格式中的14bit结果,而标记为“MSB / LSB”的行中加粗的(“M”)和不加粗的(“L”)表示数据来源于哪个结果寄存器。标记为“Integer/Fraction” 的行显示, 15位是符号位(“±”),而唯一一个整数位位于word格式的第14位(“I”)
表14。2G主动模式下的14位数据转换为小数
确定符号和整数的结果后,结果逻辑左移两个二进制位,只留下的小数部分的结果,如表15所示。
表15。Word格式的2G主动模式下的14位数据左移后,消除整数和符号位
左移2位后剩下6个MSB位和6个LSB位。因此在2G主动模式有12位的小数部分。2g的主动模式下具有最高编号的位数为12的小数部分,因此它具有最高的灵敏度。在表16中的十进制值的最后小数四舍五入至小数点第四位的地方,因为将有四位有效数字。这应该是足够的。
表16所示的值被转换成的C的宏定义将在本节结束的代码示例中使用:
表16中。 2G主动模式下的分数值
#define FRAC_2d1 5000
#define FRAC_2d2 2500
#define FRAC_2d3 1250
#define FRAC_2d4 625
#define FRAC_2d5 313
#define FRAC_2d6 156
#define FRAC_2d7 78
#define FRAC_2d8 39
#define FRAC_2d9 20
#define FRAC_2d10 10
#define FRAC_2d11 5
bct
#define FRAC_2d12 2
对于12个分数位的每一位,如果该位被置位那么相应的十进制值将被加到最终结果。例如,如果8,6和4位被置位,那么,总数将是(625+156+ 39=820),其对应于0.0820。最高分数值出现时,所有的小数位数都被置位(5000+ 2500+1250+625+313+156+ 78+ 39+ 20+10+ 5 + 2=9998),对应于0.9998。在2g主动模式下的分辨率为0.244mg(1/4096)。计算出四个数字的比例,决定了2g主动模式下,分辨率为0.2mg。
Code Example:
void SCI_s14frac_Out (tword data)
{
BIT_FIELD value;
word result;
byte a, b, c, d;
word r;
/*
** Determine sign and output
*/
if (data.Byte.hi > 0x7F)
{
SCI_CharOut ('-');
data.Word &= 0xFFFC;
data.Word = ~data.Word + 1;
}
el
{
SCI_CharOut ('+');
}
/*
** Determine integer value and output
*/
if (full_scale == FULL_SCALE_2G)
{
SCI_NibbOut((data.Byte.hi & 0x40) >>6);
data.Word = data.Word <<2;
}
el if (full_scale == FULL_SCALE_4G)
{
SCI_NibbOut((data.Byte.hi & 0x60) >>5);