Sunteți pe pagina 1din 28

HTTP://WWW.VESAVLAD.CO.

CC

Microcontrolerul 80C51
Informatii generale
Vesa Vlad

80C51 este un microcontroler vechi dar foarte răspîndit. Este necesară cunoaşterea sa
întrucît el a pus bazele unei familii de microcontrolere în continuă dezvoltare. Există multe
microcontrolere moderne, performante, realizate de diferite firme dar care păstrează
nucleul lui 80C51 şi utilizează acelaşi set de instrucţiuni. În gama microcontrolerelor pe 8
biţi, familia bazată pe 80C51 ocupă un loc central, extins şi în continuă expansiune.
Microcontrolerul 80C51

1. Caracteristici

80C51 este un microcontroler vechi dar foarte răspîndit. Este necesară cunoaşterea sa
întrucît el a pus bazele unei familii de microcontrolere în continuă dezvoltare. Există multe
microcontrolere moderne, performante, realizate de diferite firme dar care păstrează nucleul
lui 80C51 şi utilizează acelaşi set de instrucţiuni. În gama microcontrolerelor pe 8 biţi,
familia bazată pe 80C51 ocupă un loc central, extins şi în continuă expansiune.
Principalele caracteristici ale acestui microcontroler sunt:
- este un microcontroler pe 8 biţi,
- este realizat în tehnologie CMOS,
- include 4 Ko memorie ROM şi 128 octeţi memorie RAM,
- include procesor boolean,
- 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,
- include un port serial UART full duplex,
- set de instrucţiuni orientat pe aplicaţii în timp real, instrucţiuni simple şi rapide,
- 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.

2. Structura internă

Fig. 1.1 prezintă structura internă a microcontrolerului 80C51. Resursele sale


hardware sunt:
- unitate centrală care conţine unitatea aritmetică şi logică şi procesorul boolean,
- generator intern de tact,
- memorie internă de program de 4 Ko, de tip ROM,
- memorie internă RAM de 128 octeţi, aici fiind incluse şi registrele cu funcţiuni speciale,
SFR,
- 4 porturi de intrare/ ieşire cu multiple roluri,
- interfaţă serială UART, full duplex,
- 2 contoare/ temporizatoare independente,
- sistem de întreruperi.
Diferenţele între membri familiei de microcontrolere bazate pe 80C51 apar la nivelul
structurii interne şi a vitezei de lucru, adică a frecvenţei tactului acceptat la intrările
oscilatorului intern. Toţi membri familiei includ blocurile de mai sus şi sunt păstrate toate
caracteristicile acestora, de la organizare pînă la adrese, dar apar resurse suplimentare: mai
multă memorie internă care poate fi şi programabilă, mai multe registre interne, mai multe
contoare/ temporizatoare, mai multe porturi de intrare/ ieşire, noi blocuri ca generator de
ieşiri cu durate programabile, convertor analog/ digital, interfeţe CAN şi I2C etc.

1
Întreruperi externe

Sistem de 4 ko 1280 Registre cu


întreruperi ROM RAM funcţiuni
speciale

CPU

Generator Logică de Port Contor Contor


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

P0 P1 P2 P3 TxD RxD T0 T1
Fig. 1.1 Structura microcontrolerului 80C51

3. Configuraţia terminalelor

Fig. 1.2 prezintă configuraţia terminalelor microcontrolerului 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. 1.2 Configuraţia terminalelor microcontrolerului 80C51

2
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; nu cere rezistenţe externe
la Vcc decît atunci cînd se face verificarea programului înscris (doar pentru
microcontrolerele care au memorie internă de program de tip EPROM);

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, în prelabil, 1 în rangurile respective
.
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/ PROG (“Address Latch Enable/ Program Pulse”): 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; este şi terminal pentru programarea memoriei interne de tip
EPROM (acolo unde există).

/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/ Vpp (“External Address/ Programming Voltag”): 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; microcontrolele din familie care nu au memorie de program internă, de exemplu
80C31, trebuie să aibă acest terminal legat la 0.

3
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ă.

4. Organizarea memoriei

