常用sprint函数来将数值转换为字符串。可在Keil C中使用这个函数时就要注意了。请看下面例程:
/*main.c
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 12/19/2021
*/
#include "main.h"
ui8 tem;
ui16 tem1;
float tem2;
void main()
{
STCIO_InitPortsBits(P0|P1|P2|P3|P4, 0xFF, BI_IO);
P3 = 0xFF;
P0 = 0xFF;
UartS1_Init(VBAUD_8BITS,G1,T2,9600);
STCIO_InitP3Bit(SCT_BIT1, PP_OUT);
SundBuzzerx10ms(50);
Delay10xms(50, FSCLK);
SundBuzzerx10ms(50);
tem = 123;
tem1 = 123;
tem2 = 123;
while(1)
{
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", tem);
UartS1_SendString(mstr);
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", tem1);
UartS1_SendString(mstr);
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", tem2);
UartS1_SendString(mstr);
Delay10xms(200, FSCLK);
}
}
//End of main()
//*********************************************
void SundBuzzerx10ms(ui8 x)
{
BUZZER = 0;
Delay10xms(x, FSCLK);
BUZZER = 1;
}
//End of SundBuzzerx10ms(ui8 x)
看下在串口助手上的输出结果:
显然只有在变量类型为ui16时,结果正确。也就是说只能正确解析16位数。再看下面例程:
/*main.c
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 12/19/2021
*/
#include "main.h"
ui8 tem;
ui16 tem1;
float tem2;
void main()
{
STCIO_InitPortsBits(P0|P1|P2|P3|P4, 0xFF, BI_IO);
P3 = 0xFF;
P0 = 0xFF;
UartS1_Init(VBAUD_8BITS,G1,T2,9600);
STCIO_InitP3Bit(SCT_BIT1, PP_OUT);
SundBuzzerx10ms(50);
Delay10xms(50, FSCLK);
SundBuzzerx10ms(50);
tem = 123;
tem1 = 123;
tem2 = 123;
while(1)
{
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", 123);
UartS1_SendString(mstr);
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", tem1);
UartS1_SendString(mstr);
/*
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", tem2);
UartS1_SendString(mstr);
*/
Delay10xms(200, FSCLK);
}
}
//End of main()
//*********************************************
void SundBuzzerx10ms(ui8 x)
{
BUZZER = 0;
Delay10xms(x, FSCLK);
BUZZER = 1;
}
//End of SundBuzzerx10ms(ui8 x)
再看下在串口助手上的输出结果:
显然直接输入数字也不能被正确解析。再看一个例程:
/*main.c
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 12/19/2021
*/
#include "main.h"
ui8 tem;
ui16 tem1;
float tem2;
void main()
{
STCIO_InitPortsBits(P0|P1|P2|P3|P4, 0xFF, BI_IO);
P3 = 0xFF;
P0 = 0xFF;
UartS1_Init(VBAUD_8BITS,G1,T2,9600);
STCIO_InitP3Bit(SCT_BIT1, PP_OUT);
SundBuzzerx10ms(50);
Delay10xms(50, FSCLK);
SundBuzzerx10ms(50);
tem = 123;
tem1 = 123;
tem2 = 123;
while(1)
{
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", 305);
UartS1_SendString(mstr);
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", tem1);
UartS1_SendString(mstr);
/*
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%d\r\n", tem2);
UartS1_SendString(mstr);
*/
Delay10xms(200, FSCLK);
}
}
//End of main()
//*********************************************
void SundBuzzerx10ms(ui8 x)
{
BUZZER = 0;
Delay10xms(x, FSCLK);
BUZZER = 1;
}
//End of SundBuzzerx10ms(ui8 x)
串口助手上的输出结果:
可以看出输入的305可以被正确解析。也就是说如果输入的是一个为声明类型的数值必须是个16位数据才能被解析。 再看下面例程:
/*main.c
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 12/19/2021
*/
#include "main.h"
ui8 tem;
ui16 tem1;
float tem2;
void main()
{
STCIO_InitPortsBits(P0|P1|P2|P3|P4, 0xFF, BI_IO);
P3 = 0xFF;
P0 = 0xFF;
UartS1_Init(VBAUD_8BITS,G1,T2,9600);
STCIO_InitP3Bit(SCT_BIT1, PP_OUT);
SundBuzzerx10ms(50);
Delay10xms(50, FSCLK);
SundBuzzerx10ms(50);
tem = 123;
tem1 = 123;
tem2 = 123;
while(1)
{
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%.2f\r\n", 305);
UartS1_SendString(mstr);
memset(mstr,0,strlen(mstr));
sprintf(mstr,"%.2f\r\n", tem2);
UartS1_SendString(mstr);
Delay10xms(200, FSCLK);
}
}
//End of main()
//*********************************************
void SundBuzzerx10ms(ui8 x)
{
BUZZER = 0;
Delay10xms(x, FSCLK);
BUZZER = 1;
}
//End of SundBuzzerx10ms(ui8 x)
串口助手上的输出结果:
直接输入数305,不能被正确解析。 由此可见Keil C中的sprintf用作将数值装换位字符串并不是很好用,有必要自己写一个库函数程序来完成这一工作。函数声明如下:
/***********************************************************************
Function: FloatString(f64 src, i8* desString, ui8 mplace);
Return value: void
Discription: covert decimal digit & decimal places of an float data to string
Example:
ui8 tem = 12345;
ui8 mstr[12] = {0};
FloatString(tem,mstr,2); //"12345.00"
***********************************************************************/
void FloatString(f64 src, i8* desString, ui8 mplace);
实现代码:
void FloatString(f64 src, i8* desString, ui8 mplace)
{
f64 ftem = fabs( src);
ui8 iplaces = 1;
ui8 i = 0;
if(ftem>= 10.0)
{
while(ftem>= 10.0)
{
iplaces++;
ftem /= 10;
}
}
if(src < 0)
{
desString[0] = '-';
i = 1;
iplaces++;
}
for(; i < iplaces + mplace + 1; i++)
{
if(i == iplaces)
{
if(mplace)
{
desString[i] = '.';
continue;
}
else
break;
}
else
{
desString[i] = (ui8)ftem;
ftem -= desString[i];
desString[i] += '0';
ftem *= 10;
}
}
}
//End of FloatString(f64 src, i8* desString, ui8 mplace)
使用示例:
头文件
/*main.h
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 12/19/2021
*/
#ifndef __MAIN_H_
#define __MAIN_H_
#include "mtype.h"
#include "delay.h"
#include "stcuart.h"
#include "stcio.h"
#include "myport.h"
const FSYSCLOCK FSCLK = F30MHz; //define system clock frequency 30MHz, FSYSCLOCK was defined in mtype.h
const ui32 FSCLK1 = 30000000L; //define system clock frequency 30MHz
ui16 code Vbg_ROM _at_ 0xf3f7; //band gap voltage stord at memory end address -8
i8 mstr[25] ="";
void SundBuzzerx10ms(ui8 x);
#endif
源文件:
/*main.c
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu on 12/19/2021
*/
#include "main.h"
ui8 tem;
ui16 tem1;
float tem2;
void main()
{
STCIO_InitPortsBits(P0|P1|P2|P3|P4, 0xFF, BI_IO);
P3 = 0xFF;
P0 = 0xFF;
UartS1_Init(VBAUD_8BITS,G1,T2,9600);
STCIO_InitP3Bit(SCT_BIT1, PP_OUT);
SundBuzzerx10ms(50);
Delay10xms(50, FSCLK);
SundBuzzerx10ms(50);
tem = 123;
tem1 = 123;
tem2 = -123.123;
while(1)
{
memset(mstr,0,strlen(mstr));
FloatString(tem, mstr, 0);
UartS1_SendString(mstr);
UartS1_SendString("\r\n");
memset(mstr,0,strlen(mstr));
FloatString(tem1, mstr, 1);
UartS1_SendString(mstr);
UartS1_SendString("\r\n");
memset(mstr,0,strlen(mstr));
FloatString(tem2, mstr, 3);
UartS1_SendString(mstr);
UartS1_SendString("\r\n");
Delay10xms(200, FSCLK);
}
}
//End of main()
//*********************************************
void SundBuzzerx10ms(ui8 x)
{
BUZZER = 0;
Delay10xms(x, FSCLK);
BUZZER = 1;
}
//End of SundBuzzerx10ms(ui8 x)
串口助手上的输出结果:
有了这个函数,要将数值输出为字符串显示就很方便了。
|
|