Keil C51 中使用Printf()進行串列埠輸出。
阿新 • • 發佈:2018-11-07
如何使用printf在串列埠顯示資訊,有兩種辦法,因為在keil C51中 printf函式是呼叫putchar進行資料傳送的,而putchar應該是先判斷TI是否為1,不為1則等待為1。 如果為1則清0,然後送出一個字元。因此如果你直接使用printf函式,你的程式就會在putchar函式中等待TI為1。這時你的程式就相當於直接死掉了。你可以通過改寫putchar函式實現自己的目的。TI相當於是初始化不給賦初值就不幹活。
所以第一種辦法就是在初始化的時候,給TI賦值為1,比如
void uart_init() { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位資料,可變波特率 AUXR |= 0x40; //定時器1時鐘為Fosc,即1T AUXR &= 0xFE; //串列埠1選擇定時器1為波特率發生器 TMOD &= 0x0F; //清除定時器1模式位 TMOD |= 0x20; //設定定時器1為8位自動重灌方式 TL1 = 0xDC; //設定定時初值 TH1 = 0xDC; ET1 = 0; //禁止定時器1中斷 TR1 = 1; //啟動定時器1 TI=1; //傳送中斷標誌位置1 }
但是有時候像在用到UART中斷的時候,這個序列傳輸資料傳送中斷標誌位TI是不能長置為1的,這時候我們就需要對putchar函式進行重新編寫就可以對printf函式輸出重定向,然後就可以使用printf顯示了。具體可以參照C:Keil/C51/LIB/PUTCHAR.C,下面是一個例子:
char putchar (char c) {
while (!TI);
TI = 0;
return (SBUF = c);
}