Elektroda.pl
Elektroda.pl
X
Mitronik
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze

Sam Sung 08 Paź 2011 19:20 10526 7
  • Jest to dość klasyczny układ, nie jest ani odkrywczy, ani nie zawiera najnowocześniejszych elementów - termometr z 3-cyfrowym 7-segmentowym wyświetlaczem LED ze wspólną anodą. Zamieszczam pełny kod programu w asemblerze z komentarzami.
    Układ jest zbudowany na mikrokontrolerze AT89C2051. Jego zadaniem jest odczyt temperatury z czujnika DS18B20 (1-wire), przeliczenie wyniku i wyświetlenie go na wyświetlaczu (multipleksowanym).
    Układ zawiera stabilizator 7805 i może być zasilany z zasilacza 12V, pobiera wówczas ok. 130mA, a stabilizator osiąga ok. 45°C.
    Układ można również wykorzystać (po przeprogramowaniu) jako sterownik wyświetlacza, a dane do wyświetlania można przesyłać przez UART. Użycie prądożernego mikrokontrolera nie ma tu większego znaczenia z uwagi na spory pobór prądu przez sam wyświetlacz.
    Układ łatwo jest zbudować na płytce uniwersalnej, stąd niestety brak schematu. Opis połączeń:

    • typowy układ resetu dla AT89C2051 - opornik 10kΩ do masy, kondensator 10uF do +5V
    • typowy układ rezonatora kwarcowego - z kondensatorami 22pF do masy na obu końcówkach kwarcu
    • 1-wire (linia DQ czujnika DS18B20) przez opornik 33Ω do portu P3.2, z rezystorem podciągającym 4,7kΩ do +5V
    • wspólne anody poszczególnych cyfr wyświetlacza są podłączone do kolektorów tranzystorów PNP, ich emitery do +5V a bazy szeregowo przez rezystory 4,7kΩ do portów odpowiednio P3.5, P3.4 i P3.3
    • cały port P1 jest podłączony prosto do baz układu ULN2803A z drabinką rezystorową 8 x 4,7kΩ podciągającą do +5V
    • kolektory układu ULN2803A idą szeregowo przez rezystory 33Ω na katody wyświetlacza

      Wynika z tego następujące przyporządkowanie portów mikrokontrolera do katod wyświetlacza:
    • P1.0 - katoda E (segment pionowy dół lewo)
    • P1.1 - katoda D (segment poziomy dół)
    • P1.2 - katoda C (segment pionowy dół prawo)
    • P1.3 - katoda G (segment poziomy środek)
    • P1.4 - katoda F (segment pionowy góra lewo)
    • P1.5 - katoda B (segment pionowy góra prawo)
    • P1.6 - katoda A (segment poziomy góra)
    • P1.7 - katoda DP (kropka)


      Algorytm działania programu w pętli głównej:
    • zainicjuj pomiar temperatury przez czujnik
    • wyświetlaj wynik poprzedniego pomiaru na wyświetlaczu, dopóki czujnik nie skończy następnego pomiaru
    • odczytaj wynik nowego pomiaru
    • przelicz nowy wynik na cyfry dziesiętne i wyznacz segmenty do zapalenia na kolejnych pozycjach wyświetlacza (wg fontu)


      Wykorzystane elementy z przykładowymi cenami:
    • płytka uniwersalna PDU14 - 7,00 zł
    • regulator liniowy 7805 - 0,70 zł
    • kondensator 100nF - 0,50 zł
    • złącze goldpin (9 pinów) - 0,40 zł
    • opornik 10kΩ - 0,20 zł
    • kondensator 10µF - 0,70 zł
    • kwarc 22,1184MHz - 0,80 zł
    • 2 x kondensator 22pF - 0,50 zł
    • 9 x opornik 33Ω - 0,20 zł
    • 4 x opornik 4,7kΩ - 0,20 zł
    • 3 x tranzystor BC557 - 0,45 zł
    • podstawka 20-pinowa - 0,20 zł
    • mikrokontroler AT89C2051-24PI - 2,99 zł
    • drabinka rezystorowa 8 x 4,7kΩ - 0,30 zł
    • podstawka 18-pinowa - 0,20 zł
    • układ scalony ULN2803A - 1,30 zł
    • 11 x zwora - 0,00 zł
    • czujnik temperatury DS18B20 - 3,90 zł
    • przesyłka pocztowa - 6,00 zł
    • wyświetlacz Everlight ELT-542GWB/R





    Razem 26,54 zł.

    Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze Termometr z wyświetlaczem LED 7-seg, kod dla 8051 w asemblerze

    Załączniki:

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • Mitronik
  • #2 08 Lis 2011 17:08
    lildejw
    Poziom 8  

    Fajny projekt, a ciężko będzie zrobić jeszcze zapis do pamięci zewnętrznej, jakiejś flash, żeby później można było odczytać w jakiś sposób te dane na komputerze (bądź wyświetlaczu LED)? Schemat do tego, gdzieś znajdę czy muszę zrobić?

    Pozdrawiam.

  • Mitronik
  • #3 08 Lis 2011 17:29
    jankomuzykant
    Poziom 13  

    ULN nie jest niezbędny, co lepsze wyświetlacze poradzą sobie z prądem 2,5mA, który 2051 może oferować wprost z portu P1. Chyba, że ma być naprawdę jasno, to wtedy sprawa wiadoma.

  • #4 08 Lis 2011 19:43
    Sam Sung
    Poziom 31  

    Schemat mam gdzieś nabazgrany na kartce, póki co powinien wystarczyć opis połączeń powyżej.

    Jeśli chodzi o zapis do pamięci, to chyba jedynie do EEPROM na 1-wire, bo w układzie nie ma już wolnych wyprowadzeń - budowa płytki uniwersalnej jest taka, że port 3.7 jest zwarty do masy, a reszta jest wykorzystana na sterowanie wyświetlaczem, UART i 1-wire.
    Gdyby zastosować inną płykę (żeby zwolnić port 3.7) i demultiplekser (co pozwoliłoby sterować bazami tranzystorów przy pomocy dwóch, a nie trzech wejść), to możnaby podłączyć EEPROM I²C.

    Wyświetlacz nie świeci tak jasno jak się spodziewałem. Przy zasilaniu z 5 V jest dość szeroki zakres możliwych spadków napięcia na rezystorze, i te 33 omy najwyraźniej przy tych elementach są za duże. Pewnie lepiej by było zasilać z 12 V przez podwójne tranzystory, albo jeszcze zmniejszyć prąd i zrezygnować z ULN, skoro się da. Dodatkowo mam wrażenie, że poszczególne cyfry nie świecą równomiernie.

    Na czas sczytywania wyniku pomiaru i przeliczania go program wygasza wyświetlacz, bo inaczej musiałby zostać wstrzymany cykl multipleksacji wyświetlacza i za długo płynąłby za duży prąd przez diody. Widać wtedy krótkie mignięcie. Z jednej strony sygnalizuje to, że układ działa i aktualizuje temperaturę, z drugiej jednak denerwuje przy dłuższym patrzeniu. No i nie wiem, czy jest sens robić wyświetlanie na przerwaniu timer-a? Wtedy niby cykle multipeksacji będą stałe, ale z drugiej strony przerwania będą rozwalać transmisję 1-wire.

    Podczas użytkowania tego układu zaobserwowałem 2 problemy z samym czujnikiem temperatury.
    1. Czujnik sam się przestawił w tryb z 9-bitową rozdzielczością i najwyraźniej zapisał to sobie w wewnętrznym EEPROMie. Mierzy teraz szybko z rozdzielczością 0,5 stopnia. Trzebaby jednak dorobić w programie przestawianie na rozdzielczość 12-bitową.
    2. Czujnik czasem (po wielogodzinnej pracy) wpada w tryb, w którym sam się nagrzewa np. do 80-82 stopni C - najwyraźniej przy pomocy dostarczonego do niego cały czas zasilania 5 V. Komunikacja po 1-wire nadal wtedy działa. Po wyłączeniu i włączeniu zasilania temperatura stopniowo spada do temp. otoczenia. Ki diabeł? Gdyby to był tylko błąd odczytu, to po resecie układu temperatura byłaby od razu dobra, a nie jest.

  • #5 08 Lis 2011 22:04
    lildejw
    Poziom 8  

    To może opornik jakiś mniejszy rzeczywiście? Wychodziłoby na to, że na EEPROM na 1-wire da radę na pewno?

  • #6 13 Lis 2011 18:19
    Sam Sung
    Poziom 31  

    Oporników bym jednak nie zmniejszał, takie mi wyszły dla maksymalnego prądu wyświetlacza przy niekorzystnych warunkach (minimalne napięcie saturacji). Poszczególne segmenty świecą równo, różnice widać pomiędzy cyframi. Problem być może wynika z tego, że tranzystory BC557 mają w tym układzie trochę przekroczone parametry, może któryś z nich nie daje rady. Dla pewności powinny raczej być BC327.

    EEPROM na 1-wire na pewno da się podłączyć - do tej samej linii, co czujnik. Oczywiście trzeba wtedy skomplikować program, bo teraz działa przy założeniu, że na magistrali jest tylko 1 czujnik temperatury.

  • #7 23 Lis 2011 15:53
    lildejw
    Poziom 8  

    ok, mam zamiar już ruszyć z tym projekcikiem konkretnie, czyli do tych wyżej podanych komponentów dodam jeszcze tego EEPROM'a, np. taki: "M93S46-WMN6P - Pamięci EEPROM firmy ST Microelectronics, M93S Series 1 bit (64 x 16) Microwire 2.5 V SO-8 Serial EE with Block Protection, 8 pinowa obudowia SMD - SO8 (150 mil width)"
    i chcę, żeby to działało tak, że będzie wyświetlać temperaturę ciągle + co np. 8h, żeby zapisywało daną wartość temp. do pamięci, po czym będzie można w dowolnym czasie na wyświetlaczu przeglądać te wartości kolejno (trzeba jeszcze przemyśleć może jakieś określenie w jakim dniu takie 3 temperatury wystąpiły), no i kasowanie danych byłoby dobrze jeszcze wprowadzić. Zakres temp. łącznie z minusowymi wartościami, np. -30 do +50? Chyba przyda się większy wyświetlacz? Zasilanie ewentualnie może być dowolne. Te dodatkowe rzeczy można w C++ w sumie zrobić już, myślę że będzie mi łatwiej :)

    Czy ktoś byłby na tyle miły i pomógł mi ugryźć temat?

  • #8 17 Wrz 2012 14:17
    paweleq_91
    Poziom 1  

    Witajcie!
    Mam prośbę, dopiero zaczynam przygodę z elektroniką, więc prosiłbym aby ktoś z bardziej doświadczonych użytkowników stworzył schemat do tego układu. Bardzo by mi to pomogło w zrealizowaniu tego projektu. Dziękuję