||
在实际的编程过程中我们要输出几个字符或字符串,方法是多中多样的,当然总有适合自己的方法。
在用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执行起来也慢。
在实际的应用中要考虑的问题很多。