En aquest projecte, demostrarem fer un rellotge RTC mitjançant microcontrolador 8051. Si voleu fer aquest projecte amb Arduino, consulteu aquest rellotge digital mitjançant Arduino. El component principal d’aquest projecte és DS1307, que és un CI de rellotge digital en temps real. Conegui detalladament aquest IC.
RTC DS1307:
El rellotge en temps real (RTC) de sèrie DS1307 és un rellotge / calendari decimal de codi binari complet (BCD) de baixa potència i 56 bytes de NV SRAM. Aquest xip funciona amb el protocol I²C. El rellotge / calendari proporciona informació de segons, minuts, hores, dia, data, mes i any. La data de finalització del mes s'ajusta automàticament per a mesos amb menys de 31 dies, incloses les correccions per a l'any bisest. El rellotge funciona en format de 24 hores o de 12 hores amb indicador AM / PM. El DS1307 té un circuit integrat de detecció de potència que detecta fallades d’alimentació i canvia automàticament al subministrament de còpia de seguretat. L'operació de cronometratge continua mentre la peça funciona des del subministrament de còpia de seguretat. El xip DS1307 pot funcionar contínuament fins a 10 anys.

El rellotge en temps real basat en el 8051 és un rellotge digital per mostrar temps real mitjançant un RTC DS1307, que funciona amb el protocol I2C. El rellotge en temps real significa que funciona fins i tot després de la fallada de corrent. Quan es torna a connectar l’alimentació, mostra el temps real independentment del temps i la durada en què es trobava en estat apagat. En aquest projecte hem utilitzat un mòdul LCD de 16x2 per mostrar l’hora en format (hora, minut, segons, data, mes i any). Els rellotges en temps real s’utilitzen habitualment als nostres ordinadors, cases, oficines i dispositius electrònics per mantenir-los actualitzats amb temps real.
El protocol I2C és un mètode per connectar dos o més dispositius mitjançant dos cables a un sol sistema i, per tant, aquest protocol també s’anomena protocol de dos fils. Es pot utilitzar per comunicar 127 dispositius a un sol dispositiu o processador. La majoria dels dispositius I2C funcionen amb una freqüència de 100 KHz.
Passos per escriure dades mestre a esclau (mode de recepció d'esclaus)
- Envia la condició START a l’esclau.
- Envia l'adreça de l'esclau a l'esclau.
- Envia el bit d’escriptura (0) a l’esclau.
- Bit ACK rebut de l'esclau
- Envia les paraules adreçades a l’esclau.
- Bit ACK rebut de l'esclau
- Envia dades a l’esclau.
- Bit ACK rebut de l'esclau.
- I per últim envia la condició STOP a l’esclau.
Passos per a la lectura de dades d'esclau a mestre (mode de transmissió d'esclau)
- Envia la condició START a l’esclau.
- Envia l'adreça de l'esclau a l'esclau.
- Envia el bit de lectura (1) a l'esclau.
- Bit ACK rebut de l'esclau
- Dades rebudes de l'esclau
- Bit ACK rebut de l'esclau.
- Envia la condició STOP a l'esclau.
Diagrama i descripció del circuit
Al circuit hem utilitzat 3 components més DS1307, AT89S52 i LCD. Aquí AT89S52 s’utilitza per llegir el temps del DS1307 i mostrar-lo a la pantalla LCD de 16x2. DS1307 envia l'hora / la data mitjançant 2 línies al microcontrolador.

Les connexions de circuits són fàcils d'entendre i es mostren al diagrama anterior. Els pins SDA i SCL del xip DS1307 estan connectats als pins P2.1 i P2.0 del microcontrolador 89S52 amb resistència pull up que manté el valor per defecte ALT a les línies de dades i de rellotge. I un oscil·lador de cristall de 32,768 KHz està connectat amb el xip DS1307 per generar un retard exacte d’1 segon. I una bateria de 3 volts també està connectada al pin 3r (BAT) de DS1307, que manté el temps funcionant després de la fallada d’electricitat. La pantalla LCD de 16 x 2 està connectada amb 8051 en mode de 4 bits. Els pins de control RS, RW i En estan connectats directament als pins P1.0, GND i P1.1 del 89S52. I el pin de dades D0-D7 està connectat a P1.4-P1.7 de 89S52.
S’utilitzen tres botons SET, INC / CHANGE i Next per configurar l’hora del rellotge per fixar P2.4, P2.3 i P2.2 de 89S52 (baix actiu). Quan premem SET, s'activa el mode de configuració d'hora i ara hem de configurar l'hora mitjançant el botó INC / CHANGE i el botó Next s'utilitza per passar al dígit. Després de configurar el rellotge horari funciona contínuament.
Descripció del programa
Al codi hem inclòs la biblioteca familiar 8051 i una biblioteca de sortida d'entrada estàndard. I hem definit els pins que hem utilitzat i hem pres alguna variable per als càlculs.
#incloure
I la funció donada s’utilitza per conduir LCD.
void daten () {rs = 1; ca = 1; retard (1); ca = 0; } void lcddata (char sign sense signar) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; ca = 1; retard (1); ca = 0; } void lcdcmd (caràcter sense signe)
Aquesta funció s'utilitza per inicialitzar RTC i per llegir l'hora i la data des del formulari IC RTC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); hora = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); data = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); any = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // mostra l'hora / la data / el retard del dia (1);
Aquestes funcions s’utilitzen per convertir decimal a BCD i BCD a decimal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; tornar dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; tornar bcd; }
Les funcions següents es fan servir per a la comunicació I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // funció "start" per comunicar-se amb ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // Funció "stop" per comunicar-se amb ds1307 RTC sense signar I2CSend (sense signar dades de caràcters) // enviar dades a ds1307 {char i; char ack_bit; per a (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; else SDA = 0; SCL = 1; Dades << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; torna ack_bit; } unsigned char I2CRead (char ack) // rebre dades de ds1307 {unsigned char i, Data = 0; SDA = 1; per a (i = 0; i <8; i ++) {Dades << = 1; fer {SCL = 1;} mentre que (SCL == 0); if (SDA) Data- = 1; SCL = 0; } if (ack) SDA = 0; else SDA = 1; SCL = 1; SCL = 0; SDA = 1; retornar dades; }
La funció set_time s’utilitza per configurar l’hora al rellotge i la funció show_time que es mostra a continuació s’utilitza per mostrar l’hora a la pantalla LCD.
void show_time () // funció per mostrar l'hora / data / dia a la pantalla LCD {char var; lcdcmd (0x80); lcdprint ("Data:"); sprintf (var, "% d", data); lcdprint (var); sprintf (var, "/% d", dl); lcdprint (var); sprintf (var, "/% d", any + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Temps:"); sprintf (var, "% d", hora); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", seg); lcdprint (var); lcdprint (""); // dia (dia1); lcdprint (""); }
