Sunteți pe pagina 1din 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing.

Rodica Constantinescu INTEL 8051

Capitolul 2 Familia MCS-51. Microcontrolerul 8051

R A R

P2 LATCH

128 x 8 RAM

4k x 8 ROM

PCH DPH PCL DPL

P0 LATCH RAM BUFFER SENSE AMPS

P1 LATCH

PORT 1

INTERNAL BUS

IR
PLA

TMP1

TMP2

B
CONTROL

P S W

ALU SP

INTERNAL BUS TCON


P0 LAT CH

IE IP INTERRUPT CONTROL
P3 LAT CH

SCON SBUF SBUF SERIAL PORT

TMOD TL0 TH0 TL1 TH1 TIMER CONTROL

PORT 0

PORT 3

Figura 2.1 Schema bloc a microcontrolerului 8051 Tabelul 2.1 - Registrele cu funciuni speciale ale microcontrolerului 80C51 F8 FF F0 B F7 E8 EF E0 ACC E7 D8 DF D0 PSW D7 C8 CF C0 C7 B8 IP BF
Page 1 of 17

PORT 2

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

B0 P3 A8 IE A0 P2 98 SCON SBUF 90 P1 88 TCON TMOD TL0 TL1 80 P0 SP DPL DPH

TH0

TH1

B7 AF A7 9F 97 8F PCON 87

(128) 7FH

DATA RAM

Memoria de date (zona de uz general)

(48) 30H (47) 2FH BIT RAM (32) 20H


(31) 1FH

16B de memorie adresabil pe bit (zona adresabil la nivel de bit)

BLOCUL 3

(24) 18H (23) 17H BLOCUL 2

(16) 10H (15) 0FH

4 bancuri de cte 8 registre registrelor

