V tem projektu bomo prikazali izdelavo ure RTC z uporabo mikrokrmilnika 8051. Če želite ta projekt izvesti z Arduinom, preverite to digitalno uro z uporabo Arduina. Glavna sestavina tega projekta je DS1307, ki je v realnem času digitalna ura IC. Podrobno vemo o tej IC.
RTC DS1307:
Serijska ura za sprotni čas DS1307 (RTC) je ura / koledar z dvojno kodirano decimalno (BCD) nizko porabo energije in 56 bajtov NV SRAM. Ta čip deluje na protokolu I²C. Ura / koledar vsebuje sekunde, minute, ure, dan, datum, mesec in leto. Datum konca meseca se samodejno prilagodi za mesece z manj kot 31 dnevi, vključno s popravki za prestopno leto. Ura deluje v 24-urni ali 12-urni obliki z indikatorjem AM / PM. DS1307 ima vgrajeno napajalno vezje, ki zazna izpad električne energije in samodejno preklopi na rezervno napajanje. Merjenje časa se nadaljuje, medtem ko del deluje iz rezervnega napajanja. Čip DS1307 lahko neprekinjeno deluje do 10 let.
Ura realnega časa na osnovi 8051 je digitalna ura za prikaz realnega časa z uporabo RTC DS1307, ki deluje na protokolu I2C. Ura realnega časa pomeni, da deluje tudi po izpadu električne energije. Ko je napajanje ponovno priključeno, prikazuje realni čas, ne glede na čas in trajanje, ko je bil izklopljen. V tem projektu smo uporabili modul LCD 16x2 za prikaz časa v obliki - (ura, minuta, sekunde, datum, mesec in leto). Ure v realnem času se pogosto uporabljajo v naših računalnikih, hišah, pisarnah in elektronskih napravah, da jih sproti posodabljamo.
I2C protokol je metoda za povezavo dveh ali več naprav, ki uporabljajo dve žici, v en sistem, zato se ta protokol imenuje tudi dvožični protokol. Uporablja se lahko za komunikacijo 127 naprav z eno samo napravo ali procesorjem. Večina naprav I2C deluje na frekvenci 100 Khz.
Koraki za glavno zapisovanje podatkov v podrejeni (način prejema podrejenega)
- Pošlje pogoj START v pomožno enoto.
- Pošlje suženjski naslov suženjstvu.
- Pošlji bit za pisanje (0) pomožniku.
- Prejel je bit ACK od pomožnika
- Pošlje besed naslov sužnju.
- Prejel je bit ACK od pomožnika
- Pošlje podatke podrejenemu.
- Prejel je bit ACK od pomožnika.
- In nazadnje pogoj STOP pošlje pomožniku.
Koraki za branje podatkov od podrejenega do glavnega (način oddajanja podrejenega)
- Pošlje pogoj START v pomožno enoto.
- Pošlje suženjski naslov suženjstvu.
- Pošlji branje bita (1) pomožniku.
- Prejel je bit ACK od pomožnika
- Prejeti podatki od pomožnika
- Prejel je bit ACK od pomožnika.
- Pošlje pogoj STOP pomožnemu.
Shema vezja in opis
V vezju smo uporabili 3 večine komponent DS1307, AT89S52 in LCD. Tu AT89S52 uporabljamo za branje časa z DS1307 in prikaz na LCD zaslonu 16x2. DS1307 pošlje čas / datum z dvema vrsticama mikrokrmilniku.
Vezja vezij so enostavna za razumevanje in prikazana na zgornjem diagramu. Priključek SDA in SCL čipa DS1307 je povezan z zatiči P2.1 in P2.0 mikrokrmilnika 89S52 z vlečnim uporom, ki ima privzeto vrednost HIGH na podatkovnih in urnih linijah. In kristalni oscilator 32,768KHz je povezan z DS1307čipom za ustvarjanje natančne 1-sekundne zakasnitve. In je 3-voltna baterija tudi priključena na pin 3 rd (BAT) za DS1307, ki ohranja čas teče po izpadu električne energije. LCD 16x2 je povezan z 8051 v 4-bitnem načinu. Krmilni zatiči RS, RW in En so neposredno povezani z zatiči 89S52 P1.0, GND in P1.1. In podatkovni zatič D0-D7 je povezan s P1.4-P1.7 v 89S52.
Trije gumbi, in sicer SET, INC / CHANGE in Next, se uporabljajo za nastavitev ure, da se pripnejo P2.4, P2.3 in P2.2 89S52 (aktivno nizko). Ko pritisnemo SET, se aktivira način nastavitve časa in zdaj moramo nastaviti čas z gumbom INC / CHANGE, gumb Next pa se uporablja za premik na številko. Po nastavitvi časa ura teče neprekinjeno.
Opis programa
V kodo smo vključili družinsko knjižnico 8051 in standardno vhodno izhodno knjižnico. In definirali zatiče, ki smo jih uporabili, in za izračune uporabili nekaj spremenljivk.
#include
In dana funkcija se uporablja za vožnjo LCD-ja.
void daten () {rs = 1; en = 1; zamuda (1); en = 0; } neveljavni lcddata (nepodpisani znak ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; zamuda (1); en = 0; } void lcdcmd (nepodpisani znak ch)
Ta funkcija se uporablja za inicializiranje RTC ter za odčitavanje časa in datuma iz obrazca RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); ura = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); datum = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); leto = BCDToDecimal (I2CRead (1)); I2CStop (); čas za predstavo(); // prikaz časa / datuma / dnevne zamude (1);
Te funkcije se uporabljajo za pretvorbo decimalnega v BCD in BCD v decimalno.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; vrnitev dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; vrni bcd; }
Spodnje funkcije se uporabljajo za komunikacijo I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" funkcija za komunikacijo z ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // funkcija "stop" za komunikacijo z ds1307 RTC unsigned char I2CSend (unsigned char Data) // pošlji podatke na ds1307 {char i; char ack_bit; za (i = 0; i <8; i ++) {če (Podatki & 0x80) SDA = 1; sicer SDA = 0; SCL = 1; Podatki << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; vrni ack_bit; } unsigned char I2CRead (char ack) // prejem podatkov iz ds1307 {unsigned char i, Data = 0; SDA = 1; za (i = 0; i <8; i ++) {Podatki << = 1; naredite {SCL = 1;} medtem ko (SCL == 0); če (SDA) Podatki- = 1; SCL = 0; } če (ack) SDA = 0; sicer SDA = 1; SCL = 1; SCL = 0; SDA = 1; vrni podatke; }
Funkcija set_time se uporablja za nastavitev ure v uri, spodaj pa funkcija show_time za prikaz časa na LCD-prikazovalniku.
void show_time () // funkcija za prikaz ure / datuma / dneva na LCD-prikazovalniku {char var; lcdcmd (0x80); lcdprint ("Datum:"); sprintf (var, "% d", datum); lcdprint (var); sprintf (var, "/% d", pon); lcdprint (var); sprintf (var, "/% d", leto + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Čas:"); sprintf (var, "% d", ura); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sek); lcdprint (var); lcdprint (""); // dan (dan1); lcdprint (""); }