Keil C51 中使用Printf()进行串口输出。

       如何使用printf在串口显示信息,有两种办法,因为在keil C51中 printf函数是调用putchar进行数据传送的,而putchar应该是先判断TI是否为1,不为1则等待为1。 如果为1则清0,然后送出一个字符。因此如果你直接使用printf函数,你的程序就会在putchar函数中等待TI为1。这时你的程序就相当于直接死掉了。你可以通过改写putchar函数实现自己的目的。TI相当于是初始化不给赋初值就不干活。

       所以第一种办法就是在初始化的时候,给TI赋值为1,比如

void uart_init()


{
    
    PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xDC;		//设定定时初值
	TH1 = 0xDC; 
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1    
    TI=1;           //发送中断标志位置1

}

     但是有时候像在用到UART中断的时候,这个串行传输数据发送中断标志位TI是不能长置为1的,这时候我们就需要对putchar函数进行重新编写就可以对printf函数输出重定向,然后就可以使用printf显示了。具体可以参照C:Keil/C51/LIB/PUTCHAR.C,下面是一个例子:

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


 

猜你喜欢

转载自blog.csdn.net/qq_38475134/article/details/83650885