I dette prosjektet skal vi demonstrere å lage en RTC-klokke med 8051 mikrokontroller. Hvis du ønsker å gjøre dette prosjektet med Arduino, sjekk denne digitale klokken med Arduino. Hovedkomponenten i dette prosjektet er DS1307, som er en digital klokke IC i sanntid. La oss få vite om denne ICen i detalj.
RTC DS1307:
DS1307 seriell sanntidsklokke (RTC) er en lav-effekt, full binærkodet desimal (BCD) klokke / kalender pluss 56 byte NV SRAM. Denne brikken fungerer på I²C-protokoll. Klokken / kalenderen gir informasjon om sekunder, minutter, timer, dag, dato, måned og år. Slutt på månedsdatoen justeres automatisk for måneder med færre enn 31 dager, inkludert korreksjoner for skuddår. Klokken fungerer i enten 24- eller 12-timersformat med AM / PM-indikator. DS1307 har en innebygd strømavkjenningskrets som oppdager strømbrudd og automatisk bytter til backupforsyningen. Tidvisningsoperasjonen fortsetter mens delen opererer fra reservetilførselen. DS1307-brikken kan kontinuerlig kjøre til 10 år.
8051-basert sanntidsklokke er en digital klokke som viser sanntid ved hjelp av en RTC DS1307, som fungerer på I2C-protokollen. Sanntidsklokke betyr at den går selv etter strømbrudd. Når strømmen kobles til igjen, viser den sanntid uavhengig av tid og varighet den var i av-tilstand. I dette prosjektet har vi brukt en 16x2 LCD-modul for å vise tiden i ((time, minutt, sekunder, dato, måned og år) format. Sanntidsklokker brukes ofte i datamaskiner, hus, kontorer og elektronikkutstyr for å holde dem oppdatert i sanntid.
I2C-protokollen er en metode for å koble to eller flere enheter ved hjelp av to ledninger til et enkelt system, og så kalles denne protokollen også som to-tråds protokoll. Den kan brukes til å kommunisere 127 enheter til en enkelt enhet eller prosessor. De fleste I2C-enheter kjører på 100 KHz frekvens.
Fremgangsmåte for data skrivemester til slave (slave mottaksmodus)
- Sender START-tilstand til slave.
- Sender slave-adresse til slave.
- Send skrivebit (0) til slave.
- Mottatt ACK-bit fra slave
- Sender ordadresse til slave.
- Mottatt ACK-bit fra slave
- Sender data til slave.
- Mottatt ACK-bit fra slave.
- Og sist sender STOP-tilstand til slave.
Fremgangsmåte for dataavlesning fra slave til master (slaveoverføringsmodus)
- Sender START-tilstand til slave.
- Sender slave-adresse til slave.
- Send lesebit (1) til slave.
- Mottatt ACK-bit fra slave
- Mottatt data fra slave
- Mottatt ACK-bit fra slave.
- Sender STOP-tilstand til slave.
Kretsdiagram og beskrivelse
I kretsen har vi brukt de fleste komponentene DS1307, AT89S52 og LCD. Her brukes AT89S52 til lesetid fra DS1307 og viser den på 16x2 LCD-skjerm. DS1307 sender tid / dato ved hjelp av to linjer til mikrokontrolleren.
Kretsforbindelser er enkle å forstå og vises i diagrammet ovenfor. DS1307 chip pin SDA og SCL er koblet til P2.1 og P2.0 pins på 89S52 mikrokontroller med pull up motstand som holder standardverdien HIGH på data og klokkelinjer. Og en 32.768KHz krystalloscillator er koblet til DS1307chip for å generere nøyaktig 1 sekund forsinkelse. Og et 3 volt batteri er også koblet til pin 3 rd (BAT) av DS1307 som holder tiden på å gå etter strømbrudd. 16x2 LCD er koblet til 8051 i 4-biters modus. Kontrollpinne RS, RW og En er direkte koblet til 89S52 pin P1.0, GND og P1.1. Og datapinnen D0-D7 er koblet til P1.4-P1.7 av 89S52.
Tre knapper, nemlig SET, INC / CHANGE og Next, brukes til å stille klokketid til pin P2.4, P2.3 og P2.2 på 89S52 (aktiv lav). Når vi trykker på SET, aktiveres tidsinnstillingsmodus, og nå må vi stille inn tid ved å bruke INC / CHANGE-knappen og Neste-knappen brukes til å flytte til siffer. Etter innstilling går klokken kontinuerlig.
Programbeskrivelse
I koden har vi inkludert 8051 familiebibliotek og et standard inngangsutgangsbibliotek. Og definerte pinner som vi har brukt, og tatt noen variabler for beregninger.
#inkludere
Og den gitte funksjonen brukes til å kjøre LCD.
ugyldighet daten () {rs = 1; en = 1; forsinkelse (1); en = 0; } ugyldig lcddata (usignert char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } ugyldig cmden (ugyldig) {rs = 0; en = 1; forsinkelse (1); en = 0; } ugyldig lcdcmd (usignert char ch)
Denne funksjonen brukes til å initialisere RTC og og lese tid og dato fra skjema 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 funksjonene brukes til å konvertere desimal til BCD og BCD til desimal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); des = a + b; retur des; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((desimalByte / 10) << 4); b = (desimalByte% 10); bcd = ab; returner bcd; }
Funksjonene nedenfor er brukt for I2C-kommunikasjon.
ugyldig I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" -funksjon for kommunikasjon med ds1307 RTC ugyldig I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "stopp" -funksjon for å kommunisere med ds1307 RTC usignert char I2CSend (usignert char Data) // sende data til ds1307 {char i; røye 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; } usignert char I2CRead (char ack) // motta data fra ds1307 {usignert char i, Data = 0; SDA = 1; for (i = 0; i <8; i ++) {Data << = 1; gjø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-funksjonen brukes til å stille inn klokkeslettet og show_time-funksjonen nedenfor brukes til å vise tid på LCD.
ugyldig show_time () // funksjon for å vise tid / dato / dag på LCD {char var; lcdcmd (0x80); lcdprint ("Date:"); 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 (""); }