softwarový sér. port u AT89C51ED2

já to naprogramoval takhle, ale zatím netuším jestli to vůbec bude fungovat. Potřeboval jsem komunikaci oběma směry.

/* ========================================================================== */
/*                 ser data cteni                                             */
/* ========================================================================== */
ser_data_cteni:
maska2=0x01;      // 0000 0001
P3|=0x00;
if(P3==0x40)
        {
        cteni=1;
}
if(cteni==1)
      {
      cekej(1,5bitu)      //cekej 1,5 bitu
      for(ii=0;ii<8;ii++)
            {
            if(P3==0x40)
                  {
                  data_in |= maska2;
                  cekej(1bit);   // 1bit
                  }
            else
                {
                 data_in &=0xff;    
                }
              }
              maska2 << 1;
      cteni=0;
      cekej(0,5bitu)
}
/* ========================================================================== */
/*                 ser data zapis                                             */
/* ========================================================================== */
ser_data_zapis:                                                          
int data_out;
int maska=0x80;
int ii;                                                                                           
P3&=0xDF; // START bit =0                         
cekej(1bit);        //cekej 1bit                                                                                                            
for (ii=0;ii<9;ii++) 
                {                      
                if (maska & data_out) 
                                {                                                                                    
                                P3|=0x20; // vystup log 1                       
                                } 
                else 
                    {                                                   
                    P3&=0xDF;   // vystup log 0                                                                  
                    }                                                          
                data_out = data_out << 1;                                                 
                cekej(1bit); //cekej 1bit
                }
P3|=0x20; // vystup log 1 -> stop bit = 1
cekej(1bit); //cekej 1bit

s tím že fce cekej(cislo) je dána přesně přerušením od čítače/časovače a zbejvá nastavit na nejmenší krok a pak přesně dopočítat časy aby to komunikovalo 38400 bit/s.
P.S.: to nahoře anonimní je můj dotaz :wink: