En este proyecto, vamos a demostrar cómo hacer un reloj RTC usando un microcontrolador 8051. Si desea hacer este proyecto con Arduino, consulte este reloj digital usando Arduino. El componente principal de este proyecto es DS1307, que es un IC de reloj digital en tiempo real. Conozcamos este IC en detalle.
RTC DS1307:
El reloj en tiempo real (RTC) serie DS1307 es un reloj / calendario decimal codificado en binario completo (BCD) de baja potencia más 56 bytes de SRAM NV. Este chip funciona con el protocolo I²C. El reloj / calendario proporciona información sobre segundos, minutos, horas, día, fecha, mes y año. La fecha de fin de mes se ajusta automáticamente para los meses con menos de 31 días, incluidas las correcciones por año bisiesto. El reloj funciona en formato de 24 horas o de 12 horas con indicador AM / PM. El DS1307 tiene un circuito de detección de energía incorporado que detecta fallas de energía y cambia automáticamente a la fuente de respaldo. La operación de cronometraje continúa mientras la pieza opera desde el suministro de respaldo. El chip DS1307 puede funcionar de forma continua hasta 10 años.
El reloj de tiempo real basado en 8051 es un reloj digital para mostrar el tiempo real utilizando un RTC DS1307, que funciona en el protocolo I2C. El reloj en tiempo real significa que funciona incluso después de un corte de energía. Cuando se vuelve a conectar la energía, muestra el tiempo real independientemente del tiempo y la duración que estuvo en estado apagado. En este proyecto, hemos utilizado un módulo LCD de 16x2 para mostrar la hora en formato - (hora, minutos, segundos, fecha, mes y año). Los relojes en tiempo real se utilizan comúnmente en nuestras computadoras, casas, oficinas y dispositivos electrónicos para mantenerlos actualizados con tiempo real.
El protocolo I2C es un método para conectar dos o más dispositivos mediante dos cables a un solo sistema, por lo que este protocolo también se denomina protocolo de dos cables. Se puede utilizar para comunicar 127 dispositivos a un solo dispositivo o procesador. La mayoría de los dispositivos I2C funcionan con una frecuencia de 100 kHz.
Pasos para la escritura de datos maestro a esclavo (modo de recepción esclavo)
- Envía la condición de ARRANQUE al esclavo.
- Envía la dirección del esclavo al esclavo.
- Envíe el bit de escritura (0) al esclavo.
- Recibido el bit ACK del esclavo
- Envía la dirección de las palabras al esclavo.
- Recibido el bit ACK del esclavo
- Envía datos al esclavo.
- Se recibió el bit ACK del esclavo.
- Y por último envía la condición STOP al esclavo.
Pasos para la lectura de datos de esclavo a maestro (modo de transmisión de esclavo)
- Envía la condición de ARRANQUE al esclavo.
- Envía la dirección del esclavo al esclavo.
- Envíe el bit de lectura (1) al esclavo.
- Recibido el bit ACK del esclavo
- Datos recibidos del esclavo
- Se recibió el bit ACK del esclavo.
- Envía la condición STOP al esclavo.
Diagrama y descripción del circuito
En circuito, hemos utilizado la mayoría de los componentes DS1307, AT89S52 y LCD. Aquí AT89S52 se utiliza para leer el tiempo de DS1307 y mostrarlo en una pantalla LCD de 16x2. DS1307 envía la hora / fecha usando 2 líneas al microcontrolador.
Las conexiones de los circuitos son fáciles de entender y se muestran en el diagrama anterior. Los pines SDA y SCL del chip DS1307 están conectados a los pines P2.1 y P2.0 del microcontrolador 89S52 con resistencia de extracción que mantiene el valor predeterminado ALTO en las líneas de datos y reloj. Y un oscilador de cristal de 32,768 KHz está conectado con el chip DS1307 para generar un retraso exacto de 1 segundo. Y una batería de 3 voltios también está conectada al pin 3 rd (BAT) de DS1307 que mantiene el tiempo en funcionamiento después de un corte de electricidad. La pantalla LCD de 16x2 está conectada con 8051 en modo de 4 bits. Los pines de control RS, RW y En están conectados directamente a los pines P1.0, GND y P1.1 del 89S52. Y el pin de datos D0-D7 está conectado a P1.4-P1.7 de 89S52.
Tres botones, a saber, SET, INC / CHANGE y Next, se utilizan para configurar la hora del reloj en los pines P2.4, P2.3 y P2.2 de 89S52 (activo bajo). Cuando presionamos SET, se activa el modo de ajuste de tiempo y ahora necesitamos configurar el tiempo usando el botón INC / CHANGE y el botón Next se usa para pasar al dígito. Después de configurar la hora, el reloj funciona continuamente.
Descripción del programa
En el código hemos incluido la biblioteca familiar 8051 y una biblioteca de entrada y salida estándar. Y definimos los pines que hemos usado, y tomamos alguna variable para los cálculos.
#incluir
Y la función dada se utiliza para conducir LCD.
void daten () {rs = 1; en = 1; retraso (1); en = 0; } void lcddata (canal de caracteres sin firmar) {lcdport = ch & 0xf0; daten (); lcdport = (canal << 4) & 0xf0; daten (); } vacío cmden (vacío) {rs = 0; en = 1; retraso (1); en = 0; } void lcdcmd (canal de caracteres sin firmar)
Esta función se utiliza para inicializar el RTC y leer la hora y la fecha del formulario RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); hora = BCDToDecimal (I2CRead (1)); día1 = BCDToDecimal (I2CRead (1)); fecha = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); año = BCDToDecimal (I2CRead (1)); I2CStop (); tiempo de la funcion(); // mostrar hora / fecha / día de retraso (1);
Estas funciones se utilizan para convertir decimal a BCD y BCD a decimal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte y 0xF0) >> 4) * 10); b = (bcdByte y 0x0F); dec = a + b; return dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; return bcd; }
Las siguientes funciones se utilizan para la comunicación I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // función "iniciar" para comunicarse con ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // función "detener" para comunicarse con ds1307 RTC unsigned char I2CSend (unsigned char Data) // enviar datos a ds1307 {char i; char ack_bit; para (i = 0; i <8; i ++) {if (Datos & 0x80) SDA = 1; si no SDA = 0; SCL = 1; Datos << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; return ack_bit; } unsigned char I2CRead (char ack) // recibe datos de ds1307 {unsigned char i, Data = 0; SDA = 1; para (i = 0; i <8; i ++) {Datos << = 1; hacer {SCL = 1;} while (SCL == 0); si (SDA) Data- = 1; SCL = 0; } si (ack) SDA = 0; si no SDA = 1; SCL = 1; SCL = 0; SDA = 1; devolver datos; }
La función set_time se usa para configurar la hora en el reloj y la función show_time a continuación se usa para mostrar la hora en la pantalla LCD.
void show_time () // función para mostrar la hora / fecha / día en la pantalla LCD {char var; lcdcmd (0x80); lcdprint ("Fecha:"); sprintf (var, "% d", fecha); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", año + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Hora:"); sprintf (var, "% d", hora); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", seg); lcdprint (var); lcdprint (""); // día (día1); lcdprint (""); }