KeilC51中的库函数printf
扫描二维码
随时随地手机看文章
在用keil仿真查看串口输出时,遇到了一个问题,代码如下:
#include
#include
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执行起来也慢。