2013-03-18 264 views
1

我正在尝试使用开发板上的电位分压器创建一个数字电压表。它使用一个8051芯片。为了将其转换为伏特,我们必须将该罐中的数字乘以5000/196。我有以下的代码编译,但是当我把它发送给董事会,我得到 “摘要:收到
517线
4694字节收到书面
291字节
错误: 4403字节无法写入” 我有不知道为什么它不会发送,但我确信我在我的代码下面的某个地方很愚蠢。用C语言与8051芯片一起使用float问题

#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--); 
} 

我完全失去了,所以任何帮助将是伟大的。非常感谢提前

+0

这听起来像错误只是试图“安装”应用程序,而不是与应用程序的*执行*(或代码发布) - 对吗? – 2013-03-18 18:35:48

+0

也许是太大的可执行文件?就像,你有4k程序存储器? (实际上猜测是盲目的)。 – Aneri 2013-03-18 18:39:13

+0

我想你使用at89c51。如果是这样的话,那么在微控制器烧录时就会出现闪存溢出的情况。只要在at89S52或更多闪存的一些变体上。 – rajesh6115 2013-04-15 11:50:16

回答

1

在我听起来像你的8051有非常有限的程序存储器(闪存)和浮点模拟库臃肿的图像,所以它是大到适合。 AFAIK,8051s没有浮点指令,所以必须模拟所有的操作。

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

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

0

我不知道这段代码应该如何工作。

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

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

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