使用printf:
把以下代码,放到uart.h中,左右就是把printf中的putchar重定向到输出串口中。
void uart_putchar(u8 i)
{
ES = 0;
TI = 0; //清空发送完中断请求标志位
SBUF = i; //将数据放入寄存器发送
while(TI == 0);//等待发送完毕,发送完毕 TI == 1
TI = 0; //清空发送完中断请求标志位
ES = 1;
}
//重定向
u8 putchar(u8 c)
{
uart_putchar(c);
return c;
}
printf中的格式问题:
51单片机与标准C有区别,c语言中char、short、int都能用%d,在c51中有他自己的一套标准。
KEIL里扩展出了b,h,l来对输入字节宽的设置:
(1)b:八位
(2)h:十六位
(3)l:三十二位
unsigned char 、short、int 的字节数:
printf("char:%bu\r\n",sizeof(u8));
printf("short:%bu\r\n",sizeof(short));
printf("int:%bu\r\n",sizeof(int));
封装仿真时printf不能打印浮点数:
/*
*解决无法打印浮点数
*要打印的浮点数 保留的位数 存到res数组中
*/
void sprintf_float(float value,u8 num,u8 *res)
{
u8 buf[20]={0};
int tmp,tmp1;
u8 i = 0, index = 0;
u16 t = 10;
tmp = (int)value;
sprintf(buf, "%d.", tmp);
while(buf[i])
{
index++;
i++;
}
for (i = 0, t = 10; i < num; i++,t*=10)
{
tmp1=(int)((value-tmp)*t)%10;
sprintf(buf + index, "%d", tmp1);
index++;
}
buf[index] = 0;
if(res!=NULL&&index<=20)
{
memcpy(res, buf, index);
}
}