- Composants requis:
- Schéma:
- Utilisation du TIMER de 8051 pour mesurer la fréquence:
- 555 Timer comme source de fréquence:
- Explication du fonctionnement et du code:
La fréquence est définie comme le nombre de cycles par seconde. Il peut également être défini comme réciproque du temps total «T». Dans ce projet, nous allons compter le nombre d'impulsions entrant dans le port 3.5 du microcontrôleur 8051 et l'afficher sur un écran LCD 16 * 2. Donc, fondamentalement, nous avons mesuré la fréquence du signal au port 3.5 de 8051. Ici, nous avons utilisé la puce AT89S52 8051, et un IC 555 est utilisé en mode Astable pour générer l'impulsion d'échantillonnage pour la démonstration. Nous avons déjà construit un compteur de fréquence en utilisant Arduino.
Composants requis:
- Microcontrôleur 8051 (AT89S52)
- Écran LCD 16 * 2
- Source de fréquence (minuterie 555)
- Potentiomètre
- Fils de connexion
Schéma:
Utilisation du TIMER de 8051 pour mesurer la fréquence:
Le microcontrôleur 8051 est un microcontrôleur 8 bits qui a 128 octets de RAM sur puce, 4K octets de ROM sur puce, deux minuteries, un port série et quatre ports 8 bits. Le microcontrôleur 8052 est une extension du microcontrôleur. Pour configurer le port 3.5 comme compteur, les valeurs du registre TMOD sont définies sur 0x51. La figure ci-dessous montre le registre TMOD.
PORTE | C / T | M1 | M0 | PORTE | C / T | M1 | M2 |
MINUTERIE 1 | TIMER 0 |
GATE - lorsque GATE est réglé, la minuterie ou le compteur est activé uniquement lorsque la broche INTx est HIGH et la broche de commande TRx est définie. Lorsque GATE est effacé, la minuterie est activée chaque fois que le bit de contrôle TRx est réglé sur SET.
C / T - lorsque C / T = 0, il agit comme minuterie. Lorsque C / T = 1, il agit en tant que compteur.
M1 et M0 indiquent le mode de fonctionnement.
Pour TMOD = 0x51, timer1 fait office de compteur et fonctionne en mode1 (16 bits).
16 * 2 L'écran LCD est utilisé pour afficher la fréquence du signal en Hertz (Hz). Si vous êtes nouveau sur l'écran LCD 16x2, vérifiez plus sur les broches de l'écran LCD 16x2 et ses commandes ici. Vérifiez également comment interfacer l'écran LCD avec le 8051.
555 Timer comme source de fréquence:
La source de fréquence doit produire des ondes carrées et l'amplitude maximale est limitée à 5V, car les ports du microcontrôleur 8051 ne peuvent pas gérer une tension supérieure à 5V. La fréquence maximale qu'il peut mesurer est de 655,35 KHz en raison de la limitation de la mémoire des registres TH1 et TL1 (8 bits chacun). En 100 millisecondes, TH1 et TL1 peuvent contenir jusqu'à 65535 comptes. Par conséquent, la fréquence maximale pouvant être mesurée est 65535 * 10 = 655,35 KHz.
Dans ce projet 8051 Frequency Meter, j'utilise la minuterie 555 en mode astable pour produire des ondes carrées à fréquence variable. La fréquence du signal généré par 555 IC peut être variée en ajustant le potentiomètre comme démontré dans la vidéo donnée à la fin de ce projet.
Dans ce projet, le Timer1 (T1) compte le nombre d'impulsions entrant dans le port 3.5 de 8051 microcontrôleurs pendant 100 millisecondes. Les valeurs de comptage seront stockées respectivement dans les registres TH1 et TL1. Pour combiner les valeurs des registres TH1 et TL1, la formule ci-dessous est utilisée.
Impulsions = TH1 * (0x100) + TL1
Désormais, «l'impulsion» aura un nombre de cycles en 100 millisecondes. Mais la fréquence du signal est définie comme le nombre de cycles par seconde. Pour le convertir en fréquence, la formule ci-dessous est utilisée.
Impulsions = Impulsions * 10
Explication du fonctionnement et du code:
Le programme C complet de ce fréquencemètre est donné à la fin de ce projet. Le code est divisé en petits morceaux significatifs et expliqué ci-dessous.
Pour l'interfaçage LCD 16 * 2 avec le microcontrôleur 8051, nous devons définir des broches sur lesquelles 16 * 2 LCD est connecté au microcontrôleur 8051. La broche RS de 16 * 2 lcd est connectée à P2.7, la broche RW de 16 * 2 lcd est connectée à P2.6 et la broche E de 16 * 2 lcd est connectée à P2.5. Les broches de données sont connectées au port 0 du microcontrôleur 8051.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
Ensuite, nous devons définir certaines fonctions qui sont utilisées dans le programme. La fonction de retard est utilisée pour créer un délai spécifié. La fonction Cmdwrt est utilisée pour envoyer des commandes à un écran LCD 16 * 2. La fonction datawrt est utilisée pour envoyer des données à un écran LCD 16 * 2.
délai d'annulation (int non signé); void cmdwrt (caractère non signé); void datawrt (caractère non signé);
Dans cette partie du code, nous envoyons des commandes à 16 * 2 lcd. Des commandes telles que l'affichage clair, incrémenter le curseur, forcer le curseur au début de la 1ère ligne sont envoyées à l'écran LCD 16 * 2 une par une après un certain délai spécifié.
pour (i = 0; i <5; i ++) {cmdwrt (cmd); retard (1); }
Dans cette partie du code, timer1 est configuré comme compteur et le mode de fonctionnement est réglé sur le mode 1.
Timer0 est configuré comme minuterie et le mode de fonctionnement est réglé sur le mode 1. La minuterie 1 est utilisée pour compter le nombre d'impulsions et la minuterie 0 est utilisée pour générer une temporisation. Les valeurs TH1 et TL1 sont mises à 0, pour garantir que le comptage commence à 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
Dans cette partie du code, la minuterie est conçue pour fonctionner pendant 100 millisecondes. 100 millisecondes de retard sont générées à l' aide de la fonction de retard. TR1 = 1 sert à démarrer la minuterie et TR1 = 0 à arrêter la minuterie après 100 millisecondes.
TR1 = 1; retard (100); TR1 = 0;
Dans cette partie du code, les valeurs de comptage présentes dans les registres TH1 et TL1 sont combinées puis il est multiplié par 10 pour obtenir le nombre total de cycles en 1 seconde.
Impulsions = TH1 * (0x100) + TL1; Impulsions = impulsions * 10;
Dans cette partie du code, la valeur de fréquence est convertie en octets uniques pour faciliter l'affichage sur un écran LCD 16 * 2.
d1 = impulsions% 10; s1 = impulsions% 100; s2 = impulsions% 1000; s3 = impulsions% 10000; s4 = impulsions% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (impulsions-s4) / 100000;
Dans cette partie du code, les chiffres individuels de la valeur de fréquence sont convertis au format ASCII et affichés sur un écran LCD 16 * 2.
Si (impulsions> = 100000) datawrt (0x30 + d6); if (impulsions> = 10000) datawrt (0x30 + d5); if (impulsions> = 1000) datawrt (0x30 + d4); if (impulsions> = 100) datawrt (0x30 + d3); if (impulsions> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
Dans cette partie du code, nous envoyons des commandes à un écran LCD 16 * 2. La commande est copiée sur le port 0 du microcontrôleur 8051. RS est rendu bas pour l'écriture de commande. RW est rendu bas pour l'opération d'écriture. L'impulsion de haut en bas est appliquée sur la broche d'activation (E) pour démarrer l'opération d'écriture de commande.
void cmdwrt (caractère non signé x) {P0 = x; rs = 0; rw = 0; en = 1; retard (1); en = 0; }
Dans cette partie du code, nous envoyons des données à un écran LCD 16 * 2. Les données sont copiées sur le port 0 du microcontrôleur 8051. RS est rendu haut pour l'écriture de commande. RW est rendu bas pour l'opération d'écriture. L'impulsion de haut en bas est appliquée sur la broche d'activation (E) pour démarrer l'opération d'écriture de données.
void datawrt (caractère non signé y) {P0 = y; rs = 1; rw = 0; en = 1; retard (1); en = 0; }
C'est ainsi que nous pouvons mesurer la fréquence de n'importe quel signal à l'aide du microcontrôleur 8051. Vérifiez le code complet et la vidéo de démonstration ci-dessous.