Microcontrolerul 80C51 dispune doar de 16 linii de adrese şi totuşi are un spaţiu de


memorie de 128 Ko. Explicaţia constă în aceea că el distinge între spaţiul de memorie de
program şi spaţiul de memorie de date. Ambele au cîte 64 Ko, deci utilizează toate liniile de
adrese, dar sunt validate de semnale de comandă diferite: /PSEN pentru memoria de program
şi /RD, /WR pentru memoria de date.
Primii 4 Ko din spaţiul de memorie de program sunt interni la circuitul 80C51.
Accesul la ei este realizat doar dacă terminalul /EA = 1 şi, în aceste cicluri, semnalul /PSEN
nu este activat. Dacă terminalul /EA = 0 sau dacă accesul se face la o locaţie cu adresa peste
0FFFH, va fi adresată memoria externă de program şi terminalul /PSEN se va activa de 2 ori/
ciclu.
Memoria de program conţine cîteva locaţii cu funcţiuni predeterminate. Astfel după
dezactivarea semnalului de iniţializare RST, microcontrolerul va începe cu aducere de cod de
la locaţia 0000H. Tot aici se află şi locaţiile la care este realizat accesul în urma acceptării
unei întreruperi şi anume:
0003H pentru întreruperea externă 0,
000BH pentru întreruperea provocată de intrarea externă pentru contorul 0,
0013H pentru întreruperea externă 1,
001BH pentru întreruperea provocată de intrarea externă pentru contorul 1,
0023H pentru întreruperea provocată de interfaţa serială.

Memoria de date este, de asemenea, internă şi externă. 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. 1.3
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

4
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 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ă.

Memoria internă RAM poate fi adresată prin adresare directă sau indirectă. La
adresarea directă poate fi folosită orice combinaţie în domeniul 00 – 7FH iar la adresarea
indirectă este folosit registrul R0 sau R1 care vor conţine adresa locaţiei accesate.

7FH

Data RAM

30H
2FH
Bit RAM
20H
18H Bloc 3 1FH
10H Bloc 2 17H
08H Bloc 1 0FH
00H Bloc 0 07H

Fig. 1.3 Organizarea memoriei RAM interne la microcontrolerul 80C51

5
Memoria de date externă poate fi accesată doar prin intermediul instrucţiunii MOVX
care foloseşte adresare indirectă. Se pot folosi adrese pe 16 biţi şi atunci va fi folosit registrul
DPTR pentru a genera adresa dar pot fi folosite şi adrese pe 8 biţi şi atunci va fi folosit
registrul R0 sau R1 pentru a genera adresa. Cel de-al doilea caz este util atunci cînd memoria
externă de date este puţină şi poate fi gestionată ca pagini de 256 octeţi. În ciclul extern,pe
liniile portului 0 va apare adresa în cadrul paginii de 256 octeţi şi o parte din liniile portului 2
vor fi folosite pentru a selecta pagina din memoria externă de date. Beneficiul este dublu:
accesul extern este mai rapid şi poate fi realizat mai rapid de instrucţiuni pe 8 biţi şi rămîn
libere linii ale portului 2 care pot fi folosite în alte scopuri.
Conectarea memoriei de date externă va fi descrisă după prezentarea ciclurilor
maşină.

5. 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. Considerînd un tact cu frecvenţa de 12 MHz, rezultă că durata unui
ciclu maşină este de 1 μs. Tactul se obţine fie prin conectarea externă a unui cuarţ, între
terminalele XTAL1 şi XTAL2, fig. 1.4a, fie prin comanda din exterior cu semnal
dreptunghiular, fig. 1.4b şi c.

22-35 pF
XTAL2 XTAL2 XTAL2

XTAL1 XTAL1 XTAL1


22-35 pF Semnal Semnal
extern extern

a. b. c.
Fig. 1.4 Conectarea tactului la microcontrolerul 80C51

Majoritatea instrucţiunilor se execută în un ciclu maşină, cîteva în 2 cicluri maşină şi


doar două, MUL şi DIV, se execută în 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

6
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ă.

6. Comanda memoriei externe

Din descrierea semnificaţiei terminalelor şi din ciclurile maşină se observă că


