Neste projeto, vamos demonstrar como fazer um RTC Clock usando o microcontrolador 8051. Se você gostaria de fazer este projeto com o Arduino, verifique este relógio digital usando o Arduino. O principal componente deste projeto é o DS1307, que é um CI de relógio digital em tempo real. Vamos saber mais sobre este IC.
RTC DS1307:
O relógio serial em tempo real (RTC) DS1307 é um relógio / calendário BCD (decimal totalmente codificado em binário) de baixa potência mais 56 bytes de SRAM NV. Este chip funciona no protocolo I²C. O relógio / calendário fornece informações de segundos, minutos, horas, dia, data, mês e ano. A data do fim do mês é ajustada automaticamente para meses com menos de 31 dias, incluindo correções para ano bissexto. O relógio opera no formato de 24 ou 12 horas com indicador AM / PM. O DS1307 possui um circuito de detecção de energia embutido que detecta falhas de energia e muda automaticamente para a fonte de reserva. A operação de cronometragem continua enquanto a peça opera a partir da fonte de backup. O chip DS1307 pode funcionar continuamente até 10 anos.
O relógio de tempo real baseado em 8051 é um relógio digital para exibir o tempo real usando um RTC DS1307, que funciona no protocolo I2C. Relógio em tempo real significa que funciona mesmo após queda de energia. Quando a energia é reconectada, ele exibe o tempo real independentemente da hora e da duração em que esteve desligado. Neste projeto, usamos um módulo LCD 16x2 para exibir a hora no formato - (hora, minuto, segundos, data, mês e ano). Relógios de tempo real são comumente usados em nossos computadores, casas, escritórios e dispositivos eletrônicos para mantê-los atualizados com tempo real.
O protocolo I2C é um método para conectar dois ou mais dispositivos usando dois fios a um único sistema e, portanto, esse protocolo também é chamado de protocolo de dois fios. Ele pode ser usado para comunicar 127 dispositivos a um único dispositivo ou processador. A maioria dos dispositivos I2C funciona na frequência de 100Khz.
Etapas para gravar dados mestre em escravo (modo de recebimento escravo)
- Envia a condição START para o escravo.
- Envia o endereço do escravo para o escravo.
- Envie o bit de gravação (0) para o escravo.
- Recebido bit ACK do escravo
- Envia o endereço das palavras para o escravo.
- Recebido bit ACK do escravo
- Envia dados para o escravo.
- Recebido bit ACK do escravo.
- E por último envia a condição STOP para o escravo.
Etapas para leitura de dados do escravo ao mestre (modo de transmissão escravo)
- Envia a condição START para o escravo.
- Envia o endereço do escravo para o escravo.
- Envie o bit de leitura (1) para o escravo.
- Recebido bit ACK do escravo
- Dados recebidos do escravo
- Recebido bit ACK do escravo.
- Envia a condição STOP para o escravo.
Diagrama de Circuito e Descrição
No circuito, usamos a maioria dos 3 componentes DS1307, AT89S52 e LCD. Aqui, AT89S52 é usado para ler o tempo do DS1307 e exibi-lo na tela LCD 16x2. O DS1307 envia a hora / data usando 2 linhas para o microcontrolador.
As conexões do circuito são simples de entender e são mostradas no diagrama acima. Os pinos SDA e SCL do chip DS1307 são conectados aos pinos P2.1 e P2.0 do microcontrolador 89S52 com resistor pull up que mantém o valor padrão ALTO nas linhas de dados e clock. E um oscilador de cristal de 32,768 KHz é conectado ao chip DS1307 para gerar o atraso exato de 1 segundo. E uma bateria de 3 volts também está ligado ao pino 3 rd (BAT) de DS1307, que mantém o tempo correndo atrás de falha de electricidade. O LCD 16x2 está conectado ao 8051 no modo de 4 bits. Os pinos de controle RS, RW e En são conectados diretamente aos pinos 89S52 P1.0, GND e P1.1. E o pino de dados D0-D7 está conectado a P1.4-P1.7 de 89S52.
Três botões chamados SET, INC / CHANGE e Next são usados para definir a hora do relógio para os pinos P2.4, P2.3 e P2.2 de 89S52 (baixo ativo). Quando pressionamos SET, o modo de ajuste de tempo é ativado e agora precisamos definir o tempo usando o botão INC / CHANGE e o botão Next é usado para mover para o dígito. Após definir o tempo, o relógio funciona continuamente.
Descrição do Programa
No código, incluímos a biblioteca da família 8051 e uma biblioteca de entrada e saída padrão. E definimos os pinos que usamos e pegamos algumas variáveis para os cálculos.
#incluir
E a função fornecida é usada para conduzir o LCD.
void daten () {rs = 1; en = 1; atraso (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; atraso (1); en = 0; } void lcdcmd (unsigned char ch)
Esta função é usada para inicializar o RTC e ler a hora e a data do formulário RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); hora = BCDToDecimal (I2CRead (1)); dia1 = BCDToDecimal (I2CRead (1)); data = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); ano = BCDToDecimal (I2CRead (1)); I2CStop (); altura de começar(); // exibe hora / data / atraso do dia (1);
Essas funções são usadas para converter decimais em BCD e BCD em decimais.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; return dez; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; return bcd; }
As funções fornecidas abaixo são usadas para comunicação I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // função "iniciar" para comunicar com ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // função "parar" para comunicar com ds1307 RTC unsigned char I2CSend (unsigned char Data) // enviar dados para ds1307 {char i; char ack_bit; para (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; senão SDA = 0; SCL = 1; Dados << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; return ack_bit; } unsigned char I2CRead (char ack) // recebe dados de ds1307 {unsigned char i, Data = 0; SDA = 1; para (i = 0; i <8; i ++) {Dados << = 1; faça {SCL = 1;} enquanto (SCL == 0); se (SDA) Dados- = 1; SCL = 0; } se (ack) SDA = 0; senão SDA = 1; SCL = 1; SCL = 0; SDA = 1; return Data; }
A função set_time é usada para definir a hora no relógio e a função show_time abaixo é usada para exibir a hora no LCD.
void show_time () // função para exibir hora / data / dia no LCD {char var; lcdcmd (0x80); lcdprint ("Data:"); sprintf (var, "% d", data); lcdprint (var); sprintf (var, "/% d", seg); lcdprint (var); sprintf (var, "/% d", ano + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Tempo:"); sprintf (var, "% d", hora); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", seg); lcdprint (var); lcdprint (""); // dia (dia1); lcdprint (""); }