全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 控制/MCU >

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

时间:2024-12-03 10:46

人气:

作者:admin

标签: 函数  51单片机  Printf 

导读:51单片机中为什么很少出现 printf 的身影?是用不了吗? 不是的,51单片机可以用 printf,只是不建议使用。 平时我们在操作系统上写C语言代码,使用 printf 可以把数据写到标准输出流:...

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

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

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

#include 


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


    return 0;
}

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

8f6d5bbe-afbb-11ef-93f3-92fbcf53809c.png

但是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 实现起来比较复杂,要考虑到多种输出格式,还要额外开辟存储空间。

8f79c53e-afbb-11ef-93f3-92fbcf53809c.png

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 要好用。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信