KeilC51中的庫函數(shù)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;/*允許發(fā)送數(shù)據(jù)*/
printf("hello world");
}
上面代碼調(diào)試運行后,串口不斷輸出"hello world",程序陷入死循環(huán)。
問題的解決:在程序末尾應(yīng)加上while(1);
原因:如果不加while(1); 單片機將執(zhí)行一條RET指令,這條指令會讓程序復
位(軟件復位,從堆棧彈出0000H到PC寄存器),復位后程序重新開始
執(zhí)行。
思考:習慣了window下編程,主程序執(zhí)行完了就退出到操作系統(tǒng),單片機就
不一樣了,退到哪里呢?以下是單片機和編譯器的對話:
單片機:我沒事做了,死了算了~~~
編譯器:想死?你還是復位吧~~~RET
單片機:o,shit~~~
單片機串口相關(guān)問題:標準51只有一個串口,但是現(xiàn)在很多基于51內(nèi)核的單
片機都會有兩個串口或是更多,那么printf函數(shù)針對哪個串口呢?
回答:KeilC51LIB目錄下有個putchar.c文件,printf函數(shù)會調(diào)用該文件中的
putchar函數(shù),putchar里面的使用的寄存器都是標準51的sfr(如TI,SBUF),它
們的地址是固定的,由此可知printf函數(shù)只針對串口0。如果想讓printf函數(shù)支
持串口1或串口2。。。那么修改putchar函數(shù)的寄存器即可,比如SBUF改為
SBUF1。但是能不能用printf函數(shù)對串口0,串口1。。。都適用呢,自己想辦
法吧:)
另外:如果只是用printf輸出字符串的話還是自己編個函數(shù)吧,因為printf要處
理各類數(shù)據(jù)的輸出,占用代碼空間很大,我試了一下,程序里就一條printf語
句,code就1K了,而且printf執(zhí)行起來也慢。