您现在的位置: 主页 > MCU > 单片机技术应用 > KeilC51中的库函数printf -
本文所属标签:
为本文创立个标签吧:

KeilC51中的库函数printf -

来源: 网络用户发布,如有版权联系网管删除 2018-09-07 

[导读]在用keil仿真查看串口输出时,遇到了一个问题,代码如下:#include#include /* 为使用printf函数而加入*/main(){ SCON= 0x50;/*SCON:工作模式1,8-bit UART,允许接收*/ TMOD |= 0x20;/*TMOD:定时器T1,工作模式2,

在用keil仿真查看串口输出时,遇到了一个问题,代码如下:

#include

本文引用地址: http://www.21ic.com/app/mcu/201807/786368.htm

#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函数针对哪个串口呢?

回答:KeilC51LIB目录下有个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执行起来也慢。



              查看评论 回复



嵌入式交流网主页 > MCU > 单片机技术应用 > KeilC51中的库函数printf -
 

"KeilC51中的库函数printf -"的相关文章

网站地图

围观()