1. 程式人生 > >Keil C51 中使用Printf()進行串列埠輸出。

Keil C51 中使用Printf()進行串列埠輸出。

       如何使用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);
}