Sunteți pe pagina 1din 30

Sisteme Incorporate

Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Lucrarea 1
Microcontrolerul P89C51RD2. Arhitectura interna.
Programarea in limbaj de asamblare
1. Microcontrolerul P89C51RD2
1.1. Arhitectura microcontrolerului P89C51
Circuitul P89C31RD2 este un microcontroler pe 8 biti apartinand familiei MCS51.
Schema bloc a cicuitului este prezentata in figura 1.1. Diferenta fata de circuitul
reprezentativ (8051), al familiei din care face parte microcontrolerul P89C51RD2, este
aceea ca acesta din urma contine in structura sa memorie FLASH EPROM incorporata.

Figura 1.1. Schema bloc interna a microcontrolerului P89C51RD2

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Deoarece majoritatea resurselor interne ale microcontrolerului P89C51RD2 vor constitui


subiecte separate pentru urmatoarele lucrari, in prezenta lucrare nu se face decat o
trecere in revista a elementelor esentiale, pentru intelegerea de principiu a structurii si
functionarii circuitului.
Caracteristic pentru P89C51RD2 este faptul ca spatiul de memorie externa este impartit
in doua blocuri distincte si anume: memorie program si memorie de date.
Principalele caracteristici ale circuitului P89C51RD2 sunt:
- oscilator si generator de tact incorporat;
- unitate centrala pe 8 biti compatibila cu 8051;
- 32 de linii de intrare/iesire I/O grupate in patru porturi P0, P1, P2 si P3;
- 64 Koct FLASH EPROM memorie program interna;
- 1 Koct memorie RAM interna;
- 64 Koct spatiu de adresare pentru memoria program externa;
- 64 Koct spatiu de adresare pentru memoria de date externa;
- trei numaratoare/temporizatoare pe 16 biti fiecare denumite T0, T1, reespectiv T2;
- sapte surse de intrerupere cu patru nivele de prioritate;
- port serial de transmisie duplex;
- matrice de countere programabile (PWM, resteriv capture/compare);
- procesor boolean.

1.2. Organizarea memoriei de date interna a microcontrolerului


P89C51RD2
Memoria RAM interna si externa a circuitului P89C51RD2 este impartita in impartita in
patru zone (segmente) distincte:
- primii 128 de octeti (de la adresa 00h pana la adresa 7Fh) zona disponibila
programatorului prin adresare directa sau indirecta,
- urmatorii 128 de octeti (de la adresa 80h pana la adresa FFh) zona disponibila numai
prin adresare indirecta;
- zona registrelor cu functii speciale SFR-uri (de la adresa 80h pana la adresa FFh)
zona disponibila numai prin adresare indirecta;
- zona de extensie a memoriei RAM interne ERAM de 768 octeti (de la adresa 00h pana
la dresa 2FFh) zona disponibila numai prin adresare directa.
In figura 1.2 este prezentata simbolic organizarea memoriei de date interna a
microcontrolerului P89C51RD2.

Figura 1.2 Organizarea memoriei de date interna a microcontrolerului P89C51RD2

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Observatie: Detalii legate de organizarea, proiectarea si programarea memoriei program,


respectiv de date ale microcontrolerului P89C51RD2 vor fi prezentate intr-o lucrare de laborator.
In tabelul 1.1 este prezentata structura zonei memoriei de date interna corespunzatoare
registrelor cu functii speciale (SFR).
Principalele registrele cu functii speciale (SFR) ale micorocntrolerului P89C51RD2 sunt:
- acumulatorul pe 8 biti ACC;
- registrul B folosit in timpul operatiilor de inmultire si impartire;
- program counter PC;
- program status word PSW registrul PSW contine informatii de stare (registru de
fanioane), iar structura lui este prezentata in figura 1.3;

Figura 1.3. Structura registrului PSW

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Simbol
ACC1)
AUXR2)
AUXR12)
B1)
CCAP0H2)
CCAP1H2)
CCAP2H2)
CCAP3H2)
CCAP4H2)
CCAP0L2)
CCAP1L2)
CCAP2L2)
CCAP3L2)
CCAP4L2)
CCAPM02)
CCAPM12)
CCAPM22)
CCAPM32)
CCAPM42)
CCON1) 2)
CH2)
CL2)
DPTR
DPH
DPL
IE1)
IP1)
IPH
P01)
P11)
P21)
P31)
PCON1) 2)
PSW1)
RCAP2H2)
RCAP2L2)
SADDR2)
SADEN2)
SBUF
SCON1)
SP
TCON1)
T2CON1)
T2MOD2)
TH0
TH1
TH22)
TL0
TH0
TL22)
TMOD
WDTRST

Descriere
Acumulator
Registru Auxiliar
Registru Auxiliar 1
Registrul B
Captura HIGH Modul 0
Captura HIGH Modul 1
Captura HIGH Modul 2
Captura HIGH Modul 3
Captura HIGH Modul 4
Captura LOW Modul 0
Captura LOW Modul 1
Captura LOW Modul 2
Captura LOW Modul 3
Captura LOW Modul 4
Mod de lucru Modul 0
Mod de lucru Modul 1
Mod de lucru Modul 2
Mod de lucru Modul 3
Mod de lucru Modul 4
Control Counter PCA
Partea HIGH a conterului PCA
Partea LOW a counterului PCA
Registrul pointer (2 octeti)
Registrul pointer partea HIGH
Registrul pointer partea LOW
Registrul validare intreruperi
Registrul prioritati intreruperi
Registrul prioritati HIGH
Registrul portului 0
Registrul portului 1
Registrul portului 2
Registrul portului 3
Registrul pentru controlul puterii consumate
Registrul fanioanelor de control
Caputa HIGH pentru timerul 2
Captura LOW pentru timerul 2
Registrul de adresa slave
Registrul masca pentru adresa slave
Registrul buffer pentru comunicatia seriala
Registrul de control pentru comunicatia seriala
Registrul indicator stiva
Registrul de control a timerelor 0 si 1
Registrul de control al timerului 2
Registrul de control al modului de lucru pentru timerul 2
Timer 0 partea HIGH
Timer 1 partea HIGH
Timer 2 partea HIGH
Timer 0 partea LOW
Timer 1 partea LOW
Timer 2 partea LOW
Registrul de control al modului de lucru pentru T0 si T1
Reset timer watchdog

