关于STC15单片机加减法出现错误的原因分析

        最近在做一个项目,使用STC15单片机自带的ADC获取数据时候,发现在获取数据进行加减法运算之后,单片机的加减法出现结果错误的情况。

        在不断的调试之后,我发现问题出现在sprintf函数上,简单说就是单片机ADC采集和sprintf发生了冲突,导致单片机内部算法出现错误。

错误

void main()
{
  Uart1_Init();
  ADC_Init();
  Timer0_Init();
  Uart1_SendString("hello world\r\n");
  while(1)
  {
    if(revADC_flag)
    {
      rev_Vol_MAX=revAC_MAX*5/1024.0;
      rev_Vol_Min=revAC_Min*5/1024.0;
      rev_Vol_error=rev_Vol_MAX - rev_Vol_Min;
      revAC_MAX=0;
      revAC_Min=1024; 
      
      sprintf(str,"Max=%5.3f - Min=%5.3f - Error=%0.3f\n",\
                    rev_Vol_MAX,rev_Vol_Min,(float)(1.0+1.0));
      Uart1_SendString(str);
      revADC_flag=0;      
    }
  }
}

这是我部分的一个代码,出现的效果为下图

非常的不可思议,1+1的值出现了错误。

修正

接下来,我对代码进行了修改

首先,先对单片机的printf函数进行重定义,重定义的办法只需要加入一个代码即可,代码如下:

char putchar(char ch)
{
  SBUF=ch;
  while(!TI);
  TI=0;
  return ch;
}

其次,我们可以使用printf作为串口打印函数了,下面是修正之后的代码,使用printf代替sprintf+Uart1-SendString作为字符串输出。

void main()
{
  Uart1_Init();
  ADC_Init();
  Timer0_Init();
  printf("hello world\r\n");
  while(1)
  {
    if(revADC_flag)
    {
      rev_Vol_MAX=revAC_MAX*5/1024.0;
      rev_Vol_Min=revAC_Min*5/1024.0;
      rev_Vol_error=rev_Vol_MAX - rev_Vol_Min;
      revAC_MAX=0;
      revAC_Min=1024; 
      
      printf("Max=%5.3f - Min=%5.3f - Error=%0.3f\n",\
                rev_Vol_MAX,rev_Vol_Min,(float)(1.0+1.0));
      revADC_flag=0;      
    }
  }
}

修正之后的串口打印效果,此时我们的1+1终于等于2了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值