- Composants requis:
- Schéma:
- Mesure de la température avec LM35 en utilisant 8051:
- Écran LCD 16x2:
- ADC0804 IC:
- Capteur de température LM35:
- Explication du code:
Parfois, les gens ont du mal à lire la température à partir d'un thermomètre analogique en raison des fluctuations. Nous allons donc construire ici un simple thermomètre numérique utilisant un microcontrôleur 8051 dans lequel le capteur LM35 est utilisé pour mesurer la température. Nous avons également utilisé LM35 pour construire un thermomètre numérique en utilisant Arduino, NodeMCU, PIC, Raspberry Pi et d'autres microcontrôleurs.
Ce projet servira également d'interface appropriée de ADC0804 avec 8051 et 16 * 2 LCD avec microcontrôleur 8051.
Composants requis:
- Carte de développement 8051
- Carte ADC0804
- Écran LCD 16 * 2
- Capteur LM35
- Potentiomètre
- Fils de cavalier
Schéma:
Le schéma du circuit du thermomètre numérique utilisant LM35 est donné ci-dessous:
Mesure de la température avec LM35 en utilisant 8051:
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. Le tableau ci-dessous montre la comparaison de 8051 membres de la famille.
Fonctionnalité |
8051 |
8052 |
ROM (en octets) |
4K |
8K |
RAM (octets) |
128 |
256 |
Minuteries |
2 |
3 |
Broches E / S |
32 |
32 |
Port série |
1 |
1 |
Sources d'interruption |
6 |
8 |
Écran LCD 16x2:
L'écran LCD 16 * 2 est un écran largement utilisé pour les applications intégrées. Voici une brève explication sur les broches et le fonctionnement de l'écran LCD 16 * 2. Il y a deux registres très importants à l'intérieur de l'écran LCD. Ce sont un registre de données et un registre de commande. Le registre de commande est utilisé pour envoyer des commandes telles que l'affichage clair, le curseur à la maison, etc., le registre de données est utilisé pour envoyer des données qui doivent être affichées sur l'écran LCD 16 * 2. Le tableau ci-dessous montre la description des broches de 16 * 2 lcd.
Épingle |
symbole |
E / S |
La description |
1 |
Vss |
- |
Sol |
2 |
Vdd |
- |
Alimentation + 5V |
3 |
Vee |
- |
Alimentation pour contrôler le contraste |
4 |
RS |
je |
RS = 0 pour le registre de commande, RS = 1 pour registre de données |
5 |
RW |
je |
R / W = 0 pour l'écriture, R / W = 1 pour la lecture |
6 |
E |
E / S |
Activer |
sept |
D0 |
E / S |
Bus de données 8 bits (LSB) |
8 |
D1 |
E / S |
Bus de données 8 bits |
9 |
D2 |
E / S |
Bus de données 8 bits |
dix |
D3 |
E / S |
Bus de données 8 bits |
11 |
D4 |
E / S |
Bus de données 8 bits |
12 |
D5 |
E / S |
Bus de données 8 bits |
13 |
D6 |
E / S |
Bus de données 8 bits |
14 |
D7 |
E / S |
Bus de données 8 bits (MSB) |
15 |
UNE |
- |
+ 5V pour le rétroéclairage |
16 |
K |
- |
Sol |
Le tableau ci-dessous montre les codes de commande LCD fréquemment utilisés.
Code (hexadécimal) |
La description |
01 |
Écran d'affichage clair |
06 |
Curseur incrémental (décalage vers la droite) |
0A |
Affichage désactivé, curseur activé |
0C |
Affichage activé, curseur désactivé |
0F |
Affichage allumé, le curseur clignote |
80 |
Force le curseur au début de la 1ère ligne |
C0 |
Force le curseur au début de la 2 ème ligne |
38 |
2 lignes et matrice 5 * 7 |
ADC0804 IC:
L' IC ADC0804 est un ADC parallèle 8 bits de la famille de la série ADC0800 de National Semiconductor. Il fonctionne avec +5 volts et a une résolution de 8 bits. La taille de pas et la plage de Vin varient pour différentes valeurs de Vref / 2. Le tableau ci-dessous montre la relation entre Vref / 2 et la gamme Vin.
Vref / 2 (V) |
Vin (V) |
Taille de pas (mV) |
ouvert |
0 à 5 |
19,53 |
2.0 |
0 à 4 |
15,62 |
1,5 |
0 à 3 |
11,71 |
1,28 |
0 à 2,56 |
dix |
Dans notre cas, Vref / 2 est connecté à 1,28 volts, donc la taille du pas est de 10 mV. Pour ADC0804, la taille de pas est calculée comme suit (2 * Vref / 2) / 256.
La formule suivante est utilisée pour calculer la tension de sortie:
Dout = Vin / taille de pas
Où Dout est la sortie de données numériques en décimal, Vin = tension d'entrée analogique et la taille de pas (résolution) est le plus petit changement. En savoir plus sur ADC0804 ici, vérifier également l'interfaçage de ADC0808 avec 8051.
Capteur de température LM35:
Le LM35 est un capteur de température dont la tension de sortie est linéairement proportionnelle à la température Celsius. Le LM35 est déjà étalonné et ne nécessite donc aucun étalonnage externe. Il produit 10 mV pour chaque degré de température Celsius.
Le capteur LM35 produit une tension correspondant à la température. Cette tension est convertie en numérique (0 à 256) par ADC0804 et elle est transmise au microcontrôleur 8051. Le microcontrôleur 8051 convertit cette valeur numérique en température en degrés Celsius. Ensuite, cette température est convertie en forme ascii qui convient à l'affichage. Ces valeurs ascii sont transmises à 16 * 2 lcd qui affiche la température sur son écran. Ce processus est répété après un intervalle spécifié.
Vous trouverez ci-dessous l'image de configuration du thermomètre numérique LM35 utilisant 8051:
Vous pouvez trouver tous les thermomètres numériques basés sur LM35 ici.
Explication du code:
Le programme C complet pour ce thermomètre numérique utilisant LM35 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; // Broche de sélection de registre (RS) de 16 * 2 lcd sbit rw = P2 ^ 6; // Broche de lecture / écriture (RW) de 16 * 2 lcd sbit en = P2 ^ 5; // Activer la broche (E) de 16 * 2 lcd
De même, pour l' interfaçage ADC0804 avec le microcontrôleur 8051, nous devons définir des broches sur lesquelles ADC0804 est connecté au microcontrôleur 8051. La broche RD de l'ADC0804 est connectée à P3.0, la broche WR de l'ADC0804 est connectée à P3.1 et la broche INTR de l'ADC0804 est connectée à P3.2. Les broches de données sont connectées au port 1 du microcontrôleur 8051.
sbit rd_adc = P3 ^ 0; // Lire la broche (RD) de ADC0804 sbit wr_adc = P3 ^ 1; // Écriture de la broche (WR) de ADC0804 sbit intr_adc = P3 ^ 2; // Broche d'interruption (INTR) de l'ADC0804
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 c mdwrt est utilisée pour envoyer des commandes à l'écran LCD 16 * 2, la fonction datawrt est utilisée pour envoyer des données à l'écran LCD 16 * 2 et la fonction convert_display est utilisée pour convertir les données ADC en température et pour l'afficher sur un écran LCD 16 * 2.
délai d'annulation (int non signé); // fonction de création de délai void cmdwrt (unsigned char); // fonction d'envoi de commandes à 16 * 2 lcd display void datawrt (unsigned char); // fonction d'envoi de données à 16 * 2 écran lcd void convert_display (unsigned char); // fonction pour convertir la valeur ADC en température et l'afficher sur un écran LCD 16 * 2
Dans la partie ci-dessous 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é.
for (i = 0; i <5; i ++) // envoyer des commandes à 16 * 2 lcd afficher une commande à la fois {cmdwrt (cmd); // appel de fonction pour envoyer des commandes à 16 * 2 délai d'affichage lcd (1); }
Dans cette partie du code, nous envoyons des données à 16 * 2 lcd. Les données à afficher sur l'écran LCD 16 * 2 sont envoyées pour s'afficher une par une après un certain délai spécifié.
for (i = 0; i <12; i ++) // envoyer des données à 16 * 2 lcd afficher un caractère à la fois {datawrt (data1); // appel de fonction pour envoyer des données à 16 * 2 délai d'affichage lcd (1); } Dans cette partie du code, nous convertissons la tension analogique produite par le capteur LM35 en données numériques, puis elle est convertie en température et affichée sur un écran LCD 16 * 2. Pour que l'ADC0804 démarre la conversion, nous devons envoyer une impulsion de bas en haut sur la broche WR de l'ADC0804, puis nous devons attendre la fin de la conversion. INTR devient faible à la fin de la conversion. Une fois que INTR devient faible, RD est réduit pour copier les données numériques sur le port 0 du microcontrôleur 8051. Après un délai spécifié, le cycle suivant démarre. Ce processus est répété pour toujours.
while (1) // répéter pour toujours {wr_adc = 0; // envoie l'impulsion LOW à HIGH sur le retard de broche WR (1); wr_adc = 1; while (intr_adc == 1); // attend la fin de la conversion rd_adc = 0; // make RD = 0 pour lire les données de ADC0804 value = P1; // copie des données ADC convert_display (value); // appel de fonction pour convertir les données ADC en température et l'afficher sur un délai d'affichage lcd 16 * 2 (1000); // intervalle entre tous les cycles rd_adc = 1; // rend RD = 1 pour le prochain cycle}
Dans la partie ci-dessous 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; // envoie la commande au port 0 sur lequel 16 * 2 lcd est connecté rs = 0; // rend RS = 0 pour la commande rw = 0; // rend RW = 0 pour l'opération d'écriture en = 1; // envoie une impulsion HAUT à BAS sur la broche Enable (E) pour démarrer le délai d'opération d'écriture de commande (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; // envoie les données au port 0 sur lequel 16 * 2 lcd est connecté rs = 1; // rend RS = 1 pour la commande rw = 0; // rend RW = 0 pour l'opération d'écriture en = 1; // envoie une impulsion HAUT à BAS sur la broche Enable (E) pour démarrer le délai d'opération d'écriture de données (1); en = 0; }
Dans cette partie du code, nous convertissons les données numériques en température et les affichons sur un écran LCD 16 * 2.
void convert_display (valeur de caractère non signé) {caractère non signé x1, x2, x3; cmdwrt (0xc6); // commande pour placer le curseur sur la 6ème position de la 2ème ligne sur 16 * 2 lcd x1 = (valeur / 10); // divise la valeur par 10 et stocke le quotient dans la variable x1 x1 = x1 + (0x30); // convertit la variable x1 en ascii en ajoutant 0x30 x2 = valeur% 10; // divise la valeur par 10 et stocke le reste dans la variable x2 x2 = x2 + (0x30); // convertit la variable x2 en ascii en ajoutant 0x30 x3 = 0xDF; // valeur ascii du symbole de degré (°) datawrt (x1); // affichage de la température sur 16 * 2 affichage lcd datawrt (x2); datawrt (x3); datawrt («C»); }
Vérifiez également les autres thermomètres utilisant LM35 avec différents microcontrôleurs:
- Thermomètre numérique utilisant Arduino et LM35
- Mesure de température à l'aide du microcontrôleur LM35 et AVR
- Mesure de la température ambiante avec Raspberry Pi