1

開発ボードの分圧器を使用してデジタル電圧計を作成しようとしています。8051 チップを使用しています。それをボルトに変換するには、ポットからの数値に 5000/196 を掛ける必要があります。コンパイルする次のコードがありますが、ボードに送信すると、「概要:
517 行を受信しました
4694 バイトを受信しました
291 バイトを書き込みました
エラー: 4403 バイトを書き込むことができません」なぜ送信されないのかわかりませんが、以下のコードのどこかで私がばかげていることを確認してください。

#include<8051.h>                     //header file, containing information on 8051
#include<stdio.h>                   //standard input/output file
#include<math.h>
#define DAC 0x0600              //DAC address
float conv=5000/196;
unsigned char xdata * idata DPTR;     //pointer declaration, made as external to main
unsigned int volt_in;

void delay();
void main()
{   
    unsigned char a;                 //variable to store signal value
    DPTR=DAC;   //pointer as a variable takes address of                            // DAC
    while(1)
    {
            a=0;
            *DPTR=a;                //assign  a to address in DPTR 
            while(P3_5!=0){
                a++;
                *DPTR=a;   
                 }
            a=(int) a*conv;
            volt_in=a;
            printf ("The voltage is %d Mv. \r" , volt_in); 
            a=~a;
            P1=a;
            //delay();




    }

}

void putchar(char c)
{
    while(!TI);
    TI=0;
    SBUF=c;
}


void delay()
{
unsigned int k;
for (k=0xFFFF;k>0;k--);
}

私は完全に迷っているので、どんな助けも素晴らしいでしょう。よろしくお願いします

4

2 に答える 2

1

8051 のプログラム メモリ (フラッシュ) が非常に限られており、浮動小数点エミュレーション ライブラリがイメージを肥大化させているように思えます。私の知る限り、8051には浮動小数点命令がないため、すべての操作をエミュレートする必要があります。

float の代わりにスケーリングされた整数を使用することをお勧めします。つまり、たとえば 1/100 ミリボルトを表す長整数を使用し、printf で出力を再フォーマットします。

ところで、「Mv」はミリボルトを表すと想定しています。正しい略語は「mv」です。「Mv」はメガボルトを意味します。

于 2013-03-18T18:45:19.183 に答える
0

このコードがどのように機能するのかわかりません。

プリコンパイルされた定数は 5000/196 で、これは 25 です。変数「conv」を float にする必要があるのはなぜですか? char "a" を float "conv" で乗算すると、float にアップキャストされますが、コードの同じ行内で再び char "a" にキャストされるだけです。正確に最も効率的なことではありません。そして、その文字「a」は乗算演算の結果を格納できませんでした。私の理解を超えた巧妙で最適化されたアルゴリズムがここにない限り、あなたの意図が何であれ、それはうまくいかないはずです。しかし、この場合、プログラマーの意図はここでは決して明白ではなく、しばらくするとあなたにも明らかではないため、それを文書化することをお勧めします。

とにかく、小数点表現さえ必要ありません。ここでは整数のみを扱っており、結果を整数として表示します。そもそもなぜフロートが必要なのですか?または、何か不足していますか?

はい、8051 浮動小数点はハードウェア サポートがないため少し重いです。おそらく再入可能ではないため、(FP スタックを保存せずに) 割り込みから使用しないように何らかの対策を講じる必要があります。標準の 8051 は 4 KB に制限されています。 ROM (これをそのまま収めたい場合は 8052 を使用してください)。絶対に必要な場合を除き、8051 または小さなマイクロの浮動小数点を避けるのが最善です。または、無駄にするスペースと命令サイクルがたくさんあります。

于 2013-03-19T16:16:40.757 に答える