在C中使用带有8051芯片的浮点数的问题

时间:2013-03-18 18:31:37

标签: c 8051

我正在尝试使用开发板上的电位分压器创建一个数字电压表。它使用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--);
}

我完全迷失了,所以任何帮助都会很棒。非常感谢提前

2 个答案:

答案 0 :(得分:1)

听起来像你的8051具有非常有限的程序存储器(闪存),并且浮点仿真库使图像变得臃肿,因此它非常适合。 AFAIK,8051s没有浮点指令,因此必须模拟所有操作。

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

顺便说一句,我假设“Mv”应该代表毫伏。正确的缩写是“mv”。 “Mv”意味着Megavolt。

答案 1 :(得分:0)

我不确定这段代码是如何工作的。

你的预编译常量是5000/196,这是25.为什么你需要你的变量“conv”浮动?你将char“a”与float“conv”相乘,它将被上升为浮动,只是在代码的同一行中再次转换为char“a”。不是最有效的事情。而char“a”无法存储乘法运算的结果。它不应该工作,无论你的意图是什么,除非你有一些聪明的,优化的算法超出我的理解。但在这种情况下,记录它是一个好主意,因为程序员的意图在这里并不明显,并且在一段时间后也不会显而易见。

无论如何,你甚至不需要分数点表示,你只在这里处理整数,并将结果显示为整数。为什么你首先需要漂浮?或者我错过了什么?

是的,8051浮点有点重,缺乏硬件支持,它可能不是可重入的,所以你应该采取一些措施不要从中断使用它(不保存FP堆栈),标准8051是有限的到4 KB ROM(如果你想让它适合它,请使用8052)。除非绝对必要,否则最好避免使用8051或任何小型微浮点,否则您需要浪费大量空间和指令周期。