0

抱歉,想标题有点吃力。

基本上,我有一段代码从我的嵌入式板(8051)上的比较器读取一个值。这将是一个 0-255 之间的值,其中 0 是 0V,255 是 5V。

我需要将这些值输出到一组八个 LED,每个 LED 在变量 P1 上分配一个位,以人类可读的方式(IE 像电平表)。因此,输入值必须四舍五入,以便从 16 到 32 的任何值输出为 1、33 到 48 为 2、49 到 80 为 4、81 到 112 为 8 等。

到目前为止,我知道的唯一可行的解​​决方案是一串 if-else 语句,但是在意识到它不会削减它之前,我深入了两层。

有谁知道如何做到这一点?我的大脑已经变得糊涂,试图弄清楚如何在数学上做到这一点。

谢谢!乔

编辑:这是我计算的快照,我希望它更清楚一点。http://i.imgur.com/r3n8Ila.png

4

3 回答 3

1

我认为与您的数据相当接近的数学公式可能是

BitNumber = floor(voltage / 32 + 1/2)

其中 floor 是比您的结果低的最接近的整数。

这也可以写成

BitNumber = round(voltage / 32)
于 2013-03-13T23:13:49.463 回答
0
#include <stdio.h>

int round8values(int inputVoltage)
{
    return 1 + inputVoltage/32 ;
}

int main(void)
{
    printf("31 goes to :  %d \n", round8values(31));
    printf("31 goes to :  %d \n", round8values(42));
    printf("31 goes to :  %d \n", round8values(64));
    return 0;
}
于 2013-03-13T22:46:56.630 回答
0

好的,对于这个新的值列表,您需要浮点运算,例如

int bitno = (trunc(1 + (val/255.0 - 0.0625)/0.125));

或者你可以作弊并以足够的精度进行 int 算术:

int bitno = ((val*31372 + 515000)/1000000);

您至少需要 24 位 usigned int 才能使此类操作正常工作而不会溢出。

一旦你计算了你需要的位,设置它:

int LEDval = bitno == 0 ? 0 : 1 << (bitno - 1);

或者为了避免三元运算,

int LEDval = 0;
if (bitno) LEDval = 1 << (bitno - 1);
于 2013-03-13T22:47:46.700 回答