最近在做一个项目,使用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了。