因为是这样的,在Keil\C51\LIB目录下有个putchar.c文件,printf函数会调用该文件中的putchar函数,putchar里面的使用的寄存器都是标准51的(如TI,SBUF),它们的地址是固定的,由此可知printf函数只针对串口0。
如果想让printf函数支持串口1或串口2。。。那么修改putchar函数的寄存器即可,比如SBUF改为SBUF1。但是用printf函数对串口0,串口1。。。都适用呢!
这就需要在自己的C文件中重定义putchar函数,如下。
//UART1 初始化
void Uart1Init(void) //115200bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //1T模式
BRT = 0xFD; //设置独立波特率发生器重装值
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函数
char putchar(char c)
{
UART1_SendData(c);
return c;
}
void main(void)
{
Uart1Init();
UART1_SendString("Hello World!\r\n");
printf("printf Test!\r\n");
printf("Complie Time:%s\r\n", __TIME__);
while(1)
{
}
}
————————————————
版权声明:本文为CSDN博主「阏男秀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yannanxiu/article/details/52438351