- Vereiste componenten:
- Schakelschema:
- TIMER van 8051 gebruiken voor het meten van frequentie:
- 555-timer als frequentiebron:
- Werking en code-uitleg:
Frequentie wordt gedefinieerd als het aantal cycli per seconde. Het kan ook worden gedefinieerd als reciproque van de totale tijd 'T'. In dit project gaan we het aantal pulsen tellen dat poort 3.5 van de 8051 microcontroller binnenkomt en dit weergeven op een 16 * 2 LCD-scherm. Dus eigenlijk hebben we het meten van de signaalfrequentie op poort 3.5 van 8051. Hier hebben we de AT89S52 8051-chip gebruikt, en een 555 IC wordt gebruikt in de Astable-modus voor het genereren van de samplepuls voor demonstratie. We hebben eerder een frequentieteller gebouwd met Arduino.
Vereiste componenten:
- 8051 microcontroller (AT89S52)
- 16 * 2 LCD-scherm
- Frequentiebron (555 Timer)
- Potentiometer
- Draden aansluiten
Schakelschema:
TIMER van 8051 gebruiken voor het meten van frequentie:
8051-microcontroller is een 8-bits microcontroller met 128 bytes op chip RAM, 4K bytes op chip ROM, twee timers, een seriële poort en vier 8-bits poorten. 8052 microcontroller is een uitbreiding van microcontroller. Om poort 3.5 als teller te configureren, worden de TMOD-registerwaarden ingesteld op 0x51. Onderstaande figuur toont het TMOD-register.
POORT | C / T | M1 | M0 | POORT | C / T | M1 | M2 |
TIMER 1 | TIMER 0 |
GATE - als GATE is ingesteld, wordt de timer of teller alleen ingeschakeld als de INTx-pin HIGH is en de TRx-controlepin is ingesteld. Wanneer GATE is gewist, wordt de timer ingeschakeld wanneer TRx-besturingsbit is ingesteld.
C / T - wanneer C / T = 0, werkt het als timer. Wanneer C / T = 1, fungeert het als teller.
M1 en M0 geven de bedrijfsmodus aan.
Voor TMOD = 0x51 fungeert timer1 als teller en werkt hij in mode1 (16 bit).
16 * 2 LCD wordt gebruikt om de frequentie van het signaal in Hertz (Hz) weer te geven. Als je nieuw bent bij 16x2 LCD, bekijk dan hier meer over de 16x2 LCD-pinnen en de bijbehorende opdrachten. Controleer ook hoe u LCD met 8051 verbindt.
555-timer als frequentiebron:
De frequentiebron moet blokgolven produceren en de maximale amplitude is beperkt tot 5V, omdat de poorten van de 8051-microcontroller geen spanning van meer dan 5V aankunnen. De maximale frequentie die het kan meten is 655,35 KHz vanwege geheugenbeperking van het TH1- en TL1-register (elk 8 bit). In 100 milliseconden kunnen TH1 en TL1 tot 65535 tellingen bevatten. Daarom is de maximale frequentie die kan worden gemeten 65535 * 10 = 655,35 KHz.
In dit 8051 Frequency Meter-project gebruik ik 555-timer in astabiele modus om blokgolven met variabele frequentie te produceren. De frequentie van het signaal gegenereerd door 555 IC, kan worden gevarieerd door de potentiometer aan te passen zoals aangetoond in de video aan het einde van dit project.
In dit project telt de Timer1 (T1) het aantal pulsen dat poort 3.5 van 8051 microcontrollers binnenkomt gedurende 100 milliseconden. De telwaarden worden respectievelijk in TH1- en TL1-registers opgeslagen. Om de waarden van het TH1- en TL1-register te combineren, wordt de onderstaande formule gebruikt.
Pulsen = TH1 * (0x100) + TL1
Nu heeft de 'puls' een aantal cycli in 100 milliseconden. Maar de frequentie van het signaal wordt gedefinieerd als het aantal cycli per seconde. Om het in frequentie om te zetten, wordt onderstaande formule gebruikt.
Pulsen = Pulsen * 10
Werking en code-uitleg:
Het volledige C-programma voor deze frequentiemeter wordt aan het einde van dit project gegeven. De code is opgesplitst in kleine, betekenisvolle brokken en wordt hieronder uitgelegd.
Voor 16 * 2 LCD-interface met 8051-microcontroller, moeten we pinnen definiëren waarop 16 * 2-lcd is aangesloten op 8051-microcontroller. RS-pin van 16 * 2 lcd is verbonden met P2.7, RW-pin van 16 * 2 lcd is verbonden met P2.6 en E-pin van 16 * 2 lcd is verbonden met P2.5. Datapinnen zijn verbonden met poort 0 van 8051 microcontroller.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
Vervolgens moeten we enkele functies definiëren die in het programma worden gebruikt. De vertragingsfunctie wordt gebruikt om een gespecificeerde vertraging te creëren. Cmdwrt- functie wordt gebruikt om opdrachten naar een 16 * 2 lcd-scherm te sturen. datawrt- functie wordt gebruikt om gegevens naar een 16 * 2 lcd-scherm te verzenden.
ongeldige vertraging (unsigned int); void cmdwrt (unsigned char); void datawrt (unsigned char);
In dit deel van de code sturen we opdrachten naar 16 * 2 lcd. Commando's zoals leeg scherm increment cursor dwingen de cursor naar het begin van 1 ste lijn 16 * 2 LCD scherm een voor een na enige gespecificeerde vertraging worden verzonden.
voor (i = 0; i <5; i ++) {cmdwrt (cmd); vertraging (1); }
In dit deel van de code is timer1 geconfigureerd als teller en is de werkingsmodus ingesteld op modus 1.
Timer0 is geconfigureerd als timer en de bedrijfsmodus is ingesteld op modus 1. Timer 1 wordt gebruikt voor het tellen van het aantal pulsen en timer 0 wordt gebruikt voor het genereren van een vertraging. TH1- en TL1-waarden zijn ingesteld op 0 om ervoor te zorgen dat het tellen begint bij 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
In dit deel van de code is de timer gemaakt om 100 milliseconden te lopen. 100 milliseconden vertraging wordt gegenereerd met behulp van de vertragingsfunctie. TR1 = 1 is voor het starten van de timer en TR1 = 0 is voor het stoppen van de timer na 100 milliseconden.
TR1 = 1; vertraging (100); TR1 = 0;
In dit deel van de code worden de telwaarden die aanwezig zijn in TH1- en TL1-registers gecombineerd en vervolgens vermenigvuldigd met 10 om het totale aantal cycli in 1 seconde te krijgen.
Pulsen = TH1 * (0x100) + TL1; Pulsen = pulsen * 10;
In dit deel van de code wordt de frequentiewaarde geconverteerd naar enkele bytes om het gemakkelijk weer te geven op een 16 * 2 lcd-scherm.
d1 = pulsen% 10; s1 = pulsen% 100; s2 = pulsen% 1000; s3 = pulsen% 10000; s4 = pulsen% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (pulsen-s4) / 100000;
In dit deel van de code worden individuele cijfers van de frequentiewaarde geconverteerd naar ASCII- indeling en weergegeven op een 16 * 2 lcd-scherm.
If (pulsen> = 100000) datawrt (0x30 + d6); if (pulsen> = 10000) datawrt (0x30 + d5); if (pulsen> = 1000) datawrt (0x30 + d4); if (pulsen> = 100) datawrt (0x30 + d3); if (pulsen> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
In dit deel van de code sturen we opdrachten naar een 16 * 2 lcd-scherm. De opdracht wordt gekopieerd naar poort 0 van 8051 microcontroller. RS is laag gemaakt voor het schrijven van opdrachten. RW is laag gemaakt voor schrijfbewerking. Hoge naar lage puls wordt toegepast op de inschakel (E) -pin om de opdrachtschrijfbewerking te starten.
void cmdwrt (unsigned char x) {P0 = x; rs = 0; rw = 0; en = 1; vertraging (1); en = 0; }
In dit deel van de code sturen we gegevens naar een 16 * 2 lcd-scherm. De gegevens worden naar poort 0 van microcontroller 8051 gekopieerd. RS wordt hoog gemaakt voor het schrijven van opdrachten. RW is laag gemaakt voor schrijfbewerking. Hoge naar lage puls wordt toegepast op de inschakel (E) -pin om de gegevensschrijfbewerking te starten.
void datawrt (unsigned char y) {P0 = y; rs = 1; rw = 0; en = 1; vertraging (1); en = 0; }
Dit is hoe we de frequentie van elk signaal kunnen meten met behulp van 8051 Microcontroller. Bekijk de volledige code en demovideo hieronder.