(zona

BLOCUL 1

(8) 08H (7) 07H

BLOCUL 0

(0) 00H

Figura 2.2 - Organizarea memoriei RAM interne la microcontrolerul 8051 (LOWER 128)

Page 2 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

2.9

Setul de instruciuni al microcontrolerului Intel 8051

Setul de instruciuni al microcontrolerului 8051 este destul de regulat, n sensul c majoritatea instruciunilor pot opera cu variabile din spaii de adrese fizice sau logice diferite. El a fost proiectat astfel nct s fie eficient ca dimensiune a codului i ca vitez de execuie. Instruciunile sunt codate cu 13 octei. Practic toate instruciunile se execut n unul sau doi cicli main (1 sau 2 sec la un tact de 12MHz); doar dou instruciuni (MUL, DIV) sunt executate n patru cicli. Setul de instruciuni cuprinde 111 instruciuni: 49 de un octet, 45 de doi octei i 17 de trei octei. Instruciunile pot fi grupate n 4 categorii: MOV PUSH POP XCH Instruciuni pentru transferul datelor

- transfer bit sau octet de la o locaie surs la o locaie destinaie - incrementeaz SP i transfer octet de la surs n stiv la adresa dat de SP - transfer un octet de la adresa dat de SP la o destinaie i decrementeaz SP - schimb coninutul acumulatorului cu coninutul variabilei indicate care poate fi adresat direct sau indirect cu registru XCHD - schimb semicuvntul inferior din acumulator (biii 30) cu cel al unei locaii 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 bii n registrul dublu DPTR. Instruciuni pentru operaii 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 - corecia zecimal a rezultatului adunrii operanzilor zecimali reprezentai n cod BCD SUBB - scdere a unui operand din acumulator mpreun cu mprumutul MUL - execut nmulirea fr semn a operandului din acumulator cu operandul din registrul B. Rezultatul pe 16 bii este n B (high byte) i A (low byte) DIV - execut mprirea fr semn a coninutului acumulatorului la coninutul registrului B. Rezultatul este n regitrii A (ctul) i B (restul). Instruciuni pentru operaii logice

CLR - reseteaz toi biii din A sau orice bit adresabil direct SETB - seteaz orice bit adresabil direct CPL - complementeaz coninutul lui A, fr a modifica PSW RL - rotaie stnga a acumulatorului cu un rang RLC - rotaie stnga a acumulatorului prin CY RR - rotaie dreapta a acumulatorului RRC - rotaie dreapta a acumulatorului prin CY SWAP - inverseaz semiocteii n A ANL - SI-logic pe octet ORL - SAU-logic pe octet XRL - SAU EXCLUSIV-logic pe octet
Page 3 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

Instruciuni de control

- Apeluri i salturi necondiionate: ACALL - instruciune de apel a unei subrutine atunci cnd adresa de salt este cuprins n 2K ai paginii curente. Cmpul de adres de 11 bii ai instruciunii este concatenat cu cei mai semnificativi 5 bii din PC LCALL - instruciune de apelare care poate specifica oricare adres din spaiul memoriei de 64K RET - transfer controlul la adres de revenire salvat n prealabil n stiv i decrementeaz apoi SP cu 2 AJMP - salt necondiionat la o adres din spaiul 2K, analog cu ACALL LJMP - salt necondiionat la o adres din spatiul 64K, analog cu LCAL SJMP - salt necondiionat scurt n cadrul a 256 octei Salturi condiionate:

JZ JNZ JC JNC JB JNB JBC CJNE

- salt dac toi biii din A sunt 0 - salt dac A cel puin un bit din A este 1 - salt dac CY este 1 - salt dac CY este 0 - salt dac bitul specificat este 1 - salt dac bitul specificat este 0 - salt dac bitul adresat este 1 i apoi terge acest bit - decrementeaz operandul surs i pune rezultatul la operandul destinaie; salt dac rezultatul nu este zero RETI - la fel ca RET, dar activeaz i ntreruperile

Exemple de folosire a instruciunilor a. Instruciunile aritmetice: ADD, ADDC, SUBB i DA Instruciunea ADD adun o variabil de un octet cu acumulatorul, rezultatul fiind plasat tot n acumulator. Flagul C(arry) este setat dac apare depire (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. Instruciunea SUBB scade coninutul variabilei pe un octet i pe cel al lui C din acumulator, plasnd rezultatul n acumulator. Flagul C este utilizat ca semnalizare a unei cereri de mprumut (borrow") la operaia de scdere, fiind setat corespunztor. Flagul AC (auxilliary carry) este setat dac apare transport de la bitul 3 (la nivel de semioctet inferior) pentru a fi folosit de instruciunea DA. Anomaliile legate de nerespectarea formatului de reprezentare n aritmetica complement fa de 2 sunt semnalizate prin intermediul flagului OV (overflow = depire). La nivel hard, OV este setat atunci cnd apare transport de la rangul bitului 6 i nu 7 (ca la C). Setarea sa, la adunarea a doi ntregi cu semn, indic apariia 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 scderea unui numr negativ din unul pozitiv sau un rezultat pozitiv la scderea unui numr pozitiv din unul negativ. Utilizarea flagurilor C sau OV permite implementarea aritmeticii cu precizie extins (pe mai mult de un octet), n varianta fr semn (folosind C) sau cu semn n complement fa de 2 (folosind OV).
Page 4 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

Exemplu. S se execute scderea unui ir numeric adresat cu registrul R1, din irul adresat cu R0, irurile avnd lungimea dat de registrul R2 i s se fac verificara pentru depire. 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 poziiile curente MOV @R0, A INC R0 ; actualizeaz pointeri INC R1 DJNZ R2, SUBS1 ; buclare pn termin toate poziiile JNB OV, OV_OK ; verific dac a aprut depire ; aici se trece rutina de tratare a depirii OV_OK: ; ieire corect RET Adunarea zecimal (n cod BCD) este posibil cu utilizarea instruciunii 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 nct s formeze dou cifre BCD, fiecare de cte 4 bii. Dac biii 30 din coninutul acumulatorului codific o valoare mai mare ca 9 sau dac flagul AC este setat, se adun 6 la acumulator producnd astfel valoarea codificat corect pe cei mai puini semnificativi 4 bii (nibble inferior). Dac flagul C este setat sau dac valoarea codificat pe cei mai semnificativi 4 bii (nibble superior) depete 9, se adun 6 la aceasta. Flagul C rmne setat dac a fost iniial setat sau este setat dac apare depire (dac suma este mai mare de 100). Exemplu. Adunare n zecimal pe doi octei; S se adune constanta 1234H (123410 reprezentat BCD) cu coninutul regitrilor R3 i R2 care conin o dat codat BCD pe 4 cifre. BCDADD: MOV A, R2 ADD A, #34H DA A ;execut corecia rezultatului MOV R2, A MOV A, R3 ADDC A, #12H DA A MOV R3, A ;ncarc rezultatul n R3 i R2 RET b. Instruciunile de nmulire i mprire: MUL i DIV

Instruciunea MUL AB realizeaz nmulirea unor ntregi fr semn pe 8 bii coninui n acumulator i n registrul B. Octetul inferior al rezultatului pe 16 bii este n acumulator, iar cel superior n B. Dac octetul superior este nul, flagul OV este setat, n caz contrar este ters. Instuciunea DIV AB realizeaz mprirea ntregului fr semn din acumulator la ntregul fr semn din registrul B. Partea ntreag a ctului se plasez n A, iar restul n B. Dac B a coninut iniial 00H, flagul OV este setat indicnd o eroare de mprire, altfel este ters. Exemplu. S se converteasc numrul n binar din acumulator (reprezentat n cod binar cu 8 bii) n format BCD mpachetat pe 3 cifre; sutele vor fi memorate aliniat la dreapta n locaia SUTE, iar zecile i unitile vor fi memorate la adresa ZECUN. SUTE EQU 21H ;variable pentru reprezentare rezultat
Page 5 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

ZECUN

EQU 22H MOV B, #100 DIV AB MOV SUTE, A MOV A, #10 XCH A, B DIV AB SWAP A ADD A, B MOV ZECUN, A RET

;idem ;mpart cu 100 pt. a determina ;nr. de sute (dat de partea ntreag)
10

;mpart restul la 10 pt. a determina ;nr. de zeci rmase ;zecile n A, restul sunt unitile ;schimb ntre ei cei doi nibble ai acumulatorului ;mpachetez cifrele BCD n acumulator
10

c.

Operaii logice pe octet cu instruciunile ANL, ORL, XRL

Instruciunile menionate realizeaz funciile logice AND, OR i XOR ntre dou variabile pe un octet, rezultatul fiind plasat n variabila destinaie. Flagurile nu sunt modificate. Aceste instruciuni pot utiliza aceleai moduri de adresare ca i cele aritmetice, dar nu sunt limitate numai la operarea prin intermediul acumulatorului. Octeii adresai direct pot fi utilizai ca destinaie avnd ca surs fie acumulatorul, fie o constant. Instruciunile sunt utile pentru tergerea (ANL), setarea (ORL) sau complementarea (XRL) a unuia sau a mai multor bii din RAM, porturi sau regitri speciali. Exemplu. Pe cei mai puin semnificativi 5 bii (4-0) ai portului 1 s se plaseze un cod (prezent n A) fr a afecta starea biilor 75 care au o alt utilizare. OUT_PX: ANL P1,#11100000B ;terge biii P1.0P1.4 ORL P1,A ;seteaz biii lui P1 corespunztori lui A RET d. Instruciuni de control a fluxului programului

Exist trei variante de instruciuni de salt necondiionat, ele diferind prin dimensiunea codului instruciunii i prin restriciile impuse adresei de destinaie (adresa salt): LJMP (Long Jump) - codific adresa de salt pe 16 bii n octeii 2 i 3 ai instruciunii; n consecin destinaia saltului poate fi oriunde n spaiul total de 64K al memoriei de program. AJMP (Absolute Jump) - adresa de salt este codificat cu 3 bii (11-8) n octetul care conine i codul instruciune, plus 8 bii (7-0) ntr-un octet suplimentar, biii cei mai semnificativi ai adresei (15-12) se iau din valoarea (incrementat) contorului program (PC); poate fi utilizat doar dac destinaia este n interiorul aceluiai bloc de memorie program, de dimensiune maxim 2K. SJMP (Short Jump) - destinaia este specificat ca o adres relativ (offset) fa de valoarea curent a PC-ului, codificat n al doilea octet al instruciunii; offsetul este o valoare cu semn pe 8 bii, astfel nct 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" (pseudoinstruciune salt necondiionat) care este translatat automat n instruciuni main LJMP, AJMP sau SJMP n funcie de adresa de destinaie. Toate instruciunile de salt condiionat utilizeaz o adresare relativ, analog lui SJMP. JZ (Jump on Zero) i JNZ (Jump on Not Zero) testeaz valoarea acumulatorului ca nul sau nenul (dei n PSW nu exist un flag Zero!), iar JC (Jump on Carry) i JNC (Jump on Not Carry) starea flagului C, fiind toate instruciuni pe doi octei. JB (Jump on Bit), JNB (Jump on Not Bit) i JBC (Jump on Bit and Clear) pot testa
Page 6 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

starea oricrui bit adresabil sau pin (de port), fiind instruciuni pe trei octei (octetul 2 specific bitul testat, iar octetul 3 offsetul), ultima (JBC) realiznd i tergerea necondiionat a bitului testat. Exist dou instruciuni de apel subrutin: ACALL (Absolute Call) i LCALL (Long Call). Ambele incrementeaz PC pn la adresa urmtoarei instruciuni, salveaz n stiv aceast valoare (octetul inferior primului) care va reprezenta adresa de ntoarcere. Adresa de start a subrutinei este codificat analog instruciunilor de salt AJMP i LJMP, de unde rezult i aceleai domenii pentru adresa de start (nceput) a subrutinei fa de punctul de apelare. Majoritatea asambloarelor 8051 recunosc o mnemonic generic CALL" (o pseudoinstruciune) care este translatat automat n instruciuni main LCALL sau ACALL n funcie de adresa de start a subrutinei. e. Instruciuni de tip operaie i salt condiionat" (Operate and branch)

CJNE (Compare and Jump if Not Equal) realizeaz compararea valorilor ntregi ale sursei i destinaiei (de un octet) i execut un salt n caz de inegalitate. Instruciunea are trei operanzi: destinaie, surs i adres de salt. Flagul C este modificat dup regula de la scdere (setat dac valoarea ntreag a sursei este mai mic dect cea a destinaiei, ters n caz contrar), iar cei doi operanzi nu sunt modificai Exemplu. S se implementeze o funcie analoag celei realizate de o instruciune de tip Case" (n Pascal) sau Switch" (n C) cu ajutorul instruciunii CJNE; se vor filtra (selecta) caracterele tipribile (codurile ASCII), ele fiind destinate afirii 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 (spaiu) INTP_6: JC PRINTC ; salt dac cod>20H MOV CHAR,#0 ; insereaz cod NULL PRINTC: ..... rutina de tratare tiprire standard RET Instruciunea DJNZ (Decrement and Jump on Not Zero) realizeaz decrementarea operandului i execuia saltului cnd rezultul decrementrii este nenul. Exemplu. S se genereze o ntrziere software (bazat pe cunoaterea apriori a timpului de execuie al unor instruciuni) 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
Page 7 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

MOV R2, #50 DJNZ R2, $ CLR PULS

;ncarc R2 cu contorul de durat a pulsului ;execut repetat instruciunea curent (semnul $) ;reseteaz PULS=0

f. Operaii cu stiva cu instruciunile PUSH i POP Instruciunea PUSH incrementeaz valoarea indicatorului de stiv (SP), apoi transfer coninutul variabilei octet n locaia de RAM intern adresat de SP. Reciproc, instruciunea POP copiaz coninutul locaiei RAM adresat de SP n variabila octet i apoi decrementeaz SP. Adresarea stivei se face cu aceleai reguli ca la modul registru indirect, prin intermediul ei putnd fi accesate deci i locaii RAM cu adrese mai mari de 128 (80H). O utilizare tipic a acestor instruciuni este la salvarea contextului (PSW - cuvntul de stare al procesorului, valoarea curent a unor registre, etc.) n cazul tratrii 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 tratrii unei ntreruperi se salveaz automat n stiv doar coninutul PC. Celelalte informaii trebuie salvate prin program. Exemplu. Folosirea stivei pentru salvarea contextului la o ntrerupere LOCTMP EQU $ ORG 0003H LJMP SERVINT ...... ORG LOCTMP PUSH PSW PUSH ACC PUSH B PUSH DPL PUSH DPH MOV PSW,#00001000B ........ trateaz ntreruperea ........ POP DPH POP DPL POP B POP ACC POP PSW RETI ;aici asamblorul memoreaz valoarea PC ;adresa de nceput a rutinei de ntrerupere ;salt la rutina de tratare a ntreruperii ;subrutina de tratare este relocalizabil

; SERVINT:

;selecteaz bancul 1 de regitri

; ;

Instruciuni de lucru cu pointerul de date (DPTR) i de cutare n tabele (Table Look-up) Pointerul de date DPTR poate fi ncrcat cu o valoare pe 16 bii cu instruciunea MOV DPTR, #data16, data respectiv fiind memorat n octetul 2 i 3 al instruciunii. Pointerul poate fi incrementat cu instruciunea INC DPTR care realizeaz o incrementare pe 16 bii. Nici unul din flaguri nu este afectat de aceste instruciuni. Instruciunile de tip MOVC; MOVC A, @A+DPTR i MOVC A, @A+PC sunt singurele care plaseaz n acumulator date (octei) preluate din spaiul logic al memoriei de program. Ambele utilizeaz o form de adresare indexat, prima adunnd valoarea ntreag, fr semn, a acumulatorului cu data de 16 bii din DPTR, suma rezultant fiind folosit pentru adresarea locaiei de unde este preluat data n A. Adunarea este pe 16 bii, dar coninutul lui DPTR nu este alterat. Cea de a doua utilizeaz g.
Page 8 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

valoarea incrementat (adresa instruciunii urmtoare) a PC-ului ca baz n locul DPTR. Nici aceste instruciuni nu afecteaz flagurile. Fiecare din aceste instruciuni poate reprezenta o parte a unei secvene de trei pai n accesarea unei tabele de constante aflate n ROM (memoria de program). La versiunea bazat pe DPTR, se ncarc mai nti pointerul de date cu adresa de nceput a tabelei dup care se ncarc valoarea indexului corespunztor intrrii n tabel care trebuie accesat; apoi este executat instruciunea MOVC .. +DPTR. Pentru tabele scurte pointerul de date poate fi ncrcat cu o constant sau, pentru tabele cu mai mult de 256 intrri 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, secvena fiind: a) se ncarc indexul n acumulator, b) se compenseaz offsetul existent ntre instruciunea de cutare i nceputul tabelei prin adunarea numrului repectiv de octei 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; numrul de intrri n tabel este < 250; tabloul are dimensiunile 11x21; relaia de calcul a adresei intrrii 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 Instruciunea JMP @A+DPTR realizeaz un salt indirect la o adres calculat n momentul execuiei programului. Adresa de salt este calculat analog ca la instruciunea MOVC. Exemplu. S se ncarce n acumulator o dat din unul din cele 4 tablouri aflate n memorie. Selecia tabloului este realizat cu variabila MEMSEL. Adresa datei este de 8 sau 16 bii n funcie 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 ;citete RAM intern RET MEMSP1: MOVX A,@R0 ;citete din pagina RAM extern date de RET ;max. 256 octei MEMSP2: MOV DPL,R0
Page 9 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

MEMSP3:

MOV DPH,R1 MOVX A,@DPTR RET MOV A,R1

;citete data din RAM extern de max. 64 ;koctei ;citete data dintr-un spaiu de 4 koctei

Soluia din exemplu este adecvat atunci cnd dimensiunea tabelei de salturi plus cea a rutinelor alternative nu depeste 256 octei, tabela i rutinele putnd fi plasate oriunde n memoria program relativ la paginile de 256 octei. Exemplu. S se scrie programul pentru a executa o ramificare cu N=128 destinaii (ci) prin accesarea unui tablou cu instruciuni de salt, toate aflate n acelai bloc de 2 koctei de memorie de program; destinaia este specificat de variabila OPTION. OPTION: EQU R3 ; JMP128 MOV A,OPTION RL A ;nmulire cu 2 (AJMP are 2 octei) 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 instruciuni AJMP AJMP PROC01 ;avnd fiecare cte 2 octei AJMP PROC02 ; .... AJMP PROC7E AJMP PROC7F ;ultima din cele 128 adrese de salt Dac sunt necesare mai mult de 128 de opiuni (ramificaii) se poate folosi urmtoarea abordare. Exemplu. S sa scrie o subrutin de ramificare cu 256 de ci (destinaii) fiecare corespunznd uneia din cele 256 de rutine de prelucrare PROC00PROCFF folosind cutarea n tabelul ADRTBL. Selectorul cii este variabila OPTION. RTEMP ; JMP256: EQU R7 ...... MOV DPTR,#ARDTBL MOV A,OPTION CLR C RLC A JNC LOW128 INC DPH MOV RTEMP,A MOVC A,@A+DPTR XCH A,RTEMP INC A MOVC A,@A+DPTR PUSH ACC MOV A,RTEMP PUSH ACC ;variabila intermediar ;prima intrare n tabel ;nmulire cu 2 ;dac C=1 este prima jumtate a tabloului ;salt la a doua jumtate a tabelului ;salvez indexul tabelului ;ncarc din tabel octet superior adres ;salvez octet superior adres n RTEMP ;ncarc din tabel octet inferior adres ;salvez n stiv adresa cii ;cele dou operaii PUSH au ncrcat stiva ;cu adresa de 16 bii care reprezint adresa

LOW128:

Page 10 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

;de start a noii ci i care va fi ncrcat n ;PC la execuia instruciunii RET de ;ncheiere a subrutinei ADRTBL: RET DW PROC00 DW PROC01 ........... DW PROCFF ;tabloul conine maxim 256 de adrese ;de 2 octei care reprezint nceputul ;subrutinelor de tratare

h.

Instruciuni pentru operaii booleene

Exist un numr de instruciuni care opereaz cu variabile booleene (de 1 bit) folosind adresarea direct pe bit, similar adresrii directe pe octet. Un octet suplimentar ataat codului instruciune specific variabila boolean, pinul de port sau bitul de control adresat. Starea oricrui din aceti bii poate fi testat ca adevrat sau fals cu instruciunile de salt condiionat JB, JNB sau JBC. Analog adresrii directe la nivel de octet, bitul 7 din adresa asociat codului instruciunii realizeaz separarea ntre dou spaii fizice de adres. Dac bitul 7 este 0, biii adresai sunt n zona 20H-2FH a RAM-ului intern, iar pentru valoarea 1 biii sunt n spaiul de adres al regitrilor speciali (dac n spaiul respectiv este adresat un registru inexistent fizic, rezultatul instruciunii este nedefinit). Biii astfel adresai pot fi setai, teri sau complementai cu instruciuni (pe doi octei) ca: SETB, CLR sau CPL. Biii pot fi copiai n/din flagul C cu instruciuni de tip MOV. Operaiile logice ANL i ORL pot fi realizate ntre flagul C i bitul adresat sau complementul lui. Una din aplicaiile tipice ale operaiilor pe bit este rezolvarea unor funcii logice complexe (combinaionale) care, uzual, este abordat hard (cu pori logice). n exemplele care urmeaz sunt prezentate trei modaliti de abordare a implementrii funciei logice: F = (U ( V+W ) ) + (X /Y) + /Z, pentru punerea n eviden a avantajelor care rezult (cod compact, vitez, claritate) din utilizarea facilitilor de calcul boolean. Exemplu. S se implementeze funcia logic F de 6 variabile folosind operaii booleene; U i V sunt variabile de intrare reprezentnd intrrile a dou porturi I/O (P1.1 i P2.2), W i X au semnificaia unor bii de stare ai unor periferice (furnizai de registrul de control al timerelor TCON.5 i TCON.6), iar Y i Z sunt fanioane software. Valoarea funciei F este furnizat pe pinul de ieire al portului 3 (P3.3). OUTBF EQU 22H ;aici se memoreaz starea ieirii ; 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 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
Page 11 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

TESTZ:

CLRF:

SETF: OUTF:

MOV A,21H ANL A,#00000001B JZ SETF MOV A,OUTBF ANL A,#11110111B JMP OUTF MOV A,OUTBF ORL A,#00001000B MOV OUTBF,A MOV A,P3

;ncarc Z

Exemplu. S se implementeze funcia logic F folosind doar instruciuni 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 ;citete 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 funcie F

Page 12 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

Sistem minimal realizat cu microcontrolerul 8051 Sistemul minimal prezentat n figura 2.3 urmtoare conine: 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.

Figura 2.3 Sistem minimal cu microcontrolerul 8051

Page 13 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

Exemplu de aplicaie utiliznd microcontrolerul 8051 Tastaturile alfanumerice constau dintr-o matrice de 8x8 linii, respectiv 8 linii de scanare i 8 linii de recepie ca n figura 2.4. 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 recepie. Apsnd o tast, se conecteaz o linie de scanare la o linie de recepie, rezultnd un 0-logic pe linia respectiv de recepie. Cele 8 linii de recepie sunt trecute printr-o poart I-logic astfel nct trecerea n 0-logic a oricreia din liniile de recepie va genera o ntrerupere. Se consider c starea celor dou seturi de linii, la apariia ntreruperii, este cea descris anterior.

LINII DE SCANARE

LINII DE RECEPTIE

I 8051

P1 P2

INT0

Figura 2.4 Schema circuitului de scanare a tastaturii Rutina de deservire a ntreruperii trebuie s identifice care din taste a fost apsat, dac se presupune c dou taste nu pot fi apsate simultan. Starea curent a liniilor de recepie este memorat ntr-un registru intern. Dac o singur tast este apsat, toate liniile de recepie mai puin una (cea la care aparine tasta apasat) vor fi citite ca 1 logic. Dup aceea procesul se inverseaz, adic este nscris 0 logic pe liniile de recepie i 1 logic pe liniile de scanare, iar liniile citite sunt cele de scanare. Dac o singur tast este apsat, numai una dintre aceste linii de scanare va fi citit ca 0 logic. Localiznd unicul nivel logic 0 din fiecare set de linii, se identific tasta apsat. Dac mai mult de dou taste ale matricii sunt apsate simultan, atunci unul sau ambele seturi de linii vor conine mai muli de 0. O subrutin are sarcina de a determina care din cei 8 bii din fiecare set este 0. Dac se apas mai multe taste simultan, nu se va executa nici o aciune. Pentru tastele ce trebuie apsate simultan cu alte taste (ex.: Shift, Alt, Control), nu se face conectarea la liniile matricei. Aceste taste speciale vor fi conectate direct la cte un pin al portului microcontrolerului, n acest mod existnd posibilitatea generrii unei comenzi dac pe lng tasta special se mai apas o tast; mai mult se previne generarea unei
Page 14 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

ntreruperi la apsarea singular a tastei speciale. n mod normal microcontrolerul va atepta apsarea unei taste, dac nu exist alte activiti pe care trebuie s le rezolve. Generarea unei ntreruperi, ca urmare a apsrii unei taste, scoate microcontrolerul din starea de ateptare. Rutina de tratare a ntreruperii ateapt un interval de aproximativ 30ms pentru ca tasta s fac un contact sigur, dup care identific sursa de ntrerupere (tasta care a fost apsat). Pentru contactele mecanice ale tastelor exist un interval de maxim 30ms n care contactul nu este stabil i deci trebuie s se atepte un interval de timp dup care s se fac citirea corect a tastei apsate. Subrutina care determin care din cei 8 bii din cele dou seturi de linii este 0 i dac mai mult de 1 bit este 0, se numete SCAN. Pentru a utiliza subrutina se ncarc datele de pe linii ntr-o locaie a RAM-ului adresabil pe bit numit LINE i se apeleaz subrutina SCAN. Numrul de bii LINE care sunt 0 este returnat n ZERO_COUNTER. Dac numai 1 bit este zero, numrul su de ordine (poziia: 1...8) este returnat n ZERO_BIT. Rutina de tratare a ntreruperii generate la apsarea unei taste, este urmtoarea: *****************************************************************************
RASPUNS_LA_APASARE_TASTA: CALL ASTEPT_STABILIZ_TASTA ;se apeleaz o subrutin care este o ;bucl de ateptare (30ms) pentru ;stabilizarea contactului tastei (vezi ;explicaia din text) ;se ncarc n variabila LINE valorile ;logice de pe liniile de recepie ;conectate la portul P1 ;se apeleaz subrurtina SCAN care ntoarce ;n variabila ZERO_COUNT numrul de bii ;0 din LINE, adic de pe liniile de ;recepie. Deci se identific poziia pe ;orizontal a tastei apsate ;decrementeaz ZERO_COUNTER i execut ;salt la REJECT dac ZERO_COUNTER 0 ;mut la adresa ADDRESS, pe ZERO_BIT care ;conine rangul bitului cu valoarea 0 din ;LINE liniile de recepie ;se ncarc la port P2, adic pe liniile ;de scanare, 1 logic pe fiecare linie ;(FFH) ;se ncarc la port P1, adic pe liniile ;de recepie 0, urmnd s fie citite ;liniile de scanare n LINE ;se ncarc starea liniilor de scanare ;conectate la P2, n LINE ;se testeaz liniile de scanare. Dup ;execuia subrutinei, variabila ZERO_BIT ;va conine rangul bitului care este 0 de ;pe liniile de scanare i se identific ;poziia pe vertical a tastei apsate ;se interschimb coninutul ;acumulatorului cu variabila ZERO_BIT ;astfel c nu se pierde coninutul ;acumulatorului ;permut nibbelul inferior cu cel ;superior al acumulatorului n care se ;afl ZERO_BIT Page 15 of 17

MOV LINE, P1 CALL SCAN

DJNZ ZERO_COUNTER,REJECT MOV ADDRESS, ZERO_BIT MOV P2, #0FFH MOV P1, #0 MOV LINE, P2 CALL SCAN

DJNZ ZERO_COUNTER, REJECT XCH A, ZERO_BIT

SWAP A

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu ORL ADDRESS, A XCH A, ZERO_BIT REJECT: MOV P1, #0FFH MOV P2, #0 INTEL 8051 ;se execut SAU-logic ntre ADDRESS i ;A, cu rezultatul n ADDRESS ;se reface coninutul acumulatorului

;se reface starea celor dou seturi de ;linii dinaintea generrii ntreruperii ;(momentul apsrii tastei), ncrcnd ;1 pe liniile de recepie (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 numr 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 apsat i se ;nregistreaz n ZERO_BIT ca linia ;activ ;este linia 1. Procedura continu i ;pentru ceilali bii ai lui LINE ONE: JB LINE.1,TWO ;linia numr 2 este activ. INC ZERO_COUNTER MOV ZERO_BIT, #2 TWO: JB LINE.2, THREE ;linia numr 3 este activ. INC ZERO_COUNTER MOV ZERO_BIT, #3 THREE:JB LINE.3, FOUR ;linia numr 4 este activ. INC ZERO_COUNTER MOV ZERO_BIT, #4 FOUR: JB LINE.4, FIVE ;linia numr 5 este activ. INC ZERO_COUNTER MOV ZERO_BIT, #5 FIVE: JB LINE.5, SIX ;linia numr 6 este activ. INC ZERO_COUNTER MOV ZERO_BIT, #6 SIX: JB LINE.6, SEVEN ;linia numr 7 este activ. INC ZERO_COUNTER MOV ZERO_BIT, #7 SEVEN:JB LINE.7, EIGHT ;linia numr 8 este activ. INC ZERO_COUNTER MOV ZERO_BIT, #8 EIGHT:RET ;revenire din subrutin

***************************************************************************** Observaii: 1) Instruciunea DJNZ ZERO_COUNTER, REJECT execut urmtoarea aciune: decrementeaz valoarea lui ZERO_COUNTER. Dac valoarea lui ZERO_COUNTER este iniial mai mare dect 1, ceea ce semnific apsarea 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 apsat o singur tast, atunci prin decrementare el devine 0 i nu se mai execut saltul.
Page 16 of 17

Curs MICROCONTROLERE Prof. Dr.Ing. Vasile Lzrescu .L.Dr.Ing. Rodica Constantinescu INTEL 8051

2) Instruciunea MOV ADDRESS,ZERO_BIT ncarc la locaia ADDRESS rangul liniei de recepie pe care se gsete tasta apsat. Apoi se testeaz i liniile de scanare i n ZERO_BIT se obine rangul liniei de scanare pe care se gsete tasta apsat. Dup execuia secvenei de instruciuni: XCH A, ZERO_BIT SWAP A ORL ADDRESS, A pe semioctetul superior al variabilei ADDRESS se regsete rangul liniei scanate pe care se afl tasta apsat (vezi ultimele dou instruciuni ale secvenei), iar pe semioctetul inferior al variabilei ADDRESS se gsete rangul liniei de recepie corespunztoare tastei apsate (vezi instruciunea MOV ADDRESS, ZERO_BIT). Rangul liniei, care poate avea 8 valori, se reprezint pe un semioctet. 3) ntreruperea generat de apsarea unei taste trebuie s fie activ pe front. Dac ar fi activ pe palier atunci att timp ct tasta se menine apsat rutina s-ar executa de mai multe ori. 4) nainte de prsirea subrutinei de tratare a ntreruperilor se execut resetarea flagului de ntrerupere extern (Ex0) asociat intrrii de cerere de ntrerupere INT0. Cererea de ntrerupere seteaz flagul Ex0, aceast setare genernd 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 ateptare 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 ieirea din rutin, n caz contrar rutina executndu-se de mai multe ori. 5) n rutina ASTEPT_STABILIZ _TASTA va trebui s ncrcm un timer cu valoarea corespunztoare ntrzierii. Relaia ntre valoarea ncrcat i ntrzierea n msecunde este: f (kHz) ntrziere(ms) valoare ncarcat = osc 12 De exemplu, dac frecvena oscilatorului este 3,58 MHz pentru o ntrziere de 30 ms se obine 8950 reprezentat ca DD0AH.

Page 17 of 17

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