小数在正常的数据中,占比还是比较大的,因此实际的使用中,不可避免的要使用到小数的显示,之前的练习,我们一直采用的都是整数,为了方便演示,从未讨论小数的使用问题,今天就单独来说一下,关于小数的使用问题。
首先我们要知道,在单片机中,参与计算的都是整数,不论是正整数还是负整数,我们都是拿来直接用,从不用考虑是否存在无法运算的情况。今天所说的小数,就要考虑这个问题了,不然,运算会直接出现不可名状的错误。
小数,在单片机中,有一个单独的分类,我们称之为浮点型数据。之所以说是浮点型,是因为,在小数的显示过程中,小数点会出现在不同的位置,例如3.14,可以写成0.*10^1,或者31.4*10^-1,小数点的位置并不固定,所以,称为浮点型。
然后我们的浮点型数据又分为单精度、双精度和长双精度型三种,以单精度浮点型为例(float),在数据存放时,会将数据分为两个部分存放,一般是四个字节,就是32位存储,其中6位来表示数据,包括数据的正负,后26位来存放指数部分,包含指数的正负。双精度浮点型(double),数据存储了8个字节,存储是64位,其中15位是有效数字,49位是指数部分,有效位和小数都更加精确了。长双精度型(longdouble)则是16字节,数据占了19位,可以看出,数据更加大,更加精确。
说了这么多,其实基本上用不到,但是得知道小数的不一样之处,这样在使用就比较方便了。
暂且不论小数的存储问题,我们先来看看,如何让小数显示出来。显示设备,我们使用的还是数码管,在输出时,会在数码管中添加上小数点的。
例如原来,显示数据是SEG7_CA=0xC0,数码管会显示0
SEG7_CA=0xC0
0x7f,就是
=,数据与上0x7f,就相当于数据不变,小数点输出的那一位会被置零,于是就显示出来了。
接着是数据的处理,例如一个小数3.14,我们可以计算了,可是怎样才能输出到数码管中?单片机在输出时只会对整数进行处理的。我采用了一个迂回的方法,就是将小数扩大,例如我打算显示两位小数,就把数据扩大倍,然后对十取余,将数据处理出来,在显示时,将倒数第三个数码管小数点点亮即可。
接下来看一下我编写的程序。
程序还是之前按键使用的程序,只是在程序中增加了一个小数的计算和显示。计算上,是这样的,(0+1)*0.9=0.9,(0.9+1)*0.9=1.71,(1.71+1)*0.9=2.,(2.+1)*0.9=3.,(3.+1)*0.9=3.,(3.+1)*0.9=4.,.......
为了便于显示,我只取了头两位小数,于是显示时,就是0.9,1.71,2.43,3.09,3.68,4.21
按键上设置了一个计算键,一个复位键。
仿真还是按键的硬件设备,仅仅是程序进行了改变。看下硬件。
首先上电,看下状态。
尽管位选在刷新,但是由于没有数据送出,所以数码管不显示任何信息。
尽管我缩小了刷新时间,可以依然闪烁的厉害,不清楚是我得程序哪里出了毛病,还是软件问题。先放着不管了。图上是00.,其实显示的是00.90。
结合着看,单击第二下就是显示的1.71
单击第三次,显示的是2.43。
好了就说这么多吧,要去照顾孩子了。有时间再分享了。
转载请注明地址:http://www.abmjc.com/zcmbhl/1746.html