I dette projekt skal vi demonstrere, hvordan man laver et RTC-ur ved hjælp af 8051 mikrokontroller. Hvis du vil lave dette projekt med Arduino, skal du kontrollere dette digitale ur ved hjælp af Arduino. Hovedkomponenten i dette projekt er DS1307, som er et realtids-digital IC. Lad os vide om denne IC i detaljer.
RTC DS1307:
DS1307 serielt realtidsur (RTC) er et lav-effekt, fuldt binært kodet decimalur / BCD-ur / kalender plus 56 byte NV SRAM. Denne chip fungerer på I²C-protokol. Uret / kalenderen indeholder oplysninger om sekunder, minutter, timer, dag, dato, måned og år. Slutningen af månedsdatoen justeres automatisk for måneder med færre end 31 dage, inklusive korrektioner for skudår. Uret fungerer i enten 24- eller 12-timers format med AM / PM-indikator. DS1307 har et indbygget power-sense-kredsløb, der registrerer strømsvigt og automatisk skifter til backupforsyningen. Tidtagning fortsætter, mens delen fungerer fra backupforsyningen. DS1307-chip kan løbende køre indtil 10 år.
8051-baseret realtidsur er et digitalt ur, der viser realtid ved hjælp af en RTC DS1307, der fungerer på I2C-protokol. Realtidsur betyder, at det kører selv efter strømsvigt. Når strømmen tilsluttes igen, viser den realtid uanset tid og varighed, den var i slukket tilstand. I dette projekt har vi brugt et 16x2 LCD-modul til at vise tiden i - (time, minut, sekunder, dato, måned og år) format. Realtidsure bruges ofte i vores computere, huse, kontorer og elektronikudstyr til at holde dem opdateret i realtid.
I2C-protokol er en metode til at forbinde to eller flere enheder ved hjælp af to ledninger til et enkelt system, og så kaldes denne protokol også som to-leder-protokol. Det kan bruges til at kommunikere 127 enheder til en enkelt enhed eller processor. De fleste af I2C-enheder kører på 100 KHz frekvens.
Trin til dataskrivemester til slave (slavemodtagelsestilstand)
- Sender START-tilstand til slave.
- Sender slave-adresse til slave.
- Send skrivbit (0) til slave.
- Modtaget ACK-bit fra slave
- Sender ord til slave.
- Modtaget ACK-bit fra slave
- Sender data til slave.
- Modtaget ACK-bit fra slave.
- Og sidst sender STOP-tilstand til slave.
Trin til aflæsning af data fra slave til master (slave-transmissionstilstand)
- Sender START-tilstand til slave.
- Sender slave-adresse til slave.
- Send læsebit (1) til slave.
- Modtaget ACK-bit fra slave
- Modtaget data fra slave
- Modtaget ACK-bit fra slave.
- Sender STOP-tilstand til slave.
Kredsløbsdiagram og beskrivelse
I kredsløb har vi brugt de fleste komponenter DS1307, AT89S52 og LCD. Her bruges AT89S52 til læsningstid fra DS1307 og viser den på 16x2 LCD-skærm. DS1307 sender tid / dato ved hjælp af 2 linjer til mikrokontrolleren.
Kredsløbstilslutninger er enkle at forstå og vises i ovenstående diagram. DS1307 chip pin SDA og SCL er forbundet til P2.1 og P2.0 ben på 89S52 mikrocontroller med pull up modstand, der holder standardværdien HIGH på data og ur linjer. Og en 32.768KHz krystaloscillator er forbundet med DS1307chip til generering af nøjagtig 1 sekunders forsinkelse. Og der er også tilsluttet et 3 volt batteri til pin 3rd (BAT) i DS1307, som holder tiden kørende efter strømafbrydelse. 16x2 LCD er forbundet med 8051 i 4-bit tilstand. Kontrolstift RS, RW og En er direkte forbundet til 89S52 pin P1.0, GND og P1.1. Og datapind D0-D7 er forbundet til P1.4-P1.7 af 89S52.
Tre knapper, nemlig SET, INC / CHANGE og Next, bruges til at indstille uretiden til pin P2.4, P2.3 og P2.2 af 89S52 (aktiv lav). Når vi trykker på SET, aktiveres tidsindstillingen, og nu skal vi indstille tiden ved hjælp af INC / CHANGE-knappen, og Next-knappen bruges til at flytte til ciffer. Efter indstilling kører uret kontinuerligt.
Programbeskrivelse
I kode har vi inkluderet 8051 familiebibliotek og et standard input outputbibliotek. Og definerede ben, som vi har brugt, og taget nogle variabler til beregninger.
#omfatte
Og den givne funktion bruges til at køre LCD.
ugyldighed daten () {rs = 1; en = 1; forsinkelse (1); en = 0; } ugyldig lcddata (usigneret char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } ugyldigt cmden (ugyldigt) {rs = 0; en = 1; forsinkelse (1); en = 0; } ugyldigt lcdcmd (usigneret char ch)
Denne funktion bruges til at initialisere RTC og læse tid og dato fra form RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sek = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); time = BCDToDecimal (I2CRead (1)); dag1 = BCDToDecimal (I2CRead (1)); dato = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); år = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // visningstid / dato / dagforsinkelse (1);
Disse funktioner bruges til at konvertere decimal til BCD og BCD til decimal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = ((((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; tilbagevenden dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; returner bcd; }
De nedenstående funktioner bruges til I2C-kommunikation.
ugyldig I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" -funktion til kommunikation med ds1307 RTC ugyldig I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "stop" -funktion til kommunikation med ds1307 RTC usigneret char I2CSend (usigneret char Data) // sende data til ds1307 {char i; char ack_bit; for (i = 0; i <8; i ++) {hvis (Data & 0x80) SDA = 1; ellers SDA = 0; SCL = 1; Data << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; returnere ack_bit; } usigneret char I2CRead (char ack) // modtage data fra ds1307 {usigneret char i, Data = 0; SDA = 1; for (i = 0; i <8; i ++) {Data << = 1; gør {SCL = 1;} mens (SCL == 0); hvis (SDA) Data- = 1; SCL = 0; } hvis (ack) SDA = 0; ellers SDA = 1; SCL = 1; SCL = 0; SDA = 1; returnere data; }
Set_time-funktionen bruges til at indstille tiden i uret og show_time-funktionen nedenfor bruges til at vise tiden på LCD.
ugyldigt show_time () // funktion til at vise tid / dato / dag på LCD {char var; lcdcmd (0x80); lcdprint ("Dato:"); sprintf (var, "% d", dato); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", år + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Time:"); sprintf (var, "% d", time); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sek); lcdprint (var); lcdprint (""); // dag (dag1); lcdprint (""); }