LED-interfacing is het eerste dat je zou proberen te doen als je aan de slag gaat met een microcontroller. Dus hier in deze tutorial gaan we een LED koppelen aan een 8051 microcontroller, en een C-programma schrijven om de LED te laten knipperen. We hebben een zeer populaire microcontroller AT89S52 van de 8051-familie van ATMEL gebruikt.
Voordat we in detail treden, moeten we een kort idee krijgen van de microcontroller AT89S52. Het is een 40-pins microcontroller en heeft 4 poorten (P0, P1, P2, P3), elke poort heeft 8 pinnen. Vanuit software-oogpunt kunnen we elke poort beschouwen als een 8-bits register. Elke pin heeft een ingangs- / uitgangslijn, wat betekent dat elke pin zowel voor invoer als voor uitvoer kan worden gebruikt, dwz om gegevens van een apparaat zoals een sensor te lezen of om de uitvoer ervan naar een uitvoerapparaat te sturen. Sommige pinnen hebben de dubbele functionaliteit, die tussen haakjes is vermeld in het pindiagram hieronder. Dubbel functioneel zoals voor interrupt, counters, timers etc.
AT89S52 heeft twee soorten geheugen, de eerste is RAM met 256 bytes geheugen en de tweede is EEPROM (elektronisch wisbaar en programmeerbaar alleen-lezen geheugen) met 8k bytes geheugen. RAM wordt gebruikt om de gegevens op te slaan tijdens de uitvoering van een programma en EEPROM wordt gebruikt om het programma zelf op te slaan. EEPROM is het flashgeheugen waarin we het programma hebben gebrand.
Schakelschema en uitleg
We gebruiken pin één van poort 1 om de LED aan te sluiten. In embedded C-programmering hebben we toegang tot de PIN 1 van poort 1 door P1_0 te gebruiken. We hebben een kristaloscillator met een frequentie van 11.0592 MHz aangesloten op de PIN 19 en 18, dwz XTAL1 en XTAL2. Kristaloscillator wordt gebruikt om klokpulsen te genereren en klokpuls wordt gebruikt om het gemiddelde te leveren voor timingberekening, wat verplicht is om alle gebeurtenissen te synchroniseren. Dit soort kristallen wordt in bijna alle moderne digitale apparatuur gebruikt, zoals in computers, horloges enz. Het meest gebruikte kristal is kwarts. Het is een resonerend oscillatorcircuit en condensatoren worden gebruikt om het kristal te laten oscilleren, dus we hebben hier 22pf condensatoren aangesloten. U kunt lezen over "resonantiecircuits" voor meer informatie.
Het schakelschema voor LED-interface met 8051-microcontroller 89S52 wordt weergegeven in bovenstaande afbeelding. Pin 31 (EA) is verbonden met Vcc, wat een actieve lage pin is. Dit moet worden aangesloten op Vcc als we geen extern geheugen gebruiken. Pin 30 (ALE) en pin 29 (PSEN) worden gebruikt om de microcontroller aan te sluiten op het externe geheugen en Pin 31 vertelt de microcontroller om extern geheugen te gebruiken wanneer deze is aangesloten op aarde. We gebruiken geen extern geheugen, dus hebben we Pin31 op Vcc aangesloten.
Pin 9 (RST) is de reset-pincode die wordt gebruikt om de microcontroller te resetten en het programma begint opnieuw vanaf het begin. Het reset de microcontroller wanneer deze is aangesloten op HIGH. We hebben een standaard resetcircuit, een weerstand van 10k ohm en een condensator van 1uF gebruikt om de RST-pin aan te sluiten.
Het interessante deel hier is dat we de LED in omgekeerde richting verbinden, wat een negatief been betekent met een microcontroller-PIN, omdat de microcontroller niet genoeg stroom levert om een LED te laten gloeien, dus hier draait de LED op de negatieve logica, zoals wanneer pin P1_0 1 is dan wordt de LED uitgeschakeld en als de pinuitvoer 0 is, gaat de LED AAN. Wanneer de PIN-uitvoer 0 is, gedraagt deze zich als aarde en brandt de LED.
Code Uitleg
De koptekst REGX52.h is toegevoegd om de basisregisterdefinities op te nemen. Er zijn veel soorten variabelen en constanten in embedded C zoals int, char, unsigned int, float etc, je kunt ze gemakkelijk leren. Hier gebruiken we niet-ondertekende int met een bereik van 0 tot 65535. We gebruiken "for loop" om vertraging te creëren, zodat de LED enige tijd AAN zal zijn (P1_0 = 0, negatieve LED-logica) en en UIT (P1_0 = 1, negatieve LED-logica) voor vertraagde tijd. Over het algemeen geeft “for loop” 1275 keer een vertraging van 1 ms, dus hebben we een 'delay'-functie gemaakt voor het creëren van DELAY en deze genoemd vanuit het hoofdprogramma (main ()). We kunnen de DELAY-tijd (in ms) passeren terwijl we de "delay" -functie aanroepen vanuit de hoofdfunctie. In programma betekent 'While (1)' dat het programma oneindig wordt uitgevoerd.
Ik leg in het kort uit, hoe 1275 keer run van "for" -lus een vertraging van 1ms geeft:
In 8051 vereist 1 machinecyclus 12 kristalpulsen om uit te voeren en we hebben 11.0592Mhz kristal gebruikt.
Dus tijd nodig voor 1 machinecyclus: 12 / 11.0592 = 1.085us
Dus 1275 * 1,085 = 1,3 ms, 1275 keer de "for" -lus geeft bijna 1 ms vertraging.
De exacte tijdsvertraging die door het “C” -programma wordt geproduceerd, is erg moeilijk te berekenen, wanneer gemeten vanaf een oscilloscoop (CRO), want (j = 0; j <1275; j ++) geeft een vertraging van bijna 1 ms.
We kunnen dus begrijpen door simpelweg LED te koppelen aan 8051 microcontroller, dat we met een eenvoudige codering kunnen communiceren en de hardware kunnen besturen via software (programmering) met behulp van een microcontroller. We kunnen ook elke poort en pin van microcontroller manipuleren door te programmeren.