I det här projektet kommer vi att demonstrera att skapa en RTC-klocka med 8051 mikrokontroller. Om du vill göra detta projekt med Arduino, kontrollera den här digitala klockan med Arduino. Huvudkomponenten i detta projekt är DS1307, som är en digital klocka IC i realtid. Låt oss veta om denna IC i detalj.
RTC DS1307:
DS1307 seriell realtidsklocka (RTC) är en låg-effekt, full binärkodad decimal (BCD) klocka / kalender plus 56 byte NV SRAM. Detta chip fungerar på I²C-protokoll. Klockan / kalendern ger information om sekunder, minuter, timmar, dag, datum, månad och år. Slutet av månadsdatumet justeras automatiskt för månader med färre än 31 dagar, inklusive korrigeringar för skottår. Klockan fungerar antingen i 24-timmars- eller 12-timmarsformat med AM / PM-indikator. DS1307 har en inbyggd strömavkänningskrets som upptäcker strömavbrott och växlar automatiskt till reservmatningen. Tidtagning fortsätter medan delen fungerar från reservtillförseln. DS1307-chip kan kontinuerligt köras till 10 år.
8051-baserad realtidsklocka är en digital klocka som visar realtid med hjälp av en RTC DS1307, som fungerar på I2C-protokoll. Realtidsklocka betyder att den går även efter strömavbrott. När strömmen återansluts visar den realtid oavsett vilken tid och varaktighet den var i från-tillstånd. I detta projekt har vi använt en 16x2 LCD-modul för att visa tiden i - (timme, minut, sekunder, datum, månad och år) -format. Realtidsklockor används ofta i våra datorer, hus, kontor och elektroniska enheter för att hålla dem uppdaterade i realtid.
I2C-protokollet är en metod för att ansluta två eller flera enheter med två kablar till ett enda system, och så kallas detta protokoll också som tvåtrådsprotokoll. Den kan användas för att kommunicera 127 enheter till en enda enhet eller processor. De flesta av I2C-enheter körs på 100 KHz-frekvens.
Steg för dataskrivmästare till slav (slavmottagningsläge)
- Skickar START-villkor till slav.
- Skickar slavadress till slav.
- Skicka skrivbit (0) till slav.
- Fick ACK-bit från slav
- Skickar ordadress till slav.
- Fick ACK-bit från slav
- Skickar data till slav.
- Fick ACK-bit från slav.
- Och sist skickar STOP-villkor till slav.
Steg för dataläsning från slav till master (slavsändningsläge)
- Skickar START-villkor till slav.
- Skickar slavadress till slav.
- Skicka läsbit (1) till slav.
- Fick ACK-bit från slav
- Mottagen data från slav
- Fick ACK-bit från slav.
- Skickar STOP-villkor till slav.
Kretsschema och beskrivning
I krets har vi använt de flesta tre komponenterna DS1307, AT89S52 och LCD. Här används AT89S52 för att läsa tid från DS1307 och visa den på 16x2 LCD-skärm. DS1307 skickar tid / datum med två rader till mikrokontrollern.
Kretsanslutningar är enkla att förstå och visas i ovanstående diagram. DS1307-chipstift SDA och SCL är anslutna till P2.1- och P2.0-stift på 89S52-mikrokontroller med pull-up-motstånd som håller standardvärdet HIGH vid data- och klocklinjer. Och en 32.768KHz kristalloscillator är ansluten till DS1307chip för att generera exakt 1 sekunders fördröjning. Och en 3 volts batteri är också ansluten till stift 3 rd (BAT) hos DS1307 som håller tiden kör efter misslyckande elektricitet. 16x2 LCD är ansluten till 8051 i 4-bitars läge. Styrstift RS, RW och En är direkt anslutna till 89S52 stift P1.0, GND och P1.1. Och datapinnen D0-D7 är ansluten till P1.4-P1.7 av 89S52.
Tre knappar, nämligen SET, INC / CHANGE och Next används för att ställa in klocktid för att stifta P2.4, P2.3 och P2.2 på 89S52 (aktiv låg). När vi trycker på SET aktiveras tidsinställningsläget och nu måste vi ställa in tiden med INC / CHANGE-knappen och Nästa-knappen används för att flytta till siffra. Efter inställning går klockan kontinuerligt.
Programbeskrivning
I koden har vi inkluderat 8051 familjebibliotek och ett standardinmatningsbibliotek. Och definierade stift som vi har använt och tagit några variabler för beräkningar.
#omfatta
Och den givna funktionen används för att köra LCD.
ogiltig daten () {rs = 1; en = 1; fördröjning (1); en = 0; } ogiltig lcddata (osignerad char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } ogiltigt cmden (ogiltigt) {rs = 0; en = 1; fördröjning (1); en = 0; } ogiltig lcdcmd (osignerad char ch)
Denna funktion används för att initialisera RTC och och läsa tid och datum från formulär RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sek = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); timme = BCDToDecimal (I2CRead (1)); dag1 = BCDToDecimal (I2CRead (1)); datum = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); år = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // visningstid / datum / dagfördröjning (1);
Dessa funktioner används för att konvertera decimal till BCD och BCD till decimal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = ((((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; retur dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; returnera bcd; }
Nedanstående funktioner används för I2C-kommunikation.
ogiltig I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" -funktion för kommunikation med ds1307 RTC ogiltig I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "stopp" -funktion för att kommunicera med ds1307 RTC osignerad char I2CSend (osignerad char Data) // skicka data till ds1307 {char i; char ack_bit; för (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; annars SDA = 0; SCL = 1; Data << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; returnera ack_bit; } osignerad char I2CRead (char ack) // ta emot data från ds1307 {osignerad char i, Data = 0; SDA = 1; för (i = 0; i <8; i ++) {Data << = 1; gör {SCL = 1;} medan (SCL == 0); om (SDA) Data- = 1; SCL = 0; } om (ack) SDA = 0; annars SDA = 1; SCL = 1; SCL = 0; SDA = 1; returnera data; }
Set_time-funktionen används för att ställa in tiden i klockan och show_time-funktionen nedan används för att visa tiden på LCD.
ogiltig show_time () // funktion för att visa tid / datum / dag på LCD {char var; lcdcmd (0x80); lcdprint ("Date:"); sprintf (var, "% d", datum); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", år + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Time:"); sprintf (var, "% d", timme); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sek); lcdprint (var); lcdprint (""); // dag (dag1); lcdprint (""); }