I have 2 pics 89c52 (8052 - 8051). i need to send from one to another some information. i'm using the serial port but when 
i've tried to ensamble the circuit the results are not like i want. 
 
here is the code for the pic #1 program, the master: 
 
/***********************************************************************************************************/ 
 
#include <8052.h> 
#include "serial.h" 
#include <stdio.h> 
 
//procedimientos del juego 
void inicializar(); 
void visualizar_display(char,long,bit,bit); 
void restraso(); 
void capturar_entradas() interrupt 0; 
void descargar_salidas() interrupt 1; 
 
#define V 1 
#define F 0 
 
#define direccion_local 0x01 
#define display_credito 0x02 
#define display_apuesta 0x03 
#define display_doblada 0x04 
#define display_noapostado 0x05 
#define display_nopremio 0x06 
#define display_premio 0x07 
 
//variables del juego 
long total_entradas, total_salidas; 
long creditos, ganado; 
float pozo_juego, pozo_doblada; 
unsigned int numero_juego; 
unsigned char porcentaje_pago[]={65, 70, 75, 80, 85, 90}; 
unsigned int tabla_premios[][]={{400, 50}, {500, 60}, {600, 60}, {700, 70}, {800, 80}}; 
unsigned char tabla_apuestas[]={1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100}; 
unsigned char creditos_por_pulsos[]={1, 2, 5, 10, 20, 25, 50, 100}; 
unsigned char apuesta, valor_credito, ind_apuesta; 
unsigned char error; 
 
sbit at 0x92 btnN1; 
sbit at 0x93 btnN2; 
sbit at 0x94 btnN3; 
sbit at 0x95 btnDbl1; 
sbit at 0x96 btnDbl2; 
sbit at 0x97 btnDbl; 
sbit at 0xA6 btnIniciar; 
sbit at 0xA7 btnApuesta; 
sbit at 0xB2 swEnt; 
sbit at 0xB3 swSal; 
sbit at 0xB4 swLlave; 
sbit at 0xA0 swPago0; 
sbit at 0xA1 swPago1; 
sbit at 0xA2 swPago2; 
sbit at 0xA3 swPremio0; 
sbit at 0xA4 swPremio1; 
sbit at 0xA5 swPremio2; 
sbit at 0xB5 swCred0; 
sbit at 0xB6 swCred1; 
sbit at 0xB7 swCred2; 
 
