0% au considerat acest document util (0 voturi)
139 vizualizări32 pagini

CapMicrocontr8051 PDF

Încărcat de

77nicu
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
139 vizualizări32 pagini

CapMicrocontr8051 PDF

Încărcat de

77nicu
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 32

Curs MICROCONTROLERE

Prof. Dr.Ing. Vasile Lăzărescu


Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

Capitolul 2 – Familia MCS-51. Microcontrolerul 8051

2.1. Caracteristici generale


Familia MCS-51 aparţine firmei Intel şi reprezintă o dezvoltare a familiei anterioare de
microcontrolere MCS-48. Familia cuprinde microcontrolere pe 8 biţi (8051, 8751, 8031),
realizate în tehnologie HMOS (n-channel High performance Metal Oxid Semiconductor), cu o
capsulă DIL (Dual In Line) cu 40 de pini, având următoarele caracteristici tehnice:
 arhitectura orientată pe acumulator;
 4 kocteţi memorie de program (ROM) on-chip (nu şi pentru 8031);
 128 kocteţi memorie de date (RAM) on-chip;
 memoria ROM şi RAM cu mecanisme de adresare diferite;
 adresabilitate de până la 64kB atât pentru RAM, cât şi pentru memoria de program,
prin extensii de memorie în afara cipului;
 4 bancuri de regiştri în memoria RAM (regiştri RAM);
 flaguri definite prin software de către utilizator;
 32 linii de I/O organizate ca 4 porturi de 8 biţi (la 8031 - 6 linii I/O);
 port serial multi-mod de mare viteză;
 timer/numărător de 16 biţi cu două moduri de funcţionare;
 logica de tratare a întreruperilor cu două nivele de priorităţi;
 stiva internă pentru stocarea datelor şi pentru apelurile de subrutină;
 multiplicator şi divizor hardware ce execută operaţiile în 4 microsecunde;
 detecţie a depăşirilor la bitul de semn şi calcul de paritate;
 set extins de instrucţiuni (comparativ cu setul MCS-48);
 adresabilitate directă pe octet şi bit;
 aritmetica zecimală şi binară;
 operaţii logice la nivel de bit (Boolean Operations);
 compatibilitate cu familia MCS-48;
 un ciclu de instrucţiune de o microsecundă la o frecvenţă a ceasului de 12 MHz;
 alimentare la Vcc = +5V.

Diferenţele între reprezentanţii familiei MCS-51 constau în tipurile de memorie de


program (ROM/EPROM) cu care sunt prevăzute:
Page 1 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

- 8751 are 4kocteţi „UV-EPROM” (programabil cu ultraviolete);


- 8051 are 4kocteţi „mask-programmed ROM” (programabil prin mascare);
- 8031 nu are memorie de program on-chip, dar permite adresarea unei memorii
externe ROM de până la 64kocteţi.

2.2. Arhitectura microcontrolerului Intel 8051


În figura 1 sunt prezentate elementele constitutive ale microcontrolerului şi anume:
 Unitatea Centrală de Prelucrare (UCP);
 Memoria internă (RAM + ROM);
 Porturi de I/O;
 Registrele de configurare (cu sufixul CON), de mod (cu sufixul MOD) şi stare;
 Logica de comandă şi control.
Toate unitățile funcționale sunt conectate la o magistrală internă pe 8 biți (INTERNAL
BUS). Această magistrală este conectată cu exteriorul prin porturi de I/O, atunci când se dorește
extinderea capacității de memorie sau I/O în exterior. Conectarea memoriei ROM la busul intern
se face cu amplificatoare de sens unic (SENSE AMPS). IR (Instruction Register) reprezintă
registrul în care se încarcă instrucţiunea din memoria program, iar PLA (Programmable Logic
Array) este decodorul pentru instrucţiune (notate cu RI şi, respectiv, DI, în Figura 1).

Unitatea Centrală de Prelucrare (UCP)


Elementele de bază ale UCP sunt: UAL pe 8 biţi cu regiştri de 8 biţi, acumulatorul (A),
registrul de date suplimentar (B), registrul indicatorilor condiţionali (PSW) şi regiştrii cu funcţii
speciale: SP – Stack Pointer (Indicator de stivă), PC – Program Counter (Numărător de program)
şi DC - Data Counter (Numărător de date).
Funcţiile de calcul ale UAL sunt:
- execuţia operaţiilor aritmetice (adunări, scăderi, înmulţiri, împărţiri pe 8 biţi) şi logice
(AND, OR, XOR, rotaţii, complementări, etc.);
- ia decizii pe baza stării flagurilor (indicatorilor) la operaţiile de salt condiţionat;
- calculează adresa operanzilor;
- permite combinarea automată a operaţiilor simple pentru a obţine instrucţiuni complexe,
cum ar fi incrementarea sau compararea unor date pe 16 biţi.
O caracteristică deosebit de importantă este capacitatea UAL de a opera cu date pe 1 bit
(aşa numitul procesor boolean) care reprezintă un avantaj major în cazul operaţiilor în care

Page 2 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

intervin variabile cu două stări ca în cazul manipulării comenzilor numerice care pot avea doar
două niveluri: 0 sau 1.
În concluzie UAL poate opera cu date pe 1, 8 şi 16 biţi.

P2 LATCH
R

PORT 2
128 x 8 4k x 8 PCH DPH
A
RAM ROM
R PCL DPL

P0 LATCH

RAM BUFFER SENSE AMPS


P1 LATCH
PORT 1

INTERNAL BUS

IR
A
PLA

TMP1 TMP2 B
CONTROL

P
S ALU
W SP

INTERNAL BUS

TCON IE
P0 LAT CH SCON IP P3 LAT CH
TMOD
PORT 0 SBUF INTERRUPT PORT 3
TL0
SBUF CONTROL
TH0
SERIAL PORT TL1
TH1
TIMER CONTROL

Figura 1 – Schema bloc a microcontrolerului 8051

Acumulatorul şi PSW
Arhitectura lui 8051 este orientată pe acumulator. Acumulatorul (A) conţine unul din
operanzi, iar după execuţia operaţiei conţine rezultatul. El este folosit la unele operaţii de transfer

Page 3 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

de date fiind utilizat obligatoriu la operaţii de transfer cu memoria RAM externă, la rotaţii, calcul
al parităţii, test cu zero, etc.
Deşi arhitectura este bazată pe acumulator există instrucţiuni de transfer la care sursa
poate fi orice locaţie din memoria internă, iar destinaţia poate fi orice registru sau locaţie de
memorie, regiştrii pot fi încărcaţi cu o constantă, ş.a.m.d..
Registrul PSW (Program Status Word) conţine câţiva biţi de stare (indicatori
condiţionali) care reflectă starea curentă a UCP. Indicatorii condiţionali sunt afectaţi de execuţia
unor instrucţiuni. Registrul PSW trebuie salvat prin program înainte de servirea rutinelor de
cerere de întrerupere alături de PC şi DP:

MSB LSB
P - OV RS0 RS1 F0 A C
7 6 5 4 3 2 1 0
C- flag (indicator) de transport setat hard/soft de anumite instrucţiuni logice şi
aritmetice.
A- flag (indicator) de transport auxiliar indică transport sau împrumut la/de la nibbel-
ul superior.
F0- flag (indicator) definit de utilizator.
R0, R1- biţi de selecţie a celor 4 bancuri de registre din RAM; setaţi sau resetaţi
software.
OV- flag (indicator) de depăşire a capacităţii de reprezentare.
P- flag (indicator) de paritate.

Regiştrii de uz general
Microcontrolerul foloseşte patru bacuri de regiştri situaţi în memoria RAM, fiecare banc
conţinând 8 regiştri, notaţi R0 ÷ R7. La un moment dat procesorul lucrează doar cu registrele din
bancul de memorie curent. Instrucţiunile care adresează registrele folosesc 3 biţi pentru
specificarea registrului.

Regiştrii speciali
În memoria internă, în zona de adrese 80H÷FFH, este definită o arie de regiştri cu funcţii
speciale (SFR – Special Function Registers). O parte din adrese sunt rezervate pentru dezvoltări
ulterioare. Unele dintre registre permit accesarea pe bit, iar altele doar pe octet. Câteva dintre
aceste registre sunt:
Page 4 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

 Registrul B este un registru de 8 biţi care este utilizat împreună cu acumulatorul


în operaţii de împărţire şi înmulţire. El conţine al doilea operand, iar după execuţia instrucţiunii,
cei 8 biţi mai semnificativi ai rezultatului înmulţirii, respectiv restul pentru împărţire (câtul se
găseşte în acumulator).
 PSW este registrul de stare al procesorului.
 SP (Indicatorul de stivă) este un registru pe 8 biţi care indică prima locaţie
ocupată din vârful stivei. Stiva care poate avea maxim 128 octeţi. La iniţializare SP se încarcă cu
adresa 7 astfel că stiva creşte de la locaţia 8 din RAM. Prin modificarea conţinutului SP, după
inițializare, stiva poate fi localizată în orice zonă a memoriei RAM.
 Registrul DP (Data Pointer) de 16 biţi serveşte ca registru de adresare pentru
adresa de bază la executarea salturilor indirecte, la instrucţiunile de adresare a tablourilor, la
instrucţiunile de transfer cu memoria externă. El poate fi folosit atât pe 8 biţi (se folosesc cele 2
jumătăţi: Low şi High), cât şi ca registru de 16 biţi existând instrucţiuni speciale care încarcă şi
incrementează toţi cei 16 biți odată, astfel încât tablourile pot fi localizate oriunde în memorie.
 Registrul PC (16 biţi) este contorul de instrucţiuni. Poate fi folosit şi pe 8 biți. El
