51单片机Keil C51下使用printf输出到串口,为何初始化了串口之后就可以使用了?

使用的51单片机是C8051F340,编译环境是Keil uVision4
仅仅在对串口进行初始化后,发现就可以使用printf函数直接将内容输出到串口了,这是为什么呢?

串口初始化代码如下:
void UART0_Create(void)
{
P0MDOUT |= (1 << 4);//P0.4为串口输出脚,设该管脚为输出
XBR0 |= (1 << 0);//UART0连到P0.4(TX0) P0.5(RX0)引脚
XBR1 |= (1 << 6); //使能交叉开关

SCON0 = 0x10; // SCON0: 波特率可设置的8位串口
// 忽略停止位逻辑电平
// 接收使能
// 第九位是0位
// 清除发送和接收中断标志

CKCON |= (1 << 3);//定时器1使用系统时钟
TH1 = (256-UART0_PCLK/2/UART0_BAUDRATE);
TL1 = TH1;
TMOD &= ~0xf0;//TMOD: 定时器1工作为8位自动重装载模式
TMOD |= 0x20;
TR1 = 1;//开启定时器1
TI0 = 1;//Indicate TX0 ready
}

main函数如下:

#include <stdio.h>

void main(void)
{
UART0_Create();
printf("Hello World!\n");

}

请问printf是如何自动找到单片机的串口,并将内容输出的?

因为是这样的,在Keil\C51\LIB目录下有个putchar.c文件,printf函数会调用该文件中的
putchar函数,putchar里面的使用的寄存器都是标准51的(如TI,SBUF),它
们的地址是固定的,由此可知printf函数只针对串口0。

如果想让printf函数支持串口1或串口2。。。那么修改putchar函数的寄存器即可,比如SBUF改为SBUF1。但是能不能用printf函数对串口0,串口1。。。都适用呢

或者重定义putchar函数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-13
加了串口初始化程序后的printf函数能用的真正关键在于TI0先拉高了(TI0=1),因为第一次运行到printf函数的时候,如果前面没有TI0=1,那么程序指针PC就一直在这条语句上判断,也就死在这里等待。所以要使用printf,开头必须要先置TI0(传统51为TI)为1。
详见
http://wenku.baidu.com/link?url=av9rridiaYoRfjr-Wty7ynDQw2tQ8qsv4kUQDQW_vZavfxFg7cp5eFehO80pnwsj8pvRSnWaQFWajG2vpa8HKVY8vVeWbmaAeUmtaj8ONsm
望采纳!
第2个回答  推荐于2018-03-08
单片机C对标准C进行了一些扩充、删减和更改优化,因为keil里的单片机c
把printf函数重定义到串口了,这是单片机C与标准C的差别之一。本回答被提问者和网友采纳
第3个回答  2014-07-13
他有默认的串口吧,刚好你的这一串口可用,所以就输出了。一般都要在设备管理器中找到可用串口然后对应设置的。
相似回答