51单片机中为什么很少出现printf的身影

描述

51单片机中为什么很少出现 printf 的身影?是用不了吗?

不是的,51单片机可以用 printf,只是不建议使用。

平时我们在操作系统上写C语言代码,使用 printf 可以把数据写到标准输出流:

#include 


int main()
{
    printf("helloworld
");


    return 0;
}

 

 

然后在屏幕上就能看到它的输出。

51单片机

但是51单片机属于裸机开发,没有所谓的标准输出流,他能跟外部交互的,只有串口。

51单片机用的开发语言是C语言,虽然跟标准C有点区别,但是 printf 函数还是可以用的,只要修改 printf 的输出方式,让他从串口输出,也能在电脑上看到输出信息。

printf 函数把数据格式化后,最终调用 putchar 函数把数据写出,所以我们要做的,就是实现 putchar 函数。

int putchar(char c) {
    SBUF = ch;     // 将数据发送到SBUF寄存器
    while (!TI);   // 等待发送完成
    TI = 0;        // 清除发送中断标志
    
    return c;
}

这些操作都跟串口相关,不去详细介绍。

使用的时候,包含 stdio.h 头文件,语法跟我们以前使用的一样。

那为什么不建议在 51 单片机中使用 printf,有这么几个原因。

首先 printf 实现起来比较复杂,要考虑到多种输出格式,还要额外开辟存储空间。

51单片机

51单片机资源和性能都有限,使用 printf 开销比较大。

其次,51 编译器对 printf 的处理,跟我们经常使用的也有差距。

比如定义一个 char 类型的变量,初始化成 0x01,使用 %u 输出,虽然类型不一样,应该不影响它输出 1。

void main()
{
    unsigned char num1 = 0x01;
    
    printf("%u", num1);
}

 

实际上结果是 256,一个字节的 char 类型,转换成两个字节的 int,前面补0,由于 51 是大端存储,输出的时候反了。

 

 

void main()
{
    unsigned char num1 = 0x01;
    unsigned char num2 = 0x02;
    
    printf("%u %u", num1, num2);
}

 

 

再比如两个 char 类型,一个 0x01 一个 0x02,同时输出的话,第二个变量变成了 0。编译器对参数入栈的处理也不太一样。

基于种种原因,在 51 中很少用 printf,调试的话,可以借助开发工具,也可以使用一些日志相关的库,都比 printf 要好用。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分