如何使用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/,下面是一个例子:
char putchar (char c) {
while (!TI);
TI = 0;
return (SBUF = c);
}