0

申し訳ありませんが、タイトルを考えるのに少し苦労しました。

基本的に、組み込みボード(8051)のコンパレータから値を読み取るコードがあります。これは0〜255の値になります。ここで、0は0V、255は5Vです。

これらの値を8つのLEDのセットに出力する必要があります。各LEDには、人間が読める形式(つまり、レベルメーターのような)で変数P1にビットが割り当てられています。したがって、入力値は、16から32までが1、33から48が2、49から80が4、81から112が8などとして出力されるように丸める必要があります。

これまでのところうまくいくとわかっている私の唯一の解決策は、一連のif-elseステートメントですが、それがうまくいかないことに気付く前に、2つのレイヤーを深くしました。

誰かがこれを達成する方法を知っていますか?私の脳は、数学的にそれを行う方法を考え出そうとして、どろどろになりました。

ありがとう!ジョー

編集:これが私の計算のスナップショットです、それが少し明確になることを願っています。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 ビットの ussigned int が必要です。

必要なビットを計算したら、次のように設定します。

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

または、三項演算を避けるために、

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