microcontrôleur PIC16F877A
EMBARQUÉ
ParAswinth Raj 25 mai 20187
Matériaux nécessaires:
Planche à pain - 2Nos
PIC16F877A
Source d'alimentation 5V - Module d'alimentation
Cristal de 20 MHz
Condensateur 33pf - 2Nos
Module DS3231 RTC
Module d'affichage LCD 16 * 2
POT 10K
Résistance 10k et 1K
Boutons poussoirs - 5Nos
Avertisseur sonore
Fils de connexion
Conditions préalables:
Ce projet nécessite que vous connaissiez quelques notions de base sur le microcontrôleur
PIC et comment le programmer. Nous utiliserons des GPIO, un écran LCD et un module
RTC pour ce projet. Il vaut donc mieux apprendre à utiliser ces modules au préalable. Les
liens suivants vous aideront à apprendre la même chose
Schéma:
Le schéma de circuit de ce projet de réveil basé sur PIC est illustré ci-dessous, qui a été
créé à l'aide du logiciel proteus. Le sera également utilisé pour la simulation plus loin dans
ce projet.
Les cinq boutons-poussoirs agiront comme une entrée pour régler l'alarme pendant la durée
requise. Ainsi, une extrémité de tous les boutons-poussoirs est connectée à la masse et les
autres extrémités sont connectées à la broche PORTB, une résistance de rappel interne
sera utilisée sur ces broches pour éviter que les broches ne flottent. Le buzzer agira comme
une sortie et nous émettra un bip lorsque l'alarme se déclenchera et sera connectée à la
broche PORT S. L'heure actuelle est toujours conservée par le module RTC DS3231
à partir duquel le PIC reçoit les données via le bus I2C, de sorte que les broches SCL et
SDA du module RTC sont connectées aux broches SCL et SDA du contrôleur PIC. Un
écran LCD est attaché au PORTD du PIC qui est utilisé pour afficher l'heure actuelle et
régler l'heure. En savoir plus sur l'utilisation du module DS3231 RTC avec PIC ici.
Le circuit complet peut être construit sur une maquette. Puisqu'il y a une douzaine de fils à
connecter, soyez patient et assurez-vous que les connexions sont correctes. Ma
configuration matérielle ressemblait à ceci ci-dessous une fois que j'ai terminé les
connexions
J'ai utilisé un module de maquette et un adaptateur 12V pour alimenter le module. Ceci est
ma source de tension d'alimentation + 5V. Je dois aussi utiliser deux planches à pain pour
garder le circuit propre. Vous pouvez également souder l'ensemble du circuit à une carte de
performance si vous souhaitez créer un projet plus robuste.
// Définir Buzz
TRISD = 0x00; // Rendre les broches du port D comme outptu pour l'interface LCD
Puisque nous avons le fichier d'en-tête LCD et I2C lié au programme principal, nous
pouvons démarrer l'initialisation de l'écran LCD en appelant une fonction simple. La
même chose peut être faite pour l' initialisation I2C . Ici, nous commençons la
communication I2C à 100 kHz puisque le module RTC fonctionne à 100 kHz.
I2C_Initialize (100); // Initialisation du maître I2C avec une horloge à 100 KHz
La fonction ci-dessous est utilisée pour régler l'heure et la date sur le module RTC , une
fois que l'heure et la date sont réglées, supprimez cette ligne. Sinon chaque fois que vous
démarrez le programme, l'heure et la date seront réglées encore et encore
// Supprime la ligne ci-dessous une fois que l'heure et la date sont définies pour la
première fois.
Lcd_Clear ();
Lcd_Set_Cursor (1,1);
Lcd_Print_String ("Réveil");
Lcd_Set_Cursor (2,1);
L'appel de la fonction ci-dessus mettra à jour les variables sec, min et heure avec la valeur
actuelle. Afin de les afficher sur l'écran LCD, nous devons les diviser en caractères
individuels en utilisant le code ci-dessous.
Ensuite, nous mettons à jour les valeurs sur l'écran LCD . L'heure actuelle sera affichée
sur la première ligne et l'heure réglée à laquelle l'alarme doit être déclenchée est affichée
sur la deuxième ligne. Le code qui fait la même chose est indiqué ci-dessous.
Lcd_Clear ();
Lcd_Print_String ("TIME:");
Lcd_Print_Char (':');
Lcd_Print_Char (':');
Lcd_Print_String ("Alarme:");
Lcd_Print_Char (':');
Maintenant, nous avons affiché l'heure et l'heure réglée sur l'écran LCD, nous
devons vérifier si l'utilisateur essaie de régler l'heure de l'alarme . Pour ce faire,
l'utilisateur doit appuyer sur le bouton du milieu, nous allons donc vérifier si le bouton du
milieu est enfoncé et basculer une variable pour entrer en mode de réglage d'alarme. Le
même bouton sera à nouveau pressé pour confirmer que les valeurs sont réglées et dans ce
cas, nous devons sortir du mode de réglage d'alarme. Nous utilisons donc la ligne de code
ci-dessous pour changer le statut de la variable set_alarm .
// Utilisez le bouton du milieu pour vérifier si l' alarme doit être définie
Si l'utilisateur a appuyé sur le bouton du milieu , cela signifie qu'il essaie de régler
l'heure de l'alarme. Dans ce cas, le programme entre en mode de réglage d'alarme en
utilisant le code ci-dessus. Dans le mode de réglage de l'alarme, si l'utilisateur appuie sur le
bouton gauche ou droit, cela signifie que nous devons déplacer le curseur vers la gauche ou
la droite. Pour ce faire on incrémente ou décrémente simplement la valeur de la position à
laquelle le curseur doit être placé
Semblable aux boutons gauche et droit, nous avons également les boutons supérieur et
inférieur qui peuvent être utilisés pour augmenter ou diminuer la valeur de l'heure de
l'alarme . Le code pour faire de même est indiqué ci-dessous. Notez que chaque caractère
de l'heure d'alarme définie est adressé par la valeur d'index du tableau. C'est ainsi que nous
pouvons facilement accéder au caractère requis dont les valeurs doivent être modifiées.
Une fois l'heure de l'alarme réglée, l'utilisateur appuiera à nouveau sur le bouton
central . Ensuite, nous pouvons commencer à comparer l'heure actuelle avec l'heure
définie. La comparaison en vérifiant si chaque caractère de l'heure actuelle est égal au
caractère de l'heure définie. Si les valeurs sont égales, nous déclenchons l'alarme en
définissant la variable trigger_alarm , sinon nous comparons simplement jusqu'à ce qu'elle
soit égale.
// Bip le buzzer
BUZZ = 1;
__delay_ms (500);
BUZZ = 0;
__delay_ms (500);
Simulation:
Ce programme peut également être simulé à l'aide du logiciel proteus. Recréez simplement
le circuit illustré ci-dessus et chargez le fichier hexadécimal dans le PIC. Le code
hexadécimal de ce projet se trouve dans le fichier ZIP lié ici . Une capture d'écran prise
pendant la simulation est présentée ci-dessous
La simulation devient très utile lorsque vous essayez d'ajouter de nouvelles fonctionnalités
au projet. Vous pouvez également utiliser le module de débogage I2C pour vérifier quelles
données entrent et sortent via le bus I2C. Vous pouvez essayer d'appuyer sur les boutons
et également régler l'heure de l'alarme. Lorsque l'heure réglée est égale à l'heure actuelle,
la sonnerie se déclenche.
Le code PIC complet avec les fichiers d'en-tête peut être trouvé ici
Code
/*
* Programme: Alarm Clock Using PIC
* Auteur: B.Aswinth Raj
* Plus d'infos: www.circuitdigest.com
* Créé le 11 mai 2018, 15h02
* /
#pragma config FOSC = HS // Oscillator Selection bits (Oscillateur HS)
#pragma config WDTE = OFF // Bit d'activation de l'horloge de surveillance (WDT désactivé)
#pragma config PWRTE = ON // Bit d'activation de la minuterie de mise sous tension (PWRT activé)
#pragma config BOREN = ON // Réinitialisation de la coupure de courant Bit d'activation (BOR activé)
#pragma config LVP = OFF // Bit d'activation de la programmation série en circuit basse tension
(alimentation simple) (RB3 est une E / S numérique, HV sur MCLR doit être utilisé pour la programmation)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection Bit (Data EEPROM code
protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Protection en écriture
désactivée; toute la mémoire programme peut être écrite par le contrôle EECON )
#pragma config CP = OFF // Bit de protection de code de mémoire de programme flash (protection de
code désactivée)
// Définir Buzz
#define BUZZ RD1 // Le buzzer est connecté à RD1
char alarm_h0 = 0;
char alarm_h1 = 0;
char alarm_m0 = 0;
char alarm_m1 = 0;
int alarm_val [4] = {0, 0, 0, 0};
/ * Fin de la déclaration var * /
#include <xc.h>
#include "lcd.h" // En-tête pour l'utilisation du module LCD
#include "PIC16F877a_I2C.h" // En-tête pour l'utilisation du protocole I2C
#include "PIC16F877a_DS3231.h" // En-tête pour l'utilisation du module DS3231 RTC
int main() {
TRISD = 0x00; // Rendre les broches du port D comme outptu pour l'interface LCD
TRISB = 0xFF; // Les commutateurs sont déclarés comme broches d'entrée
OPTION_REG = 0b00000000; // Activer la résistance de rappel sur le port B pour les commutateurs
BUZZ = 0; // Tourner le buzzer
I2C_Initialize (100); // Initialisation du maître I2C avec une horloge à 100 KHz
// Supprime la ligne ci-dessous une fois que l'heure et la date sont définies pour la première fois.
Set_Time_Date (); // régler l'heure et la date sur le module RTC
__delay_ms (50);
// SI l'alarme est définie Vérifiez si la valeur définie est égale à la valeur actuelle
si (set_alarm == 0 && alarm_val [0] == hour_1 && alarm_val [1] == hour_0 && alarm_val [2] ==
min_1 && alarm_val [3 ] == min_0)
trigger_alarm = 1; // Activer le déclencheur si la valeur correspond
if (trigger_alarm) {// Si l'alarme est déclenchée
// Bip le buzzer
BUZZ = 1;
__delay_ms (500);
BUZZ = 0;
__delay_ms (500);
}
}
return 0;
}
Vidéo