Component · Controller

8051-microcontroller

De 8051 is de 8-bits microcontroller die veel studieprogramma's nog altijd als eerste behandelen. Wat de architectuur je biedt en wat je zelf moet bouwen.

Wat het is

De 8051 is geen bord en ook niet echt één chip; het is een architectuur. Intel publiceerde hem in 1980 en licentieerde de kern zo ruim dat het onderdeel dat je vandaag koopt van iemand anders komt. In een praktijkkit is dat vrijwel altijd de AT89S52 van Atmel: een 8051-kern met 8 KB flashgeheugen, 256 bytes RAM, drie timers en in-systeemprogrammering via vier pinnen.

Je krijgt een 40-pins DIP en verder niets. Geen USB, geen spanningsregelaar, geen bootloader, geen pinMode(). Voordat hij zelfs één instructie uitvoert, moet je een kristal, twee lastcondensatoren, een resetnetwerk en een verbinding van EA met +5 V toevoegen. Zonder die kristaloscillator werkt een eerste bord helemaal niet. Die kale opzet is de hele reden dat hij nog in het studieprogramma staat: er is geen laag tussen je code en de siliciumchip die gedrag kan verhullen dat je niet begrijpt.

Het minimale circuit dat een 8051 nodig heeft om te draaien. Een AT89S52-chipblok toont zes pinnen: VCC-pin 40 verbonden met de vijfvoltsrail en GND-pin 20 met aarde; EA-pin 31 in rood verbonden met de vijfvoltsrail, met de aantekening om EA hoog te binden, anders doet de chip niets; XTAL2-pin 18 en XTAL1-pin 19 aan weerszijden van een kristal van 11.0592 MHz, met vanaf elk uiteinde van het kristal een condensator van 33 picofarad naar aarde; en RST-pin 9 verbonden met een condensator van 10 microfarad naar de vijfvoltsrail en een weerstand van 10 kilo-ohm naar aarde, met de aantekening dat reset actief HIGH is.
Alles wat een 8051 nodig heeft voordat hij één instructie uitvoert. Zonder de verbinding van EA met +5 V start een eerste bord stilzwijgend helemaal niet. SVG downloaden
Pindindeling van de 8051 in de 40-pins DIP-behuizing, verticaal getekend met de inkeping bij pin 1 bovenaan. De linker kolom bevat pins 1 tot 20: poort 1-pins P1.0 tot P1.7 met hun alternatieve functies T2, T2EX, MOSI, MISO en SCK, vervolgens RST, daarna poort 3-pins P3.0 tot P3.7 met de labels RXD, TXD, INT0, INT1, T0, T1, WR en RD, en ten slotte XTAL2, XTAL1 en GND. De rechter kolom loopt van pin 40 naar 21: VCC, poort 0-pins P0.0 tot P0.7 die tevens AD0 tot AD7 zijn, dan EA, ALE en PSEN, en vervolgens poort 2-pins P2.7 tot P2.0 die tevens adreslijnen A15 tot A8 zijn. Met kleur worden I/O-poorten, alternatieve functies van poort 3, klok- en besturingspins en voeding onderscheiden.
De 40-pins DIP. Let op dat poort 0 omhoog loopt: pin 32 is P0.7 en pin 39 P0.0. De tweede labels van poort 3 zijn de seriële, interrupt- en timerpins. SVG downloaden

Hoe het werkt

De 8051 is een Harvard-machine: programmageheugen en gegevensgeheugen hebben gescheiden adresruimtes en worden via verschillende instructies bereikt. Code staat in flashgeheugen; variabelen staan in 256 bytes intern RAM, dat zelf is verdeeld over vier registerbanken, een bit-adressable gebied en de resterende ruimte voor de stack.

Timing is opvallend eenvoudig te doorgronden. Eén machinecyclus is twaalf oscillatorperioden, en de meeste instructies duren één of twee cycli. Bij 11.0592 MHz is dat 1,085 µs per cyclus, zodat je instructies kunt tellen en weet, in plaats van schat, hoe lang een lus duurt. Weinig moderne onderdelen bieden dat.

