W tym projekcie zamierzamy zademonstrować tworzenie zegara RTC przy użyciu mikrokontrolera 8051. Jeśli chciałbyś wykonać ten projekt z Arduino, sprawdź ten zegar cyfrowy za pomocą Arduino. Głównym elementem tego projektu jest DS1307, który jest układem scalonym zegara cyfrowego czasu rzeczywistego. Dowiedzmy się szczegółowo o tym układzie scalonym.
RTC DS1307:
Szeregowy zegar czasu rzeczywistego (RTC) DS1307 to energooszczędny, w pełni kodowany binarnie zegar / kalendarz dziesiętny (BCD) oraz 56 bajtów pamięci NV SRAM. Ten chip działa na protokole I²C. Zegar / kalendarz dostarcza informacji o sekundach, minutach, godzinach, dniu, dacie, miesiącu i roku. Data końca miesiąca jest automatycznie dostosowywana do miesięcy, które mają mniej niż 31 dni, łącznie z korektami roku przestępnego. Zegar działa w formacie 24-godzinnym lub 12-godzinnym ze wskaźnikiem AM / PM. DS1307 ma wbudowany obwód wykrywania mocy, który wykrywa awarie zasilania i automatycznie przełącza się na zasilanie rezerwowe. Operacja pomiaru czasu jest kontynuowana, gdy część działa z zapasowego źródła zasilania. Układ DS1307 może działać nieprzerwanie do 10 lat.
Zegar czasu rzeczywistego oparty na 8051 to zegar cyfrowy do wyświetlania czasu rzeczywistego za pomocą RTC DS1307, który działa na protokole I2C. Zegar czasu rzeczywistego oznacza, że działa nawet po awarii zasilania. Po ponownym podłączeniu zasilania wyświetla czas rzeczywisty, niezależnie od czasu i czasu, w którym był wyłączony. W tym projekcie wykorzystaliśmy moduł LCD 16x2 do wyświetlania czasu w formacie - (godzina, minuta, sekundy, data, miesiąc i rok). Zegary czasu rzeczywistego są powszechnie stosowane w naszych komputerach, domach, biurach i urządzeniach elektronicznych do ich aktualizacji w czasie rzeczywistym.
Protokół I2C to metoda łączenia dwóch lub więcej urządzeń przy użyciu dwóch przewodów do jednego systemu, dlatego protokół ten jest również nazywany protokołem dwuprzewodowym. Może służyć do komunikacji 127 urządzeń z pojedynczym urządzeniem lub procesorem. Większość urządzeń I2C działa z częstotliwością 100 kHz.
Kroki dla zapisu danych master do slave (tryb odbioru slave)
- Wysyła warunek START do slave.
- Wysyła adres slave do slave.
- Wyślij bit zapisu (0) do slave'a.
- Odebrano bit ACK od slave'a
- Wysyła słowa adresowane do niewolnika.
- Odebrano bit ACK od slave'a
- Wysyła dane do slave.
- Odebrano bit ACK od slave'a.
- Ostatni wysyła stan STOP do slave'a.
Kroki odczytu danych ze slave do master (tryb transmisji slave)
- Wysyła warunek START do slave.
- Wysyła adres slave do slave.
- Wyślij odczyt (1) do slave.
- Odebrano bit ACK od slave'a
- Otrzymano dane od slave'a
- Odebrano bit ACK od slave'a.
- Wysyła stan STOP do slave'a.
Schemat obwodu i opis
W obwodzie zastosowaliśmy 3 większość komponentów DS1307, AT89S52 i LCD. Tutaj AT89S52 służy do odczytu czasu z DS1307 i wyświetlenia go na ekranie LCD 16x2. DS1307 przesyła czas / datę za pomocą 2 linii do mikrokontrolera.
Połączenia obwodów są łatwe do zrozumienia i pokazane na powyższym schemacie. Pin układu DS1307 SDA i SCL są podłączone do pinów P2.1 i P2.0 mikrokontrolera 89S52 z rezystorem podciągającym, który utrzymuje domyślną wartość HIGH na liniach danych i zegarowych. Oscylator kwarcowy 32,768 kHz jest połączony z układem DS1307 w celu generowania dokładnego 1-sekundowego opóźnienia. A bateria 3 V jest również podłączony do pin 3 rd (BAT) z DS1307, który odmierza czas jazdy po awarii elektrycznej. LCD 16x2 jest połączony z 8051 w trybie 4-bitowym. Styki sterujące RS, RW i En są bezpośrednio podłączone do styków P1.0, GND i P1.1 89S52. A pin danych D0-D7 jest podłączony do P1.4-P1.7 89S52.
Trzy przyciski: SET, INC / CHANGE i Next służą do ustawiania czasu zegara na pinach P2.4, P2.3 i P2.2 89S52 (aktywny niski). Kiedy wciskamy SET, aktywuje się tryb ustawiania czasu i teraz musimy ustawić czas za pomocą przycisku INC / CHANGE, a przycisk Next służy do przejścia do cyfry. Po ustawieniu czasu zegar działa w sposób ciągły.
opis programu
W kodzie zawarliśmy bibliotekę rodziny 8051 oraz bibliotekę standardowego wejścia i wyjścia. I zdefiniowaliśmy szpilki, których użyliśmy, i wzięliśmy zmienną do obliczeń.
#zawierać
A dana funkcja służy do sterowania LCD.
void daten () {rs = 1; en = 1; opóźnienie (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; opóźnienie (1); en = 0; } void lcdcmd (unsigned char ch)
Ta funkcja jest używana do inicjalizacji RTC oraz odczytu czasu i daty z formularza RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); godzina = BCDToDecimal (I2CRead (1)); dzień1 = BCDToDecimal (I2CRead (1)); data = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); rok = BCDToDecimal (I2CRead (1)); I2CStop (); czas na przedstawienie(); // wyświetl czas / datę / dzień opóźnienia (1);
Te funkcje są używane do konwersji dziesiętnych na BCD i BCD na dziesiętne.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; powrót dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; return bcd; }
Poniższe funkcje są używane do komunikacji I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // Funkcja "start" do komunikacji z ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // funkcja "stop" do komunikacji z ds1307 RTC unsigned char I2CSend (unsigned char Data) // wyślij dane do ds1307 {char i; charack_bit; for (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; w przeciwnym razie SDA = 0; SCL = 1; Dane << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; return ac_bit; } unsigned char I2CRead (char ACK) // odbierz dane z ds1307 {unsigned char i, Data = 0; SDA = 1; for (i = 0; i <8; i ++) {Data << = 1; zrobić {SCL = 1;} while (SCL == 0); jeśli (SDA) Dane- = 1; SCL = 0; } jeśli (ACK) SDA = 0; w przeciwnym razie SDA = 1; SCL = 1; SCL = 0; SDA = 1; zwrot danych; }
Funkcja set_time służy do ustawiania czasu w zegarze, a funkcja show_time poniżej służy do wyświetlania czasu na LCD.
void show_time () // funkcja do wyświetlania czasu / daty / dnia na LCD {char var; lcdcmd (0x80); lcdprint ("Data:"); sprintf (var, "% d", data); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", rok + 2000); lcdprint (var); lcdprint („”); lcdcmd (0xc0); lcdprint ("Czas:"); sprintf (var, "% d", godzina); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint („”); // dzień (dzień1); lcdprint („”); }