Microcontrolerul 80C51
Microcontrolerul 80C51
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ă
1
Întreruperi externe
CPU
P0 P1 P2 P3 TxD RxD T0 T1
Fig. 1.1 Structura microcontrolerului 80C51
3. Configuraţia terminalelor
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)
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ă.
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.
4. Organizarea memoriei
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
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ă
22-35 pF
XTAL2 XTAL2 XTAL2
a. b. c.
Fig. 1.4 Conectarea tactului la microcontrolerul 80C51
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ă.
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
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
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.
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.
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
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.
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.
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
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.
Tact serial
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.
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.
TH0
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.
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ă
15
fTIM Logică
control
fOSC / 2 transmisie MUX
TxD
Î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.
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.
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.
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.
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.
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ă.
Î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.
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.
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ă.
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
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