Forum: Mikrocontroller und Digitale Elektronik dht11 Mikrocontroller T89C51CC01 Familie 8051 Keil Uvision 4


von Martin H. (Gast)


Lesenswert?

Programm Code C:
1
 #include "t89c51cc01.h"
2
 #include "fvs_bib_lcd.h"
3
 #include <stdio.h>
4
 #include <string.h>
5
 #include <stdlib.h>
6
 
7
 sbit DHT11=P0^0;
8
 
9
 
10
 int t1,l1,t2,l2,summe;
11
 
12
 
13
 void timer1 ()
14
 {
15
    TMOD=0x01;
16
    TH0=0xB8;
17
    TL0 = 0x0C;        
18
    TR0 = 1;        
19
    while(TF0 == 0);      
20
    TR0 = 0;        
21
    TF0 = 0;    
22
23
 }
24
 
25
 void timer2 ()
26
{
27
  TMOD = 0x01;      
28
  TH0 = 0xFF;        
29
  TL0 = 0xF1;        
30
  TR0 = 1;        
31
  while(TF0 == 0);      
32
  TR0 = 0;        
33
  TF0 = 0;        
34
35
} 
36
37
38
39
void frage ()
40
{
41
42
  DHT11 = 0;         
43
  timer1();     
44
  DHT11 = 1;      
45
  
46
}
47
 
48
void antwort ()         
49
{
50
  while(DHT11==1);
51
  while(DHT11==0);
52
  while(DHT11==1);
53
  
54
}
55
56
int datei()      
57
{
58
  int q,c=0;  
59
  for (q=0; q<8; q++)
60
  {
61
    while(DHT11==0);  
62
    timer2();
63
    if(DHT11 == 1)    
64
    c = (c<<1)|(0x01);  
65
    
66
    else        
67
    c = (c<<1);
68
    
69
    while(DHT11==1);
70
  }
71
  return c;
72
}
73
74
75
void main ()
76
77
{
78
 char txt[10];
79
 char txt1[10];
80
 char txt2[10];
81
 
82
  
83
  while(1)
84
  {
85
    init_lcd();
86
    frage();
87
    antwort();
88
    
89
    t1=datei();
90
    t2=datei();
91
    l1=datei();
92
    l2=datei();
93
    summe=datei();
94
    
95
    if((t1+t2+l1+l2)!=summe)
96
    {
97
      
98
      
99
      lcdsend("Error");
100
101
102
    }
103
    
104
    else
105
      
106
    {
107
    
108
      pos(0);
109
      sprintf(txt,"Temp=%i",(int)t1,t2);
110
      lcdsend(txt);
111
      pos(9);
112
      sprintf(txt1,"Luft=%i",(int)l1,l2);
113
      lcdsend(txt1);
114
      //pos(40);
115
      //sprintf(txt,"WandT=%2.0f",(float)w);
116
      //lcdsend(txt);
117
      //pos(49);
118
      //sprintf(txt,"Taup=%2.0f",(float)p);
119
      //lcdsend(txt);
120
121
    }
122
123
124
125
  }
126
127
128
129
}






Kann mir jemand da weiter helfen, ich finde denn Fehler nicht. Muss mit 
einem dht11 die Temperatur und die Luftfeuchtigkeit in einem Raum messen 
mit einem Mikrocontroller der Familie 8051 Vlt hat jemand von euch schon 
eine fertiges Projekt.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Martin H. schrieb:
> Kann mir jemand da weiter helfen, ich finde denn Fehler nicht.

"Denn"?

