Documente Academic
Documente Profesional
Documente Cultură
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.
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
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
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.
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
; 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
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
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
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
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
acolo:
Cod
Operatie
SJMP
Operanzi
MOV
A,#43h
Acolo
Comentariu
; salt la instructiunea cu eticheta acolo
;incarca acumulatorul cu constanta 43 in hexazecimal
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 ;.
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
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
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
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
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
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
MOV
65h,98h
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
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
13
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
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.
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.
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.
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
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
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
$
19
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
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
20
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
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
$
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:
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
$
Intrari:
Iesiri:
DIGIT:
CHAR:
(1000h) = 0Ch
(0100h) = 43h C
b)
Intrari:
Iesiri:
DIGIT:
CHAR:
(1000h) = 06h
(0100h) = 36h
23
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
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
$
Intrari:
Iesiri:
CHAR:
DIGIT:
(1000h) = 37h 7
(0100h) = 07h
b)
Intrari:
Iesiri:
CHAR:
DIGIT:
(1000h) = 55h
(0100h) = FFh
24
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
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
$
b)
Intrari:
STRING:
Iesiri:
NUMAR:
Intrari:
STRING:
Iesiri:
NUMAR:
(1000h) = 02h
(1001h) = 09h
(1002h) = 1Dh = 2910
(1000h) = 09h
(1001h) = 07h
(1002h) = 61h = 9710
25
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
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
27
Sisteme Incorporate
Lucrarea 1
Arhitectura interna a microcontrolerului P89C51RD2. Moduri de adresare. Programarea in limbaj de asamblare
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
Intrari:
Iesiri:
CODE:
DIGIT:
(1000h) = 4Fh
(0100h) = 03h
b)
Intrari:
Iesiri:
CODE:
DIGIT:
(1000h) = 28h
(0100h) = FFh
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
Intrari:
Iesiri:
NUMAR:
STRING:
(1000h) = 1Dh
(0100h) = 02h
(0101h) = 09h
b)
Intrari:
Iesiri:
NUMAR:
STRING:
(1000h) = 61h
(0100h) = 09h
(0101h) = 07h
30