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 的程序内存(闪存)非常有限,并且浮点仿真库使图像膨胀,因此它太大了,无法适应。AFAIK,8051 没有浮点指令,因此必须模拟所有操作。

我建议尝试使用缩放整数而不是浮点数。换句话说,使用表示 1/100 毫伏的长整数,并在 printf 中重新格式化输出。

顺便说一句,我假设“Mv”应该代表毫伏。正确的缩写是“mv”。“Mv”表示兆伏特。

于 2013-03-18T18:45:19.183 回答
0

我不确定这段代码应该如何工作。

您的预编译常量是 5000 / 196,即 25。为什么需要将变量“conv”设为浮点数?您将 char "a" 与 float "conv" 相乘,它将向上转换为 float,只是在代码的同一行中再次转换为 char "a"。不完全是最有效的事情。并且那个字符“a”无法存储乘法运算的结果。不管你的意图是什么,它都不应该起作用,除非你有一些超出我理解的聪明、优化的算法。但是在这种情况下,记录它是一个好主意,因为程序员的意图在这里并不明显,并且在一段时间后对你来说也不明显。

无论如何,您甚至不需要小数点表示,您只在这里处理整数,并将结果显示为整数。为什么首先需要浮动?还是我错过了什么?

是的,8051 浮点有点重,缺乏硬件支持,它可能不是可重入的,所以你应该采取一些措施不要在中断中使用它(不保存 FP 堆栈),标准 8051 限制为 4 KB ROM(如果您希望它按原样安装,请使用 8052)。除非绝对必要,否则最好避免在 8051 或任何小型微处理器上使用浮点数,或者您有很多空间和指令周期可以浪费。

于 2013-03-19T16:16:40.757 回答