1) registrii adresabili pe bit


2) registrii specifici lui P89C51RD2 fata de versiunea clasica 8051
Tabelul 1.1. Structura memoriei de date interna corespunzatoare SFR-urilor

Adresa
E0h
8Eh
A2h
F0h
FAh
FBh
FCh
FDh
FEh
EAh
EBh
ECh
EDh
EEh
DAh
DBh
DCh
DDh
Deh
D8h
F9h
E9h
83h
82h
A8h
B8h
B7h
80h
90h
A0h
B0h
87h
D0h
CBh
CAh
A9h
B9h
99h
98h
81h
88h
C8h
C9h
8Ch
8Dh
CDh
8Ah
8Bh
CCh
89h
A6h

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

-stack pointer SP este un registru pe 8 biti, continutul lui fiind incrementat in timpul
executiei instructiilor de depunere in stiva sau de apel a unei subrutine. Stiva poate fi
pozitionata in orice zona a memoriei de date interna iar la initializarea circuitului in
registrul SP se incarca valoare 07h;
- data pointer DPTR este impartit in doua registre pe 8 biti DPH octetul superior
respectiv DPL octetul inferior. Acest registru este folosit pentru memorarea adresei pe
16 biti a unei locatii de memorie din memoria de date externa, dar el poate fi folosit si ca
doua registre independente pe 8 biti;
- Port 0,1,2,3 P0, P1, P2, P3 sunt latchurile corespunzatoare porturilor de intrare iesire
P0, P1, P2 si P3;
- Serial data buffer SBUF registru aferent sistemului de comunicatie seriala care
contine doua buffere separate unul pentru emisie si unul pentru receptie. Cand data este
transmisa la SBUF ea este incarcata in bufferul corespunzator emisiei iar la receptie data
este preluata de la SBUF din bufferul de receptie;
- Registrele timer/counter sunt registre pe 16 biti avand insa si diponibilitatea de a lucra
pe 8 biti. Microcontrolerul P89C51RD2 dispune de trei timere T0, T1 si T2 impartite in
TH0 partea high a timerului 0 respectiv TL0 partea low a timerului 0 si analog
pentru T1 (TH1 si TL1), respectiv T2 (TH2 si TL2);
- Registrele de control IP, IE, TMOD, TCON,SCON si PCON se refera la controlul
sistemului de intreruperi, a timerelor , a portului serial sia consumului de putere.
Observatie: Structurile interne ale registrelor, modurile de programare si utilizare a tuturor
registrelor vor fi prezentate si experimentate ulterior in lucrari de sine statatoare.

2. Programarea in limbaj de asamblare a microcontrolerelor


din familia MCS51
2.1. Preliminarii
Programarea n limbaj de asamblare (LA) reprezinta activitatea de elaborare a
programelor ntr-un limbaj care se apropie ntr-o importanta masura de resursele
primare ale microcontrolerului.
Intre limbajul cod masina si cel de asamblare este o corespondenta biunivoca astfel incat
se poate considera c LA permite nivelul cel mai avansat de gestionare a
disponibilitatilor unui microcontroler.
O modalitate de a usura manevrarea unei instructiuni in cod binar, octal sau
hexazecimal este substituirea acesteia printr-un mnemonic. Pentru scrierea unui
program in limbaj de asamblare trebuie cunoscute mnemonicele tuturor instructiunilor
si regulile de scriere ale acestora (sintaxa).
Datorita faptului ca instructiunile sunt specifice fiecarui microcontroler in parte, un
limbaj de asamblare este dependent de tipul microcontrolerului utilizat.

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

2.2. Sintaxa instructiunilor in limbaj de asamblare


O linie instructiune scrisa in limbajul de asamblare MCS51 respecta regulile de
formare generale admise pentru limbajele simbolice.
O instructiune scrisa in limbaj de asamblare are urmatoarea forma generala:
eticheta: cod_operatie operand1,operand2

; comentariu

Eticheta
Este optionala pentru o instructiune. Eticheta este o substituire cu o adresa simbolica a
adresei locatiei de memorie in care se va inscrie instructiunea.
Cand se face referire la adresa locatiei de memorie respective , in loc sa se specifice
adresa absoluta, se exprima prin cuvantul eticheta. Lungimea unei etichete este limitata
la sase caractere alfanumerice; primul caracter trebuie sa fie o litera sau un carcter
special (nu cifra). Dupa ultimul caracter al etichetei trebuie sa urmeze caracterul :.
Nu pot fi utilizate ca etichete mnemonicele instructiunilor si numele registrelor interne
ale microcontrolerului.
Intr-un program nu pot exista doua etichete cu acelasi nume.

Codul operatiei
Contine doar mnemonicele instructiunilor admise pentru microcontrolerele din familia
MCS51

Operand1, Operand2
In aceste campuri se inscriu datele asupra carora opereaza instructiune data prin codul
operatiei. Unele instructiuni nu necesita operandul 2
In cazul instructiunilor cu 2 operanzi, primul operand specifica destinatia operatiei iar al
doilea operand specifica sursa datei.
Operanzii pot specifica:
a) Un registru
b) Un octet/cuvant data
c) Un octet/cuvant adresa
Modurile de exprimare a operanzilor sunt:
1. Constanta hexazecimala trebuie sa inceapa cu o cifra 0 9 si sa se termine cu litera h
(sau H)
Exemplu:
Eticheta
aici:

Cod
Operatie
MOV
MOV

Operanzi

Comentariu

A,#0BAh ; incarca acumulatorul cu numarul BA in hexazecimal


A,#37h ; incarca acumulatorul cu numarul 37 in hexazecimal

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

2. Constanta zecimala un numar zecimal situat intr-un camp operand se poate termina
cu litera D. Orice numar pentru care nu se exprima in ce baza este scris se considera
zecimal
Exemplu:
Eticheta

Cod
Operatie
MOV
MOV

aici:

Operanzi

Comentariu

A,#100D ; incarca acumulatorul cu numarul 100 in zecimal


