Conception d'un calendrier universel basé sur le microcontrôleur 51

Le système repose sur le microcontrôleur STC89C52 comme cœur central. Le matériel comprend un circuit de boutons, un affichage LCD1602, un circuit horloge DS1302, un circuit minimaliste pour le microcontrôleur, ainsi qu’un circuit de sonnerie. En logiciel, il intègre des modules de gestion des touches, d'affichage LCD, de pilotage de l'horloge et de commande de la sonnerie. Ce système permet de réaliser une fonctionnalité de calendrier universel.

1.1 Fonctionnalités principales

  • Implémentation des fonctions logicielles en langage C.
  • Utilisation du microcontrôleur STC89C52 pour assurer les opérations du calendrier.
  • Affichage de l’heure, de la date (année, mois, jour).
  • Extension possible pour intégrer l'affichage du calendrier lunaire.
  • Siumlation du circuit à l’aide de Proteus.

1.2 Vidéo de démonstration

Lien vers la vidéo de présentation

  1. Conception des circuits clés

2.1 Circuit du noyau 51

Le système minimaliste 51 assure le bon fonctionnement du microcontrôleur grâce à trois éléments essentiels : une alimentation stable, un circuit cristal et un circuit de mise à zéro. Ces composants fournissent un environnement de travail fiable et une horloge précise pour l’exécution des instructions.

  • Alimentation : Fournit une tension continue de 5V. La conception doit garantir une stabilité de tension même sous charge variable.
  • Circuit cristal : Composé d’un cristal et de condensateurs, il génère une fréquence d’horloge précise nécessaire au synchronisme interne.
  • Mise à zéro : Permet une initialisation automatique au démarrage ou manuelle via un bouton. Il empêche les blocages logiciels en redémarrant le système.

Le schéma électrique du système minimal est illustré ci-dessous :

2.2 Circuit d’horloge temps réel DS1302

Le DS1302 est un circuit intégré de gestion du temps réel développé par Dallas. Il transmet les données en mode série et fournit automatiquement l’heure, la minute, la seconde, la date, le mois, l’année, ainsi que la correction automatique des jours de fin de mois et des années bissextiles. Il dispose de deux entrées d’alimentation (principale et de secours), ce qui permet de maintenir l’horloge en cas de coupure électrique. De plus, il inclut 31 octets de mémoire RAM volatile pour stocker temporairement des données.

Pins principaux :

Interface et principe de fonctionnement du DS1302 :

Image physique du composant :

2.3 Circuit de mesure de température avec DS18B20

Le capteur DS18B20 est un capteur numérique intelligent fabriqué par Maxim Integrated. Il permet une lecture directe de la température avec une résolution configurable entre 9 et 12 bits. Grâce à son interface unifiée (bus un fil), il réduit considérablement les interférences électromagnétiques. Il fonctionne sous une tension comprise entre 3,0 V et 5,5 V, peut être alimenté directement par la ligne de données, et offre une consommation quasi nulle en veille.

  • Interface un fil unique nécessitant un seul port I/O.
  • Plage de mesure : -55 °C à +125 °C, résolution jusqu’à 0,0625 °C.
  • Alimentation par la ligne de données, compatibilité large plage de tension.
  • Alarme programmable non volatile.
  • Reconnaissance des appareils hors normes via la commande de recherche d’alarme.
  • Résistance aux polarités inversées sans risque de destruction.

Schéma électrique du circuit :

Photo du composant monté :

2.4 Circuit d’affichage LCD1602

Les broches D0 à D7 du LCD sont connectées au port P2 du microcontrôleur, servant de lignes de données. Le port P0 ne possède pas de résistances de pull-up internes, donc des résistances externes de 10 kΩ sont ajoutées. Les broches RS, RW et E du LCD sont reliées respectivement aux broches P1.0, P1.1 et P1.2. Un potentiomètre RV1 permet d’ajuster le contraste d’affichage. Les broches BLK et BLA contrôlent la lumière arrière : leur niveau logique détermine si le rétro-éclairage est activé.

Brochage principal :

Schéma du circuit d’affichage :

Image du module LCD monté :

  1. Exemples de code embarqué

3.1 Affichage de l’horloge DS1302 sur LCD

void initialize_display_and_clock() {
    write_lcd_data(1, 1, hour);          // Affiche l'heure
    write_lcd_data(1, 4, minute);        // Affiche les minutes
    write_lcd_data(1, 7, second);       // Affiche les secondes
    display_week(2, 12, weekday);        // Affiche le jour de la semaine
    write_temperature(1, 11, current_temp); // Affiche la température

    if (!is_lunar_mode) {
        write_lcd_data(2, 2, year);     // Affiche l'année (calendrier grégorien)
        write_lcd_data(2, 5, month);    // Affiche le mois
        write_lcd_data(2, 8, day);      // Affiche le jour
    } else {
        write_lcd_data(2, 2, lunar_year);   // Affiche l'année lunaire
        write_lcd_data(2, 5, lunar_month);  // Affiche le mois lunaire
        write_lcd_data(2, 8, lunar_day);    // Affiche le jour lunaire
    }
}

3.2 Lecture de la température avec DS18B20

uint get_temperature_value() {
    uint temp_raw;
    uchar low_byte;

    init_ds18b20();                     // Initialisation du capteur
    write_ds18b20(0xCC);                // Commande « skip ROM »
    write_ds18b20(0x44);                // Déclenchement conversion

    delay_ms(50);                       // Attente de fin de conversion

    init_ds18b20();
    write_ds18b20(0xCC);
    write_ds18b20(0xBE);                // Lecture du registre de température

    low_byte = read_ds18b20();          // Lecture du byte bas
    temp_raw = read_ds18b20();          // Lecture du byte haut
    temp_raw <<= 8;                      // Décalage gauche de 8 bits
    temp_raw |= low_byte;                // Fusion des deux bytes
    temp_raw *= 0.625;                   // Conversion en valeur réelle (décimale)

    return temp_raw;
}

3.3 Gestion de l’alarme

void handle_alarm_check() {
    static uchar counter, alarm_timer;
    
    if (flag_100ms == 1) {
        flag_100ms = 0;
        if (alarm_enabled) {
            if ((second == 0) && (minute == target_minute) && (hour == target_hour)) {
                alarm_active = 1;
            }

            if (alarm_active) {
                counter++;
                if (counter <= 30) {
                    buzzer = !buzzer;           // Buzzer clignote pendant 3 secondes
                } else if (counter > 30) {
                    buzzer = 1;                 // Silence pendant 1 seconde
                    if (counter > 40) {
                        counter = 0;
                    }
                }

                alarm_timer++;
                if (alarm_timer >= 10) {
                    alarm_timer = 0;
                    alarm_counter++;
                    if (alarm_counter >= 60) {
                        alarm_counter = 0;
                        alarm_active = 0;
                        buzzer = 1;
                    }
                }
            }
        }
    }
}

Étiquettes: microcontrôleur 51 STC89C52 DS1302 DS18B20 LCD1602

Publié le 9 septembre à 01h57