- Components necessaris:
- Esquema de connexions:
- Utilitzant TIMER de 8051 per mesurar la freqüència:
- Temporitzador 555 com a font de freqüència:
- Explicació del funcionament i del codi:
La freqüència es defineix com el nombre de cicles per segon. També es pot definir com a recíproc del temps total "T". En aquest projecte, comptabilitzarem el nombre de pulsacions que entren al port 3.5 del microcontrolador 8051 i el mostrarem a la pantalla LCD de 16 * 2. Per tant, bàsicament hem de mesurar la freqüència del senyal al port 3.5 de 8051. Aquí hem utilitzat el xip AT89S52 8051, i es fa servir un IC 555 en mode Astable per generar el pols de mostra per demostrar. Anteriorment hem creat comptador de freqüències amb Arduino.
Components necessaris:
- Microcontrolador 8051 (AT89S52)
- Pantalla LCD de 16 * 2
- Font de freqüència (temporitzador 555)
- Potenciòmetre
- Connexió de cables
Esquema de connexions:


Utilitzant TIMER de 8051 per mesurar la freqüència:
El microcontrolador 8051 és un microcontrolador de 8 bits que té 128 bytes de RAM del xip, 4K bytes de ROM del xip, dos temporitzadors, un port sèrie i quatre ports de 8 bits. El microcontrolador 8052 és una extensió del microcontrolador. Per configurar el port 3.5 com a comptador, els valors del registre TMOD es defineixen a 0x51. A la figura següent es mostra el registre TMOD.
| GATE | C / T | M1 | M0 | GATE | C / T | M1 | M2 |
| TEMPORITZADOR 1 | TEMPORITZADOR 0 |
GATE: quan s'estableix GATE, el temporitzador o comptador només s'activa quan el pin INTx és HIGH i el pin de control TRx està configurat. Quan s’esborra GATE, el temporitzador s’activa sempre que el bit de control TRx està SET.
C / T: quan C / T = 0, actua com a temporitzador. Quan C / T = 1, actua com a comptador.
M1 i M0 indiquen el mode de funcionament.
Per a TMOD = 0x51, el temporitzador1 actua com a comptador i funciona en mode1 (16 bits).
La pantalla LCD de 16 * 2 s’utilitza per mostrar la freqüència del senyal en Hz (Hz). Si no coneixeu el LCD 16x2, consulteu aquí més informació sobre els pins i els comandaments del LCD 16x2. Comproveu també com interfície LCD amb 8051.
Temporitzador 555 com a font de freqüència:
La font de freqüència hauria de produir ones quadrades i l'amplitud màxima està limitada a 5 V, perquè els ports del microcontrolador 8051 no poden gestionar tensions superiors a 5 V. La freqüència màxima que pot mesurar és de 655,35 KHz a causa de la limitació de la memòria del registre TH1 i TL1 (8 bits cadascun). En 100 mil·lisegons, TH1 i TL1 poden contenir fins a 65535 recomptes. Per tant, la freqüència màxima que es pot mesurar és de 65535 * 10 = 655,35 KHz.
En aquest projecte de mesurador de freqüència 8051, estic fent servir el temporitzador 555 en mode astable per produir ones quadrades de freqüència variable. La freqüència del senyal generada per 555 IC pot variar-se ajustant el potenciòmetre tal com es demostra al vídeo presentat al final d'aquest projecte.
En aquest projecte, el Timer1 (T1) compta el nombre de pulsacions que entren al port 3.5 de 8051 microcontroladors durant 100 milisegons. Els valors de recompte s’emmagatzemaran als registres TH1 i TL1 respectivament. Per combinar valors del registre TH1 i TL1, s’utilitza la fórmula següent.
Impulsos = TH1 * (0x100) + TL1
Ara el "pols" tindrà un nombre de cicles en 100 mil·lisegons. Però la freqüència del senyal es defineix com el nombre de cicles per segon. Per convertir-lo en freqüència, s’utilitza la fórmula següent.
Polsos = Polsos * 10
Explicació del funcionament i del codi:
El programa complet C d’aquest mesurador de freqüència es dóna al final d’aquest projecte. El codi es divideix en petits trossos significatius i s’explica a continuació.
Per a la interfície LCD de 16 * 2 amb el microcontrolador 8051, hem de definir pins on es connecti 16 * 2 lcd al microcontrolador 8051. El pin RS de 16 * 2 lcd està connectat a P2.7, el pin RW de 16 * 2 lcd està connectat a P2.6 i el pin E de 16 * 2 lcd està connectat a P2.5. Els pins de dades estan connectats al port 0 del microcontrolador 8051.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
A continuació, hem de definir algunes funcions que s'utilitzen al programa. La funció de retard s'utilitza per crear un retard de temps especificat. La funció Cmdwrt s’utilitza per enviar ordres a una pantalla lcd de 16 * 2. La funció datawrt s’utilitza per enviar dades a una pantalla lcd de 16 * 2.
retard nul (int sense signar); void cmdwrt (caràcter sense signar); void datawrt (caràcter sense signar);
En aquesta part del codi, estem enviant ordres a 16 * 2 lcd. Ordres com la visualització neta, el cursor d'increment i la força del cursor a l'inici de la primera línia s'envien a la pantalla LCD de 16 * 2 un per un després d'un cert retard de temps especificat.
per a (i = 0; i <5; i ++) {cmdwrt (cmd); retard (1); }
En aquesta part del codi, el temporitzador 1 es configura com a comptador i el mode d’operació s’estableix al mode 1.
El temporitzador0 es configura com a temporitzador i el mode de funcionament està configurat al mode 1. El temporitzador 1 s’utilitza per comptar el nombre d’impulsos i el temporitzador 0 s’utilitza per generar un retard de temps. Els valors TH1 i TL1 s’estableixen a 0, per garantir que el recompte comença a partir de 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
En aquesta part del codi, el temporitzador s’executa durant 100 mil·lisegons. Es generen 100 mil·lisegons de retard mitjançant la funció de retard. TR1 = 1 és per iniciar el temporitzador i TR1 = 0 per aturar el temporitzador després de 100 mil·lisegons.
TR1 = 1; retard (100); TR1 = 0;
En aquesta part del codi, es combinen els valors de recompte presents als registres TH1 i TL1 i després es multiplica per 10 per obtenir el nombre total de cicles en 1 segon.
Impulsos = TH1 * (0x100) + TL1; Polsos = polsos * 10;
En aquesta part del codi, el valor de freqüència es converteix en bytes simples per facilitar la visualització en pantalla lcd de 16 * 2.
d1 = polsos% 10; s1 = pulsacions% 100; s2 = pulsacions% 1000; s3 = pulsacions% 10000; s4 = pulsacions% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (pulsacions-s4) / 100000;
En aquesta part del codi, els dígits individuals del valor de freqüència es converteixen en format ASCII i es mostren a la pantalla lcd de 16 * 2.
If (pulsacions> = 100000) datawrt (0x30 + d6); if (pulsacions> = 10000) datawrt (0x30 + d5); if (pulsacions> = 1000) datawrt (0x30 + d4); if (pulsacions> = 100) datawrt (0x30 + d3); if (pulsacions> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
En aquesta part del codi, estem enviant ordres a una pantalla lcd de 16 * 2. L'ordre es copia al port 0 del microcontrolador 8051. RS es redueix per escriure ordres. RW es redueix per a l'operació d'escriptura. S’aplica un pols d’alt a baix al pin habilitar (E) per iniciar l’operació d’escriptura d’ordres.
void cmdwrt (caràcter sense signe x) {P0 = x; rs = 0; rw = 0; ca = 1; retard (1); ca = 0; }
En aquesta part del codi, estem enviant dades a una pantalla lcd de 16 * 2. Les dades es copien al port 0 del microcontrolador 8051. RS es fa elevat per escriure ordres. RW es redueix per a l'operació d'escriptura. El pols d’alt a baix s’aplica al pin habilitar (E) per iniciar l’operació d’escriptura de dades.
void datawrt (caràcter sense signar y) {P0 = y; rs = 1; rw = 0; ca = 1; retard (1); ca = 0; }

Així podem mesurar la freqüència de qualsevol senyal mitjançant un microcontrolador 8051. Consulteu el codi complet i el vídeo de demostració a continuació.
