U ovom ćemo projektu demonstrirati izradu RTC sata pomoću mikrokontrolera 8051. Ako želite raditi ovaj projekt s Arduinom, provjerite ovaj digitalni sat pomoću Arduina. Glavna komponenta ovog projekta je DS1307 koji je IC s digitalnim satom u stvarnom vremenu. Znamo detaljno o ovom IC-u.
RTC DS1307:
DS1307 serijski sat u stvarnom vremenu (RTC) sat je / kalendar male binarno kodirane decimalne (BCD) male snage, 56 bajtova NV SRAM-a. Ovaj čip radi na I²C protokolu. Sat / kalendar pruža sekunde, minute, sate, dan, datum, mjesec i godinu. Datum kraja mjeseca automatski se prilagođava za mjesece s manje od 31 dana, uključujući ispravke za prijestupnu godinu. Sat radi u 24-satnom ili 12-satnom formatu s indikatorom AM / PM. DS1307 ima ugrađeni sklop za osjet snage koji otkriva prekide napajanja i automatski se prebacuje na rezervno napajanje. Postupak mjerenja vremena nastavlja se dok dio radi iz rezervnog napajanja. Čip DS1307 može kontinuirano raditi do 10 godina.

8051 sat u stvarnom vremenu digitalni je sat za prikaz stvarnog vremena pomoću RTC DS1307, koji radi na I2C protokolu. Sat u stvarnom vremenu znači da radi i nakon nestanka struje. Kada se napajanje ponovo poveže, prikazuje stvarno vrijeme bez obzira na vrijeme i trajanje u isključenom stanju. U ovom smo projektu koristili LCD modul 16x2 za prikaz vremena u - (sat, minuta, sekunde, datum, mjesec i godina) formatu. Satovi u stvarnom vremenu obično se koriste u našim računalima, kućama, uredima i elektroničkim uređajima kako bi ih ažurirali u stvarnom vremenu.
I2C protokol je metoda povezivanja dva ili više uređaja koji koriste dvije žice na jedan sustav, pa se ovaj protokol naziva i dvožičnim protokolom. Može se koristiti za komunikaciju 127 uređaja s jednim uređajem ili procesorom. Većina I2C uređaja radi na frekvenciji od 100 Khz.
Koraci za master za upisivanje podataka u slave (način primanja slave)
- Šalje uvjet START u slave.
- Slave slave adresu slave.
- Pošaljite bit za pisanje (0) na slave.
- Primio je ACK bit od slave
- Pošalje riječi adresu robovu.
- Primio je ACK bit od slave
- Šalje podatke podređenom.
- Primio je ACK bit od slave.
- I posljednje šalje STOP uvjet slave.
Koraci za čitanje podataka s slave na master (način prijenosa slave)
- Šalje uvjet START u slave.
- Slave slave adresu slave.
- Pošaljite bit za čitanje (1) na slave.
- Primio je ACK bit od slave
- Primljeni podaci od slave
- Primio je ACK bit od slave.
- Šalje uvjet STOP podređenom.
Kružni dijagram i opis
U krugu smo koristili 3 većine komponenata DS1307, AT89S52 i LCD. Ovdje se AT89S52 koristi za čitanje vremena s DS1307 i prikaz na LCD zaslonu 16x2. DS1307 šalje vrijeme / datum pomoću dva retka na mikrokontroler.

Kružne veze je jednostavno razumjeti i prikazano je na gornjem dijagramu. Pribadače SDA i SCL čipa DS1307 spojene su na p2.1 i P2.0 pinove mikrokontrolera 89S52 s povučenim otpornikom koji zadržava zadanu vrijednost VISOKO na podacima i linijama sata. I kristalni oscilator od 32,768 kHz povezan je s DS1307chip za stvaranje kašnjenja od točno 1 sekundu. A 3 volt baterije je također povezan s pin 3 rd (BAT) od DS1307 koji čuva vrijeme prikazivati nakon neuspjeha električne energije. LCD 16x2 povezan je s 8051 u 4-bitnom načinu. Upravljački pin RS, RW i En izravno su povezani s 89S52 pinom P1.0, GND i P1.1. A podatkovni pin D0-D7 povezan je s P1.4-P1.7 od 89S52.
Tri gumba, naime SET, INC / CHANGE i Next, koriste se za podešavanje vremena sata za pričvršćivanje P2.4, P2.3 i P2.2 od 89S52 (aktivno nisko). Kada pritisnemo SET, aktivira se način postavljanja vremena i sada moramo postaviti vrijeme pomoću gumba INC / CHANGE, a gumb Next koristi se za pomicanje na znamenku. Nakon podešavanja vremena sat neprekidno radi.
Opis programa
U kod smo uključili obiteljsku knjižnicu 8051 i standardnu ulaznu izlaznu knjižnicu. I definirali igle koje smo koristili i uzeli neku varijablu za izračun.
#include
A zadana funkcija koristi se za vožnju LCD-a.
void daten () {rs = 1; en = 1; kašnjenje (1); en = 0; } void lcddata (nepotpisani char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; kašnjenje (1); en = 0; } void lcdcmd (nepotpisani znak)
Ova se funkcija koristi za inicijalizaciju RTC-a i i očitavanje vremena i datuma iz obrasca RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); sat = BCDToDecimal (I2CRead (1)); dan1 = BCDToDecimal (I2CRead (1)); datum = BCDToDecimal (I2CRead (1)); pon = BCDToDecimal (I2CRead (1)); godina = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // prikaz vremena / datuma / dana kašnjenja (1);
Te se funkcije koriste za pretvaranje decimalnog u BCD i BCD u decimalni.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; povratak dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; vrati bcd; }
Sljedeće funkcije u nastavku koriste se za I2C komunikaciju.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // funkcija "start" za komunikaciju s ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // funkcija "zaustavljanja" za komunikaciju s ds1307 RTC nepotpisani char I2CSend (nepotpisani char podaci) // slanje podataka na ds1307 {char i; char char_bit; za (i = 0; i <8; i ++) {ako (Podaci & 0x80) SDA = 1; inače SDA = 0; SCL = 1; Podaci << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; vratiti ack_bit; } nepotpisani char I2CRead (char ack) // primanje podataka s ds1307 {nepotpisani char i, Podaci = 0; SDA = 1; za (i = 0; i <8; i ++) {Podaci << = 1; učinite {SCL = 1;} while (SCL == 0); ako (SDA) Podaci- = 1; SCL = 0; } ako je (ack) SDA = 0; inače SDA = 1; SCL = 1; SCL = 0; SDA = 1; vratiti podatke; }
Funkcija set_time koristi se za podešavanje vremena u satu, a funkcija show_time u nastavku koristi se za prikaz vremena na LCD-u.
void show_time () // funkcija za prikaz vremena / datuma / dana na LCD-u {char var; lcdcmd (0x80); lcdprint ("Datum:"); sprintf (var, "% d", datum); lcdprint (var); sprintf (var, "/% d", pon); lcdprint (var); sprintf (var, "/% d", godina + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Vrijeme:"); sprintf (var, "% d", sat); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sek); lcdprint (var); lcdprint (""); // dan (dan1); lcdprint (""); }