adresează instrucțiunile din memoria ROM, fiind salvat automat în stivă la execuţia
instrucțiunilor de apel a subrutinelor şi la răspunsul la cererile de întreruperi, fiind incrementat
pentru a apela instrucțiunea următoare sau încărcat cu adresa de salt, la instrucţiuni de salt în
program.
 P0, P1, P2 şi P3 sunt patru registre buffer pentru porturile I/O corespunzătoare.
 SBUF (Serial Data Buffer – Registru de date al portului serial) este format din doi
regiştri buffer, folosiţi împreună cu portul I/O seria, unul pentru transmisie şi unul pentru
recepţie.
 TH0 (octet superior timer 0), TL0 (octet inferior timer 0), respectiv TH1 (octet
superior timer 1), TL1 (octet inferior timer 1) sunt registre folosite de modulele timer 0 şi timer
1.

2.3. Organizarea memoriei


Memoria de program (ROM) este separată de memoria de date având mecanisme de
adresare şi semnale de control diferite. Spaţiul de adrese este de 64 kocteţi atât pentru memoria
de program, cât şi pentru cea de date. Astfel memoria ROM are o magistrală de adrese de 16 biţi,
ea fiind adresată cu ajutorul PC (numărătorului de program).
Memoria RAM este adresată printr-o magistrală de adrese diferită de cea a memoriei
ROM, având 8 biţi, adresa fiind înscrisă în registrul de adresare RAM (RAR), care este tot un
Page 5 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

registru de 8 biţi. Memoria RAM internă pentru date are capacitatea de 128 sau de 256 octeți.
Atât memoria RAM, cât şi memoria ROM pot fi extinse în exterior până la 64 Kocteţi (memorie
internă + memorie externă), situaţie în care există o singură magistrală de adrese de 16 biţi, o
singură magistrală de date de 8 biţi, dar semnale de control diferite pentru cele două memorii.

Memoria externă pentru programe (ROM/RAM) este selectată cu semnalul PSEN (Program

Store Enable - activ low), iar memoria pentru date (RAM) este citită activând semnalul RD şi

scrisă activând semnalul WR . Pentru accesarea memoriei de program se folosesc adrese de 16


biţi, iar pentru accesarea memoriei de date adresele au 8 sau 16 biţi.
În unele aplicaţii execuţia programelor din acelaşi spaţiu de memorie în care se află şi
datele. Pentru accesarea spaţiului de memorie comun este sintetizat un semnal de comandă

comun trecând semnalele PSEN şi RD printr-o poartă ŞI ca în figura 2.


Cel de al treilea spaţiu de adrese include regiştrii cu funcţii speciale: B, SP, PSW, DP,
regiştrii de configurare a porturilor de I/O, timerelor şi a altor dispozitive periferice. Pentru
uniformitate acumulatorul (A) se include şi el în acest spaţiu de adrese.

8051 WR MEM WR

RD
MEM RD
PSEN

Figura 2 – Generarea semnalelor de citire/scriere pentru memoria externă

Deşi adresa de referire a locațiilor din memoria RAM internă este de 8 biți, de fapt se pot
adresa 384 octeți prin utilizarea unei adresări fizice diferite în cazul modurilor de adresare
directă şi indirectă. Astfel, pentru adresele logice mai mari de 7FH, în cazul adresării directe
vom avea un bloc de memorie de 128 octeți diferit de cel cu aceeași adresă, dar cu un mod de
adresare indirect. Regiştrii SFR constituie zona de memorie, cu adrese logice mai mari de 7FH,
care este adresată direct. Pentru un mod de adresare indirect şi o adresă mai mare de 7FH vor fi
adresate locații din RAM-ul intern.
Datorită faptului că memoria este împărțită în zone on şi off-chip, programatorul vede
un singur spațiu logic de memorie, fiindu-i invizibilă împărţirea memoriei în arii interne şi
externe.

Page 6 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

2.4. Sistemul de interfețe de I/O


Structura sistemului de interfețe de intrare/ieșire (I/O) şi de dispozitive periferice
încorporate deosebește microcontrolerele de celelalte tipuri de microprocesoare. Ea este specifică
aplicaţiilor de tip industrial (achiziție de date, operații de control şi reglare, măsură). Structura
porturilor este foarte versatilă. În cadrul aceleași familii de microcontrolere există versiuni cu
structuri diferite ale sistemului de I/O.

2.4.1 Porturile de I/O


Microcontrolerul 8051 conţine 4 porturi de I/O bidirecționale, de 8 biți fiecare (P0, P1, P2,
P3), care pot fi configurate prin program. Ele sunt folosite pentru extensia memoriei şi pentru
conectarea dispozitivelor periferice. Transferul datelor prin porturi se face sub controlul
programului.
Semnificația acestor linii de I/O este variabilă în funcţie de destinația porturilor. De
exemplu, pentru adresarea extensiilor de memorie portul P0 multiplexează magistrala de date şi
cea de adrese. La începutul ciclului de magistrală externă 8 biți ai adresei de date referite sunt
plasaţi la ieşirea portului P0, după care urmează transferul datei pe aceiaşi magistrală de 8 linii.
În cazul referirii unei date din memorie care necesită o adresă de 16 biţi, cei 8 biţi mai
semnificativi ai adresei sunt plasaţi la ieşirea portului P2, iar adresa de 16 biţi pentru memoria
externă fiind obţinută prin concatenarea ieşirilor porturilor P0 şi P2.
Cei 8 pini ai portului P3 sunt folosiți ca intrări/ieșiri de comandă cu semnificaţiile din
următoarea figură:
MSB LSB
RD WR T1 T0 INT1 INT0 TxD RxD
7 6 5 4 3 2 1 0
unde:
RD, WR → ieșiri pentru semnalele de comandă citire/scriere
T1/T0 → intrări pentru Timer/Numărător 1, respectiv 0, sau pini de test
INT1/INT0 → intrări pentru întreruperi active pe front sau palier negativ
TxD → linie de transmisie serială pentru P3 configurat în modul UART
RxD → linie de recepție serială pentru P3 configurat în modul UART
Fiecare linie a porturilor este prevăzută cu circuite bistabile de tip D (circuite latch)
conectate între pinul extern şi magistrala internă a procesorului. La comanda internă de „citire
din circuitul bistabil de tip D” a procesorului, conţinutul este depus pe magistrala internă, iar la
comanda de „citire a stării pinului” pe magistrală este depusă starea pinului. Unele instrucțiuni
Page 7 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

care execută citiri de la un port activează semnalul „citire din circuitul bistabil de tip D”, iar
altele activează semnalul „citire pin”.
Exemple de instrucțiuni care execută citirea datelor din circuitul bistabil de tip D:
ANL (ŞI logic între acumulator şi datele de la un port, exemplu: ANL P1,A)
ORL (SAU logic între acumulator şi datele de la un port)
XRL (SAU EXCLUSIV logic între acumulator şi datele de la un port)
JBC (salt, dacă pe o linie a unui port este un bit 1, exemplu: JBC P1.3, LABEL)
CPL (complementează bitul din circuitul bistabil de tip D asociat portului,
exemplu: CPL P3.1)
INC (incrementează conținutul circuitul bistabil de tip D asociat portului,
exemplu: INC P3)
DEC (decrementează conținutul circuitul bistabil de tip D asociat portului)
DJNZ (decrementează conținutul circuitul bistabil de tip D şi execută salt dacă nu
este zero, exemplu: DJNZ P2,LABEL)
MOV PX,Y,C (mută bitul de transport C pe poziţia bitului Y al portului X)
CLR PX,Y (resetează bitul Y al portului X)
SETB PX,Y (setează bitul Y al portului X)

2.4.2. Timerele
Microcontrolerele din familia MCS-51 au două circuite de temporizare/numărare
(Timer/Counter), programabile, multi-mod, de 16 biţi fiecare, denumite generic Timer 0 şi
Timer 1. Registrul TMOD (control mod timer 0 şi 1) selectează modul de lucru al circuitului, iar
registrul TCON (control timere 0 şi 1) controlează funcţionarea timer-ului.
Registrul de 8 biţi TMOD conţine 4 biţi de configurare pentru fiecare timer/numărător:
bit GATE =1 Timer/Numărător este activat, atunci când INTx şi TxR sunt setate;
=0 Timer/Numărător este activat, atunci când TxR este setat.
bit C/T - face selecţia modului de lucru: timer sau numărător.
biţii M0/M1 - configurează modul de numărare al circuitului (cu sau fără reîncărcare
automată la depăşire, timer pe 8 sau 16 biţi, timer oprit)
Registrul de 8 biţi TCON conţine câte 4 biţi de control pentru fiecare timer/numărător:
bit TF - timer flag (indicator) – este setat hard ori de câte ori se înregistrează o
depăşire la numărare; el este resetat când se execută rutina de tratare a
întreruperii de depăşire.
bit TR - timer run - setat/resetat prin program pentru a opri sau porni circuitul.
Page 8 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

bit IE - setat la detecția unei cereri de întrerupere externă. Activ pe front sau
palier negativ. Resetat la execuția rutinei de tratare a întreruperii.
bit IT - specifică dacă semnalul de cerere de întrerupere externă este activ pe
front sau palier negativ.
Circuitul, configurat ca timer, poate măsura (prin numărare) intervale de timp, poate
determina lărgimea unor impulsuri, poate furniza semnale de comandă, cu o rezoluţie de o
microsecundă. Configurat ca numărător el poate acumula într-o structură FIFO evenimente
externe cu o precizie de reprezentare de 16 biţi şi cu o frecvenţă de până la 500kHz. Evenimentul
este memorat prin momentul său de producere, echivalent cu o valoare a numărătorului pe 16
biţi.

