In questo progetto, dimostreremo come realizzare un orologio RTC utilizzando il microcontrollore 8051. Se vuoi fare questo progetto con Arduino, controlla questo orologio digitale usando Arduino. Il componente principale di questo progetto è DS1307 che è un orologio digitale IC in tempo reale. Consente di conoscere questo IC in dettaglio.
RTC DS1307:
L'orologio seriale in tempo reale (RTC) DS1307 è un orologio / calendario BCD (binary-coded decimal) completo a bassa potenza più 56 byte di NV SRAM. Questo chip funziona con il protocollo I²C. L'orologio / calendario fornisce informazioni su secondi, minuti, ore, giorno, data, mese e anno. La data di fine mese viene regolata automaticamente per i mesi con meno di 31 giorni, comprese le correzioni per l'anno bisestile. L'orologio funziona nel formato 24 ore o 12 ore con indicatore AM / PM. Il DS1307 ha un circuito di rilevamento dell'alimentazione integrato che rileva le interruzioni di corrente e passa automaticamente all'alimentazione di riserva. L'operazione di indicazione dell'ora continua mentre la parte opera dall'alimentazione di riserva. Il chip DS1307 può funzionare continuamente fino a 10 anni.
L'orologio in tempo reale basato su 8051 è un orologio digitale per visualizzare in tempo reale utilizzando un RTC DS1307, che funziona su protocollo I2C. L'orologio in tempo reale significa che funziona anche dopo un'interruzione di corrente. Quando l'alimentazione viene ricollegata, visualizza il tempo reale indipendentemente dall'ora e dalla durata in cui è stato spento. In questo progetto abbiamo utilizzato un modulo LCD 16x2 per visualizzare l'ora nel formato - (ora, minuti, secondi, data, mese e anno). Gli orologi in tempo reale sono comunemente utilizzati nei nostri computer, case, uffici e dispositivi elettronici per mantenerli aggiornati in tempo reale.
Il protocollo I2C è un metodo per collegare due o più dispositivi utilizzando due fili a un unico sistema, quindi questo protocollo è anche chiamato protocollo a due fili. Può essere utilizzato per comunicare 127 dispositivi a un singolo dispositivo o processore. La maggior parte dei dispositivi I2C funziona su una frequenza di 100 Khz.
Passaggi per la scrittura dei dati da master a slave (modalità di ricezione slave)
- Invia la condizione START allo slave.
- Invia l'indirizzo dello slave allo slave.
- Invia il bit di scrittura (0) allo slave.
- Ricevuto ACK bit dallo slave
- Invia parole indirizzo allo slave.
- Ricevuto ACK bit dallo slave
- Invia i dati allo slave.
- Ricevuto ACK bit dallo slave.
- E l'ultimo invia la condizione di STOP allo slave.
Passaggi per la lettura dei dati da slave a master (modalità di trasmissione slave)
- Invia la condizione START allo slave.
- Invia l'indirizzo dello slave allo slave.
- Invia il bit di lettura (1) allo slave.
- Ricevuto ACK bit dallo slave
- Dati ricevuti dallo slave
- Ricevuto ACK bit dallo slave.
- Invia la condizione di STOP allo slave.
Schema e descrizione del circuito
Nel circuito abbiamo utilizzato la maggior parte dei 3 componenti DS1307, AT89S52 e LCD. Qui AT89S52 viene utilizzato per leggere il tempo da DS1307 e visualizzarlo sullo schermo LCD 16x2. DS1307 invia ora / data utilizzando 2 linee al microcontrollore.
I collegamenti del circuito sono semplici da capire e mostrati nel diagramma sopra. I pin del chip DS1307 SDA e SCL sono collegati ai pin P2.1 e P2.0 del microcontrollore 89S52 con un resistore di pull up che mantiene il valore predefinito ALTO sulle linee dati e clock. E un oscillatore a cristallo da 32,768 KHz è collegato a DS1307chip per generare un ritardo esatto di 1 secondo. E una batteria da 3 volt è anche collegata al pin 3 ° (BAT) di DS1307 che mantiene il tempo in esecuzione dopo un'interruzione di corrente. L'LCD 16x2 è collegato all'8051 in modalità 4 bit. I pin di controllo RS, RW ed En sono collegati direttamente ai pin 89S52 P1.0, GND e P1.1. E il pin dati D0-D7 è collegato a P1.4-P1.7 di 89S52.
Tre pulsanti, ovvero SET, INC / CHANGE e Next, vengono utilizzati per impostare l'ora dell'orologio sui pin P2.4, P2.3 e P2.2 di 89S52 (attivo basso). Quando si preme SET, si attiva la modalità di impostazione dell'ora e ora è necessario impostare l'ora utilizzando il pulsante INC / CHANGE e il pulsante Avanti viene utilizzato per passare alla cifra. Dopo aver impostato l'ora, l'orologio funziona continuamente.
Descrizione del programma
Nel codice abbiamo incluso la libreria della famiglia 8051 e una libreria di output di input standard. E abbiamo definito i pin che abbiamo usato e preso alcune variabili per i calcoli.
#includere
E la funzione data viene utilizzata per la guida LCD.
void daten () {rs = 1; en = 1; ritardo (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; ritardo (1); en = 0; } void lcdcmd (unsigned char ch)
Questa funzione viene utilizzata per inizializzare RTC e leggere l'ora e la data dal modulo RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); ora = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); data = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); anno = BCDToDecimal (I2CRead (1)); I2CStop (); orario dello spettacolo(); // mostra ora / data / ritardo del giorno (1);
Queste funzioni vengono utilizzate per convertire i decimali in BCD e BCD in decimali.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 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; }
Le funzioni fornite di seguito vengono utilizzate per la comunicazione I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // funzione "start" per comunicare con ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // funzione "stop" per comunicare con ds1307 RTC unsigned char I2CSend (unsigned char Data) // invia dati a ds1307 {char i; char ack_bit; per (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; altrimenti SDA = 0; SCL = 1; Dati << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; return ack_bit; } unsigned char I2CRead (char ack) // riceve i dati da ds1307 {unsigned char i, Data = 0; SDA = 1; for (i = 0; i <8; i ++) {Data << = 1; fare {SCL = 1;} while (SCL == 0); se (SDA) Data- = 1; SCL = 0; } se (ack) SDA = 0; altrimenti SDA = 1; SCL = 1; SCL = 0; SDA = 1; dati di ritorno; }
La funzione set_time viene utilizzata per impostare l'ora nell'orologio e la funzione show_time di seguito viene utilizzata per visualizzare l'ora sul display LCD.
void show_time () // funzione per visualizzare ora / data / giorno sul display LCD {char var; lcdcmd (0x80); lcdprint ("Data:"); sprintf (var, "% d", date); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", anno + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Time:"); sprintf (var, "% d", hour); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint (""); // giorno (giorno1); lcdprint (""); }