KeilC51中的库函数printf

发布者:omicron25最新更新时间:2016-11-07 来源: eefocus关键字:KeilC51  的库函数  printf 手机看文章 扫描二维码
随时随地手机看文章
在用keil仿真查看串口输出时,遇到了一个问题,代码如下:

#include

#include /* 为使用printf函数而加入*/

main()

{

     SCON= 0x50;/*SCON:工作模式1,8-bit UART,允许接收*/

     TMOD |= 0x20;/*TMOD:定时器T1,工作模式2, 8位自动重载方式*/

     TH1= 0xf3;/*当波特率为2400时,定时器初值*/

     TR1= 1;/*定时器T1开始运行*/

     TI= 1;/*允许发送数据*/

     printf("hello world");

}

上面代码调试运行后,串口不断输出"hello world",程序陷入死循环。

问题的解决:在程序末尾应加上while(1);

原因:如果不加while(1); 单片机将执行一条RET指令,这条指令会让程序复

           位(软件复位,从堆栈弹出0000H到PC寄存器),复位后程序重新开始

           执行。

思考:习惯了window下编程,主程序执行完了就退出到操作系统,单片机就

           不一样了,退到哪里呢?以下是单片机和编译器的对话:

           单片机:我没事做了,死了算了~~~

           编译器:想死?你还是复位吧~~~RET

           单片机:o,shit~~~

 

单片机串口相关问题:标准51只有一个串口,但是现在很多基于51内核的单

片机都会有两个串口或是更多,那么printf函数针对哪个串口呢?

回答:Keil\C51\LIB目录下有个putchar.c文件,printf函数会调用该文件中的

putchar函数,putchar里面的使用的寄存器都是标准51的sfr(如TI,SBUF),它

们的地址是固定的,由此可知printf函数只针对串口0。如果想让printf函数支

持串口1或串口2。。。那么修改putchar函数的寄存器即可,比如SBUF改为

SBUF1。但是能不能用printf函数对串口0,串口1。。。都适用呢,自己想办

法吧:)

另外:如果只是用printf输出字符串的话还是自己编个函数吧,因为printf要处

理各类数据的输出,占用代码空间很大,我试了一下,程序里就一条printf语

句,code就1K了,而且printf执行起来也慢。

关键字:KeilC51  的库函数  printf 引用地址:KeilC51中的库函数printf

上一篇:C51编程中头文件的使用
下一篇:C51语言设计基础--数据类型及函数

推荐阅读最新更新时间:2024-03-16 15:19

STM32CubeIDE之printf重定向及串口(uart)输出浮点型数据修改
STM32CubeIDE Version: 1.0.2 Build: 3566_20190716-0927 (UTC) OS: Windows 10, v.10.0, x86_64 / win32 Java version: 1.8.0_202 板卡:NUCLEO-F411RE printf重定向 首先你得配置好串口的各项变量 因为板卡上带有ST-LINK,用的是USART2 我们甚至不用USB转TTL,一根microUSB就能解决 配置变量 然后用IDE生成代码 方式一 贴入以下代码 #include stdio.h /* USER CODE END Includes */ /* Private type
[单片机]
STM32CubeIDE之<font color='red'>printf</font>重定向及串口(uart)输出浮点型数据<font color='red'>的</font>修改
STM32printf使用
#include stdio.h //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1- SR
[单片机]
STM32 KEIL 串口打印printf使用详解
常规打印方法 在STM32的应用中,我们常常对printf进行重定向的方式来把打印信息printf到我们的串口助手。 在MDK环境中,我们常常使用MicroLIB+fputc的方式实现串口打印功能,即: 要实现fputc函数的原因是:printf函数依赖于fputc函数,重新实现fputc内部从串口发送数据即可间接地实现printf打印输出数据到串口。 不知道大家有没有看过正点原子裸机串口相关的例程,他们的串口例程里不使用MicroLIB,而是使用标准库+fputc的方式。相关代码如: #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __F
[单片机]
STM32 KEIL 串口打印<font color='red'>printf</font>使用详解
STM32--对原子哥USART实验中printf重定向进行分析
原子哥的USART代码中,有一部分感觉看得不是很懂 #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /* FILE is typedef
[单片机]
工程师调试法宝之Printf串口输出
Printf函数是一个格式化输出函数,是C语言的一个库函数。在程序中可以使用该函数通过串口可以打印出想要的信息。其使用方法如下: 1、首先需要在包含printf的C语言库函数的头文件stdio.h; 2、正常初始化想要打印信息的串口。 3、重新实现函数int fputc(int ch, FILE *f)。例如: #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to th
[单片机]
工程师<font color='red'>的</font>调试法宝之<font color='red'>Printf</font>串口输出
STM32关于printf重定向到串口
简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { U
[单片机]
STM32串口函数_库函数USART_SendData问题和解决方法
个人记录: 昨天做串口实验的时候一直没有成功的原因,连续调用USART_SendData总是会出现前一个被后一个覆盖的情况。 之前觉得ST的官方库应该没有问题就没往这方面想,现在查查,确实有库的问题,还是自己对库不太理解。 还有遇到的硬件复位以后,发送第一个字符丢失的情况。 1、后字节覆盖前字节 -----------------加判断while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} 2、硬件复位之后第一个字符丢失 -----------------USART_ClearFlag(USART2,USART_FLAG_TC); ----
[单片机]
STM32<font color='red'>的</font>串口函数_<font color='red'>库函数</font>USART_SendData问题和解决方法
STM8L151在STVD/IAR下重定向printf函数
之前一直是在IAR下对STM8L151进行编程,因为在IAR的参考例子比较多,关键是很多配置可以参考,主要是参考风驰的STM8例子开发的,在此表示感谢。 最近由于需要在STVD下对STM8L151进行编程,在程序中有用到Printf函数来打印调试信息,编译的时候发现将 stdio.h 包含进行还是不行,上网查了下,说是需要重定向一下,于是找了好久,还是没有找到如何重定向!!没办法还是要回到ST提供的固件库中找答案,发现在USART的例子中有代码可以参考。如下面所示 #ifdef _RAISONANCE_ #define PUTCHAR_PROTOTYPE int putchar (char c) #define GETC
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved