In dit project gaan we demonstreren hoe je een RTC Clock maakt met behulp van een 8051 microcontroller. Als je dit project met Arduino wilt doen, controleer dan deze digitale klok met Arduino. Het belangrijkste onderdeel van dit project is DS1307, een realtime digitale klok-IC. Laten we dit IC in detail kennen.
RTC DS1307:
De DS1307 seriële real-time klok (RTC) is een low-power, volledig binair gecodeerde decimale (BCD) klok / kalender plus 56 bytes NV SRAM. Deze chip werkt op het I²C-protocol. De klok / kalender geeft informatie over seconden, minuten, uren, dag, datum, maand en jaar. De maandeinde-datum wordt automatisch aangepast voor maanden met minder dan 31 dagen, inclusief correcties voor schrikkeljaar. De klok werkt in het 24-uurs of 12-uurs formaat met AM / PM-indicator. De DS1307 heeft een ingebouwd power-sense circuit dat stroomstoringen detecteert en automatisch overschakelt naar de back-upvoeding. De tijdwaarneming gaat door terwijl het onderdeel werkt vanuit de reservevoeding. DS1307-chip kan continu werken tot 10 jaar.
De op 8051 gebaseerde real-time klok is een digitale klok om real-time weer te geven met behulp van een RTC DS1307, die werkt op het I2C-protocol. Real-time klok betekent dat het zelfs werkt na een stroomstoring. Wanneer de stroom opnieuw wordt aangesloten, geeft het de realtime weer, ongeacht de tijd en duur dat het uit was. In dit project hebben we een 16x2 LCD-module gebruikt om de tijd weer te geven in - (uur, minuut, seconden, datum, maand en jaar) formaat. Realtime klokken worden vaak gebruikt in onze computers, huizen, kantoren en elektronische apparaten om ze in realtime up-to-date te houden.
Het I2C-protocol is een methode om twee of meer apparaten met behulp van twee draden op één systeem aan te sluiten, en daarom wordt dit protocol ook wel een tweedraadsprotocol genoemd. Het kan worden gebruikt om 127 apparaten te communiceren met een enkel apparaat of processor. De meeste I2C-apparaten werken op een frequentie van 100 kHz.
Stappen voor het schrijven van gegevens van master naar slave (ontvangmodus slave)
- Zendt START-voorwaarde naar slaaf.
- Stuurt het slaafadres naar de slaaf.
- Stuur schrijfbit (0) naar slave.
- ACK-bit ontvangen van slaaf
- Zendt woorden adres naar slaaf.
- ACK-bit ontvangen van slaaf
- Stuurt gegevens naar de slaaf.
- ACK-bit ontvangen van slaaf.
- En als laatste stuurt de STOP-voorwaarde naar de slaaf.
Stappen voor het lezen van gegevens van slave naar master (slaaf-verzendmodus)
- Zendt START-voorwaarde naar slaaf.
- Stuurt het slaafadres naar de slaaf.
- Stuur leesbit (1) naar de slaaf.
- ACK-bit ontvangen van slaaf
- Gegevens ontvangen van slaaf
- ACK-bit ontvangen van slaaf.
- Stuurt STOP-voorwaarde naar de slaaf.
Schakelschema en beschrijving
In het circuit hebben we de meeste 3 componenten DS1307, AT89S52 en LCD gebruikt. Hier wordt AT89S52 gebruikt om de tijd van DS1307 af te lezen en weer te geven op een 16x2 LCD-scherm. DS1307 stuurt tijd / datum via 2 regels naar de microcontroller.
Circuitverbindingen zijn eenvoudig te begrijpen en worden weergegeven in het bovenstaande diagram. DS1307-chippin SDA en SCL zijn verbonden met P2.1- en P2.0-pinnen van 89S52-microcontroller met pull-up-weerstand die de standaardwaarde HOOG houdt op data- en kloklijnen. En een kristaloscillator van 32,768 kHz is verbonden met DS1307-chip voor het genereren van een vertraging van exact 1 seconde. En een 3 volt batterij is ook aangesloten op pin 3 rd (BAT) van DS1307 die de tijd laat lopen na stroomuitval. 16x2 LCD is verbonden met 8051 in 4-bits modus. Stuurpen RS, RW en En zijn direct verbonden met 89S52 pin P1.0, GND en P1.1. En datapin D0-D7 is verbonden met P1.4-P1.7 van 89S52.
Drie knoppen namelijk SET, INC / CHANGE en Next worden gebruikt om de kloktijd in te stellen op pin P2.4, P2.3 en P2.2 van 89S52 (actief laag). Wanneer we op SET drukken, wordt de tijdinstelmodus geactiveerd en nu moeten we de tijd instellen met de knop INC / CHANGE en de knop Volgende wordt gebruikt om naar een cijfer te gaan. Na het instellen van de tijd loopt de klok continu.
programma beschrijving
In code hebben we de 8051-familiebibliotheek en een standaard invoeruitvoerbibliotheek opgenomen. En gedefinieerde pinnen die we hebben gebruikt, en een variabele genomen voor berekeningen.
# omvatten
En de gegeven functie wordt gebruikt voor het aansturen van LCD.
void daten () {rs = 1; en = 1; vertraging (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; vertraging (1); en = 0; } void lcdcmd (unsigned char ch)
Deze functie wordt gebruikt voor het initialiseren van RTC en het lezen van tijd en datum uit het RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); uur = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); date = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); jaar = BCDToDecimal (I2CRead (1)); I2CStop (); show Time(); // weergave tijd / datum / dag vertraging (1);
Deze functies worden gebruikt voor het converteren van decimaal naar BCD en BCD naar decimaal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; terugkeer dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; terug bcd; }
De onderstaande functies worden gebruikt voor I2C-communicatie.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" -functie voor communicatie met ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "stop" -functie voor communicatie met ds1307 RTC unsigned char I2CSend (unsigned char Data) // stuur data naar ds1307 {char i; char ack_bit; voor (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; anders SDA = 0; SCL = 1; Gegevens << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; retourneer ack_bit; } unsigned char I2CRead (char ack) // ontvang gegevens van ds1307 {unsigned char i, Data = 0; SDA = 1; voor (i = 0; i <8; i ++) {Data << = 1; do {SCL = 1;} while (SCL == 0); if (SDA) Data- = 1; SCL = 0; } if (ack) SDA = 0; anders SDA = 1; SCL = 1; SCL = 0; SDA = 1; gegevens teruggeven; }
De functie set_time wordt gebruikt om de tijd in de klok in te stellen en de onderstaande functie show_time wordt gebruikt om de tijd op het LCD-scherm weer te geven.
void show_time () // functie om tijd / datum / dag weer te geven op LCD {char var; lcdcmd (0x80); lcdprint ("Datum:"); sprintf (var, "% d", datum); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", jaar + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Tijd:"); sprintf (var, "% d", uur); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint (""); // dag (dag1); lcdprint (""); }