打算用51单片机做个简单计算器

[复制链接]
 楼主| 郁闷中 发表于 2008-1-21 17:06 | 显示全部楼层 |阅读模式
1.用8位数码管显示<br />2.能完成加减乘除操作(采用浮点数运算)<br /><br />51单片机在处理浮点数方面的能力如何,请赐教。
alice84 发表于 2008-1-21 17:28 | 显示全部楼层

地板

  
maychang 发表于 2008-1-21 17:33 | 显示全部楼层

51单片机在处理浮点数方面的能力与所有单片机一样,靠软件实现。不过对手动输入的计算器来说,足够。
alice84 发表于 2008-1-22 14:13 | 显示全部楼层

maychang大叔这个问题就说到这里了?

不说一下浮点数方面的编程问题吗?
zlgmcuCHTZ 发表于 2008-1-22 15:29 | 显示全部楼层

到网上找了,有浮点数运算的软件包

  
zlgmcuCHTZ 发表于 2008-1-22 15:30 | 显示全部楼层

建议自己写个先。

  
alice84 发表于 2008-1-22 15:30 | 显示全部楼层

什么语言的.

  
alice84 发表于 2008-1-22 15:37 | 显示全部楼层

想不出来

有小数部分和没有小数部分的.得把整数和小数部分转成2进制的吧.然后还要移小数点到最高位,然后还要进行127+移动的位数的值转为2进制放中间.还有符号位,这样就有三部分了.然后表示成16进制.
maychang 发表于 2008-1-22 17:06 | 显示全部楼层

要是用C语言,根本不必考虑浮点计算不浮点计算

用汇编语言那就要考虑了,浮点数麻烦得多。
alice84 发表于 2008-1-22 17:08 | 显示全部楼层

定义float

  
sz_kd 发表于 2008-1-22 17:12 | 显示全部楼层

浮点数转换成整数来运算

  
alice84 发表于 2008-1-22 17:14 | 显示全部楼层

(int)

  
sz_kd 发表于 2008-1-22 17:16 | 显示全部楼层

我说汇编里的,C里还要你考虑这么多干什么

  
sz_kd 发表于 2008-1-22 17:17 | 显示全部楼层

就简单的加减乘除这样已经足够

  
alice84 发表于 2008-1-22 17:22 | 显示全部楼层

????????

