- Componente necesare:
- Diagrama circuitului:
- Folosind TIMER de 8051 pentru măsurarea frecvenței:
- 555 Temporizator ca sursă de frecvență:
- Explicație de lucru și cod:
Frecvența este definită ca număr de cicluri pe secundă. De asemenea, poate fi definit ca reciproc al timpului total „T”. În acest proiect, vom număra numărul de impulsuri care intră în portul 3.5 al microcontrolerului 8051 și îl vom afișa pe afișajul LCD de 16 * 2. Deci, practic, măsurăm frecvența semnalului la portul 3.5 din 8051. Aici am folosit cipul AT89S52 8051, iar un IC 555 este utilizat în modul Astable pentru generarea impulsului de probă pentru demonstrație. Am construit anterior contor de frecvență folosind Arduino.
Componente necesare:
- 8051 microcontroler (AT89S52)
- Afisaj LCD 16 * 2
- Sursă de frecvență (555 Timer)
- Potențiometru
- Conectarea firelor
Diagrama circuitului:
Folosind TIMER de 8051 pentru măsurarea frecvenței:
8051 microcontroler este un microcontroler de 8 biți care are 128 de octeți pe cip RAM, 4K octeți pe cip ROM, două temporizatoare, un port serial și patru porturi de 8 biți. Microcontrolerul 8052 este o extensie a microcontrolerului. Pentru a configura portul 3.5 ca contor, valorile registrului TMOD sunt setate la 0x51. Figura de mai jos prezintă registrul TMOD.
POARTĂ | CT | M1 | M0 | POARTĂ | CT | M1 | M2 |
TIMER 1 | TIMER 0 |
GATE - când GATE este setat, cronometrul sau contorul sunt activate numai atunci când pinul INTx este HIGH și pinul de control TRx este setat. Când GATE este șters, temporizatorul este activat de fiecare dată când bitul de control TRx este SET.
C / T - când C / T = 0, acționează ca temporizator. Când C / T = 1, acționează ca Contor.
M1 și M0 indică modul de funcționare.
Pentru TMOD = 0x51, timer1 acționează ca contor și funcționează în modul 1 (16 biți).
16 * 2 LCD este utilizat pentru a afișa frecvența semnalului în Hz (Hz). Dacă nu sunteți nou în LCD 16x2, verificați aici mai multe despre pinii LCD 16x2 și comenzile sale. De asemenea, verificați cum să interfațați LCD-ul cu 8051.
555 Temporizator ca sursă de frecvență:
Sursa de frecvență ar trebui să producă unde pătrate, iar amplitudinea maximă este limitată la 5V, deoarece porturile microcontrolerului 8051 nu pot gestiona tensiuni mai mari de 5V. Frecvența maximă poate măsura este 655.35 KHz din cauza limitării memoriei TH1 și TL1 registru (8bit fiecare). În 100 de milisecunde, TH1 și TL1 pot conține până la 65535 numărătoare. Prin urmare, frecvența maximă care poate fi măsurată este 65535 * 10 = 655,35 KHz.
În acest proiect al contorului de frecvență 8051, folosesc temporizatorul 555 în modul astabil pentru a produce unde pătrate cu frecvență variabilă. Frecvența semnalului generat de 555 IC poate fi variată prin reglarea potențiometrului așa cum se arată în videoclipul prezentat la sfârșitul acestui proiect.
În acest proiect, Timer1 (T1) numără numărul de impulsuri care intră în portul 3.5 al 8051 microcontrolere pentru 100 de milisecunde. Valorile de numărare vor fi stocate în registrele TH1 și respectiv TL1. Pentru a combina valorile registrului TH1 și TL1, se folosește formula de mai jos.
Impulsuri = TH1 * (0x100) + TL1
Acum, „pulsul” va avea un număr de cicluri în 100 de milisecunde. Dar frecvența semnalului este definită ca număr de cicluri pe secundă. Pentru a-l converti în frecvență, se folosește formula de mai jos.
Pulsuri = Pulsuri * 10
Explicație de lucru și cod:
Programul complet C pentru acest contor de frecvență este dat la sfârșitul acestui proiect. Codul este împărțit în mici bucăți semnificative și explicat mai jos.
Pentru interfața LCD 16 * 2 cu microcontrolerul 8051, trebuie să definim pinii pe care 16 * 2 lcd este conectat la microcontrolerul 8051. Pinul RS de 16 * 2 lcd este conectat la P2.7, pinul RW de 16 * 2 lcd este conectat la P2.6 și pinul E de 16 * 2 lcd este conectat la P2.5. Pinii de date sunt conectați la portul 0 al microcontrolerului 8051.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
În continuare trebuie să definim câteva funcții care sunt utilizate în program. Funcția de întârziere este utilizată pentru a crea o întârziere specificată. Funcția Cmdwrt este utilizată pentru a trimite comenzi către un ecran LCD 16 * 2. funcția datawrt este utilizată pentru a trimite date către un ecran LCD 16 * 2.
întârziere nulă (int semnat); void cmdwrt (caracter nesemnat); void datawrt (caracter nesemnat);
În această parte a codului, trimitem comenzi către 16 * 2 lcd. Comenzi precum afișarea clară, cursorul incremental, forțarea cursorului la începutul primei linii sunt trimise pe afișaj 16 * 2 lcd unul câte unul după o anumită întârziere.
pentru (i = 0; i <5; i ++) {cmdwrt (cmd); întârziere (1); }
În această parte a codului, cronometrul 1 este configurat ca contor și modul de funcționare este setat la modul 1.
Timer0 este configurat ca temporizator și modul de funcționare este setat la modul 1. Timerul 1 este utilizat pentru numărarea numărului de impulsuri și temporizatorul 0 este utilizat pentru generarea întârzierii. Valorile TH1 și TL1 sunt setate la 0, pentru a se asigura că numărarea începe de la 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
În această parte a codului, temporizatorul este executat pentru 100 de milisecunde. 100 de milisecunde de întârziere sunt generate folosind funcția de întârziere. TR1 = 1 este pentru pornirea temporizatorului și TR1 = 0 este pentru oprirea temporizatorului după 100 de milisecunde.
TR1 = 1; întârziere (100); TR1 = 0;
În această parte a codului, valorile de numărare prezente în registrele TH1 și TL1 sunt combinate și apoi se înmulțește cu 10 pentru a obține numărul total de cicluri în 1 secundă.
Impulsuri = TH1 * (0x100) + TL1; Impulsuri = impulsuri * 10;
În această parte a codului, valoarea frecvenței este convertită în octeți unici pentru a facilita afișarea pe afișaj LCD 16 * 2.
d1 = impulsuri% 10; s1 = impulsuri% 100; s2 = impulsuri% 1000; s3 = impulsuri% 10000; s4 = impulsuri% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (impulsuri-s4) / 100000;
În această parte a codului, cifrele individuale ale valorii frecvenței sunt convertite în format ASCII și sunt afișate pe afișaj LCD 16 * 2.
Dacă (impulsuri> = 100000) datawrt (0x30 + d6); if (impulsuri> = 10000) datawrt (0x30 + d5); if (impulsuri> = 1000) datawrt (0x30 + d4); if (impulsuri> = 100) datawrt (0x30 + d3); if (impulsuri> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
În această parte a codului, trimitem comenzi către un ecran LCD de 16 * 2. Comanda este copiată în portul 0 al microcontrolerului 8051. RS este redus pentru scrierea comenzii. RW este redus pentru operația de scriere. Pulsul de la mare la mic se aplică pe pinul de activare (E) pentru a începe operația de scriere a comenzii.
void cmdwrt (caracter nesemnat x) {P0 = x; rs = 0; rw = 0; ro = 1; întârziere (1); ro = 0; }
În această parte a codului, trimitem date către un ecran LCD de 16 * 2. Datele sunt copiate în portul 0 al microcontrolerului 8051. RS este ridicat pentru scrierea comenzilor. RW este redus pentru operația de scriere. Pulsul de mare la scăzut este aplicat pe pinul de activare (E) pentru a începe operația de scriere a datelor.
void datawrt (caracter nesemnat y) {P0 = y; rs = 1; rw = 0; ro = 1; întârziere (1); ro = 0; }
Astfel putem măsura frecvența oricărui semnal folosind microcontrolerul 8051. Verificați codul complet și videoclipul de mai jos.