2.4.2. Interfaţa de comunicaţie serială


Este o interfaţă de comunicaţie serială ce permite transmisia şi recepţia serială, full-
duplex, cu sau fără bit de paritate, cu rate de la 110 baud  31 kbaud. Circuitul este programabil
în 4 variante de funcţionare:
- registru de deplasare pentru extensia dispozitivelor de I/O.
- UART de 8 biţi.
- UART de 9 biţi (8 biţi date + 1 bit de paritate).
- legătura de comunicaţie interprocesor în sisteme distribuite la viteza de 187 kbaud.
Registrul SCON conţine biții de selecție a celor 4 moduri de lucru, bitul de întrerupere la
transmisie, setat hard când se transmite un octet şi bitul de întrerupere la recepție, setat hard la
primirea unui octet.
Registrul SBUF reprezintă de fapt două buffere utilizate pentru înscrierea datei ce
urmează a fi transmisă serial, respectiv pentru citirea datei recepţionată serial.

2.4.3. Logica de tratare a întreruperilor


Sursele care pot cere întreruperi sunt în număr de 5 din care: una de la interfaţa de
comunicaţie serială care cere întrerupere la transmisie şi recepţie, două de la timere când se
depăşeşte capacitatea de numărare şi două de la intrările INT0/1 unde se primesc cereri de
întrerupere externe. Toate întreruperile sunt mascabile. Există două nivele de priorităţi la tratarea
întreruperilor. Registrul IE (Interrupt Enable = Control activare întreruperi) conţine biţii de
mascare, iar registrul IP (Interrupt Priority = Control priorităţi întreruperi) stabileşte priorităţile
pentru fiecare sursă de întreruperi. Întreruperile sunt vectorizate, pentru fiecare sursă de

Page 9 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

întrerupere existând o rutină de tratare a întreruperii care începe de la o adresă conţinută în


vectorul de întrerupere predefinit.

2.5. Exemple de conectare a microcontrolerului la extensiile de memorie şi


dispozitive de I/O
Conectarea cu memoria ROM externă se realizează astfel: semnalul de selecţie a

memoriei ROM externă este PSEN care este activat doar în cazul conectării microcontrolerului
la memoria externă. Pe durata aducerii instrucțiunilor din memoria program externă, porturile P0
şi P2 sunt dedicate realizării magistralelor de adrese şi de date. Portul P0 implementează o
magistrală de date şi adrese multiplexată. P0 transmite partea mai puţin semnificativă a
numărătorului de program PC (PCL), furnizând octetul mai puţin semnificativ al adresei
instrucțiunii din memoria program externă. După transferul adresei, P0 este configurat ca
magistrală de date. În momentul în care PCL este valid la ieşirea portului P0, semnalul ALE
(Address Low Enable) transmite comanda de încărcare a PCL în circuitul bistabil de tip D
(basculant bistabil) care face demultiplexarea magistralei de la portul P0. Simultan se generează
la ieşirea portului P2 PCH astfel încât la ieşirea circuitului basculant bistabil şi portului P0 se
găseşte adresa instrucțiunii care urmează a fi extrasă din memoria program externă. Apoi se

generează semnalul de strobe (selectare) pentru memoria externă PSEN care comandă citirea
instrucțiunii, transferată pe liniile portului P0.
Conectarea cu memoria RAM externă presupune folosirea portului P0 ca magistrala de
date şi adrese multiplexat şi două variante de generare a adresei. Prima variantă implică o adresă
formată dintr-un octet generat la ieşirea portului P0 şi încărcat sub comanda semnalului ALE în
circuitul basculant bistabil de demultiplexare, la care se adaugă 3 biţi de selecţie a paginii de
memorie externă generaţi prin portul P2. În acest fel se pot adresa 8 pagini de dimensiune 256
octeţi. A doua variantă presupune generarea unei adrese pe 16 biţi cu partea mai puţin
semnificativă pe liniile portului P0 (la ieşirea circuitului basculant bistabil de demultiplexare) şi
partea mai semnificativă pe liniile portului P2. În ambele cazuri semnalele de comandă

citire/scriere sunt semnalele RD / WR de la microcontroler, iar transferul datei se face, după


stabilirea adresei, pe liniile portului P0 care devine port de transfer de date.
Extensia circuitelor de I/O care pot fi controlate de 8051 se face conectând
microcontrolerul la un circuit dedicat extensiei dispozitivelor de I/O (circuitul I8243). Spre
deosebire de Intel 8048, microcontrolerul Intel 8051 nu dispune de instrucțiuni speciale de
interfațare cu Intel 8243, protocolul de comunicație putând fi implementat software.
Page 10 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

8051 EPROM

P1 P1 P0 INSTR.

EA
LATCH

P3 P3
ALE

P2
} ADDR

PSEN OE

8051 EPROM
cu ROM intern
P1 P0

Vcc LATCH
EA

RD
} P3
ALE

P2
} } ADDR

WR I/O
WE OE
Biti de
selectie
pagina

8051

8234 4
P2.7 P4
P2.6 } Intrari
P2.5 CS 4
P2.4 PROG P5

4
P2.3 P23 P6
P2.2 P22
P2.1 P21 4
P20 P7
P2.0

fig. 4 Exemple de expandare a resurselor microcontrolerului


8051

Page 11 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

2.6 Funcţionarea cu consum redus de energie


Microcontrolerul 8051 are două moduri de operare cu consum redus: modul inactiv
(IDLE) şi modul cu tensiune scăzută (POWER DOWN). În modul IDLE oscilatorul rămâne în
funcţiune, dar procesorul nu execută nici o instrucţiune. Timerele şi portul serial funcţionează şi
orice întrerupere de la ele produc revenirea la funcţionarea normală. Starea internă (numărătorul
de program, indicatorul de stivă, conţinutul registrelor, etc.) este păstrată.
În modul POWER DOWN oscilatorul intern este oprit şi toate funcţiile sunt oprite. Sunt
păstrate doar datele din RAM şi din registrele interne. Ieşirea din această stare este realizată prin
activarea intrării RESET. Modurile de lucru cu consum redus pot fi activate prin setarea unor biţi
de control din registrul SFR PCON:
PD - bit pentru modul de lucru POWER DOWN;
IDL - bit pentru modul IDLE.

2.7. Setul de instrucţiuni şi modurile de adresare a datelor


2.7.1. Setul de instrucţiuni
Setul de instrucţiuni al 8051 este destul de regulat, în sensul că majoritatea instrucţiunilor
pot opera cu variabile din spaţii de adrese fizice sau logice diferite. El a fost proiectat astfel încât
să fie eficient ca dimensiune a codului şi ca viteză de execuţie. Instrucţiunile sunt codate cu 1÷3
octeţi. Practic toate instrucţiunile se execută în unul sau doi cicli maşină (1 sau 2 µsec la un tact
de 12MHz); doar două instrucţiuni (MUL, DIV ) sunt executate în patru cicli.
Setul de instrucţiuni cuprinde 111 instrucţiuni: 49 de un octet, 45 de doi octeţi şi 17 de
trei octeţi. Instrucţiunile pot fi grupate în 4 categorii:
 Instrucţiuni pentru transferul datelor
MOV - transferă bit sau octet de la o locaţie sursă la o locaţie destinaţie
PUSH - incrementează SP şi transferă octet de la sursă în stivă la adresa dată de SP
POP - transferă un octet de la adresa dată de SP la o destinaţie şi decrementează SP
XCH - schimbă conţinutul acumulatorului cu conţinutul variabilei indicate care
poate fi adresată direct sau indirect cu registru
XCHD - schimbă semicuvântul inferior din acumulator (biţii 3÷0) cu cel al unei locaţii
de memorie RAM internă adresată indirect cu un registru specificat
MOVC- încarcă acumulatorul cu un octet de cod sau cu o constantă din memoria
de program
MOVX- transferă un octet între acumulator şi memoria externă de date
MOV DPTR, #data - încarcă data imediată de 16 biţi în registrul dublu DPTR.
Page 12 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

 Instrucţiuni pentru operaţii aritmetice


INC - incrementează operandul cu 1
DEC - decrementează un operand cu 1
ADD - adună la acumulator operandul sursă
ADDC - adună la acumulator opeandul sursă împreună cu transportul din CY
DAA - corecţia zecimală a rezultatului adunării operanzilor zecimali reprezentaţi în
cod BCD
SUBB - scădere a unui operand din acumulator împreună cu împrumutul
MUL - execută înmulţirea fără semn a operandului din acumulator cu operandul din
registrul B. Rezultatul pe 16 biţi este în B (high byte) şi A (low byte)
DIV - execută împărţirea fără semn a conţinutului acumulatorului la conţinutul
registrului B. Rezultatul este în regiştrii A (câtul) şi B (restul)
 Instrucţiuni pentru operaţii logice
CLR - resetează toţi biţii din A sau orice bit adresabil direct
SETB - setează orice bit adresabil direct
CPL - complementează conţinutul lui A, fără a modifica PSW
RL - rotaţie stânga a acumulatorului cu un rang
RLC - rotaţie stânga a acumulatorului prin CY
RR - rotaţie dreapta a acumulatorului
RRC - rotaţie dreapta a acumulatorului prin CY
SWAP - inversează semiocteţii în A
ANL - SI-logic pe octet
ORL - SAU-logic pe octet
XRL - SAU EXCLUSIV-logic pe octet
 Instrucţiuni de control