A,#343 ; incarca acumulatorul cu numarul 343 in zecimal

3. Constanta octala un numar in baza 8 cand este situat in campul operand trebuie sa
fie urmat de litera q (sau Q)
Exemplu:
Eticheta
aici:

Cod
Operatie
MOV

Operanzi
A,#47q

Comentariu
; incarca acumulatorul cu numarul 47 in octal

4. Constanta binara un numar in baza 2 cand este situat in campul operand trbuie sa
fie urmat de litera b (sau B)
Exemplu:
Eticheta
aici:

Cod
Operatie
MOV

Operanzi

Comentariu

A,#11110110b ; incarca acumulatorul cu numarul 246 exprimat


; in binar

5. Numarul de adresa a locatiei de memorie (din program) numaratorul de locatii


contine in fiecare moment valoarea adresei locatiei de memorie in care se afla
instructiunea sau data curenta; se face referire la aceasta adresa prin caracterul $
Exemplu:
Eticheta
salt:

Cod
Operanzi
Comentariu
Operatie
SJMP
$+6
;se va face in program un salt de 6 locatii incepand de
;la adresa locatiei in care se afla primul octet al
; instructiunii SJMP, adica de la eticheta salt

6. Constanta ASCII un caracter alfanumeric inclus intre ghilimele situat in campul


operand va fi substituit cu valoarea corespunzatoare a codului ASCII

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Exemplu:
Eticheta
carct:

Cod
Operatie
MOV

Operanzi
A,#*

Comentariu
; incarca acumulatorul cu codul ASCII al
;caracterului asterix 2Ah

7. Simbol asignat operandul poate fi constituit dintr-un simbol caruia anterior i s-a
atribuit o valoare. In momentul cand se executa linia de program in care ca operand
exista acest simbol, acesta va fi substituit cu valoarea atribuita anterior.
Exemplu:
Simbolului VAL i s-a atribuit anterior valoarea 8Ah, urmatoarele linii fiind echivalente.
Eticheta
adres1:
adres1:

Cod
Operanzi
Comentariu
Operatie
MOV
A,#8Ah ;incarca acumulatorul cu valoarea 8A in hexazecimal
MOV
A,#VAL ; incarca acumulatorul cu valoarea 8A in hexazecimal

8. Adresa simbolica in campul operand poate aparea o adresa reprezentata prin


eticheta sa
Exemplu
Eticheta
aici:

acolo:

Cod
Operatie
SJMP

Operanzi

MOV

A,#43h

Acolo

Comentariu
; salt la instructiunea cu eticheta acolo
;incarca acumulatorul cu constanta 43 in hexazecimal

9. Expresii artimetice si logice o expresie poate fi constituita din toate tipurile de


operanzi descrisi pana aici legati prin intermediul operatorilor aritmetici: + (adunare), (scadere), * (inmultire), / (impartire), MOD (modulo). Sau operatorii logici: NOT, AND,
OR, XOR, de deplasare la stanga SHL, dreapta SHR si cu ajutorul parantezelor [2].
Ordinea in care sunt efectuate operatiile aritmetice si logice dintr-o expresie este:
1. expresiile din paranteze;
2. *,/,MOD,SHL,SHR;
3. +, -;
4. NOT;
5. AND;
6. OR, XOR.
Operatorii MOD, SHL, SHR, NOT, AND, OR si XOR trebuie sa fie separati de operanzi
cu cel putin un blanc.

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Comentariul
Este un camp facultativ in scrierea unei instructiuni. Delimitatorul intre campurile
operanzi este caracterul ;, pentru o anumita ordonare pot fi lasate si cateva blancuri.
Comentariul se introduce pentru a usura intelegerea si urmarirea unui program prin
explicatii suplimentare. Cu acelasi comentariu se pot ocupa mai multe randuri, dar
fiecare trebuie sa inceapa cu delimitatorul ;.

2.3. Pseudoinstructiuni (directive)


Sunt instructiuni speciale menite doar pentru facilitarea scrierii programului si pentru a
determina anumite operatii impuse de programator in procesul de asamblare.
O directiva nu este convertita intr-un cuvant binar (cazul instructiunilor) pentru
comanda microcontrolerului (nu produce cod obiect).

Tipuri de directive
ORG origin scrisa inaintea unei instructiuni va fixa prin valoarea expresiei adresa
locatiei din memorie la care se va inscrie primul octet al acestei instructiuni
Sintaxa:
Eticheta
[Nume]

Cod
ORG

Operand
Expresie

Pentru directiva ORG eticheta este optionala, iar expresia (sau data) cand este convertita
intr-o valoare numerica se exprima printr-un numar 65.535 (modulo 64K).
Exemplu:

Start:

ORG 1000h
MOV
MOV

ORG acolo
MOVX
MOV

;directiva ORG
A,#35h ;instructiunea cu eticheta start va fi inscrisa
;la adresa 1000h
DPTR,#1000h
;directiva ORG
A,@DPTR ;instructiunea ce urmeaza dupa ORG va fi plasata
la ;adresa atribuita etichetei acolo
R0,A

Obs. In sintaxa directivelor este optional ceea ce se include in parantezele drepte


EQU equate atribuie numelui din campul eticheta o valoare egala cu cea a expresiei
constantei sau simbolului din campul operand. Cand in campul operand exista un
simbol acesta trebuie definit in program inainte de linia cu directiva EQU

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Sintaxa:
Eticheta
Nume

Cod
EQU

Operand
Expresie

Exemplu:
tabl1
start

EQU
EQU
ORG start
MOVX

MOV

5
1000h

;se va atribui variabilei tabl1 valoarea 5


;se va atribui etichetei start valoarea 1000h
;directiva ORG
A,@DPTR ;instructiunea ce urmeaza dupa ORG va fi
;plasata la adresa atribuita etichetei start adica
;1000h
R0,A

DB Define Byte defineste constante de un octet sau un sir de date cu lungimea de un


octet
Sintaxa:
Eticheta
[Nume]

Cod
DB

Operand
Expresie sau Sir