De 32 I/O-pinnen zijn verdeeld over vier poorten met elk een eigen karakter:

  • P1 is de enige rechttoe-recht-aan: acht algemene pinnen met interne pull-upweerstanden.
  • P3 heeft voor elke pin ook een alternatieve functie: seriële RXD/TXD, twee externe interrupts, twee timeringangen en de externe lees- en schrijfimpulsen voor geheugen.
  • P2 draagt het hoge adresbyte wanneer extern geheugen is aangesloten.
  • P0 is open-drain. Zonder externe pull-upweerstanden kan deze poort helemaal geen logisch hoog uitsturen en draagt hij bovendien het gemultiplexte lage adres- en gegevensbyte.

Wat de chip niet heeft is minstens zo belangrijk: geen analoge ingangen en geen PWM-hardware. Een sensorspanning lezen vereist een externe ADC en de snelheid van een motor variëren betekent dat je zelf een golfvorm genereert vanuit een timerinterrupt.

Wanneer je hem gebruikt

Kies de 8051 als het doel is de machine te leren kennen: een cursus microcontrollers, een universitair miniproject of je eigen nieuwsgierigheid naar wat analogWrite() werkelijk doet. Een softwarematige PWM-generator leert meer in een middag dan een jaar lang een bibliotheek aanroepen die dit verbergt.

Kies vrijwel alles anders wanneer de robot het doel is. Een Arduino Uno biedt hardware-PWM, analoge ingangen en een bibliotheek voor elke sensor die je tegenkomt; een ESP32 voegt Wi-Fi en veel meer geheugen toe. Beide kosten ongeveer hetzelfde als een 8051-ontwikkelbord. De 8051 kiezen voor een project dat moet werken in plaats van onderwijzen betekent dat je dingen die alternatieven gratis geven met de hand opnieuw moet bouwen.

Veelvoorkomende valkuilen

  • EA moet aan +5 V. Pin 31 kiest intern of extern programmageheugen. Als de pin zweeft of aan aarde ligt, haalt de chip stilzwijgend code op uit extern geheugen dat er niet is en doet hij niets: geen fout, geen lampje, geen aanwijzing. Dit is verreweg de meest voorkomende reden dat een eerste 8051-bord dood lijkt.
  • Reset is actief HIGH. Anders dan bij vrijwel elke andere microcontroller die je tegenkomt, reset de 8051 wanneer RST omhoog wordt getrokken. Het standaardcircuit bij inschakelen bestaat uit een condensator van 10 µF tussen +5 V en RST en een weerstand van 10 kΩ tussen RST en aarde.
  • Poort 0 heeft externe pull-upweerstanden nodig. De poort is open-drain. Sluit op elke pin een weerstand van 10 kΩ aan op +5 V, anders kan hij nooit betrouwbaar een hoog niveau lezen of uitsturen.
  • Pinnen nemen stroom op, maar leveren hem niet. De interne pull-upweerstand levert slechts enkele microampère, terwijl de pull-downtransistor milliampère opneemt. Sluit een LED aan met de anode naar de voeding en de kathode naar de pin; een 0 schakelt de LED in. Andersom aansluiten geeft een zeer zwakke gloed en veel verwarring.
  • De stack begint op 08h, boven registerbank 1. De stackpointer wordt teruggezet op 07h. Schakel je over naar registerbank 1 zonder eerst SP te verplaatsen, dan delen je registers en je retouradressen dezelfde bytes.

Waarom 11.0592 MHz van alle getallen

Die kristalfrequentie lijkt willekeurig en is juist een van de meest doelbewuste keuzes in de hele architectuur.

De 8051 bepaalt zijn seriële baudrate door Timer 1 in de 8-bits automatische herlaadmodus te laten overlopen:

baud = (2^SMOD / 32) x (oscillator / 12) / (256 - TH1)

Met SMOD = 0, een kristal van 11.0592 MHz en 9600 baud als doel:

TH1 = 256 - (11059200 / (12 x 32 x 9600)) = 256 - 3 = 253 = 0xFD

Precies 3. Geen afronding, geen fout. Elke standaardbaudrate — 1200, 2400, 4800, 9600, 19200 — levert een geheel aantal timerherladingen op.

Neem nu een rond kristal van 12 MHz:

TH1 = 256 - (12000000 / 3686400) = 256 - 3.26 -> must round to 3
actual baud = 10417, against a target of 9600 -> 8.5% error

Seriële verbindingen verdragen ongeveer 2–3% totale fout tussen beide uiteinden. Bij 8,5% loopt de framing binnen één byte uiteen en komt elk teken beschadigd aan. Dit is de reden dat 11.0592 MHz bestaat, waarom het op elk 8051-practicumbord zit en waarom het vervangen van het 12-MHz-kristal in de lade een chip oplevert die perfect werkt totdat je iets probeert af te drukken.