Was erwartest Du denn, und was passiert stattdessen?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Ich verstehe Deinen Ansatz nicht ganz.
Zumindest der DHT22 (den 11er wollten die Chinesen nicht liefern, lange 
ist's her) werden 40 Bits eingelesen, Welche aber wohl identisch zum 
DHT11 angeordnet sind.
Auch die Prüfsumme (Summe der 4 Nutz-Bytes = CRC-Byte) findet sich in 
Deinem Code.

Mir sagt der timer2() in Deinem Code nicht viel - erkläre bitte, was Du 
Dir wo gedacht hast, was Du erwartest und was Du akut bekommst.

Mit 'geht nicht' wird's echt schwer, Hilfe zu leisten.

MfG

von Martin H. (Gast)


Lesenswert?

Also der zeigt mir keine werte an bin die ganze zeit schon dran.. möchte 
die Temperatur und die luftfeuchtigkeit vom dht11 lesen  mit dem arduino 
war es recht einfach das zu programmieren jetzt haben wir in der schule 
den mikrocontroller t89c51cc01 bekommen zeigt mir kein fehler an aber 
lcd zeigt mir auch nix an. da tut sich gar nix einfach -.- und im 
internet findet man auch kaum was darüber

von Martin H. (Gast)


Lesenswert?

Mir sagt der timer2() in Deinem Code nicht viel - erkläre bitte, was Du
Dir wo gedacht hast, was Du erwartest und was Du akut bekommst.

kann dazu relativ wenig sagen da mir der mikrcontroller sehr schwer 
fällt. dachte vlt könntet ihr mir helfen wo was ich machen könnte oder 
wo der  fehler liegt wollte die daten vom dht 11 auslesen dacht echt 
nicht das es so schwer werden würde.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Läuft das Display überhaupt?
Wenn nicht: Kein Wunder, daß Du nix siehst ;)

Wenn doch: Dann hast Du die Möglichkeit, Dir anzeigen zu lassen, wo der 
µC sich gerade befindet, also eine '1' auf's Display schreiben, bevor Du 
eine Funktion anspringst, eine '2', vor der Nächsten.
Wenn sich die Zahl nicht laufend (und sehr schnell) ändert, siehst Du, 
wo der µC 'stirbt'.

Dann noch:
Das Programm ist ja irgendwo her, scheinbar aber nicht von Dir selber 
geschrieben?

Die Funktionen timer1()/timer2() scheinen das Laufzeit-Kriterium der 
Bits bzw. Pausen zu sein (müsste bei meinem DHT22-Programm das Listing 
auch erst wieder durchlesen, da ASM, hilft Dir Das aber wohl hier nicht.

Was passiert bei z.B. bei
1
while(DHT11==1);
und warum?
Wer setzt 'DHT11' ungleich 1 ?

In Assembler muß man zwar ALLES selber machen, kann sich aber stur an's 
Datenblatt halten.
Hier (also allgemein bei den C-Listings) sehe ich das Problem, daß man 
sich an die Syntax einer unbekannten LIB halten muß.
Und: Richtig geraten, ich habe mit C noch Nichts am Hut gehabt :/

MfG

PS: freute mich in Deinem Post über das groß geschriebene 'Du'.
Leider hattest Du mich nur zitiert

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Martin H. schrieb:
> möchte die Temperatur und die luftfeuchtigkeit vom dht11 lesen

Martin H. schrieb:
> Muss mit einem dht11 die Temperatur und die Luftfeuchtigkeit ... messen

Möchtest du oder musst du?

von Lothar (Gast)


Lesenswert?

Martin H. schrieb:
> im internet findet man auch kaum was darüber

Hier gibt es Beispiele zum T89C51CC01:

http://www.keil.com/dd/chip/3134.htm

Aber Du hast ja ein fertiges Programm.

> Also der zeigt mir keine werte an

Das LCD zeigt an:

Temp=0 Luft=0

Oder gar nichts?

Was auch noch Sinn macht: in main in while (1) {} eine LED blinken zu 
lassen, ob das Programm noch läuft oder abgestürzt ist.

Auch eine LED an dem DHT11 P0.0 ist zur Überwachung gut.

von Wolfgang (Gast)


Lesenswert?

Patrick J. schrieb:
> Hier (also allgemein bei den C-Listings) sehe ich das Problem, daß man
> sich an die Syntax einer unbekannten LIB halten muß.

In C musst du dich an die C-Syntax halten und an sonst nichts.

Libs sollten dir spätestens dann nicht mehr ganz unbekannt sein, wenn du 
einen Blick in die Doku und die Header-Datei geworfen hast ;-)

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Syntax ist vll. das falsche Wort.
Irgend Wer hat sich ja eine ganze Menge Gedanken zu dieser Lib gemacht - 
meist differieren meine Gedanken/Lösungsansätze bei fremdem Code ;)

