Sunteți pe pagina 1din 81

Facultatea de Electronică, Telecomunicat, ii s, i

Tehnologia Informat, iei

Laborator x8051
Curs - Microcontrolere

Îndrumar de Laborator
Cuprins

1 Prezentarea arhitecturii 8051 5


1.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Schema bloc a arhitecturii 8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Setul de instruct, iuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4 Simulatorul EdSim51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.1 Instalarea simulatorului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.2 Descrierea EdSim8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5.1 Descrierea algoritmului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6 Exercit, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2 Utilizarea întreruperilor s, i interfat, area cu un sistem de conversie analog-digital 19


2.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Întreruperile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.1 Surse s, i vectori de întrerupere . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.2 Configurarea întreruperilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 Timer-e/Numărătoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4 Sistemul de conversie analog-digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4.1 Interfat, area 8051 cu sistemul ADC . . . . . . . . . . . . . . . . . . . . . . . . 25
2.4.2 Configurarea frecvent, ei de es, antionare . . . . . . . . . . . . . . . . . . . . . . 26
2.5 Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.5.1 Descrierea algoritmului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.6 Exercit, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3 Interfat, area cu un sistem de conversie digital-analog 33


3.1 Întârziere s, i sincronizare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.1 Subrutine de întârziere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.2 Întârzieri folosind timer-e s, i interogare continuă (polling) . . . . . . . . . . . . 33
3.1.3 Întârzieri folosind timer-e s, i întreruperi . . . . . . . . . . . . . . . . . . . . . . 35
3.2 Sistemul de conversie digital-analog . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.1 Interfat, area microcontrolerului 8051 cu sistemul DAC . . . . . . . . . . . . . . 37
3.2.2 Generarea semnalelor cu DAC . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2.3 Tabele de căutare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.3 Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.3.1 Descrierea algoritmului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.4 Exercit, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4 Controlul motoarelor s, i tastatura 47


4.1 Controlul motoarelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.1 Tipuri de motoare electrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

3
Laborator 0

4.1.2 Interfat, area cu 8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48


4.2 Tastatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2.1 Registrul de fanioane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2.2 Interfat, area cu 8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.3 Exercit, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

5 Utilizarea sistemului de comunicat, ie serială 57


5.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.2 Sistemul de comunicat, ie serială - UART . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.2.1 Registre de configurare UART . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2.2 Calcularea baud rate-ului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2.3 Init, ializarea s, i folosirea UART-ului . . . . . . . . . . . . . . . . . . . . . . . . 60
5.3 Exercit, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

6 Utilizarea afis, ajului cu cristale lichide bazat pe circuitul integrat HD44780 67


6.1 Afis, aj LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.1.1 Rutina de init, ializare a LCD-ului . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.1.2 Descrierea funct, ională a driver-ului de LCD . . . . . . . . . . . . . . . . . . . 70
6.2 Problemă . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.2.1 Descrierea algoritmului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.3 Exercit, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

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.

1.2 Schema bloc a arhitecturii 8051


Arhitectura pe care se bazează 8051 este de tip Harvard. Spre deosebire de arhitectura von Ne-
umann, unde aceeas, i memorie este folosită atât pentru stocarea datelor, cât s, i pentru stocarea
instruct, iunilor, arhitectura Harvard foloses, te memorii fizic separate pentru date, respectiv instruct, iuni,
cele două împărt, ind spat, iul adreselor, după cum este ilustrat în Figura 1.1. Accesul la memoria de
date sau memoria de program se face folosind instruct, iuni specifice.

Figura 1.1: Arhitecturi de tip von Neumann vs. Harvard 8051

5
Laborator 1

În Figura 3.1 se poate observa schema bloc a unui microcontroler 8051 generic având următoarele
caracteristici:

• Unitate Centrală de Procesare pe 8 bit, i cu registrele ACC (acumulator) s, i B

• Numărator de Program (PC) s, i Pointer Date (DPTR) pe 16 bit, i

• Registru de fanioane – "Program Status Word" (PSW) pe 8 bit, i

• Indicator de stivă (SP) pe 8 bit, i

• Memorie internă ROM / EPROM1 de până la 64 kB, folosită pentru stocarea programului

• Memorie RAM de 128 de octet, i compusă din:

1. 4 seturi de registre, fiecare cont, inând câte 8 registre pe 8 bit, i


2. 16 octet, i adresabili la nivel de bit
3. 80 de octet, i folosit, i pentru uz general

• 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

• Două Timer-e/Numărătoare pe 16 bit, i: T0 s, i T1

• Registru de date pentru comunicat, ia serială full duplex: SBUF

• Registre de control: TCON, TMOD, SCON, PCON, IP s, i IE

• Două surse de întreruperi interne s, i trei externe

• Oscilatorul s, i circuitele care asigură semnalul de ceas.

Memoria de program – ROM/EPROM


Memoria de program constă în 64 kB de memorie cu adrese de la 0x0000 la 0xFFFF (vezi Fi-
gura 3.2). Memoria de program poate fi accesată cu ajutorul instruct, iunilor MOVC.

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

Figura 1.2: Schema bloc a arhitecturii 8051

Locat, ii adresabile pe bit


În plus fat, ă de accesul direct la memoria organizată pe octeti, 8051 pune la dispozit, ie un spat, iu
de memorie de 16 octet, i (de la 0x20 la 0x2F) adresabil pe bit. Fiecare bit are o adresă între 0x00 s, i
0x7F. Exemple:
• bitul 0 al octetului cu adresa 0x20 are adresa de bit 0x00
• bitul 7 al octetului cu adresa 0x20 are adresa de bit 0x07
• bitul 7 al octetului cu adresa 0x2F are adresa de bit 0x7F

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.

Memoria externa de date


