Forum: Mikrocontroller und Digitale Elektronik Mikrcontroller 8051 Daten an Hyperterminal senden klappt nicht.


von Ricci (Gast)


Lesenswert?

Hi

Versuche gerade von meinem MC die Erfassten Daten von dem DHT11 Sensor, 
an  das Hyperterminal zu senden. am LCD zeigt er mir die werte an aber 
am Hyperterminal nur komische zeichen wie Pfeil Dollar zeichen die sich 
auch ändern so bald temperatur steigt oder sinkt. trotz tage langer 
versuchung klappt es nicht. die Baudrate ist richtig eingestellt 
buchstaben und zahlen kann ich ausgeben das Zeigt das Terminal mir auch 
richtig an.

mein C- Code ich hoffe mir kann einer helfen

 sbit DHT11=P0^0;


 void timer1 (void)
 {
    TMOD=1;
    TH0=185;
    TL0 = 12;
    TR0 = 1;
    while(!TF0);
    TR0 = 0;
    TF0 = 0;

 }

 void timer2 (void)
{

  TMOD = 1;
  TH0 = 255;
  TL0 = 241;
  TR0 = 1;
  while(!TF0);
  TR0 = 0;
  TF0 = 0;

}




void senden (unsigned int Temp,LuftF,Taupunkt)
{
 TMOD = 0x20;
 TL1 = 243;
 TH1 = 243;
 TR1 = 1;
 SCON = 0x40;
 PCON = 0x80;
 EA = 1;


  SBUF = Temp;
  while(TI==0);
  TI = 0;



}








void frage (void)
{

  DHT11 = 0;
  timer1();
  DHT11 = 1;

}

void antwort (void)
{
  while(DHT11==1);
  while(DHT11==0);
  while(DHT11==1);

}

int datei()
{
  int i,c=0;
  for (i=0; i<8; i++)
  {
    while(DHT11==0);
    timer2();
    if(DHT11 == 1)
    c = (c<<1)|(1);

    else
    c = (c<<1);

    while(DHT11==1);
  }
  return c;
}


   float a = 17.271;
   float b = 237.7;
   float taupunktTemp;
   float Taupunkt;

void main (void)

{

  float Temp,LuftF,Wand=16;
  int t1,t2,h1,h2;
  char txt[10] ;
  char txt1[10];
  char txt2[10];
  char txt3[10];
  init_lcd();
  P1=0;


  while(1)
  {

    frage();
                antwort();

                h1=datei();
    h2=datei();
                t1=datei();
    t2=datei();


    Temp=t1;
    LuftF=h1;


    senden(Temp,LuftF,Taupunkt);







   //Berechnung des Taupunktes

   taupunktTemp = (a * Temp) / (b + Temp) + log(LuftF/100);
   Taupunkt = (b * taupunktTemp) / (a - taupunktTemp);


    if(LuftF>65)
    {

  pos(0);
        lcdsend("Achtung L");
  zeichen(0xF5);
  lcdsend("ften");

      pos(40);
      sprintf(txt1,"LuftFeuchte= %i",(int)LuftF);
      lcdsend(txt1);
      zeichen(0x25 );
      P1_7=1;
      P1_5=0;

    }


    else if (LuftF<=65)
    {
    P1_5=1;
    P1_7=0;

      pos(0);
      sprintf(txt,"T=%0.0f",(float)Temp);
      lcdsend(txt);
      zeichen(0xDF);
      lcdsend("C      ");

      pos(8);
      sprintf(txt1,"L=%0.0f",(float)LuftF);
      lcdsend(txt1);
      zeichen(0x25);
      lcdsend("       ");

  pos(50);
        sprintf(txt3,"W=%0.0f",(float)Wand);
        lcdsend(txt3);
  zeichen(0xDF);
  lcdsend("C             ");

      pos(40);
      sprintf(txt2,"TP=%2.1f",(float)Taupunkt);
      lcdsend(txt2);
      zeichen(0xDF);
      lcdsend("C ");




    }

msec(1000);

  }

}

von Lothar (Gast)


Lesenswert?

Ricci schrieb:
> SBUF = Temp;

Das geht natürlich nicht Du musst vorher Temp in Zeichen umwandeln z.B.

// convert to ASCII
txt[0] = 0x30 + Temp/1000;
txt[1] = 0x30 + (Temp%1000)/100;
txt[2] = 0x30 + (Temp%100)/10;
txt[3] = 0x30 + Temp%10;

Oder Du änderst Deine senden() Funktion dass die genau wie Dein 
lcdsend() einen String senden kann:

> sprintf(txt,"T=%0.0f",(float)Temp);
> lcdsend(txt);

von BastlWastl (Gast)


Lesenswert?

Also ich würde Dir empfehlen, Deinen Code erstmal ein wenig 
aufzuräumen... oder wahlweise auch zu erklären, warum Du ihn so 
aufgebaut hast.

Du konfigurierst ja z.B. bei jedem Aufruf von senden() den UART neu. 
Wozu?

Auch Deine Wartefunktionen würde ich mal überdenken... Die Art wie Du 
den Timer verwendest, halte ich für keine gute Lösung.

Schreib Dir besser eine delay() Funktion... Beispiele für den 8051 gibts 
ja jede Menge im Netz.

von Chrys (Gast)


Lesenswert?

Lothar schrieb:
> Das geht natürlich nicht Du musst vorher Temp in Zeichen umwandeln

Oder du decodierst auf PC Seite wieder in etwas lesbares (ascii), dann 
ist der Traffic um einiges kleiner...

von Lothar (Gast)


Lesenswert?

Chrys schrieb:
> Oder du decodierst auf PC Seite wieder in etwas lesbares (ascii), dann
> ist der Traffic um einiges kleiner...

Dann muss man aber das Temp vorher in Low/High-Byte zerlegen:

Ricci schrieb:
> SBUF = Temp;

von Ricci (Gast)


Lesenswert?

Vielen Dank für euer hilfe es tut jetzt endlich... :D

Lothar schrieb:
> Oder Du änderst Deine senden() Funktion dass die genau wie Dein
> lcdsend() einen String senden kann:

Danke Lothar hier mit hat es ganz gut geklappt. jetzt werde ich die 
Daten in ein Text-Datei.txt speichern und in Excel ausgeben können..

mfg Ricci

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.