De afweging is dat de timingberekening omslachtig wordt: een machinecyclus duurt 1,085 µs in plaats van een ronde 1 µs. Een kristal van 12 MHz levert exact cycli van 1 µs en onbruikbare seriële communicatie. Kies op basis van wat je project nodig heeft.

Timers en zelf PWM genereren

De 8051 heeft drie 16-bits timers en helemaal geen PWM-hardware. De snelheid van een motor variëren betekent dat je de golfvorm zelf genereert, en juist dat is het beste aspect van leren werken met deze chip.

De timers hebben vier modi; twee zijn belangrijk:

Modus Breedte Herlading Gebruik voor
0 13-bit Handmatig Verouderd; negeer deze modus
1 16-bit Handmatig Lange, nauwkeurige vertragingen. Moet in de ISR worden herladen
2 8-bit Automatisch Baudrates en elke tick met vaste periode
3 Gesplitste T0 — Wanneer je wanhopig een derde timer nodig hebt

Gebruik modus 2 voor een stabiele tick, want dan gebeurt het herladen in de hardware en komt er geen ISR-jitter in de periode terecht.

Een softwarematige PWM-generator op Timer 0, rond 1 kHz met een resolutie van 100 stappen:

#include <reg52.h>

sbit MOTOR_L = P1^0;
sbit MOTOR_R = P1^1;

volatile unsigned char dutyL = 0, dutyR = 0;   // 0..99
volatile unsigned char tick  = 0;

void timer0_isr(void) interrupt 1 {
    /* Mode 1 is not self-reloading: put the value back first, before
       anything else, or the period stretches by the ISR's own length. */
    TH0 = 0xFF; TL0 = 0xA4;                    /* ~10 us at 11.0592 MHz */

    if (++tick >= 100) tick = 0;               /* 100 ticks = ~1 ms period */

    MOTOR_L = (tick < dutyL) ? 1 : 0;
    MOTOR_R = (tick < dutyR) ? 1 : 0;
}

void main(void) {
    TMOD = (TMOD & 0xF0) | 0x01;               /* Timer 0, mode 1 */
    TH0  = 0xFF; TL0 = 0xA4;
    ET0  = 1;                                  /* enable timer 0 interrupt */
    EA   = 1;                                  /* global interrupt enable */
    TR0  = 1;                                  /* start */

    dutyL = 70; dutyR = 70;
    while (1) { }                              /* PWM runs entirely in the ISR */
}

Twee lessen uit dit voorbeeld. Herlaad altijd eerst: in modus 1 gaat de timer na een overloop verder tellen vanaf nul, dus elke instructie vóór de herlading telt mee in de volgende periode. En de kosten zijn reëel: deze ISR wordt 100.000 keer per seconde uitgevoerd. Bij 1,085 µs per machinecyclus verbruikt een afhandeling van een dozijn instructies een aanzienlijk deel van alles wat de chip kan. Dat budget koop je precies met een hardware-PWM-periferie, en je waardeert het pas wanneer je het zelf hebt betaald.

Het stroombudget van de poorten

Dit overvalt mensen doordat de poorten van de 8051 asymmetrisch zijn op een manier die moderne onderdelen niet hebben.

Stroom opnemen (uitgang LOW) Stroom leveren (uitgang HIGH)
Per pin, P1/P2/P3 ~10 mA ~60 µA (alleen interne pull-upweerstand)
Per pin, P0 ~10 mA 0 — open-drain, helemaal geen pull-upweerstand
Per poort, totaal ~26 mA —
Volledige chip ~71 mA —

Zestig microampère is geen typefout. De interne pull-upweerstand is een zwakke weerstand, geen stroomdriver. Een pin die HIGH uitstuurt kan dus ongeveer een duizendste leveren van wat hij kan opnemen.

Daaruit volgen drie directe gevolgen:

Sluit de kathode van een LED aan de pin en de anode via een weerstand op +5 V; schrijf 0 om de LED te laten branden. Andersom aangesloten licht hij heel zwak op, wat eerder lijkt op een dimme of defecte LED dan op een verkeerd inzicht.

Bestuur nooit rechtstreeks iets. Niet een relais, niet een zoemer op hoog volume, niet een motor. Gebruik een transistor, een ULN2003-drivermatrix of een echte motordriver.

