Listing 1 A program to illustrate some features of the C-51 compiler

/* ARCH.C */

#include <io51.h>

#pragma language=extended

#define TMOD0 0x01
#define TMOD1 0x20

#define SERIAL_MODE1 0x40
#define RECEIVE_ENABLE 0x10
#define DISCARD_FRAME_ERROR 0x20

#define T0_COUNT 1250
#define T0_LOAD ((unsigned)(0x10000L - T0_COUNT))

#define BAUD_RATE 0xfc

/* Note:  Keyword "data" tells compiler to put the
        following in internal RAM                */
        
data int millisecond_counter;
bit first_time;

interrupt [0x0B] using [1] void my_isr(void)
{
   P1.7 = 1;  /* Signal start of ISR */
   
   /* Load Timer 0 starting count */
   TR0 = 0;   /* disable Timer 0 counting */
   
   TH0 = T0_LOAD >> 8;    /* Load high byte */
   TL0 = T0_LOAD & 0xff;  /* Load low byte */
   
   TR0 = 1;  /* Re-enable Timer 0 counting */
   
   ++millisecond_counter;
   
   P1.7 = 0;  /* Signal end of ISR */
}

char read_char()
{
   while(!RI)
      ;
   RI = 0;
   return(SBUF);
}

void write_char(char c)
{
   while(!(TI||first_time))
      ;
   first_time = 0;
   TI = 0;
   SBUF = c;
}

void setup(void)
{
   /* prepare Timer 0, Timer 1 and serial port */
   first_time = 1;
   TH1 = BAUD_RATE;
   TMOD = TMOD0 | TMOD1;
   SCON = SERIAL_MODE1 | RECEIVE_ENABLE
         | DISCARD_FRAME_ERROR;
   TR1 = 1;  /* Turn on Timer 1 */
   TR0 = 1;  /* Turn on Timer 0 */
   
   ET0 = 1;  /* Enable Timer 0 interrupts */
   EA = 1;   /* Enable All enabled interrupts. */
}

void main()
{
   setup();
   
   for(;;) {
      write_char(read_char());
   }
}
/* End of File */