原创 KeilC51中的库函数printf

2008-7-30 20:00 7009 8 9 分类: MCU/ 嵌入式

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


#include<reg52.h>


#include <stdio.h>/* 为使用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执行起来也慢。


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-11-23 00:57

不错,请写些简单例子,比如按钮(P2.0)控制电机(P0.0),等
相关推荐阅读
用户141063 2010-12-31 18:40
microSD卡SPI模式读写及FATfs移植(基于c8051f340)
2009年6月4日星期四       花了不到一个月,SD卡的SPI模式读写与FATfs文件系统的移植告一段落了,写下来为大家一个提供参考。硬件(如图1、2、3):(1)       新华龙BT F3...
用户141063 2008-12-08 20:09
清华大学校长留给毕业生的一段话
未来的世界:方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要!”                                                     ...
用户141063 2008-10-18 11:56
阻抗匹配
阻抗匹配是指信号源或者传输线跟负载之间的一种合适的搭配方式。阻抗匹配分为低频和高频两种情况讨论。 <?xml:namespace prefix = o ns = "urn:schemas-mic...
用户141063 2008-08-31 09:45
决定高薪必要的细节守则
作者:贾忠贤 转自chinaren: http://i.chinaren.com/group/msg/12331/15987338点到10点之间,是在有目的性阅读,还是为明天的事情做准备,甚至在充电专...
用户141063 2008-08-28 19:33
脑子脱线那一刻...
别人的。。。●有一次坐公交拿了IC卡排队上车,前面一个人是扔硬币的,我大脑短路跟着把IC卡扔进去了……●早上要戴隐形眼镜,结果把盖打开直接把眼镜倒马桶里,然后镇定地倒入新的护理液,准备摘眼镜,半天摘不...
用户141063 2008-08-17 12:58
KEIL产生WARNINGL15: MULTIPLE CALL TO SEGMENT的原因及解决方法
.***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?。。。?。。。CALLER1: ?。。。?MAINCALLER2: ?C_C51STARTUP该警...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条