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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Ricci (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.