- Componenti richiesti:
- Schema elettrico:
- Utilizzo del TIMER dell'8051 per la misurazione della frequenza:
- 555 Timer come sorgente di frequenza:
- Funzionamento e spiegazione del codice:
La frequenza è definita come il numero di cicli al secondo. Può anche essere definito come reciproco del tempo totale "T". In questo progetto conteremo il numero di impulsi che entrano nella porta 3.5 del microcontrollore 8051 e lo visualizzeremo sul display LCD 16 * 2. Quindi fondamentalmente abbiamo la misurazione della frequenza del segnale alla porta 3.5 di 8051. Qui abbiamo usato il chip AT89S52 8051, e un IC 555 è usato in modalità Astable per generare l'impulso campione per la dimostrazione. Abbiamo già creato un contatore di frequenza utilizzando Arduino.
Componenti richiesti:
- Microcontrollore 8051 (AT89S52)
- Display LCD 16 * 2
- Sorgente di frequenza (timer 555)
- Potenziometro
- Cavi di collegamento
Schema elettrico:
Utilizzo del TIMER dell'8051 per la misurazione della frequenza:
Il microcontrollore 8051 è un microcontrollore a 8 bit che ha 128 byte di RAM su chip, 4K byte di ROM su chip, due timer, una porta seriale e quattro porte a 8 bit. Il microcontrollore 8052 è un'estensione del microcontrollore. Per configurare la porta 3.5 come contatore, i valori del registro TMOD sono impostati su 0x51. La figura seguente mostra il registro TMOD.
CANCELLO | C / T | M1 | M0 | CANCELLO | C / T | M1 | M2 |
TIMER 1 | TIMER 0 |
GATE - quando GATE è impostato, il timer o il contatore è abilitato solo quando il pin INTx è HIGH e il pin di controllo TRx è impostato. Quando GATE è azzerato, il timer è abilitato ogni volta che il bit di controllo TRx è SET.
C / T - quando C / T = 0, funge da timer. Quando C / T = 1, agisce come Counter.
M1 e M0 indicano la modalità di funzionamento.
Per TMOD = 0x51, timer1 funge da contatore e funziona in modalità1 (16 bit).
16 * 2 LCD viene utilizzato per visualizzare la frequenza del segnale in Hertz (Hz). Se non conosci l'LCD 16x2, controlla di più sui pin dell'LCD 16x2 e sui suoi comandi qui. Controllare anche come interfacciare l'LCD con l'8051.
555 Timer come sorgente di frequenza:
La sorgente di frequenza dovrebbe produrre onde quadre e l'ampiezza massima è limitata a 5V, poiché le porte del microcontrollore 8051 non possono gestire tensioni superiori a 5V. La frequenza massima che può misurare è 655,35 KHz a causa della limitazione di memoria dei registri TH1 e TL1 (8 bit ciascuno). In 100 millisecondi, TH1 e TL1 possono contenere fino a 65535 conteggi. Quindi la frequenza massima che può essere misurata è 65535 * 10 = 655,35 KHz.
In questo progetto 8051 Frequency Meter, sto usando il timer 555 in modalità astabile per produrre onde quadre a frequenza variabile. La frequenza del segnale generato dal 555 IC, può essere variata regolando il potenziometro come dimostrato nel Video fornito alla fine di questo Progetto.
In questo progetto, il Timer1 (T1) conta il numero di impulsi che entrano nella porta 3.5 dei microcontrollori 8051 per 100 millisecondi. I valori di conteggio verranno memorizzati rispettivamente nei registri TH1 e TL1. Per combinare i valori del registro TH1 e TL1, viene utilizzata la formula seguente.
Impulsi = TH1 * (0x100) + TL1
Ora l '"impulso" avrà il numero di cicli in 100 millisecondi. Ma la frequenza del segnale è definita come numero di cicli al secondo. Per convertirlo in frequenza, viene utilizzata la formula seguente.
Impulsi = Impulsi * 10
Funzionamento e spiegazione del codice:
Il programma completo in C per questo frequenzimetro è fornito alla fine di questo progetto. Il codice è suddiviso in piccoli blocchi significativi e spiegato di seguito.
Per l'interfacciamento LCD 16 * 2 con il microcontrollore 8051, dobbiamo definire i pin su cui lcd 16 * 2 è collegato al microcontrollore 8051. Il pin RS di 16 * 2 lcd è collegato a P2.7, il pin RW di 16 * 2 lcd è collegato a P2.6 e il pin E di 16 * 2 lcd è collegato a P2.5. I pin dati sono collegati alla porta 0 del microcontrollore 8051.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
Successivamente dobbiamo definire alcune funzioni che vengono utilizzate nel programma. La funzione di ritardo viene utilizzata per creare un ritardo di tempo specificato. La funzione Cmdwrt viene utilizzata per inviare comandi al display LCD 16 * 2. La funzione datawrt viene utilizzata per inviare dati al display lcd 16 * 2.
void delay (unsigned int); void cmdwrt (carattere non firmato); void datawrt (carattere non firmato);
In questa parte del codice, stiamo inviando comandi a 16 * 2 lcd. Comandi come display azzerato, cursore incremento, costringono il cursore all'inizio della 1 ° riga vengono inviati a 16 * 2 display LCD uno per uno dopo un certo intervallo di tempo specificato.
per (i = 0; i <5; i ++) {cmdwrt (cmd); ritardo (1); }
In questa parte del codice, il timer1 è configurato come contatore e la modalità di funzionamento è impostata sulla modalità 1.
Timer0 è configurato come timer e la modalità di funzionamento è impostata sulla modalità 1. Il timer 1 viene utilizzato per contare il numero di impulsi e il timer 0 viene utilizzato per generare il ritardo. I valori TH1 e TL1 sono impostati su 0, per garantire che il conteggio inizi da 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
In questa parte del codice, il timer viene eseguito per 100 millisecondi. 100 millisecondi di ritardo vengono generati utilizzando la funzione di ritardo. TR1 = 1 serve per avviare il timer e TR1 = 0 per fermare il timer dopo 100 millisecondi.
TR1 = 1; ritardo (100); TR1 = 0;
In questa parte del codice vengono combinati i valori di conteggio presenti nei registri TH1 e TL1 e poi viene moltiplicato per 10 per ottenere il numero totale di cicli in 1 secondo.
Impulsi = TH1 * (0x100) + TL1; Impulsi = impulsi * 10;
In questa parte del codice, il valore della frequenza viene convertito in byte singoli per facilitarne la visualizzazione sul display LCD 16 * 2.
d1 = impulsi% 10; s1 = impulsi% 100; s2 = impulsi% 1000; s3 = impulsi% 10000; s4 = impulsi% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (impulsi-s4) / 100000;
In questa parte del codice, le singole cifre del valore della frequenza vengono convertite in formato ASCII e vengono visualizzate sul display LCD 16 * 2.
If (impulsi> = 100000) datawrt (0x30 + d6); if (impulsi> = 10000) datawrt (0x30 + d5); if (impulsi> = 1000) datawrt (0x30 + d4); if (impulsi> = 100) datawrt (0x30 + d3); if (impulsi> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
In questa parte del codice, inviamo comandi al display lcd 16 * 2. Il comando viene copiato sulla porta 0 del microcontrollore 8051. RS è ridotta per la scrittura del comando. RW è ridotto per l'operazione di scrittura. L'impulso da alto a basso viene applicato al pin di abilitazione (E) per avviare l'operazione di scrittura del comando.
void cmdwrt (carattere senza segno x) {P0 = x; rs = 0; rw = 0; en = 1; ritardo (1); en = 0; }
In questa parte del codice, stiamo inviando i dati al display lcd 16 * 2. I dati vengono copiati sulla porta 0 del microcontrollore 8051. RS è elevato per la scrittura del comando. RW è ridotto per l'operazione di scrittura. L'impulso da alto a basso viene applicato al pin di abilitazione (E) per avviare l'operazione di scrittura dei dati.
void datawrt (unsigned char y) {P0 = y; rs = 1; rw = 0; en = 1; ritardo (1); en = 0; }
In questo modo possiamo misurare la frequenza di qualsiasi segnale utilizzando il microcontrollore 8051. Controlla il codice completo e il video dimostrativo di seguito.