- Apeluri şi salturi necondiţionate:
ACALL - instrucţiune de apel a unei subrutine atunci când adresa de salt este cuprinsă în
2K ai paginii curente. Câmpul de adresă de 11 biţi ai instrucţiunii este
concatenat cu cei mai semnificativi 5 biţi din PC
LCALL - instrucţiune de apelare care poate specifica oricare adresă din spaţiul
memoriei de 64K
RET - transferă controlul la adres de revenire salvată în prealabil în stivă şi
decrementează apoi SP cu 2
AJMP - salt necondiţionat la o adresă din spaţiul 2K, analog cu ACALL
Page 13 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

LJMP - salt necondiţionat la o adresă din spatiul 64K, analog cu LCAL


SJMP - salt necondiţionat scurt în cadrul a 256 octeţi
- Salturi condiţionate:
JZ - salt dacă toţi biţii din A sunt 0
JNZ - salt dacă A cel puţin un bit din A este 1
JC - salt dacă CY este 1
JNC - salt dacă CY este 0
JB - salt dacă bitul specificat este 1
JNB - salt dacă bitul specificat este 0
JBC - salt dacă bitul adresat este 1 şi apoi şterge acest bit
CJNE - decrementează operandul sursă şi pune rezultatul la operandul destinaţie; salt
dacă rezultatul nu este zero
RETI - la fel ca RET, dar activează şi întreruperile

2.7.2 Modurile de adresare a datelor


Microcontrolerul acceptă operanzi de tip bit sau octet şi foloseşte următoarele moduri de
adresare a datelor:
a) Adresare de tip registru
Utilizatorul are acces la 4 bancuri de câte 8 regiştri (notaţi R0÷R7) de 8 biţi, situaţi la
începutul memoriei RAM (0-1FH), fiecare banc fiind selectat de biţii RS1, RS0 din PSW. La un
moment dat UCP are acces la un singur banc de regiştri, selecţia registrului vizat facându-se cu
cei mai puţini semnificativi 3 biţi din codul instrucţiunii. Se pot forma astfel instrucţiuni de un
octet. De exemplu, realizarea operaţiei de adunare a registrelor R0 şi R1 şi încărcarea rezultatului
în acumulator poate fi realizată cu secvenţa:
MOV A,R0
ADD A,R1

În limbajul de asamblare 8051, acest mod de adresare este specificat prin utilizarea
simbolurilor de forma Rn (cu n = 0 ÷7) sau prin nume simbolice definite anterior ca registre cu
directive de tip EQU sau SET.
b) Adresare directă (tip octet)
Permite adresarea directă a oricăror locaţii de memorie, porturi I/O sau registre hardware.
În formatul instrucţiunii, octetul care urmează după octetul de cod al operaţiei specifică adresa
locaţiei de memorie sau registrul vizat. Un octet suplimentar adăugat codului instrucţiunii
specifică locaţia folosită. Funcţie de valoarea celui mai semnificativ bit al acestui octet este
Page 14 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

selectat unul din două spaţii fizice de memorie. Dacă adresa directă este între 0 şi 127 (00-7FH)
este utilizat RAM-ul intern. Dacă varianta de microcontroler compatibil 8051 are mai mult de
128 de octeţi de RAM local (aşa cum se întâmplă la 8052 şi la majoritatea derivatelor recente),
doar primii 128 octeţi pot fi adresaţi direct, restul adreselor de memorie RAM pot fi adresate
doar indirect cu R0 sau R1 ca pointer sau prin intermediul indicatorului de stivă (SP).
De exemplu, secvenţa:
MOV A,30h
ADD A,40h
MOV 40h,A
adună conţinutul locaţiilor de adresă 30H şi 40h din RAM şi transferă rezultatul în RAM la
adresa 40h.
Toate porturile I/O şi registrele speciale au asignate adrese în intervalul 128-255 (80H-
0FFH). Când adresa directă utilizată este în aceste limite se accesează registrele corespunzătoare
din SFR. Adresarea directă permite ca toate registrele cu funcţii speciale să fie citite, scrise sau
utilizate ca operanzi. În general aceasta este singura metodă folosită pentru accesarea porturilor
I/O şi a regiştrilor speciali. Dacă adresarea directă este folosită cu alte adrese decât cele
predefinite în lista de registre speciale ale microcontrolerului rezultatul instrucţiunii este
nedefinit.
c) Adresare de tip registru indirect
Acest mod este destinat în esenţă manipulării variabilelor a căror adresă fizică (locaţie
RAM) este determinată, calculată sau modificată dinamic. Situaţia apare atunci când se
manipulează adrese de memorie în secvenţă, intrări indexate din tabele aflate în RAM, la operaţii
cu precizie extinsă (format de reprezentare pe mai mult de un octet) sau la operaţii cu şiruri.
Pentru adresarea memoriei externe pentru date 8051 utilizează două feluri de adresare indirectă.
Primul mod foloseşte registrele R0 şi R1 din bancul curent pentru generarea unei adrese de 8 biţi
care este transferată pe portul P0, adresă suficientă pentru adresarea porturilor I/O sau pentru arii
mici de memorie RAM. Al doilea mod foloseşte o adresă indirectă de 16 biţi furnizată de
registrul DPTR cu care procesorul poate accesa o memorie de date de până la 64 kocteţi. În
limbajul de asamblare 8051 adresarea indirectă este identificată prin simbolul (prefixul) "@"
urmat de R0 sau R1 sau un simbol asignat anterior acestora.
În limbajul de asamblare al procesorului I-8051 adresarea indirectă este reprezentată cu
@, ca în exemplul următor:
MOV A,@R0
ADD A,@R1

Page 15 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

d) Adresare imediată
Atunci când operandul sursă este o constantă şi nu o variabilă (instrucţiunea foloseşte o
valoare cunoscută în momentul asamblării), constanta respectivă poate fi încorporată
instrucţiunii prin utilizarea unui octet suplimentar. Valoarea respectivă nu mai poate fi
modificată pe parcursul executării programului. Identificarea adresării directe a operandului se
face cu ajutorul prefixului "#" (diez). Operandul poate fi un şir numeric, o valoare simbolică sau
o expresie aritmetică folosind constante (evaluată în momentul asamblării).
Data pe 8 biţi urmează octetului de cod al operaţiei. În limbajul de asamblare datele sunt
precedate de semnul #. De exemplu:
MOV A,#15
ADD A,#18
Modul de adresare este specificat în codul instrucţiunii. O instrucţiune poate folosi mai
multe moduri de adresare pentru operanzii sursă sau/şi destinaţie.

2.7.3 Programarea sistemelor cu microcontrolerul I-8051


Structura generală a unei linii de program scrisă în limbaj de asamblare este următoarea:
[eticheta:] mnemonic 8051 [operand1], [operand2] [;comentariu]
Eticheta este adresa simbolică a unei linii de program. Operanzii sunt de următoarele tipuri:
- simboluri speciale de asamblare (nume de registre, fanioane)
- simboluri ale programului (segment, extern, local, public)
- adrese indirecte
- adrese interne ale microcontrolerului
- adrese ale unor biţi semnificativi
- adrese de salt, etc.

Exemplu:
START: JMP MAIN ;instrucţiune de salt
LOOP: DJNZ R7,LOOP ;execuţie buclă
Folosirea etichetelor este obligatorie atunci când la adresele respective se fac referiri în
program.
Dezvoltarea aplicaţiilor cu microcontrolere presupune proiectarea părţii hardware şi a
părţii software. Pentru realizarea programelor proiectantul are la dispoziţie un ansamblu de
„instrumente” software:
- asamblorul – este programul care converteşte fişierul sursă, care este un fişier text
(ASCII), care conţine instrucţiunile microcontrolerului sub formă de mnemonice, în fişier obiect,
Page 16 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

respectiv într-un fişier care conţine codurile maşină corespunzătoare instrucţiunilor din cadrul
fişierului sursă;
- compilatorul – este programul care converteşte fişierul sursă scris într-un limbaj
evoluat, în fişier obiect;
- link-editorul – realizează cuplarea mai multor module de program memorate în fişiere
obiect distincte şi alocă zone de memorie necesare programelor şi variabilelor folosite de către
acesta. Link-editorul facilitează dezvoltarea structurată a programelor, precum şi realizarea unor
module de program ca aplicaţii distincte;
- convertorul OBJ-IntelHEX – realizează conversia din format obiect (OBJ) într-un
format care conţine: adresa de localizare, numărul de octeţi ai liniei respective, tipul datelor (cod
sau date), şirul de coduri, suma de control corespunzătoare tuturor informaţiilor liniei respective,
precum şi terminatorul de linie format din caracterele CR, LF;
- depanatorul (debugger) – permite execuţia pas cu pas, sau secvenţă cu secvenţă, a unui
program aflat în faza de testare cu scopul de a verifica corectitudinea funcţionării. În general,
acest program funcţionează cu un sistem de dezvoltare care dispune de un program monitor
(acesta este un program care accesează componentele de bază ale sistemului, respectiv memoria,
regiştrii, fanioanele);
- emulatorul – este programul care permite simularea funcţiilor şi a instrucţiunilor
microcontrolerului pe un alt sistem de calcul gazdă. El poate prezenta unele restricţii în special
legate de posibilitatea de simulare a întreruperilor. Acest program poate să funcţioneze atât pe un
calculator de uz general, gen PC, sau chiar pe microcontrolerul respectiv. În acest caz, sistemul
cu microcontroler trebuie să fie conectat la o consolă care poate fi chiar un calculator PC putând
astfel verifica şi executarea subrutinelor de întrerupere.
- mediul de simulare – este folosit pentru aplicaţii complexe, situaţie în care practic
sistemul care implementează aplicaţia este dezvoltat cu funcţii de depanare. El include atât
facilităţi software cât şi facilităţi hardware.

