V tomto projektu ukážeme výrobu hodin RTC pomocí mikrokontroléru 8051. Pokud byste chtěli tento projekt udělat s Arduinem, zkontrolujte tyto digitální hodiny pomocí Arduina. Hlavní složkou tohoto projektu je DS1307, což jsou digitální hodiny IC v reálném čase. Dáme vědět o tomto IC podrobně.
RTC DS1307:
Sériové hodiny reálného času (RTC) DS1307 jsou nízkopříkonové hodiny / kalendář s plným binárním kódováním v desítkovém formátu (BCD) plus 56 bajtů NV SRAM. Tento čip pracuje na protokolu I²C. Hodiny / kalendář poskytují informace o sekundách, minutách, hodinách, dni, datu, měsíci a roce. Datum konce měsíce je automaticky upraveno pro měsíce s méně než 31 dny, včetně oprav pro přestupný rok. Hodiny pracují ve 24hodinovém nebo 12hodinovém formátu s indikátorem AM / PM. DS1307 má zabudovaný obvod snímání výkonu, který detekuje výpadky napájení a automaticky přepíná na záložní zdroj. Operace měření času pokračuje, zatímco součást pracuje ze záložního zdroje. Čip DS1307 může nepřetržitě běžet až 10 let.
Hodiny reálného času založené na 8051 jsou digitální hodiny pro zobrazení reálného času pomocí RTC DS1307, který pracuje na protokolu I2C. Hodiny reálného času znamenají, že běží i po výpadku napájení. Po opětovném připojení napájení se zobrazí skutečný čas bez ohledu na čas a dobu, po kterou byl ve vypnutém stavu. V tomto projektu jsme použili 16x2 LCD modul k zobrazení času ve formátu - (hodina, minuta, sekundy, datum, měsíc a rok). Hodiny v reálném čase se běžně používají v našich počítačích, domech, kancelářích a elektronických zařízeních pro jejich aktualizaci v reálném čase.
Protokol I2C je metoda připojení dvou nebo více zařízení pomocí dvou vodičů k jednomu systému, a proto se tento protokol také nazývá dvouvodičový protokol. Lze jej použít ke komunikaci 127 zařízení s jedním zařízením nebo procesorem. Většina zařízení I2C pracuje na frekvenci 100 kHz.
Kroky pro master zápisu dat na slave (režim příjmu slave)
- Odešle podmínku START otrokovi.
- Odešle slave adresu slave.
- Odešlete bit bit (0) slave.
- Bit ACK přijat od slave
- Odešle slovům adresu otrokovi.
- Bit ACK přijat od slave
- Odešle data otrokovi.
- Bit ACK přijat od slave.
- A poslední pošle podmínku STOP otrokovi.
Kroky pro čtení dat ze slave na master (režim přenosu slave)
- Odešle podmínku START otrokovi.
- Odešle slave adresu slave.
- Odeslat přečtený bit (1) podřízenému zařízení.
- Bit ACK přijat od slave
- Přijatá data od slave
- Bit ACK přijat od slave.
- Odešle podmínku STOP otrokovi.
Schéma zapojení a popis
V obvodu jsme použili 3 většinu komponent DS1307, AT89S52 a LCD. Zde se AT89S52 používá ke čtení času z DS1307 a jeho zobrazení na 16x2 LCD obrazovce. DS1307 odesílá čas / datum pomocí 2 řádků do mikrokontroléru.
Zapojení obvodů je snadno pochopitelné a je znázorněno na výše uvedeném schématu. Čipový kolík DS1307 SDA a SCL jsou připojeny k pinům P2.1 a P2.0 mikrokontroléru 89S52 s vytahovacím rezistorem, který udržuje výchozí hodnotu HIGH na datových a hodinových linkách. A krystalický oscilátor 32,768 kHz je připojen k čipu DS1307 pro generování přesného zpoždění 1 sekundy. A 3 volt baterie je také připojen na pin 3 rd (BAT) z DS1307, který udržuje čas běží po výpadku elektřiny. 16x2 LCD je připojen k 8051 ve 4bitovém režimu. Ovládací kolíky RS, RW a En jsou přímo připojeny k kolíku 89S52 P1.0, GND a P1.1. A datový pin D0-D7 je připojen k P1,4-P1,7 z 89S52.
Tři tlačítka, jmenovitě SET, INC / CHANGE a Next, se používají k nastavení času na pin P2.4, P2.3 a P2.2 na 89S52 (aktivní nízká). Když stiskneme SET, aktivuje se režim nastavení času a nyní musíme nastavit čas pomocí tlačítka INC / CHANGE a tlačítko Další se používá k přechodu na číslici. Po nastavení času běží hodiny nepřetržitě.
Popis programu
V kódu jsme zahrnuli 8051 rodinnou knihovnu a standardní vstupní výstupní knihovnu. A definované piny, které jsme použili, a vzali jsme nějakou proměnnou pro výpočty.
#zahrnout
A daná funkce se používá pro řízení LCD.
void daten () {rs = 1; en = 1; zpoždění (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; zpoždění (1); en = 0; } void lcdcmd (nepodepsaný znak)
Tato funkce se používá pro inicializaci RTC a čtení času a data z formuláře RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); hodina = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); datum = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); year = BCDToDecimal (I2CRead (1)); I2CStop (); Zobrazit čas(); // zobrazení času / data / dne zpoždění (1);
Tyto funkce se používají pro převod desetinných míst na BCD a BCD na desetinná místa.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = ((((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; návrat prosinec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; vrátit bcd; }
Níže uvedené funkce se používají pro komunikaci I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // funkce „start“ pro komunikaci s ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // Funkce "stop" pro komunikaci s ds1307 RTC nepodepsaný znak I2CSend (nepodepsaný znak Data) // odeslání dat do ds1307 {char i; char ack_bit; for (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; jinak SDA = 0; SCL = 1; Data << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; návrat ack_bit; } unsigned char I2CRead (char ack) // přijímat data z ds1307 {unsigned char i, Data = 0; SDA = 1; for (i = 0; i <8; i ++) {Data << = 1; do {SCL = 1;} while (SCL == 0); pokud (SDA) Data- = 1; SCL = 0; } if (ack) SDA = 0; jinak SDA = 1; SCL = 1; SCL = 0; SDA = 1; vrátit data; }
Funkce set_time slouží k nastavení času v hodinách a níže uvedená funkce show_time k zobrazení času na LCD.
void show_time () // funkce pro zobrazení času / data / dne na LCD {char var; lcdcmd (0x80); lcdprint ("Datum:"); sprintf (var, "% d", datum); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", rok + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Čas:"); sprintf (var, "% d", hodina); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", s); lcdprint (var); lcdprint (""); // den (den1); lcdprint (""); }