Sunteți pe pagina 1din 32

3.

1 Microcontrolerul 80C51
3.1.1 Caracteristici

80C51 este un microcontroler foarte răspândit, fiind cel ce a pus bazele familiei de
microcontrolere 80C51. Este realizat în tehnologie CMOS şi se prezintă într-o capsulă
DIL40 sau LCC44 sau QFP44.
Principalele caracteristici ale acestui microcontroler sunt:
- include 4 Ko memorie ROM şi 128 octeţi memorie RAM,
- include o unitate aritmetică şi logică,
- are 4 porturi de intrare/ ieşire care pot fi utilizate ca porturi de uz general dar au şi
funcţiuni specifice,
- poate adresa 64 Ko memorie externă de program şi 64 Ko memorie externă de date,
- are 2 contoare/ temporizatoare, independente, pe 16 biţi,
- include un port serial UART full duplex,
- poate gestiona 5 surse de întreruperi, cu 2 nivele de priorităţi,
- consum mic: 16 mA în modul normal, 3,7 mA în modul Idle şi 50 A în modul Power
Down.

3.1.2 Configuraţia terminalelor

Fig. 3.1 prezintă configuraţia terminalelor la microcontrolerul 80C51, grupate din punct
de vedere funcţional.
10 39-32
(11) P3.0 / RXD P0.0-7 / AD0-7 (43-36)
11
(13 P3.1 / TXD
12
(14) P3.2 / INT0
13
(15) P3.4 / INT1 1-8
14 8
(16) P3.5 / T0 P1.0-7 (2-9)
15 0
(17) P3.6 / T1
16 C
(18) P3.7 / /WR
17 5 24-31
(19) P3.8 / /RD
1 P2.0-7 / A8-15 (24-31)
19
(21) XTAL1 30
18 ALE (33)
(20) XTAL2 29
40 /PSEN (32)
(44) VCC 31
20 9 /EA (35)
(22) VSS
RST (10)

Fig. 3.1 Configuraţia terminalelor la microcontrolerul 80C51

Semnificaţiile lor sunt:


P0.0-7/ AD0-7: port bidirecţional de intrare/ ieşire, pe 8 biţi, cu drenă în gol; o ieşire
suportă 8 sarcini TTL LS; rangurile care au înscrise 1 pot funcţiona ca intrări de mare
impedanţă; în ciclurile în care se face acces la memorie este o magistrală multiplexată
între jumătatea mai puţin semnificativă din magistrala de adrese şi magistrala de date; în
acest ultim caz emite 1 pe linie utilizând rezistenţe interne la Vcc.
P1.0-7: port bidirecţional de intrare/ ieşire, pe 8 biţi, cu rezistenţe interne la Vcc; pentru a
funcţiona ca intrări, trebuie încărcat 1 în rangurile respective; o intrare comandată cu 0 va
absorbi curent datorită rezistenţei interne la Vcc.
P2.0-7/ A8-15: port bidirecţional de intrare/ ieşire, pe 8 biţi, cu rezistenţe interne la Vcc;
în timpul acceselor la memoria externă generează jumătatea superioară din magistrala de
adrese atunci când accesul memoriei externe se face cu adrese pe 16 biţi.
P3.0-7/ XXX: port bidirecţional de intrare/ ieşire, pe 8 biţi, cu rezistenţe interne la Vcc;
terminalele sale au şi funcţiuni specifice:
P3.0: RxD: intrare serială,
P3.1: TxD: ieşire serială,
P3.2: /INT0: intrare pentru întreruperea externă 0,
P3.3: /INT1: intrare pentru întreruperea externă 1,
P3.4: T0: intrare externă pentru contorul 0,
P3.5: T1: intrare externă pentru contorul 1,
P3.6: /WR: semnal de comandă pentru scriere în memoria de date externă,
P3.7: /RD: semnal de comandă pentru citire din memoria de date externă.
RST (Reset): intrare pentru iniţializare.
ALE ("Address Latch Enable"): ieşire folosită la demultiplexarea magistralei de adrese/
date; frecvenţa semnalului este egală cu 1/ 6 din frecvenţa tactului chiar dacă nu se fac
accese la memoria externă; însă în timpul unui acces la memoria externă de date se pierde
o activare.
/PSEN ("Program Store Enable"): este semnalul de comandă pentru citirea din memoria
externă de program; în ciclurile de citire din memoria externă se activează de 2 ori/ ciclu;
nu se activează atunci când se execută program din memoria internă de program şi nici în
ciclurile în care se transferă date cu memoria externă de date.
/EA ("External Address"): este o intrare care selectează memoria de program; dacă este 0
atunci se va executa din memoria externă de program iar dacă este 1 atunci se va executa
din memoria internă de program, până la valoarea 0FFFH din PC, după care se va executa
din memoria externă de program indiferent de nivelul logic care comandă terminalul.
XTAL1, XTAL2: terminale la care se conectează un cuarţ pentru a obţine tactul intern;
frecvenţa acestuia trebuie să fie de 0,5 - 12 MHz; se poate comanda terminalul XTAL1 cu
semnal de tact extern, cu factor de umplere 1/2, iar terminalul XTAL2 rămâne neconectat.
Vcc: tensiune de alimentare, +5 V tensiune continuă.
Vss: masă electrică.

3.1.3 Structura internă

Fig. 3.2 prezintă schema bloc a microcontrolerului 80C51. Resursele acestuia sunt:
- memoria internă de program, de 4 Ko,
- memoria internă RAM, de 128 octeţi,
- registrele cu funcţiuni speciale, SFR ("Special Function Registers"),
- 2 contoare/ temporizatoare, independente,
- o interfaţă serială UART full duplex,
- sistem de întreruperi.
Întreruperi externe

Sistem de 4 ko 1280 Registre cu


ROM RAM funcţiuni
întreruperi
speciale

CPU

Generator Logică de Port Contor Contor


control a Porturi de I/E
de tact serial 0 1
magistralei

P0 P1 P2 P3 TxD RxD T0 T1
3.1.3.1 Memoria internă
Memoria internă a microcontrolerului este de două tipuri: fixă şi RAM.
Memoria internă fixă a fost implementată cu memorie ROM, are 4 Ko şi ocupă zona 0000
- 0FFFH din spaţiul de adresare pentru memoria de program. Ea este adresată dacă
intrarea /EA = 1. Tot în această zonă poate fi suprapusă şi memorie fixă externă care va fi
adresată dacă /EA = 0. Pentru adrese superioare lui 0FFFH, va fi adresată memoria fixă
externă, indiferent de nivelul logic de la intrarea /EA. Memoria fixă este folosită ca
memorie de program.
Memoria RAM internă are capacitatea de 128 octeţi şi ocupă zona 0000 - 00FFH din
spaţiul de adresare pentru memoria de date. Organizarea memoriei este dată în fig. 3.3.
Fig. 3.2 Schema bloc a microcontrolerului 80C51
Fig. 3.3 Organizarea memoriei RAM interne la microcontrolerul 80C51
Zona 00 - 1FH este divizată în 4 blocuri de câte 8 octeţi, notate cu Blocul 0 - 3. Există un
grup de registre, R0-7 care se suprapune, la un moment dat, peste un singur bloc din cele
4. Blocul care se suprapune peste registrele R0-7 este selectat de programator prin
intermediul rangurilor RS1 şi RS0 din registrul de stare al programului, PSW ("Program
Status Word"). După iniţializare, unitatea centrală, CPU, începe execuţia de la adresa
0000 iar registrele R0-7 se suprapun peste Blocul 0. Stiva va fi iniţializată la adresa 07H,
adică în indicatorul de stivă, SP, se va încărca valoarea 07H. La depunerea în stivă, SP va
fi incrementat, spre deosebire de microprocesoare unde la depunerea în stivă SP este
decrementat. Se recomandă încărcarea în SP a unei valori care să corespundă unei locaţii
din zona Data RAM.
Zona 00 - 1FH poate fi accesată direct, prin intermediul unei adrese pe 8 biţi sau prin
adresare de registru. De exemplu instrucţiunea DEC R5 va avea următorul efect: prin
intermediul rangurilor RS1 şi RS0 se alege un bloc din 4, iar octetul din blocul astfel
selectat care se suprapune peste registrul R5 va fi decrementat. Registrele R0 şi R1 pot fi
folosite pentru adresare indirectă a memoriei de date. De exemplu instrucţiunea INC @R0
va avea următorul efect: prin intermediul rangurilor RS1 şi RS0 se alege un bloc iar
octetul din blocul astfel selectat care se suprapune peste R0 va fi interpretat ca adresa unei
locaţii din memoria RAM internă. Conţinutul locaţiei respective va fi incrementat.
Avantajul adresării memoriei prin intermediul registrelor R0-7 este acela că rezultă
instrucţiuni scurte. Astfel pentru adresare de registru sunt necesare doar 3 ranguri care se
găsesc, împreună cu codul instrucţiunii, în primul octet al acesteia. La adresarea indirectă,
prin intermediul registrelor R0 sau R1 este nevoie de un singur rang, aflat, de asemenea,
în primul octet al instrucţiunii.
Zona 20H - 2FH din RAM-ul intern este denumită Bit RAM, întrucât fiecare din cei 128

FF

Data RAM

30
2F
Bit_RAM
20
1F Bloc 3
18
17 Bloc 2
10
0F Bloc 1
08
07 Bloc 0
00
biţi poate fi adresat individual. Există 2 modalităţi de a adresa biţii din această zonă. Una
foloseşte adresa lor: 00 - 7FH, cu 00 pentru bitul 0 de la locaţia 20H şi 7FH pentru bitul 7
de la locaţia 2FH. Cealaltă se referă la octeţii 20H - 2FH. Astfel biţii 00 - 07 pot fi adresaţi
ca 20.0 - 20.7, biţii 08 - 0FH ca 21.0 - 21.7 etc. De exemplu instrucţiunea CLR 20.0 va
avea în al doilea octet al ei un câmp de 5 ranguri care specifică octetul 20H şi un câmp de
3 ranguri care specifică bitul selectat. Fiecare octet din această zonă poate fi adresat şi ca
octet distinct.
Zona 30H - 7FH este denumită Data RAM şi este o zonă de memorie RAM de uz general.
Se recomandă plasarea stivei în această zonă.

3.1.3.2 Registrele cu funcţiuni speciale, SFR

Microcontrolerul 80C51 conţine un grup de registre interne, cu funcţiuni speciale. Ele


sunt adresabile în mod direct iar registrele ale căror adrese se termină în 0 sau 8 pot fi
adresate şi la nivel de bit. Registrele şi adresele lor sunt prezentate în tab. 3.3.
În continuare vor fi prezentate, pe scurt, registrele.
ACC: este registrul acumulator. Denumirea folosită în cadrul instrucţiunilor este A.
B: este un registru cu rol predeterminat în instrucţiunile de înmulţire şi împărţire. Pentru
celelalte instrucţiuni, poate fi utilizat ca registru general.
SP ("Stack Pointer"): este indicatorul de stivă. Este incrementat înaintea unei depuneri în
stivă prin intermediul instrucţiunilor CALL sau PUSH. După iniţializare este încărcat cu
valoarea 07H deci stiva începe de la adresa 08H. Poate fi încărcat, prin program, cu orice
valoare.

Registru Adresă de bit Adresă de


b7 b6 b5 b4 b3 b2 b1 b0 registru
B F7 F6 F5 F4 F3 F2 F1 F0 F0H
ACC E7 E6 E5 E4 E3 E2 E1 E0 E0H
PSW D7 D6 D5 D4 D3 D2 D1 D0 D0H
IP BF BE BD BC BB BA B9 B8 B8H
P3 B7 B6 B5 B4 B3 B2 B1 B0 B0H
IE AF AE AD AC AB AA A9 A8 A8H
P2 A7 A6 A5 A4 A3 A2 A1 A0 A0H
SBUF 99H
SCON 9F 9E 9D 9C 9B 9A 99 98 98H
P1 97 96 95 94 93 92 91 90 90H
TH1 8DH
TH0 8CH
TL1 8BH
TL0 8AH
TMOD 89H
TCON 8F 8E 8D 8C 8B 8A 89 88 88H
PCON 87H
DPH 83H
DPL 82H
SP 81H
P0 87 86 85 84 83 82 81 80 80H
Tab. 3.3 Registrele cu funcţiuni speciale ale microcontrolerului 80C51

PSW ("Program Status Word"): este registrul de stare al programului. Conţine indicatorii
de condiţii. Rangurile sale au următoarele semnificaţii:
PSW.0: P ("Parity"): indicator de paritate; va fi 1 dacă numărul de 1 din acumulator este
impar.
PSW.1: rezervat.
PSW.2: OV ("Overflow"): indicator de depăşire; se foloseşte atunci când se lucrează cu
operanzi cu semn şi indică apariţia unui transport/ împrumut în/ din rangul de semn ceea
ce înseamnă depăşirea domeniului de valori care poate fi încărcat într-un registru pe 8 biţi.
PSW.3-4: RS1, RS0: selectează blocul din memoria RAM internă care se suprapune peste
grupul de registre R0-7, conform tab. 3.4.

RS1 RS0 R0-7 se suprapune peste


0 0 Blocul 0 (00H - 07H)
0 1 Blocul 1 (08H - 0FH)
1 0 Blocul 2 (10H - 17H)
1 1 Blocul 3 (18H - 1FH)
Tab. 3.4 Selecţia blocului de memorie care se suprapune peste registrele RS1, RS0
la microcontrolerul 80C51
PSW.5: F0: indicator la dispoziţia utilizatorului.
PSW.6: AC ("Auxiliary Carry"): indicatorul de transport sau împrumut auxiliar; indică un
transport sau un împrumut între cei doi digiţi ai rezultatului unei operaţii de adunare sau
scădere între 2 operanzi în cod BCD.
PSW.7: CY ("Carry"): indicatorul de transport sau împrumut; indică apariţia unui
transport/ împrumut din/ în rangul cel mai semnificativ al acumulatorului ca urmare a
unei operaţii de adunare/ scădere, ceea ce înseamnă depăşirea capacităţii registrului.
DPH, DPL ("Data Pointer High, Low"): sunt două registre pe câte 8 biţi care alcătuiesc
împreună DPTR ("Data Pointer Register"), DPH fiind jumătatea superioară din DPTR iar
DPL fiind jumătatea inferioară din DPTR. DPTR este folosit la adresarea indirectă a unei
locaţii din memoria externă şi poate fi accesat ca registru pe 16 biţi sau ca 2 registre pe 8
biţi.
TH0, TL0 ("Timer 0 Counter"): sunt două numărătoare pe câte 8 biţi care alcătuiesc
împreună un numărător pe 16 biţi pentru contorul/ temporizatorul 0.
TH1, TL1 ("Timer 1 Counter"): sunt două numărătoare pe câte 8 biţi care alcătuiesc
împreună un numărător pe 16 biţi pentru contorul/ temporizatorul 1.
SBUF ("Serial Data Buffer"): este un tampon folosit la transferul serie şi este fizic alcătuit
din 2 registre: un tampon pentru transmisie şi unul pentru recepţie. Transmisia este iniţiată
prin scrierea unui octet în SBUF. La citire, se primeşte un octet de la tamponul pentru
recepţie.
P0, P1, P2, P3: sunt registrele ce corespund porturilor P0, P1, P2 respectiv P3. Dacă un
port este ieşire şi se scrie 1 sau 0 în un rang din registrele P0 - P3, terminalul
corespunzător al portului va avea nivelul logic 1 sau 0.
IP, IE, TMOD, TCON, SCON, PCON: sunt registre de control care vor fi prezentate pe
măsură ce se descrie rolul lor.
Microcontrolerul 80C51 mai dispune de 2 registre, în CPU, care nu sunt cu funcţiuni
speciale şi nu pot fi adresate de programator. Acestea sunt:
PC ("Program Counter"): este un numărător pe 16 biţi care este incrementat la fiecare
citire de octet din memoria de program; el conţine adresa locaţiei de memorie în care se
află următorul octet din instrucţiune.
IR ("Instruction Register"): este un registru pe 8 biţi în care se depune octetul din
instrucţiune adus în vederea decodificării sale.

3.1.3.3 Contoarele/ temporizatoarele 0, 1

Microcontrolerul 80C51 dispune de 2 contoare/ temporizatoare implementate cu două


numărătoare independente, pe 16 biţi, notate cu TIMER 0 şi TIMER 1. TIMER 0 este
alcătuit din numărătoarele TH0 şi TL0 iar TIMER 1 este alcătuit din numărătoarele TH1
şi TL1. Există 2 surse de tact pentru fiecare din cele două contoare/ temporizatoare. Dacă
funcţia îndeplinită este cea de temporizator atunci sursa este tactul microcontrolerului,
fOSC divizat la 12 deci numărătorul va fi incrementat în fiecare ciclu maşină. Dacă funcţia
îndeplinită este cea de contor atunci sursa este un semnal extern, T0, respectiv T1. Ti este
testat în fiecare S5P2 (paragraful 3.1.3.9) a unui ciclu maşină şi un front căzător al acestui
semnal va incrementa numărătorul. Frontul căzător este detectat dacă într-un ciclu maşină
se citeşte valoarea 1 la terminalul Ti şi în ciclul următor se citeşte valoarea 0 la acelaşi
terminal Ti. Numărătorul este decrementat în faza S3P1 a ciclului maşină următor celor
două în care s-a detectat frontul căzător la terminalul Ti. Întrucât sunt necesare 2 cicluri
maşină pentru o detectare, rezultă că frecvenţa maximă de numărare este de 1/ 24 din
frecvenţa tactului.
Funcţionarea contoarelor TIMER 0 şi TIMER 1 este controlată de 2 registre: TMOD
("Timer Mode Register"), fig. 3.4 şi TCON ("Timer Control Register"), fig. 3.5.

7 6 5 4 3 2 1 0
GATE C/ /T M1 M0 GATE C/ /T M1 M0
TMOD.0-1: M0, M1: fixează modul de lucru pentru TIMER 0 conform tab. 3.5.

M1 M0 Mod
0 0 0
0 1 1
1 0 2
1 1 3
Tab. 3.5 Modul de lucru la TIMER 0 sau 1 al microcontrolerului 80C51

TMOD.2: C/ /T: stabileşte sursa tactului pentru numărare:


0: sursa tactului este fOSC divizat la 12, 1: sursa tactului este T0.
TMOD.3: GATE: controlează pornirea şi oprirea numărării:
0: pornirea/ oprirea este controlată de rangul TR0, 1: numărarea este pornită dacă TR0 =
/INT0 = 1 şi este oprită dacă TR0 = 0 sau /INT0 = 0.
TMOD.4-5: idem cu TMOD.0-1 dar pentru TIMER 1.
TMOD.6: idem cu TMOD.2 dar pentru TIMER 1.
TMOD.7: idem cu TMOD.3 dar pentru TIMER 1.
Fig. 3.4 Structura registrului TMOD al microcontrolerului 80C51

7 6 5 4 3 2 1 0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TCON.0: IT0: stabileşte dacă întreruperea externă care soseşte pe intrarea /INTO va fi
luată în considerare pe frontul căzător, 1 sau pe nivel, 0.
TCON.1: IE0: indicator pentru întreruperea externă 0; este setat dacă s-a detectat
întreruperea externă /INT0; este anulat dacă întreruperea este deservită, atunci când
aceasta este luată în considerare pe front, adică IT0 = 1.
TCON.2-3: idem cu TCON.0-1 dar pentru TIMER 1.
TCON.4: TR0: rang de control pentru pornirea/ oprirea numărării la TIMER 0: 1 porneşte
numărarea iar 0 o opreşte.
TCON.5: TF0: indicator de depăşire a numărătorului; este poziţionat la depăşirea
capacităţii numărătorului provocată de o incrementare din starea FFFFH în starea 0000 şi
este o sursă pentru cererea de întrerupere de la TIMER 0; este anulat automat atunci când
întreruperea este deservită.
TCON.6-7: idem cu TCON.4-5 dar pentru TIMER 1.
Fig. 3.5 Structura registrului TCON al microcontrolerului 80C51

Controlul numărarii este realizat de rangurile TMOD.3 şi TMOD.7, GATE, pentru


TIMER 0, respectiv TIMER 1. Dacă GATE = 0 atunci rangurile TCON.4, TRO, respectiv
TCON.6, TR1, vor controla numărarea. Dacă TRi = 1, numărarea porneşte iar dacă TRi =
0, numărarea se opreşte. Dacă GATE = 1 atunci numărarea porneşte dacă TRi & /INTi = 1
şi se opreşte dacă TRi = 0 sau /INTi = 0. În acest caz controlul numărării poate fi realizat
extern, prin /INTi. O aplicaţie este aceea că se pot astfel măsura durate de semnale
externe.
Selectarea tactului este realizată de TMOD.2, respectiv TMOD.6, C/ /T. Dacă C/ /T = 0
atunci sursa tactului este fOSC/ 12 iar dacă C/ /T = 1 atunci sursa tactului este un semnal
extern aplicat la terminalele T0, respectiv T1.
Schema care implementează controlul numărării şi selectarea tactului este prezentată în
fig. 3.6. S5 este un semnal obţinut în timpul fiecărui ciclu maşină şi indică starea a 5-a din
ciclu.

fOSC / 12

CLOCK
T0 sau T1 Detector pentru
TIMER 0
sau
TIMER1
TL0 TH0 TF0
CLOCK 5 biţi 8 biţi

TL1 TH1 TF1


CLOCK 5 biţi 8 biţi

Tact serial

Fig. 3.6 Controlul numărării şi selectarea tactului


la contoarele/ temporizatoarele microcontrolerului 80C51

Există 4 moduri de lucru pentru TIMER 0 şi 1, selectabile prin rangurile corespunzătoare


M1 şi M0.

Modul 0
TIMER 0 şi 1 sunt configurate ca numărătoare pe 13 biţi. TL0 şi TL1 sunt numărătoare
alcătuite din 5 ranguri, cele mai puţin semnificative iar TH0 şi TH1 sunt numărătoare pe 8
biţi. Indicatorii de depăşire TF0 şi TF1 sunt poziţionaţi atunci când numărătorul
corespunzător conţine valoarea maximă şi este incrementat, anulându-se astfel conţinutul
său. Semnalul care apare la ieşirea de depăşire a lui TIMER 1 este sursă pentru tactul
serial. Fig. 3.7 prezintă pe TIMER 0 şi 1 în modul 0.
Fig. 3.7 TIMER 0 şi 1 în modul 0 la microcontrolerul 80C51

Modul 1
Este identic cu modul 0, cu excepţia faptului că numărătoarele sunt pe 16 biţi. Fig. 3.8
prezintă pe TIMER 0 şi 1 în modul 1.
Fig. 3.8 TIMER 0 şi 1 în modul 1 la microcontrolerul 80C51

Modul 2
TIMER 0 şi 1 sunt configurate ca numărătoare pe 8 biţi cu auto-âncărcare. TL0 şi TL1
sunt folosite ca numărătoare iar TH0 şi TH1 sunt folosite ca registre pentru păstrarea
constantei care se va încărca. Semnalul de depăşire generat de TL0 sau TL1 va provoca
preâncărcarea acestora şi numărarea va continua de la această valoare. TH0 şi TH1 sunt
încărcate prin program. Indicatorii TF0 şi TF1 sunt poziţionaţi de semnalele de depăşire
de la numărătoarele TL0, respectiv TL1. Semnalul de depăşire generat de numărătorul
TL1 este sursă pentru tactul serial. Fig. 3.9 prezintă pe TIMER 0 şi 1 în modul 2.

Modul 3
Acest mod poate fi cerut doar pentru TIMER 0. Dacă i se cere lui TIMER 1, acesta nu va
număra (se obţine acelaşi efect ca şi când TR1 = 0). TIMER 0 în modul 3 lucrează ca
două numărătoare independente pe 8 biţi. TL0 foloseşte rangurile de control ale lui
TIMER 0, adică C/ /T, GATE, TR0 şi /INT0 şi comandă pe TF0 iar TH0 foloseşte pe TR1

TL0 TH0 TF0


CLOCK
8 biţi 8 biţi

TL1 TH1 TF1


CLOCK 8 biţi 8 biţi

Tact serial

şi comandă pe TF1.
Acest mod este util în aplicaţii în care se cere un numărător suplimentar. TIMER 0
furnizează 2 contoare pe 8 biţi iar TIMER 1 poate fi folosit în modurile 0, 1 sau 2 fără a
putea, însă, să poziţioneze pe TF1 deci nu va putea să genereze cerere de întrerupere. Fig.
3.10 prezintă pe TIMER 0 în modul 3.
Fig. 3.9 TIMER 0 şi 1 în modul 2 la microcontrolerul 80C51
Fig. 3.10 TIMER 0 în modul 3 la microcontrolerul 80C51

CLOCK TL0 TF0

TH0

CLOCK TL1 TF1

TH1 Tact serial

CLOCK TL0 TF0

fOSC / 12 TH0 TF1


TR1

3.1.3.4 Interfaţa serială

Microcontrolerul 80C51 posedă o interfaţă serială UART ("Universal Asynchronous


Receiver/ Transmitter"), full duplex, ceea ce înseamnă că poate emite şi recepţiona
simultan. Blocul de recepţie posedă un dublu tampon, alcătuit dintr-un registru de
deplasare şi un registru tampon, ceea ce înseamnă că se realizează recepţia unui caracter
simultan cu predarea caracterului recepţionat anterior către CPU, rezultând astfel câştig de
timp. Totuşi, dacă un caracter nu este preluat de unitatea centrală în timp ce se încheie
asamblarea caracterului următor, primul se va pierde.
Interfaţa serie poate lucra în modul I/ E (intrare/ ieşire) extins sau în modul UART. În
modul I/ E extins, transferul se face sincron cu tactul microcontrolerului. În modul UART
se pot transfera caractere pe 10 sau 11 biţi. Caracterul pe 11 biţi este alcătuit dintr-un bit
de START, 8 biţi de date, un al 9-lea bit programabil şi bitul de STOP.
Schema bloc a interfeţei seriale este prezentată în fig. 3.11.
fTIM Logică
control
fOSC / 2 transmisie MUX
TxD

SBUF (T) SCON SMOD

Întrerupere

Magistrală
internă
SBUF (R)

Registru MUX
deplasare RxD

Logică
control
recepţie

Fig. 3.11 Interfaţa serială la microcontrolerul 80C51

Aceasta cuprinde logica de control pentru transmisie şi recepţie, registrul de control


SCON ("Serial Control Register"), registrele tampon SBUF ("Serial Buffer Register") şi
rangul SMOD.
Registrul SCON, fig. 3.12, conţine biţi de control pentru a specifica modurile de operare,
activarea/ dezactivarea recepţiei de date, memorarea celui de-al 9-lea bit de date şi starea
interfeţei seriale. Fiecare rang poate fi adresat individual.

7 6 5 4 3 2 1 0
SM0 SM1 SM2 REN TB8 RB8 TI RI
SCON.0: RI: este un indicator activat de interfaţa serială atunci când a terminat de
asamblat un caracter şi îl poate oferi unităţii centrale; împreuna cu rangul TI constituie
intrări pentru o poartă SAU, a cărei ieşire poate fi folosită ca cerere de întrerupere;
ştergerea indicatorului se face doar prin program.
SCON.1: TI: indicator activat de interfaţa serială atunci când a terminat de transmis un
caracter şi poate primi altul de la unitatea centrală; împreună cu rangul RI constituie
intrări pentru o poartă SAU a cărei ieşire poate fi folosită ca cerere de întrerupere;
ştergerea indicatorului se face doar prin program.
SCON.2: RB8: rang pentru memorarea celui de-al 9-lea bit recepţionat dintr-un caracter
pe 11 biţi, folosit în modurile 2 şi 3; în modul 1 va reţine bitul STOP dacă rangul SM2 = 0
iar în modul 0 nu este folosit.
SCON.3: TB8: rang pentru memorarea celui de-al 9-lea bit de date ce se va transmite într-
un caracter pe 11 biţi, folosit în modurile 2 şi 3; este poziţionat prin program.
SCON.4: REN: trebuie să fie setat pentru ca recepţia să fie activată.
SCON.5: SM2: validează facilitatea de comunicare în sistem multiprocesor, în modurile 2
sau 3; dacă SM2 = 1, în modurile 2 sau 3 (cu 11 biţi/ caracter) şi al 9-lea bit de date este 1
atunci data recepţionată este acceptată şi este încărcată în SBUF şi RB8 şi indicatorul RI
este activat; dacă al 9-lea bit de date este 0, data este ignorată şi SBUF, RB8 şi RI rămân
nemodificate; dacă SM2 = 1 în modul 1 (cu 10 biţi/ caracter), se va încărca bitul de STOP
în RB8, data este preluată şi indicatorul RI este activat; dacă SM2 = 0, data este acceptată
indiferent de valoarea celui de=al 9-lea bit de date sau a bitului de STOP.
SCON. 6-7: SM1, SM0: setează modul de lucru al interfeţei seriale, conform tab. 3.6.

SM0 SM1 Mod Descriere Rata de transfer


0 0 0 I/ E extins fOSC/ 12
0 1 1 UART cu 10 biţi Variabilă
1 0 2 UART cu 11 biţi fOSC/ 32 sau fOSC/ 64
1 1 3 UART cu 11 biţi Variabilă
Tab. 3.6 Modul de lucru al interfeţei seriale a microcontrolerului 80C51
Fig. 3.12 Structura registrului SCON al microcontrolerului 80C51

Registrul SBUF este tamponul pentru date. Deşi îi corespunde o singură adresă, este
alcătuit din 2 registre: unul pentru transmisie şi unul pentru recepţie. Corespunzător,
SBUF poate fi specificat în instrucţiuni ca registru sursă sau ca registru destinaţie.
Transmisia este anclanşată prin înscrierea datei în SBUF iar la recepţie, data este citită din
SBUF.
Rangul SMOD este rangul 7 din registrul PCON ("Power Control Register") şi are rolul să
divizeze cu 2 ( SMOD = 1) sau nu (SMOD = 0), rata de transfer.
În continuare vor fi descrise modurile de lucru ale interfeţei seriale.

Modul 0
Este modul numit şi I/ E extins în care se transferă date pe 8 biţi, sincronizate cu tactul
microcontrolerului. Terminalul TxD este folosit doar pentru a genera tactul iar terminalul
RxD este folosit pentru a transfera date în ambele sensuri.
Transmisia este iniţiată prin scrierea în registrul SBUF. După un ciclu maşină de la
încheierea scrierii în SBUF, apare cel mai puţin semnificativ bit al datei la pinul RxD.
După 2 stări de la apariţia acestui bit, este activat, la 0, tactul pe linia TxD. O periodă
completă a tactului corespunde unui ciclu maşină (începe şi se termină în a 2-a fază a
stării S3). După transferul bitului cel mai semnificativ al datei, logica de transmisie este
activată şi este setat indicatorul TI.
Recepţia este activată atunci când REN = 1 şi RI = 0. Aceasta se va realiza prin program.
Tactul de pe linia TxD se va activa, la 0, după 9 stări după ce REN = 1 şi RI = 0. O
perioadă a tactului de pe linia TxD corespunde unui ciclu maşină. Data este citită de pe
linia RxD în registrul tampon de citire imediat înaintea tranziţiei 0 -> 1 a tactului. După ce
preluarea caracterului s-a încheiat, el este transferat în SBUF, logica de recepţie este
iniţializată şi se activează indicatorul RI.
Rata de transfer în modul 0 este:
R = fOSC/ 12.
Fig. 3.13 prezintă diagrama transferului în modul 0.
Fig. 3.13 Transferul în modul 0 al interfeţei seriale a microcontrolerului 80C51

Modul 1
Este un mod UART în care se transferă caractere pe 10 biţi: 1 bit de START, 8 biţi de

S1 S2 S3 S4 S5 S6 S1 S2 S3 S4 S5 S6 S1
CLK

TRANSMISIE
RxD
(DATE)
TxD
(Tact)
RECEPŢIE
RxD
(DATE)
TxD
(Tact)
date, primul fiind cel mai puţin semnificativ şi 1 bit de STOP. La recepţie, bitul de STOP
se încarcă în RB8. Fig. 3.14 prezintă schema bloc a interfeţei seriale în modul 1 iar fig.
3.15 prezintă diagrama transferului în modul 1.
Rata de transfer este determinată de frecvenţa semnalului de la ieşirea de depăşire a lui
TIMER 1, fTIM. Dacă TIMER 1 lucrează în modul 0 sau 1 atunci rata de transfer este:
2SMOD
R = ------------ * fTIM.
32
Dacă TIMER 1 lucrează în modul 2 atunci rata de transfer este:
2SMOD fOSC
R = ------------- * --------------------------------; (TH1) este constanta de preâncărcare.
32 12 * (256 - (TH1))
TIMER 1 poate lucra ca şi contor sau ca temporizator şi este necesară dezactivarea
întreruperii generată de TF1.
Transmisia se realizează pe terminalul TxD şi este anclanşată de o scriere în tamponul
SBUF. Tactul fOSC sau fTIM divizat la 2 sau nu de SMOD, este divizat la 16 de un
numărător. Transmisia începe prin plasarea bitului de START la începutul ciclului maşină
care urmează după ce numărătorul a executat un ciclu complet, după încheierea scrierii în
Fig. 3.14 Schema bloc a interfeţei seriale în modul 1 la microcontrolerul 80C51
Magistrala internă

TB8
fTIM Scrie în
SBUF
/S
SMOD= /2 D Q SBUF (T) TxD
=0 /R
SMOD=
=1
Start Deplasare
Logică control
transmisie Date
Numărător Tact TI Transfer
/ 16
Întrerupere
de la
Numărător interfaţa
/ 16 serie
Tact RI
7 Transfer
8 Logică control
9 recepţie
Detector
tranziţie Start Deplasare
1 0

789
Detector
bit

RxD Registru deplasare


recepţie

SBUF (R)

Citeşte
SBUF

Magistrala internă
SBUF. În continuare, la fiecare ciclu complet al numărătorului se emite un bit de date.
După ce se emite şi bitul de STOP, se activează indicatorul TI.
Recepţia se realizează pe terminalul RxD şi este anclanşată de o tranziţie 1 -> 0 pe acest
terminal. Această tranziţie corespunde bitului de START şi numărătorul mod 16 începe să
numere. Un ciclu complet al numărătorului corespunde unui bit serie recepţionat. În
consecinţă TIMER 1 trebuie să fie încărcat cu o astfel de valoare încât perioada
numărătorului mod 16 să fie egală cu rata de recepţie.

TRANSMISIE

Tact
Scrie în
SBUF

/Transfer

Date

Deplasare

START
TxD D0 D1 D2 D3 D4 D5 D6 D7 TB8 STOP

TI

RECEPŢIE

Tact

RxD START
D0 D1 D2 D3 D4 D5 D6 D7 RB8 STOP

7, 8, 9

Deplasare

RI
Fig. 3.15 Transferul în modul 1 al interfeţei seriale a microcontrolerului 80C51

După ce numărătorul începe să numere, în stările 7, 8 şi 9 ale acestuia, logica de recepţie


citeşte linia RxD şi dacă găseşte cel puţin 2 valori 0, consideră bitul de START ca fiind
valid, îl preia şi îl introduce în registrul de deplasare din tamponul de recepţie. În caz
contrar consideră că a fost un impuls de START fals şi revine în starea iniţială în care
aşteaptă o nouă tranziţie 1 -> 0 pe linia RxD.
După preluarea bitului de START, sunt preluaţi în mod analog şi biţii de date ce sosesc de
pe linia serială. Un bit este citit în stările 7, 8 şi 9 ale numărătorului şi valoarea preluată
este cea care corespunde la cel puţin 2 din 3 citiri. În acest fel s-a implementat un
mecanism de rejecţie a zgomotelor.
În timpul bitului de STOP, în starea 10 a numărătorului, data din registrul de deplasare
este încărcată în SBUF, bitul de STOP este încărcat în RB8, circuitele de recepţie sunt
iniţializate şi se activează indicatorul RI.
Încărcarea datei în SBUF, a bitului de STOP în RB8 şi activarea indicatorului RI se
realizează doar dacă în momentul respectiv sunt îndeplinite condiţiile:
- RI = 0 şi
- SM2 = 0 sau SM2 = 1 şi bitul STOP = 1.
Dacă vreuna din aceste condiţii nu este îndeplinită atunci data este ignorată şi SBUF, RB8
şi RI rămân nemodificate.

Modul 2
Este un mod UART cu 11 biţi/ caracter: 1 bit de START, 8 biţi de date, 1 bit programabil
şi 1 bit de STOP. La transmisie, bitul al 9-lea este TB8 şi poate fi programat iar la
recepţie, bitul al 9-lea este încărcat în RB8. Rata de transfer este:
2SMOD
R = -------------- * fOSC
64
Transmisia şi recepţia se realizează întocmai ca şi în modul 1, utilizând aceleaşi resurse
hardware şi acelaşi mecanism de rejecţie a zgomotelor. Apare o singură diferenţă, legată
de al 9-lea bit de date. Astfel la transmisie, după bitul de START şi cei 8 biţi de date,
emişi în aceeaşi ordine ca şi la modul 1, este emis al 9-lea bit, TB8, care poate fi bitul de
paritate dacă în prealabil acesta a fost încărcat în TB8, apoi se emite bitul de STOP şi se
activează indicatorul TI.
La recepţie, după preluarea bitului de START şi a biţilor de date, este preluat al 9-lea bit,
care se încarcă în RB8, apoi este preluat bitul de STOP şi se activează indicatorul RI.
Preluarea datei, încărcarea celui de-al 9-lea bit în RB8 şi activarea indicatorului RI au loc
dacă sunt îndeplinite, la momentul respectiv, condiţiile:
- RI = 0 şi
- SM2 = 0 sau SM2 = 1 şi bitul al 9-lea = 1.
Dacă vreuna din aceste condiţii nu este îndeplinită atunci data este ignorată şi SBUF, RB8
şi RI rămân nemodificate.
Modul 3
Este un mod UART cu 11 biţi/ caracter care diferă de modul 2 doar prin rata de transfer
care aici, depinde de fTIM. Astfel:
2SMOD
R = -------------- * fTIM,
32
dacă TIMER 1 lucrează în modul 0 sau 1 şi
2SMOD fOSC
R = ------------- * ------------------------------,
32 12 * (256 - (TH1))
dacă TIMER 1 lucrează în modul 2.
TIMER 1 poate lucra ca şi contor sau temporizator şi este necesară dezactivarea
întreruperii generată de TF1.
În tab. 3.7 se prezintă ratele de transfer uzuale şi cum pot fi ele obţinute din TIMER 1.

Rata de transfer fOSC SMOD TIMER 1


[MHz] C//T Mod Const. de preâncărcare
Mod O:max. 1,67 Mbiţi/s 20 x x x x
Mod 2:max. 625 Kbiţi/s 20 1 x x x
Mod1,3:max.104,2 Kbiţi/s 20 1 0 2 FFH
19,2 Kbiţi/s 11,059 1 0 2 FDH
9,6 Kbiţi/s 11,059 0 0 2 FDH
4,8 Kbiţi/s 11,059 0 0 2 FAH
2,4 Kbiţi/s 11,059 0 0 2 F4H
1,2 Kbiţi/s 11,059 0 0 2 E8H
110 biţi/s 12 0 0 1 D4H
110 biţi/s 6 0 0 2 72H
Tab. 3.7 Ratele de transfer uzuale la microcontrolerul 80C51

În continuare se va descrie facilitatea de comunicare în sistem multiprocesor. Aceasta se


bazează pe existenţa celui de-al 9-lea bit de date în modurile 2 sau 3. Dacă rangul SM2 =
1 şi bitul al 9-lea este 1 atunci data este preluată iar dacă bitul al 9-lea este 0 atunci data
este neglijată.
Fie un sistem multiprocesor, fig. 3.16, cu un microcontroler master şi mai multe
microcontrolere slave. Datele vor fi transmise doar de la master la slave.

...

TxD RxD RxD RxD


80C51 80C51 80C51 80C51
MASTER SLAVE SLAVE ... SLAVE

Fig. 3.16 Sistem multumicroprocesor


În faza iniţială, toate microcontrolerele slave au SM2 = 1 şi aşteaptă să fie selectate.
Microcontrolerul master emite adresa microcontrolerului slave selectat. Adresa diferă de
date prin aceea că are rangul al 9-lea, TB8, egal cu 1. Toate microcontrolerele slave vor
prelua adresa, îşi vor genera întreruperi şi în rutinele de tratare vor verifica propria adresă
cu cea sosită de la microcontrolerul master. Microcontrolerul slave selectat va modifica
SM2 deci doar la acesta va exista SM2 = 0 iar la toate celelalte microcontrolere slave va
exista SM2 = 1. În continuare, microcontrolerul master emite datele, cu TB8 = 0. Doar
acel microcontroler slave care va avea SM2 = 0 va prelua datele iar toate celelalte
microcontrolere slave le vor ignora întrucât la acestea SM2 = 1. După ce microcontrolerul
master a emis toate datele, el va emite un cod de final, predeterminat, care va avea ca
efect setarea lui SM2 de către microcontrolerul slave care a fost selectat. În acest fel s-a
revenit în starea iniţială în care toate microcontrolerele slave au SM2 = 1 şi aşteaptă să fie
selectate.

3.1.3.5 Sistemul de întreruperi

Microcontrolerul 80C51 posedă 5 surse pentru întreruperi: 2 întreruperi externe generate


la intrările /INT0 şi /INT1 şi 3 întreruperi interne: 2 de la circuitele contoare/
temporizatoare şi una de la întreruperea serială.
Cererile de întrerupere setează indicatori care sunt ranguri din registrele TCON şi SCON.
Astfel întreruperile externe setează indicatorii IE0 (TCON.1) şi IE1 (TCON.3),
întreruperile de la contoare setează rangurile TF0 (TCON.5) şi TF1 (TCON.7) iar
întreruperea serială setează fie rangul RI (SCON.0) fie rangul TI (SCON.1). RI şi TI sunt
intrări într-o poartă SAU a cărei ieşire este cererea de întrerupere de la interfaţa serială.
Întreruperile sunt controlate de 2 registre: IE ("Interrupt Register"), fig. 3.17 şi IP
("Priority Register"), fig. 3.18.
Rolul registrului IE este acela de a valida/ invalida întreruperile. Pentru a valida o
întrerupere, bitul corespunzător trebuie să fie 1 iar pentru a o dezactiva, bitul
corespunzător trebuie să fie 0.

7 6 5 4 3 2 1 0
EA - - ES ET1 EX1 ET0 EX0
IE.0: EX0: bit de control pentru întreruperea externă 0.
IE.1: ET0: bit de control pentru contorul/ temporizatorul 0.
IE.2: EX1: bit de control pentru întreruperea externă 1.
IE.3: ET1: bit de control pentru contorul/ temporizatorul 1.
IE.4: ES: bit de control pentru întreruperea serială.
IE.7: EA: bit de control general: dacă este 0 atunci o întrerupere nu poate fi tratată; dacă
este 1 atunci o întrerupere poate fi tratată dacă bitul de control corespunzător este 1.
Fig. 3.17 Structura registrului IE al microcontrolerului 80C51

Rolul registrului IP este acela de a aloca priorităţi. Există 2 nivele de prioritate: scăzut şi
ridicat. Fiecărei surse i se poate aloca , în mod independent, oricare nivel de prioritate.
Fiecărei întreruperi îi corespunde un rang: 1 în rangul respectiv înseamnă prioritate
ridicată iar 0 în rangul respectiv înseamnă prioritate scăzută. Dacă apar simultan 2 cereri
de întrerupere, de priorităţi diferite, va fi tratată cererea de prioritate mare. Dacă apar
simultan 2 sau mai multe cereri de aceeaşi prioritate, microcontrolerul le va lua în
considerare într-o ordine prestabilită care este: IE0, TF0, IE1, TF1 şi, ultima, RI + TI.
Rutina de tratare a unei întreruperi de prioritate scăzută poate fi întreruptă de o cerere de
prioritate ridicată dar nu şi invers. Rutina de tratare a unei întreruperi nu poate fi
întreruptă de o cerere de aceeaşi prioritate.

7 6 5 4 3 2 1 0
- - - PS PT1 PX1 PT0 PX0
IP.0: PX0: rang de prioritate pentru întreruperea externă 0.
IP.1: PT0: rang de prioritate pentru întreruperea de la contorul/ temporizatorul 0.
IP.2: PX1: rang de prioritate prntru întreruperea externă 1.
IP.3: PT1: rang de prioritate pentru întreruperea de la contorul/ temporizatorul 1.
IP.4: PS: rang de prioritate pentru întreruperea serială.
Fig. 3.18 Structura registrului IP al microcontrolerului 80C51

Întreruperile sunt citite în timpul lui S5P2 al fiecărui ciclu maşină. Apoi are loc o testare a
ceea ce s-a citit în timpul următorului ciclu maşină. Dacă vreunul din indicatorii de
întrerupere a fost găsit activ şi dacă întreruperea respectivă este validată atunci sistemul
de întreruperi va genera o instrucţiune LCALL ("Long CALL") ADR, unde ADR depinde
de tipul întreruperii, conform tab. 3.8.

Tip de întrerupere Adresă


IE0 0003H
TF0 000BH
IE1 0013H
TF1 001BH
RI + TI 0023H
Tab. 3.8 Adresele corespunzătoare întreruperilor la microcontrolerul 80C51

Instrucţiunea LCALL nu se va genera în una din următoarele situaţii:


1. o întrerupere de prioritate egală sau mai mare este deja în tratare;
2. ciclul curent de testare nu este ultimul ciclu al instrucţiunii curente sau
3. instrucţiunea curentă este RETI sau o instrucţiune ce scrie în registrele IE sau IP.
Condiţia 2. asigură luarea în considerare a unei cereri de întrerupere doar la sfirşitul unei
instrucţiuni iar condiţia 3. asigură luarea în considerare a unei cereri de întrerupere doar
după ce se execută încă o instrucţiune după RETI sau după cea care scrie în registrele IE
sau IP.
Ciclul de testare este repetat în fiecare ciclu maşină iar valorile testate sunt cele citite în
S5P2 a ciclului anterior. Dacă o întrerupere este activă dar nu a fost considerată datorită
uneia din condiţiile anterioare, ea nu este memorată. Ea va fi luată în considerare doar
dacă mai rămâne activă după îndepărtarea condiţiei de blocare. Fig. 3.19 prezintă timpul
de răspuns la o cerere de întrerupere.

C1 C2 C3 C4 C5
S5 S6
P2
.......... ... ... ... ...
  

 

Întreruperile Citirea Întrerupe- Rutina


sunt întreruperilor rile sunt LCALL de tratare
activate testate

Fig. 3.19 Tratarea întreruperilor la microcontrolerul 80C51

În ciclul C1 se fac citirile, în ciclul C2 se fac testările, în ciclurile C3 şi C4 se generează


instrucţiunea LCALL iar ciclul C5 corespunde primei instrucţiuni din rutina de tratare.
Dacă o întrerupere de prioritate mai mare decât cea tratată se activează înainte de S5P2 a
ciclului maşină C3 atunci în C4 va fi testată iar în C5 şi C6 se va genera instrucţiunea
LCALL pentru ea, fără a mai începe execuţia rutinei de tratare a întreruperii de prioritate
mai mică.
Din fig. 3.19 rezultă că timpul minim de răspuns din momentul activării unei cereri de
întrerupere şi până la tratarea ei este de 3 cicluri maşină. Valoarea maximă a acestui timp
depinde de condiţiile care împiedică generarea instrucţiunii LCALL. Dacă este îndeplinită
condiţia 1. atunci timpul depinde de durata rutinei de tratare în timpul căreia a apărut noua
cerere. Dacă este îndeplinită condiţia 2. atunci timpul suplimentar nu poate fi mai mare
decât 3 cicluri maşină deoarece cele mai lungi instrucţiuni (MUL şi DIV) au 4 cicluri
maşină. Dacă este îndeplinită condiţia 3 atunci timpul suplimentar nu poate fi mai mare
decât 5 cicluri maşină (1 eventual ciclu pentru încheierea instrucţiunii în curs şi 4 cicluri
în cazul cel mai defavorabil când instrucţiunea ce urmează este MUL sau DIV). Deci dacă
există o singură sursă de întrerupere atunci timpul de răspuns este între 3 şi 8 cicluri
maşină.
Instrucţiunea LCALL va depune conţinutul lui PC în stivă şi va încărca PC cu adresa de
salt. De asemenea, în unele cazuri, are loc ştergerea, prin hardware, a indicatorului ce
corespunde întreruperii tratate. Astfel sunt şterşi indicatorii TF0, TF1 şi IE0, IE1 dar
numai dacă întreruperea externă este activă pe front. Indicatorul ce corespunde
întreruperii seriale trebuie sa fie şters doar prin program.
Execuţia rutinei de tratare a cererii de întrerupere se încheie la întâlnirea instrucţiunii
RETI. Aceasta încarcă în PC adresa de revenire şi iniţializează sistemul de întreruperi.
Rutina se poate încheia şi cu instrucţiunea RET dar aceasta nu va iniţializa sistemul de
întreruperi.
Întreruperile externe pot fi programate, prin rangurile IT0, respectiv IT1 din registrul
TCON, să fie active pe nivel sau pe front. O tranziţie 1 -> 0 pe una din intrările /INT0 sau
/INT1 va poziţiona indicatorul IE0 sau IE1, dacă întreruperea este validată, dacă cererea
are o durată minimă de 12 perioade de tact pe nivel 1 şi 12 perioade de tact pe nivel 0.
Această condiţie rezultă din faptul că terminalele /INT0 şi /INT1 sunt citite doar o singură
dată în fiecare ciclu maşină.
Dacă cererea externă este activă pe nivel, ea trebuie să rămână activă până la începerea
execuţiei rutinei de tratare, după care trebuie dezactivată înainte de încheierea rutinei
pentru a evita o nouă tratare a ei.

Ca o aplicaţie a tratării întreruperilor se va prezenta modalitatea de execuţie a unui


program în mod pas cu pas. S-a arătat că o cerere de întrerupere nu va fi luată în
considerare dacă apare în timpul tratării unei întreruperi de aceeaşi prioritate şi nici dacă
apare în timpul instrucţiunii RETI, caz în care este necesară execuţia a încă unei
instrucţiuni. Aceasta înseamnă că dacă s-a intrat în rutina de tratare a cererii de
întrerupere, o nouă intrare în această rutină este posibilă doar dacă se execută o
instrucţiune din programul principal. Pe această trăsătură se bazează tehnica de realizare a
modului pas cu pas. Pentru aceasta se programează activarea unei întreruperi externe, de
exemplu /INT0, pin P3.2, pe nivel iar rutina de tratare va trebui să se încheie cu secvenţa:
JNB P3.2,$ - se aşteaptă până când /INT0 devine 1;
JB P3.2,$ - se aşteaptă până când /INT0 devine 0;
RETI - întoarcere în programul principal pentru execuţia a încă unei instrucţiuni.
Dacă /INT0 este în starea 0, CPU va intra în rutina de tratare a întreruperii externe 0 şi va
rămâne acolo până ce apare un impuls pe linia /INT0 (o trecere la 1 urmată de o nouă
trecere la 0). Apoi va executa RETI, se va întoarce în programul principal unde va mai
executa o instrucţiune şi va reintra în rutina de tratare după care totul se repetă.

3.1.3.6 Iniţializarea microcontrolerului

Microcontrolerul 80C51 este iniţializat prin aplicarea unui nivel 1 la intrarea RST, în timp
ce oscilatorul funcţionează şi menţinerea acestui nivel cel puţin 24 perioade de tact.
Semnalul extern RST este asincron în raport cu tactul microcontrolerului. El este testat în
faza S5P2 a fiecărui ciclu maşină. După ce microcontrolerul sesizează activarea lui RST,
terminalele îşi menţin activităţile timp de 19 perioade de tact, adică între 19 şi 31 perioade
de tact după ce s-a aplicat semnalul extern RST.
După dezactivarea lui RST, starea registrelor interne este prezentată în tab. 3.9.

Registru Conţinut
PC, DPTR 0000
ACC,B, PSW, TMOD, TCON, TH0, TL0, TH1, TL1, SCON 00
SP 07
P0 - P3 FFH(intrări)
SBUF nedeterminat
IP xxx00000B
IE 0xx00000B
PCON 0xxx0000B
Tab. 3.9 Conţinutul registrelor după iniţializarea microcontrolerului 80C51

Conţinutul memoriei RAM interne nu este afectat de RST. La cuplarea tensiunii de


alimentare, conţinutul memoriei RAM este nedeterminat.

3.1.3.7 Modurile de lucru cu consum redus

Microcontrolerul 80C51 are 2 moduri de lucru cu consum redus: modul Idle şi modul
Power - Down. Instalarea lor se face prin program, acţionând asupra a câte unui rang din
registrul PCON ("Power Control Register"), fig. 3.20.
7 6 5 4 3 2 1 0
SMOD - - - GF1 GF0 PD IDL
PCON.0: IDL: 1 în acest rang instalează modul Idle.
PCON.1: PD: 1 în acest rang instalează modul Power - Down.
PCON.2, 3: GF0, GF1: ranguri pentru uz general.
PCON.7: SMOD: utilizat la interfaţa serială.
Fig. 3.20 Structura registrului PCON al microcontrolerului 80C51
Modul Idle
Microcontrolerul intră în acest mod după activarea, de către o instrucţiune, a rangului
IDL. Oscilatorul, interfaţa serială, contoarele/ temporizatoarele şi sistemul de întreruperi
continuă să funcţioneze dar tactul nu mai ajunge la CPU. Întregul CPU îşi păstrează
starea. Terminalele de la porturi păstrează nivelul logic avut la instalarea modului Idle iar
ALE şi /PSEN vor avea nivel 1.
Ieşirea din modul Idle se poate face pe 2 căi. Una constă într-o întrerupere validată. Ea va
fi luată în considerare şi, după instrucţiunea RETI, microcontrolerul va executa
instrucţiunea ce urmează după cea care a instalat modul Idle. Rangurile GF0 şi GF1 pot fi
folosite pentru a indica dacă întreruperea a apărut în modul normal sau în modul Idle.
O altă cale constă în activarea liniei RST cel puţin 24 perioade de tact. Rangul IDL va fi
şters şi microcontrolerul va continua execuţia de la instrucţiunea următoare celeia care a
instalat modul Idle. Întrucât algoritmul intern de iniţializare durează aproximativ 3 cicluri
maşină, se recomandă inserarea de 3 instrucţiuni NOP după cea care a instalat modul Idle.

Modul Power - Down


Este instalat de o instrucţiune ce activează rangul PD. Oscilatorul se opreşte, ca urmare
starea întregului microcontroler rămâne nemodificată (microcontrolerul "îngheaţă").
Terminalele porturilor oglindesc starea rangurilor corespondente iar ALE şi /PSEN vor
avea nivel 0. Singura ieşire din acest mod este prin activarea intrării RST.
În acest mod Vcc poate fi redus la 2 V. Trebuie însă avut grijă ca reducerea să se facă după
ce microcontrolerul a intrat în modul Power - Down iar activarea lui RST care provoacă
ieşirea din modul Power - Down să se facă după ce Vcc a revenit la valoarea de lucru.

3.1.3.8 Porturile

Microcontrolerul 80C51 dispune de 4 porturi bidirectionale, pe 8 biţi, notate cu P0, P1, P2


şi P3. Fiecare port are un circuit de intrare, un registru intern notat tot cu P0, P1, P2
respectiv P3 şi un etaj de ieşire. Porturile sunt de uz general, fiecare rang poate fi
programat independent ca intrare sau ieşire şi, în plus, porturile P0, P2 şi P3 au şi
funcţiuni predeterminate.
Astfel în ciclurile în care se face acces la memoria externă, liniile portului P0 constituie o
magistrală multiplexată de adrese/ date, AD0 - 7, între jumătatea mai puţin semnificativă
din magistrala de adrese şi cea de date iar liniile portului P2 vor transfera jumătatea mai
semnificativă a magistralei de adrese. Atunci când se aduce un cod de instrucţiune din
memoria de program externă, liniile porturilor P0 şi P2 vor fi comandate de PC iar atunci
când se transferă o dată cu memoria de date externă liniile porturilor P0 şi P2 vor fi
comandate de registrul DPTR. Dacă adresa datei externe este doar pe 8 biţi, atunci adresa
se obţine pe liniile portului P0 care va fi comandat de registrul R0 sau R1.
Rangurile portului P3 au funcţiuni specifice individuale conform tab. 3.10.

Fig. 3.21 prezintă schema câte unui rang din fiecare port.
Fig. 3.21 Schema porturilor P0 - P3 ale microcontrolerului 80C51
VCC
Adrese / Date Control
Citire pFET
din registru
Magistală P0.X
internă D Q
P0.X Terminal
Scrie nFET
C /Q
în registru
Citire
terminal VCC

Citire SA
din registru
Magistală P1.X
internă D Q
P1.X Terminal
Scrie C /Q
în registru
Citire
terminal VCC
Adrese Control
Citire SA
din registru
Magistală P2.X
internă D Q
P2.X Terminal
Scrie C /Q
în registru
Citire
terminal
Funcţiune VCC
Citire
din registru specifică SA
de ieşire
Magistală P3.X
internă D Q
P3.X Terminal
Scrie C /Q
în registru
Citire
terminal Funcţiune specifică de intrare
Fiecare rang este alcătuit dintr-un bistabil de tip D în care se înscrie informaţia, la sosirea
comenzii de scriere şi al cărei conţinut poate fi citit prin intermediul unei porţi cu 3 stări.
Restul circuitelor sunt specifice fiecărui port.

Rang Funcţia specifică


P3.0 RxD: intrare serială
P3.1 TxD: ieşire serială
P3.2 /INT0: întrerupere externă 0
P3.3 /INT1: întrerupere externă 1
P3.4 T0: intrare de numărare pentru contorul 0
P3.5 T1: intrare de numărare pentru contorul 1
P3.6 /WR: semnal de comandă pentru scrierea în memoria de date externă
P3.7 /RD: semnal de comandă pentru citirea din memoria de date externă
Tab. 3.10 Funcţiunile specifice ale rangurilor portului P3 al microcontrolerului 80C51

Portul 0
Etajul de ieşire al portului 0 este alcătuit din 2 tranzistoare FET. Tranzistorul pFET va
lucra doar atunci când rangul respectiv emite 1 în timpul acceselor la memoria externă iar
în toate celelalte situaţii este blocat, ceea ce înseamnă că atunci când portul P0 este folosit
ca port de ieşire, liniile sale sunt cu drenă în gol.
În timpul acceselor la memoria externă, în registrul P0 se înscrie configuraţia FFH.
Pentru a folosi rangurile portului P0 ca intrări, este necesară înscrierea în prealabil în
rangurile corespunzătoare din registrul intern P0, a valorii 1. Aceasta va duce la blocarea
tranzistorului nFET şi, întrucât şi tranzistorul pFET este blocat, terminalul respectiv va fi
flotant şi poate fi comandat din exterior ca o intrare de mare impedanţă.

Portul 1
Spre deosebire de portul 0 care este bidirecţional, portul 1 este un port cvasi-bidirecţional.
Termenul cvasi-bidirecţional se referă la un port care prezintă pe fiecare rang câte o
rezistenţă la tensiunea de alimentare atunci când este comandat ca intrare. P1 este un port
de uz general, fără funcţii specifice.
Sarcina activă, SA, din etajul de ieşire asigură o funcţionare performantă a portului. Astfel
valoarea sa se modifică în funcţie de conţinutul rangului corespunzător. Fig. 3.22 prezintă
schema sarcinii active pentru microcontrolerul 80C51 (varianta CMOS) iar fig. 3.23
prezintă o schemă echivalentă în care rezistenţa R1 corespunde tranzistorului pFET1, R2
corespunde lui pFET2 şi R3 corespunde lui pFET3. Schema echivalentă din fig. 3.23a
corespunde rangului configurat ca ieşire, cu valoarea 1. Schema echivalentă din fig. 3.23b
corespunde rangului configurat ca ieşire, cu valoarea 0. Schema echivalentă din fig. 3.23c
corespunde tranziţiei 0 -> 1 a ieşirii în care se activează un circuit de accelerare. Acesta
este tranzistorul pFET1 care se deschide timp de 2 perioade de tact după tranziţia 0 -> 1
de la ieşirea rangului din registrul intern şi va provoca generarea unui curent suplimentar
care va determina creşterea vitezei de comutare 0 -> 1 la ieşirea corespunzătoare.
Pentru utilizarea portului ca intrare este necesară înscrierea în prealabil a valorilor logice
1 în rangurile corespunzătoare. Dacă la intrare se aduce nivel 0 atunci rezistenţa R2 se
deconectează de la Vcc iar rezistenţa internă va fi dată doar de R3, cu valoare mare, de
100 k, ceea ce va fixa un curent de intrare foarte mic. Dacă la intrare se aduce nivel 1
VCC VCC VCC
Întîrziere
2 perioade de tact

pFET1 pFET2 pFET3

PX.Y

Terminal
Ieşirea nFET
rangului

Citeşte terminalul

Fig. 3.22 Schema sarcinii active pentru microcontrolerul 80C51


Fig. 3.23 Schema echivalentă a sarcinii active din porturile microcontrolerului 80C51
VCC R1=500 VCC R1=500
R2=10k R2=10k
R3=100k R3=100k
IOH

IOL

a. b.
VCC R1=500
R2=10k
R3=100k

c.

atunci rezistenţa R2 se reconectează la Vcc iar rezistenţa internă va fi fixată de valoarea


de 10 k a acesteia.

Portul 2
Este de asemenea un port cvasi-bidirecţional. Sarcina activă are aceeaşi schemă ca la
portul 1. În timpul acceselor la memoria externă, va transfera jumătatea mai semnificativă
a magistralei de adrese. În acest timp, conţinutul registrului intern P2 nu este afectat, ceea
ce înseamnă că dacă după un acces la memoria externă nu se execută un alt acces la
memoria externă, pe terminalele portului P2 va apare conţinutul registrului intern P2.
Dacă accesul la memoria externă de date se face doar pe 8 biţi, pe terminalele portului P2
va apare conţinutul registrului intern P2. În acest fel se poate realiza paginarea memoriei
de date externe.
În afara acceselor la memoria externă, portul P2 poate fi folosit ca port de uz general.

Portul P3
Este de asemenea un port cvasi-bidirecţional. Este port de uz general dar are şi funcţiuni
specifice. Atunci când funcţionează ca port de uz general are aceleaşi caracteristici ca
portul P1. Pentru a utiliza funcţiunile sale specifice, este necesară programarea în
prealabil a valorii logice 1 în rangurile corespunzătoare din registrul intern P3. În acest fel
poarta ŞI-NU, fig. 3.21, va fi comandată de cealaltă intrare, corespunzătoare funcţiunii
specifice. În cazul unei funcţiuni de ieşire (TxD, /RD, /WR), terminalul portului este
comandat de linia "Funcţiune specifică de ieşire" iar în cazul unei funcţiuni de intrare
(RxD, /INT0, /INT1, T0, T1), ieşirea porţii conectată la terminal, notată cu "Funcţiune
specifică de intrare", este conectată în interiorul microcontrolerului în conformitate cu
funcţiunea specifică realizată. În cazul rangurilor care sunt intrări este necesară blocarea
tranzistorului nFET ceea ce se realizează înscriind în prealabil nivelul logic 1 în rangul
corespunzător din registrul intern.

Scrierea într-un port se realizează în felul următor: noua valoare ajunge la registrul intern
corespunzător în S6P2 a ciclului final al instrucţiunii care provoacă scrierea. Întrucât
înscrierea în registru se face doar într-o fază P1, noile valori vor apare la ieşirile portului
doar în S1P1 a ciclului maşină următor.
Ieşirile portului P0 suportă o încărcare de 8 sarcini TTL LS iar ieşirile porturilor P1, P2 şi
P3 suportă o încărcare de câte 4 sarcini TTL LS.
La iniţializare toate porturile sunt configurate ca intrări, cu valorile FFH înscrise în
registrele interne.
După cum se observă din fig. 3.21, la fiecare port există facilitatea de a citi atât terminalul
cât şi conţinutul rangului corespunzător din registrul intern. Instrucţiunile care citesc
conţinutul rangului şi nu terminalul sunt cele care citesc o valoare, eventual o modifică şi
apoi o rescriu în registrul intern. Ele sunt denumite instrucţiuni cu "citire - modificare -
scriere". În continuare sunt prezentate aceste instrucţiuni, operandul destinaţie fiind un
port sau un rang dintr-un port:
ANL : ŞI logic, de exexmplu ANL P1, A,
ORL : SAU logic,
XRL : SAU - EXCLUSIV logic,
JBC : salt dacă rangul specificat este 1 şi apoi anulare rang,
CPL : complementare bit, de exemplu CPL P3.3,
INC : incrementare,
DEC : decrementare,
DJNZ : decrementare şi salt dacă rezultatul nu este nul, de exemplu DJNZ P1, ETICH,
MOV PX.Y,C : mută bitul Carry în rangul Y din portul X,
CLR PX.Y : şterge rangul Y din portul X,
SET PX.Y : setează rangul Y din portul X.
Facilitatea de a citi conţinutul rangului din registrul intern în locul terminalului permite
evitarea obţinerii de valori false datorate unei conectări greşite a terminalului. De
exemplu, dacă s-ar putea citi doar terminalul atunci s-ar obţine o valoare falsă în
următoarea situaţie: terminalul se conectează în baza unui tranzistor npn, cu emitorul
legat la masă şi comandă funcţionarea acestuia; înscrierea unei valori 1 în rangul din
registrul intern va provoca saturarea tranzistorului ceea ce înseamnă că nivelul de tensiune
de pe terminal va fi fixat de tensiunea bază - emitor a tranzistorului care, însă, corespunde
unui nivel logic 0.

3.1.3.9 Ciclurile maşină

Execuţia unei instrucţiuni se desfăşoară în cadrul unor cicluri maşină. Un ciclu maşină
este divizat în 6 stări, notate cu S1 - S6, o stare fiind alcătuită din 2 faze, notate cu P1 şi
P2. Deci un ciclu maşină începe în starea 1, faza 1, notată cu S1P1 şi se încheie în starea
6, faza 2, notată cu S6P2. Operaţiile aritmetice şi logice se desfăşoară în timpul fazei 1 iar
transferurile între registre se desfăşoară în faza a 2-a.
Considerând un tact cu frecvenţa de 12 MHz, rezultă că durata unui ciclu maşină este de 1
ms. Tactul se obţine fie prin conectarea externă a unui cuarţ, între terminalele XTAL1 şi
XTAL2, fig. 3.24a, fie prin comanda din exterior cu semnal dreptunghiular, fig. 3.24b şi c.
Fig. 3.24 Generarea tactului la microcontrolerul 80C51

Execuţia unei instrucţiuni depinde de tipul acesteia. Astfel există mai multe cazuri:

22-35 pF
XTAL2 XTAL2 XTAL2

XTAL1 XTAL1 XTAL1


22-35 pF Semnal Semnal
extern extern

a. b. c.
1. instrucţiune pe 1 octet şi 1 ciclu:
Execuţia instrucţiunii începe în S1 când se aduce codul şi se memorează în registrul IR.
Numărătorul de program, PC, este incrementat iar în S4 se mai execută o aducere de cod
care, însă, este ignorat iar PC nu mai este incrementat.
2. instrucţiune pe 2 octeţi si 1 ciclu:
În S1 se aduce codul instrucţiunii, PC este incrementat iar în S4 se mai citeşte un octet şi
PC este din nou incrementat.
3. instrucţiune pe 1 octet şi 2 cicluri care nu face referire la RAM-ul extern:
În S1 al primului ciclu se aduce codul instrucţiunii, PC este incrementat iar în S4 al
aceluiaşi ciclu, S1 şi S4 ale ciclului următor se citesc octeţi care nu sunt luaţi în
considerare de CPU iar PC nu se modifică.
4. instrucţiune pe 1 octet şi 2 cicluri care se referă la RAM-ul extern:
În S1 al primului ciclu se aduce codul instrucţiunii, PC este incrementat, în S4 se aduce
un nou cod dar care nu este considerat de CPU, PC nu este incrementat iar în ciclul
următor nu se mai execută aduceri de cod ci accesul la RAM-ul extern.
Cele mai multe instrucţiuni se execută în 1 sau 2 cicluri maşină. Doar instrucţiunile MUL
şi DIV necesită 4 cicluri maşină.

Semnalele microcontrolerului implicate în transferurile din cadrul ciclurilor maşină sunt


următoarele:
ALE: ieşire a microcontrolerului care se foloseşte la demultiplexarea magistralei de
adrese/ date; semnalul va încărca adresa într-un registru extern (este garantată stabilitatea
adresei pe frontul său posterior deci încărcarea trebuie să se facă de către acest front); se
activează de 2 ori într-un ciclu, cu excepţia unui ciclu de acces la RAM-ul extern când
lipseşte prima activare; deci dacă nu se execută accese la RAM-ul extern atunci ALE
poate fi folosit ca semnal cu frecvenţa egală cu 1/ 6 din frecvenţa semnalului de tact.
/PSEN: este semnalul de comandă pentru citirile de cod din memoria de program externă;
se activează de 2 ori într-un ciclu, cu excepţia cazului când ciclul se referă la RAM-ul
extern când nu se activează; de asemenea nu se activează atunci când microcontrolerul
execută programe din memoria de program internă.
/EA: intrare prin care i se comunică microcontrolerului unde se găseşte programul; dacă
este 1 atunci microcontrolerul va executa din memoria de program internă (până când PC
ajunge la valoarea 0FFFH, în continuare execuţia realizându-se din memoria de program
externă); dacă este 0 atunci execuţia va avea loc din memoria de program externă.
/RD, /WR: sunt ieşiri de comandă pentru citire, respectiv scriere din/ în memoria de date
externă.

Fig. 3.25 prezintă ciclurile maşină ale microcontrolerului 80C51. Se observă că într-un
ciclu de aducere cod de instrucţiune pe liniile porturilor P0 şi P2 apare conţinutul
numărătorului de program, PC. Într-un ciclu în care se face acces la memoria de date
externă pe liniile portului P0 apare conţinutul registrului DPL sau Ri, i = 0, 1, iar pe liniile
portului P2 apare conţinutul registrului DPH dacă adresa este pe 16 biţi sau conţinutul
registrului intern P2 dacă adresa este pe 8 biţi.

3.1.3.10 Comanda memoriei externe

Din ciclurile maşină prezentate în paragraful anterior se observă că microcontrolerul


activează semnale diferite funcţie de tipul memoriei externe implicate în transfer. Astfel
dacă se citeşte din memoria externă de program se activează semnalul de comandă /PSEN
iar dacă este implicată memoria externă de date se activează semnalele /RD sau /WR. Pe
aceasta se bazează caracteristica microcontrolerului de a putea comanda 64 Ko memorie
de program şi 64 Ko memorie de date deşi dispune doar de 16 linii de adresă: memoria de
program va fi comandată cu semnalul /PSEN iar memoria de date va fi comandată cu
semnalele /RD şi /WR.
În timpul transferurilor cu memoria externă, liniile portului P2 vor constitui jumătatea
superioară a magistralei de adrese iar liniile portului P0 vor constitui o magistrală
multiplexată de adrese/ date. Pentru demultiplexarea ei este necesară memorarea
Fig. 3.25 Ciclurile maşină ale microcontrolerului 80C51
S1 S2 S3 S4 S5 S6 S1 S2
p1 p2
CLK
ALE
/PSEN
COD PCL COD PCL COD PCL
P0 IN OUT IN OUT IN OUT

PCH PCH PCH


P2 OUT OUT OUT
Ciclu de aducere cod de instrucţie

S4 S5 S6 S1 S2 S3 S4 S5 S6
CLK
ALE
/PSEN
/RD
COD DPL sau RI DATA PCL
P0 IN OUT IN OUT

PCH DPH sau P2 PCH


P2 OUT OUT OUT

Ciclu de citire din memoria de date externă


S4 S5 S6 S1 S2 S3 S4 S5 S6
CLK
ALE
/PSEN
/WR
COD DPL sau RI DATA PCL
P0 IN OUT IN OUT

PCH DPH sau P2 PCH


P2 OUT OUT OUT
Ciclu de scriere în memoria de date externă

S4 S5 S6 S1 S2 S3 S4 S5 S6
CLK
Citire P0, P2, P0, P2,
P1 P3 P1 P3
intrări
Ieşiri Data veche Data nouă
Tact serial
(mod 0) Citire
Citire
RxD PxD
Ciclu de transfer de porturile
informaţiei de adresă într-un registru extern, la comanda frontului posterior al semnalului
ALE.
Fig. 3.26 prezintă modalităţile de conectarea a memoriei externe de program şi de date,
fiecare de câte 64 Ko.

P0.0-7 D0-7

/EA
R A0-7
E Memoria
8 de
0 G
program
C externă
5 ALE STB
(64 ko)
1
P2.0-7 A8-15

/PSEN /OE
/CE

/RD
/WR D0-7

A0-7 Memoria
de
date
externă
A8-15 (64 ko)

/CS
/WE
/OE

Fig. 3.26 Conectarea memoriei externe de program şi de date la microcontrolerul 80C51

Atunci când memoria externă implicată în transfer este cea de program, adresa ce apare pe
liniile porturilor P0 şi P2 este generată de numărătorul de program, PC.
Accesul la memoria externă de date se face prin intermediul registrului DPTR, de către
instrucţiunile MOVX @DPTR,A şi MOVX A,@DPTR. Prima instrucţiune transferă
conţinutul acumulatorului în memorie la adresa indicată de DPTR iar a doua instrucţiune
transferă conţinutul locaţiei cu adresa indicată de DPTR în A. În timpul transferurilor cu
memoria externă de date, adresa ce apare pe liniile porturilor P0 şi P2 este generată de
DPTR.

Accesul la memoria externă de date se poate face şi prin intermediul registrelor R0 sau
R1, cu instrucţiunea: MOVX @Ri,A sau MOVX A,@Ri. Conţinutul registrelor R0 sau R1
va fi adresa ce apare pe liniile portului P0. Această adresă este doar pe 8 biţi şi va permite
accesul într-o pagină de 256 octeţi. Conţinutul registrului P2 va apare pe liniile portului
P2 şi poate fi folosit pentru paginare, asigurând plasarea paginii de 256 octeţi în spaţiul de
adresare de 64 Ko al microcontrolerului.
În cazul aplicaţiilor ce necesită mai puţină memorie de program şi de date decât 64 Ko, nu
mai este necesar ca cele 2 blocuri de memorie să se suprapună în spaţiul de adresare al
microcontrolerului iar selecţia lor se va face utilizând şi linii mai semnificative din
magistrala de adrese.

Dacă se doreşte rularea de programe din memoria externă de date atunci este necesară
suprapunerea unui spatiu de memorie externă de program cu un spaţiu de memorie
externă de date ceea ce se poate realiza cu o combinaţie a semnalelor /PSEN şi /RD, fig.
3.27. Întrucât semnalul /PSEN se activează mai repede decât semnalul /RD este necesar
ca memoria externă de date din care se execută programe, să fie suficient de rapidă pentru
a răspunde cerinţelor semnalului /PSEN. Memoria externă de date din care se doreşte
execuţia de programe trebuie să fie plasată în spaţiul de adresare al microcontrolerului,
într-o zonă diferită de cea care corespunde atât memoriei externe de program cât şi
memoriei externe de date.
Dacă întregul program ce se execută se obţine din memoria externă, atunci intrarea /EA
trebuie să fie conectată la 0.

P0.0-7 D0-7

R
E A0-7
8 G
0
C ALE STB Memoria
5 externă
1

P2.0-7 A8-15

/ PSEN
/RD /CS
/WR /OE
/WE

Fig. 3.27 Conectarea memoriei de date externe


din care se poate executa program la microcontrolerul 80C51

S-ar putea să vă placă și