音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

挑戰(zhàn)自我!幫助他人!算法問題!

作者:byd318 欄目:單片機
Question: 在8位單片機中不使用浮點數(shù)的方法,如何將一個字節(jié)的數(shù)據(jù)得到浮點數(shù)的BCD碼
Instruction:
        比如我們做一個AD0809的AD采集(8位),測試電壓在5V時得到的是數(shù)字量是255,如果得到的數(shù)字量是97,則對應計算公式: 5*97/255=1.902;或許你可以寫為:數(shù)字量/51; 我們都知道在C語言中,整數(shù)除以整數(shù)肯定只有得到整數(shù);就是說,如何在整型中得到所需要的BCD碼(1,9,0,2);有人提出定義浮點數(shù)來處理,當然這樣沒問題:今天我們提出的只用整型來處理:
Intent:
     看看誰能提出更好的實際可用的解決辦法;挑戰(zhàn)自我!幫助他人!
2樓: >>參與討論
zhonghuahun212

unsigend CHAR *p,i;
unsigned int j,k;
for(i = 0; i < 4;i++)
{
  *(p + i) = j/k;
  j = j%k;
  if(j > 0)
  {
   j = j *10;
  }
}

你看看能達到要求么,i是控制小數(shù)位的個數(shù),如果要保留1位小數(shù),i就應該<2,2位小數(shù),i<4;3位小數(shù),i<5;以此類推;k是除數(shù),j是被除數(shù);*p里面放的就是要的結果

3樓: >>參與討論
zhonghuahun212

還需要說明一點,考慮到四舍五入的話,

最后一位小數(shù)要判斷一下,就在后面加一點就行了!這個不用多說了吧!哈哈,不知道對頭部,懇請斧正!

4樓: >>參與討論
ee168

有實用性,我也想得到一個在匯編下看來更有效的C語言程序,我想一想

我現(xiàn)在構思是,通過對整數(shù)51取余來獲得

5樓: >>參與討論
byd318

對于zhonghuahun212的回復表示衷心的感謝!思路很正確!

只是我建議在51中最好不用指針,那樣代碼會長一些;對于zhonghuahun212中提到保留小數(shù)點問題,我不知道是我理解上是否有誤,單字節(jié)最大值255;(X<=255)/51后肯定是小數(shù),i=2 保留1位,I<3, 對應2;i<4,對應3;依次類推:

謝謝zhonghuahun212的回答,需要的朋友可以放心使用;我只是提出來,讓一些朋友發(fā)起一種用自己的知識幫助別人,同時提高自己的一種思想;國人中做技術要想趕上和超過外國,要想成為精英就應該該有一種務實的精神和幫助自己同胞的思想.

對于那位提倡用查表的方法,肯定的是感謝你對貼的關心,但我認為一個簡單的計算就用查表且空間占3K,如果我只用2051這種小片子,用串行方式得到8位數(shù)據(jù);2051如何裝下3k;現(xiàn)在追求小容量干大事情;違背了實用性強的原則!

6樓: >>參與討論
thfli
以下是引用 byd318 在(2006-11-9 13:19:39)的發(fā)言

對于那位提倡用查表的方法,肯定的是感謝你對貼的關心,但我認為一個簡單的計算就用查表且空間占3K,如果我只用2051這種小片子,用串行方式得到8位數(shù)據(jù);2051如何裝下3k;現(xiàn)在追求小容量干大事情;違背了實用性強的原則!



  我不知道這是你想出來的一個應用還是你真的要做這么一件東西。如果你真的要做這么一件東西,你的MCU也定下來了,要求是小容量,那沒辦法。但如果你只是想出來一個命題,有很多場合是要求處理速度的,做一次乘除法實在是太花時間。那個程序轉(zhuǎn)換一次一共要做12次乘除法。如果這種AD數(shù)據(jù)到顯示數(shù)據(jù)的刷新次數(shù)很多的話,那實在是很不妙。有時在一些設計中出于功耗等原因,時鐘頻率會比較低,這樣算起來就更慢了。原則也是根據(jù)應用而定的,你的考慮比較片面。

  另外,你在樓頂?shù)馁N子里也沒指明你要用什么MCU,就一般考慮,現(xiàn)在3K空間對大部分單片機來說實在不算什么。如果從成本考慮,你非要用小片子,我的方案中也提到了一個節(jié)省空間的辦法,沒有仔細想,但應該是可行的。

  最后,不要把問題的考慮局限于51的MCU。

7樓: >>參與討論
weiwei00

談點看法:1、LZ要得到的是BCD碼,肯定是用于顯示,由于人眼觀察的滯留性,刷新速率不可能很高。用2051做BCD碼轉(zhuǎn)換是游刃有余。2、0809輸出的8位數(shù)據(jù),轉(zhuǎn)換成相應的BCD 也不復雜,我通常的做法是先確定小數(shù)位數(shù)。比如3位。把ad后的數(shù)據(jù)先乘以5,再乘以1000(擴大1000倍),除255就得到結果。再算成BCD。第一位是整數(shù),后三位是小數(shù),6M的晶體,1mS以內(nèi)就完成,對于顯示速度來說,是能承受的,即使8路完全轉(zhuǎn)換,也耗時不多

8樓: >>參與討論
thfli
以下是引用 weiwei00 在(2006-11-9 18:48:33)的發(fā)言

談點看法:1、LZ要得到的是BCD碼,肯定是用于顯示,由于人眼觀察的滯留性,刷新速率不可能很高。用2051做BCD碼轉(zhuǎn)換是游刃有余。2、0809輸出的8位數(shù)據(jù),轉(zhuǎn)換成相應的BCD 也不復雜,我通常的做法是先確定小數(shù)位數(shù)。比如3位。把ad后的數(shù)據(jù)先乘以5,再乘以1000(擴大1000倍),除255就得到結果。再算成BCD。第一位是整數(shù),后三位是小數(shù),6M的晶體,1mS以內(nèi)就完成,對于顯示速度來說,是能承受的,即使8路完全轉(zhuǎn)換,也耗時不多



  對于顯示速度,明顯是能夠承受的。但問題是在你進行轉(zhuǎn)換的這1ms內(nèi),你的程序如果除非是響應中斷,不能干其它任何事情。明白我的意思沒有?在很多time demanding的應用中,1ms是多么長的時間啊
9樓: >>參與討論
ee168

uchar jieguo[3];

fun(uint yuan){
  uchar i;
  for(i=0;i<4;i++){
    jieguo[i]= yuan / 51;
    yuan=yuan % 51*10;
  };
  if(yuan>=255) jieguo[3]++; \\四舍五入
}

參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
8051和C51的區(qū)別
[求助]關于數(shù)碼管
有沒有誰用過EPROM芯片啊?
CF卡的容量與尋址空間及地址線
如何使用ADC0804
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號