Poort 0 heeft externe pull-upweerstanden nodig: 10 kΩ naar +5 V op elke pin die je als I/O wilt gebruiken. Zonder die weerstanden kan de poort geen hoog niveau uitsturen of betrouwbaar lezen, en op veel practicumborden loopt juist deze poort naar de LCD.

Geheugen en bestemming van de 256 bytes

Acht kilobytes flashgeheugen klinkt krap en is zelden het knelpunt. 256 bytes RAM is de werkelijke beperking, en dat is geen vlak blok van 256 bytes:

Adres Grootte Wat daar staat
00h–1Fh 32 bytes Vier registerbanken, elk R0–R7
20h–2Fh 16 bytes Bit-adressable — 128 afzonderlijk adresseerbare bits
30h–7Fh 80 bytes Algemeen werkgeheugen en doorgaans de stack
80h–FFh 128 bytes Alleen indirect adresseren (SFR’s nemen de directe adresruimte in)

De stackpointer wordt teruggezet op 07h, waardoor de stack direct boven registerbank 1 begint. Schakel je over naar registerbank 1 zonder eerst SP te verplaatsen, dan delen je registers en je retouradressen bytes. De storing is dan spectaculair: het programma springt naar een willekeurig adres. SP = 0x30; als eerste regel van main() is gangbare praktijk.

Het bit-adressable gebied is de moeite waard om te kennen, want het is werkelijk elegant. Elk bit in 20h–2Fh kan met één instructie worden ingesteld, gewist of getest, waardoor statusvlaggen gratis worden:

bit lineDetected;      /* the compiler allocates this in 20h-2Fh */
bit motorEnabled;      /* one bit each, one instruction to test */

Acht daarvan kosten één byte en één bit testen kost één machinecyclus. Op een chip met 256 bytes RAM is dat belangrijk.

Problemen oplossen

Symptoom Waarschijnlijke oorzaak Oplossing
Chip doet helemaal niets EA zweeft of is geaard Bind pin 31 aan +5 V. Controleer dit altijd als eerste
Chip doet niets, EA is hoog Kristal oscilleert niet Controleer de lastcondensatoren van 33 pF en de soldeerverbindingen van het kristal
Reset voortdurend RST wordt hoog gehouden Reset is hier actief HIGH; controleer het netwerk van 10 µF / 10 kΩ
Poort 0 leest en schrijft niets Open-drain zonder pull-upweerstanden 10 kΩ van elke pin naar +5 V
LED zeer dim Aangesloten om stroom te leveren Kathode aan de pin; schrijf 0 om de LED aan te zetten
Seriële uitvoer is onleesbaar 12-MHz-kristal Gebruik 11.0592 MHz; 12 MHz geeft 8,5% baudfout
Seriële verbinding werkt slechts één kant op TX/RX niet gekruist of geen gemeenschappelijke massa Kruis ze en verbind de massa’s
Programma springt nergens heen Stack overlapt registerbank 1 SP = 0x30; bovenaan main()
PWM-periode vertoont jitter Timer wordt laat in de ISR herladen Herlaad als eerste instructie of gebruik modus 2
Onvoorspelbaar gedrag naarmate de code groeit Geheugen vol In totaal 256 bytes; controleer de linkermap
Programmer kan de chip niet vinden ISP-pins in gebruik of geen resetbesturing Maak P1.5–P1.7 en RST vrij tijdens programmeren

8051 of een moderne microcontroller?

8051 (AT89S52) Arduino Uno ESP32
Flash / RAM 8 KB / 256 B 32 KB / 2 KB 4 MB / 520 KB
Hardware-PWM Geen 6 kanalen 16 kanalen
Analoge ingang Geen 6 × 10-bit 18 × 12-bit
Seriële baud Een geschikt kristal nodig Elke Elke
Bibliotheken Zelf schrijven Duizenden Duizenden
Wat je leert De machine Het project Het systeem

De eerlijke conclusie: de 8051 is een onderdeel voor onderwijs, en een uitstekend onderdeel. Een softwarematige PWM-generator schrijven, een baudherlading met de hand berekenen en ontdekken dat een poortpin geen stroom kan leveren, laat zien welke taken elke moderne periferie voor je overneemt. Dat begrip blijft behouden, en daarom staat deze architectuur vijfenveertig jaar na de publicatie van Intel nog in studieprogramma’s.