Microcontrolerul 8051 oferă posibilitatea de a adăuga o memorie externă de date cu dimensiunea
maximă de 64kB. Accesarea acestei memorii se face cu magistrala de date s, i adrese, folosind Port 0
s, i eventual Port 2. Validarea se face folosind pinii RD s, i WR ai Port 3. Dimensiunea magistralei de
adrese poate fi 1 octet sau 2 octet, i spre deosebire de memoria internă de date unde magistrala de
adrese are 1 octet.

Figura 1.3: Elementele cheie în programarea 8051

8
Laborator 1

1.3 Setul de instruct, iuni

Mnemonic Description Bytes Clock Cycles


Arithmetic Operations
ADD A, Rn Add Register to A 1 12
ADD A, direct Add direct byte to A 2 12
ADD A, @Ri Add indirect RAM to A 1 12
ADD A, #data Add immediate to A 2 12
ADDC A, Rn Add Register to A with Carry 1 12
ADDC A, direct Add direct byte to A with Carry 2 12
ADDC A, @Ri Add indirect RAM to A with Carry 1 12
ADD A, #data Add immediate to A with Carry 2 12
SUBB A, Rn Subtract Register from A with borrow 1 12
SUBB A, direct Subtract direct byte from A with borrow 2 12
SUBB A, @Ri Subtract indirect RAM from A with borrow 1 12
SUBB A, #data Subtract immediate from A with borrow 2 12
INC A Increment A 1 12
INC Rn Increment Rn 1 12
INC direct Increment direct byte 2 12
INC @Ri Increment indirect RAM 1 12
DEC A Decrement A 1 12
DEC Rn Decrement Rn 1 12
DEC direct Decrement direct byte 2 12
DEC @Ri Decrement indirect RAM 1 12
INC DPTR Increment data pointer 1 24
MUL AB Multiply A and B 1 48
DIV AB Divide A by B 1 48
DA A Decimal adjust A 1 12
Logical Operations
ANL A, Rn AND Register to A 1 12
ANL A, direct AND direct byte to A 2 12
ANL A, @Ri AND indirect RAM to A 1 12
ANL A, #data AND immediate to A 2 12
ANL direct, A AND A to direct byte 2 12
ANL direct, #data AND immediate to direct byte 3 24
ORL A, Rn OR Register to A 1 12
ORL A, direct OR direct byte to A 2 12
ORL A, @Ri OR indirect RAM to A 1 12
ORL A, #data OR immediate to A 2 12
ORL direct, A OR A to direct byte 2 12
ORL direct, #data OR immediate to direct byte 3 24
XRL A, Rn Exclusive–OR Register to A 1 12
XRL A, direct Exclusive–OR direct byte to A 2 12
XRL A, @Ri Exclusive–OR indirect RAM to A 1 12
XRL A, #data Exclusive–OR immediate to A 2 12
XRL direct, A Exclusive–OR A to direct byte 2 12
XRL direct, #data Exclusive–OR immediate to direct byte 3 24

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

MOV C, bit Move direct bit to Carry 2 12


MOV bit, C Move Carry to direct bit 2 24
JC rel Jump if Carry is set 2 24
JNC rel Jump if Carry is not set 2 24
JB bit, rel Jump if direct bit is set 3 24
JNB bit, rel Jump if direct bit is not set 3 24
JBC bit, rel Jump if direct bit is set and clear bit 3 24
Program Branching
ACALL addr11 Absolute subroutine call 2 24
LCALL addr16 Long subroutine call 3 24
RET Return from subroutine 1 24
RETI Return from interrupt 1 24
AJMP addr11 Absolute jump 2 24
LJMP addr16 Long jump 3 24
SJMP rel Short jump (relative address) 2 24
JMP @A + DPTR Jump indirect relative to DPTR 1 24
JZ rel Jump if A equals zero 2 24
JNZ rel Jump if A does not equal zero 2 24
CJNE A, direct, rel Compare direct byte to A and jump if not 3 24
equal
CJNE A, #data, rel Compare immediate to A and jump if not 3 24
equal
CJNE Rn, #data, rel Compare immediate to Register and jump if 3 24
not equal
CJNE @Ri, #data, rel Compare immediate to indirect and jump if 3 24
not equal
DJNZ Rn, rel Decrement Register and jump if not zero 2 24
DJNZ direct, rel Decrement direct byte and jump if not zero 3 24
NOP No operation 1 12

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

1.4 Simulatorul EdSim51


Simulatorul EdSim51 oferă funcţionalitatea arhitecturii microcontrolerului Intel MCS-51 (8051).
Acesta conţine toate registrele specifice arhitecturii şi, în plus, aduce posibilitatea de interfaţare cu
diferite periferice. Simulatorul poate fi descărcat de la următoarea adresă web 2 sau de pe pagina de
moodle a cursului de Microcontrolere.
Pentru a putea executa simulatorul, este necesară instalarea JAVA Runtime Environment (JRE)
pentru sistemul de operare utilizat. JAVA Runtime Environment poate fi descărcat de la următoarea
adresă web 3 .

1.4.1 Instalarea simulatorului


Simulatorul rulează pe orice sistem de operare care are JRE instalat. Se dezarhivează arhiva ed-
sim51di.zip în directorul dorit, apoi se intră în directorul edsim51di. Pentru Windows, se rulează fişi-
erul edsim51di.jar prin dublu-click. Pentru Linux, este necesară acordarea permisiunilor de execut, ie
pentru fis, ierul edsim51di.jar, apoi rularea acestuia cu JAVA. Se va deschide o fereastră asemănătoare
celei din Figura 3.3.

Figura 1.4: Fereastra simulatorului EdSim51

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

1.4.2 Descrierea EdSim8051


