dht11 Mikrocontroller T89C51CC01 Familie 8051 Keil Uvision 4

Gast #4951463
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.
#4951554
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
Gast #4951587
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
Gast #4951595
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.
#4951683
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
Gast #4951756
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.
Gast #4951826
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 ;-)
Gast #4952057
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
#4952074
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
Gast #4952119
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 ^^
#4952137
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
Gast #4952160
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. :/
#4952185
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
Gast #4952211
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
Gast #4952215
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^^
Gast #4952301
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
#4952336
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
Gast #4952351
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 -.-
#4952373
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
Gast #4952391
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.
Gast #4952407
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.
Angehängte Dateien:
Gast #4952412
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);

   }
}
Gast #4952417
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 -.-
Persönliche Seite #4952834
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?")

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren