Documente Academic
Documente Profesional
Documente Cultură
Laborator x8051
Curs - Microcontrolere
Îndrumar de laborator
Cuprins
3
1 | Prezentarea arhitecturii 8051
Lucrarea de fat, ă urmăres, te înt, elegerea unor not, iuni de bază ale arhitecturii 8051 s, i exemplificarea
acestora sub forma unor aplicat, ii. Exemplele din acest laborator folosesc dispozitive periferice de
bază s, i sunt implementate în mediul de simulare EdSim51.
1.1 Introducere
Proiectarea unui sistem cu microcontroler presupune, într-o primă fază, înt, elegerea capabilităt, ilor
de care dispune mas, ina de calcul folosită pentru implementarea logicii aplicat, iei. Deoarece în timpul
dezvoltării proiectului trebuie avute în vedere anumite limitări (de exemplu, legate de dimensiune,
de energia consumată, de puterea de procesare etc.), este important ca studentul să cunoască micro-
controlerul în raport cu particularităt, ile aplicat, iei care se dores, te a fi implementată.
Pentru a descoperi capabilităt, ile, este necesară studierea schemei bloc a circuitelor interne s, i de-
terminarea tipului arhitecturii, a numărului s, i dimensiunii registrelor s, i a altor periferice de care
dispune microcontrolerul.
Odată cu identificarea acestor informat, ii, se poate trece la studiul setului de instruct, iuni ce oferă
funct, ionalitate suportului fizic. Ulterior, se poate avansa către proiectarea propriu-zisă a sistemului.
Scopul actualei lucrări de laborator este familiarizarea cu toate aspectele unei arhitecturi specifice,
anume Intel 8051.
5
Laborator 1
În Figura 1.2 se poate observa schema bloc a unui microcontroler 8051 generic având următoarele
caracteristici:
• Memorie internă ROM / EPROM1 de până la 64 kB, folosită pentru stocarea programului
• Un număr de 32 de pini de intrare/ies, ire organizat, i sub forma a 4 porturi pe 8 bit, i fiecare: P0-P3
Memoria de date
Pentru 8051, memoria de date este compusă din 2 blocuri având dimensiunea de 128 de octet, i.
Primul bloc cuprinde registrele de uz general (de la 0x00 la 0x1F), o zonă adresabilă pe bit (de la
0x20 la 0x2F) s, i 80 octet, i de uz general (de la 0x30 la 0x7F). Al doilea bloc este reprezentat de zona
registrelor speciale (SFR). Unele versiuni de 8051 dispun s, i de un al 3-lea bloc de dimensiune de 128
de octet, i, de uz general, care împarte spat, iul adreselor cu zona SFR. În acel caz, adresarea în blocul
suplimentar de memorie se face indirect, iar, în zona SFR, în mod direct.
Registre de uz general
Locat, iile de memorie de la 0x00 la 0x1F pot fi adresate ca patru seturi de registre de uz general.
Fiecare set este format din opt registre de câte un octet, etichetate R0 până la R7. Numai unul dintre
aceste seturi este activ la un moment dat. Setul de registre activ este selectat prin intermediul bit, ilor
RS1 (PSW.4) s, i RS0 (PSW.3) din registrul special Program Status Word (PSW).
1
Erasable Programmable Read Only Memory
6
Laborator 1
7
Laborator 1
Diferent, a între accesarea memoriei pe bit sau pe octet este dată de tipul instruct, iunii folosite (operanzi
sursă s, i destinat, ie pe bit sau pe octet). De exemplu, instruct, iunea MOV C, 0x7F va muta valoarea
de bit de la adresa 0x7F (bitul 7 al octetului cu adresa 0x2F) în fanionul Carry.
Registre speciale
Registrele speciale sunt definite sub forma unei zone de memorie cu adrese de la 0x80 până la
0xFF. Acestea oferă control asupra schimbului de date dintre microcontroler s, i periferice. Unele
dintre registre sunt accesabile pe bit, după cum se poate observa în Figura 1.3. Unele adrese sunt
neocupate, iar accesarea acestora nu are un efect bine determinat s, i trebuie evitată.
Stiva
Stiva este localizată în primii 128 de octet, i ai memoriei de date. Zona de stivă este definită cu
registrul special Stack Pointer (SP). Stack Pointer-ul va indica întotdeauna ultima locat, ie folosită.
Următoarea valoare introdusă în stivă va fi plasată la locat, ia SP+1, apoi registrul SP este incremen-
tat. La reset, SP-ul este init, ializat cu valoarea 0x07.
8
Laborator 1
9
Laborator 1
CLR A Clear A 1 12
CPL A Complement A 1 12
RL A Rotate A left 1 12
RLC A Rotate A left through Carry 1 12
RR A Rotate A right 1 12
RRC A Rotate A right through Carry 1 12
SWAP A Swap nibbles of A 1 12
Data transfer
MOV A, Rn Move Register to A 1 12
MOV A, direct Move direct byte to A 2 12
MOV A, @Ri Move indirect RAM to A 1 12
MOV A, #data Move immediate to A 2 12
MOV Rn, A Move A to Register 1 12
MOV Rn, direct Move direct byte to Register 2 24
MOV Rn, #data Move immediate to Register 2 12
MOV direct, A Move A to direct byte 2 12
MOV direct, Rn Move Register to direct byte 2 24
MOV direct, direct Move direct byte to direct byte 3 24
MOV direct, @Ri Move indirect RAM to direct byte 2 24
MOV direct, #data Move immediate to direct byte 3 24
MOV @Ri, A Move A to indirect RAM 1 12
MOV @Ri, direct Move direct byte to indirect RAM 2 24
MOV @Ri, #data Move immediate to indirect RAM 2 12
MOV DPTR, #data16 Load DPTR with 16-bit constant 3 24
MOVC A, @A+DPTR Move code byte relative DPTR to A 1 24
MOVC A, @A+PC Move code byte relative PC to A 1 24
MOVX A, @Ri Move external data (8–bit address) to A 1 24
MOVX @Ri, A Move A to external data (8–bit address) 1 24
MOVX A, @DPTR Move external data (16–bit address) to A 1 24
MOVX @DPTR, A Move A to external data (16–bit address) 1 24
PUSH direct Push direct byte onto stack 2 24
POP direct Pop direct byte from stack 2 24
XCH A, Rn Exchange Register to A 1 12
XCH A, direct Exchange direct byte with A 2 12
XCH A, @Ri Exchange indirect RAM with A 1 12
XCHD A, @Ri Exchange low nibble of indirect RAM with A 1 12
Boolean Manipulation
CLR C Clear Carry 1 12
CLR bit Clear direct bit 2 12
SETB C Set Carry 1 12
SETB bit Set direct bit 2 12
CPL C Complement Carry 1 12
CPL bit Complement direct bit 2 12
ANL C, bit AND direct bit to Carry 2 24
ANL C, /bit AND complement of direct bit to Carry 2 24
ORL C, bit OR direct bit to Carry 2 24
ORL C, /bit OR complement of direct bit to Carry 2 24
10
Laborator 1
Parameter Description
Rn Register R0–R7 of the currently selected register bank
@Ri Data RAM location addressed indirectly through R0 or R1
rel 8–bit, signed (two’s complement) offset relative to the first byte of the following
instruction. Used by SJMP and all conditional jumps
direct 8–bit internal data location’s address. This Could be a direct–access Data
RAM location (0x00–0x7F) or an SFR (0x80–0xFF)
#data 8–bit constant
#data16 16–bit constant
bit Direct–accessed bit in Data RAM or SFR
addr11 11–bit destination address used by ACALL and AJMP. The destination must be
within the same 2kB page of the program memory as the first byte of the following
instruction
addr16 16–bit destination address used by LCALL and LJMP. The destination may be
anywhere within the 64kB program memory space.
Obs: There is one unused opcode(0xA5) that performs the same function as NOP.
All mnemonics copyrighted
c
Intel Corporation 1980.
11
Laborator 1
Atent, ie: Pentru întrebări, nelămuriri s, i probleme întâmpinate la instalare vă rugăm să vă adresat, i
asistentului de laborator.
2
https://www.edsim51.com/8051simulator/edsim51di.zip
3
https://www.java.com/en/download/
12
Laborator 1
Fereastra microcontrolerului
Această secţiune cont, ine elementele de arhitectură utilizate pentru programarea microcontrolerului,
ilustrate în Figura 1.3.
Fereastra perifericelor
Această fereastră este utilizată pentru a simula interact, iunea cu diverse periferice. Dispozitivele
periferice asigură legătura microcontrolerului cu lumea exterioară. Astfel, putem comanda microcon-
13
Laborator 1
trolerul folosind perferice de intrare sau vizualiza rezultatul unei procesări prin intermediul afis, ajelor.
Perifericele şi schema hardware pot fi observate apăsând butonul din stânga ecranului, numit LD
(Logic Diagram).
Simulatorul dispune de următoarele periferice, ilustrate în Figura 1.6, care pot fi legate la diverse
porturi ale microcontrolerului, în funcţie de aplicaţie:
• 8 LED-uri
• Tastatură 4 × 3
• 8 butoane
• 4 afişaje cu 7 segmente
• Interfat, ă UART
• Osciloscop
• Motor
• LCD 2 × 16
14
Laborator 1
1.5 Problema
Să se implementeze un sistem care să comande aprinderea periodică a unui LED cu o frecvent, ă
oarecare. Se va folosi, pentru implementarea sistemului, LED-ul LED 7 atas, at la portul 1, pinul 7
al microcontrolerului conform schemei din Figura 1.6.
• Zona RESET and INTERRUPT VECTORS - în această zonă se definesc vectorii de întrerupere
(dacă nu se lucrează cu întreruperi, este necesar să se definească doar vectorul de reset).
• Zona MAIN PROGRAM CODE SEGMENT - în această zonă se scrie rutina principală a
programului.
• Zona FUNCTION CODE - prin convent, ie, în această zonă se scriu subrutinele programului ce
vor fi apelate în secţiunea descrisă anterior.
În solut, ia propusă în acest laborator, programul va avea mai multe rutine denumite main, delay,
init. Rutina principală (main) apelează o subrutină de întârziere, apoi schimbă starea LED-ului.
Ultima instruct, iune a programului reapelează rutina principală, creând astfel o buclă infinită.
Subrutina de întârziere (delay) constă în două bucle imbricate, având drept contoare registrele
R6, respectiv R7. În cadrul fiecărei bucle apare instrucţiunea DJNZ Rx, etichetă, cu dublu rol
(decrementează registrul Rx s, i face un salt la eticheta specificată în cazul în care valoarea stocată în
Rx este nenulă).
Subrutina de init, ializare dezactivează întreruperile s, i resetează pinul 7 al portului 1 asociat etichetei
LED.
15
Laborator 1
1.6 Exercit, ii
1. Modificat, i programul astfel încât frecvent, a cu care se aprinde LED-ul să fie mai mică.
2. Calculat, i frecvent, a cu care se aprinde LED-ul s, tiind că frecvent, a de ceas a procesorului este
12 MHz.
4. Modificat, i programul astfel încât LED-ul să stea mai mult aprins decât stins.
5. Modificat, i programul astfel încât, într-o perioadă, LED-ul să pâlpâie de trei ori, apoi să stea
stins un interval de timp mai mare.
6. Modificat, i programul astfel încât apăsarea switch-ului SW7 din interfat, ă să determine aprin-
derea LED-ului.
16
Laborator 1
;------------------------------------------
; RESET and INTERRUPT VECTORS
;------------------------------------------
ORG 0x0000
ljmp main ; Locate a jump to the start of code
;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------
ORG 0x0030
main:
acall init
mainLoop:
mov A, #0x01
call delay
cpl LED
jmp mainLoop
;------------------------------------------
; FUNCTION CODE
;------------------------------------------
delay:
mov R7, A
loop1:
mov R6, #0x00
djnz R6, $
djnz R7, loop1
ret
init:
clr EA ; Disable global interrupts
setb LED ; Turn off led
ret
17
Laborator 1
18
2 | Utilizarea întreruperilor s, i interfat, area
cu un sistem de conversie analog-digital
Lucrarea de fat, ă urmăres, te înt, elegerea funct, ionalităt, ii unui convertor analog-digital (ADC) într-
un sistem cu microcontroler. Exemplele din acest laborator folosesc sistemul ADC implementat în
mediul de simulare EdSim51.
2.1 Introducere
Fără o capabilitate a măsurării unor mărimi fizice, nu se poate pune problema unei funct, ii automate
de control s, i decizie într-un sistem cu microcontroler. Sistemul ADC are rolul de a asocia tensiunii
electrice de la intrare o valoare numerică direct proport, ională cu aceasta. În acest mod, se pot culege
date asupra unei mărimi fizice ce pot fi stocate s, i procesate de către microcontroler. Figura 2.1
ilustrează un astfel de sistem.
Dacă tensiunea de intrare variază în timp, atunci viteza de conversie a sistemului ADC trebuie să
fie suficient de mare fat, ă de aceste variat, ii, iar procesarea acestor date de către microcontroler să fie
suficient de rapidă. De aceea este necesară cunoas, terea mecanismului de întreruperi s, i a timer-elor.
2.2 Întreruperile
În dezvoltarea unui program, există două moduri de a determina stările circuitelor interne sau
externe. Prima metodă constă în folosirea instruct, iunilor de salt condit, ionat, care efectuează un salt
în funct, ie de valoarea logică a unui fanion sau a unui pin. A doua metodă este folosirea întreruperilor
care obligă microcontrolerul să apeleze o subrutină în momentul în care apare un eveniment. Atunci
când apare o cerere de întrerupere, se salvează valoarea numărătorului de program în stivă s, i se face
un salt către adresa corespunzătoare rutinei de deservire a întreruperii. O subrutină de întrerupere se
termină de fiecare dată cu instruct, iunea RETI, care extrage din stivă adresa următoarei instruct, iuni,
salvată anterior, la momentul aparit, iei cererii de întrerupere, s, i o încarcă înapoi în numărătorul de
program. În plus, fanionul care a generat întreruperea este resetat, pentru a putea acoperi cazul în
care mai apare o cerere de întrerupere de acelas, i tip.
19
Laborator 2
Registrul IE
20
Laborator 2
Registrul IP
În cazul în care mai multe cereri de întrerupere apar în acelas, i timp, având acelas, i nivel de prioritate,
atunci acestea vor fi executate în următoarea ordine implicită:
1. IE0
2. TF0
3. IE1
4. TF1
5. Serial
2.3 Timer-e/Numărătoare
Microcontrolerul 8051 dispune de două timer-e/numărătoare pe 16 bit, i, T0 s, i T1. În funct, ie de
semnalul de intrare, se defines, te funct, ionalitatea de timer (având la intrare un semnal derivat din
semnalul de ceas al microcontrolerului, având frecvent, a de 12 ori mai mică) sau cea de numărător
(având la intrare un semnal digital extern – Figura 2.6). Modul de funct, ionare al acestora este
configurabil prin registrele TCON s, i TMOD (Figura 2.7).
Registrul TCON
21
Laborator 2
Registrul TMOD
22
Laborator 2
Timer-ele pot fi configurate să opereze în unul dintre cele 4 moduri de operare, indiferent dacă
îndeplinesc funct, ia de timer sau numărător. Select, ia modului de operare se realizează prin bit, ii M1
s, i M0 ai registrului TMOD. Schemele bloc ce detaliază modurile de operare sunt ilustrate în Figura 2.7.
Modul 0
Modul 0 este selectat prin resetarea bit, ilor M1 s, i M0, i.e. M1 = 0 s, i M0 = 0. În acest mod, partea mai
put, in semnificativă a registrului de timer, TLX, funct, ionează ca un numărător pe 5 bit, i, iar partea
mai semnificativă a registrului de timer, THX, funct, ionează ca un numărător pe 8 bit, i.
Modul 1
Modul 1 este selectat prin resetarea bitului M1 s, i setarea bitului M0, i.e. M1 = 0 s, i M0 = 1. În acest
mod, s, i THX, s, i TLX, funct, ionează ca numărătoare pe 8 bit, i.
Modul 2
Modul 2, numit s, i Auto-Reload, este selectat prin setarea bitului M1 s, i resetarea bitului M0, i.e. M1
= 1 s, i M0 = 0. În acest mod, TLX funct, ionează ca numărător pe 8 bit, i iar THX stochează valoarea
care va fi folosită pentru reinit, ializarea TLX de fiecare dată când are loc o depăs, ire (overflow).
Modul 3
Dacă modurile 0, 1 s, i 2 puteau fi configurare fără restrict, ii pentru fiecare timer în parte, în cazul
în care se utilizează modul 3, prin setarea bit, ilor M1 s, i M1, i.e. M1 = 1 s, i M0 = 1, ambele fanioane ce
semnalizează o depăs, ire vor fi folosite de timer-ul 0. Astfel, cele 2 registre, TH0 s, i TL0, funct, ionează
ca 2 timer-e independente pe 8 bit, i conform Figura 2.7. Setarea timer-ului 1 în modul 3 implică
oprirea acestuia, dar poate fi folosit totus, i în modurile 0, 1 s, i 2 t, inând cont că nu va avea loc o
întrerupere atunci când acesta ajunge la o depăs, ire.
Funct, ia de numărător
Pentru a selecta acest mod de funct, ionare trebuie setat bitul C/T din registrul TMOD. Astfel incre-
mentarea are loc doar atunci când semnalul de intrare de la pinul T0, pentru Timer 0, sau T1, pentru
Timer 1, îs, i va schimba valoarea logică din 1 în 0.
23
Laborator 2
24
Laborator 2
PinFunction
RD Enables the tri-state outputs, when logic 0.
WR On a positive edge, initiates conversion.
INTRGoes to logic 0 when conversion is complete and remains low until another con-
version is initiated.
i/p Analog input signal applied here.
CS Enables the device when logic 0.
D0 – D7 Tri-state digital outputs.
25
Laborator 2
2.5 Problema
Să se implementeze un sistem care să măsoare în mod automat valoarea tensiunii aplicate la intrarea
ADC-ului s, i să indice, folosind bara de leduri existentă în EdSim51, această valoare.
26
Laborator 2
2.6 Exercit, ii
1. Determinat, i valoarea maximă care poate fi folosită pentru încărcarea registrului TL0 astfel încât
rezultatul conversiei de la ADC să poată fi stocat corect.
2. Modificat, i programul astfel încât afis, area să se facă folosind LED1, LED2 s, i LED3 astfel:
• LED1 să se aprindă doar atunci când valoarea tensiunii de la intrarea în ADC este mică.
• LED2 să se aprindă doar atunci când valoarea tensiunii de la intrarea în ADC este medie.
• LED3 să se aprindă doar atunci când valoarea tensiunii de la intrarea în ADC este mare.
3. Modificat, i programul astfel încât valoarea tensiunii de la intrarea în ADC să fie afis, ată cu o
zecimală folosind ultimele două cifre ale afis, ajului cu 7 segmente.
27
Laborator 2
;------------------------------------------
; RESET and INTERRUPT VECTORS
;------------------------------------------
;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------
start:
setb TR0 ; start timer 0
jmp $
;------------------------------------------
; FUNCTION CODE
;------------------------------------------
init:
clr EA ; Disable global interrupts
setb IT0 ; set external 0 interrupt as edge-activated
setb EX0 ; enable external 0 interrupt
28
Laborator 2
lightLedBar:
mov P1, #0xFF
jz endLight
clr LED0
dec ACC
jz endLight
clr LED1
dec ACC
jz endLight
clr LED2
dec ACC
jz endLight
clr LED3
dec ACC
jz endLight
clr LED4
dec ACC
jz endLight
clr LED5
dec ACC
jz endLight
clr LED6
dec ACC
jz endLight
clr LED7
endLight:
ret
29
Laborator 2
mov ACC, P2 ; take the data from the ADC on P2 and send it to ACC
setb ADC_RD ; disable the ADC data lines by setting RD
mov B, #0x1C
div AB
call lightLedBar
reti ; return from interrupt
;------------------------------------------
; End of file.
;------------------------------------------
END
30