Dans ce projet, nous allons démontrer la fabrication d'une horloge RTC à l'aide du microcontrôleur 8051. Si vous souhaitez faire ce projet avec Arduino, vérifiez cette horloge numérique en utilisant Arduino. Le composant principal de ce projet est le DS1307 qui est un circuit intégré d'horloge numérique en temps réel. Permet de connaître ce circuit intégré en détail.
RTC DS1307:
L'horloge série en temps réel (RTC) DS1307 est une horloge / calendrier décimal (BCD) codé binaire (BCD) de faible puissance, plus 56 octets de NV SRAM. Cette puce fonctionne sur le protocole I²C. L'horloge / calendrier fournit des informations sur les secondes, les minutes, les heures, le jour, la date, le mois et l'année. La date de fin de mois est automatiquement ajustée pour les mois de moins de 31 jours, y compris les corrections pour les années bissextiles. L'horloge fonctionne au format 24 heures ou 12 heures avec indicateur AM / PM. Le DS1307 dispose d'un circuit de détection de puissance intégré qui détecte les pannes de courant et bascule automatiquement sur l'alimentation de secours. L'opération de chronométrage se poursuit pendant que la pièce fonctionne à partir de l'alimentation de secours. La puce DS1307 peut fonctionner en continu jusqu'à 10 ans.
L'horloge temps réel basée sur 8051 est une horloge numérique permettant d'afficher le temps réel à l'aide d'un RTC DS1307, qui fonctionne sur le protocole I2C. L'horloge en temps réel signifie qu'elle fonctionne même après une panne de courant. Lorsque l'alimentation est reconnectée, il affiche le temps réel indépendamment de l'heure et de la durée pendant laquelle il était hors tension. Dans ce projet, nous avons utilisé un module LCD 16x2 pour afficher l'heure au format - (heure, minute, seconde, date, mois et année). Les horloges en temps réel sont couramment utilisées dans nos ordinateurs, maisons, bureaux et appareils électroniques pour les maintenir à jour en temps réel.
Le protocole I2C est une méthode pour connecter deux appareils ou plus en utilisant deux fils à un seul système, et donc ce protocole est également appelé protocole à deux fils. Il peut être utilisé pour communiquer 127 appareils à un seul appareil ou processeur. La plupart des appareils I2C fonctionnent sur une fréquence de 100 kHz.
Étapes de l'écriture de données maître vers esclave (mode de réception esclave)
- Envoie la condition START à l'esclave.
- Envoie l'adresse de l'esclave à l'esclave.
- Envoyer le bit d'écriture (0) à l'esclave.
- Bit ACK reçu de l'esclave
- Envoie l'adresse des mots à l'esclave.
- Bit ACK reçu de l'esclave
- Envoie les données à l'esclave.
- Reçu le bit ACK de l'esclave.
- Et le dernier envoie la condition STOP à l'esclave.
Étapes de lecture des données de l'esclave au maître (mode de transmission esclave)
- Envoie la condition START à l'esclave.
- Envoie l'adresse de l'esclave à l'esclave.
- Envoyer le bit de lecture (1) à l'esclave.
- Bit ACK reçu de l'esclave
- Données reçues de l'esclave
- Reçu le bit ACK de l'esclave.
- Envoie la condition STOP à l'esclave.
Schéma de circuit et description
Dans le circuit, nous avons utilisé 3 la plupart des composants DS1307, AT89S52 et LCD. Ici, AT89S52 est utilisé pour lire l'heure du DS1307 et l'afficher sur un écran LCD 16x2. DS1307 envoie l'heure / la date en utilisant 2 lignes au microcontrôleur.
Les connexions de circuit sont simples à comprendre et illustrées dans le schéma ci-dessus. Les broches SDA et SCL de la puce DS1307 sont connectées aux broches P2.1 et P2.0 du microcontrôleur 89S52 avec une résistance de rappel qui maintient la valeur par défaut HIGH sur les lignes de données et d'horloge. Et un oscillateur à cristal de 32,768 KHz est connecté à la puce DS1307 pour générer un retard exact de 1 seconde. Et une batterie de 3 volts est également connectée à la broche 3 ème (BAT) du DS1307 qui maintient le temps en marche après une panne d'électricité. L'écran LCD 16x2 est connecté au 8051 en mode 4 bits. Les broches de commande RS, RW et En sont directement connectées à la broche 89S52 P1.0, GND et P1.1. Et la broche de données D0-D7 est connectée à P1.4-P1.7 de 89S52.
Trois boutons à savoir SET, INC / CHANGE et Next sont utilisés pour régler l'heure de l'horloge sur les broches P2.4, P2.3 et P2.2 de 89S52 (actif bas). Lorsque nous appuyons sur SET, le mode de réglage de l'heure s'active et nous devons maintenant régler l'heure en utilisant le bouton INC / CHANGE et le bouton Suivant est utilisé pour passer au chiffre. Après avoir réglé l'heure, l'horloge fonctionne en continu.
Description du programme
Dans le code, nous avons inclus la bibliothèque de la famille 8051 et une bibliothèque d'entrée-sortie standard. Et défini les broches que nous avons utilisées, et pris une variable pour les calculs.
#comprendre
Et la fonction donnée est utilisée pour piloter l'écran LCD.
void daten () {rs = 1; en = 1; retard (1); en = 0; } void lcddata (caractère non signé ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; en = 1; retard (1); en = 0; } void lcdcmd (ch caractère non signé)
Cette fonction est utilisée pour initialiser RTC et lire l'heure et la date à partir du formulaire RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); heure = BCDToDecimal (I2CRead (1)); jour1 = BCDToDecimal (I2CRead (1)); date = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); année = BCDToDecimal (I2CRead (1)); I2CStop (); afficher l'heure(); // affichage de l'heure / date / délai du jour (1);
Ces fonctions sont utilisées pour convertir le décimal en BCD et le BCD en décimal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; retour déc; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (DecimalByte% 10); bcd = ab; return bcd; }
Les fonctions ci-dessous sont utilisées pour la communication I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // Fonction "start" pour communiquer avec ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // Fonction "stop" pour communiquer avec ds1307 RTC unsigned char I2CSend (unsigned char Data) // envoyer les données à ds1307 {char i; char ack_bit; pour (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; sinon SDA = 0; SCL = 1; Données << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; return ack_bit; } unsigned char I2CRead (char ack) // recevoir des données de ds1307 {unsigned char i, Data = 0; SDA = 1; pour (i = 0; i <8; i ++) {Data << = 1; faire {SCL = 1;} tandis que (SCL == 0); si (SDA) Data- = 1; SCL = 0; } si (ack) SDA = 0; sinon SDA = 1; SCL = 1; SCL = 0; SDA = 1; renvoyer des données; }
La fonction set_time est utilisée pour régler l'heure dans l'horloge et la fonction show_time ci-dessous est utilisée pour afficher l'heure sur l'écran LCD.
void show_time () // fonction pour afficher l'heure / la date / le jour sur l'écran LCD {char var; lcdcmd (0x80); lcdprint ("Date:"); sprintf (var, "% d", date); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", année + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Heure:"); sprintf (var, "% d", heure); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint (""); // jour (jour1); lcdprint (""); }