您的位置 首页 > 去旅游

《51单片机编程技巧:Keil C51环境下printf函数深入解析》

type字段是一个字符,用于指定参数是被解释为字符、字符串、数字还是指针,如下表所示。

注:

可选字符l或l可以紧跟在类型字符之前,分别指定d、i、u、o、x和x的长类型。

可选字符b或b可以紧跟在类型字符之前,以分别指定d、i、u、o、x和x的字符类型。

跟在百分号后面的字符如果不能被识别为格式规范,则被视为普通字符。例如,“%%”将单个百分号写入输出流。

flags字段是一个字符,用于对齐输出,打印+/-符号和空格、小数点、八进制和十六进制前缀,如下表所示。

width 字段是一个非负数,指定打印的最小字符数。如果输出值中的字符数小于宽度,则在左侧(默认情况下)或右侧(指定-标志时)添加空格以填充到最小宽度。如果宽度前缀为“0”,则填充零而不是空格。宽度字段从不截断输出。如果输出值的长度超过指定的宽度,则输出所有字符。

width 字段可以是星号(“*”),在这种情况下,参数列表中的int参数提供宽度值。在星号前面指定一个“b”表示参数是无符号字符。

精度字段是一个非负数,指定要打印的字符数、有效位数或小数位数。对于下表中指定的浮点数,精度字段可能导致输出值的截断或舍入。

precision 字段可以是星号(“*”),在这种情况下,参数列表中的int参数提供值。在星号前面指定一个“b”表示参数是无符号字符。

必须确保参数类型与格式规范的类型匹配。您可以使用类型转换来确保将正确的类型传递给printf。

此函数是特定于实现的,基于__getkey和putchar函数的操作。标准库中提供的这些函数使用微控制器的串行端口读写字符。自定义函数可能使用其他I/O设备。

由于8051施加的内存限制,可传递给该函数的字节总数受到限制。在小型或紧凑型中最多可以传递15个字节。在大型模型中最多可以传递40个字节。

返回值

printf函数返回实际写入输出流的字符数。

参考文献:Cx51 User's Guide (KEIL C51官方参考手册)

视频讲解及测试例子:

视频讲解:

1,https://www.ixigua.com/6921169441401078283

2,https://www.ixigua.com/6921169728379552260

程序:

/*1,串口的初始化(设置波特率,设置串口的工作方式,奇偶校验:96N81)9600 8 N 1 (不能产生115200)2,有必要就设置串口中断:开启串口中断和总中断3,可以printf函数(需要包含头文件stdio.h)3,自己编写发送和接收字符和字符串的函数4,发送和接收完后,需要软件清除串口中断标志位(RI,TI) TI=0*/#include#include//毫秒延时函数void delay_ms(unsigned int t){ unsigned int a = 0,b = 0; for(b=0;b0;a--);}void Uart_Init(void){TMOD |= 0X20;// 使用定时器1 工作方式2TH1=TL1=0XFD; //设置波特率9600 //时钟频率11.0592MSCON = 0X50; //串口工作在方式1 REN=1接收数据 PCON = 0; //SMOD=1:波特率加倍 这里是不加倍ES=1; //开启串口中断EA=1; //开启总中断TR1=1; //开启定时器1}int main(void){void tst_printf (void);char a='A';Uart_Init();TI = 1; //RIwhile(1){printf("doubixiaohanhan %c\n",a++);//tst_printf();delay_ms(500);}return 0;}void tst_printf (void) { char a = 1; int b = 12365; long c = 0x7FFFFFFF; unsigned char x = 'A'; unsigned int y = 54321; unsigned long z = 0x4A6F6E00; float f = 10.0; float g = 22.95; char buf [] = "Test String"; char *p = buf; printf ("char %bd int %d long %ld\n",a,b,c); printf ("char %c int %d long %ld\n",a,b,c); printf ("Uchar %bu Uint %u Ulong %lu\n",x,y,z); printf ("xchar %bx xint %x xlong %lx\n",x,y,z); printf ("String %s is at address %p\n",buf,p); printf ("%f != %g\n", f, g); printf ("%*f != %*g\n", (int)8, f, (int)8, g);}

效果:

用户评论

青衫故人

终于找到一篇详细讲解 printf 函数的笔记啦!我一直卡在这块,搞不清楚为啥写进去之后不会输出。这篇笔记解释的很清楚,特别是那个库文件的问题,之前一直找不到原因。

    有5位网友表示赞同!

致命伤

我感觉51单片机太入门了!课程里都是基础知识,printf函数这种简单的基本操作,都能弄得这么复杂,我反而有点看不懂了。

    有19位网友表示赞同!

失心疯i

KeilC51软件确实用起来有些难度,尤其是这些系统函数的使用。这篇笔记的讲解很细致,帮我理解了很多之前看不懂的地方,特别是那些头文件的概念,现在终于明白啦!

    有7位网友表示赞同!

隔壁阿不都

printf 函数真的太常用啦!我正在做一个LED灯闪烁的项目,这个函数让我能清晰的在屏幕上输出状态信息,方便调试。不过这篇笔记写的有点抽象,给我一个具体案例,效果更佳。

    有5位网友表示赞同!

凝残月

51单片机这块学起来还真需要一点耐心,printf 函数也是如此,感觉每次写的时候都被各种问题困扰,还好有这篇文章帮我解答了许多疑惑。KeilC51软件确实好用,我用它能快速实现很多功能。

    有8位网友表示赞同!

ー半忧伤

这篇笔记写的太棒了!非常详细地解释了 printf 函数的原理和使用方法,还提供了不少实战案例,让我受益匪浅。希望以后还有更多类似的文章分享!

    有8位网友表示赞同!

景忧丶枫涩帘淞幕雨

我试着实践了一下,发现printf函数输出的是英文字母和小数点无法显示中文,这个地方需要注意一下。总体来说这篇文章还是很有帮助的,特别是对于初学者来说,能很好的理解printf函数的使用方法。

    有18位网友表示赞同!

本站涵盖的内容、图片、视频等模板演示数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

备案号:滇ICP备2023006363号-20

网站地图