Operandul poate contine constante, expresii aritmetice si logice, sau un sir de caractere
ASCII incluse intre ghilimele. Toate aceste marimi sunt separate prin virgula.
Corespunzator acestor marimi rezulta un sir de octeti care sunt plasati in locatii
succesive, prima locatie avand adresa la care este situata linia de program cu directiva
DB.
Exemplu:
sir

DB

data1
data2

DB
DB

TIMP

;incepand cu locatia de memorie de adresa


;simbolica sir vor fi ocupate de octetii: 54h=T
;49h=I 4Dh=M 50h=P
0A3h
;in locatia etichetata data1 se va inscrie numarul ;A3h
-03h,5*2 ;in locatia de adresa data2 se inscrie FDh (-03h ;in
complement de 2), iar in locatia de adresa ;data2+1
se ;inscrie 0Ah

DS Define Storage prin aceasta directiva se pot rezerva (pentru utilizari ulterioare)
zone de memorie. In campul operand poate fi introdusa o constanta, un simbol sau o
expresie, valoarea acestora indicand numarul de locatii ce se vor rezerva in memorie.

10

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Sintaxa:
Eticheta
Nume

Operand
Expresie

Cod
DS

Exemplu:
stiva

DS

100

;se rezerva in memorie 100 de locatii incapand ;de


la adresa simbolica stiva

END end indica sfarsitul programului, este ultima linie scrisa. Cand exista o expresie
in campul operand, valoarea acesteia va fi folosita ca adresa de inceput a programului,
iar daca nu exista valoarea de inceput este 0. In program directiva END trebuie sa apara
o singura data
Sintaxa:
Eticheta
[Nume]

Cod
END

Operand
Expresie

2.4. Modurile de adresare ale microcontrolerelor din familia MCS51


Performantele oricarui microcontroler sunt puternic afectate de modul cum reuseste sa
aduca (citeasca)/sa duca (inscrie) datele (operanzii) din/in memorie.
Modul de construire (compunere) a adresei locatiei de memorie vizate este denumit
mod de adresare.
Modul de adresare utilizat pentru accesarea operanzilor, infuenteaza direct timpul
necesar executiei unei intructiuni, respectiv numarul de locatii de memorie program
ocupate (consumate) pentru memorarea unei instructiuni.
Microcontrolerele din familia MCS51 folosesc cinci moduri de adresare:
adresare directa;
adresare indirecta prin registru;
adresarea registrilor;
adresare imediata;
adresare indexata.

Adresarea directa
Reprezinta cel mai simplu mod de adresare a operanzilor stocati in memorie.
Obs. Acest mod de adresare este utilizabil numai pentru accesarea memoriei de date interna MDI
Fiecare instructiune, care se bazeaza pe adresarea directa a datelor, contine , ca operanzi
(sau operand), adresa locatiei memoriei de date interna in care se afla memorata data
necesara executiei instructiunii.

11

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Operandul este specificat printr-un camp de adresa de 8 biti in instructiune. Numai cei
mai de jos 128 octeti ai MD interne si SFR-urile pot fi adresate direct.
Adresarea directa Exemplu
Eticheta
start:

Cod

Operanzi

Comentarii

ORG 0h
MOV

A,65h

MOV

7Dh,A

MOV

A,98h

MOV

98h,A

;scrie in locatia de memorie aflata in MDI la adresa 98h continutul


; acumulatoarului ;(locatie aflata in zona SFR-urilor)

MOV

65h,98h

;scrie in locatia de memorie aflata in MDI la adresa 65h continutul


;locatiei de memorie ;aflata in MDI la adresa 98h (locatie aflata in
;zona SFR-urilor)

;incarca in acumulator continutul locatiei de


;memorie aflata in MDI la adresa 65h
;scrie in locatia de memorie aflata in MDI la
;adresa 7Dh continutul acumulatoarului
;incarca in acumulator continutul locatiei de memorie aflata
;in MDI la adresa 98h (locatie aflata in zona SFR-urilor)

Adresarea indirecta prin registru


In cazul acestui mod de adresare, adresa unei locatii de memorie in care se afla data
necesara executiei este specificata prin continutul unui registru.
Prin utilizarea acestui mod de adresare , spatiul ocupat in memoria program scade,
crescand in acelasi timp viteza de aducere a datelor, prin scaderea numarului de ciclii de
citire/scriere din/in memorie.
Atat MD interna MDI cat si cea externa MDX pot fi adresate indirect.
Pentru adrese pe 8 biti se pot folosii registrele R0 sau R1 din grupul de registre selectat
sau registrul SP. Pentru adrese pe 16 biti registrul folosit nu poate fi decat DPTR.
Operatorul care indica adresarea indirecta prin registru este caracterul @
Adresarea indirecta prin registru Exemplu
Eticheta
start:

Cod

Operanzi

ORG 0h
MOV
MOV
MOV
MOV

R0,#68h
R1,#98h
DPTR,#1000h
A,@R0h

MOV

@R1,A

MOV
MOVX

A,#54h
@DPTR,A

MOV
MOVX

Comentarii
;incarca in registrul R0 numarul 68h
;incarca in registrul R1 numarul 98h
;incarca in registrul pe 16 biti DPTR numarul 1000h
;incarca in acumulator continutul locatiei de memorie de
; adresa aflata in registrul R0 (locatie in MDI)
;scrie in locatia de memorie de adresa aflata in registrul R1
; (locatie in MDI) continutul acumulatorului
;incarca in acumulator numarul 54h
;scrie in locatia de memorie de adresa aflata in registrul
; DPTR (locatie in MDX) continutul acumulatorului

DPTR,#1001h ;incarca in registrul pe 16 biti DPTR 1000h


A,@DPTR
;incarca in acumulator continutul locatiei de memorie de
; adresa aflata in registrul DPTR (locatie in MDX)

12

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Adresarea registrelor
Acest mod de adresare se foloseste cand data implicata in operatia respectiva se afla
intr-un registru intern.
Accesul prin adresare a celor 8 registrii de lucru (R0-R7) depinde de banca selectata prin
intermediul bitilor Register Bank din PSW. Cei mai putini semnificativi trei biti din
codul instructiunii indica care registru este folosit.
Acumulatorul, registrul B, DPTR pot fi, de asemenea, adresate ca registre.
Adresarea registrelor Exemplu
Eticheta

Cod

