logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak sprawdzić działanie czujnika DS18B20 z AT89C2051 i LED?

Krzychoo.s 15 Lut 2006 23:55 1071 0
REKLAMA
  • #1 2308327
    Krzychoo.s
    Poziom 11  
    Posty: 9
    Witam. Wiem, że temat termometrów był poruszany setki razy, ale nie mogę znależć niczego co by pasowało do mojej sytuacji! Robię swój pierwszy taki układ i mam problem z uruchomieniem czujnika DS18B20. Układ jest oparty na AT89C2051 i dwóch pojedyńczych wyświetlaczach LED. Nie wiem czy czujnik wogóle reaguje, bo cały czas pojawia mi się liczba "25" na wyświetlaczu. Chodzi mi o najprostszy możliwy sposób sprawdzenia czujnika czy jest obecny i wyswietlenie temeratury. Poniżej zamieszczam kod programu, może ktoś podpowie co robię źle :D


    -----------------------------------------------------------------------------------

    #include <reg51.h>
    #include "1-Wire.h"
    #include <stdio.h>
    //dołączenie definicji rejestrów mikrokontrolera


    // definicje
    #define CONVERT_T 0x44 // DS1820 commands
    #define SKIP_ROM 0xCC
    #define READ1W 0xBE

    //deklaracje zmiennych
    unsigned char t10,t01;
    unsigned char Bd[9]; // tabela pamięci
    bit minus;
    char Tb;

    #define PortLED P1
    #define PortSW P3

    #define _A 223
    #define _B 251
    #define _C 253
    #define _D 254
    #define _F 191
    #define _G 239
    #define _E 247
    sbit Dioda = P3^1;

    #define LED_1 0xEF //239
    #define LED_2 0xDF //223
    //#define LED_off 0xFF //255


    //definicje wyglądu cyfr od 0 do 9
    char code Digits[10] = { _A & _B & _C & _D & _E & _F, //0
    _B & _C, //1
    _A & _B & _D & _E & _G, //2
    _A & _B & _C & _D & _G, //3
    _B & _C & _F & _G, //4
    _A & _C & _D & _F & _G, //5
    _A & _C & _D & _E & _F & _G, //6
    _A & _B & _C, //7
    _A & _B & _C & _D & _E & _F & _G, //8
    _A & _B & _C & _D & _F & _G }; //9

    char code Awaria[1] = {_G};


    //opóźnienie około 1 sekundy dla kwarcu 8MHz
    void Delay(unsigned int time)
    {
    unsigned int j;

    while (time-- >= 1) for (j=0; j<30; j++); //pętla FOR jest powtarzana TIME razy
    }


    void Delay1ms (unsigned int k)
    {
    unsigned int i,j;
    for (j = 0; j < k; j++)
    for (i = 0; i <= 482; i++);
    }




    //funkcja zwraca cyfrę będącą na pozycji POSITION
    char Subnumber(unsigned int number, char position)
    {
    switch (position)
    {
    case 1:
    return(number / 100); //cyfra 1 - zwróć część całkowitą z dzielenia przez 100
    case 2:
    number %= 100; //cyfra 2 - dzielenie całkowite przez 10 reszty z
    return(number / 10); //dzielenia przez 100
    case 3:
    return(number % 10); //cyfra 3 - reszta z dzielenia przez 10
    default:
    return(0); //przypadek zabroniony
    break;
    }
    }


    //początek programu głównego
    void main(void)
    {
    unsigned char tp,tpd,n;

    while (1) //pętla nieskończona
    {

    if (!one_wire_reset()) //sprawdzany jest stan urzadzenia 1-Wire, reset
    {

    one_wire_byte_write(SKIP_ROM); // pominięcie sprawdzenia nr identyfikacji
    one_wire_byte_write(CONVERT_T); // inicjalizacja pomiaru temperatury
    Delay1ms(255); // opoźnienie 350ms
    one_wire_reset();
    one_wire_byte_write(SKIP_ROM); // pominięcie sprawdzenia nr identyfikacji
    one_wire_byte_write(READ1W);

    for (n = 1;n < 10;n++)
    {
    Bd[n] = one_wire_byte_read();
    }

    tp = Bd[1];

    PortLED = Digits[Subnumber(tp,2)]; //zapis kodu cyfry numer 2 do portu
    PortSW = LED_2; //załączenie wyświetlania cyfry 2
    Delay1ms(5000);
    //PortSW = LED_off; //opóźnienie około 20ms


    PortLED = Digits[Subnumber(tp,1)]; //zapis kodu najstarszej cyfry do portu
    PortSW = LED_1; //załącznie cyfry numer 1
    Delay1ms(5000); //opóźnienie około 20ms
    //PortSW = LED_off;

    }
    else
    {


    /*Tu jest kod awaryjny, gdy urzadzenie zostanie odlaczone lub
    uszkodzone*/
    PortLED = Awaria[0];
    PortSW = LED_1;
    Delay(1000);

    PortLED = Awaria[0];
    PortSW = LED_2;
    Delay(1000);

    Dioda = 0;
    Delay(5000);
    Dioda = 1;

    }
    }

    }
  • REKLAMA
REKLAMA