KeilC51中的庫(kù)函數(shù)printf
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在用keil仿真查看串口輸出時(shí),遇到了一個(gè)問(wèn)題,代碼如下:
#include
#include
main()
{
SCON= 0x50;/*SCON:工作模式1,8-bit UART,允許接收*/
TMOD |= 0x20;/*TMOD:定時(shí)器T1,工作模式2, 8位自動(dòng)重載方式*/
TH1= 0xf3;/*當(dāng)波特率為2400時(shí),定時(shí)器初值*/
TR1= 1;/*定時(shí)器T1開(kāi)始運(yùn)行*/
TI= 1;/*允許發(fā)送數(shù)據(jù)*/
printf("hello world");
}
上面代碼調(diào)試運(yùn)行后,串口不斷輸出"hello world",程序陷入死循環(huán)。
問(wèn)題的解決:在程序末尾應(yīng)加上while(1);
原因:如果不加while(1); 單片機(jī)將執(zhí)行一條RET指令,這條指令會(huì)讓程序復(fù)
位(軟件復(fù)位,從堆棧彈出0000H到PC寄存器),復(fù)位后程序重新開(kāi)始
執(zhí)行。
思考:習(xí)慣了window下編程,主程序執(zhí)行完了就退出到操作系統(tǒng),單片機(jī)就
不一樣了,退到哪里呢?以下是單片機(jī)和編譯器的對(duì)話(huà):
單片機(jī):我沒(méi)事做了,死了算了~~~
編譯器:想死?你還是復(fù)位吧~~~RET
單片機(jī):o,shit~~~
單片機(jī)串口相關(guān)問(wèn)題:標(biāo)準(zhǔn)51只有一個(gè)串口,但是現(xiàn)在很多基于51內(nèi)核的單
片機(jī)都會(huì)有兩個(gè)串口或是更多,那么printf函數(shù)針對(duì)哪個(gè)串口呢?
回答:KeilC51LIB目錄下有個(gè)putchar.c文件,printf函數(shù)會(huì)調(diào)用該文件中的
putchar函數(shù),putchar里面的使用的寄存器都是標(biāo)準(zhǔn)51的sfr(如TI,SBUF),它
們的地址是固定的,由此可知printf函數(shù)只針對(duì)串口0。如果想讓printf函數(shù)支
持串口1或串口2。。。那么修改putchar函數(shù)的寄存器即可,比如SBUF改為
SBUF1。但是能不能用printf函數(shù)對(duì)串口0,串口1。。。都適用呢,自己想辦
法吧:)
另外:如果只是用printf輸出字符串的話(huà)還是自己編個(gè)函數(shù)吧,因?yàn)閜rintf要處
理各類(lèi)數(shù)據(jù)的輸出,占用代碼空間很大,我試了一下,程序里就一條printf語(yǔ)
句,code就1K了,而且printf執(zhí)行起來(lái)也慢。