Ist aber mein Problem ... vll. bin ich deshalb bei Assembler gelandet, 
fand ich aber schon vor >20 Jahren

MfG

von Martin H. (Gast)


Lesenswert?

Vielen dank erst mal für die ganzen antworten. ja diesen code habe ich 
vom einer Internet seit weil ich echt keine ahnung habe wie ich da 
vorgehen soll. und ja leider muss ich es irgendwie hin kriegen bin schon 
tage lang drann aber leider ohne erfolg -.- und habe noch 1 monat zeit 
dann muss ich die arbeit abgeben.. und verzweifle an diesen projekt mit 
einem arduino wäre das ganze kein problem findet man dutzend sachen im 
internet.. -.-
diesen code habe ich von dieser internet seite 
http://www.electronicwings.com/8051/dht11-sensor-interfacing-with-8051

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wird überhaupt was ausgegeben?
Mindestens 'Error' sollte dann regelmäßig im Display auftauchen.

Denke, Du hast ein Timing-Problem.
Das Protokoll ist ziemlich zeitkritisch (ok, bei 1MHz 18 Takte LOW-Pegel 
zwischen den Bits, also durchaus noch Zeit).

Alternativ nur das erste Byte einlesen und auf's Display bringen, gerne 
auch als Binär-Zahl.

Wenn Das klappt, bis Byte 2 einlesen, denke, spätestens hier hast Du das 
Problem, da die Funktionsaufrufe zu viel Zeit brauchen und so ab dem 
2.te Byte nur Müll raus kommt.

MfG

von Martin H. (Gast)


Lesenswert?

Also der zeig mir gar nix an leider nicht mal error würd das ja gerne 
selber schreiben denn code aber habe keine ahnung wie ich da vorgehen 
soll die der hat da ne header datei eingefügt mit reg51.h vlt ist das 
das problem wenn ich den header einbinde zeig er mir nur fehler an -.- 
muss ich mal versuchen vlt liegt das echt daran das er mir nur müll 
aussgibt ^^

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Dann versuche erst, eine LED blinken zu lassen - wirklich, das ganz 
banale Zeug zuerst!

Dann, ob das Display zur Anzeige von 'egal was' zu bewegen ist - wird 
ein Balken auf dem Display ausgegeben? (-> Display fehlerhaft/gar nicht 
initialisiert)

Hier müssen wir den Fehler eingrenzen, bis wohin der µC überhaupt kommt 
und wo es hakt.

MfG

von Martin H. (Gast)


Lesenswert?

das würd nicht alles vlt ohne timer funktionieren? nur die werte aus dem 
dht11 aufnehmen und ausgeben lassen ardunio ist es so einfach aber 8051 
ist da schon etwas komplizierter wenn ich header daten einbinden würde 
wäre es auch einfacher aber egal was ich einbinden tu der zeigt mir 
immer zieg fehler an. :/

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Da das Timing beim DHT echt fix ist, wird Das ohne Timer Nichts.
Selber habe ich Das so angegangen, daß ich einen Timer mitlaufen lasse 
und diese Laufzeit bei jedem Bit speicher - in Deinem Code wäre Das das
c = (c<<1)|(0x01);
bzw
c = (c<<1);
Wenn der Zähler überläuft, habe ich einen Fehler und dieses Auslesen ist 
beendet, sonst wird bei Low-High-Flanke der Timer genullt und 'auf ein 
Neues'.

So weit kommen wir aber bei Dir gar nicht.
Da mir Dein µC gänzlich unbekannt ist, kann ich auch nur Tips in irgend 
eine Richtung geben, Umsetzen musst Du Das komplett selber.

MfG

von Lothar (Gast)


Lesenswert?

Martin H. schrieb:
> ardunio ist es so einfach aber 8051 ist da schon etwas komplizierter