2.7.4 Exemple de folosire a instrucţiunilor


a. Utilizarea instrucţiunilor aritmetice ADD, ADDC, SUBB şi DA
Instrucţiunea ADD adună o variabilă de un octet cu acumulatorul, rezultatul fiind plasat
tot în acumulator. Flagul C(arry) este setat dacă apare depăşire (transport) de la bitul 7 şi resetat
în caz contrar. ADDC mai adună şi valoarea lui C la rezultatul anterior, în rest este identică cu
ADD. Instrucţiunea SUBB scade conţinutul variabilei pe un octet şi pe cel al lui C din
acumulator, plasând rezultatul în acumulator. Flagul C este utilizat ca semnalizare a unei cereri
Page 17 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

de împrumut („borrow") la operaţia de scădere, fiind setat corespunzător. Flagul AC (auxilliary


carry) este setat dacă apare transport de la bitul 3 (la nivel de semioctet inferior) pentru a fi
folosit de instrucţiunea DA.
Anomaliile legate de nerespectarea formatului de reprezentare în aritmetica complement
faţă de 2 sunt semnalizate prin intermediul flagului OV (overflow = depăşire). La nivel hard,
OV este setat atunci când apare transport de la rangul bitului 6 şi nu 7 (ca la C). Setarea sa, la
adunarea a doi întregi cu semn, indică apariţia unui rezultat negativ ca sumă a doi întregi pozitivi
sau o sumă pozitivă a doi întregi negativi. La utilizarea SUBB se indică un rezultat negativ la
scăderea unui număr negativ din unul pozitiv sau un rezultat pozitiv la scăderea unui număr
pozitiv din unul negativ.
Utilizarea flagurilor C sau OV permite implementarea aritmeticii cu precizie extinsă (pe
mai mult de un octet), în varianta fără semn (folosind C) sau cu semn în complement faţă de 2
(folosind OV).

Exemplu. Să se execute scăderea unui şir numeric adresat cu registrul R1, din şirul
adresat cu R0, şirurile având lungimea dată de registrul R2 şi să se facă verificara pentru
depăşire. Numerele sunt reprezentate în complement faţă de 2.
CLR C ; şterge borrow (cerere de
împrumut)
SUBSTR: MOV A,@R0
SUBS1: SUBB A, @R1 ; se scad poziţiile curente
MOV @R0, A
INC R0 ; actualizează pointeri
INC R1
DJNZ R2, SUBS1 ; buclare până termin toate poziţiile
JNB OV, OV_OK ; verific dacă a apărut depăşire
… ; aici rutina de tratare a depăşirii
OV_OK: ; ieşire corectă
RET

Adunarea zecimală (în cod BCD) este posibilă cu utilizarea instrucţiunii DA (Decimal
Adjust) împreună cu ADD şi/sau ADDC. Valoarea binară din acumulator rezultată prin adunarea
a două variabile (fiecare cu două cifre în format BCD împachetat cu 2 cifre BCD per octet) este
ajustată astfel încât să formeze două cifre BCD, fiecare de câte 4 biţi. Dacă biţii 3÷0 din
conţinutul acumulatorului codifică o valoare mai mare ca 9 sau dacă flagul AC este setat, se
adună 6 la acumulator producând astfel valoarea codificată corectă pe cei mai puţini
semnificativi 4 biţi (nibble inferior). Dacă flagul C este setat sau dacă valoarea codificată pe cei
mai semnificativi 4 biţi (nibble superior) depăşeşte 9, se adună 6 la aceasta. Flagul C rămâne
Page 18 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

setat dacă a fost iniţial setat sau este setat dacă apare depăşire (dacă suma este mai mare de 100).

Exemplu. Adunare în zecimal pe doi octeţi; Să se adune constanta 1234H (123410


reprezentat BCD) cu conţinutul regiştrilor R3 şi R2 care conţin o dată codată BCD pe 4 cifre.
BCDADD: MOV A, R2
ADD A, #34H
DA A ;execută corecţia rezultatului
MOV R2, A
MOV A, R3
ADDC A, #12H
DA A
MOV R3, A ;încarcă rezultatul în R3 şi R2
RET

b. Instrucţiunile de înmulţire şi împărţire MUL şi DIV


Instrucţiunea MUL AB realizează înmulţirea unor întregi fără semn pe 8 biţi conţinuţi
în acumulator şi în registrul B. Octetul inferior al rezultatului pe 16 biţi este în acumulator, iar
cel superior în B. Dacă octetul superior este nul, flagul OV este setat, în caz contrar este şters.
Instucţiunea DIV AB realizează împărţirea întregului fără semn din acumulator la
întregul fără semn din registrul B. Partea întreagă a câtului se plaseză în A, iar restul în B. Dacă
B a conţinut iniţial 00H, flagul OV este setat indicând o eroare de împărţire, altfel este şters.

Exemplu. Să se convertească numărul în binar din acumulator (reprezentat în cod binar cu


8 biţi) în format BCD împachetat pe 3 cifre; sutele vor fi memorate aliniat la dreapta în locaţia
SUTE, iar zecile şi unităţile vor fi memorate la adresa ZECUN.
SUTE EQU 21H ;variable pentru reprezentare rezultat
ZECUN EQU 22H ;idem
MOV B, #100 ;împart cu 100 pt. a determina
10

DIV AB ;nr. de sute (dat de partea întreagă)


MOV SUTE, A
MOV A, #10 ;împart restul la 10 pt. a determina
10

XCH A, B ;nr. de zeci rămase


DIV AB ;zecile în A, restul sunt unităţile
SWAP A ;schimbă între ei cei doi nibble ai acumulatorului
ADD A, B ;împachetez cifrele BCD în acumulator
MOV ZECUN, A
RET

c. Operaţii logice pe octet cu instrucţiunile ANL, ORL, XRL


Instrucţiunile menţionate realizează funcţiile logice AND, OR şi XOR între două
variabile pe un octet, rezultatul fiind plasat în variabila destinaţie. Flagurile nu sunt modificate.
Page 19 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

Aceste instrucţiuni pot utiliza aceleaşi moduri de adresare ca şi cele aritmetice, dar nu sunt
limitate numai la operarea prin intermediul acumulatorului. Octeţii adresaţi direct pot fi utilizaţi
ca destinaţie având ca sursă fie acumulatorul, fie o constantă.
Instrucţiunile sunt utile pentru ştergerea (ANL), setarea (ORL) sau complementarea
(XRL) a unuia sau a mai multor biţi din RAM, porturi sau regiştri speciali.

Exemplu. Pe cei mai puţin semnificativi 5 biţi (4-0) ai portului 1 să se plaseze un cod
(prezent în A) fără a afecta starea biţilor 7÷5 care au o altă utilizare.
OUT_PX: ANL P1,#11100000B ;şterge biţii P1.0÷P1.4
ORL P1,A ;setează biţii lui P1 corespunzători lui A
RET

d. Instrucţiuni de control a fluxului programului


Există trei variante de instrucţiuni de salt necondiţionat, ele diferind prin dimensiunea
codului instrucţiunii şi prin restricţiile impuse adresei de destinaţie (adresa salt):
LJMP (Long Jump) - codifică adresa de salt pe 16 biţi în octeţii 2 şi 3 ai instrucţiunii; în
consecinţă destinaţia saltului poate fi oriunde în spaţiul total de 64K al memoriei de program.
AJMP (Absolute Jump) - adresa de salt este codificată cu 3 biţi (11-8) în octetul care
conţine şi codul instrucţiune, plus 8 biţi (7-0) într-un octet suplimentar, biţii cei mai semnificativi
ai adresei (15-12) se iau din valoarea (incrementată) contorului program (PC); poate fi utilizat
doar dacă destinaţia este în interiorul aceluiaşi bloc de memorie program, de dimensiune maximă
2K.
SJMP (Short Jump) - destinaţia este specificată ca o adresă relativă (offset) faţă de
valoarea curentă a PC-ului, codificată în al doilea octet al instrucţiunii; offsetul este o valoare cu
semn pe 8 biţi, astfel încât plaja în care poate avea loc saltul este +127 sau -128 faţă de valoarea
curentă (incrementată) a PC.
Majoritatea asambloarelor 8051 recunosc o mnemonică generică „JMP"
(pseudoinstrucţiune salt necondiţionat) care este translatată automat în instrucţiuni maşină LJMP,
AJMP sau SJMP în funcţie de adresa de destinaţie. Toate instrucţiunile de salt condiţionat
utilizează o adresare relativă, analog lui SJMP.
JZ (Jump on Zero) şi JNZ (Jump on Not Zero) testează valoarea acumulatorului ca
nulă sau nenulă (deşi în PSW nu există un flag Zero!), iar JC (Jump on Carry) şi JNC (Jump
on Not Carry) starea flagului C, fiind toate instrucţiuni pe doi octeţi.
JB (Jump on Bit), JNB (Jump on Not Bit) şi JBC (Jump on Bit and Clear) pot testa
starea oricărui bit adresabil sau pin (de port), fiind instrucţiuni pe trei octeţi (octetul 2 specifică
Page 20 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

bitul testat, iar octetul 3 offsetul), ultima (JBC) realizând şi ştergerea necondiţionată a bitului
testat.
Există două instrucţiuni de apel subrutină: ACALL (Absolute Call) şi LCALL (Long
Call). Ambele incrementează PC până la adresa următoarei instrucţiuni, salvează în stivă această
valoare (octetul inferior primului) care va reprezenta adresa de întoarcere. Adresa de start a
subrutinei este codificată analog instrucţiunilor de salt AJMP şi LJMP, de unde rezultă şi
aceleaşi domenii pentru adresa de start (început) a subrutinei faţă de punctul de apelare.
Majoritatea asambloarelor 8051 recunosc o mnemonică generică „CALL" (o
pseudoinstrucţiune) care este translatată automat în instrucţiuni maşină LCALL sau ACALL în
funcţie de adresa de start a subrutinei.

