V tomto projekte ukážeme výrobu hodín RTC pomocou mikrokontroléra 8051. Ak by ste chceli urobiť tento projekt s Arduinom, skontrolujte tieto digitálne hodiny pomocou Arduina. Hlavnou súčasťou tohto projektu je DS1307, čo sú digitálne hodiny v reálnom čase IC. Dáme podrobne vedieť o tomto IC.
RTC DS1307:
Sériové hodiny v reálnom čase (RTC) DS1307 sú nízkoenergetické hodiny / kalendár s plným binárnym kódovaním v desiatkovej sústave (BCD) a plus 56 bajtov NV SRAM. Tento čip pracuje na protokole I²C. Hodiny / kalendár poskytujú informácie o sekundách, minútach, hodinách, dni, dátume, mesiaci a roku. Dátum konca mesiaca sa automaticky upravuje pre mesiace s menej ako 31 dňami vrátane opráv pre priestupný rok. Hodiny pracujú buď v 24-hodinovom alebo 12-hodinovom formáte s indikátorom AM / PM. DS1307 má zabudovaný obvod snímania napájania, ktorý detekuje výpadky napájania a automaticky sa prepne na záložné napájanie. Prevádzka časomiery pokračuje, zatiaľ čo časť pracuje zo záložného zdroja. Čip DS1307 môže pracovať nepretržite až 10 rokov.
Hodiny reálneho času 8051 sú digitálne hodiny na zobrazenie reálneho času pomocou RTC DS1307, ktorý pracuje na protokole I2C. Hodiny reálneho času znamenajú, že fungujú aj po výpadku napájania. Po opätovnom pripojení napájania zobrazuje skutočný čas bez ohľadu na čas a trvanie, kedy bol vypnutý. V tomto projekte sme použili 16x2 LCD modul na zobrazenie času vo formáte - (hodina, minúta, sekundy, dátum, mesiac a rok). Hodiny v reálnom čase sa bežne používajú v našich počítačoch, domoch, kanceláriách a elektronických zariadeniach na ich aktualizáciu v reálnom čase.
Protokol I2C je metóda na pripojenie dvoch alebo viacerých zariadení pomocou dvoch vodičov k jedinému systému, a preto sa tento protokol nazýva aj dvojvodičový protokol. Môže sa použiť na komunikáciu 127 zariadení s jedným zariadením alebo procesorom. Väčšina zariadení I2C pracuje na frekvencii 100 KHz.
Kroky pre master zápisu dát do slave (režim príjmu slave)
- Odošle podmienku START otrokovi.
- Pošle otrokársku adresu.
- Pošlite bit (0) na zápis do slave.
- Prijatý bit ACK od slave
- Pošle slová na adresu otrokovi.
- Prijatý bit ACK od slave
- Odošle údaje otrokovi.
- Prijatý bit ACK od slave.
- A posledný pošle podmienku STOP otrokovi.
Kroky na čítanie údajov z podradenej jednotky do hlavnej jednotky (režim vysielania podradenej jednotky)
- Odošle podmienku START otrokovi.
- Pošle otrokársku adresu.
- Pošlite načítaný bit (1) slave.
- Prijatý bit ACK od slave
- Prijaté údaje od podriadeného
- Prijatý bit ACK od slave.
- Odošle podmienku STOP otrokovi.
Schéma zapojenia a opis
V obvode sme použili 3 väčšinu komponentov DS1307, AT89S52 a LCD. Tu sa AT89S52 používa na čítanie času z DS1307 a jeho zobrazenie na 16x2 LCD obrazovke. DS1307 odosiela čas a dátum pomocou 2 riadkov do mikrokontroléra.
Zapojenie obvodov je ľahko pochopiteľné a zobrazuje ich vyššie uvedená schéma. Čipové kolíky DS1307 SDA a SCL sú pripojené k pinom P2.1 a P2.0 mikrokontroléra 89S52 s pull up rezistorom, ktorý drží predvolenú hodnotu HIGH na dátových a hodinových linkách. A kryštálový oscilátor 32,768 kHz je spojený s čipom DS1307 pre generovanie presného 1 sekundového oneskorenia. A 3 volt batérie je tiež pripojený na pin 3 rd (BAT) z DS1307, ktorý udržuje čas beží po výpadku elektriny. Displej 16x2 LCD je spojený s procesorom 8051 v 4-bitovom režime. Ovládací pin RS, RW a En sú priamo spojené s 89S52 pinom P1.0, GND a P1.1. A dátový pin D0-D7 je pripojený k P1,4-P1,7 z 89S52.
Tri tlačidlá, a to SET, INC / CHANGE a Next, sa používajú na nastavenie času pre pripnutie P2.4, P2.3 a P2.2 na 89S52 (aktívne nízke). Keď stlačíme SET, aktivuje sa režim nastavovania času a teraz musíme nastaviť čas pomocou tlačidla INC / CHANGE a tlačidlo Ďalej sa používa na prechod na číslicu. Po nastavení času hodiny bežia nepretržite.
Popis programu
V kóde sme zahrnuli knižnicu rodiny 8051 a štandardnú knižnicu vstupných výstupov. A definované piny, ktoré sme použili, a zobrali sme nejakú premennú pre výpočty.
#include
A daná funkcia slúži na riadenie LCD.
void daten () {rs = 1; en = 1; oneskorenie (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; oneskorenie (1); en = 0; } void lcdcmd (znak bez znaku)
Táto funkcia sa používa na inicializáciu RTC a na načítanie času a dátumu z formulára RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sek = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); hodina = BCDToDecimal (I2CRead (1)); deň1 = BCDToDecimal (I2CRead (1)); dátum = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); rok = BCDToDecimal (I2CRead (1)); I2CStop (); Zobraziť čas(); // zobrazenie oneskorenia času / dátumu / dňa (1);
Tieto funkcie sa používajú na prevod desatinných miest na BCD a BCD na desatinné miesta.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = ((((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; návrat dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (desatinný bajt% 10); bcd = ab; návrat bcd; }
Pre komunikáciu I2C sa používajú nižšie uvedené funkcie.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // funkcia „štart“ pre komunikáciu s ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // Funkcia "stop" na komunikáciu s ds1307 RTC nepodpísaný znak I2CSend (nepodpísaný znak Data) // odosielanie dát do ds1307 {char i; char ack_bit; for (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; inak SDA = 0; SCL = 1; Údaje << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; návrat ack_bit; } nepodpísaný char I2CRead (char ack) // príjem dát z ds1307 {nepodpísaný char i, Data = 0; SDA = 1; pre (i = 0; i <8; i ++) {Data << = 1; do {SCL = 1;} while (SCL == 0); ak (SDA) dáta- = 1; SCL = 0; } if (ack) SDA = 0; inak SDA = 1; SCL = 1; SCL = 0; SDA = 1; vrátiť údaje; }
Funkcia set_time sa používa na nastavenie času v hodinách a nižšie uvedená funkcia show_time na zobrazenie času na LCD displeji.
void show_time () // funkcia na zobrazenie času / dátumu / dňa na LCD {char var; lcdcmd (0x80); lcdprint ("Dátum:"); sprintf (var, "% d", dátum); 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 (""); // deň (deň1); lcdprint (""); }