1. 單片機里浮點數是怎麼存放的
可以這么說:任何存儲器,無論是pc機,單片機,甚至內存卡的基本存儲模塊都是一樣
的結構(當然是對於ram而言),都是一個存儲單元對應地址線的一種組合相應存儲一個位元組,物理結構是裡面的八個觸發器,每個觸發器對應一個位元組。至於浮點數和整型數理論上沒什麼區別了把,就在多一個位元組存放小數點吧。
2. C51單片機浮點數運算
因為沒有電路,所以程序我就沒法給你寫,給你個思路.
第一,不知道你的a和b是什麼類型的,如果是定義成浮點型,那麼,可以這樣寫:
float f_Div = a/b;
如果兩個有一個是整形的,那麼,把整型強制轉換成浮點型:
float f_Div = (float)a/(float)b;
注意,那個f_Div變數必須是float型,才能有小數產生
第二,你要進行顯示,肯定要把各個位都取出來,這裡面肯定有一個取模運算,就是"%",
對於浮點型,不運行取模運算的,所以,你必須把浮點型轉換成整型,但是,不能強制轉換,
比如: unsigned int I_Div = (unsigned int)f_Div;這是不可以的,你的小數部分就沒有了.
所以,你必須要放大一定的倍數,根據你的要求,你是要保留三位,那麼,這里還有個問題,你的
小數點之前有幾位,決定了你小數點後面保留幾位.
比如,你得到的結果是 1.2345,那麼,你就保留1.23
如果你得到的結果是 12.345,那麼,就保留12.3
如果你得到的結果是 123.45,你就只能保留123了
如果得到的結果是 0.123,你就只能保留 0.12
所以可以看出,你的浮點型結果整數部分有多少位,決定了你的小數能保留多少位,所以還要進行如下運算:
unsigned int i_Div = unsigned int)f_Div;;
unsigned char Dot_Bit = 0; //---這個變數用來表示在第幾位上顯示小數點,因為
//---通過下面的操作,已經把小數變成整數了
if(I_Div >= 100) //---表示前面有3個整數部分位
{
; //---那就沒什麼可操作的,unsigned int i_Div = unsigned int)f_Div;;就符合要求
}
else if (I_DIV >= 10) //---表示整數部分有2位
{
I_DIV = f_Div *10;
Dot_Bit = 1; //---在右數第2個地方顯示小數點,也就是十位後顯示小數點
}
else
{
I_DIV = f_Div *10;
Dot_Bit = 2; //---在右數第2個地方顯示小數點,也就是最前面那位後面顯示
}
void Display(void)
{
unsigned char Hundred = I_Div/100;
unsigned char TenBit = (I_Div/%00)/10;
unsigned char TenBit = I_Div%10;
....... //然後就開始顯示了
}
3. 51單片機通常如何輸入浮點數
單片機處理浮點數效率不高,一般是浮點數乘以10的n次方變成整數進行計算等處理,在輸出的時候再次處理小數點。比如,你輸入的是1234.567,1234保存到2個unsigned char型變數裡面,567保存到2個unsigned char型變數裡面,如果是有符號浮點數,可以把符號單獨保存到一個unsigned char裡面,計算的時候所有的數都乘以1000,輸出的時候單獨輸出整數部分和小數部分。
4. 單片機的浮點數存儲
一般單片機的浮點數是32位表示,也就是4位元組,在24存儲器中,你可以任意存儲,只要寫入順序和讀出順序一致就行。一般將一個數據的4個位元組連續存儲。讀出是連續讀出,然後存入表示浮點數的內存空間就行了,只要知道浮點數的首位元組地址就可以了
5. 浮點數對單片機的速度影響很大么
一般來說,普通單片機都不具備硬體浮點數運算功能,也就是說單片機實際上是不直接支持浮點數的數據類型的數據的,浮點數主要通過編譯器來軟實現,浮點數精度和長度與編譯器有關,一般有用32位(單精度)和64位數據(雙精度)以科學計數法來表示一個浮點數,具體可參考浮點數表示方式。而普通單片機通常是8位或16位,要將這32位數據處理為一個浮點數,中間的運算過程可想而知有多大。舉個列子吧,51單片機用keil編譯器每增加一次浮點數運算代碼增加約有幾十到上百Byte。運行速度當然就慢下來了。
6. 單片機浮點數顯示問題
1.採用定點方法如一個脈沖代表0.003米,將其擴大1000倍為整數3,然後顯示結果
unsigneg
long
int
depth=pulse*3
最後顯示時把小數點定在倒數第4位後面即可
2.
用C語言編程時,可用float型,後將結果轉化成字元串,然後用字元串顯示函數
如
sprintf(s,"%6.4f",a);,
a是浮點數變數S[]是保存字元串轉換結果的數組
長度根據需要自己定中間引號里是輸出格式控制符,類似於print
方法1我一直採用,第2種方法是我最近才學會的
7. 單片機浮點數運算問題。程序如下
.採用定點方法如一個脈沖代表0.003米,將其擴大1000倍為整數3,然後顯示結果
unsigneg long int depth=pulse*3 最後顯示時把小數點定在倒數第4位後面即可
2.
用C語言編程時,可用float型,後將結果轉化成字元串,然後用字元串顯示函數
如 sprintf(s,"%6.4f",a);, a是浮點數變數S[]是保存字元串轉換結果的數組 長度根據需要自己定中間引號里是輸出格式控制符,類似於print
方法1我一直採用,第2種方法是我最近才學會的
8. 51單片機怎麼實現浮點運算
要先按裝浮點庫C51FPS.LIB,按裝路徑為:將 C51FPS.LIB 文件復制到 C:\Keil\C51\LIB\ 文件夾下面。
而後在程序中用浮點型變數float或double進行運算即可。
9. 單片機:浮點運算是怎樣完成的
單片機本身沒有乘法器,做浮點運算也是通過將浮點數變為整數,通過加法完成。
10. 51單片機能不能計算浮點數,支不支持浮點運算有人說能,有人說不能。
不能直接硬體計算浮點(就是所謂的FPU),只能通過程序庫(調用函數)模擬完成,非常耗時!