microcontrolerul activează semnale diferite în 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
informaţiei de adresă într-un registru extern, la comanda frontului posterior al semnalului
ALE.
Fig. 1.5 prezintă modalităţile de conectarea a memoriei externe de program şi de date,
fiecare de cîte 64 Ko.
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 pe 16 biţi şi 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. Rangurile neutilizate ale registrului P2 pot funcţiona ca linii
de intrare/ ieşire independente.
Î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.

7
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. 1.5 Conectarea memoriei externe de program şi de date la microcontrolerul 80C51

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. 1.6. Î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.

8
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. 1.6 Conectarea memoriei de date externe


din care se poate executa program la microcontrolerul 80C51

Alte exemple de conectare:


1. Să se conecteze la un microcontroler 80C51 8 Ko de memorie EPROM, 8 Ko
memorie RAM şi încă 8 Ko memorie RAM din care se poate executa şi program. Se vor
folosi circuite de 8 Ko.
2. Să se conecteze la un microcontroler 80C51 16 Ko memorie EPROM, 16 Ko
memorie RAM şi încă 16 Ko memorie RAM din care se poate executa şi program. Se vor
folosi circuite de 32 Ko.
3. Să se conecteze la un microcontroler 80C51 32 Ko memorie EPROM, 32 Ko
memorie RAM şi încă 32 Ko memorie RAM din care se poate executa şi program. Se vor
folosi circuite de 32 Ko.
4. Să se conecteze la un microcontroler 80C51 32 Ko memorie EPROM, 64 Ko
memorie RAM şi încă 32 Ko memorie RAM din care se poate executa şi program. Se vor
folosi circuite de 32 Ko.

7. Registrele cu funcţiuni speciale

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


SFR (“Special Function Registers”). Există cîteva tipuri de registre şi anume: registre de uz
general, registre care corespund porturilor, registre pentru comanda modulelor periferice şi
registre pentru transferul datelor cu modulele periferice.

9
Registrele cu funcţiuni speciale sunt adresabile în mod direct, adresele lor se află în
zona 80H - FFH 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. 1.1. În continuare vor fi prezentate, pe
scurt, registrele.

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. 1.1 Registrele cu funcţiuni speciale ale microcontrolerului 80C51

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.
PSW ("Program Status Word"): este registrul de stare al programului. Conţine indicatorii de
condiţii. Structura sa este prezentată în fig. 1.7. Rangurile PSW.4 şi PSW.3 denumite şi RS1,
respectiv RS0 permit selectarea blocului 0 – 3 din memoria internă RAM care se suprapune
peste grupul R0 – 7.

CY AC F0 RS1 RS0 OV - P
PSW.0: indicator de paritate.
PSW.1: indicator la dispoziţia utilizatorului.
PSW.2: indicator de depăşire.

10
PSW.4- 3: ranguri pentru selectarea blocului 0 – 3 din RAM intern, activ, după relaţia: 00 –
bloc 0, 01 – bloc 1, 10 – bloc 2, 11 – bloc 3.
PSW.5: indicator la dispoziţia utilizatorului.
PSW.6: indicator de Carry auxiliar (util la operaţii în BCD).
PSW.7: indicator de Carry.

Fig. 1.7 Structura registrului de stare PSW

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 descriu modulele periferice pe care le controlează.

8. 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 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. Î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. 1.8 şi TCON ("Timer Control Register"), fig. 1.9.

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.

11
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. 1.8 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. 1.9 Structura registrului TCON al microcontrolerului 80C51

Controlul numărării 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. 1.10.

12
fOSC / 12

CLOCK
T0 sau T1 pentru
TIMER 0
sau
TIMER1

C / /T

/INT0
sau
/INT1
GATE

TR0, TR1
Fig. 1.10 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. 1.11 prezintă pe TIMER 0 şi 1 în modul 0.

TL0 TH0 TF0


CLOCK 5 biţi 8 biţi

TL1 TH1 TF1


CLOCK 5 biţi 8 biţi

Tact serial

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

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

TL0 TH0 TF0


CLOCK 8 biţi 8 biţi

TL1 TH1 TF1


