2013-03-18 73 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上使用浮點或任何小型微型計算機,否則會浪費大量空間和指令週期。