Operanzi

start:

ORG 0h
MOV
MOV

R0,A
A,R1

Comentarii
;incarca in registrul R0 continutul acumulatorului
;incarca in acumulator continutul registrul R1

Adresarea imediata
Data necesara in procesarea unei instructiuni este situata in corpul instructiunii.
Adresarea imediata permite utilizarea de constante, ca parte integranta in codul
instructiunii din MP. Operatorul care indica adresarea imediata este caracterul #

Adresarea indexata
Numai MP poate fi adresata indexat, si aceasta poate fi doar citita.
Acest mod de adresare este folosit pentru citirea (cautarea) tabelelor de date memorate
in MP.
Pentru utilizarea acestui mod de adresare sunt utilizati registrii DPTR sau PC ca baza,
respectiv registrul acumulator ACC ca index. Un registru de baza pe 16 biti (DPTR sau
PC) indica baza tabelei, iar in acumulator se pune pozitia din tabela a datei vizate
(indexul).
Adresa finala, a datei vizate din tabela stocata in MP, se formeaza prin adunarea
continutului registrului acumulator la registrul de baza specificat.
Adresarea indexata Exemplu
Eticheta
start:

Cod
ORG 0h
MOV
MOV
MOVC

Operanzi

Comentarii

DPTR,#1000h ;incarca in registrul pe 16 biti DPTR numarul ;1000h


A,#54h
;incarca in acumulator numarul 54h
A,@A+DPTR ;incarca in acumulator continutul locatiei de memorie de
; adresa calculata ca fiind A+DPTR (locatie in MP)

13

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

2.5. Setul de instructiuni al microcontrolerelor din familia MCS 51


Setul de instructiuni se imparte in patru mari grupe:
- instructiuni de transfer de date;
- instructiuni aritmetice;
- instructiuni logice;
- instructiuni de salt si de transfer a controlului.

2.5.1. Instructiuni de transfer de date


Aceste instructiuni se impart in trei grupe distincte:
- transferuri de uz general;
- transferuri specifice acumulatorului;
- transferuri de adresa.

Transferuri de uz general
MOV permite transferul unui bit sau a unui octet de la un operand sursa la un operand
destinatie;
PUSH incrementeaza continutul registrului SP si transfera octetul operandului sursa in
stiva la adresa continuta in SP;
POP transfera un octet din stiva de la locatia adresata de SP la operandul destinatie si
decrementeaza continutul lui SP.
Obseravtie: In fisierele 8031instructionset.pdf, respectiv 8031opcodes.pdf sunt prezentate
toate instructiunile familiei de microcontrolere MCS51.

Transferuri specifice acumulatorului


XCH interschimba operandul sursa pe un octet si continutul acumulatorului A;
XCHD interschimba cei mai putini semnificativi 4 biti ai operandului sursa si cei mai
putini semnificativi 4 biti ai acumulatorului A;
MOVX executa mutarea unui octet intre MD externa si acumulator. Adresa externa
poate fi specificata de registrul DPTR (16 biti) sau de registrii R0 sau R1 (8 biti);
MOVC muta un octet din MP in acumulator. Valoarea anterioara din A se foloseste ca
index intr-o tabela de 256 octeti a carei adresa se afla in registrul de baza (DPTR sau PC).
Operandul la care se face accesul e transferat in acumulator.

14

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Transferuri de adresa
MOV DPTR,#data incarca o data pe 16 biti imediat in perechea de registre DPH si
DPL.

2.5.2. Instructiuni aritmetice


Setul de instructiuni al microcontrolerului 80C31 are incorporat instructiuni pentru
realizarea operatiilor aritmetice de adunare, scadere, inmultire si impartire. In mod
direct circuitul suporta doar operatii intre octeti fara semn. Prin folosirea indicatorului
de depasire este permis ca in operatiile de adunare si scadere sa se foloseasca atat intregi
binari fara semn, cat si cu semn. Sunt posibile de asemenea si operatii aritmetice cu
numere reprezentate in cod BCD impachetat.

Adunare
INC incrementeaza operandul sursa cu o unitate si pune rezultatul in locul
operandului;
ADD aduna continutul acumulatorului la operandul sursa si depune rezultatul in
acumulator;
ADDC adunare cu transport aduna continutul acumulatorului la operandul sursa si
apoi aduna 1 daca CY este setat (1 logic) si depune rezultatul in acumulator;
DA ajustare zecimala a adunarii pentru numere reprezentate in cod BCD corecteaza
rezultatul insumarii dintre doi operanzi zecimali pe doua cifre. Suma zecimala
impachetata care rezulta este depusa in acumulator iar indicatorul CY este setat daca
rezultatul adunarii este mai mare de 77.

Scadere
SUBB scadere cu imprumut scade al doilea operand sursa din primul operand, aflat
in acumulator, scade 1 daca CY=1 si depune rezultatul in acumulator;
DEC decrementare scade o unitate din operandul sursa si depune rezultatul in locul
operandului.

Inmultire
MUL executa inmultirea fara semn a continutului acumulatorului cu continutul
registrului B, rezultatul fiind pe doi octeti, octetul cel mai putin semnificativ in
acumulator iar octetul mai semnificativ in registrul B. Fanionul OV este resetat daca
jumatatea mai semnificativa a rezultatului este zero si este setat in caz contrar, fanionul
CY este resetat iar fanionul AC nu este afectat.

15

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Impartire
DIV executa impartirea unui intreg fara semn pe 8 biti, aflat in acumulator, la un intreg
fara semn pe 8 biti aflat in registrul B. Dupa impartire in acumulator se va gasii catul iar
in registrul B restul.

2.5.3. Instructiuni logice


MCS51 poate executa operatii logice atat la nivel de octet cat si la nivel de bit. De
asemenea operatiile logice pot fi impartite in doua mari grupe: operatii logice cu un
singur operand respectiv operatii logice cu doi operanzi.

Operarii logice cu un singur operand


