In diesem Projekt werden wir die Herstellung einer RTC-Uhr mit einem 8051-Mikrocontroller demonstrieren. Wenn Sie dieses Projekt mit Arduino durchführen möchten, überprüfen Sie diese Digitaluhr mit Arduino. Die Hauptkomponente dieses Projekts ist DS1307, ein Echtzeit-Digitaluhr-IC. Informieren Sie sich ausführlich über diesen IC.
RTC DS1307:
Die serielle Echtzeituhr (RTC) DS1307 ist eine vollwertige BCD-Uhr (Full Binary Coded Decimal Clock) / Kalender mit 56 Byte NV-SRAM. Dieser Chip arbeitet mit dem I²C-Protokoll. Die Uhr / der Kalender enthält Informationen zu Sekunden, Minuten, Stunden, Tag, Datum, Monat und Jahr. Das Monatsende wird automatisch für Monate mit weniger als 31 Tagen angepasst, einschließlich Korrekturen für das Schaltjahr. Die Uhr arbeitet entweder im 24-Stunden- oder im 12-Stunden-Format mit AM / PM-Anzeige. Der DS1307 verfügt über eine integrierte Stromerfassungsschaltung, die Stromausfälle erkennt und automatisch auf die Backup-Versorgung umschaltet. Der Zeitnehmungsvorgang wird fortgesetzt, während das Teil von der Sicherungsversorgung aus betrieben wird. Der DS1307-Chip kann bis zu 10 Jahre ununterbrochen laufen.
Die 8051-basierte Echtzeituhr ist eine Digitaluhr zur Anzeige von Echtzeit mithilfe einer RTC DS1307, die mit dem I2C-Protokoll arbeitet. Echtzeituhr bedeutet, dass sie auch nach einem Stromausfall läuft. Wenn die Stromversorgung wieder hergestellt wird, wird die Echtzeit angezeigt, unabhängig von der Zeit und Dauer, in der sie ausgeschaltet war. In diesem Projekt haben wir ein 16x2-LCD-Modul verwendet, um die Uhrzeit im Format (Stunde, Minute, Sekunden, Datum, Monat und Jahr) anzuzeigen. Echtzeituhren werden üblicherweise in unseren Computern, Häusern, Büros und elektronischen Geräten verwendet, um sie in Echtzeit auf dem neuesten Stand zu halten.
Das I2C-Protokoll ist eine Methode zum Verbinden von zwei oder mehr Geräten über zwei Drähte mit einem einzigen System. Daher wird dieses Protokoll auch als Zweidrahtprotokoll bezeichnet. Es kann verwendet werden, um 127 Geräte an ein einzelnes Gerät oder einen einzelnen Prozessor zu kommunizieren. Die meisten I2C-Geräte werden mit einer Frequenz von 100 kHz betrieben.
Schritte zum Datenschreiben von Master zu Slave (Slave-Empfangsmodus)
- Sendet die START-Bedingung an den Slave.
- Sendet die Slave-Adresse an den Slave.
- Schreibbit (0) an Slave senden.
- ACK-Bit vom Slave empfangen
- Sendet die Wortadresse an den Sklaven.
- ACK-Bit vom Slave empfangen
- Sendet Daten an den Slave.
- ACK-Bit vom Slave empfangen.
- Und zuletzt sendet STOP-Bedingung an Slave.
Schritte zum Lesen von Daten von Slave zu Master (Slave-Sendemodus)
- Sendet die START-Bedingung an den Slave.
- Sendet die Slave-Adresse an den Slave.
- Lesebit (1) an Slave senden.
- ACK-Bit vom Slave empfangen
- Vom Slave empfangene Daten
- ACK-Bit vom Slave empfangen.
- Sendet die STOP-Bedingung an den Slave.
Schaltplan und Beschreibung
In der Schaltung haben wir 3 der meisten Komponenten DS1307, AT89S52 und LCD verwendet. Hier wird AT89S52 verwendet, um die Zeit von DS1307 zu lesen und auf einem 16x2-LCD-Bildschirm anzuzeigen. DS1307 sendet Uhrzeit / Datum über 2 Leitungen an den Mikrocontroller.
Schaltungsverbindungen sind einfach zu verstehen und werden im obigen Diagramm gezeigt. Der DS1307-Chip-Pin SDA und SCL sind mit den P2.1- und P2.0-Pins des 89S52-Mikrocontrollers mit Pull-up-Widerstand verbunden, der den Standardwert HIGH an Daten- und Taktleitungen hält. Ein 32,768-kHz-Quarzoszillator ist mit dem DS1307-Chip verbunden, um eine Verzögerung von genau 1 Sekunde zu erzeugen. Und eine 3 - Volt - Batterie ist auch mit Pin 3 verbunden rd (BAT) von DS1307, die Zeit läuft nach Stromausfall hält. Das 16x2-LCD ist im 4-Bit-Modus mit dem 8051 verbunden. Die Steuerpins RS, RW und En sind direkt mit den 89S52-Pins P1.0, GND und P1.1 verbunden. Der Datenstift D0-D7 ist mit P1.4-P1.7 von 89S52 verbunden.
Drei Tasten, nämlich SET, INC / CHANGE und Next, dienen zum Einstellen der Uhrzeit auf Pin P2.4, P2.3 und P2.2 von 89S52 (aktiv niedrig). Wenn wir SET drücken, wird der Zeiteinstellungsmodus aktiviert und jetzt müssen wir die Zeit mit der INC / CHANGE-Taste einstellen. Die Next-Taste wird zum Wechseln zur Ziffer verwendet. Nach dem Einstellen der Zeit läuft die Uhr ununterbrochen.
Programm Beschreibung
In den Code haben wir die 8051-Familienbibliothek und eine Standardeingabe-Ausgabebibliothek aufgenommen. Und definierte Pins, die wir verwendet haben, und einige Variablen für Berechnungen.
#einschließen
Die angegebene Funktion wird zum Ansteuern des LCD verwendet.
void daten () {rs = 1; en = 1; Verzögerung (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; Verzögerung (1); en = 0; } void lcdcmd (unsigned char ch)
Diese Funktion wird zum Initialisieren der RTC und zum Lesen von Uhrzeit und Datum vom Formular RTC IC verwendet.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); Stunde = BCDToDecimal (I2CRead (1)); Tag1 = BCDToDecimal (I2CRead (1)); Datum = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); Jahr = BCDToDecimal (I2CRead (1)); I2CStop (); Show Time(); // Uhrzeit / Datum / Tagesverzögerung anzeigen (1);
Diese Funktionen werden zum Konvertieren von Dezimalzahlen in BCD und BCD in Dezimalzahlen verwendet.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = ((((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; return dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; return bcd; }}
Die folgenden Funktionen werden für die I2C-Kommunikation verwendet.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "Start" -Funktion für die Kommunikation mit ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "Stopp" -Funktion für die Kommunikation mit ds1307 RTC vorzeichenloses Zeichen I2CSend (vorzeichenlose Zeichen Daten) // Daten an ds1307 senden {char i; char ack_bit; für (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; sonst SDA = 0; SCL = 1; Daten << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; return ack_bit; } vorzeichenloses Zeichen I2CRead (Zeichen ack) // Daten von ds1307 empfangen {vorzeichenloses Zeichen i, Daten = 0; SDA = 1; für (i = 0; i <8; i ++) {Daten << = 1; do {SCL = 1;} while (SCL == 0); if (SDA) Data- = 1; SCL = 0; } if (ack) SDA = 0; sonst SDA = 1; SCL = 1; SCL = 0; SDA = 1; Daten zurückgeben; }}
Die Funktion set_time wird verwendet, um die Uhrzeit einzustellen, und die Funktion show_time unten wird verwendet, um die Uhrzeit auf dem LCD anzuzeigen.
void show_time () // Funktion zum Anzeigen von Uhrzeit / Datum / Tag auf dem LCD {char var; lcdcmd (0x80); lcdprint ("Datum:"); Sprintf (var, "% d", Datum); lcdprint (var); Sprintf (var, "/% d", mon); lcdprint (var); Sprintf (var, "/% d", Jahr + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Zeit:"); Sprintf (var, "% d", Stunde); lcdprint (var); Sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint (""); // Tag (Tag1); lcdprint (""); }}