Kies voor een robot die moet werken vrijwel alles anders. Een 8051-lijnvolger bouwen betekent PWM schrijven, een externe ADC toevoegen of sensoren met comparatoruitgangen gebruiken en elke timingconstante met de hand berekenen. Een Uno biedt dat allemaal voor dezelfde prijs. Doe het wanneer het doel is de machine te begrijpen; kies een Uno wanneer de robot het doel is.

Verken de graaf

Gebruikt in deze bouwprojecten

Projecten, leerroutes en simulators waarin de 8051-microcontroller voorkomt.

Vergelijken

Alternatieven

Vragen

FAQ over de 8051-microcontroller

Wat is de 8051-microcontroller?

De 8051 is een 8-bits microcontrollerarchitectuur die Intel in 1980 introduceerde en later breed uitlicentieerde. Je koopt hem daarom tegenwoordig als compatibele chip, zoals Atmel AT89S52, en niet als Intel-onderdeel. De chip combineert een CPU, flashgeheugen, RAM, timers, een seriële poort en 32 I/O-pinnen in één 40-pins behuizing en is nog steeds de standaard microcontroller in de meeste technische studieprogramma's.

Waarom wordt de 8051 nog steeds onderwezen als hij uit 1980 stamt?

Omdat niets voor je wordt verborgen. Er is geen kernbibliotheek, geen bordabstractielaag en geen hardware-PWM; om een LED te laten knipperen moet je een bit in een poortregister zetten en om een LED te dimmen schrijf je zelf een timerinterrupt die ticks telt. Daardoor is hij een slechte keuze om een product op de markt te brengen, maar een uitstekende keuze om te begrijpen wat elke andere microcontroller voor je uitvoert.

Wat is het verschil tussen de 8051 en een Arduino?

Een Arduino Uno is een bord rond de ATmega328P; de 8051 is een losse chip die je zelf moet omringen met een kristal, een resetcircuit en een programmer. De Arduino biedt hardware-PWM, analoge ingangen, een USB-bootloader en een enorm bibliotheekecosysteem. De 8051 biedt geen van die dingen: hij heeft geen ADC en helemaal geen PWM. Daarom gebruiken cursussen hem om de basisprincipes te leren.

Waarom gebruikt de 8051 een kristal van 11.0592 MHz?

Omdat daarmee de seriële baudrates exact zijn. De UART deelt de klok voor de machinecyclus, en 11.0592 MHz levert exact 9600 baud op. Een rond 12-MHz-kristal komt ongeveer 8,5% af en verstoort de seriële gegevens. Het vreemd ogende getal is dus gekozen op rekenkundige gronden, niet omwille van de snelheid.

Hoeveel poorten heeft de 8051?

Vier 8-bits poorten: P0, P1, P2 en P3, samen 32 I/O-pinnen. Ze zijn niet uitwisselbaar. P0 heeft geen interne pull-upweerstanden en vereist externe weerstanden. P3 bevat naast I/O ook de seriële, interrupt- en timerpinnen als alternatieve functies. P0 en P2 dienen als adres- en databus wanneer je extern geheugen aansluit.

Waarom doet mijn 8051-programma niets nadat ik het heb geprogrammeerd?

Controleer eerst de EA-pin (pin 31). Als de pin aan aarde ligt of zweeft, haalt de chip zijn programma uit extern geheugen dat er niet is. Hij doet dan helemaal niets en geeft geen fout. EA moet met +5 V verbonden zijn om code uit het interne flashgeheugen uit te voeren. De volgende verdachten zijn een ontbrekend resetcircuit en de twee lastcondensatoren van het kristal.

Kan ik de 8051 in C programmeren?

Ja, en de meeste cursussen doen dat inmiddels. Keil C51 is de industriële standaardcompiler en SDCC is een gratis open-source alternatief. C is hier veel productiever dan assembler, maar de 8051 beloont kennis van wat de compiler uitstoot. Een onschuldig ogende vermenigvuldiging of grote lokale array kost op een chip met 256 bytes RAM veel meer dan elders.

Wordt de 8051 nog steeds in echte producten gebruikt?

Ja, hoewel zelden als zichtbare losse chip. 8051-compatibele kernen zitten ingebouwd in ontelbare apparaten, zoals USB-controllers, touchsensoren, afstandsbedieningen en radiomodules, omdat de kern klein, goed begrepen en licentievriendelijk is. Je komt hem veel vaker tegen als blok in een andere chip dan als 40-pins DIP op je practicumtafel.

Verder lezen

Bronnen