e. Instrucţiuni de tip „operaţie şi salt condiţionat" (Operate and branch)


CJNE (Compare and Jump if Not Equal) realizează compararea valorilor întregi ale
sursei şi destinaţiei (de un octet) şi execută un salt în caz de inegalitate. Instrucţiunea are trei
operanzi: destinaţie, sursă şi adresă de salt. Flagul C este modificat după regula de la scădere
(setat dacă valoarea întreagă a sursei este mai mică decât cea a destinaţiei, şters în caz contrar),
iar cei doi operanzi nu sunt modificaţi

Exemplu. Să se implementeze o funcţie analoagă celei realizate de o instrucţiune de tip


„Case" (în Pascal) sau „Switch" (în C) cu ajutorul instrucţiunii CJNE; se vor filtra (selecta)
caracterele tipăribile (codurile ASCII), ele fiind destinate afişării pe un dispozitiv periferic
oarecare (prin intermediul rutinei PRINTC); caracterele care nu au un corespondent alfanumeric
sunt tratate cu rutine dedicate; caracterul care trebuie testat este disponibil în registrul general
R7.
CHAR EQU R7
INTERP: CJNE CHAR,#7FH,INTP_1
; ..... rutina de tratare cod DEL (ştergere)
INTP_1: CJNE CHAR,#07H,INTP_2
; ..... rutina de tratare cod BELL (sonerie)
INTP_2: CJNE CHAR,#0AH,INTP_3
; ..... rutina de tratare cod LFEED(schimbă linia)
INTP_3: CJNE CHAR,#0DH,INTP_4
; ..... rutina de tratare cod CR (întoarce carul)
INTP_4: CJNE CHAR,#1BH,INTP_5
; ..... rutina de tratare cod ESC (revenire)
INTP_5: CJNE CHAR,#20H,INTP_6
; ..... rutina de tratare cod SPACE (spaţiu)
INTP_6: JC PRINTC ; salt dacă cod>20H
MOV CHAR,#0 ; inserează cod NULL
Page 21 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

PRINTC: ..... rutina de tratare tipărire standard


RET

Instrucţiunea DJNZ (Decrement and Jump on Not Zero) realizează decrementarea


operandului şi execuţia saltului când rezultul decrementării este nenul.

Exemplu. Să se genereze o întârziere software (bazată pe cunoaşterea apriori a timpului


de execuţie al unor instrucţiuni) cu DJNZ; se generează un impuls de durată controlabilă (de
valoare „1") pe pinul de port corespondent lui PULS (definit anterior).
SETB PULS ;setează PULS=1
MOV R2, #50 ;încarcă R2 cu contorul de durată a pulsului
DJNZ R2, $ ;execută repetat instrucţiunea curentă (semnul $)
CLR PULS ;resetează PULS=0

f. Operaţii cu stiva cu instrucţiunile PUSH şi POP


Instrucţiunea PUSH incrementează valoarea indicatorului de stivă (SP), apoi transferă
conţinutul variabilei octet în locaţia de RAM internă adresată de SP. Reciproc, instrucţiunea
POP copiază conţinutul locaţiei RAM adresată de SP în variabila octet şi apoi decrementează
SP.
Adresarea stivei se face cu aceleaşi reguli ca la modul registru indirect, prin intermediul
ei putând fi accesate deci şi locaţii RAM cu adrese mai mari de 128 (80H). O utilizare tipică a
acestor instrucţiuni este la salvarea contextului (PSW - cuvântul de stare al procesorului,
valoarea curentă a unor registre, etc.) în cazul tratării unor întreruperi sau la apelarea unei
subrutine, context care poate fi afectat de rutinele de tratare a întreruperii sau de subrutinele
apelate. În general, în cazul tratării unei întreruperi se salvează automat în stivă doar conţinutul
PC. Celelalte informaţii trebuie salvate prin program.

Exemplu. Folosirea stivei pentru salvarea contextului la o întrerupere


LOCTMP EQU $ ;aici asamblorul memorează valoarea PC
ORG 0003H ;adresa de început a rutinei de întrerupere
LJMP SERVINT ;salt la rutina de tratare a întreruperii
; ......
ORG LOCTMP ;subrutina de tratare este relocalizabilă
SERVINT: PUSH PSW
PUSH ACC
PUSH B
PUSH DPL
PUSH DPH
Page 22 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

MOV PSW,#00001000B ;selectează bancul 1 de regiştri


; ........ tratează întreruperea
; ........
POP DPH
POP DPL
POP B
POP ACC
POP PSW
RETI

g. Instrucţiuni de lucru cu pointerul de date (DPTR) şi de căutare în tabele


(Table Look-up)
Pointerul de date DPTR poate fi încărcat cu o valoare pe 16 biţi cu instrucţiunea MOV
DPTR, #data16, data respectivă fiind memorată în octetul 2 şi 3 al instrucţiunii. Pointerul poate
fi incrementat cu instrucţiunea INC DPTR care realizează o incrementare pe 16 biţi. Nici unul
din flaguri nu este afectat de aceste instrucţiuni. Instrucţiunile de tip MOVC; MOVC A,
@A+DPTR şi MOVC A, @A+PC sunt singurele care plasează în acumulator date (octeţi)
preluate din spaţiul logic al memoriei de program. Ambele utilizează o formă de adresare
indexată, prima adunând valoarea întreagă, fără semn, a acumulatorului cu data de 16 biţi din
DPTR, suma rezultantă fiind folosită pentru adresarea locaţiei de unde este preluată data în A.
Adunarea este pe 16 biţi, dar conţinutul lui DPTR nu este alterat. Cea de a doua utilizează
valoarea incrementată (adresa instrucţiunii următoare) a PC-ului ca „bază” în locul DPTR. Nici
aceste instrucţiuni nu afectează flagurile. Fiecare din aceste instrucţiuni poate reprezenta o parte
a unei secvenţe de trei paşi în accesarea unei tabele de constante aflate în ROM (memoria de
program). La versiunea bazată pe DPTR, se încarcă mai întâi pointerul de date cu adresa de
început a tabelei după care se încarcă valoarea indexului corespunzător intrării în tabel care
trebuie accesată; apoi este executată instrucţiunea MOVC .. +DPTR. Pentru tabele scurte
pointerul de date poate fi încărcat cu o constantă sau, pentru tabele cu mai mult de 256 intrări sau
structuri de date mai complicate, componentele pointerului DPL şi DPH pot fi calculate cu
arimetica standard.
Varianta relativă la PC are avantajul că nu afectază DPTR-ul, secvenţa fiind: a) se încarcă
indexul în acumulator, b) se compensează offsetul existent între instrucţiunea de căutare şi
începutul tabelei prin adunarea numărului repectiv de octeţi la acumulator, c) se execută apoi
MOVC ...+PC .

Exemplu. Să se încarce în acumulator o constantă de 1 octet dintr-un tablou


bidimensional aflat în memoria de program; numărul de intrări în tabelă este < 250; tabloul are
Page 23 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

dimensiunile 11x21; relaţia de calcul a adresei intrării dorite este: (ADR. BAZA) + (21x
INDEX_I) +INDEX_J, valorile pentru INDEX_I şi INDEX_J se completează înainte de apelare
(I reprezintă indexul liniilor, iar J este indexul coloanelor).
INDEX_I EQU R6 ;coordonată coloane
INDEX_J EQU 23H ;coordonată linii
;
MATRX1: MOV A,INDEX_I
MOV B,#21
MUL AB
ADD A,INDEX_J
INC A ;introduce offset 1 octet
MOVC A,@A+PC
RET

Instrucţiunea JMP @A+DPTR realizează un salt indirect la o adresă calculată în


momentul execuţiei programului. Adresa de salt este calculată analog ca la instrucţiunea MOVC.
Exemplu. Să se încarce în acumulator o dată din unul din cele 4 tablouri aflate în
memorie. Selecţia tabloului este realizată cu variabila MEMSEL. Adresa datei este de 8 sau 16
biţi în funcţie de dimensiunea tablorilor.
MEMSEL EQU R3 ;selector de tablou
;
JUMP_4 MOV A,MEMSEL
MOV DPTR,#JMPTBL ;JMPTBL=adresa început tablou
MOVC A,@A+DPTR ;se preia offsetul faţă de începutul
JMP @A+DPTR ;tabloului
JMPTBL: DB MEMSP0-JMPTBL ;JMPTBL=tablou cu adresele de salt
DB MEMSP1-JMPTBL
DB MEMSP2-JMPTBL
DB MEMSP3-JMPTBL
MEMSP0: MOV A,@R0 ;citeşte RAM intern
RET
MEMSP1: MOVX A,@R0 ;citeşte din pagina RAM extern date de
RET ;max. 256 octeţi
MEMSP2: MOV DPL,R0
MOV DPH,R1
MOVX A,@DPTR ;citeşte data din RAM extern de max. 64
RET ;kocteţi
MEMSP3: MOV A,R1 ;citeşte data dintr-un spaţiu de 4 kocteţi

