关于51单片机串口中printf()的使用的问题

各位前辈,本人新手学习单片机,通过《51单片机自学笔记》一书自学单片机,今日调试书上一程序,出现了问题。
该程序主用用于让学者了解“++” “--”运算符的理解。程序如下:
#include <reg51.h>
#include <stdio.h>
#define unit unsigned int
main()
{unit x,y,z;
SCON=0X50;
TMOD=0X20;
PCON=0X00;
TL1=0XFD;
TH1=0XFD;
TI=1;
TR1=1;
x=8;
y=8;
z=++x;
printf("\n % d % d % d",y,z,x);
x=8;
y=8;
z=x++;
printf("\n % d % d % d",y,z,x);
x=8;
y=8;
z=x--;
printf("\n % d % d % d",y,z,x);
while(1);
}

我把程序下载到实验板后,然后打开电脑上的串口调试助手,调试好参数,却发现窗口上什么都没有出了什么问题呢?

第1个回答  2014-08-15
printf 函数在单片机中要重定向到串口,printf 调用标准库函数 ,你需要重写fputc() 这个c标准库函数追问

请问该如何重写fputc()呢,前辈,你可否就针对此例子,帮我修改一下呢?谢谢您了

追答

好久没弄过51了,你可以看看
http://www.51hei.com/mcu/3429.html

本回答被提问者采纳
第2个回答  2018-02-28

给你参考下参考案例:

/* 

文件名:串口通信值单片机和PC机计算梯形面积.c   

附:利用单片机和PC机的串口通信的工作方式1(波特率可变),(已知晶振为11.0592MHZ)设置通信波特率为9600b/s,结合定时器1的工作方式2(TH1=0xfd,TL1=0xfd),输入上底、下底、高,输出梯形面积 

提示:下载程序后,打开串口工具,需要复位一下。 

*/  

#include<reg52.h>  

#include<stdio.h>  

#define uint unsigned int   

#define uchar unsigned char  

void uart(void)                 //串口通信初始化  

{  

SCON=0x40;                  //串口通信工作方式1  

REN=1;                      //允许接收  

TMOD=0x20;                  //定时器1的工作方式2  

TH1=0xfd,TL1=0xfd;        

TI=1;                       //这里一定要注意  

TR1=1;                      //打开定时器  

}                                 

void main(void)  

{  

uint up=0,down=0,high=0;  

uint result ;  

uart();  

while(1)  

{     

printf("********************************\r\n");  

printf("Please input up,dowm,high:\r\n");  

scanf("%d%d%d",&up,&down,&high) ;  

printf("\r\nResult=%d\r\n",result=(up+down)*high/2);  

}  

第3个回答  2014-08-15
打开电脑上的串口调试助手,调试好参数,却发现窗口上什么都没有出了什么问题呢?
=

打开电脑上的串口调试助手,调试好参数,然后,再打开单片机的电源。

或按下单片机的复位按键,重新启动单片机。

---------

楼主的程序,很正确,可以在串口助手上显示出来:

8 9 9
8 8 9
8 8 7

只要按照我的回答操作即可。

---------

楼主选择的答案说:你需要重写fputc() ...

纯属误导。

关于51单片机串口中printf()的使用的问题
printf 函数在单片机中要重定向到串口,printf 调用标准库函数 ,你需要重写fputc() 这个c标准库函数

51单片机 printf 问题
你已经找出了问题所在。printf("%x",a);这句本来就是转换变量a为对应的格式(现在是%x,16进制格式)字符串(引号内的就是字符串)然后发送。那么当然被转换成a对应的ASCII码了,8对应的不就是0x38。直接写的话(比如SBUF = a),那么当然没有转换了。所以要发送自己需要的数据,就要自己写发送函...

51单片机用不了printf()。
单片机不同地址和操作方式也不同,串口也可能不只一个,你到底用那个,都是未知的,所以这个函数不通用,要根据单片机来修改, printf实际调用 putc实现,你只要去 stdio中改掉这个函数即可,就是常规的 发送一个字节即可。。。当然你不喜欢,你还可以写自己的 self_printf函数......

51单片机,在keil中调试,调用printf函数,有关于输出的数据格式的问题进行...
你用是16进制显示。我想应该是数据格式不对,。。。改改你的串口助手即可,是显示方式不对。 赞同

51单片机Keil C51下使用printf输出到串口,为何初始化了串口之后就可以使...
因为是这样的,在Keil\\C51\\LIB目录下有个putchar.c文件,printf函数会调用该文件中的 putchar函数,putchar里面的使用的寄存器都是标准51的(如TI,SBUF),它 们的地址是固定的,由此可知printf函数只针对串口0。如果想让printf函数支持串口1或串口2。。。那么修改putchar函数的寄存器即可,比如SBUF改为...

关于51 C编程中使用stdio.h开发串口,使用printf的问题。
在单片机中用printf通过串口输出需要对串口进行相应配置,你可以在KEIL51的例程中看到一个HELLO的程序。\/*--- HELLO.C Copyright 1995-2005 Keil Software, Inc.---*\/ include <REG52.H> \/* special function register declarations *\/ \/* for the ...

keil c51 printf 问题
在程序中,你需要配置串口的,虽然是仿真,也要初始化串口,keil仿真只不过相当于给了你硬件而已。在keil中printf 默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,参考资料:http:\/\/blog.csdn.net\/lizhoubob\/archive\/2010\/07\/...

单片机中 串口输出有一句 printf(“%bd”,i); bd是一个什么类型 我直接...
楼主你好。51单片机与标准C有区别:KEIL里扩展出了b,h,l来对输入字节宽的设置:(1)b八位 (2)h十六位 (3)l三十二位 在Keil C51中用printf输出一个单字节变量时要使用%bd,如 unsigned char counter;printf("Current count: %bd\\n", counter);而在标准C语言中都是使用%d:printf("Current ...

STC51单片机用printf()函数输出数字到串口,
查C51关于printf的帮助文档:d 是处理int数据的,如果是char的看这句:The optional characters b or B may immediately precede the type character to respectively specify char types for d, i, u, o, x, and X.也就是要改为这样:printf("num = %bd",num);...

c51语言中,printf函数有什么用?
这个函数功能强大,在数据格式转换中使用十分方便。但是有几点,该函数所占程序空间巨大,使用了该函数目标代码要大好几K,对于仅有几k代码的51单片机来说是很难吃得消的,代码大的原因主要是因为它带了一个浮点运算库,也正因为此原因,运行printf()时速度也不是很快。我平时是主张尽量以最少的资源...

相似回答