lkl0305

keil C51使用printf函数

0
阅读(5563)

在使用单片机开发过程中,很多情况下都希望能够通过串口输出一些调试信息。提及串口输出各种格式数据的方法,无非2种:一是自己完全编程串口函数,进行格式化各种可能要使用的数据;另一种比较简单的方法是使用库中的printf函数,这种方法虽然比较占用资源,但在很多情况下比较简单实用。

在使用printf函数之前需要注意亮点,一是调用头文件stdio.h,二是重定义putchar发送单个字符函数。这一点和MDK中开发AMR处理器不太一样,后者重定义的函数名fputc。

写个测试程序,不断通过串口发送一个字符串:

#include <STC15F2K60S2.H>
#include "stdio.h"
#include "intrins.h"

void Delay1000ms(void);
void UartInit(void);

void main(void)
{
    UartInit();
    for(;;)
    {
        printf("Hello, STC!\r\n");
        Delay1000ms();
    }
}

void UartInit(void)        //9600bps@11.0592MHz
{
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x01;        //串口1选择定时器2为波特率发生器
    AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
    T2L = 0xE0;        //设定定时初值
    T2H = 0xFE;        //设定定时初值
    AUXR |= 0x10;        //启动定时器2
}

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

void Delay1000ms(void)        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    _nop_();
    i = 43;
    j = 6;
    k = 203;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

效果如下,可以看到实现预期功能:

QQ截图20170316203853.png