Arduino ist nur einfach wenn es jemand anders schon gemacht hat :-)

Aber warum machst Du es dann nicht mit Arduino?

Und wenn mit T89C51CC01 vielleicht ist es gar nicht das Programm sondern 
ein elektrisches Problem. Hast Du genau den Schaltplan wie hier? 
Schwingt der Quarz überhaupt?

http://www.electronicwings.com/8051/dht11-sensor-interfacing-with-8051

von Martin H. (Gast)


Lesenswert?

hi
vielen danke für deine hilfe ich versuch noch dies sachen mal 
umzusetzten halt dich auf dem laufenden hoffe bekomm das hin hab noch 
ein heft da von der schule als ein handbuch für denn mikrocontroller 
würd es als pdf datei reinstellen wenn es dir weiter helfen würd^^

von Martin H. (Gast)


Angehängte Dateien:

Lesenswert?

Muss es mit diesem mikrcontroller machen ist so vorgegeben.. also hab es 
so übernommen bis auf das lcd display.. also kann mal ein bild schicken 
von dem mikrcontroller aber denk wird nicht viel helfen
mfg

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Da ist doch eine Anzeige :)

Wenn das Einlesen nur 0 liefert, passt auch die Prüfsumme (0+0+0+0=0 ... 
passt).
Lasse die Werte für t1 in der mail() stur hochzählen (aka t1++;) und 
NICHT per datei(); setzen.

Ändert sich die Anzeige auf dem Display?

Gleiches für t2, l1, l2

MfG

von Martin H. (Gast)


Lesenswert?

hi
also hab ein neus programm programmiert nur um zu sehen ob ich im 
display was angezeigt bekomm also das alte hab ich gelöscht xD versuch 
jetzt ein programm zu schreiben vlt fällt mir da mehr ein. ^^ bei dem 
code von oben zeigt er mir nix an auf dem display.. bin jetz ganz am 
anfang wieder

#include "t89c51cc01.h"
 #include "fvs_bib_lcd.h"
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>

sbit DHT11=P0^0;
int h,t;

char txt[10];
char txt1[10];
char txt2[10];

void main (void)
{



init_lcd();


while(1)
{
      pos(0);
      sprintf(txt,"Temp=%i",(int)t);
      lcdsend(txt);
      pos(9);
      sprintf(txt1,"Luft=%i",(int)h);
      lcdsend(txt1);
      //pos(40);
      //sprintf(txt,"WandT=%2.0f",(float)w);
      //lcdsend(txt);
      //pos(49);
      //sprintf(txt,"Taup=%2.0f",(float)p);
      //lcdsend(txt);
}


}

und somit in dem stand xD

von Lothar (Gast)


Lesenswert?

Martin H. schrieb:
> sbit DHT11=P0^0;

Auf Deinem Foto ist kein R4.7K Pull-Up Widerstand an P0.0 wie auf dem 
Schaltplan:

http://www.electronicwings.com/8051/dht11-sensor-interfacing-with-8051

Außerdem: bist Du sicher dass der P0.0 frei ist für den Anschluss vom 
dht11 und da nichts auf Deinem Board schon dran angeschlossen ist z.B. 
LED oder Schalter?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Martin H. schrieb:
> void antwort ()
> {
>   while(DHT11==1);
>   while(DHT11==0);
>   while(DHT11==1);
>
> }

Wenn Das dort durch ging, müsste irgendwo der Bus hochgezogen worden 
sein, da auf beide Pegel gewartet wird.
Da die Display-Ausgabe erst hinter diesen Bedingungen stehen, müsste der 
Bus halbwegs passen.

In der While-Schleife vermisse ich noch ein
h++;
oder
inc h
vor dem pos(0); um sehen zu können, ob das Display aktuell Daten erhält.

MfG

von Martin H. (Gast)


Lesenswert?

also mit dem vorwiederstand hab ich weg gelassen wollt es nur mal testen 
ob er mir überhaupt etwas anzeigt. also sicher bin ich mir nicht aber so 
weit ich weis ist der port 0.0 komplett frei fehler zeigt er mir keinen 
an kann auch da programm laufen lassen nur bekomm auf dem display nix 
angezeigt.. bin auch schon seit tagen dran und leider ohne erfolg -.-