Interfat, a simulatorului este compusă din mai multe sect, iuni, conform Figurii 1.5, care vor fi descrise
în continuare.

Figura 1.5: Sect, iunile interfet, ei simulatorului EdSim51

Fereastra microcontrolerului
Această secţiune cont, ine elementele de arhitectură utilizate pentru programarea microcontrolerului,
ilustrate în Figura 3.2.

Fereastra pentru cod


Simulatorul suportă scrierea codului în limbaj de asamblare cu opţiuni de debugging pas cu pas.
De asemenea, codul scris poate fi salvat sub forma unui fis, ier .asm s, i încărcat fie dintr-un fis, ier salvat
în prealabil, fie dintr-un fis, ier binar de tipul Intel Hex.

Fereastra pentru asocierea porturilor


În această fereastră sunt afis, ate Porturile 0-3, valorile logice de la intrare/ies, ire s, i pinii dispozitivelor
periferice la care sunt conectate.

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

• ADC (pe 8 biţi) – Convertor analog-digital

• DAC (pe 8 biţi) – Convertor digital-analog

• 8 butoane

• 4 afişaje cu 7 segmente

• Interfat, ă UART

• Osciloscop

• Motor

• LCD 2 × 16

Figura 1.6: Perifericele simulatorului EdSim51

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.

1.5.1 Descrierea algoritmului


În general, codul sursă al unui program scris în limbaj de asamblare este structurat astfel:

• Zona EQUATES – în această zonă se etichetează resursele hardware ale microcontrolerului


pentru a lucra mai us, or cu acestea.

• 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.

Figura 1.7: Organigrama aplicat, iei Blinky

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.

3. Modificat, i programul astfel încât LED-ul să se aprindă cu o frecvent, ă crescătoare.

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

Anexa 1 – Codul aplicat, iei Blinky


;------------------------------------------
; EQUATES
;------------------------------------------

LED equ P1.7 ; Label port P1.7 as LED

;------------------------------------------
; 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.

Figura 2.1: Arhitectura unui sistem cu microcontroler s, i ADC

19
Laborator 2

2.2.1 Surse s, i vectori de întrerupere


Microcontrolerul 8051 dispune de 5 surse de întreruperi. Trei dintre acestea sunt generate intern
de fanionul timer-ului 0, fanionul timer-ului 1 s, i fanionul comunicat, iei seriale. Celelalte două sunt
declans, ate de semnale externe aplicate la pinii INT0 s, i INT1.
Vectorii de întrerupere sunt adrese dedicate în memoria de program, prezentate în tabelul următor.

Interrupt Address (Hex)


IE0 0x0003
TF0 0x000B
IE1 0x0013
TF1 0x001B
SERIAL 0x0023

2.2.2 Configurarea întreruperilor


Activarea s, i setarea priorităt, ii întreruperilor se face cu ajutorul registrelor speciale IE (Interrupt
Enable) s, i IP (Interrupt Priority).

Registrul IE

Figura 2.2: Registrul IE.

Bit Symbol Function


7 EA Enable interrupts bit. Cleared to 0 by program to disable all interrupts; set to 1
to permit individual interrupts to be enabled by their enable bit
6 – Not implemented.
5 ET2 Reserved for future use.
4 ES Enable serial port interrupt. Set to 1 by program to enable serial port interrupt;
cleared to 0 to disable serial port interrupt.
3 ET1 Enable timer 1 overflow interrupt. Set to 1 by program to enable timer 1 overflow
interrupt; cleared to 0 to disable timer 1 overflow interrupt.
2 EX1 Enable external interrupt 1. Set to 1 by program to enable INT1 interrupt;
cleared to 0 to disable INT1 interrupt.
1 ET0 Enable timer 0 overflow interrupt. Set to 1 by program to enable timer 0 overflow
interrupt; cleared to 0 to disable timer 0 overflow interrupt.
0 EX0 Enable external interrupt 0. Set to 1 by program to enable INT0 interrupt;
cleared to 0 to disable INT0 interrupt.
Bit addresable as IE.0 to IE.7

20
Laborator 2

Registrul IP

Figura 2.3: Registrul IP.

Bit Symbol Function


7 – Not implemented.
6 – Not implemented.
5 PT2 Reserved for future use.
4 PS Priority of serial port interrupt. Set/cleared by program.
3 PT1 Priority of timer 1 overflow interrupt. Set/cleared by program.
2 PX1 Priority of external interrupt 1. Set/cleared by program.
1 PT0 Priority of timer 0 overflow interrupt. Set/cleared by program.
0 PX0 Priority of external interrupt 0. Set/cleared by program.
Note: Priority may be 1 (highest) or 0 (lowest)
Bit addresable as IP.0 to IP.7

Î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

Figura 2.4: Registrul TCON.

21
Laborator 2

Bit Symbol Function


7 TF1 Timer 1 Overflow flag. Set when timer rolls from all ones to zero. Cleared when
processor executes interrupt service routine located at program address 0x001B
6 TR1 Timer 1 run control bit. Set to 1 by program to enable timer to count; cleared
to 0 by program to halt timer. Does not reset timer.
5 TF0 Timer 0 Overflow flag. Set when timer rolls from all ones to zero. Cleared when
processor executes interrupt service routine located at program address 0x000B.
4 TR0 Timer 0 run control bit. Set to 1 by program to enable timer to count; cleared
to 0 by program to halt timer. Does not reset timer.
3 IE1 External interrupt 1 edge flag. Set to 1 when a high to low edge signal is received
on port 3 pin 3 (INT1). Cleared when proccessor executes interrupt service
routine located at program address 0x0013. Not related to timer operations.
2 IT1 External interrupt 1 signal type control bit. Set to 1 by program to enable
external interrupt 1 to be triggered by a falling edge signal. Set to 0 by program
to enable a low level signal on external interrupt 1 to generate an interrupt.
1 IE0 External interrupt 0 edge flag. Set to 1 when a high to low edge signal is received
on port 3 pin 2 (INT0). Cleared when proccessor executes interrupt service
routine located at program address 0x0003. Not related to timer operations.
0 IT0 External interrupt 0 signal type control bit. Set to 1 by program to enable
external interrupt 0 to be triggered by a falling edge signal. Set to 0 by program
to enable a low level signal on external interrupt 0 to generate an interrupt.
Bit addresable as TCON.0 to TCON.7

