Intel 8051
Intel 8051 este un singur cip 8- biți microcontroler bazat pe arhitectura Harvard , fabricat de Intel în 1980 , ca sisteme integrate de procesor. Versiunea originală Intel a fost populară în anii 1980 și începutul anilor 1990, dar a fost ulterior depășită în mare măsură de o gamă largă de dispozitive compatibile 8051 mai rapide și / sau funcționale, fabricate de peste 20 de companii independente precum Atmel , Infineon Technologies (fosta Siemens AG ), Maxim Integrated Produse (prin intermediul filialei sale Dallas Semiconductor ), NXP (fost Philips Semiconductor), Nuvoton (fost Winbond ), ST Microelectronics , Silicon Laboratories (fost Cygnal), Texas Instruments și Cypress Semiconductor . Diferența dintre un procesor real și 8051 este că acesta din urmă are 32 de linii I / O, organizate în grupuri de câte 8 biți fiecare. la fiecare dintre acestea este posibil să conectați un buton, un LED sau alte dispozitive care pot furniza I / O la 8051.
Denumirea oficială Intel pentru familia de microcontrolere 8051 este MCS 51 . Prima versiune a fost produsă folosind tehnologia NMOS , în timp ce versiunile ulterioare, identificate printr-o literă C în numele lor (de exemplu, 80C51), foloseau tehnologia CMOS și, prin urmare, erau mai eficiente din punct de vedere energetic decât predecesorii lor NMOS. Acest lucru le-a făcut să fie deosebit de potrivite pentru utilizarea pe dispozitive cu baterii .
Arhitectura 8051
8051 are 60.000 de tranzistori. Inima modelului 8051 este reprezentată de magistrala principală la care sunt conectate diferite registre, aproape toate destinate citirii sau scrierii, sub controlul programului.
8051 are două memorii separate pentru cod și date. RAM-ul de date este de numai 256 de octeți, în timp ce codul RAM poate ajunge la 64K. Pe lângă magistrala și registrele principale, există două temporizatoare pe 16 biți pe cipul 8051 care sunt indispensabile pentru aplicații în timp real. Există, de asemenea, 4 porturi I / O de 8 biți, care permit 8051 să controleze 32 de dispozitive externe, cum ar fi butoane, lumini, senzori, actuatoare și multe altele.
8051 este un procesor sincron în care majoritatea, deși nu toate, din instrucțiuni au un singur ciclu de mașină. Fiecare ciclu de mașină este împărțit în douăsprezece cicluri de ceas și șase stări. La fiecare stare se efectuează o operație specifică care duce la executarea instrucțiunii.
Aplicații și funcții importante
Cipul 8051 integrează următoarele caracteristici:
- CPU pe 8 biți
- Registre ALU pe 8 biți, acumulator și unitate aritmetică-logică
- Magistrală de date pe 8 biți
- Magistrală de adrese pe 16 biți (spațiu total adresabil: 2 16 = 64 kB independent pe RAM și ROM)
- RAM internă (memorie de date) - 256 octeți
- ROM internă (memorie program) - 4kB
- Patru porturi I / O orientate pe octeți
- UART (porturi seriale) de tip sincron (SPI, Serial Peripheral Interface ) și asincron
- Două contoare / temporizatoare de 16 biți
- Handler de întrerupere cu prioritate pe două niveluri
- Controlul consumului (modul de economisire a energiei)
O caracteristică deosebit de utilă a modelului 8051 este capacitatea de a procesa direct și eficient variabilele booleene pe un singur bit în registre și RAM. Această caracteristică a contribuit la consolidarea popularității 8051 în aplicațiile de control industrial. O altă caracteristică populară este prezența a patru seturi separate de registre de context, care sunt folosite pentru a reduce dramatic latențele de întrerupere față de metodele tradiționale de stivuire a contextului.
Porturile seriale ale modelului 8051 facilitează utilizarea cipului ca interfață de comunicație. De fapt, este posibilă configurarea modului de conectare între pinii externi și registrele de schimbare interne, conectându-le și la temporizatoarele interne, obținându-se astfel suportul diferitelor moduri de comunicații seriale, atât sincrone (SPI), cât și asincrone.
Porturile UART integrate, cu o gestionare deosebit de simplă, sunt capabile să comunice în conformitate cu cele mai comune protocoale seriale, în special un mod compatibil cu protocolul RS-485 pentru comunicații multipunct este de asemenea acceptat. Această capacitate de interfață cu alte dispozitive face ca modelul 8051 să fie deosebit de potrivit pentru aplicații încorporate.
Versiunea originală a modelului 8051 are un ciclu de mașină egal cu 12 cicluri de ceas. Deoarece majoritatea instrucțiunilor necesită unul sau două cicluri de mașină, folosind un ceas de 12 MHz, 8051 este capabil să execute până la un milion de instrucțiuni dintr-un ciclu de mașină și până la cinci sute de mii de instrucțiuni din două cicluri de mașini într-o secundă. Cele mai recente versiuni ale modelului 8051 au redus drastic numărul de cicluri de ceas pe ciclu de mașină, până la un ciclu de mașină pe ciclu de ceas, așa cum este cazul în modelele produse de SILabs, unele Dallas și unele Atmels: la o frecvență cu un ceas de 100 MHz, CPU este, prin urmare, deosebit de eficient, o altă caracteristică fundamentală pentru aplicațiile încorporate. Datorită utilizării tehnologiilor FPGA, cele mai noi modele 8051 pot funcționa la o frecvență de ceas de 200 MHz.
Cele mai recente modele de microcontrolere bazate pe nucleu 8051 au extins, de asemenea, funcționalitatea integrată în cip, crescând numărul de surse de întrerupere, extinzând funcționalitățile accesorii, cum ar fi numărul de temporizatoare și contoare și integrând funcții auxiliare suplimentare: oscilatoare interne, memorii non-volatile. programabil (flash EPROM , EEPROM ), ROM cu bootloader pentru boot mai rapid, dispozitive de comunicații seriale sincrone avansate (I 2 C), administratori de interfețe USB, moduri de consum redus și economie de energie, mecanisme de autodiagnostic etc.
Programare
În plus față de programarea limbajului de asamblare nativ, sunt disponibile mai multe compilatoare C , completate cu extensii pentru controlul alocării variabilelor în diferite tipuri de memorie și pentru accesarea caracteristicilor hardware specifice 8051, cum ar fi băncile de registre. Pentru variabilele cu un singur bit. Există, de asemenea, compilatori și interpreți ai altor limbaje de nivel înalt, cum ar fi: Forth , BASIC , Pascal / Object Pascal , PL / M și Modula 2 .
Set de instructiuni
Instrucțiuni aritmetice
Mnemonică | Descriere | Octet | Cicluri |
---|---|---|---|
ADAUGĂ A, Rn | Adăugați conținutul registrului Rn la A | 1 | 1 |
ADAUGĂ A, direct | Adaugă conținutul poziției directe la A | 2 | 1 |
ADĂUGAȚI A, @ Ri | Adăugați la A conținutul poziției arătate de Ri | 1 | 1 |
ADĂUGAȚI A, # dată | Adăugați datele imediate la A. | 2 | 1 |
ADDC A, Rn | Adăugați conținutul registrului Rn și CY la A | 1 | 1 |
ADDC A, direct | Adăugați conținutul poziției directe și CY la A. | 2 | 1 |
ADDC A, @ Ri | Adăugați la A conținutul poziției arătate de Ri și CY | 1 | 1 |
ADDC A, # data | Adăugați datele imediate și CY la A. | 2 | 1 |
SUBB A, Rn | Scade conținutul registrului Rn și CY din A | 1 | 1 |
SUBB A, direct | Scade conținutul poziției directe și CY din A | 2 | 1 |
SUBB A, @ Ri | Scade din A conținutul poziției arătat de Ri și CY | 1 | 1 |
SUBB A, # data | Scade datele imediate și CY din A | 2 | 1 |
INC A | Măriți conținutul lui A cu 1 | 1 | 1 |
INC Rn | Crește conținutul registrului Rn cu 1 | 1 | 1 |
INC direct | Crește conținutul poziției directe cu 1 | 2 | 1 |
INC @Ri | Crește conținutul poziției arătate de Ri cu 1 | 1 | 1 |
DEC A | Scade conținutul lui A cu 1 | 1 | 1 |
DEC Rn | Scade conținutul registrului Rn cu 1 | 1 | 1 |
DEC direct | Scade conținutul poziției directe cu 1 | 2 | 1 |
DEC @Ri | Scade conținutul poziției arătate de Ri cu 1 | 1 | 1 |
INC DPTR | Crește conținutul registrului DPTR cu 1 | 1 | 2 |
MUL AB | Înmulțiți conținutul lui A cu cel al lui B; partea inferioară a rezultatului merge la A și partea superioară merge la B. | 1 | 4 |
DIV AB | Împarte conținutul lui A la B; coeficientul merge la A și restul la B. | 1 | 4 |
DE LA CATRE | Efectuați ajustarea zecimală a conținutului A. Folosind reprezentarea în BCD instrucțiunile ADD și ADDC trebuie să fie urmate de DA: aceasta asigură faptul că rezultatul este încă în BCD | 1 | 1 |
Operațiuni logice
Mnemonică | Descriere | Octeți | Cicluri |
---|---|---|---|
ANL A, Rn | Logic ȘI între A și conținutul registrului Rn | 1 | 1 |
ANL A, direct | Logic ȘI între A și conținutul poziției directe | 2 | 1 |
ANL A, @ Ri | Logic ȘI între A și conținutul poziției arătate de Ri | 1 | 1 |
ANL A, # data | Logic ȘI între A și datele imediate | 2 | 1 |
ANL direct, A | Logic ȘI între conținutul poziției directe și ACC; rezultatul rămâne în poziție directă | 2 | 1 |
ANL direct, # date | Logic ȘI între conținutul poziției directe și date; rezultatul rămâne în poziție directă | 3 | 2 |
ORL A, Rn | SAU logic între A și conținutul registrului Rn | 1 | 1 |
ORL O, direct | SAU logic între A și conținutul poziției directe | 2 | 1 |
ENT A, @ Ri | SAU logic între A și conținutul poziției arătate de Ri | 1 | 1 |
ENT A, # data | SAU logic între A și originea imediată | 2 | 1 |
ORL direct, A | SAU logic între conținutul poziției directe și ACC; rezultatul rămâne în poziție directă | 2 | 1 |
ORL direct, # date | SAU logic între conținutul poziției directe și datele imediate; rezultatul rămâne în poziție directă | 3 | 2 |
XRL A, Rn | Logic EX-OR între A și conținutul registrului Rn | 1 | 1 |
XRL A, direct | EX-OR logic între A și conținutul poziției directe | 2 | 1 |
XRL A, @ Ri | EX-OR logic între A și conținutul poziției arătate de Ri | 1 | 1 |
XRL A, # dată | EX-OR logic între A și datele imediate | 2 | 1 |
XRL direct A | Logic EX-OR între conținutul poziției directe și A, rezultatul rămâne în poziția directă | 2 | 1 |
XRL direct, # date | Logic EX-OR între conținutul poziției directe și date, rezultatul rămâne în poziția directă | 3 | 2 |
CLR A | Resetați toți biții de A. | 1 | 1 |
CPL A | Completează (adică inversează) toți biții lui A. | 1 | 1 |
RL A | Întoarceți bucățile de A un loc spre stânga | 1 | 1 |
RLC A | Rotiți biții de la A la CY cu un singur loc | 1 | 1 |
RR A | Întoarceți bucățile A la un loc spre dreapta | 1 | 1 |
RRC A | Rotiți biții de la A la CY cu un singur loc | 1 | 1 |
SWAP A | schimbați cele două ciugulite ale acumulatorului | 1 | 1 |
Operațiuni de transfer de date
Mnemonică | Descriere | Octeți | Cicluri |
---|---|---|---|
MOV A, Rn | Copiați conținutul registrului Rn în A | 1 | 1 |
MOV A, direct | Copiați conținutul poziției directe în A | 2 | 1 |
MOV A, @ Ri | Copiază conținutul poziției arătate de Ri în A | 1 | 1 |
MOV A, # data | Copiați datele imediate în A | 2 | 1 |
MOV Rn, A | Copiați conținutul A pentru a înregistra Rn | 1 | 1 |
MOV Rn, direct | Copiați conținutul poziției directe în registrul Rn | 2 | 2 |
MOV Rn, # data | Copiați datele imediate în registrul Rn | 2 | 1 |
MOV direct, A | Copiați conținutul lui A în locația directă | 2 | 1 |
MOV direct, Rn | Copiați conținutul registrului Rn în poziția directă | 2 | 2 |
MOV direct, direct | Copiază conținutul poziției directe în locația directă | 3 | 2 |
MOV direct, @ Ri | Copiază conținutul poziției arătate de Ri în poziția directă | 2 | 2 |
MOV direct, # date | Copiați datele imediate în poziția directă | 3 | 2 |
MOV @ Ri, A | Copiați conținutul lui A în poziția indicată de Ri | 1 | 1 |
MOV @ Ri, direct | Copiați conținutul în poziția indicată de Ri. a poziției directe | 2 | 2 |
MOV @ Ri, # date | Copiază datele imediate în poziția indicată de Ri | 2 | 1 |
MOV DPTR, # date16 | Copiați datele pe 16 biți în DPTR | 2 | 1 |
MOVC A, @ A + DPTR | Copiază conținutul memoriei programului cu adresa DPTR + A în A | 1 | 2 |
MOVC A, @ A + PC | Copiază conținutul memoriei programului cu adresa PC + A +1 la A | 1 | 2 |
MOVX A, @ Ri | Copiază conținutul memoriei de date externe indicat de Ri în A. | 1 | 2 |
MOVX A, @ DPTR | Copiați pe A conținutul memoriei de date externe indicat de DPTR | 1 | 2 |
MOVX @ Ri, A | Copiază conținutul lui A în locația externă a memoriei de date indicată de Ri | 1 | 2 |
MOVX @ DPTR, A | Copiază conținutul lui A în locația externă a memoriei de date indicată de DPTR | 1 | 2 |
PUSH direct | Copiați conținutul poziției directe în poziția indicată de SP și măriți-l Stivați cu o unitate | 2 | 2 |
POP direct | Copiază conținutul poziției indicate de SP în poziția directă și scade stiva cu o unitate | 2 | 2 |
XCH A, Rn | Schimbați conținutul lui A cu cel al lui Rn | 1 | 1 |
XCH A, direct | Schimbați conținutul lui A cu cel al poziției directe | 2 | 1 |
XCH A, @ Ri | Schimbați conținutul lui A cu cel al poziției arătate de Ri | 1 | 1 |
XCHD A, @ Ri | Schimbați picătura cea mai puțin semnificativă din A cu cea mai semnificativă din poziția indicată de Ri | 1 | 1 |
Instrucțiuni de biți (variabile booleene) Operațiuni
Mnemonică | Descriere | Octet | Cicluri |
---|---|---|---|
CLR C | Resetați steagul CY | 1 | 1 |
Bit CLR | Resetați bitul de adresă [bit] | 2 | 1 |
SETB C | Setează steagul CY la 1 | 1 | 1 |
Bit SETB | Setează bitul de adresă la 1 [bit] | 2 | 1 |
CPL C | Inversează steagul CY | 1 | 1 |
Bit CPL | Inversați bitul adresei [bit] | 2 | 1 |
ANL C, bit | Logic ȘI între CY și bitul de adresă [bit] | 2 | 2 |
ANL C, / bit | Logic ȘI între CY și negarea bitului de adresă [bit] | 2 | 2 |
ENT C, bit | SAU logic între CY și bitul de adresă [bit] | 2 | 2 |
ORL C, / bit | SAU logic între CY și negarea bitului de adresă [bit] | 2 | 2 |
MOV C, bit | Copiați bitul de adresă în port | 2 | 1 |
Bit MOV, C | Copiați transportul la adresa bitului | 2 | 2 |
Instrucțiuni de control
Mnemonică | Descriere | Octeți | Cicluri |
---|---|---|---|
ACALL addr11 | Rulați o rutină într-un segment de 2K (numai înainte) | 2 | 2 |
LCALL addr16 | Rulați o rutină (chiar și din segment, până la ± 32K) | 3 | 2 |
RET | Încheie executarea unei rutine | 1 | 2 |
REȚELE | Termină executarea rutinei de răspuns la întrerupere | 1 | 2 |
AJMP addr11 | Salt la adresa specificată într-un segment de 2K (numai înainte) | 2 | 2 |
LJMP addr16 | Treceți la adresa specificată (chiar și în afara segmentului, până la ± 32K) | 3 | 2 |
SJMP rel | Salt la pozițiile [rel] ulterioare ale contorului de program (în intervalul –128 și +127) | 2 | 2 |
JMP @ A + DPTR | Salt la poziția computerului indicat de A + conținutul DPTR | 1 | 2 |
JZ rel | Salt la poziția [rel] dacă conținutul lui A este egal cu zero | 2 | 2 |
JNZ rel | Salt la poziția [rel] dacă conținutul lui A este diferit de zero | 2 | 2 |
JC rel | Salt la poziția [rel] dacă bitul CY este 1 | 2 | 2 |
JNC rel | Salt la poziția [rel] dacă bitul CY este 0 | 2 | 2 |
Bit JB, rel | Salt la poziția [rel] dacă bitul conținut în adresa [bit] este 1 | 3 | 2 |
Bit JNB, rel | Salt la poziția [rel] dacă bitul conținut în adresa [bit] este 0 | 3 | 2 |
Bit JBC, rel | Salt la poziția [rel] dacă bitul conținut în adresa [bit] este 1, apoi îl șterge | 3 | 2 |
CJNE A, direct, rel | Salt la poziția [rel] dacă conținutul lui A este diferit de cel al [direct]; dacă A este mai mic decât [direct] setează CY = 1, altfel CY = 0 | 3 | 2 |
CJNE A, # data, rel | Salt la poziția [rel] dacă conținutul lui A este diferit de datele imediate; dacă A este mai mic decât #date se setează CY = 1, altfel CY = 0 | 3 | 2 |
CJNE Rn, # data, rel | Salt la poziția [rel] dacă conținutul Rn este diferit de datele imediate; dacă Rn este mai mic decât datumul, setează CY = 1, altfel CY = 0 | 3 | 2 |
CJNE @ Ri, # data, rel | Salt la poziția [rel] dacă conținutul poziției arătate de Ri este diferit de datele imediate; dacă conținutul referinței este mai mic decât datumul, setează CY = 1, altfel CY = 0 | 3 | 2 |
DJNZ Rn, rel | Scade conținutul de Rn cu 1; dacă Rn nu devine 0, săriți la [rel] | 2 | 2 |
DJNZ direct, rel | Scade conținutul poziției [directe] cu 1; dacă conținutul nu devine 0, treceți la [rel] | 3 | 2 |
NOP | Fără funcționare (întârziere a ciclului mașinii) | 1 | 1 |
Notă
Rn Registrele de lucru R0-R7
direcționează 128 de locații RAM interne, port I / O, registru de control sau stare
@Ri Locație RAM internă indirectă adresată de registrul R0 sau R1
- Data constantă pe 8 biți inclusă în instrucțiune
- Date constante pe 16 biți16 incluse în instrucțiune
Semnalizare software pe 128 biți, pin I / O, control sau bit de stare
addr16 Adresa de destinație poate fi oriunde în 64-kByte din spațiul de memorie al programului
addr11 Adresa de destinație va fi în aceeași pagină de memorie a programului de 2 kByte ca primul octet al instrucțiunii curente
8-bit offset rel relativ la primul octet al instrucțiunii curente (+127, -128)
Toate mnemonice protejate prin drepturi de autor (C) Intel Corporation 1979
Variante
Chip | Memorie dedicată programului | Tipul de memorie | RAM | Numărul de temporizatoare | Numărul de întreruperi |
---|---|---|---|---|---|
8031 | 0 KB | --- | 128 | 2 | 5 |
8051 | 4 KB | rom | 128 | 2 | 5 |
8751 | 8 KB | EPROM | 128 | 2 | 5 |
8032 | 0 KB | --- | 256 | 3 | 6 |
8052 | 8 KB | rom | 256 | 3 | 6 |
8752 | 8 KB | EPROM | 256 | 3 | 6 |
Bibliografie
- (EN) William Payne, Embedded Controller Forth for the 8051 Family (Hardcover), Elsevier, 19 decembrie 1990, p. 528, ISBN 978-0-12-547570-9 .
- Andrew S. Tanenbaum, Arhitectura computerelor, o abordare structurală, Pearson Prentice Hall
Alte proiecte
- Wikimedia Commons conține imagini sau alte fișiere despre Intel 8051
linkuri externe
- Atmel , pe atmel.com .
- CAST, Inc. (8051 IP core provider) , pe cast-inc.com . Accesat la 21 mai 2009 (arhivat din original la 30 aprilie 2009) .
- NXP (Philips) , la standardics.nxp.com . Adus la 21 mai 2009 (arhivat din original la 28 aprilie 2009) .
- Produse integrate Maxim , la para.maxim-ic.com . Accesat la 21 mai 2009 (arhivat din original la 7 martie 2007) .
- Nuvoton , pe nuvoton.com . Adus la 21 mai 2009 (arhivat din original la 17 iunie 2009) .
- Roman-Jones FPGA Bazat pe 8051 Core , la roman-jones.com .
- Silicon Labs , pe silabs.com .
- Texas Instruments , la focus.ti.com .
- STC Semiconductor (furnizor chinez de produse bazate pe 8051) , pe mcu-memory.com . Accesat la 21 mai 2009 (arhivat din original la 28 februarie 2009) .
- Integrare Dolphin (furnizor IP 8051) , pe dolphin.fr . Adus la 21 mai 2009 (arhivat din original la 1 iunie 2009) .
- DIGITAL CORE DESIGN, DCD (8051/80390 IP core provider) , pe dcd.pl. Adus la 21 mai 2009 (arhivat din original la 13 februarie 2008) .
Controlul autorității | LCCN (EN) sh85067142 · GND (DE) 4196737-9 · BNF (FR) cb12333452n (data) |
---|