von Martin H. (Gast)


Lesenswert?

also wenn ich in der while- schleife h++ hinzufüge zählt er mir die zahl 
sehr schnell hoch das klappt super die akutellen daten erhält er somit 
auch..

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wie ist die aktuelle Lage?
Was ist wie angeschlossen?
Ist das Display beleuchtet?
Ist 'Irgendetwas' auf dem Display zu sehen?
Hast Du andere Beispiel-Codes, Die auf dem Board laufen und eine der 
LEDs blinken lassen?

Hätte gerne zu ALLEN der Fragen eine Antwort.
Es würde auch nicht schaden, wenn Du Dir die Zeit nehmen würdest, hier 
und da einen großen Buchstaben zu verstecken - ja, geht auch mit dem 
Handy.
Wenn Du eh am Rechner bist, sollte das Posten am Monitor um Welten 
entspannter von Statten gehen, als per Smart-Phone.

Ich habe gelesen, daß Dir die Zeit davon läuft - immerhin einen Monat 
haben wir wohl noch.

Bitte bemühe Dich, und das Helfen etwas leichter zu machen.
Gerade mit dem auch uns unbekanntem Controller können wir nur versuchen, 
Dich in die richtige Richtung zu schubsen, die angedachten Anpassungen 
und die Antworten auf die gestellten Fragen liegen bei Dir.

So, unsere Posts haben sich überschnitten:
Glückwunsch!!
Das Display läuft und wir bekommen aktuelle Daten angezeigt.

Nun den Code von Oben wieder zurück kopiert und in den einzelnen Phasen 
der Abfrage eine Zahl auf das Display ausgeben, damit wir sehen, wie 
weit wir kommen bzw. wo es ggf. hakt.

Martin H. schrieb:


> init_lcd();
>     frage();
... Anzeige auf's Display "Pkt 1"
>     antwort();
... Anzeige auf's Display "Pkt 2"
>     t1=datei();
... Anzeige auf's Display "Pkt 3"
>     t2=datei();
... Anzeige auf's Display "Pkt 4"
>     l1=datei();
... Anzeige auf's Display "Pkt 5"
>     l2=datei();
... Anzeige auf's Display "Pkt 6"
>     summe=datei();
... Anzeige auf's Display "Pkt 7"

MfG

von Lothar (Gast)


Lesenswert?

Martin H. schrieb:
> vorwiederstand hab ich weg gelassen

!!! Den kannst Du nicht weglassen ohne den geht gar nichts. Ein 
1-Wire-Bus braucht einen Pull-Up und der T89C51CC01 hat an P0.0 keinen 
internen Pull-Up. Das ist wohl genau der Grund warum es am Arduino ging, 
da ist interner Pull-Up.

von Martin H. (Gast)


Angehängte Dateien:

Lesenswert?

wer dir versuchen so viel zu sagen damit es dir leichter fällt

Wie ist die aktuelle Lage?
Was ist wie angeschlossen?
Ist das Display beleuchtet?
Ist 'Irgendetwas' auf dem Display zu sehen?
Hast Du andere Beispiel-Codes, Die auf dem Board laufen und eine der
LEDs blinken lassen?

mit dem oben kopierten code ziegt das display mir nix an so weit waren 
wir.
denn dht 11 habe ich auf 5v versorgungspannung + und GND - 
angeschlossen auf dem port0 für die daten habe ich denn port 0.0 
angeschlosse habe ein bild vom Port0 eingefügt. ja das display ist 
beleuchtet aber bekomme leider nix angezeigt. ja habe noch paar Bsp 
programme wie man timer einstellt oder leds zum blinken bringt werde als 
anhang bei fügen.

von Martin H. (Gast)


Lesenswert?

#include "t89c51cc01.h"
 #include "fvs_bib_lcd.h"
 #include <stdio.h>

int count;
unsigned char s=0,m=0,h=0;

void aktclock (void);

