This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Serial port Communication PC and AT89C52 ( continuted )

Here was my plan to realize the communication between PC and AT89C52, Both of them are set to 2400 (baud rate), N, 8, 1.
1. I have shortened pin 2 and pin 3 of RS-232 attached to PC. When my pc was sending out DATA, at the same time it can receive this DATA. After doing this, I found my PC can correctly receive the DATA just sent out.
2. The following is my C51 code. After receiving the incoming data, I want to show that data by LED connected to P1 port.
I thought my C51 code should be wrong, but I really have no idea……Please help me….
Sincere Thanks in advance.

unsigned char ISRIN;
unsigned char ISROUT;
unsigned char SERIALISRIN;
void DELAY ();
void INI_SERIAL();
unsigned char RECE_SERIAL ();

void main ()
{
unsigned char DATD;
P1 = 0xff;
INI_SERIAL();
While(1) {
if (ISRIN ) {
ISRIN = 0;
DATD = RECE_SERIAL ();
}
}
}

void SERIAL_ISR ( ) interrupt 4 using 1 (
if ( TI ) {
TI = 0 ;
ISROUT = 1;
}
if ( RI ) {
RI = 0;
ISRIN = 1;
}
}

void INI_SERIAL() {
EA = 0;
T2CON = 0x34;
RCAP2L = 0x64;
RCAP2H = 0xff;
TL2 = 0x64;
TH2 = 0xff;
SCON= 0x50;
TI = 0;
RI = 0;
TR2 = 1;
ES= 1;
EA =1;
}
unsigned char RECE_SERIAL () {
unsigned char DAT;

P1 = SBUF;
DAT = P1;
DELAY ();
P1 = 0xff;
return DAT;
}

Parents
  • Here was my plan to realize the communication between PC and AT89C52, Both of them are set to 2400 (baud rate), N, 8, 1.
    1. I have shortened pin 2 and pin 3 of RS-232 attached to PC. When my pc was sending out DATA, at the same time it can receive this DATA. After doing this, I found my PC can correctly receive the DATA just sent out.
    2. The following is my C51 code. After receiving the incoming data, I want to show that data by LED connected to P1 port.
    I thought my C51 code should be wrong, but I really have no idea……Please help me….
    Sincere Thanks in advance.

    unsigned char ISRIN;
    unsigned char ISROUT;
    unsigned char SERIALISRIN;
    void DELAY ();
    void INI_SERIAL();
    unsigned char RECE_SERIAL ();
    
    void main ()
    {
    unsigned char DATD;
    P1 = 0xff;
    INI_SERIAL();
    While(1) {
    if (ISRIN ) {
    ISRIN = 0;
    DATD = RECE_SERIAL ();
    }
    }
    }
    
    void SERIAL_ISR ( ) interrupt 4 using 1 (
    if ( TI ) {
    TI = 0 ;
    ISROUT = 1;
    }
    if ( RI ) {
    RI = 0;
    ISRIN = 1;
    }
    }
    
    void INI_SERIAL() {
    EA = 0;
    T2CON = 0x34;
    RCAP2L = 0x64;
    RCAP2H = 0xff;
    TL2 = 0x64;
    TH2 = 0xff;
    SCON= 0x50;
    TI = 0;
    RI = 0;
    TR2 = 1;
    ES= 1;
    EA =1;
    }
    unsigned char RECE_SERIAL () {
    unsigned char DAT;
    
    P1 = SBUF;
    DAT = P1;
    DELAY ();
    P1 = 0xff;
    return DAT;
    } 
    .

Reply
  • Here was my plan to realize the communication between PC and AT89C52, Both of them are set to 2400 (baud rate), N, 8, 1.
    1. I have shortened pin 2 and pin 3 of RS-232 attached to PC. When my pc was sending out DATA, at the same time it can receive this DATA. After doing this, I found my PC can correctly receive the DATA just sent out.
    2. The following is my C51 code. After receiving the incoming data, I want to show that data by LED connected to P1 port.
    I thought my C51 code should be wrong, but I really have no idea……Please help me….
    Sincere Thanks in advance.

    unsigned char ISRIN;
    unsigned char ISROUT;
    unsigned char SERIALISRIN;
    void DELAY ();
    void INI_SERIAL();
    unsigned char RECE_SERIAL ();
    
    void main ()
    {
    unsigned char DATD;
    P1 = 0xff;
    INI_SERIAL();
    While(1) {
    if (ISRIN ) {
    ISRIN = 0;
    DATD = RECE_SERIAL ();
    }
    }
    }
    
    void SERIAL_ISR ( ) interrupt 4 using 1 (
    if ( TI ) {
    TI = 0 ;
    ISROUT = 1;
    }
    if ( RI ) {
    RI = 0;
    ISRIN = 1;
    }
    }
    
    void INI_SERIAL() {
    EA = 0;
    T2CON = 0x34;
    RCAP2L = 0x64;
    RCAP2H = 0xff;
    TL2 = 0x64;
    TH2 = 0xff;
    SCON= 0x50;
    TI = 0;
    RI = 0;
    TR2 = 1;
    ES= 1;
    EA =1;
    }
    unsigned char RECE_SERIAL () {
    unsigned char DAT;
    
    P1 = SBUF;
    DAT = P1;
    DELAY ();
    P1 = 0xff;
    return DAT;
    } 
    .

Children
  • By the way,how to select AT89C52 Timer 2 Serial Clock Divisor? right now, I am sure my MCU is working correctly for receiving and sending out the data ( I did this under a friend's suggestion ). SO I thought the Serial Clock Divisor of AT89C52 is wrong.

    Would you help me to check it?

    Thank you.

  • OK, now you've got the 'pre' and '/pre' tags sussed, the whole point of using them is to preserve the layout of your code!

    Please go back to your original, formmatted code and post that between 'pre' and '/pre' tags.

    For example,

    void main ()
    {
       unsigned char DATD;
    
       P1 = 0xff;
       INI_SERIAL();
    
       While(1) {
          if (ISRIN ) {
             ISRIN = 0;
             DATD = RECE_SERIAL ();
          }
       }
    }

    Remember: don't use TABs; use only spaces for layout.