void main (void){ 
 inicializar(); 
 while(1){ 
  while(error==0){ 
  visualizar_display(display_premio,ganado,F,F); 
  visualizar_display(display_credito,creditos,F,V); 
  visualizar_display(display_apuesta,tabla_apuestas[ind_apuesta],F,V); 
  visualizar_display(display_doblada,0,F,F); 
  visualizar_display(display_noapostado,0,V,V); //cambiar el numero por la variable 
  visualizar_display(display_nopremio,0,V,V); //cambiar el numero por la variable 
 } 


 
void retraso(){ 
 unsigned char i; 
 P1=ind_trama; 
 for(i=0;i<255;i++){ 
 } 

 
void inicializar(){ 
 char i; 
 
 //inicializacion de las interrupciones 
 ET0=0; //desactiva la interrupcion del TIMER 0 
 ET1=0; //desactiva la interrupcion del TIMER 1 
 ET2=0; //desactiva la interrupcion del TIMER 2 
 EX0=1; //activa la interrupcion externa 0 INT0 
 EX1=1; //activa la interrupcion externa 1 INT1 
 cfg_pto_serial(); //configura el puerto serial 
 EA=1; //activa las interrupciones 
 
 
 //inicializacion de las variables 
 total_entradas=0; 
 total_salidas=0; 
 creditos=0; 
 ganado=0; 
 ind_apuesta=0; 
 numero_juego=0; 
 pozo_juego=3000; 
 pozo_doblada=1500; 
 error=0; 
 apuesta=tabla_apuestas[ind_apuesta]; 
 
 //inicializacion de los displays 
 for(i=0;i<10;i++){ 
  visualizar_display(display_premio,i,V,V); 
  visualizar_display(display_credito,i,V,V); 
  visualizar_display(display_apuesta,i,V,V); 
  visualizar_display(display_doblada,i,V,V); 
  visualizar_display(display_noapostado,i,V,V); 
  visualizar_display(display_nopremio,i,V,V); 
  retraso(); 
 } 

 
void visualizar_display(char display, long numero, bit ceros, bit ultDig){ 
 unsigned char bufferEnv[]={0xff, 0xff, 0xff}; 
 unsigned char i,k,vartmp; 
 
 k=-1; 
 for(i=0;i<6;i++){ 
  vartmp=(unsigned char)numero%10; 
  if(i%2!=0){ 
   vartmp=vartmp<<4; 
   vartmp=vartmp&0xf0; 
  } 
  else{ 
    vartmp=vartmp&0x0f; 
    k++; 
   } 
   if((numero==0)&&(ceros==F)){ 
    vartmp=0xff; 
   } 
   bufferEnv[k]=bufferEnv[k]|vartmp; 
   numero=numero/10; 
 } 
 if((ultDig==V)&&(bufferEnv[0]==0xff)){ 
  bufferEnv[0]=0; 
 } 
 enviar_comando(display,0,bufferEnv); 

 
void capturar_entradas() interrupt 0{ 
 unsigned char vartmp=P3>>5; 
 valor_credito=creditos_por_pulsos[vartmp]; 
 creditos=creditos+valor_credito; 
 total_entradas=total_entradas+valor_credito;  

 
void descargar_salidas() interrupt 1{ 
 total_salidas=total_salidas+creditos;  
 creditos=0; 

 
 
/***********************************************************************************************************/ 
 
this is the code for the pic #2, the slave: 
 
/***********************************************************************************************************/ 
 
#include <8052.h> 
#include " serial.h" 
#include <stdio.h> 
 
//procedimientos 
void inicializar(); 
 
#define V 1 
#define F 0 
 
#define direccion_master 0x01 
#define direccion_local 0x02 
 
//variables 
unsigned char error; 
 
void main (void){ 
 inicializar(); 
 while(1){ 
  while(error==0){ 
   if(ind_trama==4){ 
    //el comando es para mi 
    if(trama[0]==direccion_local){ 
     P2=trama[2]; 
    } 
    ind_trama=0; 
   } 
   P1=ind_trama; 
  } 
 } 

 
void inicializar(){ 
 //inicializacion de las interrupciones 
 ET0=0; //desactiva la interrupcion del TIMER 0 
 ET1=0; //desactiva la interrupcion del TIMER 1 
 ET2=0; //desactiva la interrupcion del TIMER 2 
 EX0=0; //activa la interrupcion externa 0 INT0 
 EX1=0; //activa la interrupcion externa 1 INT1 
 cfg_pto_serial(); //configura el puerto serial 
 EA=1; //activa las interrupciones 
 
 
 //inicializacion de las variables 
 error=0; 
 ind_trama=0; 

 
 
/***********************************************************************************************************/ 
 
this is the include serial.h: 
 
/***********************************************************************************************************/ 
 
#include <8052.h> 
 
unsigned char ind_trama, trama[5]; 
 
void cfg_pto_serial(){ 
 SCON=0xF0; //uart en modo 3 (9 bit), REN=1 
 TMOD=TMOD|0x20; //Timer 1 en modo 2 
 TH1=0xFD; //19200 Bds 
 TL1=0xFD; //19200 Bds 
 ES=1; //activa la interrupcion del PUERTO SERIAL 
 TR1=1; //correr el Timer 1 

 
void puerto_serial_event() interrupt 4{ 
 if(TI==1){ //si envia datos 
 TI=0; //limpia la bandera de transmision 
 } 
 
 if (RI==1){ //si recibe datos 
  RI=0; //limpia la bandera de recepcion 
  if(RB8){ 
   SM2=0; //modo de datos 2 
  } 
  else{ 
   ind_trama++; 
   if(ind_trama>4){ 
    ind_trama=0; 
   } 
   trama[ind_trama]=SBUF; 
   SM2=1; //modo de datos 1 
  } 
 } 

 
void enviar_comando(unsigned char direccion, unsigned char comando, unsigned char parametros[3]){ 
 unsigned char i; 
 SBUF=direccion; 
 while(TI==1); 
 SBUF=comando; 
 while(TI==1); 
 for(i=0;i<3;i++){ 
  trama[2+i]=parametros[i]; 
  while(TI==1); 
 } 

 
 
in the circuit i've put the pins 40 and 31 to 5v, 20 to GND, the pin 10 (RXD) of the master (pic #1) to the pin 11 (TXD) of  
 
the slave (pic #2) and the pin 11 (TXD) of the master to pin 10 of the slave (RXD). the pins 21 to 28 are conecteds to 7447. 
 
i'm using the SUPERFROM/Z to program the at89c52, i've opened the juego.ihx in intel hex format file and program the at89c52. the same for display.ihx.
 
i'll appreciate any help thanks,