CLR pune continutul acumulatorului sau orice bit direct adresabil la zero;
SETB seteaza orice bit direct adresabil pe 1 logic;
CPL se foloseste pentru complementarea continutului acumulatorului fara afectarea
indicatorilor sau pentru complementarea oricarui bit direct adresabil;
RL, RLC, RR, RRC, SWAP sunt cinci operatii de rotire care se pot executa asupra
acumulatorului. RL rotire la stanga, RR rotire la dreapta, RLC rotire la stanga prin
CY, RRC rotire la dreapta prin CY, SWAP rotira la stanga cu 4 pozitii. Pentru RLC si
RRC indicatorul CY devine egal cu valoarea ultimului bit care se elimina. SWAP roteste
continutul acumulatorului cu patru pozitii pentru a interschimba bitii 0-3 cu 4-7.

Operatii logice cu doi operanzi


ANL executa un SI logic la nivel de bit intre doi operanzi (atat pentru operanzi de tip
octet cat si pentru operanzi de tip bit) si depune rezultatul in locul primului operand;
ORL executa un SAU logic la nivel de bit intre doi operanzi (atat pentru operanzi de
tip octet cat si pentru operanzi de tip bit) si depune rezultatul in locul primului operand;
XRL - executa un SAU-EXCLUSIV la nivel de bit intre doi operanzi (atat pentru
operanzi de tip octet cat si pentru operanzi de tip bit) si depune rezultatul in locul
primului operand.

2.5.4. Transferul controlului


Exista trei categorii de operatii de salt si de transfer a controlului:
- salturi conditionate si neconditionate;
- apeluri si reveniri din subrutine;
- intreruperi.

16

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Salturi conditionate
Salturile conditionate se executa la indeplinirea unei conditii de salt. Destinatia va fi in
domeniul 256 octeti centrat in jurul adresei de inceput a instructiunii urmatoare (de la
128 la +127).
JZ executa un salt daca continutul acumulatorului este zero;
JNZ executa un salt daca continutul acumulatorului este diferit de zero;
JC executa salt daca CY=1;
JNC executa salt daca CY=0;
JB executa salt daca bitul adresat este 1 logic;
JNB executa salt daca bitul adresat este 0 logic;
JBC executa salt daca bitul adresat este 1 logic si apoi reseteaza bitul adresat;
CJNE compara primul operand cu al doilea si executa un salt daca acestia sunt
diferiti. Fanionul CY este setat daca primul operand este mai mic decat al doilea
operand, altfel este resetat;
DJNZ decrementeaza operandul sursa si pune rezultatul in locul operandului. Se
executa salt daca rezultatul este zero.
Salturi neconditionate
AJMP salt la adresa absoluta transfera controlul programului la adresa modificata cu
valoarea continuta in operand. Operandul instructiunii este pe 11 biti asigurandu-se un
spatiu de destinatie de maxim 2Koct;
LJMP salt lung transfera controlul programului la adresa continuta in operand.
Operandul instructiunii este pe 16 biti asigurandu-se un spatiu de destinatie de maxim
64 Koct;
SJMP salt scurt transfera controlul programului la adresa continuta in operand.
Operandul instructiunii este pe 8 biti asigurandu-se un spatiu de destinatie de maxim
256 octeti centrat in jurul adresei de inceput a urmatoarei instructiuni (de la 128 la
+127);
JMP @A+DPTR executa un salt relativ la registrul DPTR. Operandul din acumulator
este folosit ca offset (0-255) fata de adresa din DPTR.

17

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Apeluri si reveniri din subrutine


ACALL apelare la adresa absoluta salveaza in stiva adresa instructiunii urmatoare si
apoi transfera controlul programului de la adresa destinatie. Este folosita cand adresa
destinatie se afla in pagina de 2 Koct curenta;
LCALL - apelare lunga salveaza in stiva adresa instructiunii urmatoare si apoi
transfera controlul programului de la adresa destinatie. Este folosita pentru asigurarea
transferului controlului programului in orice zona de adresa din intreg spatiul de 64
Koct;
RET transfera controlul programului la adresa de intoarcere salvata in stiva de un apel
anterior si decrementeaza cu doi continutul registrului SP pentru a actualiza continutul
registrului SP dupa extragerea adresei.

Reveniri din intreruperi


RETI transfera controlul ca si in cazul instructiunii RET dar in plus activeaza
intreruperile pe nivelul de priorittate curent.

3. Probleme rezolvate
1. Determinarea lungimii unui sir de caractere
Tema: Determinarea lungimii unui sir de caractere. Adresa de start a sirului, pe 16 biti,
este continuta in variabila START aflata la adresa 1000h (la 1000h partea mai
semnificativa a adresei iar la 1001h partea mai putin semnificativa a adresei).
Terminatorul de sir este marcat prin intermediul caracterului ASCII CR carriage return
(0Dh). Lungimea sirului (fara caracterul CR) va fi depusa in variabila LENGTH aflata in
memorie la adresa 1002h.
Exemple:
a)

b)

Intrari:

START:

Iesiri:

LENGHT:

Intrari:

STRAT:

Iesiri:

LENGHT:

(1000h)=01h
(1001h)=00h
(0100h)=0Dh
(1002h)=00h
(1000h)=01h
(1001h)=00h
(0100h)=4Dh M
(0101h)=43h C
(0102h)=53h S
(0103h)=35h 5
(0104h)=31h 1
(0105h)=0Dh CR
(1002h)=05h

18

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Organigrama corespunzatoare este prezentata in figura 1.4.

Figura 1.4. Organigrama determinarii lungimii unui sir de caractere

Programul corespunzator este:


Start:

Next:

Loop:

Exit:

ORG 0h
MOV
MOVX

DPTR,#1000h
A,@DPTR

MOV
INC
MOVX

R0,A
DPTR
A,@DPTR

MOV
MOV
MOV
MOV
MOV
CJNE

R1,A
DPH,R0
DPL,R1
R0,#00h
A,@DPTR
A,#0Dh,Loop

MOV
MOV

A,R0
DPTR,#1002h

MOVX
SJMP
INC
INC
SJMP
SJMP
END

@DPTR,A
Exit
R0
DPTR
Next
$

;incarcare adresa in DPTR


