51单片机也能用printf()函数进行调试

不知道各位刚入门51单片机的朋友们是不是和我一样,不清楚在工程中定义的变量值的变化是否和自己想的一致,刚学C语言的时候我们都能利用printf函数检查代码的运行情况,今天,我来介绍C51单片机如何使用printf函数,从而实现调试。

思路:将打印结果显示在串口助手上。

main函数代码如下:

#include <REGX51.H>
#include <delay.h>
#include <stdio.h>

void Uart_SendChar(unsigned char  dat)
{
    SBUF = dat; 
    while(!TI); 
    TI = 0; 
}

char putchar(char c)//重定向
{
    Uart_SendChar(c);
    return c;
}

void UART_init()    //设置串行通信 本晶振为11.0592MHZ,其他的就自己算一下应该设置多少
{
      TMOD = 0x20;
      TH1 = 0xfd;
      TL1 = 0xfd;  //波特率9600
      SM0 = 0;  
      SM1 = 1;   // 串口工作方式1 10位异步
      REN = 1;  //串口允许接收
      TR1 = 1;
      EA = 1;
      ES =1 ;  //串口中断
}
void main()
{
    UART_init();
    while(1)
    {
        printf("hello world");
        Delay(2000);
    }
}

代码解析:

串口初始化,实现单片机与PC端的通信。

void UART_init()    //设置串行通信 本晶振为11.0592MHZ
{
      TMOD = 0x20;
      TH1 = 0xfd;
      TL1 = 0xfd;  //波特率9600
      SM0 = 0;  
      SM1 = 1;   // 串口工作方式1 10位异步
      REN = 1;  //串口允许接收
      TR1 = 1;
      EA = 1;
      ES =1 ;  //串口中断
}

头文件<stdio.h>用于使用printf()函数。

头文件<delay.h>进行延时,代码可在生成器中自主生成,如下图:

在C语言中putchar函数只能输出单个字符,而printf函数可输出多个字符以及各种类型的数据;printf()函数在格式化输出的时候调用了putchar()函数,在头文件stdio.h中两个函数都有,我们需修改putchar函数,用SBUF接收输入的数据,则可传到PC端。以下两函数实现:

void Uart_SendChar(unsigned char  dat)
{
    SBUF = dat; 
    while(!TI); 
    TI = 0; 
}

char putchar(char c)//重定向
{
    Uart_SendChar(c);
    return c;
}

结果:

存在的疑问:

我想比如发送int m=15;printf("%d",m);此时m为整型,难道格式化输出的时候也用到putchar函数了吗?类型不一样也可以吗?经过实验,数据15可打印。

如果有朋友知道,非常期待您的解答。

掌握了此方法后,我们只需要利用一个串口调试器就可以打印数据,进而调试代码了。

文章如有不对的地方,期待您的指正。

猜你喜欢

转载自blog.csdn.net/qq_62262788/article/details/128544555