Soluţia din exemplu este adecvată atunci când dimensiunea tabelei de salturi plus cea a
rutinelor alternative nu depăşeste 256 octeţi, tabela şi rutinele putând fi plasate oriunde în
memoria program relativ la paginile de 256 octeţi.

Page 24 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

Exemplu. Să se scrie programul pentru a executa o ramificare cu N=128 destinaţii (căi)


prin accesarea unui tablou cu instrucţiuni de salt, toate aflate în acelaşi bloc de 2 kocteţi de
memorie de program; destinaţia este specificată de variabila OPTION.
OPTION: EQU R3
;
JMP128 MOV A,OPTION
RL A ;înmulţire cu 2 (AJMP are 2 octeţi)
MOV DPTR,#INSTBL ;prima intrare în tabloul pentru salturi)
JMP @A+DPTR ;salt la prima adresa din tablou
;
INSTBL: AJMP PROC00 ;tabloul cu 128 de instrucţiuni AJMP
AJMP PROC01 ;având fiecare câte 2 octeţi
AJMP PROC02
; ....
AJMP PROC7E
AJMP PROC7F ;ultima din cele 128 adrese de salt

Dacă sunt necesare mai mult de 128 de opţiuni (ramificaţii) se poate folosi următoarea
abordare.

Exemplu. Să sa scrie o subrutină de ramificare cu 256 de căi (destinaţii) fiecare


corespunzând uneia din cele 256 de rutine de prelucrare PROC00÷PROCFF folosind căutarea în
tabelul ADRTBL. Selectorul căii este variabila OPTION.

RTEMP EQU R7 ;variabila intermediară


; ......
JMP256: MOV DPTR,#ARDTBL ;prima intrare în tabel
MOV A,OPTION
CLR C
RLC A ;înmulţire cu 2
JNC LOW128 ;dacă C=1 este prima jumătate a tabloului
INC DPH ;salt la a doua jumătate a tabelului
LOW128: MOV RTEMP,A ;salvez indexul tabelului
MOVC A,@A+DPTR ;încarc din tabel octet superior adresă
XCH A,RTEMP ;salvez octet superior adresă în RTEMP
INC A
MOVC A,@A+DPTR ;încarc din tabel octet inferior adresă
PUSH ACC ;salvez în stivă adresa căii
MOV A,RTEMP
PUSH ACC ;cele două operaţii PUSH au încărcat stiva
;cu adresa de 16 biţi care reprezintă adresa
;de start a noii căi şi care va fi încărcată în
;PC la execuţia instrucţiunii RET de
;încheiere a subrutinei
RET
Page 25 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

ADRTBL: DW PROC00 ;tabloul conţine maxim 256 de adrese


DW PROC01 ;de 2 octeţi care reprezintă începutul
........... ;subrutinelor de tratare
DW PROCFF

h. Instrucţiuni pentru operaţii booleene


Există un număr de instrucţiuni care operează cu variabile booleene (de 1 bit) folosind
adresarea directă pe bit, similară adresării directe pe octet. Un octet suplimentar ataşat codului
instrucţiune specifică variabila booleană, pinul de port sau bitul de control adresat. Starea
oricărui din aceşti biţi poate fi testată ca „adevărată” sau „falsă” cu instrucţiunile de salt
condiţionat JB, JNB sau JBC. Analog adresării directe la nivel de octet, bitul 7 din adresa
asociată codului instrucţiunii realizează separarea între două spaţii fizice de adresă. Dacă bitul 7
este „0”, biţii adresaţi sunt în zona 20H÷-2FH a RAM-ului intern, iar pentru valoarea „1” biţii
sunt în spaţiul de adresă al regiştrilor speciali (dacă în spaţiul respectiv este adresat un registru
inexistent fizic, rezultatul instrucţiunii este nedefinit). Biţii astfel adresaţi pot fi setaţi, şterşi sau
complementaţi cu instrucţiuni (pe doi octeţi) ca: SETB, CLR sau CPL. Biţii pot fi copiaţi în/din
flagul C cu instrucţiuni de tip MOV. Operaţiile logice ANL şi ORL pot fi realizate între flagul C
şi bitul adresat sau complementul lui. Una din aplicaţiile tipice ale operaţiilor pe bit este
rezolvarea unor funcţii logice complexe (combinaţionale) care, uzual, este abordată hard (cu
porţi logice).
În exemplele care urmează sunt prezentate trei modalităţi de abordare a implementării
funcţiei logice: F = (U• ( V+W ) ) + (X• /Y) + /Z, pentru punerea în evidenţă a avantajelor care
rezultă (cod compact, viteză, claritate) din utilizarea facilităţilor de calcul boolean.

Exemplu. Să se implementeze funcţia logică F de 6 variabile folosind operaţii booleene;


U şi V sunt variabile de intrare reprezentând intrările a două porturi I/O (P1.1 şi P2.2), W şi X au
semnificaţia unor biţi de stare ai unor periferice (furnizaţi de registrul de control al timerelor –
TCON.5 şi TCON.6), iar Y şi Z sunt fanioane software. Valoarea funcţiei F este furnizată pe
pinul de ieşire al portului 3 (P3.3).
OUTBF EQU 22H ;aici se memorează starea ieşirii
;
TESTV: MOV A,P2 ;încarcă V
ANL A,#00000100B
JNZ TESTU
MOV A,TCON ;încarcă W
ANL A,#00100000B
JZ TESTX
TESTU: MOV A,P1 ;încarcă U
Page 26 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

ANL A,#00000010B
JNZ SETF
TESTX: MOV A,TCON ;încarcă X
ANL A,00001000B
JZ TESTZ
MOV A,20H ;încarcă Y
ANL A,#00000001B
JZ SETF
TESTZ: MOV A,21H ;încarcă Z
ANL A,#00000001B
JZ SETF
CLRF: MOV A,OUTBF
ANL A,#11110111B
JMP OUTF
SETF: MOV A,OUTBF
ORL A,#00001000B
OUTF: MOV OUTBF,A
MOV A,P3

Exemplu. Să se implementeze funcţia logică F folosind doar instrucţiuni care operează cu


variabile booleene.
U BIT P1.1 ;declararea variabilelor de tip bit
V BIT P2.2
W BIT TF)
X BIT IE!
Y BIT 20H.0 ;bitul 0 de la adresa 20H
Z BIT 21H.1
F BIT P3.3
;
MOV C,V ;citeşte V
ORL C,W ;SAU logic între V şi W
ANL C,U ;SI logic între rezultatul anterior şi U
MOV F0,C ;salvare valoare intermediară
MOV C,X
ANL C,Y
ORL C,F0
ORL C,Z
MOV F,C ; salvează valoare funcţie F

2.8 Sistem minimal realizat cu microcontrolerul 8051

Sistemul minimal prezentat în figura 5 următoare conţine: unitatea centrală (8051),


memoria externă pentru program (EPROM) şi extensia de memorie RAM pentru date de 32 K.
Magistralele externe pentru adrese şi date sunt realizate prin demultiplexarea magistralei comune
de adrese/date realizată cu porturile P0 şi P2. Magistrala pentru adrese este creată cu ajutorul
circuitului basculant bistabil şi a semnalului ALE (Address Latch Enable) generat de
microcontroler.
Page 27 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

Figura 5 – Sistem minimal cu microcontrolerul 8051

2.9 Exemplu de aplicaţie utilizând microcontrolerul 8051


Tastaturile alfanumerice constau dintr-o matrice de 8x8 linii, respectiv 8 linii de scanare
şi 8 linii de recepţie ca în figura 6 următoare. Fiecare set de linii se conectează la unul din
porturile microcontrolerului. Prin program se înscrie „0” logic pe liniile de scanare şi „1” logic
pe liniile de recepţie. Apăsând o tastă, se conectează o linie de scanare la o linie de recepţie,
rezultând un „0” logic pe linia respectivă de recepţie. Cele 8 linii de recepţie sunt trecute printr-o
poartă „SI-logic” astfel încât trecerea în „0” logic a oricăreia din liniile de recepţie va genera o
întrerupere. Se consideră că starea celor două seturi de linii, la apariţia întreruperii, este cea
descrisă anterior.

Page 28 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

LINII DE SCANARE

LINII DE
RECEPTIE

I 8051

P1 P2

INT0

Figura 6 – Schema circuitului de scanare a tastaturii

Rutina de deservire a întreruperii trebuie să identifice care din taste a fost apăsată, dacă se
presupune că două taste nu pot fi apăsate simultan. Starea curentă a liniilor de recepţie este
memorată într-un registru intern. Dacă o singură tastă este apăsată, toate liniile de recepţie mai
puţin una (cea la care aparţine tasta apasată) vor fi citite ca „1” logic. După aceea procesul se
inversează, adică este înscris „0” logic pe liniile de recepţie şi „1” logic pe liniile de scanare, iar
liniile citite sunt cele de scanare. Dacă o singură tastă este apăsată, numai una dintre aceste linii
de scanare va fi citită ca „0” logic. Localizând unicul nivel logic „0” din fiecare set de linii, se
identifică tasta apăsată. Dacă mai mult de două taste ale matricii sunt apăsate simultan, atunci
unul sau ambele seturi de linii vor conţine mai mulţi de „0”. O subrutină are sarcina de a
determina care din cei 8 biţi din fiecare set este 0. Dacă se apasă mai multe taste simultan, nu se
va executa nici o acţiune. Pentru tastele ce trebuie apăsate simultan cu alte taste (ex.: Shift, Alt,
Control), nu se face conectarea la liniile matricei. Aceste taste speciale vor fi conectate direct la
câte un pin al portului microcontrolerului, în acest mod existând posibilitatea generării unei
comenzi dacă pe lângă tasta specială se mai apasă o tastă; mai mult se previne generarea unei