CLOCK 8 biţi 8 biţi

Tact serial
Fig. 1.12 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. 1.13 prezintă pe TIMER 0 şi 1 în modul 2.

CLOCK TL0 TF0

TH0

CLOCK TL1 TF1

TH1 Tact serial

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

14
Modul 3
Acest mod, fig. 1.14, 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.

CLOCK TL0 TF0

fOSC / 12 TH0 TF1


TR1

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

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.

9. 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.
Schema bloc a interfeţei seriale este prezentată în fig. 1.15.

15
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. 1.15 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. 1.16, 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.

16
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. 1.2.

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. 1.2 Modul de lucru al interfeţei seriale a microcontrolerului 80C51
Fig. 1.16 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.
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.

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. Rata de transfer este:
R = fOSC/ 12.

Modul 1

17
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. 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 iar recepţia se realizează pe terminalul RxD şi este anclanşată la apariţia bitului de
START. Data se preia din tamponul SBUF. Î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.

18
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. 1.3 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. 1.3 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. 1.17, 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. 1.17 Sistem multumicroprocesor

19
Î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.

10. 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 şi care generează, de fapt, întreruperile. 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ă. Aceşti indicatori pot fi controlaţi şi prin program. Dacă se încarcă 1 în
unul din aceşti indicatori, efectul va fi acelaşi ca şi cel produs de cererea corespunzătoare
hardware. Dacă există o cerere hardware în aşteptare, care nu a fost încă tratată, ea poate fi
anulată prin ştergerea indicatorului corespunzător.
Întreruperile sunt controlate de 2 registre: IE ("Interrupt Register"), fig. 1.18 şi IP
("Priority Register"), fig. 1.19. 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. În plus, există un rang pentru dezactivarea
generală a întreruperilor.

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. 1.18 Structura registrului IE al microcontrolerului 80C51

20
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. 1.19 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. 1.4.

Tip de întrerupere Adresă


IE0 0003H
TF0 000BH
IE1 0013H
TF1 001BH
RI + TI 0023H
Tab. 1.4 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ă

21
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. 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.
Faptul că se depune în stivă doar conţinutul registrului PC lasă în seama
programatorului salvarea altor registre, de exemplu a registrului de stare, ceea ce poate fi un
dezavantaj dar asigură viteză mai mare. În aplicaţiile de comandă şi control în care sunt
deseori folosite microcontrolerele, tratarea unei cereri de întrerupere se poate reduce doar la
modificarea unor ieşiri de port şi, în aceste cazuri, sunt afectate doar puţine registre, ca
urmare nu trebuiesc făcute salvări dar viteza este un element esenţial.
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, adică dezactivarea
cererii curente, urmată de o nouă trecere la 0, adică o nouă activare). 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ă. Deci un pas este realizat prin un impuls pe linia P3.2.

11. Modurile de lucru cu consum redus

