C51单片机串口printf重定向实现

uart.c文件

#include "uart.h"

void UartInit(void)		//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率。使能接收
      
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
    
	TL1 = 0xF4;		//设定定时初值
	TH1 = 0xF4;		//设定定时器重装值
    
	ET1 = 0;		//禁止定时器1中断
    
	TR1 = 1;		//启动定时器1
    
    //配置串口中断
    EA=1;
    ES=1;
}

void UartSendByte(unsigned char byte)
{
    SBUF=byte;
    //检测是否发送完成(标志位)
    while(TI==0);//发送完成会置1
    TI=0;//需要手动软件复位

}

void UartSendString(unsigned char *string){
    while(*string!='\0') //指针的数据没到最后一位一直执行循环体
    {    
        UartSendByte(*string++); //发送指针指向的数据(字节byte)。指针自增,指向下一个数据
	}
}

/*重写printf调用的putchar函数,重定向到串口输出*/
char putchar(char c){
	//输出重定向到串口
	UartSendByte(c);
	return c;  //返回给函数的调用者printf
}

uart.h 

#ifndef __UART_H__
#define __UART_H__

#include <REGX52.H>

void UartInit(void);		//4800bps@11.0592MHz
void UartSendByte(unsigned char byte);
void UartSendString(unsigned char *string);

#endif

main.c文件

#include <REGX52.H>
#include <stdio.h>
//自定义的源文件
#include "uart.h"

void main()
{   
    /* 串口初始化 */
    UartInit();
    
    while(1)
    {
        /* 利用keil内置的宏来获取编译时的日期和时间,这两个宏是字符串形式,可以直接打印 */
        printf("Line:%s\r\n",__LINE__); //行号
        printf("File:%s\r\n",__FILE__); //文件名
        printf("Complie Data:%s\r\n",__DATE__); //日期
        printf("Complie Time:%s\r\n", __TIME__); //时间
    }
}

结果:显示打印信息(STC-ISP)

作者:LiMinyu_IoT

物联沃分享整理
物联沃-IOTWORD物联网 » C51单片机串口printf重定向实现

发表回复