Documente Academic
Documente Profesional
Documente Cultură
Platforma Laborator Microcontrolere 2021
Platforma Laborator Microcontrolere 2021
Laborator x8051
Curs - Microcontrolere
Îndrumar de Laborator
Cuprins
3
Laborator 0
4
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 3.1 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 3.2. 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 3.2.
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 M0, 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.
Vin
D= × valmax ,
Vref
unde valmax reprezintă valoarea maximă care poate fi scrisă pe cei 8 bit, i ai sistemului ADC.
Etapele realizării unei conversii sunt:
3. Finalizarea conversiei este semnalizată prin schimbarea valorii logice a lui INTR din 1 în 0
4. Valoarea logică aplicată pinului RD trebuie schimbată în 0 pentru ca ADC-ul să activeze pinii
de date de ies, ire
25
Laborator 2
26
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.
fT imer0
fovf = ,
28− T H0
unde fT imer0 reprezintă a 12-a parte a frecvent, ei ceasului de sistem fSY SCLK = 12M Hz.
În această aplicat, ie dorim ca timer-ul 0 să genereze depăs, iri (overflow) cu frecvent, a fovf ' 3, 90KHz,
echivalentă unei depăs, iri la fiecare 256 µs. În consecint, ă, cu ajutorul formulei de mai sus, calculăm
valoarea ce trebuie să fie stocată în TH0 = 0x00.
În programul principal, prin setarea bitului TR0, se pornes, te timer-ul 0 s, i prin instruct, iunea jmp $,
se as, teaptă generarea generarea primei întreruperi, dată de o depăs, ire a timer-ului 0. Execut, ia ISR-
ului asociat implică pornirea conversiei ADC-ului. Finalizarea acesteia (resetarea fanionului INTR)
generează întreruperea asociată INT0 care cites, te s, i procesează valoarea convertită, aprinzând un
număr de LED-uri proport, ional cu tensiunea de intrare.
27
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.
28
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
29
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
30
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
31
Laborator 2
32
3 | Interfat, area cu un sistem de conversie
digital-analog
Lucrarea de fat, ă urmăres, te înt, elegerea funct, ionalităt, ii unui convertor digital-analog (DAC) într-
un sistem cu microcontroler. Exemplele din acest laborator folosesc sistemul DAC implementat în
mediul de simulare EdSim51.
33
Laborator 3
în mod repetat, de către nucleul microcontrolerului, a unui fanion ce semnalizează finalul întârzierii
dorite.
Etapele unei proceduri de polling sunt:
1. Se configurează timer-ul pentru întârzierea dorită
2. Se pornes, te timer-ul
3. Se as, teaptă, verificând constant fanionul
Avantajele acestei metode sunt standardizarea, oferită de folosirea timer-ului, precum s, i simplitatea
arhitecturii codului. Practic, se foloses, te aceeas, i paradigmă ca în cazul subrutinelor de întrerupere,
doar că nu mai este necesară conceperea subrutinei în sine, deoarece timer-ul contorizează întârzierea,
iar nucleul microcontrolerului doar verifică dacă acesta a ajuns la valoarea dorită. Dezavantajul
principal rămâne utilizarea ineficientă a energiei electrice s, i a puterii de calcul. În plus, timer-ul
este un circuit separat de nucleul microprocesorului. Acesta consumă energie în plus s, i necesită ca
utilizatorul să îi cunoască modul de funct, ionare.
Când bitul C/T (registrul TMOD) asociat timer-ului este "0" (Modul "counter" este dezactivat),
semnalul de intrare al timer-ului este ceasul sistemului divizat cu 12. Altfel spus, în cazul folosirii
frecvent, ei implicite (12 MHz) a ceasului sistemului, frecvent, a cu care numără timer-ul este 1 MHz
(perioada 1 us). Timer-ul numără de la valoarea de init, ializare (0, pentru modurile 0, 1, 3, sau
cont, inutul registrului THx, pentru Modul 2) până la 2rez (spre exemplu 213 în Modul 0). As, adar,
perioada unei numărători complete este:
12
TT M R = (NM AX − NM IN )
FCLK
unde NMAX este 2rez , NMIN este valoarea de init, ializare s, i TCLK este frecvent, a ceasului sistemului.
Următorul program foloses, te timer-ul 0 în Modul 2 s, i metoda polling pentru aprinderea s, i stingerea
LED-ului 7. Factorul de umplere al semnalului generat este 50% (LED-ul este aprins jumătate de
perioadă), iar frecvent, a sa este jumătate din frecvent, a unei numărători complete a timer-ului 0:
1 FCLK 1 1M Hz 1M Hz
FBLIN K = = 8
= = 31.25kHz
2 12 NM AX − NM IN 2(2 − 0xF0) 2 × 16
;---------------------
;EQUATES
;---------------------
;---------------------
;RESET and INTERRUPT VECTORS
;---------------------
ORG 0x0000
ljmp main
;---------------------
;MAIN PROGRAM CODE SEGMENT
;---------------------
ORG 0x0030
main: acall init
mainLoop: jnb TF0 ,$
clr TF0
34
Laborator 3
cpl LED
jmp mainLoop
;---------------------
;FUNCTION CODE
;---------------------
init: clr EA ;global
mov TMOD, #0x02
mov TH0, #0xF0
mov TL0, #0xF0
setb TR0 ;start
setb LED
ret
;---------------------
;EQUATES
;---------------------
;---------------------
;RESET and INTERRUPT VECTORS
;---------------------
ORG 0x0000
ljmp main
ORG 0x000B
ljmp ISR
35
Laborator 3
;---------------------
;MAIN PROGRAM CODE SEGMENT
;---------------------
ORG 0x0030
main: acall init
mainLoop: jmp $
;---------------------
;FUNCTION CODE
;---------------------
init: setb EA ;global
setb ET0 ;overflow
mov TMOD, #0x02
mov TH0, #0x00
mov TL0, #0x00
setb TR0 ;start
setb LED
ret
Vref 5V
VOU T = D × rez
=D× ,
2 − 1 28−1
unde D este valoarea digitală. Mai multe detalii în legătură cu formula de conversie sunt prezentate
în Anexa 4.
36
Laborator 3
În cadrul acestei lucrări de laborator, portul 1 va fi folosit pentru transmiterea semnalului digital
de intrare, iar pinul 7 al portului 0 va fi folosit pentru semnalul de control (pentru activare).
Simulatorul EdSim51 pune la dispozit, ie s, i un analizor cu care se poate vizualiza semnalul analogic
de ies, ire.
28
= 64
0x04
cu perioada în care programul generează o "treaptă"
12 12 24 48
TST EP = TADD + TM OV + TJM P = + + = = 4us
FCLK FCLK FCLK 12M Hz
(perioadele de execut, ie ale instruct, iunilor fiind disponibile în capitolul 1).
37
Laborator 3
;---------------------
;EQUATES
;---------------------
WR equ P0.7
;---------------------
;RESET and INTERRUPT VECTORS
;---------------------
ORG 0x0000
ljmp main
;---------------------
;MAIN PROGRAM CODE SEGMENT
;---------------------
ORG 0x0030
main: acall init
mainLoop: add A, #0x04
mov P1, A
jmp mainLoop
;---------------------
;FUNCTION CODE
;---------------------
init: clr EA
clr WR
mov A, #0x00
ret
Semnalul dreptunghiular necesită folosirea unor întârzieri. În funct, ie de acestea, se pot stabili
frecvent, a s, i factorul de umplere. Următorul program generează un semnal dreptunghiular cu factor
de umplere 50% folosind DAC-ul simulatorului s, i timer-ul 0 în Modul 2. Frecvent, a semnalului poate
fi dedusă ca în sect, iunea 3.1.3.
;---------------------
;EQUATES
;---------------------
WR equ P0.7
;---------------------
;RESET and INTERRUPT VECTORS
;---------------------
ORG 0x0000
ljmp main
ORG 0x000B
ljmp timer0ISR
;---------------------
;MAIN PROGRAM CODE SEGMENT
;---------------------
ORG 0x0030
main: acall init
mainLoop: jmp $
38
Laborator 3
;---------------------
;FUNCTION CODE
;---------------------
init: setb EA
setb ET0
mov TMOD, #0x02
mov TH0, #0x80
mov TL0, #0x80
setb TR0
mov A, #0x00
mov P1, A
clr WR
ret
Pentru generarea unor semnale mai complexe, este necesară folosirea tabelelor de căutare.
Tabela de căutare din Figura 3.3 corespunde unei probleme cu doi operanzi s, i un rezultat. Primul
operand are un număr de opt valori posibile, codate de la 0x0 până la 0x7 s, i reprezentate pe coloana
mov din stânga imaginii. Cel de-al doilea are un număr de s, aisprezece valori posibile, codate de la 0x0
până la 0xF s, i reprezentate pe linia mov aflată în partea de sus a imaginii. Cu alb este reprezentată
zona valorilor rezultatului pentru toate combinat, iile de valori ale operanzilor. Tabela cont, ine 128
39
Laborator 3
de locat, ii de memorie, iar adresarea se face în funct, ie de codul corespunzător celor doi parametrii.
Astfel, adresa pe 7 bit, i se obt, ine concatenând codurile corespunzătoare valorilor celor doi operanzi.
Presupunem cazul arhitecturii 8051 ce are la finalul memoriei de program această tabelă. Elementele
(valorile rezultatului) se vor afla în zona de memorie de la adresa 0xFF80 până la adresa 0xFFFF.
Pentru a obt, ine adresa căutată este suficient să adunăm adresa de început a tabelei (0xFF80) cu
adresa (pe 7 bit, i) rezultatului în tabelă.
Tabelele de căutare pot fi folosite s, i pentru a coda forma unui semnal. Spre exemplu, construct, ia
unui semnal sinusoidal folosind exclusiv calcule cu numere întregi este un proces complex dacă se
pleacă de la formula sa analitică. Astfel, se poate încărca în memorie o tabelă de căutare unidimen-
sională cu valorile corespunzătoare formei sinusoidale. Numărul de elemente variază în funct, ie de
precizia dorită.
Următorul program generează un semnal sinusoidal folosind DAC-ul simulatorului s, i o tabelă de
căutare, ce cont, ine o perioadă a unui semnal sinusoidal discretizat în 32 de puncte, aflată în memoria
de program. Programul foloses, te adresarea indirectă s, i un contor (R0) pentru a parcurge tabela
s, i converti pe rând valorile cu ajutorul DAC-ului. După ce tabela a fost parcursă, contorul este
reinit, ializat cu valoarea 0x00 s, i procedura este repetată.
;---------------------
;EQUATES
;---------------------
WR equ P0.7
MAX equ 0x20
;---------------------
;RESET and INTERRUPT VECTORS
;---------------------
ORG 0x0000
ljmp main
;---------------------
;MAIN PROGRAM CODE SEGMENT
;---------------------
ORG 0x0030
main: acall init
mainLoop: mov A, R0
movc A, @A+DPTR
mov P1, A
inc R0
mov A, R0
clr C
subb A, #MAX
JC exit
mov R0, #0x00
exit: jmp mainLoop
;---------------------
;FUNCTION CODE
;---------------------
init: clr EA
clr WR
mov DPTR, #SIN
mov R0, #0x00
ret
40
Laborator 3
;---------------------
;LOOK-UP TABLE
;---------------------
org 0xFC00
SIN:
db 0x80, 0x98, 0xb0, 0xc6
db 0xda, 0xea, 0xf5, 0xfd
db 0xff, 0xfd, 0xf5, 0xea
db 0xda, 0xc6, 0xb0, 0x98
db 0x80, 0x67, 0x4f, 0x39
db 0x25, 0x15, 0x0a, 0x02
db 0x00, 0x02, 0x0a, 0x15
db 0x25, 0x39, 0x4f, 0x67
41
Laborator 3
3.3 Problema
Să se genereze un semnal triunghiular folosind sistemul cu microcontroler s, i DAC prezentat anterior.
42
Laborator 3
3.4 Exercit, ii
1. Determinat, i frecvent, a semnalului triunghiular plecând de la graficul rezultat:
1
FT RI = ,
ndiv × Tdiv
unde ndiv este numărul de diviziuni ocupate de o perioadă a semnalului s, i Tdiv este perioada repre-
zentată de o diviziune.
2. Determinat, i frecvent, a semnalului triunghiular plecând de frecvent, a ceasului sistemului s, i nu-
mărul de cicluri de ceas necesar pentru generarea unei perioade. Comparat, i rezultatul cu cel obt, inut
la exercit, iul 1.
3. Modificat, i programul pentru a obt, ine o frecvent, ă de două ori mai mică.
4. Modificat, i programul astfel încât unul dintre timer-e să fie folosit pentru fixarea perioadei dintre
trepte la o valoare aleasă convenabil.
5. Scriet, i un program care să genereze un semnal dreptunghiular cu factor de umplere 25%.
43
Laborator 3
44
Laborator 3
45
Laborator 3
46
4 | Controlul motoarelor s, i tastatura
Lucrarea de fat, ă urmăres, te înt, elegerea controlului unui motor DC într-un sistem cu microcontroler,
precum s, i a funct, ionalităt, ii unei tastaturi 4x3. Exemplele din acest laborator folosesc motorul DC
s, i tastatura 4x3 implementate în mediul de simulare EdSim51.
47
Laborator 4
Din cauza caracteristicilor constructive, motorul DC nu poate oferi o precizie bună în lipsa unei
bucle de react, ie care să ofere feedback-ul necesar circuitului de comandă. Astfel, a apărut necesitatea
unui alt tip de motor care să poată realiza operat, iuni de precizie foarte mare. Motorul pas cu pas
(stepper motor) este format dintr-un rotor metalic s, i un număr de bobine dispuse în jurul său.
Fiecare bobină are două armături diametral opuse. Acestea funct, ionează ca electromagnet, i, iar
odată polarizate fac rotorul să tindă către pozit, ia magnetică de echilibru. Mis, carea de rotat, ie este
determinată de polarizarea succesivă a bobinelor. Cum circuitul de control are acces la fiecare bobină
în parte, acesta poate controla cât, i "pas, i" face motorul s, i în ce direct, ie se învârte, viteza fiind dată
de frecvent, a de comutare. Fat, ă de motorul DC, rotat, ia motorului pas cu pas este sacadată întrucât
principiul său de bază este că rotorul va atinge echilibrul magnetic la fiecare pas. În cazul unui
motor pas cu pas uzual, rotorul este construit în as, a fel încât se poate obt, ine o precizie de câteva
sute de pas, i pe rotat, ie completă folosind un număr limitat de bobine (3). Circuitul de control al unui
motor pas cu pas este mult mai complicat decât în cazul unui motor DC întrucât bobinele comandate
separat trebuie sincronizate.
Plecând de la aceste configurat, ii de bază s-a ajuns s, i la alte tipuri de motoare electrice consacrate,
cum ar fi motorul BLDC (Brushless DC) care elimină problema contactului mecanic dintr-un motor
DC folosind anumite caracteristici constructive ale motoarelor pas cu pas. De asemenea, folosind un
motor DC s, i un circuit de comandă dedicat se poate construi un servo-motor. Totus, i, pe parcursul
acestei lucrări discut, ia va fi limitată la motorul DC.
48
Laborator 4
În Figura 4.3, tranzistoarele sunt controlate împreună două câte două (Q1-Q3 s, i Q2-Q4) s, i co-
nectate la pinii corespunzători. Astfel, prin modul de polarizare a punt, ii H se poate porni/opri
motorul s, i se poate determina sensul de rotat, ie. În plus fat, ă de puntea H, driver-ul folosit de simu-
latorul EdSim51 are un mecanism care împiedică deschiderea simultană a tuturor 4 tranzistoarelor
(caz ce ar declans, a un scurtcircuit). Astfel, configurat, ia P 3.0 = P 3.1 = ”1” este echivalentă cu
P 3.0 = P 3.1 = ”0” s, i determină oprirea motorului.
Figura 4.4 prezintă conexiunea dintre 8051 s, i motor. La pinul 5 al portului 3 este legat, în mod
convenabil, un senzor cu ajutorul căruia poate fi contorizat numărul de rotat, ii. De fiecare dată
când punctul de referint, ă al rotorului ajunge în dreptul senzorului, acesta din urmă generează un
puls negativ (de valoare logică "0"). Astfel, pulsurile pot fi contorizate de Timer-ul 1, configurat să
funct, ioneze în modul "counter".
Următorul program complementează starea unui LED la fiecare 5 rotat, ii ale motorului. Cererile de
întrerupere din partea Timer-ului 1 sunt active, acesta din urmă fiind configurat pe post de "counter"
în modul 2. Timer-ul 1 numără pulsurile de "0" venite de la senzor. Pinii de control ai motorului
(etichetat, i motorA s, i motorB) sunt configurat, i astfel încât acesta să se învârtă în sensul acelor
de ceasornic. Atent, ie: microcontrolerul foloses, te "complementul fat, ă de 2" pentru reprezentarea
numerelor cu semn. Astfel, -5 va fi reprezentat ca 0xFB. Init, ializarea timer-ului cu această valoare
va determina ca întreruperea corespunzătoare să se declans, eze după 5 pulsuri ale semnalului extern.
49
Laborator 4
;---------------------
;EQUATES
;---------------------
motorA equ P3.1
motorB equ P3.0
LED equ P1.7
per equ -5
;---------------------
;RESET and INTERRUPT VECTORS
;---------------------
ORG 0x0000
ljmp main
ORG 0x001B
ljmp ISR_tmr1
;---------------------
;MAIN PROGRAM CODE SEGMENT
;---------------------
ORG 0x0030
main: acall init
mainLoop: jmp $
;---------------------
;FUNCTION CODE
;---------------------
init: setb EA
setb ET1
mov TMOD, #0x60
50
Laborator 4
51
Laborator 4
4.2 Tastatura
Cea mai comună interfat, ă de tip om-mas, ină este, fără îndoială, tastatura. Aceasta asigură intro-
ducerea datelor în sistem prin contabilizarea digitală a intent, iei exprimate de utilizator. Tastatura
trebuie să răspundă la diferite tipuri de interact, iune în funct, ie de aplicat, ie:
- Mai multe taste apăsate simultan
- Apăsarea îndelungată a unei taste
- Tastarea rapidă
În cazul tastaturilor comune, 4x3 sau 4x4, implementarea poate fi de două feluri:
• Implementarea de tip vector foloses, te un electrod comun tuturor tastelor s, i câte un electrod
particular pentru fiecare tastă în parte. Astfel, microcontrolerul poate determina starea unei
taste prin citirea electrodului particular. Această conexiune este eficientă când numărul de
taste este limitat, iar microcontrolerul dispune de un număr generos de pini de intrare/ies, ire.
• Implementarea matricială foloses, te electrozi corespunzători liniilor s, i coloanelor. Astfel, mi-
crocontrolerul poate determina starea unei taste impunând o tensiune pe electrodul ei de linie
s, i citind electrodul ei de coloană. Această conexiune minimizează numărul de pini necesari,
dar cres, te complexitatea programului.
Indiferent de tipul de implementare, o provocare a integrării tastaturii într-un sistem cu microcon-
troler este gestionarea perioadei de stabilizare. Apăsarea unei taste determină un contact mecanic
între doi electrozi a căror tensiune electrică este monitorizată de un microcontroler. În urma acestui
contact, se produc mici vibrat, ii mecanice, ce se traduc în fluctuat, ii nedeterministe a semnalului elec-
tric. Uzual, această perioadă de stabilizare este de ordinul milisecundelor, iar gestionarea ei a adus
în prim-plan mai multe metode hardware s, i software. Probabil cea mai simplă solut, ie software este
folosirea unei rutine de întârziere a programului.
O altă provocare este obt, inerea unei rate de scanare suficient de bună. Uzual, apăsarea unei
taste durează câteva zeci de milisecunde. Este obligatoriu ca scanarea să dureze mai put, in, pentru
a avea sigurant, a că toată interact, iunea este contabilizată intern. Astfel, se pune problema dacă
implementarea sistemului de scanare se va baza pe "polling", întreruperi sau chiar o combinat, ie între
cele două. Această decizie se va lua în funct, ie de sursele de întrerupere existente, frecvent, a ceasului
s, i timpului de procesare disponibil scanării tastaturii.
Registrul PSW
52
Laborator 4
Următorul program scanează tastatura în momentul în care o tastă este apăsată s, i pune numărul
tastei respective în acumulator. Întreruperea externă 1 declans, ează procedura de scanare. Aceasta
constă în fixarea unui electrod de linie la valoarea "0" s, i citirea electrozilor de coloane. În cazul în
care unul dintre electrozii de coloană are valoarea "0", tasta de la intersect, ia acestuia cu electrodul
53
Laborator 4
de linie fixat la "0" va fi considerată ca fiind tasta apăsată. În cazul în care niciun electrod de coloană
nu are valoarea "0", se trece la scanarea următoarei linii. Întrucât liniile sunt parcurse "de sus în
jos", iar coloanele "de la stânga la dreapta", tastele sunt numerotate de la 1 la 12 începând din colt, ul
din stânga sus (ex: tasta "2" are numărul 2, iar tasta "*" are numărul 10). Pe parcursul procedurii
de scanare, un contor stochează numărul tastei curente. În momentul în care tasta apăsată este
găsită, scanarea se termină, iar fanionul F0 (din registrul PSW) este setat. Pe baza acestui fanion
se ia decizia ca următoarele linii să nu mai fie scanate întrucât tasta apăsată a fost deja găsită.
;---------------------
;EQUATES
;---------------------
C1 equ P0.6
C2 equ P0.5
C3 equ P0.4
L1 equ P0.3
L2 equ P0.2
L3 equ P0.1
L4 equ P0.0
;---------------------
;RESET and INTERRUPT VECTORS
;---------------------
ORG 0x0000
ljmp main
ORG 0x0013
ljmp scan
;---------------------
;MAIN PROGRAM CODE SEGMENT
;---------------------
ORG 0x0030
main: acall init
mainLoop: mov A, R0
jmp mainLoop
;---------------------
;FUNCTION CODE
;---------------------
init: setb EA
setb EX1
setb IT1
mov P0, #0xF0
ret
clr L1
call colscan
setb L1
jb F0, finish
54
Laborator 4
clr L2
call colscan
setb L2
jb F0, finish
clr L3
call colscan
setb L3
jb F0, finish
clr L4
call colscan
setb L4
jb F0, finish
colscan: inc R0
jnb C1, gotKey
inc R0
jnb C2, gotKey
inc R0
jnb C3, gotKey
ret
gotkey: setb F0
ret
55
Laborator 4
4.3 Exercit, ii
1. Modificat, i programul din Sect, iunea 1 - Controlul Motoarelor astfel încât motorul să poată fi
pornit/oprit cu ajutorul unui buton.
2. Modificat, i programul din Sect, iunea 1 - Controlul Motoarelor astfel încât motorul să-s, i schimbe
sensul de rotat, ie după fiecare 5 rotat, ii complete.
3. Plecând de la programul din Sect, iunea 2 - Tastatura, scriet, i un program care încarcă în memoria
de date începând cu adresa 0x30 ultimele 5 taste apăsate. Se vor încărca valorile ASCII corespun-
zătoare simbolurile marcate pe tastele apăsate (spre exemplu, pentru tasta 2 se va încărca valoarea
0x32, iar pentru "*" se va încărca valoarea 0x2A).
56
5 | Utilizarea sistemului de comunicat, ie se-
rială
Lucrarea de laborator are ca scop familiarizarea cu utilizarea perifericului serial UART (Universal
Asynchronous Receiver/Transmitter) în mediul de simulare EdSim51.
5.1 Introducere
Comunicat, ia serială UART este o metodă rapidă de a schimba date între două microcontrolere sau
între un microcontroler s, i un periferic, utilizând un număr restrâns de conexiuni electrice (în cazul
UART-ului, două conexiuni: RX s, i TX). În lucrarea de laborator se va utiliza perifericul implementat
în mediul de simulare EdSim51 pentru a transmite s, i a recept, iona date către/dinspre microcontroler.
1
Inter-Integrated Circuit
2
Serial Peripheral Interface
57
Laborator 5
Principalul rol al acestui protocol este de a converti date paralele în date seriale la transmitere s, i
de a le reconverti în date paralele la primire.
Viteza transmisiunii UART este dată de baud rate (rata de simbol). Trebuie făcută observat, ia că
înt, elesul exact al termenului „simbol” depinde de contextul concret de lucru. Spre exemplu, dacă ar fi
vorba de un flux continuu de date (eventual s, i de lungime variabilă), o interpretare potrivită ar fi de
a spune că fiecare bit reprezintă un simbol. Pe de altă parte, dacă o unitate de bază informat, ională
relevantă e dată de gruparea unui anumit număr de bit, i laolaltă (ex.: doar câte un octet întreg „are
semnificat, ie”, cum ar fi în cazul codării ASCII), atunci ar fi potrivită interpretarea unui simbol ca
fiind format din acel număr de bit, i (în ex. anterior, un octet).
Formatul unui pachet de transmisiune UART este reprezentat în Figura 5.2.
În cadrul acestei lucrări de laborator, pachetele de transmisiune UART vor fi alcătuite din:
• 1 bit de start
• 8 bit, i de date
• 0 bit, i de paritate
• 1 bit de stop
Făcând legătura cu observat, iile anterioare, este corespunzător să considerăm un simbol ca fiind
format dintr-un octet.
Pe de altă parte, din punct de vedere operat, ional, baud rate-ul determină concret rata cu care
sunt transmis, i tot, i bit, ii din cadrul unui pachet (inclusiv cei de start, de stop etc.); pentru formatul
pachetelor definit anterior, asta însemnând 10 bit, i.
Ca atare, des, i cel mai complet ar fi să existe trei mărimi distincte — rata de transmisiune a
pachetelor (măsurată în pachete/s; în contextul nostru, 1 pachet/s fiind egal cu 10 bit/s), rata de
simbol (definit, ia init, ială a termenului „baud rate”; măsurată în simboluri/s sau baud, Bd; în contextul
nostru, 1 Bd ar fi egal cu 8 bit/s), s, i rata de bit („bit rate”; măsurată în bit/s, bps) —, în practică,
toate acestea sunt reunite într-o singură mărime, numită direct baud rate, având ca unitate de
măsură bps, s, i reprezentând practic rata de transmitere a bit, ilor pachetelor.
Spre exemplu, pentru formatul pachetelor definit anterior, dacă am lucra cu BAUD RATE de
4800 bps, asta ar însemna că, într-o secundă, se transmit: 4800 de bit, i efectivi, deci 480 de pachete,
deci 480 de simboluri.
58
Laborator 5
5. T1 (Timer 1)
Registrul SCON
59
Laborator 5
Register SBUF
Registrul SBUF este destinat exclusiv transferului de date pe portul serial. În cazul transmiterii
prin UART, se va scrie în registrul SBUF, iar în cazul recept, ionării, se va citi din SBUF.
Figura 5.5: Schema de divizare a frecvent, elor pentru generarea baud rate-ului folosind sistemul
UART în Modul 1
Cunoscând factorii interni de divizare în cazul în care bitul SMOD al registrului PCON este 0 s, i
utilizând Timer-ul 1 în Modul 2 de operare (8-bit auto-reload), se pot calcula baud rate-ul s, i valorile
pentru registrele TH1 si TL1 folosind formulele 5.1 s, i 5.2.
Fosc
BAU D RAT E = (5.1)
12 ∗ 32 ∗ (256 − T H1)
Fosc
T H1 = 256 − (5.2)
12 ∗ 32 ∗ BAU D RAT E
6. Citire/scrierea în/din SBUF, când fanioanele corespunzătoare (RI, TI) sunt setate, în funct, ie
de aplicat, ia dorită.
60
Laborator 5
Atent, ie: Vectorul de întrerupere serială (0x0023) nu resetează automat fanioanele RI s, i/sau
TI. De asemenea, vectorul de întrerupere este comun atât pentru recept, ie, cât s, i pentru transmisiune.
Atent, ie: Când se transmit sau se recept, ionează date folosind perifericul serial sunt transmise
/ recept, ionate codurile ASCII ale caracterelor transmise / primite. Tabelul cu codurile ASCII se
regăses, te în Anexa 4.
Următorul program este un exemplu de recept, ie folosind întreruperi. Baud rate-ul este setat la
4800 bit/s, iar frecvent, a de ceas este 11.0592 MHz. Datele recept, ionate vor fi stocate în stivă.
Descrierea algoritmului
În sect, iunea de init, ializare se setează perifericul de UART în modul de lucru pe 8 bit, i cu baud
rate-ul dat de Timer 1. Configurând Timer-ul 1 în Modul 2 de funct, ionare (8 bit, i cu auto-reload),
având valoarea 0xFA în TH1 s, i TL1, baud rate-ul este 4800 bps. Se activează Timer-ul 1 setând
bit-ul TR1 la valoarea 1. Se activează întreruperea portului serial s, i întreruperile globale.
Când un caracter este recept, ionat de portul serial, valoarea din registrul PC devine 0x0023,
executându-se astfel un salt către rutina de deservire a întreruperii uartInterrupt. În registrul
DPTR se salvează adresa de întoarcere către valoarea PC-ului de dinaintea execut, iei saltului către
vectorul de întrerupere. DPL este scos primul din stivă, având în vedere convent, ia "little endian"
s, i faptul că stiva este pe 8 bit, i, în timp ce o adresă (în memoria de program) are 16 bit, i. Se in-
troduce în stivă caracterul primit, urmat de adresa de întoarcere, pentru ca instruct, iunea reti să
actualizeze PC-ul cu adresa de dinaintea executării vectorului de întrerupere. Se resetează fanionul
de întrerupere pentru recept, ie, RI.
;------------------------------------------
; EQUATES
;------------------------------------------
;------------------------------------------
; RESET and INTERRUPT VECTORS
;------------------------------------------
ORG 0x0000
ljmp main ; jump to main
ORG 0x0023
ljmp uartInterrupt ; jump to ISR for serial
;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------
ORG 0x0030
main:
acall init
jmp $
;------------------------------------------
; FUNCTION CODE
;------------------------------------------
init:
clr EA ; make sure no interrupts are triggered
61
Laborator 5
uartInterrupt:
pop DPH
pop DPL
push SBUF
push DPL
push DPH
clr RI
reti
Următorul program transmite date prin intermediul UART, folosind întreruperi. Baud rate-ul este
setat tot la 4800 bps, frecvent, a de ceas fiind tot 11.0592 MHz. Mesajul afis, at este configurabil s, i
poate fi modificat din linia de cod aferentă etichetei message.
Descrierea algoritmului
În sect, iunea de init, ializare se setează perifericul de UART în modul de lucru pe 8 bit, i cu baud
rate-ul dat de Timer 1. Configurând Timer-ul 1 în Modul 2 de funct, ionare (8 bit, i cu auto-reload)
cu valoarea 0xFA în TH1 s, i TL1, baud rate-ul este 4800 bit/s. Se activează Timer-ul 1 setând bit-ul
TR1 la valoarea 1. Se activează întreruperea portului serial s, i întreruperile globale.
După init, ializare, se calculează numărul de caractere ce vor fi trimise (rezultatul este salvat în
registrul R0), iar în registrul R1 se va memora numărul de caractere transmise. Transmisia începe cu
primul caracter, de la adresa A+DPTR. Când ultimul bit de date este deplasat în registrul SBUF,
fanionul TI va fi setat s, i se va sări la rutina de deservire a întreruperii uartInterrupt. În această
rutină, se vor transmite pe rând toate caracterele din mesajul cu eticheta message.
;------------------------------------------
; EQUATES
;------------------------------------------
;------------------------------------------
; RESET and INTERRUPT VECTORS
;------------------------------------------
ORG 0x0000
ljmp main ; jump to main
ORG 0x0023
ljmp uartInterrupt ; jump to ISR for serial
;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------
62
Laborator 5
ORG 0x0030
main:
acall init
mov A, #endOfMessage
subb A, #message
mov R0, A
mov R1, #0x00
mov A, R1
mov DPTR, #message
movc A, @A+DPTR
mov SBUF, A
jmp $
;------------------------------------------
; FUNCTION CODE
;------------------------------------------
init:
clr EA ; make sure no interrupts are triggered
mov SCON, #0x40 ; 8bit mode, baud set by TMR1
mov TMOD, #0x20 ; 8bit auto-reload
mov TH1, #0xFA
mov TL1, #0xFA
setb TR1
setb ES
setb EA
ret
uartInterrupt:
djnz R0, sendNextChar
jmp doneSending
sendNextChar:
inc R1
mov A, R1
movc A, @A+DPTR
mov SBUF, A
doneSending:
clr TI
reti
ORG 0x2000
message:
db "Ana are mere!"
endOfMessage:
db "\n"
63
Laborator 5
5.3 Exercit, ii
1. Modificat, i programul de citire prin intermediul UART, astfel încât sistemul de comunicat, ie
serială să funct, ioneze cu un BAUD RATE de 19200 bps.
2. Modificat, i programul de scriere prin intermediul UART, astfel încât sistemul de comunicat, ie
serială să funct, ioneze cu un BAUD RATE de 2400 bps.
64
Laborator 5
65
Laborator 5
66
6 | Utilizarea afis, ajului cu cristale lichide
bazat pe circuitul integrat HD44780
Lucrarea de laborator are ca scop familiarizarea student, ilor interfat, area microcontrolerului 8051
cu un LCD 2x16 bazat pe circuitul integrat HD44780, în mediul de simulare EdSim51. De asemenea,
modulul LCD 2x16 implementat în EdSim51 va fi utilizat pentru afis, area unor mesaje transmise prin
UART.
• pinul E - este folosit ca pin de es, antionare pentru bit, ii DB7-DB4, pe front descrescător
Deoarece modul de lucru va fi pe 4 bit, i, fiecare comandă va fi alcătuită dintr-o secvent, ă de doi
semioctet, i (nibbles), care ar corespunde unei comenzi pe 8 bit, i. Primii 4 bit, i transmis, i reprezintă
semioctetul cel mai semnificativ. Deoarece modulul pornes, te automat în modul de lucru pe 8 bit, i,
prima comandă, intitulată "Function Set", va trebui transmisă de 2 ori.
Un tabel cu toate funct, iile de care dispune modulul LCD utilizat în lucrarea actuală este prezentat
în Figura 6.2.
1
https://www.edsim51.com/8051simulator/HD44780.pdf
67
Laborator 6
68
Laborator 6
69
Laborator 6
Figura 6.3: Rutina de init, ializare a afis, ajului LCD - modul de lucru pe 4 bit, i, afis, are 8x1
70
Laborator 6
71
Laborator 6
Următorul program este un exemplu de afis, are a unui mesaj pe LCD, după o init, ializare corespun-
zătoare a perifericului.
Descrierea algoritmului
Funct, ia lcdSendCommand
Această funct, ie setează bitul E (E = 1), iar apoi îl resetează (E = 0), creând în acest mod frontul
negativ es, antionării bit, ilor de date (DB7-DB4).
Funct, ia waitBFClear
Această funct, ie introduce o întârziere controlată pentru a asigura procesarea comenzii executate
anterior. Totodată, este necesară deoarece funct, ia "Read busy flag & address" nu este implementată
în EdSim51. Existent, a acestui controller LCD permite citirea stării fanionului BF (Busy Flag) pentru
a putea verifica terminarea operat, iei anterioare.
Funct, ia set4BitMode
Funct, ia init, ializează LCD-ul în modul de lucru pe 4 bit, i, deoarece acesta pornes, te după reset în
modul de lucru pe 8 bit, i. Această funct, ie setează primul semioctet ca fiind 0x2 conform rutinei de
init, ializare s, i datele sunt transmise către controler-ul LCD-ului folosind funct, ia lcdSendCommand.
După fiecare apel al funct, iei lcdSendCommand se as, teaptă terminarea procesării apelând funct, ia
waitBFClear.
Funct, ia setNumberOfLinesAndDots
Această funct, ie setează numărul de linii (2 în acest caz deoarece N = 1) s, i numărul de punct (5 x
8 puncte deoarece F = 0). Comanda anterioară set4BitMode este trimisă din nou, conform rutinei
de init, ializare descrisă de fis, a tehnică.
Funct, ia turnOnDisplayAndCursor
Funct, ia reprezintă pasul numărul 4 din etapa de init, ializare. Primul semioctet este 0x0, iar al
doilea este 0xE. Efectul este aprinderea backlight-ului s, i afis, area cursorului pe linia 1, coloana 1.
Funct, ia setEntryMode
Această funct, ie setează incrementarea automată a adresei DDRAM/CGRAM s, i deplasează la
dreapta cursorul cu o pozit, ie deoarece I/D = 1 s, i S = 0. Primul semioctet este 0x0, iar ce de-
al doilea semioctet este 0x6.
Funct, ia lcdSendCharacter
Ultima funct, ie este cea care transmite caracterul ASCII din acumulator ACC către LCD (RS este
1 deoarece se lucrează în modul de date).
Caracterele sunt extrase din memoria de program, începând de la adresa 0x2000 s, i mutate în
acumulator folosind instruct, iunea movc. Fanionul F0 din registrul PSW este setat atunci când toate
caracterele au fost afis, ate.
72
Laborator 6
;------------------------------------------
; EQUATES
;------------------------------------------
RS equ P1.3
E equ P1.2
DB7 equ P1.7
DB6 equ P1.6
DB5 equ P1.5
DB4 equ P1.4
;------------------------------------------
; RESET and INTERRUPT VECTORS
;------------------------------------------
ORG 0x0000
ljmp main
;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------
ORG 0x0030
main:
clr RS ; clear RS - send instruction
clr F0
call set4BitMode
call setNumberOfLinesAndDots
call turnOnDisplayAndCursor
call setEntryMode
loop:
movc A, @A+DPTR
jb F0, finish
call lcdSendCharacter
inc R1
mov A, R1
jmp loop
finish:
jmp $
;------------------------------------------
; FUNCTION CODE
;------------------------------------------
lcdSendCommand:
setb E ; |
clr E ; | negative edge on E
ret
73
Laborator 6
waitBFClear:
mov R0, #50
djnz R0, $
ret
set4BitMode:
clr DB7 ; |
clr DB6 ; |
setb DB5 ; |
clr DB4 ; | high nibble set
call lcdSendCommand
call waitBFClear
ret
setNumberOfLinesAndDots:
clr DB7 ; |
clr DB6 ; |
setb DB5 ; |
clr DB4 ; | high nibble set
call lcdSendCommand
setb DB7 ; low nibble set (only P1.7 needed to be changed)
call lcdSendCommand
call waitBFClear
ret
turnOnDisplayAndCursor:
clr DB7
clr DB6
clr DB5
clr DB4
call lcdSendCommand
setb DB7
setb DB6
setb DB5
call lcdSendCommand
call waitBFClear
ret
setEntryMode:
clr DB7
clr DB6
clr DB5
clr DB4
call lcdSendCommand
setb DB6
setb DB5
call lcdSendCommand
call waitBFClear
ret
74
Laborator 6
lcdSendCharacter:
setb RS
mov C, ACC.7
mov DB7, C
mov C, ACC.6
mov DB6, C
mov C, ACC.5
mov DB5, C
mov C, ACC.4
mov DB4, C
call lcdSendCommand
mov C, ACC.3
mov DB7, C
mov C, ACC.2
mov DB6, C
mov C, ACC.1
mov DB5, C
mov C, ACC.0
mov DB4, C
call lcdSendCommand
call waitBFClear
dec R2
cjne R2, #0x00, finishWrites
setb F0
finishWrites:
ret
ORG 0x2000
db "MICROCONTROLLERS"
75
Laborator 6
6.2 Problemă
Să se implementeze un program care cites, te un s, ir de caractere de la perifericul UART s, i îl afis, ează
pe ecranul LCD. Se pot scrie maximum 16 caractere.
76
Laborator 6
6.3 Exercit, ii
1. Modificat, i programul (din Anexa 6) pentru a putea afis, a caractere s, i pe a doua linie. A se
folosi funct, ia de scriere a DDRAM-ului cu valoarea 0x40 (a doua linie, prima coloană).
77
Laborator 6
ORG 0x0023
ljmp uartInterrupt ; jump to ISR for serial
;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------
ORG 0x0030
main:
acall lcdInit
acall initUART
acall initInt
reinit:
mov R1, #0x08
mov R2, #0x00
mov R7, #0x00
mov R6, #0x00
loopDelay:
call waitBFClear
mov R7, #0x00
djnz R7, $
djnz R6, loopDelay
call clearDisplay
clr F0
mov SP, #0x07
loopMain:
jb F0, main
jmp loopMain
;------------------------------------------
; FUNCTION CODE
;------------------------------------------
lcdPrintMessage:
mov A, @R1
78
Laborator 6
loop:
jb F0, exitLcdPrint
call lcdSendCharacter
inc R1
mov A, @R1
jmp loop
exitLcdPrint:
ret
uartInterrupt:
mov A, SBUF
subb A, #0x0D
jz printMessage
pop DPL
pop DPH
inc R2
push SBUF
push DPH
push DPL
jmp exitUart
printMessage:
call lcdPrintMessage
exitUART:
clr RI
reti
initUART:
mov SCON, #0x50 ; 8bit mode, baud set by TMR1
mov TMOD, #0x20 ; 8bit auto-reload
mov TH1, #0xFA
mov TL1, #0xFA
setb TR1
ret
initInt:
clr EA ; make sure no interrupts are triggered
setb ES
setb EA
ret
lcdSendCommand:
setb E ; |
clr E ; | negative edge on E
ret
waitBFClear:
mov R0, #50
79
Laborator 6
djnz R0, $
ret
set4BitMode:
clr DB7 ; |
clr DB6 ; |
setb DB5 ; |
clr DB4 ; | high nibble set
call lcdSendCommand
call waitBFClear
ret
setNumberOfLinesAndDots:
clr DB7 ; |
clr DB6 ; |
setb DB5 ; |
clr DB4 ; | high nibble set
call lcdSendCommand
setb DB7 ; low nibble set (only P1.7 needed to be changed)
call lcdSendCommand
call waitBFClear
ret
turnOnDisplayAndCursor:
clr DB7
clr DB6
clr DB5
clr DB5
call lcdSendCommand
setb DB7
setb DB6
setb DB5
call lcdSendCommand
call waitBFClear
ret
setEntryMode:
clr DB7
clr DB6
clr DB5
clr DB4
call lcdSendCommand
setb DB6
setb DB5
call lcdSendCommand
call waitBFClear
ret
lcdInit:
80
Laborator 6
lcdSendCharacter:
setb RS
mov C, ACC.7
mov DB7, C
mov C, ACC.6
mov DB6, C
mov C, ACC.5
mov DB5, C
mov C, ACC.4
mov DB4, C
call lcdSendCommand
mov C, ACC.3
mov DB7, C
mov C, ACC.2
mov DB6, C
mov C, ACC.1
mov DB5, C
mov C, ACC.0
mov DB4, C
call lcdSendCommand
call waitBFClear
dec R2
cjne R2, #0x00, finishWrites
setb F0
finishWrites:
ret
clearDisplay:
clr RS
clr DB7
clr DB6
clr DB5
clr DB4
call lcdSendCommand
setb DB4
call lcdSendCommand
call waitBFClear
ret
81