Documente Academic
Documente Profesional
Documente Cultură
Periferice Standard Integrate in Microcontrolerele MCS-51
Periferice Standard Integrate in Microcontrolerele MCS-51
4.1. Timerele 0 şi 1
Fiecare timer conţine câte două registre de 8 biţi (TH0 şi TL0, respectiv TH1 şi TL1), folosite ca
numărător cu incrementare. Funcţionarea celor două timere poate fi controlată prin
intermediul a două registre cu funcţii speciale: TCON şi TMOD.
Timerele 0 şi 1 pot realiza două tipuri de funcţii:
temporizator (timer)
numărător (counter)
1
Funcţionarea ca temporizator
Un numărător de 8 sau 16 biţi este incrementat în mod automat la fiecare ciclu maşină, deci cu
o frecvenţă egală cu 1/12 din frecvenţa oscilatorului.
Funcţionarea ca numărător de evenimente
Un registru de 8 sau 16 biţi este incrementat la fiecare front descrescător al semnalului aplicat
pe pinul de intrare T0/ P3.4, respectiv T1/P3.5.
Pinii T0 şi T1 sunt testaţi în starea S5P2 a fiecărui ciclu maşină.
Se consideră că a apărut un front descrescător dacă un pin este găsit în “0” logic, după ce în
ciclul maşină anterior fusese găsit pe “1” logic.
Incrementarea se produce în starea S3P1 a ciclului maşină următor celui în care a fost detectată
tranziţia activă.
Semnalul pe pinul de intrare trebuie să fie menţinut nemodificat pe durata a cel puţin un ciclu
maşină (12 perioade ale oscilatorului).
2
Rezultă - frecvenţa maximă a semnalului pe pinul de intrare (respectiv intervalul minim dintre
două evenimente), nu trebuie să depăşească 1/24 din frecvenţa oscilatorului (500 KHz la fOSC = 12
Mhz, respectiv 2 μs).
Funcţiile de temporizator şi numărător pot fi îndeplinite în 4 configuraţii hardware distincte,
numite moduri de lucru. Ele se pot selecta, în mod independent pentru fiecare din timerele 0 şi
1, prin perechea de biţi M1M0 din TMOD.
Modurile 0, 1 şi 2 sunt identice pentru ambele timere, fiind ilustrate în fig.1.
Modul 0
Semnalul de numărare poate să provină de la oscilatorul local (temporizator) sau din exterior,
de la pinul T0/T1 (numărător de evenimente), în funcţie de valoarea bitului C/ T din TMOD.
După ce semnalul de numărare este divizat modulo 32 de registrul TL (numărător format cu cei
mai puţin semnificativi 5 biţi), incrementează registrul TH, care lucrează ca un numărător pe 8
biţi.
Deci, în modul 0, numărătorul are în total 13 biţi.
Atunci când conţinutul registrului TH se schimbă din FFh în 00h (la depăşire), este setat
bistabilul de întrerupere asociat TF0/TF1, generându-se o cerere de întrerupere.
3
Timer 0, 1
OSC ÷12 Modul 0 - M1M0 = 00 : TL0/1 - divizor cu 32 (5 biţi)
Modul 1 - M1M0 = 01 : TL0/1 - divizor cu 256 (8 biţi)
C/ T = 0
Incr. Depăşire Întrerupere
TL0/1 TH0/1 TF0/1
C/ T = 1 Control
T0/1 (P3.4/5)
TL0/1
TR0/1 Timer 0, 1 - Modul 2
M1M0 = 10 - autoload
GATE
TH0/1
INT0/1 (P3.2/3)
8Fh 8Eh 8Dh 8Ch 8Bh 8Ah 89h 88h
TCON = 88h TF1 TR1 TF0 TR0 IEI IT1 IE0 IT0
TMOD = 89h GATE C/T M1 M0 GATE C/T M1 M0
Timer 1 Timer 0
Modul 1
Este identic cu modul 0, cu excepţia faptului că registrele TH0 şi TL0, respectiv TH1 şi TL1 se
utilizează complet, formând câte un numărător de 16 biţi pentru fiecare timer.
Modul 2
Se utilizează un numărător de 8 biţi format numai din registrul TL (mai puţin semnificativ).
Depăşirea la numărare determină, pe lângă setarea bistabilului TF şi lansarea unei cereri de
5
întrerupere, copierea automată în registrul numărător (TL) a valorii conţinute în registrul
constantei de timp TH, aşa cum se arată în fig.1 (Autoload).
Modul 3
Cele două registre ale timerului 0 formează două canale independente de 8 biţi. Logica de
control a numărării este prezentată în fig.2.
Canalul format cu registrul TL0 foloseşte biţii de control specifici Timerului 0, cunoscuţi de la
modurile 0 şi 1. Funcţionarea acestuia este identică cu cea descrisă la aceste moduri.
Cel de-al doilea canal, format cu registrul TH0, utilizează bitul de control TR1 de la Timerul 1,
precum şi întreruperea acestuia (bistabilul TF1), dar poate funcţiona doar ca temporizator.
6
TR1
Control
Increm. Depăşire Întrerupere
OSC ÷12 TH0 TF1
C/ T = 0
Increm. Depăşire Întrerupere
TL0 TF0
C/ T = 1 Control
T0 (P3.4)
TR0
Timer 0
Modul 3 - M1M0 = 11
GATE
INT0 (P3.2)
7
Drept urmare, atunci când timerul 0 este programat să lucreze în modul 3, timerul 1 poate să
funcţioneze în oricare din modurile 0, 1 sau 2, fie ca temporizator fie ca numărător cu
următoarele două modificări:
locul lui TR1 este luat de biţii de selecţie mod M1 şi M0, oprirea numărării realizându-se prin
programarea timerului 1 în modul 3 (M1M0=11).
nu se poate semnaliza depăşirea.
În acest caz, Timerul 1 este utilizat de regulă ca generator de tact pentru Portul serial.
Flagurile TF0 şi TF1 se poziţionează pe “1” la depăşirea capacităţii numărătorului, şi pot genera
întreruperi.
Dacă nu se utilizează întreruperile, aceşti biţi trebuie resetaţi prin program la programarea
taskurilor de timp şi pot fi testaţi prin program (polling - interogare), pentru a detecta apariţia
depăşirii numărătoarelor asociate timerelor.
8
Exemplul 1: Să se genereze pe pinul P1.3 un impuls cu durata de
8051 10 ms
10ms (la fOSC=12 MHz).
Întrucât contoarele timerelor sunt incrementate la fiecare 1 µs P1.3
9
CLR TR0 ; Oprire Timer 0.
CLR TF0 ; Şterge fanionul de depăşire al Timerului 0.
JMP $ ; Oprire în buclă infinită
P1.3
Trebuie ca pinul P1.3 să basculeze de două ori într-o perioadă,
adică la fiecare 0,5 / 2KHz = 250 µs.
Pentru realizarea acestei temporizări cu Timerul 1 este nevoie de 250 µs / 1 µs = 250 de
incrementări.
În acest caz se poate folosi un contor de 8 biţi, aşa cum se arată în secvenţa următoare de
program, care utilizează Timerul 1 programat în modul 2.
În acest caz, contorul TL1 se va încărca cu diferenţa 256 – 250 = 6.
MOV TMOD, #20h ; Timer 1 în modul 2 (8 biţi, cu reîncărcare), controlabil soft
MOV TL1,#6 ; Iniţializează contorul Timerului 1.
MOV TH1,#6 ; Iniţializează registrul de reîncărcare al Timerului 1.
10
SETB TR1 ; Pornire Timer 1.
delay: JNB TF1, delay ; Aşteaptă apariţia depăşirii Timerului 1.
CPL P1.3 ; Basculează nivelul la pinul P1.3.
CLR TF1 ; Şterge fanionul de depăşire al Timerului 1.
SJMP delay ; Continuă în buclă infinită.
11
4.2. Timerul 2
Există la seria 8052 şi are asociate două semnale externe: T2 şi T2EX. Selectarea funcţionării ca
numărător sau temporizator se face prin bitul C/ T2 din registrul T2CON.
(msb) (lsb)
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 (C8h)
7 EXF2
6 5 4 3 2 1 0
Cu ajutorul biţilor RCLK, TCLK, CP/ RL2 şi TR2 din T2CON pot fi selectate prin program cele trei
moduri de operare ale Timerului 2.
12
Modul “captură” - există două opţiuni care pot fi selectate prin bitul EXEN2 din T2CON.
Dacă EXEN2=0 - numărător/temporizator de 16 biţi obişnuit, care îşi setează fanionul TF2 la
depăşire şi poate lansa o cerere de întrerupere.
Dacă EXEN2=1: o tranziţie 10 pe intrarea T2EX determină “captarea” conţinutului registrelor
TL2 şi TH2 în registrele RCAP2L şi respectiv RCAP2H.
OSC ÷12
C/T2= 0
TL2 TH2
TF2
(8 biţi) (8 biţi)
T2 (pin) C/T2= 1
Control
TR2
Captură
Detector de RCAP2L RCAP2H Întreruperea
tranziţie (8 biţi) (8 biţi) generată de
T2EX (pin) T2
EXF2
Control EXEN2
Timerul 2 - funcţionarea în modul “captură”
13
Modul “reîncărcare” - există de asemenea două opţiuni, selectabile tot prin EXEN2 din T2CON.
Dacă EXEN2=0, depăşirea Timerului 2 setează TF2 şi determină reîncărcarea registrelor TL2 şi
TH2 cu valoarea de 16 biţi presetată în registrele RCAP2L, respectiv RCAP2H.
Dacă EXEN2=1, Timerul 2 funcţionează ca mai înainte, dar cu o nouă facilitate: la o tranziţie
10 pe T2EX, va fi realizată reîncărcarea pe 16 biţi şi EXF2 va fi setat.
OSC ÷12
C/T2= 0
TL2 TH2
TF2
(8 biţi) (8 biţi)
C/T2= 1
T2 (pin)
Control
TR2
Reîncărcare
Întreruperea
Detector de RCAP2L RCAP2H generată de
tranziţie (8 biţi) (8 biţi) T2
T2EX (pin)
EXF2
Control EXEN2
14
5. Sistemul de întreruperi
15
Generarea întreruperilor
Flagurile de generare a întreruperii sunt biţi din regiştrii SFR TCON şi SCON.
Fiecare sursă de întreruperi are propria sa adresă de tratare în spaţiul de memorie program
0003h÷0023h (vezi Tabelul 1).
TCON 88h TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
SCON 98h SM0 SM1 SM2 REN TB8 RB8 TI RI
16
Validarea întreruperilor
Fiecare sursă de întreruperi poate fi validată sau inhibată individual, prin setarea, respectiv
resetarea unui bit din registrul cu funcţii speciale IE.
În plus, acest registru mai conţine şi un bit de validare/inhibare globală a tuturor liniilor de
întrerupere, EA (Enable All), care are prioritate asupra biţilor de validare/inhibare individuală.
Validarea întreruperilor
Numele Adresa 7 6 5 4 3 2 1 0
Microcontrolerele care dispun de mai multe surse de întreruperi utilizează pentru validarea lor
şi poziţiile rezervate din SFR IE.
17
Flagurile de întrerupere pot fi setate/resetate prin program, cu acelaşi efect ca şi cum ar fi fost
comandate de logica internă de întreruperi. Aceasta însemnă că:
O întrerupere poate fi generată şi prin program, prin setarea flagului asociat. Excepţie fac
întreruperile externe 0 şi 1 atunci când sunt active pe nivel, când flagurile IE0 şi IE1 sunt
afectate numai de starea pinilor INT0 /P3.2 respectiv INT1 /P3.3.
O cerere de întrerupere în aşteptare poate fi anulată înainte de a fi acceptată dacă
întreruperea respectivă era invalidată la momentul apariţiei.
O cerere de întrerupere poate fi achitată în rutina de tratare prin resetarea flagului care a
generat-o, dacă acest lucru nu s-a produs deja, în mod automat, odată cu acceptarea ei de
către unitatea centrală.
18
Prioritatea întreruperilor
Există 2 niveluri de prioritate, notate cu 0 (minimă), respectiv cu 1 (maximă).
Programarea priorităţilor
Numele Adresa 7 6 5 4 3 2 1 0
19
În cazul în care, la un moment dat, există mai multe cereri de întrerupere, cererea de prioritate
maximă se alege folsind două reguli care se aplică succesiv (vezi fig.5.1):
prioritatea nivelului de întrerupere;
prioritatea individuală, în interiorul aceluiaşi nivel.
Numărul cererilor de
întrerupere (maxim 5, minim 1) de
pe nivelul selectat anterior =1
>1
Selecţie bazată pe Se selectează cererea cea mai
prioritatea în cadrul nivelului prioritară din cadrul nivelului
=1
Tratare întrerupere
20
Odată acceptată o cerere de întrerupere, rutina de tratare a acesteia poate fi întreruptă de o
cerere apărută ulterior pe un nivel superior, dar nu şi de o cerere de pe acelaşi nivel sau de pe
un nivel inferior.
Drept urmare, tratarea unei întreruperi de pe nivelul cel mai prioritar din sistem nu poate fi
întreruptă de nici o altă cerere.
Tratarea întreruperilor
Flagurile de generare a întreruperilor sunt eşantionate în starea S5P2 a fiecărui ciclu maşină
(vezi fig.5.2).
21
Valorile memorate sunt testate în ciclul maşină următor.
Dacă există cel puţin o solicitare de întrerupere în aşteptare (având flagurile de generare şi de
validare setate), după rezolvarea priorităţilor sistemul de întreruperi va genera un apel
(echivalent cu o instrucţiune LCALL (Long Call) – dar care nu apare în program) la adresa de
tratare corespunzătoare (vezi tab.1), numai dacă:
nu există o altă cerere, pe un nivel cu prioritate mai mare sau egală, în curs de tratare;
ciclul curent este ultimul ciclu maşină al unei instrucţiuni;
instrucţiunea curentă nu este RETI (revenire din întrerupere) şi nici una care să acceseze
regiştrii cu funcţii speciale IE sau IP, implicaţi în gestiunea întreruperilor.
Solicitările generate de flagurile de întrerupere trebuie să rămână în aşteptare până când ajung
să fie deservite. Dacă un flag de întrerupere este resetat prin program înainte ca întreruperea în
aşteptare asociată să ajungă să fie acceptată de unitatea centrală, atunci cererea de întrerupere
se pierde, fără a mai fi tratată.
În unele cazuri, flagul de întrerupere este resetat automat, prin hardware, în momentul în care
întreruperea asociată este acceptată:
TF0, TF1, precum şi IE0, IE1 - dacă sunt active pe front ().
22
În alte cazuri, rămâne în sarcina rutinei de tratare a întreruperii să reseteze flagul:
RI+TI, precum şi IE0, IE1 - dacă sunt active pe nivel.
23
Întreruperile externe 0 şi 1
Liniile de întrerupere externe INT0 /P3.2 şi INT1 /P3.3 pot fi programate să fie active:
pe nivel coborât, dacă IT0/1=0 în SFR TCON. În lipsa unei solicitări, linia trebuie menţinută pe
nivel ridicat.
Dispozitivul care solicită întreruperea trebuie să menţină linia pe nivel coborât până când
microcontrolerul acceptă întreruperea şi îi confirmă acest lucru printr-o operaţie denumită
achitarea întreruperii.
Flagul de întrerupere este resetat abia atunci când dispozitivul solicitant îşi anulează
cererea.
Aceasta trebuie să se producă înainte de terminarea rutinei de tratare, altfel, imediat după
revenire, se va genera o nouă întrerupere.
pe front descrescător, dacă IT0/1=1 în SFR TCON. Dacă linia de întrerupere este găsită pe “1”
logic într-un ciclu maşină şi pe “0” logic în următorul ciclu maşină, atunci este setat flagul de
întrerupere corespunzător, care generează o cerere de întrerupere.
Resetarea flagului de întrerupere se realizează automat la acceptarea întreruperii (la fel ca
la timere).
24
Exemplul 1: Se va genera pe pinul P1.3 un scurt impuls „1” la
fiecare 1 ms (la fOSC=12 MHz).
8051 1 ms
Întrucât contoarele timerelor sunt incrementate la fiecare 1 µs
(12/fosc), pentru a realiza întârzierea de 1 ms este nevoie de un P1.3
număr de 1 ms / 1 µs = 1000 incrementări succesive.
Valoarea care trebuie încărcată în numărătorul Timerului 0, programat în modul 1 este 65536 –
1000 = 64536 = FC18h.
În programul principal se stabileşte poziţia iniţială pentru P1.3, se programează Timerul 0 şi se
validează întreruperile acestuia.
Generarea impulsului pe pinul P1.3 are loc în rutina de tratare a întreruperii.
Aceasta va fi lansată în execuţie periodic, la expirarea temporizărilor lansate succesiv, prima din
programul principal, iar următoarele din rutina de întrerupere.
26
; Rutina de tratare a întreruperii Timerului 0
rutim0:
SETB P1.3 ; Comandă pinul P1.3 pe nivel ridicat.
CLR P1.3 ; Comandă pinul P1.3 pe nivel coborât.
MOV TL0,#18h ; Reiniţializează Timerul 0.
MOV TH0,#0FCh
RETI ; Revenire din întrerupere.
27
6.1. Portul serial
Toate microcontrolerele MCS-51 şi compatibile conţin o interfaţă serială standard (Serial Port),
având structura şi funcţionarea descrise în cele ce urmează.
Portul serial integrat pe chip poate să transmită şi să recepţioneze date simultan (full-duplex) în
modul asincron, sau half-duplex în modul sincron.
Receptorul
Este prevăzut cu două registre tampon: un registru serie/paralel şi un registru de interfaţă cu
unitatea centrală, iar transmiţătorul are doar un singur registru, care îndeplineşte ambele
funcţii.
Registrele de interfaţă cu unitatea centrală sunt fizic distincte, dar pot fi accesate printr-o
singură adresă de SFR: SBUF.
Pentru controlul funcţionării portului serial şi selectarea modului de lucru se utilizeaza registrul
SFR SCON.
28
SFR de lucru cu interfaţa serie (control, date, validare întreruperi
şi viteza de comunicaţie)
Numele Adresa 7 6 5 4 3 2 1 0
1 1
30
Modul de lucru al interfeţei Viteza de comunicaţie în [Baud], la FOSC = 12 MHz
serie
0 Oscilator Viteză fixă 1
FOSC
106
intern 12
31
Atunci când se foloseşte Timerul 1 în modul 2, cu auto-încărcare, viteza de comunicaţie se
calculează cu relaţia:
2SMOD fOSC
VBaud
32 12 256 TH1 ,
unde SMOD este bitul cel mai semnificativ al registrului PCON, iar (TH1) este valoarea de
reîncărcare, memorată de TH1.
În tab.6.2 sunt prezentate vitezele de comunicaţie uzuale şi modul lor de obţinere atunci când
se foloseşte ca generator de tact Timerul 1, pe baza relaţiei de mai sus.
Viteza de comunicaţie fOSC Bitul Timer 1
(Baud) (MHz) SMOD C/ T Mod Valoarea în TH1
62500 12 1 0 2 FFh
19200 11,0592 1 0 2 FDh
9600 11,0592 0 0 2 FDh
4800 11,0592 0 0 2 FAh
2400 11,0592 0 0 2 F4h
1200 11,0592 0 0 2 E8h
300 11,0592 0 0 2 CCh
32
110 12 0 0 1 FEEBh
Tab.2. Vitezele de comunicaţie la folosirea Timerului 1 ca generator de tact
Acest flag generează o întrerupere de transmisie, care poate fi utilizată de unitatea centrală
pentru a înscrie în SBUF următorul caracter al unui mesaj.
33
În acelaşi scop, pentru recepţie este prevăzut indicatorul RI (buffer de recepţie plin), care este
setat hardware de îndată ce un nou caracter a fost recepţionat şi este disponibil în SBUF.
Acest flag generează o întrerupere de recepţie, care poate fi utilizată de unitatea centrală
pentru a prelua din SBUF caracterul recepţionat.
În cazul în care nu se lucrează cu întreruperi (linia de întrerupere a serialei este invalidată),
flagurile TI şi RI pot fi utilizate într-o procedură de interogare (polling).
Deoarece există o singură linie de întrerupere pentru serială, o procedură de interogare este
necesară chiar şi atunci când se lucrează cu întreruperile validate.
Astfel, în rutina de tratare trebuie să se identifice exact cauza care a produs întreruperea:
recepţia unui nou caracter (RI=1), terminarea transmisiei unui caracter (TI=1) sau ambele
evenimente.
Aceste două flaguri trebuie şterse apoi prin program, înainte de revenirea din întrerupere.
Modurile 2 şi 3 utilizează un al 9-lea bit de date, programabil, preluat la transmisie din TB8 şi
care la recepţie este încărcat în RB8.
34
Acest bit poate fi folosit, de exemplu, pentru implementarea generării/controlului bitului de
paritate al datelor transferate, dacă la transmisie în TB8 este încărcat indicatorul de paritate P
(PSW.0) iar la recepţie se compară RB8 cu bitul de paritate recalculat. În acest caz SM2=0.
Dar cea mai frecventă utilizare a celui de-al 9-lea bit se regăseşte la comunicaţia serială
multipunct, într-o reţea RS-485.
În acest caz, SM2 se utilizează pentru a face distincţie între diferite tipuri de date care circulă în
reţea: la recepţie se va genera o întrerupere numai dacă cel de-al 9-lea bit primit are valoarea
“1”.
SM2 nu are nici un efect în modul 0, iar în modul 1, SM2=1 poate fi folosit pentru a determina
corectitudinea bitului de STOP (dacă este “1”).
Astfel, se va genera o întrerupere de recepţie numai dacă bitul de STOP recepţionat şi încărcat
în RB8 are valoarea “1”.
35
STOP
Exemplul 1: Să se transmită caracterul ‘a’ 8051 ‘a’ = 61h = 01100001b
continuu pe linia serială, la viteza de 9600 Baud P3.1/TxD
1 0 0 0 0 1 1 0 1 0 0 0 0 1 1
(fOSC=11,0592 MHz).
START START
Se va utiliza Portul serial în modul 1 şi Timerul 1
în modul 2, ca generator de tact (vezi tab.2).
MOV TMOD, #20h ; Timerul 1 - generator de tact, în modul 2.
MOV TL1, #0FDh ; Viteza de comunicaţie este 9600 Baud.
MOV TH1, #0FDh ; Iniţializează registrul de reîncărcare
SETB TR1 ; Pornire Timer 1
MOV SCON,#52h ; Programare Port serial: mod=1, REN=1, TI=1
loop:
JNB TI,loop ; Aşteaptă transmisia caracterului anterior
CLR TI ; Şterge fanionul de transmisie.
MOV SBUF,# 'a' ; Transmite caracterul 'a'
SJMP loop ; Continuă să transmită 'a' în buclă infinită.
36
Prin monitorizarea fanionului de transmisie TI este evitată scrierea unui nou caracter în SBUF
peste cel înscris anterior, dar incomplet transmis.
Varianta cu utilizarea întreruperilor
ORG 0 ; Punct de intrare la resetare.
LJMP main ; Salt peste zona vectorilor de întrerupere.
; Zona vectorilor de întrerupere
CSEG AT 0023h ; Selectează segmentul de cod la adresa 0023h.
LJMP rutser ; Salt la rutina de servire a întreruperii PS.
; Programul principal
main:
MOV TMOD, #20h ; Timerul 1 - generator de tact, în modul 2.
MOV TL1, #0FDh ; Viteza de comunicaţie este 9600 Baud.
MOV TH1, #0FDh ; Iniţializează registrul de reîncărcare
SETB TR1 ; Pornire Timer 1.
MOV SCON,#50h ; Programare Port serial: mod=1, REN=1, TI=0.
SETB EA ; Validare globală a întreruperilor.
SETB ES ; Validează întreruperile de la PS.
37
MOV SBUF,# 'a' ; Transmite caracterul 'a'.
SJMP $ ; Buclă infinită.
; Rutina de tratare a întreruperii Portului serial
rutser:
JNB TI,revine
CLR TI ; Anulează cererea de întrerupere de transmisie serială.
MOV SBUF,# 'a' ; Transmite caracterul ’a’.
revine:
RETI ; Revenire din întrerupere.
38
8051
Exemplul 2. Să se iniţializeze Portul serial la fel ca în exemplul P1
1, iar toate caracterele recepţionate pe linia RxD să fie
P3.0/RxD
trimise în Portul 1.
MOV TMOD, #20h ; Timerul 1 - generator
; de tact, în modul 2.
MOV TH1, #0FDh ; Viteza de comunicaţie este 9600 Baud.
MOV TL1, #0FDh ; Iniţializează registrul de reîncărcare.
SETB TR1 ; Pornire Timer 1
MOV SCON,#52h ; Programare Port serial: mod=1, REN=1, TI=1.
wait:
JNB RI,wait ; Aşteaptă recepţia unui caracter.
MOV P1,SBUF ; Trimite în P1 caracterul recepţionat.
CLR RI ; Şterge fanionul de recepţie.
SJMP wait ; Continuă să aştepte următorul caracter.
Prin monitorizarea fanionului de recepţie, RI, se asigură citirea următorului caracter recepţionat
de îndată ce el este disponibil în SBUF.
39
Varianta cu utilizarea întreruperilor:
ORG 0 ; Punct de intrare la resetare.
LJMP main ; Salt peste zona vectorilor de întrerupere.
; Zona vectorilor de întrerupere
CSEG AT 0023h ; Selectează segmentul de cod la adresa 0023h.
LJMP rutser ; Salt la rutina de servire a întreruperii PS.
; Programul principal
main:
MOV TMOD, #20h ; Timerul 1 - generator de tact, în modul 2.
MOV TH1, #0FDh ; Viteza de comunicaţie este 9600 Baud.
MOV TL1, #0FDh ; Iniţializează registrul de reîncărcare.
SETB TR1 ; Pornire Timer 1.
SETB EA ; Validare globală a întreruperilor.
SETB ES ; Validează întreruperile de la Portul serial.
MOV SCON,#50h ; Programare Port serial: mod=1, REN=1, TI=0.
SJMP $ ; Buclă infinită.
40
; Rutina de tratare a întreruperii Portului serial
rutser:
JNB RI,revine ; Testează dacă este o întrerupere de recepţie.
MOV P1,SBUF ; Trimite în P1 caracterul recepţionat.
CLR RI ; Achită întreruperea de recepţie serială.
revine:
RETI ; Revenire din întrerupere.
41