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