void main (void)
{
        char txt [25];
        TMOD = 0x25;
        TH1=6;
        TL1=6;
        EA = 1;
        ET1 = 1;
        TR1 = 1;
        ET0 = 1;
        TR0 = 1;
        TH0=255;
        init_lcd();

   while(1)
   {
         sprintf (txt,"%2i:%2i:%2i",(int)h,(int)m,(int)s);
         home();
         lcdsend (txt);
         sprintf (txt,"Akt = %2i",(int)TH0*4+TL0);
         pos (0x40);
         lcdsend (txt);
   }
}

void timer0 (void) interrupt 1
{

}

void timer1 (void) interrupt 3
{
        count ++;
        if (count == 4000)
        {
            aktclock();
            count = 0 ;
        }

}

void aktclock (void)
{
    s++;
    if (s==60)
    {
        s=0;
        m++;
    }
        if (m==60)
    {
        m=0;
        h++;
    }

}
 hier ist ein beispiel code für ein timer


hier beispiel code für ein schallsensor

#include "t89c51cc01.h"
 #include "fvs_bib_lcd.h"
#include <stdio.h>

int i,t, v;
float s;
unsigned char text[5];
void main (void)
{  P1=0;
  init_lcd();
P1=2;
  TMOD=0x01;
  while(1)
  {TL0=TH0=0;
P1_0=1;
    for (i=10;i>0;i--);
P1_0=0;
  while(!(P1_1));
    TR0=1;
  while(P1_1);

    TR0=0;

  t=TH0*256+TL0;
    s=t*344.0/20000;
    sprintf(text,"%5.2f cm",s);
    lcdsend(text);
    home();


  }
}

name ausgeben und Led Blinken lassen

C++ LED Blinken lassen und Name ausgeben



#include "t89c51cc01.h"
 #include "fvs_bib_lcd.h"

void main (void)
{
  //LCD Name ausgeben:
  init_lcd();
  pos(0);
  lcdsend("Martin,H");
  pos(0);


   //LED P1.0 Bnlinken lassen:
   while(1)
   {
     P1 = 0;
     P1_0 = 1;
     sec(1);
     P1_0 = 0;
     sec(1);

   }
}

von Martin H. (Gast)


Lesenswert?

lothar gast


Hab ich jetzt mit einem vorwiederstand gemacht also es ist trotdem genau 
gleich wie davor da tut sich leider auch nix.. komm nicht auf denn 
fehler weis auch nicht was ich machen soll leider -.-

von Lothar (Gast)


Lesenswert?

Martin H. schrieb:
> vorwiederstand

Also um sicherzugehen: ein Vorwiderstand ist was anderes als ein 
Pull-Up-Widerstand. Zeig mal Foto wo Du den angeschlossen hast.

von Martin H. (Gast)


Angehängte Dateien:

Lesenswert?

Hi
hab denn fehler gefunden also ich bekomm keine anfrage auf den dht11 
bekomm an dem port kein high bit und kein low bit raus 0 und keine 1 
deswegen bringt der sensor keinen wert heraus..

mfg

von Martin H. (Gast)


Angehängte Dateien:

Lesenswert?

hab denn widerstand an 5v und auf denn daten pin vom dht11 eingesteckt 
und danach auf denn port0_0 eingesteckt

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Martin H. schrieb:
> Hi hab denn fehler gefunden

Das ist nicht Dein Ernst, oder?

Handgeschriebener Quelltext als Foto?

Es heißt übrigens "den". Mit einem "n". Das wird mit einem gedehnten 
"e" ausgesprochen.

"Denn" ("Wann kommst Du denn?" "Bist Du denn mit Deinen Hausaufgaben 
schon fertig?") wird mit kurzem "e" ausgesprochen.

Die Konsonantenverdoppelung ("nn") wird dann angewandt, wenn der davor 
stehende Vokal kurz ausgesprochen wird.

Klasse, Masse, Kasse. Aber: Hase, Vase, Phase.

Wenn, denn, wann. Aber: Wen und den. ("Wen hast Du gerade beschenkt? Den 
Peter?")

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.