Putchar in Keil C, take 8051 as an instance

来源:互联网 发布:淘宝店全场包邮 编辑:程序博客网 时间:2024/06/17 21:57

 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)
0 0
原创粉丝点击