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. 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ă 8 0 C 5 1 (11) P3.0 / RXD (13 P3.1 / TXD (14) P3.2 / INT0 (15) P3.4 / INT1 (16) P3.5 / T0 (17) P3.6 / T1 (18) P3.7 / /WR (19) P3.8 / /RD (21) XTAL1 (20) XTAL2 (44) V CC (22) V SS 10 11 12 13 14 15 16 17 19 18 40 20 39-32 1-8 P0.0-7 / AD0-7 (43-36) P1.0-7 (2-9) P2.0-7 / A8-15 (24-31) ALE (33) /PSEN (32) /EA (35) RST (10) 24-31 30 29 31 9

Intel 8051

Embed Size (px)

Citation preview

Page 1: Intel 8051

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.

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ă

8

0

C

5

1

(11) P3.0 / RXD

(13 P3.1 / TXD

(14) P3.2 / INT0

(15) P3.4 / INT1

(16) P3.5 / T0

(17) P3.6 / T1

(18) P3.7 / /WR

(19) P3.8 / /RD

(21) XTAL1

(20) XTAL2

(44) VCC

(22) VSS

10

11

12

13

14

15

16

17

19

18

40

20

39-32

1-8

P0.0-7 / AD0-7 (43-36)

P1.0-7 (2-9)

P2.0-7 / A8-15 (24-31)

ALE (33)

/PSEN (32)

/EA (35)

RST (10)

24-31

30

29

31

9

Page 2: Intel 8051

î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.

Page 3: Intel 8051

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

Sistem de

întreruperi

Întreruperi externe

CPU

Generator

de tact

Logică decontrol a

magistraleiPorturi de I/E

Port

serial

Contor

0

Contor

1

1280

RAM

4 ko

ROM

Registre cufuncţiunispeciale

P0 P1 P2 P3 TxD RxD T0 T1

Page 4: Intel 8051

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

30

Data RAM

2F

20

Bit_RAM

1F

18 Bloc 3

17

10 Bloc 2

0F

08 Bloc 1

07

00 Bloc 0

Page 5: Intel 8051

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

b7 b6 b5 b4 b3 b2 b1 b0

Adresă de

registru

B

ACC

PSW

IP

P3

IE

P2

SBUF

SCON

P1

TH1

TH0

TL1

TL0

TMOD

TCON

PCON

DPH

DPL

F7

E7

D7

BF

B7

AF

A7

9F

97

8F

F6

E6

D6

BE

B6

AE

A6

9E

96

8E

F5

E5

D5

BD

B5

AD

A5

9D

95

8D

F4

E4

D4

BC

B4

AC

A4

9C

94

8C

F3

E3

D3

BB

B3

AB

A3

9B

93

8B

F2

E2

D2

BA

B2

AA

A2

9A

92

8A

F1

E1

D1

B9

B1

A9

A1

99

91

89

F0

E0

D0

B8

B0

A8

A0

98

90

88

F0H

E0H

D0H

B8H

B0H

A8H

A0H

99H

98H

90H

8DH

8CH

8BH

8AH

89H

88H

87H

83H

82H

Page 6: Intel 8051

SP

P0

87

86

85

84

83

82

81

80

81H

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

0 1

1 0

1 1

Blocul 0 (00H - 07H)

Blocul 1 (08H - 0FH)

Blocul 2 (10H - 17H)

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.

Page 7: Intel 8051

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 1

1 0

1 1

0

1

2

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.

Page 8: Intel 8051

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

pentru

TIMER 0

sau

TIMER1

T0 sau T1 Detector

C / /T

Page 9: Intel 8051

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

CLOCK TF0TL05 biţi

TH08 biţi

CLOCK TF1TL15 biţi

TH18 biţi

Tact serial

Page 10: Intel 8051

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

ş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.

CLOCK TF0TL0

8 biţi

TH0

8 biţi

CLOCK TF1TL1

8 biţi

TH1

8 biţi

Tact serial

Page 11: Intel 8051

Fig. 3.9 TIMER 0 şi 1 în modul 2 la microcontrolerul 80C51

Fig. 3.10 TIMER 0 în modul 3 la microcontrolerul 80C51

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.

CLOCK TL0 TF0

TH0

CLOCK TL1 TF1

TH1 Tact serial

TR1fOSC / 12

TH0 TF1

TL0 TF0CLOCK

Page 12: Intel 8051

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

Logică

control

transmisie

SBUF (T)

SBUF (R)

Registru

deplasare

Logică

control

recepţie

MUX

SCON SMOD

fTIM

fOSC / 2

Întrerupere

Magistrală

internă

MUX

TxD

RxD

Page 13: Intel 8051

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 1

1 0

1 1

0

1

2

3

I/ E extins

UART cu 10 biţi

UART cu 11 biţi

UART cu 11 biţi

fOSC/ 12

Variabilă

fOSC/ 32 sau fOSC/ 64

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

Page 14: Intel 8051

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

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

CLK

TRANSMISIE

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

RxD

(DATE)

TxD

(Tact)

RECEPŢIE

TxD

(Tact)

RxD

(DATE)

Page 15: Intel 8051

Fig. 3.14 Schema bloc a interfeţei seriale în modul 1 la microcontrolerul 80C51

Magistrala internă

SBUF (T)/S

D Q

/R

TB8

Scrie înSBUF

Start Deplasare

Tact TI

Logică controltransmisie Date

Transfer

TxD

Numărător/ 16

Numărător/ 16

/2SMOD== 0

fTIM

Tact RITransfer

Start Deplasare

789

Logică controlrecepţie

Întreruperede la

interfaţaserie

Detectorbit

7 8 9

Detectortranziţie1 0

Registru deplasarerecepţie

RxD

SBUF (R)

CiteşteSBUF

Magistrala internă

SMOD== 1

Page 16: Intel 8051

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.

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

TRANSMISIE

Tact

Scrie înSBUF

/Transfer

Date

Deplasare

D0 D1 D2 D3 D4 D5 D6 D7 TB8TxDSTART

STOP

TI

RECEPŢIE

Tact

RxD D0 D1 D2 D3 D4 D5 D6 D7 RB8START

STOP

7, 8, 9

Deplasare

RI

Page 17: Intel 8051

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.

Page 18: Intel 8051

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

[MHz]

SMOD TIMER 1

C//T Mod Const. de preâncărcare

Mod O:max. 1,67 Mbiţi/s

Mod 2:max. 625 Kbiţi/s

Mod1,3:max.104,2 Kbiţi/s

19,2 Kbiţi/s

9,6 Kbiţi/s

4,8 Kbiţi/s

2,4 Kbiţi/s

1,2 Kbiţi/s

110 biţi/s

110 biţi/s

20

20

20

11,059

11,059

11,059

11,059

11,059

12

6

x

1

1

1

0

0

0

0

0

0

x x x

x x x

0 2 FFH

0 2 FDH

0 2 FDH

0 2 FAH

0 2 F4H

0 2 E8H

0 1 D4H

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.

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

TxD

80C51MASTER

RxD

80C51SLAVE

RxD

80C51SLAVE

RxD

80C51SLAVE

. . .

. . .

Page 19: Intel 8051

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.

Page 20: Intel 8051

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

TF0

IE1

TF1

RI + TI

0003H

000BH

0013H

001BH

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

P2 S6

.......... ... ... ... ...

Întreruperile

sunt

activate

Citirea

întreruperilor

Întrerupe-

rile sunt

testate

LCALL

Rutina

de tratare

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.

Page 21: Intel 8051

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ă

Page 22: Intel 8051

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

ACC,B, PSW, TMOD, TCON, TH0, TL0, TH1, TL1, SCON

SP

P0 - P3

SBUF

IP

IE

PCON

0000

00

07

FFH(intrări)

nedeterminat

xxx00000B

0xx00000B

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ă

Page 23: Intel 8051

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.

Page 24: Intel 8051

Fig. 3.21 Schema porturilor P0 - P3 ale microcontrolerului 80C51

D QP0.X

C /Q

Magistalăinternă

Scrieîn registru

Citiredin registru

Adrese / Date ControlpFET

nFET

P0.X

Terminal

Citireterminal

D QP1.X

C /Q

Magistalăinternă

Scrieîn registru

Citiredin registru

P1.X

Terminal

Citireterminal

D QP2.X

C /Q

Magistalăinternă

Scrieîn registru

Citiredin registru

Adrese Control

P2.X

Terminal

Citireterminal

D QP3.X

C /Q

Magistalăinternă

Scrieîn registru

Citiredin registru

P3.X

Terminal

Citireterminal

VCC

SA

Funcţiunespecificăde ieşire

Funcţiune specifică de intrare

VCC

SA

VCC

SA

VCC

Page 25: Intel 8051

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

P3.1

P3.2

P3.3

P3.4

P3.5

P3.6

P3.7

RxD: intrare serială

TxD: ieşire serială

/INT0: întrerupere externă 0

/INT1: întrerupere externă 1

T0: intrare de numărare pentru contorul 0

T1: intrare de numărare pentru contorul 1

/WR: semnal de comandă pentru scrierea în memoria de date externă

/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

Page 26: Intel 8051

Fig. 3.22 Schema sarcinii active pentru microcontrolerul 80C51

Fig. 3.23 Schema echivalentă a sarcinii active din porturile microcontrolerului 80C51

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

Întîrziere

2 perioade de tact

Ieşirea

rangului

VCC VCC VCC

pFET1 pFET2 pFET3

PX.Y

nFET

Terminal

Citeşte terminalul

VCCR1=500

R2=10k

R3=100k

IOH

VCCR1=500

R2=10k

R3=100k

IOL

VCCR1=500

R2=10k

R3=100k

a. b.a.

c.

Page 27: Intel 8051

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

Page 28: Intel 8051

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:

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.

22-35 pF

22-35 pF

XTAL2

XTAL1

a.

XTAL2

XTAL1

b.

XTAL2

XTAL1

c.

Semnalextern

Semnalextern

Page 29: Intel 8051

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

Page 30: Intel 8051

Fig. 3.25 Ciclurile maşină ale microcontrolerului 80C51

P2,

P3

S3

P0,

P1

CLK

S4 S5 S6 S1 S2 S4 S5 S6

Citireintrări

P0,

P1

P2,

P3

Data veche Data nouăIeşiri

Tact serial(mod 0) Citire

PxDCitireRxD

Ciclu de transfer de porturile

CLK

p1 p2

ALE

S1 S2 S3 S4 S5 S6 S1 S2

/PSEN

P0

P2

Ciclu de aducere cod de instrucţie

CLK

ALE

S4 S5 S6 S1 S2 S3 S4 S5

/PSEN

P0

P2

Ciclu de scriere în memoria de date externă

S6

/WR

S4 S5 S6 S1 S2 S3 S4 S5 S6

CLK

ALE

/PSEN

P0

P2

Ciclu de citire din memoria de date externă

/RD PCL

OUT

DATA

IN

DPL sau RI

OUT

COD

IN

COD

IN

PCL

OUT

PCL

OUT DATA

IN

COD

IN

COD

IN

PCL

OUT

COD

IN

PCL

OUT

DPL sau RI

OUT

PCH

OUT

PCH

OUTPCH

OUT

PCH

OUT

PCH

OUT

DPH sau P2

OUT

PCH

OUTPCH

OUT

DPH sau P2

OUT

Page 31: Intel 8051

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.

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

P0.0-7

/EA

ALE

P2.0-7

/PSEN

/RD/WR

80C51

D0-7

A0-7

A8-15

/OE /CE

Memoriade

programexternă(64 ko)

REG

STB

D0-7

A0-7

A8-15

/CS /WE /OE

Memoriade

dateexternă(64 ko)

Page 32: Intel 8051

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.

Fig. 3.27 Conectarea memoriei de date externe

din care se poate executa program la microcontrolerul 80C51

P0.0-7

ALE

P2.0-7

/ PSEN

/RD

/WR

D0-7

A0-7

A8-15

/CS

/OE

/WE

R

E

G

STB Memoria

externă

8

0

C

5

1