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可打印。

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

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

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

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
51单片机实现printf调试代码需要借助串口通信,具体步骤如下: 1. 首先需要初始化串口,设置波特率、数据位、停止位、校验位等参数。 2. 编写printf函数,将要输出的内容通过串口发送出去。可以使用UART发送数据的函数,例如P0 = data;(将数据写入P0口)。 3. 在需要调试的地方使用printf函数输出需要调试的信息。 4. 将芯片连接到电脑上,打开串口调试助手或者使用命令行工具,设置对应的串口参数。 5. 在调试助手或者命令行工具上,查看串口输出的信息,以判断程序执行情况。 下面是一个简单的示例代码: ``` #include <reg52.h> //头文件,需要根据实际情况修改 void UART_Init() //串口初始化函数 { TMOD = 0x20; //设置计数器1为8位自动重载模式 TH1 = 0xfd; //设置波特率为9600bps SCON = 0x50; //设置串口为模式1(8位数据位,无校验位,1位停止位) TR1 = 1; //启动计数器1 } void UART_Send_Char(unsigned char x) //发送一个字符 { SBUF = x; while(TI == 0); //等待发送完成 TI = 0; //清除发送标志位 } void printf(char *str) //输出字符串 { while(*str != '\0') { UART_Send_Char(*str); str++; } } void main() { UART_Init(); //串口初始化 printf("Hello, world!"); //输出字符串 while(1); //程序循环 } ``` 注意,使用printf函数需要占用一定的程序空间和系统资源,如果程序过于复杂,建议使用专业的调试工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良辰353

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值