Ebben a projektben bemutatjuk, hogyan készítünk RTC órát a 8051 mikrovezérlő használatával. Ha ezt a projektet az Arduino-val szeretné elvégezni, ellenőrizze ezt a digitális órát az Arduino segítségével. A projekt fő eleme a DS1307, amely egy valós idejű digitális óra IC. Részletesen tájékoztat erről az IC-ről.
RTC DS1307:
A DS1307 soros valós idejű óra (RTC) alacsony fogyasztású, teljes bináris kódolású decimális (BCD) óra / naptár, plusz 56 bájt NV SRAM. Ez a chip I²C protokollon működik. Az óra / naptár másodperceket, perceket, órákat, napot, dátumot, hónapot és évet ad meg. A hónap végi dátum automatikusan módosul a 31 napnál rövidebb hónapokra, beleértve a szökőév korrekcióit is. Az óra 24 órás vagy 12 órás formátumban működik, AM / PM jelzővel. A DS1307 beépített áramérzékelő áramkörrel rendelkezik, amely észleli az áramkimaradásokat, és automatikusan átvált a tartalék tápegységre. Az időmérés folytatódik, míg az alkatrész a tartalék tápegységből működik. A DS1307 chip folyamatosan fut 10 évig.
A 8051 alapú valós idejű óra egy digitális óra , amely valós idejű képet jelenít meg egy RTC DS1307 segítségével, amely I2C protokollon működik. A valós idejű óra azt jelenti, hogy áramkimaradás után is működik. Az áramellátás újbóli bekapcsolásakor a valós idejét jeleníti meg, függetlenül a kikapcsolt állapotától és időtartamától. Ebben a projektben egy 16x2 LCD modult használtunk az idő - (óra, perc, másodperc, dátum, hónap és év) formátumban történő megjelenítésére. A valós idejű órákat gyakran használják számítógépeinkben, házainkban, irodáinkban és elektronikai készülékeinkben, hogy valós időben frissítsék őket.
Az I2C protokoll két vagy több eszköz két vezeték használatával történő összekapcsolása egyetlen rendszerrel, ezért ezt a protokollt két vezetékes protokollnak is nevezik. Használható 127 eszköz egyetlen eszközzel vagy processzorral történő kommunikációjára. Az I2C eszközök többsége 100Khz frekvencián működik.
Az adatírási mester és a szolga közötti lépések (szolga vételi mód)
- START feltételt küld a rabszolgának.
- Rabszolga címet küld rabszolgának.
- Írási bit (0) küldése a rabszolgának.
- ACK bitet kapott a rabszolgától
- Címszavakat küld a rabszolgának.
- ACK bitet kapott a rabszolgától
- Adatokat küld rabszolgának.
- ACK bitet kapott a rabszolgától.
- És az utolsó STOP feltételt küld a rabszolgának.
Az adatok leolvasása a slave-től masterig (slave-továbbítási mód)
- START feltételt küld a rabszolgának.
- Rabszolga címet küld rabszolgának.
- Küldje el az olvasóbitet (1) a rabszolgának.
- ACK bitet kapott a rabszolgától
- Adatokat kapott a rabszolgától
- ACK bitet kapott a rabszolgától.
- STOP feltételt küld a rabszolgának.
Áramkör diagram és leírás
Az áramkörben a legtöbb DS1307, AT89S52 és LCD komponenst használtuk. Itt az AT89S52-t használják a DS1307-től való olvasás idejére, és 16x2 LCD-képernyőn jeleníti meg. A DS1307 2 sort használva elküldi az időt / dátumot a mikrovezérlőnek.
Az áramköri csatlakozásokat egyszerűen meg lehet érteni, és a fenti ábra mutatja. Az SDA és az SCL DS1307 chipcsap a 89S52 mikrovezérlő P2.1 és P2.0 érintkezőihez van csatlakoztatva, felhúzási ellenállással, amely az alap- és HIGH értéket tartja az adat- és az óravonalakon. És egy 32,768KHz kristályoszcillátor csatlakozik a DS1307chip-hez, hogy pontosan 1 másodperces késleltetést generáljon. És egy 3 voltos akkumulátor is csatlakoztatva van a pin 3 rd (BAT) a DS1307, amely megtartja idő után futó áramszünet. A 16x2 LCD-t a 8051-hez csatlakoztatják 4 bites módban. Az RS, RW és En vezérlőcsapok közvetlenül kapcsolódnak a 89S52 P1.0, GND és P1.1 csapokhoz. És a D0-D7 adatcsatlakozó a 89S52 P1.4-P1.7-hez csatlakozik.
Három gomb, nevezetesen a SET, az INC / CHANGE és a Next használható az óraidő beállítására a 89S52 P2.4, P2.3 és P2.2 rögzítéséhez (aktív alacsony). Amikor megnyomjuk a SET gombot, az időbeállítás mód aktiválódik, és most az INC / CHANGE gombbal kell beállítanunk az időt, és a Next gombbal számjegyre léphetünk. Az idő beállítása után az óra folyamatosan működik.
A program leírása
A kódba belefoglaltunk 8051 családi könyvtárat és egy szabványos bemeneti kimeneti könyvtárat. És definiált csapokat, amelyeket használtunk, és vettünk néhány változót a számításokhoz.
#include
Az adott funkció pedig az LCD vezetésére szolgál.
void daten () {rs = 1; en = 1; késés (1); en = 0; } void lcddata (előjel nélküli char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; késés (1); en = 0; } void lcdcmd (aláíratlan karakter ch)
Ezt a funkciót használjuk az RTC inicializálására, és az RTC IC űrlapról olvassuk el az időt és a dátumot.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); óra = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); dátum = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); év = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // idő / dátum / nap késés megjelenítése (1);
Ezeket a függvényeket használják a decimális BCD-re és a BCD decimálissá konvertálására.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; visszatér december; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimális bájt / 10) << 4); b = (decimális bájt% 10); bcd = ab; return bcd; }
Az alábbi funkciókat használjuk az I2C kommunikációhoz.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" függvény a ds1307 RTC kommunikációjához void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "stop" funkció a kommunikációhoz ds1307 RTC aláíratlan char I2CSend (unsigned char Data) // adatokat küld a ds1307-nek {char i; char ack_bit; for (i = 0; i <8; i ++) {if (Adat & 0x80) SDA = 1; máskülönben SDA = 0; SCL = 1; Adatok << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; return ack_bit; } unsigned char I2CRead (char ack) // adatokat fogad a ds1307-től {unsigned char i, Data = 0; SDA = 1; for (i = 0; i <8; i ++) {Adatok << = 1; csináld {SCL = 1;} közben (SCL == 0); ha (SDA) Data- = 1; SCL = 0; } if (ack) SDA = 0; máskülönben SDA = 1; SCL = 1; SCL = 0; SDA = 1; return adat; }
A set_time funkció az idő beállítására szolgál az órában, az alábbi show_time funkció pedig az idő megjelenítésére az LCD-n.
void show_time () // funkció az idő / dátum / nap megjelenítésére az LCD-n {char var; lcdcmd (0x80); lcdprint ("Dátum:"); sprintf (var, "% d", dátum); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", év + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Idő:"); sprintf (var, "% d", óra); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint (""); // nap (1. nap); lcdprint (""); }