打印

请教电脑圈圈:C51计算浮点数,这样的方法可行吗?

[复制链接]
2440|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzhenggen|  楼主 | 2007-5-14 12:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一个读数子程程序,在12232LCD上能按我的所设显示出来。
但不知用在整个项目里面是否可靠?C51这样计算浮点数小数点正确吗?
我要显示是功率,在采集数据时可能会有W,mW,uW,nW等这样的数值出来。
我是按这样的思路写了一个这样的子程序,请电脑圈圈帮我指点一下。
#define AD_Loop_PickVol_PER  0.0024414
unsigned char idata serial_buff[77];
unsigned char code num[][16]={数字};
unsigned char code ELAPHT[][16]={英文};
unsigned char code welcome_1[]={中文};
void display(uint v) 
{
    unsigned char  row, count;
    float tt;
    unsigned long int tmp ;
    long int value;
    tt=v*AD_Loop_PickVol_PER;
    value = tt * 100000000 + (value > 0 ? 0.5 : -0.5);
    //tmp = abs(value);
    tmp = value;
    serial_buff[0] = tmp / 1000000000;
    serial_buff[1] = tmp % 1000000000 /100000000;
    serial_buff[2] = tmp % 100000000 /10000000;
    serial_buff[3] = tmp % 10000000 /1000000;
    serial_buff[4] = tmp % 1000000 /100000;
    serial_buff[5] = tmp % 100000 /10000;
    serial_buff[6] = tmp % 10000 /1000;
    serial_buff[7] = tmp % 1000 /100;
    serial_buff[8] = tmp % 100/10;
    serial_buff[9] = tmp % 10;
    
    draw_bmp(0,1,8,ELAPHT[12]);//显示“Pi”
   
    if(value< 0)
    {
        draw_bmp(8,1,8,num[14]);//显示“-”
    }
    else
    {
        draw_bmp(8,1,8,num[13]);//显示“+”
    }
    
    for(count = 0; count != 10; count++)
    {
        draw_bmp(8+row*8,1,8,num[serial_buff][count]]);//显示读数
        row++;
        if((count == 1))//定位小数位
        {
            draw_bmp(8+row*8,1,8,num[10]);//显示小数点
            row++;
        }
        
    }
 
 if((serial_buff[0]==0)&&(serial_buff[1]==0))
 {
  for(row=0;row !=3;row++)
    {
      draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
    }

  if((serial_buff[2] ==0)&&(serial_buff[3] ==0)&&(serial_buff[4] ==0))
  {
    for(row=3;row !=6;row++)
      {
        draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
      }
    if((serial_buff[5] ==0)&&(serial_buff[6] ==0)&&(serial_buff[7] ==0))
    {
      for(row=6;row !=9;row++)
      {
        draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
      }
      if(serial_buff[8]==0)
        {
          draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
          if(serial_buff[9]==0)
          {
            row++;
            draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
          }
        }
        draw_bmp(104,1,8,ELAPHT[8]);//显示“n”
        draw_bmp(112,1,8,ELAPHT[11]);//显示“W”
       }
      
       else
       {
        if(serial_buff[5]==0)
        {
          row=6;
          draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
          if(serial_buff[6]==0)
          {
            row++;
            draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
          }
        }
       for(row=0;row<6;row++)
       {
         draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
       } 
       for(row=9;row<11;row++)
       {
         draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
       } 
       draw_bmp(104,1,8,ELAPHT[9]);//显示“u”
       draw_bmp(112,1,8,ELAPHT[11]);//显示“W”
       }
      }
       else 
       {
        if(serial_buff[2]==0)
        {
          row=3;
          draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
          if(serial_buff[3]==0)
          {
            row++;
            draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
          }
        }
        for(row=0;row<3;row++)
       {
         draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
       } 
       for(row=6;row<11;row++)
       {
         draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
       } 
       draw_bmp(104,1,8,ELAPHT[10]);//显示“m”
       draw_bmp(112,1,8,ELAPHT[11]);//显示“W”
      }
    }
     else 
     {  
      if(serial_buff[0]==0) 
      {
            row=0;
            draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
      }
      for(row=7;row<11;row++)
       {
         draw_bmp(8+row*8,1,8,num[12]);//消隐设置“空格”
       } 
       
       draw_bmp(112,1,8,ELAPHT[11]);//显示“W”
   }
}  


相关帖子

沙发
computer00| | 2007-5-14 13:31 | 只看该作者

你可以自己仿真一下看看结果对不对嘛

取余的时候,对于负数,可能不同的编译系统会不一样.

试试这个:

tmp = value;
if(tmp<0)tem*=-1;

for(i=0;i<10;i++)
{
 if(tem!=0)
  {
   serial_buff[9-i]=tem%10;
   tem/=10;
  }
 else
  {
   serial_buff[9-i]=0;
  }
}


使用特权

评论回复
板凳
绿阴深处| | 2007-5-14 18:27 | 只看该作者

直接用sprintf函数

#include "stdio.h
"
char buf[40]; // 保存浮点数转化为成的字符串,大小自己定义,不要太小

sprintf(buf, "%f", tt)
然后直接显示字符串buf就可以了
还可以在格式化字符串中定义转换后的小数位数等
缺点是程序代码会大不少

使用特权

评论回复
地板
mohanwei| | 2007-5-14 19:05 | 只看该作者

同意楼上。其实sprintf和printf一起用也才1.1k

左右。以后再用多少次都差不多……

使用特权

评论回复
5
王紫豪| | 2007-5-15 00:45 | 只看该作者

支持3,4楼的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

529

帖子

1

粉丝