In Keil C, it is necessary to implement char putchar(char c), or the powerful function printf would not work.
We should notice in here : new line command for serial output be "\r\n" (line feed:LF, 0x0a + carriage return:CR, 0x0d), not only "\n" in Keil C.
I do not want to write too much tedious word in here, below is my putchar code for 8051, use timer 1 as interrupt:
#define FCLK 22118400UL
#define BAUDRATE 9600UL
/* ref http://csserver.evansville.edu/~blandfor/EE354/SFRegisters.pdf */
void InitUART(void)
{
EA = 0;
TMOD &= 0x0F; /*timer 1 clean*/
TMOD |= 0x20; /*mode 2: 0~255, auto-reload */
REN = 0; /*forbid 8051 receive data*/
SM1 = 1; /* Serial Control Register be set by timer*/
/*
BaudRate = OscillatorFreq/(N*256-TH1)
if SMOD = 0, N = 384
if SMOD = 1, N = 192
SMOD is PCON.7 , Serial mode bit
*/
TH1 = 256 - FCLK/(BAUDRATE*12*16);
TL1 = 256 - FCLK/(BAUDRATE*12*16);
PCON |= 0x80;
ES = 1; /*Enable Serial port interrupt */
REN = 1; /*allow 8051 receive data */
EA = 1; /*Enable interrupt*/
TI = 1; /* the transmitting has been done */
RI = 0; /* the receiving is not done yet */
TR1 = 1; /*Timer 1 is turned on*/
}/*InitUART*/
void UartInterrupt(void) interrupt 4
{
#if(0)
if(RI)
{
}
else
{
}
#endif
}/*UartInterrupt*/
char putchar(char c)
{
/* \n -> \r\n
\r -> carriage return, 13
*/
if ('\n' == c)
{
SBUF = 0x0d;
while(0 == TI);
TI = 0;
}
SBUF = c;
while(0 == TI);
TI = 0;
return c;
}/*putchar*/
If you want to use the code, you should modify the FCLK macro constant for your micro chip, I use stc89c52rc, crystal be 22.1184MHz.
The baud rate, for most use, be 9600, you could modify the parameter in your serial communication software. (I suggest sscom)