打印
[51单片机]

串口发送float 与浮点计算的问题求助!!

[复制链接]
1366|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuangyu13|  楼主 | 2015-9-12 17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神, 我的程序如下,不知道哪里出了问题,发送的R值一直是3F 80  00 00左右,对应的十进制数就是1,当把u1,u2换为常量的时候,运行的结果就是对的,调试AD已经成功,但就是结果不对,求帮助!!!!!!!!!!!!!!!!!!!!!!!

//主函数

void main()
{       
   while(1)
{  
   uchar t1=0;
   uchar t2=0;


//  uint i;
    uchar j=0;
        uint k=0;

//        uint u1=0x2FFF;
//        uint u2=0x0456;

        uint uH1=0;
        uint uL1=0;
        uint uH2=0;
        uint uL2=0;


        uint u1=0;
        uint u2=0;       

        float au1=0;
        float bu1=0;
        float au2=0;
        float bu2=0;

        float R=0;
//        float X;

        /*共用体*/

  union  
{

uchar a[4];
float b;

}temp;


   timeT0();                 //定时器初始化

  // initUART();
   EA=1;
   while(!T0标志寄存器);
   T0标志寄存器=0;

   counter=0;

   watchdog();                   //喂狗


        ADDR1=0x1000;                //片外地址指针
    ADDR2=0x3000;

    max125_cs0 = 0x00;              //片选片外62256
        max125_cs1 = 0x00;
    max125_cs2 = 0x00;


for(k=0;k<301;k++)
{
    t1=DATA1;                           //读片外62256 电压信号 高位
        uH1=(uint)t1;
        uH1=uH1<<8;                          
        ADDR1++;                           //地址指针+1
        t1=DATA1;
        uL1=(uint)t1;                   //读片外62256 电压信号 低位
        u1=uH1|uL1;                           //组合高位与低位
        ADDR1++;

        au1=au1+u1*cos[k];
        bu1=bu1+u1*sin[k];

        watchdog();                   //喂狗

        t2=DATA2;                           //读片外62256 电流信号 高位
        uH2=(uint)t2;
        uH2=uH2<<8;                          
        ADDR2++;                           //地址指针+1
        t2=DATA2;
        uL2=(uint)t2;                   //读片外62256 电流信号 低位
        u2=uH2|uL2;                           //组合高位与低位
        ADDR2++;

        au2=au2+u2*cos[k];
        bu2=bu2+u2*sin[k];
}

   ADDR1=0x1000;
   ADDR2=0x3000;


   R=(au1*au2+bu1*bu2)/(au2*au2+bu2*bu2);

// X=(au1*bu2-au2*bu1)/(au2*au2+bu2*bu2);

   initUART();                         //串口初始化

temp.b=R;
array[0]=temp.a[0];
array[1]=temp.a[1];
array[2]=temp.a[2];
array[3]=temp.a[3];

   watchdog();                   //喂狗


        Delayms(10);                 //AA
        RS485=1;
        Delayms(10);
        SBUF=0xAA;
        while(!TI);
        TI=0;

        Delayms(10);                 //         R
        RS485=1;
        Delayms(10);
        for(j=0;j<4;j++)
        {
        SBUF=array[j];
    Delayms(5);
        }
        while(!TI);
        TI=0;

         Delayms(10);                 //ADL
     RS485=1;
         Delayms(10);
         SBUF=0xBB;
         while(!TI);
         TI=0;
                                                         
  }

}

相关帖子

沙发
无量寿经| | 2015-9-12 20:43 | 只看该作者
太长的程序,应使用单步仿真调试方式查找错误位置,如果不会仿真的话,可参考《51单片机轻松入门—基于STC15W4K系列》,里面对软件仿真与硬件仿真都有详细介绍,而且不需要购买仿真器,直接使用单片机进行硬件单步调试。 51单片机轻松入门—基于STC15W4K系列.pdf (2.56 MB)

使用特权

评论回复
板凳
zhuangyu13|  楼主 | 2015-9-15 17:26 | 只看该作者
无量寿经 发表于 2015-9-12 20:43
太长的程序,应使用单步仿真调试方式查找错误位置,如果不会仿真的话,可参考《51单片机轻松入门—基于STC1 ...

当我把U1,U2改定值的话,运行的结果就是对的,当是变量的时候 就是错的,可是之前调AD的时候,AD采集出来的数据也是对的,现在找不到错误在哪里了

使用特权

评论回复
地板
ningling_21| | 2015-9-15 18:24 | 只看该作者
zhuangyu13 发表于 2015-9-15 17:26
当我把U1,U2改定值的话,运行的结果就是对的,当是变量的时候 就是错的,可是之前调AD的时候,AD采集出 ...

可以用软件模拟运行一下程序一般可以发现问题所在

使用特权

评论回复
5
ningling_21| | 2015-9-15 18:24 | 只看该作者
zhuangyu13 发表于 2015-9-15 17:26
当我把U1,U2改定值的话,运行的结果就是对的,当是变量的时候 就是错的,可是之前调AD的时候,AD采集出 ...

可以用软件模拟运行一下程序一般可以发现问题所在

使用特权

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

本版积分规则

4

主题

8

帖子

0

粉丝