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
-----------------------------------------------------------------------------------
#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;
}
}
}
-----------------------------------------------------------------------------------
#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;
}
}
}