;citire din MD externa a octetului mai semnificativ
;a adresei de start a sirului
;depunere in registrul R0
;incrementare DPTR
;citire din MD externa a octetului mai putin
;semnificativ a adresei de start a sirului
;depunere in registrul R1
;transfer oms al adresei in DPH
;transfer omps al adresei in DPL
;R0 folosit mai departe pentru Length
;citre din MD externa a caracterelor sirului
;testarea caracterului citit daca este egal cu CR
;(0Dh) nu se face salt
;transfera Length in A
;incarc in DPTR adresa variabilei LENGTH din MD
;externa
;depunere in MD externa
;salt scurt la iesire
;incrementeaza Length
;trecere la urmatorul caracter
;reia bucla
;program blocat aici

19

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

2. Gasirea primului caracter NON-BLANK


Tema: Se cauta intr-un sir de carctere ASCII pana cand se gaseste primul caracter diferit
de BLANK (20h). Adresa de start a sirului, pe 16 biti, este continuta in variabila START
aflata la adresa 1000h (la 1000h partea mai semnificativa a adresei iar la 1001h partea
mai putin semnificativa a adresei). Adresa primului caracter NON-BLANK va fi depusa
in variabila POINTER (pe 16 biti) incepand de la adresa 1002h (la 1002h partea mai
semnificativa a adresei iar la 1003h partea mai putin semnificativa a adresei).
Exemple:
a)

b)

Intrari:

START:

Iesiri:

POINTER:

Intrari:

STRAT:

Iesiri:

POINTER:

(1000h)= 01h
(1001h)=00h
(0100h)=37h 7
(1002h)=01h
(1003h)=00h
(1000h)=01h
(1001h)=00h
(0100h)=20h
(0101h)=20h
(0102h)=20h
(0103h)=4Dh M
(0104h)=43h C
(0105h)=53h S
(0106h)=35h 5
(0107h)=31h 1
(0108h)=20h
(1002h)=01h
(1003h)=03h

Organigrama corespunzatoare este prezentata in figura 1.5.

Figura 1.5.Organigrama gasirii primului caracter NON-BLANK

20

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Programul corespunzator este:


Start:

Loop:

Exit:

ORG 0h
MOV
MOVX
MOV
INC
MOVX
MOV
MOV
MOV
MOVX
CJNE
INC
SJMP
MOV
MOV
MOV
MOV
MOVX
MOV
INC
MOVX
SJMP
END

DPTR,#1000h
A,@DPTR
R0,A
DPTR
A,@DPTR
R1,A
DPH,R0
DPL,R1
A,@DPTR
A,#20h,Exit
DPTR
Loop
R0,DPH
R1,DPL
DPTR,#1002h
A,R0
@DPTR,A
A,R1
DPTR
@DPTR,A
$

3. Inlocuirea zerourilor de inceput a unui sir cu blank-uri


Tema: Se cauta intr-un sir de carctere ASCII (numai numere codificate ASCII nu si
caractere) toate caracterele aflate la inceputul sirului egale cu zero si se inlocuiesc cu
BLANK (20h). Adresa de start a sirului, pe 16 biti, este continuta in variabila START
aflata la adresa 1000h (la 1000h partea mai semnificativa a adresei iar la 1001h partea
mai putin semnificativa a adresei). Primul octet din sir reprezinta lungimea sirului. Sirul
propriuzis incepe cu al doilea octet.
Exemple:
a)

Intrari:

START:

(1000h)= 01h
(1001h)=00h
(0100h)=02h - lungimea sirului
(0101h)=36h
(0102h)=39h
(0101h)=36h
(0102h)=39h

STRAT:

(1000h)=01h
(1001h)=00h
(0100h)=06h
(0101h)=30h
(0102h)=30h
(0103h)=38h

Iesiri:

b)

Intrari:

21

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

(0104h)=30h
(0105h)=35h
(0106h)=31h
(0101h)=20h
(0102h)=20h
(0103h)=38h
(0104h)=30h
(0105h)=35h
(0106h)=31h

Iesiri:

Organigrama corespunzatoare este prezentata in figura 1.6.

Figura 1.6. Organigrama inlocuirii zerourilor de inceput a unui sir cu blank-uri

Programul corespunzator este:


Start:

ORG 0h
MOV
MOVX
MOV
INC
MOVX
MOV
MOV
MOV

DPTR,#1000h
A,@DPTR
R0,A
DPTR
A,@DPTR
R1,A
DPH,R0
DPL,R1

22

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Next:

Exit:

MOVX
MOV
CJNE
SJMP
INC
MOVX
CJNE
MOV
MOVX
DJNZ
SJMP
END

A,@DPTR
R0,A
R0,#00h,Next
Exit
DPTR
A,@DPTR
A,#30h,Exit
A,#20h
@DPTR,A
R0,Next
$

4. Conversie Hexazecimal in ASCII


Tema: Sa se converteasca continutul variabilei DIGIT aflata in memoria de date externa
la adresa 1000h intr-un caracter ASCII care sa reprezinte valoarea in hexazecimal a
variabilei. DIGIT contine un singur digit hexazecimal (partea mai semnificativa a
octetului este zero). Caracterul ASCII obtinut se va depune in memoria de date externa
la adresa 100h.
Exemple:
a)

Intrari:
Iesiri:

DIGIT:
CHAR:

(1000h) = 0Ch
(0100h) = 43h C

b)

Intrari:
Iesiri:

DIGIT:
CHAR:

(1000h) = 06h
(0100h) = 36h

Organigrama corespunzatoare este prezentata in figura 1.7.

Figura 1.7. Organigrama conversiei Hexazecimal in ASCII

23

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Programul corespunzator este:


Start:

Next0:

Next1:
Exit:

ORG 0h
MOV
MOVX
CJNE
JC
ADD
SJMP
ADD
SJMP
END

DPTR,#1000h
A,@DPTR
A,#0Ah,Next0
Next1
A,#37h
Exit
A,#30h
$

5. Conversie ASCII BCD


Tema: Sa se converteasca continutul unei variabile CHAR aflata in memoria de date
externa dintr-un caracter ASCII intr-un numar DIGIT codificat in BCD. Rezultatul va fi
depus in memoria de date externa la adresa 0100h, Daca valoarea continuta in variabila
CHAR nu este reprezentarea ASCII al unui numar codificat BCD continutul variabilei
DIGIT va fi FFh.
Exemple:
a)