void&nbsp;&nbsp;&nbsp;DecodeFloat(&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;pByte[4]&nbsp;&nbsp;&nbsp;)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;printf(&nbsp;&nbsp;&nbsp;&quot;原始(十进制):%d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%d
&nbsp;&quot;&nbsp;&nbsp;&nbsp;,&nbsp;&nbsp;&nbsp;(int)pByte[0],&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;(int)pByte[1],&nbsp;&nbsp;&nbsp;(int)pByte[2],&nbsp;&nbsp;&nbsp;(int)pByte[3]&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;printf(&nbsp;&nbsp;&nbsp;&quot;翻转(十进制):%d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%d
&nbsp;&quot;&nbsp;&nbsp;&nbsp;,&nbsp;&nbsp;&nbsp;(int)pByte[3],&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;(int)pByte[2],&nbsp;&nbsp;&nbsp;(int)pByte[1],&nbsp;&nbsp;&nbsp;(int)pByte[0]&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;bitset&nbsp;&lt32&gt&nbsp;&nbsp;&nbsp;bitAll(&nbsp;&nbsp;&nbsp;*(ULONG*)pByte&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;strBinary&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;bitAll.to_string&nbsp;&ltchar,&nbsp;&nbsp;&nbsp;char_traits&nbsp;&ltchar&gt&nbsp;,&nbsp;&nbsp;&nbsp;allocator&nbsp;&ltchar&gt&nbsp;&nbsp;&nbsp;&gt&nbsp;();&nbsp;<br />&nbsp;&nbsp;strBinary.insert(&nbsp;&nbsp;&nbsp;9,&nbsp;&nbsp;&nbsp;&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;strBinary.insert(&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;cout&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;&quot;二进制:&nbsp;&quot;&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;strBinary.c_str()&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;endl;&nbsp;<br />&nbsp;&nbsp;cout&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;&quot;符号:&nbsp;&quot;&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;bitAll[31]&nbsp;&nbsp;&nbsp;?&nbsp;&nbsp;&nbsp;&quot;-&nbsp;&quot;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&quot;+&nbsp;&quot;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;endl;&nbsp;<br />&nbsp;&nbsp;bitset&nbsp;&lt32&gt&nbsp;&nbsp;&nbsp;bitTemp;&nbsp;<br />&nbsp;&nbsp;bitTemp&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;bitAll;&nbsp;<br />&nbsp;&nbsp;bitTemp&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt=&nbsp;&nbsp;&nbsp;1;&nbsp;<br />&nbsp;&nbsp;LONG&nbsp;&nbsp;&nbsp;ulExponent&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;0;&nbsp;<br />&nbsp;&nbsp;for&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;0;&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;&lt&nbsp;&nbsp;&nbsp;8;&nbsp;&nbsp;&nbsp;i++&nbsp;&nbsp;&nbsp;)&nbsp;<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ulExponent&nbsp;&nbsp;&nbsp;&brvbar;=&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;bitTemp[&nbsp;&nbsp;&nbsp;31&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;]&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;ulExponent&nbsp;&nbsp;&nbsp;-=&nbsp;&nbsp;&nbsp;127;&nbsp;<br />&nbsp;&nbsp;cout&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;&quot;指数(十进制):&nbsp;&quot;&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;ulExponent&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;endl;&nbsp;<br />&nbsp;&nbsp;bitTemp&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;bitAll;&nbsp;<br />&nbsp;&nbsp;bitTemp&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt=&nbsp;&nbsp;&nbsp;9;&nbsp;<br />&nbsp;&nbsp;float&nbsp;&nbsp;&nbsp;fMantissa&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;1.0f;&nbsp;<br />&nbsp;&nbsp;for&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;0;&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;&lt&nbsp;&nbsp;&nbsp;23;&nbsp;&nbsp;&nbsp;i++&nbsp;&nbsp;&nbsp;)&nbsp;<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;bitTemp[&nbsp;&nbsp;&nbsp;31&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;];&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fMantissa&nbsp;&nbsp;&nbsp;+=&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;(float)bitTemp[&nbsp;&nbsp;&nbsp;31&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;]&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;(float)(&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;cout&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;&quot;尾数(十进制):&nbsp;&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;fMantissa&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;endl;&nbsp;<br />&nbsp;&nbsp;float&nbsp;&nbsp;&nbsp;fPow;&nbsp;<br />&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;ulExponent&nbsp;&nbsp;&nbsp;&gt&nbsp;=&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;)&nbsp;<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fPow&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;(float)(&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;ulExponent&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fPow&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;1.0f&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;(float)(&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;ulExponent&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;cout&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;&quot;运算结果:&nbsp;&quot;&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;fMantissa&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;fPow&nbsp;&nbsp;&nbsp;&lt&nbsp;&lt&nbsp;&nbsp;&nbsp;endl;&nbsp;<br />}&nbsp;<br />
sz_kd 发表于 2008-1-22 17:24 | 显示全部楼层

有指数运算的浮点数才复杂啊

  
linqing171 发表于 2008-1-22 17:35 | 显示全部楼层

不容易。

以前调试过8K的汇编浮点库,也是51的。指数sin都有。<br />网上有下的,不过要注意一些错误,特别是除以0的。要是用C就简单多了。<br />写的时候不能按照常规出牌,比如正弦是查表+插值的,有些除法是用减法做的。还要考虑浮点数的归一化,还要有除以0错误的避免,不然你做FFT出现莫名的数据错误去查吧。
linqing171 发表于 2008-1-22 17:39 | 显示全部楼层

浮点的指数运算不是很复杂吧?

数字部分相乘,后面的相加,调整小数点的位置,特殊浮点数转化(比如是否为0),就差不多了吧。用C语言做好一些。
sz_kd 发表于 2008-1-22 17:49 | 显示全部楼层

比如2.3^1.22就麻烦

还是用C来
 楼主| 郁闷中 发表于 2008-1-22 18:02 | 显示全部楼层

到网上找了一些资料,感觉写起程序来不容易。

又是补码又是移码的,头都大了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

11

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部