抱歉,有点想着一个头衔。
基本上,我有一段代码从嵌入式主板上的比较器读取值(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答案 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);