Page 29 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

întreruperi la apăsarea singulară a tastei speciale. În mod normal microcontrolerul va aştepta


apăsarea unei taste, dacă nu există alte activităţi pe care trebuie să le rezolve.
Generarea unei întreruperi, ca urmare a apăsării unei taste, scoate microcontrolerul din
starea de aşteptare. Rutina de tratare a întreruperii aşteaptă un interval de aproximativ 30ms
pentru ca tasta să facă un contact sigur, după care identifică sursa de întrerupere (tasta care a fost
apăsată). Pentru contactele mecanice ale tastelor există un interval de maxim 30ms în care
contactul nu este stabil şi deci trebuie să se aştepte un interval de timp după care să se facă citirea
corectă a tastei apăsate.
Subrutina care determină care din cei 8 biţi din cele două seturi de linii este „0” şi dacă
mai mult de 1 bit este „0”, se numeşte SCAN. Pentru a utiliza subrutina se încarcă datele de pe
linii într-o locaţie a RAM-ului adresabilă pe bit numită LINE şi se apelează subrutina SCAN.
Numărul de biţi LINE care sunt „0” este returnat în ZERO_COUNTER. Dacă numai 1 bit este
zero, numărul său de ordine (poziţia: 1...8) este returnată în ZERO_BIT.
Rutina de tratare a întreruperii generate la apăsarea unei taste, este următoarea:
*****************************************************************************
RASPUNS_LA_APASARE_TASTA:
CALL ASTEPT_STABILIZ_TASTA ;se apelează o subrutină care este o
;buclă de aşteptare (30ms) pentru
;stabilizarea contactului tastei (vezi
;explicaţia din text)
MOV LINE, P1 ;se încarcă în variabila LINE valorile
;logice de pe liniile de recepţie
;conectate la portul P1
CALL SCAN ;se apelează subrurtina SCAN care
întoarce ;în variabila ZERO_COUNT numărul
de biţi ;”0” din LINE, adică de pe
liniile de ;recepţie. Deci se identifică
poziţia pe ;orizontală a tastei apăsate
DJNZ ZERO_COUNTER,REJECT ;decrementează ZERO_COUNTER şi execută
;salt la REJECT dacă ZERO_COUNTER  0
MOV ADDRESS, ZERO_BIT ;mută la adresa ADDRESS, pe ZERO_BIT care
;conţine rangul bitului cu valoarea 0 din
;LINE liniile de recepţie
MOV P2, #0FFH ;se încarcă la port P2, adică pe liniile
;de scanare, “1” logic pe fiecare linie
;(FFH)
MOV P1, #0 ;se încarcă la port P1, adică pe liniile
;de recepţie “0”, urmând să fie citite
;liniile de scanare în LINE
MOV LINE, P2 ;se încarcă starea liniilor de scanare
;conectate la P2, în LINE
CALL SCAN ;se testează liniile de scanare. După
;execuţia subrutinei, variabila ZERO_BIT
;va conţine rangul bitului care este 0 de
;pe liniile de scanare şi se identifică
;poziţia pe verticală a tastei apăsate

DJNZ ZERO_COUNTER, REJECT

Page 30 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

XCH A, ZERO_BIT ;se interschimbă conţinutul


;acumulatorului cu variabila ZERO_BIT
;astfel că nu se pierde conţinutul
;acumulatorului
SWAP A ;permută nibbelul inferior cu cel
;superior al acumulatorului în care se
;află ZERO_BIT
ORL ADDRESS, A ;se execută “SAU”-logic între ADDRESS şi
;A, cu rezultatul în ADDRESS
XCH A, ZERO_BIT ;se reface conţinutul acumulatorului
REJECT:
MOV P1, #0FFH
MOV P2, #0 ;se reface starea celor două seturi de
;linii dinaintea generării întreruperii
;(momentul apăsării tastei), încărcând
;“1” pe liniile de recepţie (port P1) şi
;“0” pe liniile de scanare (port P2)
CLR EX0 ;se resetează flagul de întrerupere EX0
RETI ;revenire din rutina de deservire a
;întreruperii
;RUTINA DE SCANARE (TESTARE) A LINIILOR MATRICEI TASTATURII
SCAN: MOV ZERO_COUNTER,#0 ;ZERO_COUNTER numără zerourile în
;LINE.x= bitul x din LINE.
JB LINE.0, ONE ;salt la ONE dacă bit 0 din LINE
;este “1”.
INC ZERO_COUNTER ;incrementează ZERO_COUNTER.
MOV ZERO_BIT, #1 ;dacă LINE.0=0, se incrementează
;ZERO_COUNTER pentru că s-a
;detectat o tastă apăsată şi se
;înregistrează în ZERO_BIT ca
linia activă
;este linia 1. Procedura continuă şi
;pentru ceilalţi biţi ai lui LINE
ONE: JB LINE.1,TWO ;linia număr 2 este activă.
INC ZERO_COUNTER
MOV ZERO_BIT, #2
TWO: JB LINE.2, THREE ;linia număr 3 este activă.
INC ZERO_COUNTER
MOV ZERO_BIT, #3
THREE:JB LINE.3, FOUR ;linia număr 4 este activă.
INC ZERO_COUNTER
MOV ZERO_BIT, #4
FOUR: JB LINE.4, FIVE ;linia număr 5 este activă.
INC ZERO_COUNTER
MOV ZERO_BIT, #5
FIVE: JB LINE.5, SIX ;linia număr 6 este activă.
INC ZERO_COUNTER
MOV ZERO_BIT, #6
SIX: JB LINE.6, SEVEN ;linia număr 7 este activă.
INC ZERO_COUNTER
MOV ZERO_BIT, #7
SEVEN:JB LINE.7, EIGHT ;linia număr 8 este activă.
INC ZERO_COUNTER
MOV ZERO_BIT, #8
EIGHT:RET ;revenire din subrutină
*****************************************************************************
Observaţii:
1) Instrucţiunea DJNZ ZERO_COUNTER, REJECT execută următoarea acţiune:
decrementează valoarea lui ZERO_COUNTER. Dacă valoarea lui ZERO_COUNTER este iniţial
Page 31 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051

mai mare decât 1, ceea ce semnifică apăsarea mai multor taste simultan, atunci prin
decrementare ZERO_COUNTER nu devine zero şi atunci se sare la eticheta REJECT care
resetează flagul de întrerupere externă (in rest nu se mai execută nimic). Dacă
ZERO_COUNTER este 1, adică s-a apăsat o singură tastă, atunci prin decrementare el devine 0
şi nu se mai execută saltul.
2) Instrucţiunea MOV ADDRESS,ZERO_BIT încarcă la locaţia ADDRESS rangul liniei
de recepţie pe care se găseşte tasta apăsată. Apoi se testează şi liniile de scanare şi în ZERO_BIT
se obţine rangul liniei de scanare pe care se găseşte tasta apăsată. După execuţia secvenţei de
instrucţiuni:
XCH A, ZERO_BIT
SWAP A
ORL ADDRESS, A
pe semioctetul superior al variabilei ADDRESS se regăseşte rangul liniei scanate pe care se află
tasta apăsată (vezi ultimele două instrucţiuni ale secvenţei), iar pe semioctetul inferior al
variabilei ADDRESS se găseşte rangul liniei de recepţie corespunzătoare tastei apăsate (vezi
instrucţiunea MOV ADDRESS, ZERO_BIT). Rangul liniei, care poate avea 8 valori, se
reprezintă pe un semioctet.
3) Întreruperea generată de apăsarea unei taste trebuie să fie activă pe front. Dacă ar fi
activă pe palier atunci atât timp cât tasta se menţine apăsată rutina s-ar executa de mai multe ori.
4) Înainte de părăsirea subrutinei de tratare a întreruperilor se execută resetarea flagului
de întrerupere externă (Ex0) asociat intrării de cerere de întrerupere INT0. Cererea de întrerupere
setează flagul Ex0, această setare generând în fapt cererea de întrerupere la unitatea centrală a
microcontrolerului. Flagul Ex0 este resetat hard în momentul în care se acceptă cererea de
întrerupere. În perioada de aşteptare pentru ridicarea tastei există posibilitatea ca datorită jocului
contactului tastei, să se genereze mai multe fronturi pe INT0, care setează Ex0. De aceea, Ex0
trebuie resetat soft înainte de ieşirea din rutină, în caz contrar rutina executându-se de mai multe
ori.
5) În rutina ASTEPT_STABILIZ _TASTA va trebui să încărcăm un timer cu valoarea
corespunzătoare întârzierii. Relaţia între valoarea încărcată şi întârzierea în msecunde este:
f osc (kHz)  întârziere(ms)
valoare încarcat ă =
12
De exemplu, dacă frecvenţa oscilatorului este 3,58 Mhz pentru o întârziere de 30 ms se
obţine 8950 reprezentat ca DD0Ah.

Page 32 of 32

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