Documente Academic
Documente Profesional
Documente Cultură
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.
Fig. 3.1 prezintă configuraţia terminalelor la microcontrolerul 80C51, grupate din punct
de vedere funcţional.
10 39-32
(11) P3.0 / RXD P0.0-7 / AD0-7 (43-36)
11
(13 P3.1 / TXD
12
(14) P3.2 / INT0
13
(15) P3.4 / INT1 1-8
14 8
(16) P3.5 / T0 P1.0-7 (2-9)
15 0
(17) P3.6 / T1
16 C
(18) P3.7 / /WR
17 5 24-31
(19) P3.8 / /RD
1 P2.0-7 / A8-15 (24-31)
19
(21) XTAL1 30
18 ALE (33)
(20) XTAL2 29
40 /PSEN (32)
(44) VCC 31
20 9 /EA (35)
(22) VSS
RST (10)
Fig. 3.2 prezintă schema bloc a microcontrolerului 80C51. Resursele acestuia sunt:
- memoria internă de program, de 4 Ko,
- memoria internă RAM, de 128 octeţi,
- registrele cu funcţiuni speciale, SFR ("Special Function Registers"),
- 2 contoare/ temporizatoare, independente,
- o interfaţă serială UART full duplex,
- sistem de întreruperi.
Întreruperi externe
CPU
P0 P1 P2 P3 TxD RxD T0 T1
3.1.3.1 Memoria internă
Memoria internă a microcontrolerului este de două tipuri: fixă şi RAM.
Memoria internă fixă a fost implementată cu memorie ROM, are 4 Ko şi ocupă zona 0000
- 0FFFH din spaţiul de adresare pentru memoria de program. Ea este adresată dacă
intrarea /EA = 1. Tot în această zonă poate fi suprapusă şi memorie fixă externă care va fi
adresată dacă /EA = 0. Pentru adrese superioare lui 0FFFH, va fi adresată memoria fixă
externă, indiferent de nivelul logic de la intrarea /EA. Memoria fixă este folosită ca
memorie de program.
Memoria RAM internă are capacitatea de 128 octeţi şi ocupă zona 0000 - 00FFH din
spaţiul de adresare pentru memoria de date. Organizarea memoriei este dată în fig. 3.3.
Fig. 3.2 Schema bloc a microcontrolerului 80C51
Fig. 3.3 Organizarea memoriei RAM interne la microcontrolerul 80C51
Zona 00 - 1FH este divizată în 4 blocuri de câte 8 octeţi, notate cu Blocul 0 - 3. Există un
grup de registre, R0-7 care se suprapune, la un moment dat, peste un singur bloc din cele
4. Blocul care se suprapune peste registrele R0-7 este selectat de programator prin
intermediul rangurilor RS1 şi RS0 din registrul de stare al programului, PSW ("Program
Status Word"). După iniţializare, unitatea centrală, CPU, începe execuţia de la adresa
0000 iar registrele R0-7 se suprapun peste Blocul 0. Stiva va fi iniţializată la adresa 07H,
adică în indicatorul de stivă, SP, se va încărca valoarea 07H. La depunerea în stivă, SP va
fi incrementat, spre deosebire de microprocesoare unde la depunerea în stivă SP este
decrementat. Se recomandă încărcarea în SP a unei valori care să corespundă unei locaţii
din zona Data RAM.
Zona 00 - 1FH poate fi accesată direct, prin intermediul unei adrese pe 8 biţi sau prin
adresare de registru. De exemplu instrucţiunea DEC R5 va avea următorul efect: prin
intermediul rangurilor RS1 şi RS0 se alege un bloc din 4, iar octetul din blocul astfel
selectat care se suprapune peste registrul R5 va fi decrementat. Registrele R0 şi R1 pot fi
folosite pentru adresare indirectă a memoriei de date. De exemplu instrucţiunea INC @R0
va avea următorul efect: prin intermediul rangurilor RS1 şi RS0 se alege un bloc iar
octetul din blocul astfel selectat care se suprapune peste R0 va fi interpretat ca adresa unei
locaţii din memoria RAM internă. Conţinutul locaţiei respective va fi incrementat.
Avantajul adresării memoriei prin intermediul registrelor R0-7 este acela că rezultă
instrucţiuni scurte. Astfel pentru adresare de registru sunt necesare doar 3 ranguri care se
găsesc, împreună cu codul instrucţiunii, în primul octet al acesteia. La adresarea indirectă,
prin intermediul registrelor R0 sau R1 este nevoie de un singur rang, aflat, de asemenea,
în primul octet al instrucţiunii.
Zona 20H - 2FH din RAM-ul intern este denumită Bit RAM, întrucât fiecare din cei 128
FF
Data RAM
30
2F
Bit_RAM
20
1F Bloc 3
18
17 Bloc 2
10
0F Bloc 1
08
07 Bloc 0
00
biţi poate fi adresat individual. Există 2 modalităţi de a adresa biţii din această zonă. Una
foloseşte adresa lor: 00 - 7FH, cu 00 pentru bitul 0 de la locaţia 20H şi 7FH pentru bitul 7
de la locaţia 2FH. Cealaltă se referă la octeţii 20H - 2FH. Astfel biţii 00 - 07 pot fi adresaţi
ca 20.0 - 20.7, biţii 08 - 0FH ca 21.0 - 21.7 etc. De exemplu instrucţiunea CLR 20.0 va
avea în al doilea octet al ei un câmp de 5 ranguri care specifică octetul 20H şi un câmp de
3 ranguri care specifică bitul selectat. Fiecare octet din această zonă poate fi adresat şi ca
octet distinct.
Zona 30H - 7FH este denumită Data RAM şi este o zonă de memorie RAM de uz general.
Se recomandă plasarea stivei în această zonă.
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.
7 6 5 4 3 2 1 0
GATE C/ /T M1 M0 GATE C/ /T M1 M0
TMOD.0-1: M0, M1: fixează modul de lucru pentru TIMER 0 conform tab. 3.5.
M1 M0 Mod
0 0 0
0 1 1
1 0 2
1 1 3
Tab. 3.5 Modul de lucru la TIMER 0 sau 1 al microcontrolerului 80C51
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
fOSC / 12
CLOCK
T0 sau T1 Detector pentru
TIMER 0
sau
TIMER1
TL0 TH0 TF0
CLOCK 5 biţi 8 biţi
Tact serial
Modul 0
TIMER 0 şi 1 sunt configurate ca numărătoare pe 13 biţi. TL0 şi TL1 sunt numărătoare
alcătuite din 5 ranguri, cele mai puţin semnificative iar TH0 şi TH1 sunt numărătoare pe 8
biţi. Indicatorii de depăşire TF0 şi TF1 sunt poziţionaţi atunci când numărătorul
corespunzător conţine valoarea maximă şi este incrementat, anulându-se astfel conţinutul
său. Semnalul care apare la ieşirea de depăşire a lui TIMER 1 este sursă pentru tactul
serial. Fig. 3.7 prezintă pe TIMER 0 şi 1 în modul 0.
Fig. 3.7 TIMER 0 şi 1 în modul 0 la microcontrolerul 80C51
Modul 1
Este identic cu modul 0, cu excepţia faptului că numărătoarele sunt pe 16 biţi. Fig. 3.8
prezintă pe TIMER 0 şi 1 în modul 1.
Fig. 3.8 TIMER 0 şi 1 în modul 1 la microcontrolerul 80C51
Modul 2
TIMER 0 şi 1 sunt configurate ca numărătoare pe 8 biţi cu auto-âncărcare. TL0 şi TL1
sunt folosite ca numărătoare iar TH0 şi TH1 sunt folosite ca registre pentru păstrarea
constantei care se va încărca. Semnalul de depăşire generat de TL0 sau TL1 va provoca
preâncărcarea acestora şi numărarea va continua de la această valoare. TH0 şi TH1 sunt
încărcate prin program. Indicatorii TF0 şi TF1 sunt poziţionaţi de semnalele de depăşire
de la numărătoarele TL0, respectiv TL1. Semnalul de depăşire generat de numărătorul
TL1 este sursă pentru tactul serial. Fig. 3.9 prezintă pe TIMER 0 şi 1 în modul 2.
Modul 3
Acest mod poate fi cerut doar pentru TIMER 0. Dacă i se cere lui TIMER 1, acesta nu va
număra (se obţine acelaşi efect ca şi când TR1 = 0). TIMER 0 în modul 3 lucrează ca
două numărătoare independente pe 8 biţi. TL0 foloseşte rangurile de control ale lui
TIMER 0, adică C/ /T, GATE, TR0 şi /INT0 şi comandă pe TF0 iar TH0 foloseşte pe TR1
Tact serial
şi comandă pe TF1.
Acest mod este util în aplicaţii în care se cere un numărător suplimentar. TIMER 0
furnizează 2 contoare pe 8 biţi iar TIMER 1 poate fi folosit în modurile 0, 1 sau 2 fără a
putea, însă, să poziţioneze pe TF1 deci nu va putea să genereze cerere de întrerupere. Fig.
3.10 prezintă pe TIMER 0 în modul 3.
Fig. 3.9 TIMER 0 şi 1 în modul 2 la microcontrolerul 80C51
Fig. 3.10 TIMER 0 în modul 3 la microcontrolerul 80C51
TH0
Întrerupere
Magistrală
internă
SBUF (R)
Registru MUX
deplasare RxD
Logică
control
recepţie
7 6 5 4 3 2 1 0
SM0 SM1 SM2 REN TB8 RB8 TI RI
SCON.0: RI: este un indicator activat de interfaţa serială atunci când a terminat de
asamblat un caracter şi îl poate oferi unităţii centrale; împreuna cu rangul TI constituie
intrări pentru o poartă SAU, a cărei ieşire poate fi folosită ca cerere de întrerupere;
ştergerea indicatorului se face doar prin program.
SCON.1: TI: indicator activat de interfaţa serială atunci când a terminat de transmis un
caracter şi poate primi altul de la unitatea centrală; împreună cu rangul RI constituie
intrări pentru o poartă SAU a cărei ieşire poate fi folosită ca cerere de întrerupere;
ştergerea indicatorului se face doar prin program.
SCON.2: RB8: rang pentru memorarea celui de-al 9-lea bit recepţionat dintr-un caracter
pe 11 biţi, folosit în modurile 2 şi 3; în modul 1 va reţine bitul STOP dacă rangul SM2 = 0
iar în modul 0 nu este folosit.
SCON.3: TB8: rang pentru memorarea celui de-al 9-lea bit de date ce se va transmite într-
un caracter pe 11 biţi, folosit în modurile 2 şi 3; este poziţionat prin program.
SCON.4: REN: trebuie să fie setat pentru ca recepţia să fie activată.
SCON.5: SM2: validează facilitatea de comunicare în sistem multiprocesor, în modurile 2
sau 3; dacă SM2 = 1, în modurile 2 sau 3 (cu 11 biţi/ caracter) şi al 9-lea bit de date este 1
atunci data recepţionată este acceptată şi este încărcată în SBUF şi RB8 şi indicatorul RI
este activat; dacă al 9-lea bit de date este 0, data este ignorată şi SBUF, RB8 şi RI rămân
nemodificate; dacă SM2 = 1 în modul 1 (cu 10 biţi/ caracter), se va încărca bitul de STOP
în RB8, data este preluată şi indicatorul RI este activat; dacă SM2 = 0, data este acceptată
indiferent de valoarea celui de=al 9-lea bit de date sau a bitului de STOP.
SCON. 6-7: SM1, SM0: setează modul de lucru al interfeţei seriale, conform tab. 3.6.
Registrul SBUF este tamponul pentru date. Deşi îi corespunde o singură adresă, este
alcătuit din 2 registre: unul pentru transmisie şi unul pentru recepţie. Corespunzător,
SBUF poate fi specificat în instrucţiuni ca registru sursă sau ca registru destinaţie.
Transmisia este anclanşată prin înscrierea datei în SBUF iar la recepţie, data este citită din
SBUF.
Rangul SMOD este rangul 7 din registrul PCON ("Power Control Register") şi are rolul să
divizeze cu 2 ( SMOD = 1) sau nu (SMOD = 0), rata de transfer.
În continuare vor fi descrise modurile de lucru ale interfeţei seriale.
Modul 0
Este modul numit şi I/ E extins în care se transferă date pe 8 biţi, sincronizate cu tactul
microcontrolerului. Terminalul TxD este folosit doar pentru a genera tactul iar terminalul
RxD este folosit pentru a transfera date în ambele sensuri.
Transmisia este iniţiată prin scrierea în registrul SBUF. După un ciclu maşină de la
încheierea scrierii în SBUF, apare cel mai puţin semnificativ bit al datei la pinul RxD.
După 2 stări de la apariţia acestui bit, este activat, la 0, tactul pe linia TxD. O periodă
completă a tactului corespunde unui ciclu maşină (începe şi se termină în a 2-a fază a
stării S3). După transferul bitului cel mai semnificativ al datei, logica de transmisie este
activată şi este setat indicatorul TI.
Recepţia este activată atunci când REN = 1 şi RI = 0. Aceasta se va realiza prin program.
Tactul de pe linia TxD se va activa, la 0, după 9 stări după ce REN = 1 şi RI = 0. O
perioadă a tactului de pe linia TxD corespunde unui ciclu maşină. Data este citită de pe
linia RxD în registrul tampon de citire imediat înaintea tranziţiei 0 -> 1 a tactului. După ce
preluarea caracterului s-a încheiat, el este transferat în SBUF, logica de recepţie este
iniţializată şi se activează indicatorul RI.
Rata de transfer în modul 0 este:
R = fOSC/ 12.
Fig. 3.13 prezintă diagrama transferului în modul 0.
Fig. 3.13 Transferul în modul 0 al interfeţei seriale a microcontrolerului 80C51
Modul 1
Este un mod UART în care se transferă caractere pe 10 biţi: 1 bit de START, 8 biţi de
S1 S2 S3 S4 S5 S6 S1 S2 S3 S4 S5 S6 S1
CLK
TRANSMISIE
RxD
(DATE)
TxD
(Tact)
RECEPŢIE
RxD
(DATE)
TxD
(Tact)
date, primul fiind cel mai puţin semnificativ şi 1 bit de STOP. La recepţie, bitul de STOP
se încarcă în RB8. Fig. 3.14 prezintă schema bloc a interfeţei seriale în modul 1 iar fig.
3.15 prezintă diagrama transferului în modul 1.
Rata de transfer este determinată de frecvenţa semnalului de la ieşirea de depăşire a lui
TIMER 1, fTIM. Dacă TIMER 1 lucrează în modul 0 sau 1 atunci rata de transfer este:
2SMOD
R = ------------ * fTIM.
32
Dacă TIMER 1 lucrează în modul 2 atunci rata de transfer este:
2SMOD fOSC
R = ------------- * --------------------------------; (TH1) este constanta de preâncărcare.
32 12 * (256 - (TH1))
TIMER 1 poate lucra ca şi contor sau ca temporizator şi este necesară dezactivarea
întreruperii generată de TF1.
Transmisia se realizează pe terminalul TxD şi este anclanşată de o scriere în tamponul
SBUF. Tactul fOSC sau fTIM divizat la 2 sau nu de SMOD, este divizat la 16 de un
numărător. Transmisia începe prin plasarea bitului de START la începutul ciclului maşină
care urmează după ce numărătorul a executat un ciclu complet, după încheierea scrierii în
Fig. 3.14 Schema bloc a interfeţei seriale în modul 1 la microcontrolerul 80C51
Magistrala internă
TB8
fTIM Scrie în
SBUF
/S
SMOD= /2 D Q SBUF (T) TxD
=0 /R
SMOD=
=1
Start Deplasare
Logică control
transmisie Date
Numărător Tact TI Transfer
/ 16
Întrerupere
de la
Numărător interfaţa
/ 16 serie
Tact RI
7 Transfer
8 Logică control
9 recepţie
Detector
tranziţie Start Deplasare
1 0
789
Detector
bit
SBUF (R)
Citeşte
SBUF
Magistrala internă
SBUF. În continuare, la fiecare ciclu complet al numărătorului se emite un bit de date.
După ce se emite şi bitul de STOP, se activează indicatorul TI.
Recepţia se realizează pe terminalul RxD şi este anclanşată de o tranziţie 1 -> 0 pe acest
terminal. Această tranziţie corespunde bitului de START şi numărătorul mod 16 începe să
numere. Un ciclu complet al numărătorului corespunde unui bit serie recepţionat. În
consecinţă TIMER 1 trebuie să fie încărcat cu o astfel de valoare încât perioada
numărătorului mod 16 să fie egală cu rata de recepţie.
TRANSMISIE
Tact
Scrie în
SBUF
/Transfer
Date
Deplasare
START
TxD D0 D1 D2 D3 D4 D5 D6 D7 TB8 STOP
TI
RECEPŢIE
Tact
RxD START
D0 D1 D2 D3 D4 D5 D6 D7 RB8 STOP
7, 8, 9
Deplasare
RI
Fig. 3.15 Transferul în modul 1 al interfeţei seriale a microcontrolerului 80C51
Modul 2
Este un mod UART cu 11 biţi/ caracter: 1 bit de START, 8 biţi de date, 1 bit programabil
şi 1 bit de STOP. La transmisie, bitul al 9-lea este TB8 şi poate fi programat iar la
recepţie, bitul al 9-lea este încărcat în RB8. Rata de transfer este:
2SMOD
R = -------------- * fOSC
64
Transmisia şi recepţia se realizează întocmai ca şi în modul 1, utilizând aceleaşi resurse
hardware şi acelaşi mecanism de rejecţie a zgomotelor. Apare o singură diferenţă, legată
de al 9-lea bit de date. Astfel la transmisie, după bitul de START şi cei 8 biţi de date,
emişi în aceeaşi ordine ca şi la modul 1, este emis al 9-lea bit, TB8, care poate fi bitul de
paritate dacă în prealabil acesta a fost încărcat în TB8, apoi se emite bitul de STOP şi se
activează indicatorul TI.
La recepţie, după preluarea bitului de START şi a biţilor de date, este preluat al 9-lea bit,
care se încarcă în RB8, apoi este preluat bitul de STOP şi se activează indicatorul RI.
Preluarea datei, încărcarea celui de-al 9-lea bit în RB8 şi activarea indicatorului RI au loc
dacă sunt îndeplinite, la momentul respectiv, condiţiile:
- RI = 0 şi
- SM2 = 0 sau SM2 = 1 şi bitul al 9-lea = 1.
Dacă vreuna din aceste condiţii nu este îndeplinită atunci data este ignorată şi SBUF, RB8
şi RI rămân nemodificate.
Modul 3
Este un mod UART cu 11 biţi/ caracter care diferă de modul 2 doar prin rata de transfer
care aici, depinde de fTIM. Astfel:
2SMOD
R = -------------- * fTIM,
32
dacă TIMER 1 lucrează în modul 0 sau 1 şi
2SMOD fOSC
R = ------------- * ------------------------------,
32 12 * (256 - (TH1))
dacă TIMER 1 lucrează în modul 2.
TIMER 1 poate lucra ca şi contor sau temporizator şi este necesară dezactivarea
întreruperii generată de TF1.
În tab. 3.7 se prezintă ratele de transfer uzuale şi cum pot fi ele obţinute din TIMER 1.
...
7 6 5 4 3 2 1 0
EA - - ES ET1 EX1 ET0 EX0
IE.0: EX0: bit de control pentru întreruperea externă 0.
IE.1: ET0: bit de control pentru contorul/ temporizatorul 0.
IE.2: EX1: bit de control pentru întreruperea externă 1.
IE.3: ET1: bit de control pentru contorul/ temporizatorul 1.
IE.4: ES: bit de control pentru întreruperea serială.
IE.7: EA: bit de control general: dacă este 0 atunci o întrerupere nu poate fi tratată; dacă
este 1 atunci o întrerupere poate fi tratată dacă bitul de control corespunzător este 1.
Fig. 3.17 Structura registrului IE al microcontrolerului 80C51
Rolul registrului IP este acela de a aloca priorităţi. Există 2 nivele de prioritate: scăzut şi
ridicat. Fiecărei surse i se poate aloca , în mod independent, oricare nivel de prioritate.
Fiecărei întreruperi îi corespunde un rang: 1 în rangul respectiv înseamnă prioritate
ridicată iar 0 în rangul respectiv înseamnă prioritate scăzută. Dacă apar simultan 2 cereri
de întrerupere, de priorităţi diferite, va fi tratată cererea de prioritate mare. Dacă apar
simultan 2 sau mai multe cereri de aceeaşi prioritate, microcontrolerul le va lua în
considerare într-o ordine prestabilită care este: IE0, TF0, IE1, TF1 şi, ultima, RI + TI.
Rutina de tratare a unei întreruperi de prioritate scăzută poate fi întreruptă de o cerere de
prioritate ridicată dar nu şi invers. Rutina de tratare a unei întreruperi nu poate fi
întreruptă de o cerere de aceeaşi prioritate.
7 6 5 4 3 2 1 0
- - - PS PT1 PX1 PT0 PX0
IP.0: PX0: rang de prioritate pentru întreruperea externă 0.
IP.1: PT0: rang de prioritate pentru întreruperea de la contorul/ temporizatorul 0.
IP.2: PX1: rang de prioritate prntru întreruperea externă 1.
IP.3: PT1: rang de prioritate pentru întreruperea de la contorul/ temporizatorul 1.
IP.4: PS: rang de prioritate pentru întreruperea serială.
Fig. 3.18 Structura registrului IP al microcontrolerului 80C51
Întreruperile sunt citite în timpul lui S5P2 al fiecărui ciclu maşină. Apoi are loc o testare a
ceea ce s-a citit în timpul următorului ciclu maşină. Dacă vreunul din indicatorii de
întrerupere a fost găsit activ şi dacă întreruperea respectivă este validată atunci sistemul
de întreruperi va genera o instrucţiune LCALL ("Long CALL") ADR, unde ADR depinde
de tipul întreruperii, conform tab. 3.8.
C1 C2 C3 C4 C5
S5 S6
P2
.......... ... ... ... ...
Microcontrolerul 80C51 este iniţializat prin aplicarea unui nivel 1 la intrarea RST, în timp
ce oscilatorul funcţionează şi menţinerea acestui nivel cel puţin 24 perioade de tact.
Semnalul extern RST este asincron în raport cu tactul microcontrolerului. El este testat în
faza S5P2 a fiecărui ciclu maşină. După ce microcontrolerul sesizează activarea lui RST,
terminalele îşi menţin activităţile timp de 19 perioade de tact, adică între 19 şi 31 perioade
de tact după ce s-a aplicat semnalul extern RST.
După dezactivarea lui RST, starea registrelor interne este prezentată în tab. 3.9.
Registru Conţinut
PC, DPTR 0000
ACC,B, PSW, TMOD, TCON, TH0, TL0, TH1, TL1, SCON 00
SP 07
P0 - P3 FFH(intrări)
SBUF nedeterminat
IP xxx00000B
IE 0xx00000B
PCON 0xxx0000B
Tab. 3.9 Conţinutul registrelor după iniţializarea microcontrolerului 80C51
Microcontrolerul 80C51 are 2 moduri de lucru cu consum redus: modul Idle şi modul
Power - Down. Instalarea lor se face prin program, acţionând asupra a câte unui rang din
registrul PCON ("Power Control Register"), fig. 3.20.
7 6 5 4 3 2 1 0
SMOD - - - GF1 GF0 PD IDL
PCON.0: IDL: 1 în acest rang instalează modul Idle.
PCON.1: PD: 1 în acest rang instalează modul Power - Down.
PCON.2, 3: GF0, GF1: ranguri pentru uz general.
PCON.7: SMOD: utilizat la interfaţa serială.
Fig. 3.20 Structura registrului PCON al microcontrolerului 80C51
Modul Idle
Microcontrolerul intră în acest mod după activarea, de către o instrucţiune, a rangului
IDL. Oscilatorul, interfaţa serială, contoarele/ temporizatoarele şi sistemul de întreruperi
continuă să funcţioneze dar tactul nu mai ajunge la CPU. Întregul CPU îşi păstrează
starea. Terminalele de la porturi păstrează nivelul logic avut la instalarea modului Idle iar
ALE şi /PSEN vor avea nivel 1.
Ieşirea din modul Idle se poate face pe 2 căi. Una constă într-o întrerupere validată. Ea va
fi luată în considerare şi, după instrucţiunea RETI, microcontrolerul va executa
instrucţiunea ce urmează după cea care a instalat modul Idle. Rangurile GF0 şi GF1 pot fi
folosite pentru a indica dacă întreruperea a apărut în modul normal sau în modul Idle.
O altă cale constă în activarea liniei RST cel puţin 24 perioade de tact. Rangul IDL va fi
şters şi microcontrolerul va continua execuţia de la instrucţiunea următoare celeia care a
instalat modul Idle. Întrucât algoritmul intern de iniţializare durează aproximativ 3 cicluri
maşină, se recomandă inserarea de 3 instrucţiuni NOP după cea care a instalat modul Idle.
3.1.3.8 Porturile
Fig. 3.21 prezintă schema câte unui rang din fiecare port.
Fig. 3.21 Schema porturilor P0 - P3 ale microcontrolerului 80C51
VCC
Adrese / Date Control
Citire pFET
din registru
Magistală P0.X
internă D Q
P0.X Terminal
Scrie nFET
C /Q
în registru
Citire
terminal VCC
Citire SA
din registru
Magistală P1.X
internă D Q
P1.X Terminal
Scrie C /Q
în registru
Citire
terminal VCC
Adrese Control
Citire SA
din registru
Magistală P2.X
internă D Q
P2.X Terminal
Scrie C /Q
în registru
Citire
terminal
Funcţiune VCC
Citire
din registru specifică SA
de ieşire
Magistală P3.X
internă D Q
P3.X Terminal
Scrie C /Q
în registru
Citire
terminal Funcţiune specifică de intrare
Fiecare rang este alcătuit dintr-un bistabil de tip D în care se înscrie informaţia, la sosirea
comenzii de scriere şi al cărei conţinut poate fi citit prin intermediul unei porţi cu 3 stări.
Restul circuitelor sunt specifice fiecărui port.
Portul 0
Etajul de ieşire al portului 0 este alcătuit din 2 tranzistoare FET. Tranzistorul pFET va
lucra doar atunci când rangul respectiv emite 1 în timpul acceselor la memoria externă iar
în toate celelalte situaţii este blocat, ceea ce înseamnă că atunci când portul P0 este folosit
ca port de ieşire, liniile sale sunt cu drenă în gol.
În timpul acceselor la memoria externă, în registrul P0 se înscrie configuraţia FFH.
Pentru a folosi rangurile portului P0 ca intrări, este necesară înscrierea în prealabil în
rangurile corespunzătoare din registrul intern P0, a valorii 1. Aceasta va duce la blocarea
tranzistorului nFET şi, întrucât şi tranzistorul pFET este blocat, terminalul respectiv va fi
flotant şi poate fi comandat din exterior ca o intrare de mare impedanţă.
Portul 1
Spre deosebire de portul 0 care este bidirecţional, portul 1 este un port cvasi-bidirecţional.
Termenul cvasi-bidirecţional se referă la un port care prezintă pe fiecare rang câte o
rezistenţă la tensiunea de alimentare atunci când este comandat ca intrare. P1 este un port
de uz general, fără funcţii specifice.
Sarcina activă, SA, din etajul de ieşire asigură o funcţionare performantă a portului. Astfel
valoarea sa se modifică în funcţie de conţinutul rangului corespunzător. Fig. 3.22 prezintă
schema sarcinii active pentru microcontrolerul 80C51 (varianta CMOS) iar fig. 3.23
prezintă o schemă echivalentă în care rezistenţa R1 corespunde tranzistorului pFET1, R2
corespunde lui pFET2 şi R3 corespunde lui pFET3. Schema echivalentă din fig. 3.23a
corespunde rangului configurat ca ieşire, cu valoarea 1. Schema echivalentă din fig. 3.23b
corespunde rangului configurat ca ieşire, cu valoarea 0. Schema echivalentă din fig. 3.23c
corespunde tranziţiei 0 -> 1 a ieşirii în care se activează un circuit de accelerare. Acesta
este tranzistorul pFET1 care se deschide timp de 2 perioade de tact după tranziţia 0 -> 1
de la ieşirea rangului din registrul intern şi va provoca generarea unui curent suplimentar
care va determina creşterea vitezei de comutare 0 -> 1 la ieşirea corespunzătoare.
Pentru utilizarea portului ca intrare este necesară înscrierea în prealabil a valorilor logice
1 în rangurile corespunzătoare. Dacă la intrare se aduce nivel 0 atunci rezistenţa R2 se
deconectează de la Vcc iar rezistenţa internă va fi dată doar de R3, cu valoare mare, de
100 k, ceea ce va fixa un curent de intrare foarte mic. Dacă la intrare se aduce nivel 1
VCC VCC VCC
Întîrziere
2 perioade de tact
PX.Y
Terminal
Ieşirea nFET
rangului
Citeşte terminalul
IOL
a. b.
VCC R1=500
R2=10k
R3=100k
c.
Portul 2
Este de asemenea un port cvasi-bidirecţional. Sarcina activă are aceeaşi schemă ca la
portul 1. În timpul acceselor la memoria externă, va transfera jumătatea mai semnificativă
a magistralei de adrese. În acest timp, conţinutul registrului intern P2 nu este afectat, ceea
ce înseamnă că dacă după un acces la memoria externă nu se execută un alt acces la
memoria externă, pe terminalele portului P2 va apare conţinutul registrului intern P2.
Dacă accesul la memoria externă de date se face doar pe 8 biţi, pe terminalele portului P2
va apare conţinutul registrului intern P2. În acest fel se poate realiza paginarea memoriei
de date externe.
În afara acceselor la memoria externă, portul P2 poate fi folosit ca port de uz general.
Portul P3
Este de asemenea un port cvasi-bidirecţional. Este port de uz general dar are şi funcţiuni
specifice. Atunci când funcţionează ca port de uz general are aceleaşi caracteristici ca
portul P1. Pentru a utiliza funcţiunile sale specifice, este necesară programarea în
prealabil a valorii logice 1 în rangurile corespunzătoare din registrul intern P3. În acest fel
poarta ŞI-NU, fig. 3.21, va fi comandată de cealaltă intrare, corespunzătoare funcţiunii
specifice. În cazul unei funcţiuni de ieşire (TxD, /RD, /WR), terminalul portului este
comandat de linia "Funcţiune specifică de ieşire" iar în cazul unei funcţiuni de intrare
(RxD, /INT0, /INT1, T0, T1), ieşirea porţii conectată la terminal, notată cu "Funcţiune
specifică de intrare", este conectată în interiorul microcontrolerului în conformitate cu
funcţiunea specifică realizată. În cazul rangurilor care sunt intrări este necesară blocarea
tranzistorului nFET ceea ce se realizează înscriind în prealabil nivelul logic 1 în rangul
corespunzător din registrul intern.
Scrierea într-un port se realizează în felul următor: noua valoare ajunge la registrul intern
corespunzător în S6P2 a ciclului final al instrucţiunii care provoacă scrierea. Întrucât
înscrierea în registru se face doar într-o fază P1, noile valori vor apare la ieşirile portului
doar în S1P1 a ciclului maşină următor.
Ieşirile portului P0 suportă o încărcare de 8 sarcini TTL LS iar ieşirile porturilor P1, P2 şi
P3 suportă o încărcare de câte 4 sarcini TTL LS.
La iniţializare toate porturile sunt configurate ca intrări, cu valorile FFH înscrise în
registrele interne.
După cum se observă din fig. 3.21, la fiecare port există facilitatea de a citi atât terminalul
cât şi conţinutul rangului corespunzător din registrul intern. Instrucţiunile care citesc
conţinutul rangului şi nu terminalul sunt cele care citesc o valoare, eventual o modifică şi
apoi o rescriu în registrul intern. Ele sunt denumite instrucţiuni cu "citire - modificare -
scriere". În continuare sunt prezentate aceste instrucţiuni, operandul destinaţie fiind un
port sau un rang dintr-un port:
ANL : ŞI logic, de exexmplu ANL P1, A,
ORL : SAU logic,
XRL : SAU - EXCLUSIV logic,
JBC : salt dacă rangul specificat este 1 şi apoi anulare rang,
CPL : complementare bit, de exemplu CPL P3.3,
INC : incrementare,
DEC : decrementare,
DJNZ : decrementare şi salt dacă rezultatul nu este nul, de exemplu DJNZ P1, ETICH,
MOV PX.Y,C : mută bitul Carry în rangul Y din portul X,
CLR PX.Y : şterge rangul Y din portul X,
SET PX.Y : setează rangul Y din portul X.
Facilitatea de a citi conţinutul rangului din registrul intern în locul terminalului permite
evitarea obţinerii de valori false datorate unei conectări greşite a terminalului. De
exemplu, dacă s-ar putea citi doar terminalul atunci s-ar obţine o valoare falsă în
următoarea situaţie: terminalul se conectează în baza unui tranzistor npn, cu emitorul
legat la masă şi comandă funcţionarea acestuia; înscrierea unei valori 1 în rangul din
registrul intern va provoca saturarea tranzistorului ceea ce înseamnă că nivelul de tensiune
de pe terminal va fi fixat de tensiunea bază - emitor a tranzistorului care, însă, corespunde
unui nivel logic 0.
Execuţia unei instrucţiuni se desfăşoară în cadrul unor cicluri maşină. Un ciclu maşină
este divizat în 6 stări, notate cu S1 - S6, o stare fiind alcătuită din 2 faze, notate cu P1 şi
P2. Deci un ciclu maşină începe în starea 1, faza 1, notată cu S1P1 şi se încheie în starea
6, faza 2, notată cu S6P2. Operaţiile aritmetice şi logice se desfăşoară în timpul fazei 1 iar
transferurile între registre se desfăşoară în faza a 2-a.
Considerând un tact cu frecvenţa de 12 MHz, rezultă că durata unui ciclu maşină este de 1
ms. Tactul se obţine fie prin conectarea externă a unui cuarţ, între terminalele XTAL1 şi
XTAL2, fig. 3.24a, fie prin comanda din exterior cu semnal dreptunghiular, fig. 3.24b şi c.
Fig. 3.24 Generarea tactului la microcontrolerul 80C51
Execuţia unei instrucţiuni depinde de tipul acesteia. Astfel există mai multe cazuri:
22-35 pF
XTAL2 XTAL2 XTAL2
a. b. c.
1. instrucţiune pe 1 octet şi 1 ciclu:
Execuţia instrucţiunii începe în S1 când se aduce codul şi se memorează în registrul IR.
Numărătorul de program, PC, este incrementat iar în S4 se mai execută o aducere de cod
care, însă, este ignorat iar PC nu mai este incrementat.
2. instrucţiune pe 2 octeţi si 1 ciclu:
În S1 se aduce codul instrucţiunii, PC este incrementat iar în S4 se mai citeşte un octet şi
PC este din nou incrementat.
3. instrucţiune pe 1 octet şi 2 cicluri care nu face referire la RAM-ul extern:
În S1 al primului ciclu se aduce codul instrucţiunii, PC este incrementat iar în S4 al
aceluiaşi ciclu, S1 şi S4 ale ciclului următor se citesc octeţi care nu sunt luaţi în
considerare de CPU iar PC nu se modifică.
4. instrucţiune pe 1 octet şi 2 cicluri care se referă la RAM-ul extern:
În S1 al primului ciclu se aduce codul instrucţiunii, PC este incrementat, în S4 se aduce
un nou cod dar care nu este considerat de CPU, PC nu este incrementat iar în ciclul
următor nu se mai execută aduceri de cod ci accesul la RAM-ul extern.
Cele mai multe instrucţiuni se execută în 1 sau 2 cicluri maşină. Doar instrucţiunile MUL
şi DIV necesită 4 cicluri maşină.
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.
S4 S5 S6 S1 S2 S3 S4 S5 S6
CLK
ALE
/PSEN
/RD
COD DPL sau RI DATA PCL
P0 IN OUT IN OUT
S4 S5 S6 S1 S2 S3 S4 S5 S6
CLK
Citire P0, P2, P0, P2,
P1 P3 P1 P3
intrări
Ieşiri Data veche Data nouă
Tact serial
(mod 0) Citire
Citire
RxD PxD
Ciclu de transfer de porturile
informaţiei de adresă într-un registru extern, la comanda frontului posterior al semnalului
ALE.
Fig. 3.26 prezintă modalităţile de conectarea a memoriei externe de program şi de date,
fiecare de câte 64 Ko.
P0.0-7 D0-7
/EA
R A0-7
E Memoria
8 de
0 G
program
C externă
5 ALE STB
(64 ko)
1
P2.0-7 A8-15
/PSEN /OE
/CE
/RD
/WR D0-7
A0-7 Memoria
de
date
externă
A8-15 (64 ko)
/CS
/WE
/OE
Atunci când memoria externă implicată în transfer este cea de program, adresa ce apare pe
liniile porturilor P0 şi P2 este generată de numărătorul de program, PC.
Accesul la memoria externă de date se face prin intermediul registrului DPTR, de către
instrucţiunile MOVX @DPTR,A şi MOVX A,@DPTR. Prima instrucţiune transferă
conţinutul acumulatorului în memorie la adresa indicată de DPTR iar a doua instrucţiune
transferă conţinutul locaţiei cu adresa indicată de DPTR în A. În timpul transferurilor cu
memoria externă de date, adresa ce apare pe liniile porturilor P0 şi P2 este generată de
DPTR.
Accesul la memoria externă de date se poate face şi prin intermediul registrelor R0 sau
R1, cu instrucţiunea: MOVX @Ri,A sau MOVX A,@Ri. Conţinutul registrelor R0 sau R1
va fi adresa ce apare pe liniile portului P0. Această adresă este doar pe 8 biţi şi va permite
accesul într-o pagină de 256 octeţi. Conţinutul registrului P2 va apare pe liniile portului
P2 şi poate fi folosit pentru paginare, asigurând plasarea paginii de 256 octeţi în spaţiul de
adresare de 64 Ko al microcontrolerului.
În cazul aplicaţiilor ce necesită mai puţină memorie de program şi de date decât 64 Ko, nu
mai este necesar ca cele 2 blocuri de memorie să se suprapună în spaţiul de adresare al
microcontrolerului iar selecţia lor se va face utilizând şi linii mai semnificative din
magistrala de adrese.
Dacă se doreşte rularea de programe din memoria externă de date atunci este necesară
suprapunerea unui spatiu de memorie externă de program cu un spaţiu de memorie
externă de date ceea ce se poate realiza cu o combinaţie a semnalelor /PSEN şi /RD, fig.
3.27. Întrucât semnalul /PSEN se activează mai repede decât semnalul /RD este necesar
ca memoria externă de date din care se execută programe, să fie suficient de rapidă pentru
a răspunde cerinţelor semnalului /PSEN. Memoria externă de date din care se doreşte
execuţia de programe trebuie să fie plasată în spaţiul de adresare al microcontrolerului,
într-o zonă diferită de cea care corespunde atât memoriei externe de program cât şi
memoriei externe de date.
Dacă întregul program ce se execută se obţine din memoria externă, atunci intrarea /EA
trebuie să fie conectată la 0.
P0.0-7 D0-7
R
E A0-7
8 G
0
C ALE STB Memoria
5 externă
1
P2.0-7 A8-15
/ PSEN
/RD /CS
/WR /OE
/WE