Tässä projektissa aiomme osoittaa RTC-kellon valmistamisen 8051-mikrokontrollerilla. Jos haluat tehdä tämän projektin Arduinon kanssa, tarkista tämä digitaalinen kello Arduinolla. Tämän projektin pääkomponentti on DS1307, joka on reaaliaikainen digitaalinen kellokortti. Kertoo tästä IC: stä yksityiskohtaisesti.
RTC DS1307:
DS1307-sarjan reaaliaikainen kello (RTC) on pienitehoinen, täyden binäärikoodatun desimaalin (BCD) kello / kalenteri plus 56 tavua NV SRAM. Tämä siru toimii I²C-protokollalla. Kello / kalenteri antaa sekuntia, minuuttia, tuntia, päivää, päivämäärää, kuukautta ja vuotta koskevat tiedot. Kuukauden lopun päivämäärä mukautetaan automaattisesti alle 31 päivää kestäville kuukausille, mukaan lukien karkausvuoden korjaukset. Kello toimii joko 24 tunnin tai 12 tunnin muodossa AM / PM-ilmaisimella. DS1307: ssä on sisäänrakennettu tehohavaintopiiri, joka havaitsee sähkökatkokset ja vaihtaa automaattisesti varavirtalähteeseen. Ajanotto jatkuu, kun osa toimii varavirtalähteestä. DS1307-siru voi toimia jatkuvasti 10 vuoteen asti.
8051-pohjainen reaaliaikainen kello on digitaalinen kello, joka näyttää reaaliaikaisen I2C-protokollalla toimivan RTC DS1307: n avulla. Reaaliaikainen kello tarkoittaa, että se toimii myös sähkökatkon jälkeen. Kun virta kytketään uudelleen, se näyttää reaaliaikaisen ajan riippumatta siitä, mihin aikaan ja kuinka kauan se oli pois päältä -tilassa. Tässä projektissa olemme käyttäneet 16x2 LCD-moduulia näyttämään ajan muodossa (tunti, minuutti, sekunti, päivämäärä, kuukausi ja vuosi). Reaaliaikaisia kelloja käytetään yleisesti tietokoneissamme, taloissa, toimistoissa ja elektroniikkalaitteissa pitämään ne ajan tasalla reaaliajassa.
I2C-protokolla on tapa yhdistää kaksi tai useampia laitteita kahdella johtimella yhteen järjestelmään, joten tätä protokollaa kutsutaan myös kaksilankaiseksi protokollaksi. Sitä voidaan käyttää 127 laitteen kommunikointiin yhteen laitteeseen tai prosessoriin. Suurin osa I2C-laitteista toimii 100 kHz taajuudella.
Vaiheet tietojen kirjoittamisen isännälle orjalle (orja-vastaanottotila)
- Lähettää START-ehdon orjalle.
- Lähettää orjaosoitteen orjalle.
- Lähetä kirjoitusbitti (0) orjalle.
- Vastaanotettu ACK-bitti orjalta
- Lähettää sanat osoitteen orjalle.
- Vastaanotettu ACK-bitti orjalta
- Lähettää tietoja orjalle.
- Vastaanotettu ACK-bitti orjalta.
- Ja viimeisin lähettää STOP-ehdon orjalle.
Vaiheet tietojen lukemiseen orjalta isännälle (orjan lähetystila)
- Lähettää START-ehdon orjalle.
- Lähettää orjaosoitteen orjalle.
- Lähetä luettu bitti (1) orjalle.
- Vastaanotettu ACK-bitti orjalta
- Vastaanotettu tietoja orjalta
- Vastaanotettu ACK-bitti orjalta.
- Lähettää STOP-ehdon orjalle.
Piirikaavio ja kuvaus
Piirissä olemme käyttäneet 3 eniten komponentteja DS1307, AT89S52 ja LCD. Täällä AT89S52: ta käytetään DS1307: n lukuaikaan ja sen näyttämiseen 16x2 LCD-näytöllä. DS1307 lähettää ajan / päivämäärän käyttämällä 2 riviä mikrokontrollerille.
Piiriliitännät on helppo ymmärtää ja ne näkyvät yllä olevassa kaaviossa. DS1307-sirutappi SDA ja SCL on kytketty 89S52-mikrokontrollerin P2.1- ja P2.0-nastoihin ylösvetovastuksella, jolla on oletusarvo HIGH data- ja kellolinjoilla. Ja 32,768 kHz: n kideoskillaattori on kytketty DS1307-siruun tarkan 1 sekunnin viiveen tuottamiseksi. Ja 3 voltin akku on kytketty myös nasta 3 rd (BAT) ja DS1307, joka pitää kulua jälkeen sähköä epäonnistumisen. 16x2 LCD on kytketty 8051: een 4-bittisessä tilassa. Ohjaustappi RS, RW ja En on kytketty suoraan 89S52-nastoihin P1.0, GND ja P1.1. Ja datanapa D0-D7 on kytketty 89S52: n P1.4-P1.7: een.
Kolme painiketta, nimittäin SET, INC / CHANGE ja Next, käytetään kellonajan asettamiseen 89S52: n pinneille P2.4, P2.3 ja P2.2 (aktiivinen matala). Kun painamme SET-painiketta, aika-asetustila aktivoituu ja nyt meidän on asetettava aika INC / CHANGE-painikkeella ja Seuraava-painiketta käytetään siirtymiseen numeroon. Ajan asettamisen jälkeen kello käy jatkuvasti.
Ohjelman kuvaus
Koodiin olemme sisällyttäneet 8051-perhekirjaston ja vakiomuotoisen lähtökirjaston. Ja määritteli tapit, joita olemme käyttäneet, ja otimme muuttujan laskelmiin.
#sisältää
Annettua toimintoa käytetään nestekidenäytön ajamiseen.
void daten () {rs = 1; en = 1; viive (1); en = 0; } void lcddata (allekirjoittamaton char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; viive (1); en = 0; } void lcdcmd (allekirjoittamaton merkki ch)
Tätä toimintoa käytetään alustamaan RTC ja lukemaan aika ja päivämäärä lomakkeelta RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); tunti = BCDToDecimal (I2CRead (1)); päivä1 = BCDToDecimal (I2CRead (1)); päivämäärä = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); vuosi = BCDToDecimal (I2CRead (1)); I2CStop (); esitysaika(); // näyttää kellonajan / päivämäärän / päivän viive (1);
Näitä toimintoja käytetään muuntamaan desimaali BCD: ksi ja BCD desimaaliksi.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; paluu dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((desimaaliByte / 10) << 4); b = (desimaalinen tavu% 10); bcd = ab; paluu bcd; }
Alla olevia toimintoja käytetään I2C-tiedonsiirtoon.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" -toiminto yhteydenpitoon ds1307 RTC: n kanssa void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "stop" -toiminto viestinnälle ds1307 RTC allekirjoittamaton char I2CSend (allekirjoittamaton char Data) // lähetä tiedot osoitteeseen ds1307 {char i; char ack_bit; for (i = 0; i <8; i ++) {if (data & 0x80) SDA = 1; muuten SDA = 0; SCL = 1; Tiedot << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; return ack_bit; } allekirjoittamaton char I2CRead (char ack) // vastaanottaa dataa osoitteesta ds1307 {unsigned char i, Data = 0; SDA = 1; for (i = 0; i <8; i ++) {Data << = 1; tee {SCL = 1;} kun (SCL == 0); jos (SDA) Data- = 1; SCL = 0; } if (ack) SDA = 0; muuten SDA = 1; SCL = 1; SCL = 0; SDA = 1; palauttaa tiedot; }
Set_time-toimintoa käytetään kellonajan asettamiseen ja alla olevaa show_time-toimintoa käytetään ajan näyttämiseen nestekidenäytössä.
void show_time () // -toiminto kellonajan / päivämäärän / päivän näyttämiseksi LCD-näytöllä {char var; lcdcmd (0x80); lcdprint ("Päivämäärä:"); sprintf (var, "% d", päivämäärä); lcdprint (var); sprintf (var, "/% d", ma); lcdprint (var); sprintf (var, "/% d", vuosi + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Aika:"); sprintf (var, "% d", tunti); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sek); lcdprint (var); lcdprint (""); // päivä (päivä1); lcdprint (""); }