Registrul TMOD

Figura 2.5: Registrul TMOD.

Bit Symbol Function


7/3 Gate Or gate enable bit which controls RUN/STOP of timer 1/0. Set to 1 by program
to enable timer to run if bit TR1/0 in TCON is set and signal on external
interrupt INT1/0 pin is high. Cleared to 0 by program to enable timer to run if
bit TR1/0 in TCON is set.
6/2 C/T Set to 1 by program to make timer 1/0 act as a counter by counting pulses from
external input pins 3.5 (T1) or 3.4 (T0). Cleared to 0 by program to make timer
act as timer by counting internal frequency.
5/1 M1 Timer/counter operating mode select bit 1. Set/cleared by program to select
mode.
4/0 M0 Timer/counter operating mode select bit 0. Set/cleared by program to select
mode.
TMOD is not bit addresable

22
Laborator 2

Figura 2.6: Schema bloc pentru configurarea intrării timer-elor.

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

Figura 2.7: Modurile de lucru ale timer-elor.

2.4 Sistemul de conversie analog-digital


Semnalele analogice sunt unele dintre cele mai comune semnale de intrare folosite în sistemele cu
microcontrolere, deoarece majoritatea senzorilor s, i traductoarelor sunt dispozitive cu ies, iri analogice.
Astfel, dacă sistemul dezvoltat implică măsurarea unor mărimi fizice precum temperatura, presiunea,
umiditatea etc., este necesară folosirea unui sistem ADC.
Sistemul ADC pe 8 bit, i, implementat în EdSim51, este ilustrat în Figura 2.8. Pe lângă terminalele
de intrare s, i ies, ire ilustrate, trebuie specificat că ADC-ul are cât, iva parametri suplimentari, precum
tensiunea de referint, ă (în acest caz, Vref = 5V , s, i durata conversiei (în acest caz, aproximativ 25 µs).

Figura 2.8: Modulul ADC oferit de EdSim51.

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.

2.4.1 Interfat, area 8051 cu sistemul ADC


Având în vedere că ADC-ul pe 8 bit, i are ies, ire paralelă, acesta dispune de 8 pini de date corespun-
zători rezultatului conversiei. Pinii de comandă ai ADC-ului sunt legat, i la portul 3 al microcontro-
lerului. Toate legăturile pot fi vizualizate în Figura 2.9.

Figura 2.9: Interfat, area cu ADC-ul.

Formula de conversie a sistemului ADC este următoarea:

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:

1. Valoarea logică a pinului WR trece de la 0 la 1

2. ADC-ul realizează conversia în aproximativ 25 µs

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

5. Citirea rezultatului de pe pinii D0 – D7 de către microcontroler

25
Laborator 2

2.4.2 Configurarea frecvent, ei de es, antionare


Frecvent, a de es, antionare a ADC-ului este configurabilă prin repetarea etapelor realizării unei con-
versii la întreruperea realizată de unul dintre timer-e. Principalele limitări în alegerea unei frecvent, e
de es, antionare cât mai ridicate sunt durata de conversie a ADC-ului, care impune o frecvent, ă maximă
de es, antionare de 40 kHz, s, i timpul de procesare a datelor provenite de la ADC.

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.

2.5.1 Descrierea algoritmului


Solut, ia propusă în cadrul laboratorului utilizează două întreruperi. Prima este generată de timer-ul
0, care init, iază o conversie a ADC-ului la o depăs, ire.
A doua întrerupere este generată de pinul INT0, la care este legat pinul INTR al ADC-ului, s, i are
rolul de a procesa s, i afis, a valoarea măsurată.
Programul începe cu sect, iunea EQUATES, în care sunt etichetat, i pinii de ies, ire asociat, i ledurilor
s, i pinii de ies, ire asociat, i semnalelor de comandă pentru ADC. Următoarea sect, iune, RESET and
INTERRUPT VECTORS, configurează vectorul de reset, care efectuează un salt la rutina principală,
main, s, i ceilalt, i vectori de întrerupere care efectuează salturi către subrutinele de întrerupere cores-
punzătoare, timer0ISR respectiv ext0ISR.
Programul principal efectuează, în primul rând, un salt către subrutina de init, ializare (init), unde
sunt configurate cele 2 întreruperi s, i modul de operare al timer-ului 0. Acesta este configurat în
Modul 2, numit s, i Auto-Reload, detaliat în sect, iunea 2.3. În acest mod, frecvent, a de depăs, ire
(overflow) a timer-ului 0, poate fi controlată prin valoarea de reîncărcare stocată în TH0, astfel:

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

Anexa 2 – Codul aplicat, iei ADCValue


;------------------------------------------
; EQUATES
;------------------------------------------

LED0 equ P1.0


LED1 equ P1.1
LED2 equ P1.2
LED3 equ P1.3
LED4 equ P1.4
LED5 equ P1.5
LED6 equ P1.6
LED7 equ P1.7
ADC_WR equ P3.6
ADC_RD equ P3.7

;------------------------------------------
; RESET and INTERRUPT VECTORS
;------------------------------------------

org 0x0000 ; Reset Vector


ljmp main ; Locate a jump to the start of code
;at the reset vector.
ORG 0x0003 ; external 0 interrupt vector
ljmp ext0ISR ; jump to the external 0 ISR

ORG 0x000B ; timer 0 interrupt vector


ljmp timer0ISR ; jump to timer 0 ISR

;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------

ORG 30H ; main program starts here


main:
call init ; Initialization of interrups and timer0

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

mov TMOD, #0x02 ; set timer 0 as 8-bit auto-reload interval timer


mov TH0, #0x00 ; put 0x00 into timer 0 high-byte - this reload value,
;with system clock of 12 MHz, will result in a
;timer 0 overflow every 256 us
mov TL0, #0x00 ; put the same value in the low byte
setb ET0 ; enable timer 0 interrupt
setb EA ; set the global interrupt enable bit
mov P1, #0xFF ; Turn off all leds
ret

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

; timer 0 ISR - starts an ADC conversion


timer0ISR:
clr ADC_WR ; clear ADC WR line
setb ADC_WR ; then set it - this results in the
;required positive edge to start a conversion
reti ; return from interrupt

; external 0 ISR - responds to the ADC conversion complete interrupt


ext0ISR:
clr ADC_RD ; clear the ADC RD line - this enables the data lines

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.

3.1 Întârziere s, i sincronizare


Anumite probleme uzuale ale sistemelor cu microcontroler necesită sincronizări sau întârzieri. În
continuare, vor fi prezentate mai multe metode de management al timpului împreună cu avantajele
s, i dezavantajele lor.

3.1.1 Subrutine de întârziere


Subrutinele de întârziere reprezintă secvent, e de cod ce determină nucleul microcontrolerului să
execute în mod repetat o serie de instruct, iuni până ce o condit, ie de oprire este satisfăcută. Acestea
pot fi organizate sub formă de subprogram sau chiar ca parte a programului principal. Întârzierea
provocată este predictibilă s, i se bazează pe frecvent, a semnalului de ceas, pe numărul de instruct, iuni
executate s, i pe numărul de cicluri de ceas necesare execut, iei fiecărei instruct, iuni. De cele mai multe
ori, subrutinele de întârziere sunt parametrizabile, astfel încât să poată fi us, or refolosite pentru
întârzieri de durate diferite.
Un exemplu de folosire a subrutinelor de întârziere este prezentat s, i în solut, ia propusă pentru
problema prezentată în prima lucrare de laborator. Acolo, subrutina este organizată sub forma unui
subprogram ce primes, te un parametru prin intermediul acumulatorului. Subprogramul cont, ine două
bucle imbricate ce se bazează pe decrementarea a două contoare până ce acestea ajung la 0. Dacă
bucla internă se execută mereu de 256 de ori, cea externă depinde de parametrul de intrare. Astfel
se obt, ine o întârziere variabilă între 256 de instruct, iuni s, i 65536 (256 x 256) de instruct, iuni, cu pas
de 256 de instruct, iuni. Valoarea exactă a întârzierii se deduce cu ajutorul frecvent, ei semnalului de
ceas s, i a numărului de cicluri de ceas necesare execut, iei instruct, iunilor în cauză.
Avantajele acestei metode sunt simplitatea conceptului s, i independent, a totală fat, ă de orice periferic.
Dezavantajul principal este utilizarea ineficientă a energiei electrice s, i a puterii de calcul pentru
execut, ia unor instruct, iuni care nu oferă rezultate folositoare programului. Un alt dezavantaj este
lipsa de standardizare în dezvoltarea unor astfel de subrutine, conducând astfel la un cod greu de
înt, eles.

3.1.2 Întârzieri folosind timer-e s, i interogare continuă (polling)


Timer-ele pot fi folosite pentru măsurarea precisă a timpului. Astfel, este natural ca întârzierile
să poată fi programate cu ajutorul lor. Metoda interogării continuă (polling) se referă la verificarea

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
;---------------------

LED equ P1.7

;---------------------
;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

3.1.3 Întârzieri folosind timer-e s, i întreruperi


Fat, ă de cele două variante prezentate anterior, folosirea întreruperilor determină un comportament
non-blocant al programului. Astfel, după pornirea timer-ului, nucleul microcontrolerului continuă
execut, ia programului, în loc să as, tepte finalizarea întârzierii. Abia când întreruperea ce indică
finalizarea întârzierii se declans, ează, nucleul microcontrolerului sare la execut, ia unei subrutine (de
deservire a întreruperii) pentru a act, iona în consecint, ă.
Avantajul acestei metode este că nu se consumă energie s, i putere de calcul inutil. Dezavantajul
este că paradigma folosită în conceperea programului nu mai poate fi pur procedurală, ci trebuie
să ia în calcul aparit, ia spontană a unor evenimente (întreruperi), ceea ce poate necesita mai multă
grijă în considerarea desfăs, urării în timp a programului (mai ales dacă sunt active mai multe surse
de întrerupere s, i este importantă sincronizarea acestora).
Următorul program foloses, te timer-ul 0 în Modul 2 s, i întreruperea asociată 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
= ≈ 1.95kHz
2 12 NM AX − NM IN 2(2 − 0x00) 2 × 256

;---------------------
;EQUATES
;---------------------

LED equ P1.7

;---------------------
;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

ISR: cpl LED


reti

3.2 Sistemul de conversie digital-analog


Un sistem de conversie digital-analog (DAC) transformă un semnal digital într-un semnal analogic.
DAC-ul primes, te ca date de intrare un cod binar (un număr binar) de lungime fixă s, i generează o
tensiune analogică în raport cu o valoare de referint, ă. Rezolut, ia sistemului este dată de numărul de
bit, i folosit pentru semnalul digital de intrare, iar acuratet, ea este dată de caracteristicile constructive.
DAC-ul prezentat în cadrul acestei lucrări de laborator are o rezolut, ie de 8 bit, i, iar tensiunea sa de
referint, ă este fixă. Sistemul foloses, te s, i un semnal de activare (WR) ce lucrează pe logică negativă
(i.e. declans, area se face cu valoarea 0 logic). Formula de conversie folosită este:

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.

Figura 3.1: Convertor Digital-Analog

36
Laborator 3

3.2.1 Interfat, area microcontrolerului 8051 cu sistemul DAC


În sistemele cu microcontroler, DAC-ul poate fi intern sau extern. Diferent, a principală între cele
două variante de lucru se leagă de modul în care semnalul digital de intrare este pus la dispozit, ia DAC-
ului. Majoritatea microcontrolerelor moderne au sisteme de conversie incorporate, iar configurarea
lor se bazează pe manipularea registrelor speciale (SFR). Totus, i, în cazul simulatorului EdSim51,
DAC-ul este un sistem extern cu care microcontrolerul comunică prin porturile de intrare/ies, ire.

Figura 3.2: Conexiunea DAC - 8051

Î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.

3.2.2 Generarea semnalelor cu DAC


Semnalul ce poate fi generat cel mai us, or cu ajutorul unui sistem cu microcontroler s, i DAC este
semnalul rampă sau dinte de fierăstrău. Frecvent, a poate fi stabilită prin pasul de incrementare
folosit. Următorul program generează un semnal rampă cu ajutorul DAC-ului pus la dispozit, ie de
simulatorul EdSim51.
Pentru a calcula perioada semnalului este suficient să înmult, im numărul de "trepte":

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

timer0ISR: xrl A, #0xFF


mov P1, A
reti

Pentru generarea unor semnale mai complexe, este necesară folosirea tabelelor de căutare.

3.2.3 Tabele de căutare


O tabelă de căutare este o matrice de valori numerice prezentă în memoria de program sau de
date a microcontrolerului. Tabelele de căutare sunt folosite pentru a elimina algoritmii de calcul
în cazul problemelor complexe ce au parametrii de intrare într-o gamă rezonabilă de valori. Altfel
spus, acestea introduc un compromis între timpul de execut, ie al programului s, i memoria ocupată de
acesta.

Figura 3.3: Tabelă de căutare cu două dimensiuni

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.

3.3.1 Descrierea algoritmului


Programul constă în alăturarea în mod convenabil a două semnale de tip rampă, unul crescător
s, i unul descrescător. Un bit oarecare din zona accesibilă pe bit, i va fi folosit ca fanion de direct, ie.
Acesta ajută la comutarea între cele două rampe. Când una dintre rampe ajunge la valoarea sa
limită, programul schimbă fanionul. Astfel, poate începe afis, area celeilalte rampe.

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

Anexa 3 – Codul aplicat, iei Triangle Waveform Generator


;---------------------
;EQUATES
;---------------------
WR equ P0.7
DF equ 0x01
step equ 0x10
min equ 0x00
max equ 0xF0
;---------------------
;RESET and INTERRUPT VECTORS
;---------------------
ORG 0x0000
ljmp main
;---------------------
;MAIN PROGRAM CODE SEGMENT
;---------------------
ORG 0x0030
main: acall init

mainLoop: cjne A, #max, next


setb DF
next: cjne A, #min, continue
clr DF

continue: jb DF, decr


add A, #step
jmp final
decr: clr C
subb A, #step

final: mov P1, A


jmp mainLoop
;---------------------
;FUNCTION CODE
;---------------------
init: clr EA
clr WR
mov A, #min
clr DF
ret

44
Laborator 3

Anexa 4 – Formula de conversie DAC


Se defines, te tensiunea de ies, ire de cap de scară (full-scale):

VF S = valmax × VLSB = (2rez − 1) × VLSB


În mod normal, pentru a obt, ine o caracteristică liniară de conversie, dar s, i din alte motive practice,
VLSB = Vref /2rez , astfel:
Vref
VF S = (2rez − 1) × 6= Vref
2rez
Totus, i, în cadrul simulatorului EdSim51 s-a dorit obt, inerea unei caracteristici cu VF S = Vref , astfel
se lucrează cu VLSB = Vref /(2rez − 1), iar formula de conversie va fi:
Vref 5V
VOU T = D × rez
=D× ,
2 − 1 28 −1
unde D este valoarea digitală.

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.

4.1 Controlul motoarelor


Motorul electric transformă energia electrică în energie mecanică.

4.1.1 Tipuri de motoare electrice


Cel mai simplu tip de motor apare în literatura de specialitate cu titulatura de Motor DC. Acesta
foloses, te doi magnet, i permanent, i concavi s, i de pol opus, orientat, i fat, ă în fat, ă, s, i un electromagnet ce
se învârte în cavitatea formată (rotor). Electromagnetul este format dintr-un număr de armături ce
sunt "active" alternativ. În momentul activării unei armături, aceasta tinde către pozit, ia magnetică
de echilibru s, i astfel determină rotat, ia electromagnetului. În momentul în care se ajunge la pozit, ia
de echilibru, următoarea armătură este activată. În acest mod se asigură o mis, care de rotat, ie
continuă. Terminalele armăturilor sunt dispuse circular pe un inel comutator. "Activarea" unei
armături presupune ca inelul comutator să fie într-o pozit, ie ce determină contactul dintre terminalele
armăturii respective s, i bornele circuitului de control. Modul de dispunere al terminalelor pe inelul
comutator face posibilă activarea succesivă a armăturilor astfel încât mis, carea de rotat, ie să aibă o
viteză uniformă în funct, ie de tensiunea aplicată la intrare. Pentru schimbarea sensului de rotat, ie
este suficient ca circuitul de control să impună o tensiune inversă la bornele sale.

Figura 4.1: Motor DC

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.

Figura 4.2: Motor pas cu pas

4.1.2 Interfat, area cu 8051


În cadrul simulatorului EdSim51, pinii 0 s, i 1 ai portului 3 pot fi conectat, i la o punte H ce comandă
motorul. Motivul pentru care motorul nu este comandat direct de către microcontroler este faptul
că pinii au un curent de ies, ire foarte limitat.

48
Laborator 4

Figura 4.3: Punte H

Î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

Figura 4.4: Conexiunea motor - 8051

;---------------------
;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

mov TH1, #per


mov TL1, #per
setb TR1
setb LED
setb motorB
clr motorA
ret

ISR_tmr1: cpl LED


reti

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.

4.2.1 Registrul de fanioane


Nucleul 8051 dispune de un registru de fanioane denumit Program Status Word (PSW). Acesta
cont, ine fanioanele de depăs, ire, fanionul de paritate, câmpul binar de select, ie a setului de registre
folosit, dar s, i un fanion de uz general.

Registrul PSW

Figura 4.5: Registrul PSW.

52
Laborator 4

Bit Symbol Function


7 CY Carry flag; used in arithmetic, JUMP, ROTATE and BOOLEAN instructions
6 AC Auxiliary carry flag; used for BCD arithmetic
5 F0 User flag 0
4 RS1 Register bank select bit 1
3 RS0 Register bank select bit 0
2 OV Overflow flag; used in arithmetic instructions
1 – Reserved for future use
0 P Parity flag; shows parity of register A; 1 = Odd Parity
Note: Bit addressable as PSW.0 to PSW.7

4.2.2 Interfat, area cu 8051


Simulatorul EdSim51 pune la dispozit, ie o tastatură 4x3 cu implementare matricială ce se poate
conecta la microcontrolerul 8051 conform cu Figura 4.6. Pinii 0, 1, 2 s, i 3 ai portului 0 sunt electrozii
de linie, în timp ce pinii 4, 5 s, i 6 ai portului 0 sunt electrozii de coloană. De asemenea, se poate
observa că electrozii de coloană sunt conectat, i la intrările unei port, i de tip AND a cărei ies, ire poate
fi conectată la pinul 3 al portului 3. Acesta poate fi configurat ca sursă externă de întreruperi.
Tastatura pune la dispozit, ie mai multe moduri de apăsare a tastelor s, i oferă chiar opt, iunea de
emulare a perioadei de stabilizare.

Figura 4.6: Conexiunea tastaturii cu microcontrolerul 8051

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

scan: mov R0, #0x00


mov P0, #0xFF
clr F0

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

finish: mov P0, #0xF0


clr IE1
reti

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.

5.2 Sistemul de comunicat, ie serială - UART


Protocolul UART nu este un standard de comunicare serială (cum sunt I2C-ul1 s, i SPI-ul2 ), ci
defines, te un periferic fizic, implementat în cadrul hardware-ului unui sistem cu microcontroler. Toto-
dată, protocolul UART reprezintă un mod de comunicare asincron, i.e. nu este necesară sincronizarea
(bazelor de timp) între cele două dispozitive care comunică. Sunt utilizate două conexiuni electrice,
denumite RX s, i TX, pentru a recept, iona s, i transmite date, conform Fig.5.1. În cadrul sistemului
de comunicat, ie serială UART, este permisă comunicarea între maximum două dispozitive (acestea
putând avea, pe rând, rolurile de Master / Slave, i.e. de a recept, iona / transmite informat, ii).

Figura 5.1: Conexiunea fizică a două dispozitive cu UART

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.

Figura 5.2: Formatul pachetelor de transmisiune UART

Î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.2.1 Registre de configurare UART


Pentru configurarea sistemului de comunicat, ie serială UART sunt necesare operat, ii în 5 registre cu
funct, ii speciale:

1. SCON (Serial Port Control Register)

2. SBUF (Serial Data Buffer)

3. TCON (Timer/Counter Control Register)

4. TMOD (Timer/Counter Mode Control Register)

5. T1 (Timer 1)

Registrul SCON

Figura 5.3: Registrul SCON.

Bit Symbol Function


7 SM0 This bit is used for serial port mode selection.
6 SM1 This bit is used for serial port mode selection.
5 SM2 This bit is used for serial port mode selection, also known as multiprocessor
communication enable bit. When set, it enables multiprocessor communication
in mode 2 and 3, and eventually mode 1. It should be cleared in mode 0.
4 REN Reception Enable bit enables serial reception when set. When cleared, serial
reception is disabled.
3 TB8 Transmitter bit 8. Since all registers are 8-bit wide, this bit solves the problem
of transmitting the 9th bit in modes 2 and 3. It is set to transmit a logic 1 in
the 9th bit.
2 RB8 Receiver bit 8 or the 9th bit received in modes 2 and 3. Cleared by hardware if
9th bit received is a logic 0. Set by hardware if 9th bit received is a logic 1.
1 TI Transmit Interrupt flag is automatically set at the moment the last bit of one
byte is sent. It’s a signal to the processor that the line is available for a new byte
to transmit. It must be cleared from within the software.
0 RI Receive Interrupt flag is automatically set upon one byte to receive. It signals
that byte is received and should be read quickly prior to being replaced by new
data. This bit is also cleared from within the software.

SM0 SM1 Operation Description Baud Rate Source


0 0 Mode0 8-bit UART 1/12 of Osc frequency shift register mode fixed baud rate
0 1 Mode1 8-bit UART 8-bit UART with Timer 1 determined baud rate
1 0 Mode2 9-bit UART 9-bit UART with 1/32 of Osc fixed baud rate
1 1 Mode3 9-bit UART 9-bit UART with Timer 1 determined baud rate

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.4: Registrul SBUF.

5.2.2 Calcularea baud rate-ului


În cadrul acestei lucrări de laborator, modul de lucru pentru sistemul UART va fi Modul 1.
Pentru a putea utiliza baud rate-urile standard, valoarea oscilatorului extern va trebui setată la
frecvent, a 11.0592 MHz. Schema pentru divizarea frecvent, elor este prezentată în Figura 5.5.

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

5.2.3 Init, ializarea s, i folosirea UART-ului


Pas, ii pentru init, ializarea UART-ului sunt:

1. Setarea corectă a registrului SCON (Modul 1 de funct, ionare etc.).

2. Setarea Timer-ului 1 în Modul 2 de funct, ionare (8-bit auto-reload).

3. Scrierea valorilor TH1, TL1 pentru a seta baud rate-ul.

4. Pornirea Timer-ului 1 prin setarea bitului TR1.

5. Activarea sursei de întrerupere (sistemul de comunicat, ie serială).

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

mov SCON, #0x50 ; 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:
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

Anexa 5 – Tabela codurilor ASCII

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.

6.1 Afis, aj LCD


Afis, ajul LCD (Liquid Crystal Display) 2x16 se bazează pe circuitul integrat HD44780. Foaia de
catalog a acestui circuit integrat poate fi accesată la adresa web 1 . În lucrarea curentă de laborator,
vor fi prezentate doar comenzile utilizate în problema propusă s, i va fi explicat doar modul de lucru
pe 4 bit, i (cel mai utilizat mod pentru a minimiza numărul de pini).
Schema circuitului este prezentată în Figura 6.1. LCD-ul este legat la microcontroller prin inter-
mediul a 6 conexiuni:

• pinii DB7-DB4 - 4 pini de date

• pinul E - este folosit ca pin de es, antionare pentru bit, ii DB7-DB4, pe front descrescător

• pinul RS - face select, ia între instruct, iuni (0) s, i date (1)

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

Figura 6.1: Schema electrică a afis, ajului LCD

68
Laborator 6

Figura 6.2: Comenzi LCD

69
Laborator 6

6.1.1 Rutina de init, ializare a LCD-ului


Rutina de init, ializare este descrisă în foaia de catalog a afis, ajului LCD (pagina 42), pentru modul
de lucru pe 4 bit, i s, i afis, are pe o singură linie (numită s, i afis, are 8x1). Această rutină se regăses, te în
Figura 6.3. În laboratorul curent funct, ia "Function set" va fi diferită de cea din foaia de catalog,
deoarece LCD-ul va fi init, ializat în modul afis, are 8x2. În ciudat faptului că nu există rutine de
init, ializare pentru mai mult de 8 coloane, driver-ul LCD-ului suportă pana la 40 de coloane.

Figura 6.3: Rutina de init, ializare a afis, ajului LCD - modul de lucru pe 4 bit, i, afis, are 8x1

6.1.2 Descrierea funct, ională a driver-ului de LCD


Registrele IR s, i DR
Registrul IR (Instruction Register) stochează coduri de instruct, iune (de exemplu display clear,
return home, etc) s, i, în cazul utilizării celor 2 memorii DDRAM (Display Data RAM) s, i CGRAM
(Character Generator RAM), stochează o adresă fizică.
Registrul DR (Data Register) stochează datele care vor fi scrise/citite din DDRAM/CGRAM.
Folosind bitul RS (Register Selector) se poate selecta dacă instruct, iunea curentă este folosită ca un
opcode sau ca o adresă pentru DDRAM/CGRAM.
Memoria DDRAM are funct, ia de a atribui fiecărei linii s, i fiecărei coloane câte o adresă unică în
funct, ie de configurat, ia aleasă în funct, ia de init, ializare. Conform fis, ei tehnice, pentru exemplul din
acest laborator avem următoarea mapare, descrisă în Figura 6.5.

70
Laborator 6

Figura 6.4: Maparea între adresa DDRAM s, i pozit, ia scrisă pe display

Adresa de init, ializare a DDRAM-ului este 0 (prima linie, primul caracter).


Memoria CGRAM stochează un tabel de tip ROM (care totus, i poate fi modificat) cu pixelii 5x8
predefinit, i ai unor simboluri. Adresa CGRAM-ului este aceeas, i cu codurile ASCII ale caracterelor
uzuale. Tabelul cu asocierea între caractere s, i CGRAM se găses, te mai jos.

Figura 6.5: Asocierea între caractere s, i CGRAM

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

mov DPTR, #0x2000


mov R2, #0x10
mov R1, #0x0
mov A, R1

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.

6.2.1 Descrierea algoritmului


Algoritmul unes, te concepte din laboratoarele 5 s, i 6, folosind programul de recept, ionare prin in-
termediul UART-ului (Laborator 5, pagina 61) s, i programul de afis, are pe modulul LCD explicat în
laboratorul curent.
Singura funct, ie suplimentară utilizată este clearDisplay, care s, terge toate caracterele de pe afis, aj
pentru a putea afis, a un nou mesaj. De asemenea, SP este resetat pentru a începe scrierea noilor
caractere recept, ionate prin intermediul UART de la adresa de început a stivei după resetare, adică
0x07. Funct, ia loopDelay asigură o întârziere suficientă pentru a putea citi mesajul transmis de pe
portul serial pe afis, ajul LCD.

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

Anexa 6 – Codul aplicat, iei UARTtoLCD


;------------------------------------------
; 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

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

clr RS ; clear RS - send instruction


clr F0
call set4BitMode
call setNumberOfLinesAndDots
call turnOnDisplayAndCursor
call setEntryMode
ret

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

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