采用线性输入,转换为几何序列和圆形?

时间:2013-03-13 22:37:10

标签: c math 8051 adc

抱歉,有点想着一个头衔。

基本上,我有一段代码从嵌入式主板上的比较器读取值(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

3 个答案:

答案 0 :(得分:1)

我认为一个非常适合您数据的数学公式可能是

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

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

这也可以写成

BitNumber = round(voltage / 32)

答案 1 :(得分: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;
}

答案 2 :(得分:0)

好的,对于这个新的值列表,你需要浮点算术,比如

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

或者你可以作弊并以足够的精确度去算术:

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);