Šiame projekte mes parodysime, kaip pagaminti RTC laikrodį naudojant 8051 mikrovaldiklį. Jei norite atlikti šį projektą su „Arduino“, patikrinkite šį skaitmeninį laikrodį naudodami „Arduino“. Pagrindinis šio projekto komponentas yra DS1307, kuris yra realaus laiko skaitmeninio laikrodžio IC. Išsamiai sužinos apie šį IC.
RTC DS1307:
„DS1307“ nuoseklusis realaus laiko laikrodis (RTC) yra mažos galios, visiškai dvejetainiai koduojamas dešimtainis (BCD) laikrodis / kalendorius ir 56 baitai NV SRAM. Šis lustas veikia pagal I²C protokolą. Laikrodis / kalendorius pateikia sekundžių, minučių, valandų, dienos, datos, mėnesio ir metų informaciją. Mėnesio pabaigos data automatiškai koreguojama mėnesiams, turintiems mažiau nei 31 dieną, įskaitant keliamųjų metų pataisas. Laikrodis veikia 24 valandų arba 12 valandų formatu su AM / PM indikatoriumi. DS1307 turi įmontuotą maitinimo jutimo grandinę, kuri nustato elektros energijos gedimus ir automatiškai persijungia į atsarginį tiekimą. Laiko laikymo operacija tęsiama, kol dalis veikia iš atsarginio tiekimo. DS1307 lustas gali nuolat veikti iki 10 metų.
8051 pagrįstas realaus laiko laikrodis yra skaitmeninis laikrodis, rodantis realųjį laiką naudojant „ RTC DS1307“, kuris veikia pagal I2C protokolą. Realaus laiko laikrodis reiškia, kad jis veikia net ir nutrūkus elektros tiekimui. Prijungus maitinimą, jis rodo realųjį laiką, neatsižvelgiant į laiką ir trukmę, kai jis buvo išjungtas. Šiame projekte mes naudojome 16x2 skystųjų kristalų modulį, kad laikas būtų rodomas - (valanda, minutė, sekundės, data, mėnuo ir metai) formatu. Realaus laiko laikrodžiai dažniausiai naudojami mūsų kompiuteriuose, namuose, biuruose ir elektronikos prietaisuose, kad jie būtų atnaujinami realiuoju laiku.
„I2C“ protokolas yra būdas sujungti du ar daugiau įrenginių, naudojant du laidus, į vieną sistemą, todėl šis protokolas taip pat vadinamas dviejų laidų protokolu. Jis gali būti naudojamas 127 įrenginiams perduoti į vieną įrenginį ar procesorių. Dauguma „I2C“ įrenginių veikia 100 kHz dažniu.
Duomenų įrašymo pagrindinio vergo veiksmai (vergo priėmimo režimas)
- Siunčia vergui START sąlygą.
- Siunčia vergo adresą vergui.
- Siųsti rašymo bitą (0) vergui.
- Gavote ACK bitą iš vergo
- Siunčia žodžius adresą vergui.
- Gavote ACK bitą iš vergo
- Siunčia duomenis vergui.
- Gavote ACK bitą iš vergo.
- Ir paskutinis siunčia STOP sąlygą vergui.
Duomenų skaitymo nuo vergo iki pagrindinio veiksmai (vergo perdavimo režimas)
- Siunčia vergui START sąlygą.
- Siunčia vergo adresą vergui.
- Siųsti skaitytą bitą (1) vergui.
- Gavote ACK bitą iš vergo
- Gavo duomenis iš vergo
- Gavote ACK bitą iš vergo.
- Siunčia vergui STOP sąlygą.
Grandinės schema ir aprašymas
Grandinėje mes panaudojome 3 daugumą komponentų DS1307, AT89S52 ir LCD. Čia AT89S52 naudojamas nuskaityti laiką iš DS1307 ir rodyti jį 16x2 LCD ekrane. DS1307 siunčia laiką / datą naudodamas 2 eilutes mikrovaldikliui.
Grandinių jungtys yra lengvai suprantamos ir parodytos aukščiau pateiktoje diagramoje. DS1307 mikroschemos kaiščiai SDA ir SCL yra prijungti prie 89S52 mikrovaldiklio P2.1 ir P2.0 kaiščių su pakeliamąja rezistoriumi, kuris duomenų ir laikrodžio linijose laiko numatytąją reikšmę HIGH. 32,768KHz kristalinis osciliatorius yra prijungtas prie DS1307chip, kad generuotų tikslią 1 sekundės vėlavimą. 3 voltų baterija taip pat yra prijungta prie DS1307 3 - ojo kaiščio (GPGB), kuris palaiko laiką po elektros energijos gedimo. 16x2 skystųjų kristalų ekranas prijungtas prie 8051 4 bitų režimu. Valdymo kaištis RS, RW ir En yra tiesiogiai prijungtas prie 89S52 kaiščių P1.0, GND ir P1.1. Duomenų kaištis D0-D7 yra prijungtas prie 89S52 P1.4-P1.7.
Trys mygtukai, ty „SET“, „INC / CHANGE“ ir „Next“, naudojami nustatant laikrodžio laiką, kad būtų galima prisegti 89S52 P2.4, P2.3 ir P2.2 (aktyvus žemas). Kai paspaudžiame SET, įsijungia laiko nustatymo režimas, o dabar mes turime nustatyti laiką naudodami mygtuką INC / CHANGE, o mygtukas Kitas naudojamas pereinant prie skaitmens. Nustačius laiką, laikrodis veikia nuolat.
Programos aprašymas
Į kodą įtraukėme 8051 šeimos biblioteką ir standartinę įvesties išvesties biblioteką. Apibrėžėme kaiščius, kuriuos naudojome, ir skaičiavimams paėmė kintamąjį.
# įtraukti
Pateikta funkcija naudojama vairuojant LCD.
negaliojantis daten () {rs = 1; lt = 1; vėlavimas (1); lt = 0; } negaliojantis lcddata (nepasirašytas char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } negaliojantis cmden (negaliojantis) {rs = 0; lt = 1; vėlavimas (1); lt = 0; } negaliojantis lcdcmd (nepasirašytas char ch)
Ši funkcija naudojama inicijuojant RTC ir skaitant laiką bei datą iš formos RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sek = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); valanda = BCDToDecimal (I2CRead (1)); diena1 = BCDToDecimal (I2CRead (1)); data = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); metai = BCDToDecimal (I2CRead (1)); I2CStop (); pasirodymas(); // rodyti laiko / datos / dienos vėlavimą (1);
Šios funkcijos naudojamos konvertuojant dešimtainį į BCD ir BCD į dešimtainį.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; grįžti gruodis; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((dešimtainis baitas / 10) << 4); b = (dešimtainis baitas% 10); bcd = ab; grąžinti bcd; }
Žemiau pateiktos funkcijos naudojamos I2C ryšiui.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" funkcija bendraujant su ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // „stop“ funkcija bendraujant ds1307 RTC nepasirašyta char I2CSend (nepasirašyta char Data) // siųsti duomenis į ds1307 {char i; char ack_bit; už (i = 0; i <8; i ++) {if (duomenys ir 0x80) SDA = 1; dar SDA = 0; SCL = 1; Duomenys << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; grįžti ack_bit; } nepasirašyta char I2CRead (char ack) // gauti duomenis iš ds1307 {nepasirašyta char i, duomenys = 0; SDA = 1; už (i = 0; i <8; i ++) {duomenys << = 1; atlikite {SCL = 1;}, kol (SCL == 0); jei (SDA) duomenys - = 1; SCL = 0; } if (ack) SDA = 0; dar SDA = 1; SCL = 1; SCL = 0; SDA = 1; grąžinti duomenis; }
Funkcija „set_time“ naudojama laikui nustatyti laikrodyje, o žemiau „show_time“ funkcija naudojama rodyti laiką LCD.
void show_time () // funkcija rodyti laiką / datą / dieną LCD {char var; lcdcmd (0x80); lcdprint ("Data:"); sprintf (var, "% d", data); lcdprint (var); sprintf (var, "/% d", pirmadienis); lcdprint (var); sprintf (var, "/% d", metai + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Laikas:"); sprintf (var, "% d", valanda); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sek); lcdprint (var); lcdprint (""); // diena (diena1); lcdprint (""); }