22
Microcontrolerul 80C51 are 2 moduri de lucru cu consum redus: modul Idle şi modul
Power - Down. Acestea sunt utile în aplicaţii în care consumul este un factor critic. Instalarea
lor se face prin program, acţionînd asupra a cîte unui rang din registrul PCON ("Power
Control Register"), fig. 1.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. 1.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 din rutina de tratare a cererii de
întrerupere, microcontrolerul va executa instrucţiunea ce urmează după cea care a instalat
modul Idle. Întrucît în acest caz rutina de tratare a cererii de întrerupere trebuie să fie
specifică, este necesar ca microcontrolerul să afle dacă cererea de întrerupere a apărut pentru
a-l scoate din starea Idle sau din alte cauze. În acest scop pot fi folosite rangurile GF0 şi GF1
pentru a indica cauza apariţiei cererii.
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. Algoritmul intern de iniţializare durează aproximativ 3 cicluri maşină,
timp în care microcontrolerul nu poate executa accese la memoria RAM dar poate executa
accese la porturi. Dacă programatorul nu cunoaşte acest detaliu şi prevede o instrucţiune de
acces la porturi imediat după instrucţiunea care a instalat modul Idle, va rezulta o acţiune
asupra porturilor care va fi imediat modificată de algoritmul de iniţializare rezultînd astfel o
modificare aleatorie a porturilor. Ca urmare 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.
Modul ONCE (“On Circuit Emulation)

23
Este un mod foarte util la testarea şi depanarea unui sistem cu microcontroler, fără a fi
necesară scoaterea microcontrolerului din sistem. În acest mod pinii portului P0 trec în stare
de impedanţă ridicată, iar pinii celorlalte porturi şi /PSEN sunt la 1 logic prin rezistenţe
interne de valori mari. Oscilatorul microcontrolerului rămîne activ. În această stare sistemul
va putea fi condus de un emulator care se va conecta pe terminalele microcontrolerului.
Intrarea în modul ONCE se face în 2 paşi:
1. se forţează pinul ALE la 0 logic atunci cănd semnalul RST este activ şi semnalul /PSEN
este la 1 logic şi
2. ALE este forţat la 0 logic şi după dezactivarea lui RST.
Ieşirea din acest mod se face după activarea şi dezactivarea semnalului RST.

12. Porturile

Porturile microcontrolerului constituie o resursă deosebit de importantă şi foarte des


utilizată. Este resursa direct utilizată în aplicaţiile de timp real, de monitorizare, comandă şi
control, in care majoritatea soluţiilor se bazează pe microcontrolere. Prin multitudinea de
funcţii pe care le pot îndeplini, porturile constituie o caracteristică proprie
microcontrolerelor.
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 alternative.
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. 1.5.

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. 1.5 Funcţiunile specifice ale rangurilor portului P3 al microcontrolerului 80C51

Fig. 1.21 prezintă schema cîte unui rang din fiecare port.

24
VCC
Adrese / Date Control
Citire pFET
din registru
Magistală P0.X
D Q
internă Termina
P0.X
Scrie nFET l
C /Q
în registru
Citire
terminal VCC

Citire SA
din registru
Magistală P1.X
D Q
internă Termina
P1.X
Scrie C /Q l
în registru
Citire
terminal VCC
Adrese Control
Citire SA
din registru
Magistală P2.X
D Q
internă Termina
P2.X
Scrie C /Q l
în registru
Citire
terminal
Funcţiune VCC
Citire
din registru alternativă SA
de ieşire
Magistală P3.X
D Q
internă Termina
P3.X
Scrie C /Q l
în registru
Citire Funcţiune alternativă de intrare
terminal
Fig. 1.21 Schema porturilor P0 - P3 ale microcontrolerului 80C51

25
Fiecare rang este alcătuit dintr-un bistabil de tip D în care se înscrie informaţia, la
sosirea comenzii de scriere în bistabil şi al cărui conţinut poate fi citit prin intermediul unei
porţi cu 3 stări la sosirea cimenzii de citire din bistabil. Restul circuitelor sunt specifice
fiecărui port.

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 port bidirecţional indică un port care poate fi ieşire sau intrare iar
atunci cînd este intrare pinii săi sunt flotanţi, cu impedanţă mare. Termenul port cvasi-
bidirecţional se referă la un port care poate fi ieşire sau intrare iar atunci cînd este intrare
prezintă pe fiecare rang cîte o rezistenţă la tensiunea de alimentare care îl ţine la 1 logic.
Dacă este comandat cu 0 logic, va genera curent datorită acestei rezistenţe. 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 şi rolul său este
important atunci cînd portul este intrare.
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 sarcina activă va
avea valoare mare, ceea ce va fixa un curent de intrare foarte mic. Dacă la intrare se aduce
nivel 1 atunci sarcina activă va avea valoare mică şi intrarea va absorbi curent.

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 alternative. Atunci cînd funcţionează ca port de uz general are aceleaşi caracteristici
ca portul P1. Pentru a utiliza funcţiunile sale alternative, este necesară programarea în

26
prealabil a valorii logice 1 în rangurile corespunzătoare din registrul intern P3. În acest fel
poarta ŞI-NU, fig. 1.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 alternativă 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
alternativă de intrare", este conectată în interiorul microcontrolerului în conformitate cu
funcţiunea alternativă 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. 1.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.

27