0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

学益得智能硬件 来源:学益得智能硬件 2024-12-03 10:46 次阅读

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

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

    关注

    274

    文章

    5700

    浏览量

    123404
  • 函数
    +关注

    关注

    3

    文章

    4323

    浏览量

    62516
  • Printf
    +关注

    关注

    0

    文章

    82

    浏览量

    13637

原文标题:51单片机为什么不用printf

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【经验分享】单片机如何实现printf输出log?

    你在真实的项目工程开发,有考虑过在类似C51单片机实现printf输出log吗?本文给出一种参考实现
    的头像 发表于 12-08 08:42 3220次阅读

    STC51单片机printf函数的用法和注意事项详细说明

    今天用STC51系列的单片机写程序遇到一个问题,就是Printf函数的用法,并在这个上面颇费周折,才弄清楚用法和注意事项!
    发表于 04-17 17:27 5次下载
    STC<b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>printf</b>函数的用法和注意事项详细说明

    51单片机C51语言的scanf和printf是如何使用的详细程序说明

    本文档的主要内容详细介绍的是51单片机C语言的scanf和printf是如何使用的详细程序说明。
    发表于 08-26 17:30 24次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>C<b class='flag-5'>51</b>语言的scanf和<b class='flag-5'>printf</b>是如何使用的详细程序说明

    51单片机串口通讯需要注意的寄存器及51单片机使用PRINTF的示例程序

    本文档的主要内容详细介绍的是51单片机进行串口通讯需要注意的寄存器及51单片机使用PRINTF的示例程序的详细资料概述。
    发表于 08-14 17:32 2次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>串口通讯需要注意的寄存器及<b class='flag-5'>51</b><b class='flag-5'>单片机</b>使用<b class='flag-5'>PRINTF</b>的示例程序

    如何在Keil中使用51单片机进行printf串口输出

    最近有同学在51单片机的学习过程困扰如何使用单片机串口在上位串口助手上输出显示的问题,其实很多开发环境都支持使用C语言里面最常用的
    发表于 08-13 17:32 14次下载
    如何在Keil中使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b>进行<b class='flag-5'>printf</b>串口输出

    如何使用单片机系统重写printf函数

    本文档的主要内容详细介绍的是如何使用单片机系统重写printf函数。
    发表于 07-23 17:37 1次下载
    如何使用<b class='flag-5'>单片机</b>系统重写<b class='flag-5'>printf</b>函数

    单片机printf的移植过程资料免费下载

    大都是51单片机的,说的是在51单片机编译软件库中有自带printf函数,也有自己实现一个自己的prin
    发表于 07-19 17:37 2次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>printf</b>的移植过程资料免费下载

    什么是51单片机?又该如何自学51单片机

    51 单片机是目前使用最多的单片机之一,那么什么是 51 单片机呢?作为新手,又该如何自学 51
    的头像 发表于 11-03 21:14 7072次阅读

    51单片机是什么?应该如何学习51单片机

    51 单片机是目前使用最多的单片机之一,那么什么是 51 单片机呢?作为新手,又该如何自学 51
    发表于 12-23 07:57 73次下载

    51单片机(一)—— 51单片机简介

    一、51单片机标识信息 通常我们所说的51单片机是指以51内核扩展出的单片机。生产
    发表于 11-11 18:06 245次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>(一)—— <b class='flag-5'>51</b><b class='flag-5'>单片机</b>简介

    51单片机(3)-------单片机的种类

    格低性能;PIC单片机,性能稳定常用于工业应用;AVR单片机(如AT89C51),过气了(早年渠道出现问题,缺货,公司弃用);ARM Cortex-M系列
    发表于 11-15 12:06 21次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>(3)-------<b class='flag-5'>单片机</b>的种类

    单片机printf函数的重映射

    单片机printf函数的重映射一、源自于:大侠有话说1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功
    发表于 11-15 20:51 11次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>中</b><b class='flag-5'>printf</b>函数的重映射

    51单片机串口通信调试printf函数重定向输出打印

    51单片机串口通信以及printf调试串行通信1.串口初始化串口工作方式波特率设置通过软件直接生成串口初始化代码2.输出到串口3.发送字符串到串口4.printf重定向到串口5.补充
    发表于 11-20 16:36 16次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>串口通信调试<b class='flag-5'>printf</b>函数重定向输出打印

    C51/C52单片机printf打印出来的值是原来值的256倍

    开发环境(蓝色粗体字为特别注意内容)1,开发板:89C52RC。2,开发环境:Keil uv5在51单片机的KEIL程序,使用printf("Voltage0:%d\r\n"
    发表于 11-23 17:21 8次下载
    C<b class='flag-5'>51</b>/C52<b class='flag-5'>单片机</b><b class='flag-5'>printf</b>打印出来的值是原来值的256倍

    stm32单片机串口使用printf及u3_printf

    无论是在51单片机还是在stm32,默认printf串口都是串口一。使用printf的时候头文件为&amp;quot;stdio.h&amp;quot;,但是一些
    发表于 12-27 19:24 1次下载
    stm32<b class='flag-5'>单片机</b>串口使用<b class='flag-5'>printf</b>及u3_<b class='flag-5'>printf</b>