Intrari:
Iesiri:

CHAR:
DIGIT:

(1000h) = 37h 7
(0100h) = 07h

b)

Intrari:
Iesiri:

CHAR:
DIGIT:

(1000h) = 55h
(0100h) = FFh

Organigrama corespunzatoare este prezentata in figura 1.8.

Figura 1.8. Organigrama conversiei ASCII BCD

24

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Programul corespunzator este:


Start:

Next0:
Next1:

Exit:

ORG 0h
MOV
MOVX
MOV
CJNE
JC
CJNE
JNC
CLR
SUBB
MOV
MOV
MOV
MOVX
SJMP
END

DPTR,#1000h
A,@DPTR
R0,#0FFh
A,#30h,Next0
Exit
A,#39h,Next1
Exit
C
A,#30h
R0,A
A,R0
DPTR,#0100h
@DPTR,A
$

6. Conversie BCD binar


Tema: Sa se converteasca 2 digiti BCD aflati in variabila STRING in memoria de date
externa de la adresa 1000h intr-un numar binar NUMAR aflata tot in memoria de date
externa la adresa 1002h. Cel mai semnificativ digit BCD se afla la adresa 1000h.
Exemple:
a)

b)

Intrari:

STRING:

Iesiri:

NUMAR:

Intrari:

STRING:

Iesiri:

NUMAR:

(1000h) = 02h
(1001h) = 09h
(1002h) = 1Dh = 2910
(1000h) = 09h
(1001h) = 07h
(1002h) = 61h = 9710

Organigrama corespunzatoare este prezentata in figura 1.9.

25

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Figura 1.9. Organigrama conversiei BCD binar

Programul corespunzator este:


Start:

LOOP:

EXIT:

MULT10:

ORG 0h
MOV
MOV
MOV
ACALL
MOVX
ACALL
INC
DJNZ
MOV
MOV
MOVX
SJMP
ORG 200H
MOV
PUSH
RL
MOV
POP
RL
RL
RL
ADD
MOV
RET

DPTR,#1000H
R0,#02H
R1,#00H
MULT10
A,@DPTR
SUMA
DPTR
R0,LOOP
DPTR,#1004H
A,R1
@DPTR,A
$

A,R1
ACC
A
R7,A
ACC
A
A
A
A,R7
R1,A

26

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

SUMA:

ORG 300H
ADD
MOV
RET
END

A,R1
R1,A

7. Conversie BCD Sapte Segmente


Tema: Sa se converteasca un digit BCD aflat in variabila DIGIT in memoria de date
externa de la adresa 1000h intr-un numar codat pe 7 segmente CODE aflata tot in
memoria de date externa la adresa 100h. In figura 1.10 este prezentat modul de
codificare 7 segmente. Daca digitul care se doreste a se convertii nu este intre 0 9 atunci
CODE este pus pe 00h. Tabela de conversie se afla in memoria program externa de la
adresa SSEG definita prin directiva EQU.

Figura 1.10. Codificarea 7 segmente

Organigrama corespunzatoare este prezentata in figura 1.10.

27

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

Figura 1.10. Organigrama conversiei BCD Sapte Segmente

Programul corespunzator este:


START:

NEXT:

EXIT:

SSEG:

ORG 0h
MOV
MOVX
MOV
CJNE
JNC
MOV
MOVC
MOV
MOV
MOV
MOVX
SJMP
ORG 1000H
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
END

DPTR,#1000H
A,@DPTR
R0,#00H
A,#09H,NEXT
EXIT
DPTR,#SSEG
A,@A+DPTR
R0,A
A,R0
DPTR,#0100H
@DPTR,A
$

3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
6FH

28

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

4. Probleme propuse
1. Conversie ASCII hexazecimal
Sa se scrie un program care sa converteasca o variabila A_DIGIT, aflata in memoria de
date externa la adresa 1000h, codificata ASCII, intr-un numar codficat hexazecimal
H_DIGIT aflat in meoria de date externa la adresa 1001h.
Exemple:
a)

Intrari:
Iesiri:

A_DIGIT:
H_DIGIT:

(1000h) = 43h C
(1001h) = 0Ch

b)

Intrari:
Iesiri:

A_DIGIT:
H_DIGIT:

(1000h) = 36h 6
(1001h) = 06h

2. Conversie 7 segmente BCD


Sa se scrie un program care sa asigure conversia unei variabile CODE aflata in memoria
de date externa la adresa 1000h dintr-un numar codificat 7 segmente intr-un numar
DIGIT codificat BCD si aflat in memoria de date externa la adresa 100h. Daca CODE nu
este codificat 7 segmente in DIGIT se inscrie FFh.
Exemple:
a)

Intrari:
Iesiri:

CODE:
DIGIT:

(1000h) = 4Fh
(0100h) = 03h

b)

Intrari:
Iesiri:

CODE:
DIGIT:

(1000h) = 28h
(0100h) = FFh

3. Conversie BCD ASCII


Sa se un program cu ajutorul caruia sa se converteasca o variabila DIGIT aflata in
memoria de date externa la adresa 1000h dintr-un numar codificat BCD intr-un numar
CHAR codificat ASCII si aflat in memoria de date externa la adresa 100h. Daca DIGIT
nu este un numar BCD continutul lui CHAR va fi spatiul (20h).
Exemple:
a)

Intrari:
Iesiri:

DIGIT:
CHAR:

(1000h) = 07h
(0100h) = 37h 7

b)

Intrari:
Iesiri:

DIGIT:
CHAR:

(1000h) = 55h
(0100h) = 20h

29

Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare

4. Conversie Binar BCD


Sa se scrie un program care sa asigure conversia unei variabile NUMAR aflata in
memoria de date externa la adresa 1000h in doi digiti BCD continuti in variabila
STRING aflata in memoria de date externa de la adresa 100h.
Exemple:
a)

Intrari:
Iesiri:

NUMAR:
STRING:

(1000h) = 1Dh
(0100h) = 02h
(0101h) = 09h

b)

Intrari:
Iesiri:

NUMAR:
STRING:

(1000h) = 61h
(0100h) = 09h
(0101h) = 07h

30

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