51单片机重定向printf函数 打印数值不正确问题

串口一重定向printf函数

#include 
#include 
#include "usart.h"  //函数的声明文件

#define boud      9600
#define sys_clk   11059200
//UART1 初始化
void Uart1Init(void)	
{
	PCON &= 0x7F;		//波特率不倍速
	SCON 	= 0x50;		//8位数据,可变波特率
	AUXR |= 0x04;		//1T模式
	BRT = 256 - (int)(sys_clk/boud/32 + 0.5);		//设置独立波特率发生器重装值
	AUXR |=0X01;		//串口1选择独立发生器为波特率发生器
	AUXR |=0X10;		//启动独立波特率发生器
	ES = 1; 				//使能串口1中断
	
}

//UART1 发送串口数据
void UART1_SendData(char dat)
{
	ES=0;			//关串口中断
	SBUF=dat;			
	while(TI!=1);	//等待发送成功
	TI=0;			//清除发送中断标志
	ES=1;			//开串口中断
}

//UART1 发送字符串
void UART1_SendString(char *s)
{
	while(*s)//检测字符串结束符
	{
		UART1_SendData(*s++);//发送当前字符
	}
}

//重写putchar函数 重定向printf
char putchar(char c)
{
	UART1_SendData((unsigned char)c);
	return c;
}

关于打印数值问题需注意 打印8,16,32位数据不能像PC机或者是32位位单片机那样,直接使用 %d,占位符,具体使用格式如下

void main(void)
{
  unsigned char a = 10;
  char 	b = -15 ;
  unsigned short c = 20;
  short d = -25;
  unsigned int 	e = 65535;
  int f = -32765;

	 Uart1Init();
	while(1)
	{ 
		printf("a=%bu b=%bd c=%hu d=%hd e=%hu f=%hd \r\n",a,b,c,d,e,f);
			Delay(100);
		printf("\r\n size(a)=%bu,size(c)=%bu,size(e)=%bu \r\n"  ,sizeof(a),sizeof(c),sizeof(e));
	}
}

结果

a=10 b=-15 c=20 d=-25 e=65535 f=-32765 

 size(a)=1,size(c)=2,size(e)=2

关于占位符 8位 用bd/bu 16位用hd/hu 32用ld/lu
其中51单片机 所占字节数short=int=2个字节

你可能感兴趣的:(单片机)