Professional Documents
Culture Documents
VDK Chuong2
VDK Chuong2
HOÏVI ÑIEÀ
U KHIEÅ
N
MCS - 51
1. GIÔÙ
I THIEÄ
U HOÏ VI ÑIEÀ
U KHIEÅ
N MCS-51
2. TOÙ
M TAÉ
T PHAÀ
N CÖÙ
NG
3. CAÁ
U TRUÙ
C PHAÀ
N CÖÙ
NG
4. TOÅCHÖÙ
C BOÄNHÔÙNOÄ
I
5. GIAO TIEÁ
P NGOAÏI VI
MCS-51 laø moät trong soá nhieàu hoï vi ñieàu khieån do nhieàu haõng
saûn xuaát. Haõng saûn xuaát vi ñieàu khieån noåi tieáng laø Atmel
(‘www.atmel.com’). Haõng naøy mua baûn thieát keá cuûa Intel vaø toå
chöùc saûn xuaát.
Vi ñieàu khieån 80C31 laø chip ñaàu tieân trong hoï MCS-51. Chip
naøy khoâng coù boä nhôù noäi beân trong.
Chip ra ñôøi sau 80C31 laø 80C51, coù 4 Kbyte boä nhôù noäi loaïi
PROM, chæ naïp chöông trình ñöôïc 1 laàn, khoâng theå xoaù ñeå
naïp laïi.
Chip 87C51 coù 4Kbyte boä nhôù noäi loaïi EPROM, cho pheùp
naïp chöông trình nhieàu laàn. Tröôùc khi naïp moät chöông trình môùi,
phaûi xoaù chöông trình cuõ baèng caùch chieáu tia cöïc tím vaøo
cöûa soá xoaù.
Chip 89C51 coù 4Kbyte boä nhôù noäi loaïi Flash ROM, cho
pheùp naïp chöông trình haøng ngaøn laàn. Tröôùc khi naïp chöông
trình môùi, chöông trình cuõ ñöôïc xoaù baèng ñieän. Vieäc naïp vaø
xoaù ñöôïc thöïc hieän nhôø maïch naïp. Vì vaäy vieäc naïp laïi chöông
trình trôû neân ñôn giaûn vaø thuaän tieän. Chip 89C51 vì theá ñöôïc
söû duïng phoå bieán nhaát.
33
Song song vôùi hoï MCS-51 laø hoï MCS-52 coù boä nhôù noäi dung
löôïng gaáp ñoâi (8 Kbyte) vaø coù ñeán 3 Timer (nhieàu hôn hoï MCS-51
moät Timer).
Caùc vi ñieàu khieån veà sau naøy coù tính naêng maïnh hôn, nhieàu
thanh ghi hôn, dung löôïng boä nhôù noäi lôùn hôn. Tuy nhieân vieäc khaûo
saùt vi ñieàu khieån 80C51, 89C51 laø neàn taûng cô baûn ñeå sinh vieân
coù theå töï hoïc caùch söû duïng caùc vi ñieàu khieån theá heä sau chuùng.
Vi vaäy trong taøi lieäu naøy, ta chæ khaûo saùt vi ñieàu khieån 89C51, laø
vi ñieàu khieån ñang ñöôïc söû duïng phoå bieán nhaát hieän nay.
Taát caû caùc vi ñieàu khieån hoï MCS-51 ñeàu coù ñaëc ñieåm chung
nhö sau :
Coù 4 Kbyte boä nhôù ROM noäi (ROM ñöôïc tích hôïp beân trong vi
ñieàu khieån) duøng ñeå löu chöông trình ñieàu khieån. Boä nhôù ROM
noäi naøy vì vaäy ñöôïc goïi laø boä nhôù chöông trình (Program
Memory) hay boä nhôù Code töùc maõ leänh (Code Memory).
Coù 256 byte RAM noäi. Trong soá 256 byte naøy, 128 byte daønh
cho vieäc löu tröõ döõ lieäu taïm thôøi trong quaù trình xöû lyù,
128 byte coøn laïi daønh cho caùc thanh ghi chöùc naêng cuûa vi
ñieàu khieån.
Coù 4 PORT xuaát nhaäp, moãi PORT 8 line, coù theå xuaát döõ lieäu
hoaëc nhaäp döõ lieäu neân ñöôïc goïi laø 32 ñöôøng I/O (töùc
Input/Output).
Coù khaû naêng phaùt vaø thu döõ lieäu noái tieáp. Chöùc naêng
naøy ñöôïc duøng ñeå truyeàn döõ lieäu (daïng noái tieáp) giöõa vi
ñieàu khieån vôùi caùc IC ngoaïi vi hoaëc giöõa caùc vi ñieàu khieån
vôùi nhau trong caùc heä thoáng duøng nhieàu vi ñieàu khieån.
Coù theå ñoïc boä nhôù ROM ngoaøi coù dung löôïng toái ña
ñeán 64 Kbyte. Tröôøng hôïp naøy ñöôïc duøng khi chöông trình coù
dung löôïng lôùn hôn 4 Kbyte (vöôït quaù khaû naêng chöùa cuûa boä
nhôù noäi). Boä nhôù ROM noäi trong tröôøng hôïp naøy khoâng ñöôïc
duøng. Toaøn boä chöông trình ñieàu khieån ñöôïc löu trong ROM
ngoaøi.
Coù theå truy xuaát (ñoïc döõ lieäu hoaëc ghi döõ lieäu) boä nhôù
RAM ngoaøi dung löôïng toái ña ñeán 64 Kbyte.
Coù 210 bit coù theå tri xuaát töøng bit. Chöùc naêng naøy cho
pheùp thay ñoåi noäi dung cuûa 1 bit maø khoâng laøm aûnh höôûng
ñeán traïng thaùi cuûa caùc bit khaùc naèm trong cuøng byte vôùi bit
ñöôïc truy xuaát.
Taát caû caùc vi ñieàu khieån cuøng hoï MCS-51 hoaëc MCS-52 coù taäp
leänh gioáng nhau, töùc laø caùch vieát chöông trình vaø leänh khoâng thay
ñoåi. Tuy nhieân veà caáu truùc phaàn cöùng thì caùc vi ñieàu khieån ra ñôøi
sau coù theâm moät soá phaùt trieån treân cô sôû caùc vi ñieàu khieån theá
34
heä tröôùc noù. Theá heä sau keá thöøa taát caû nhöõng gì maø theá heä
tröôùc noù ñaõ coù.
3. CAÁU TRUÙC CUÛA VI ÑIEÀU KHIEÅN 89C51
Loaïi 2 haøng chaân (haøn xuyeân Loaïi 4 haøng chaân (gaén Socket)
lôùp)
Caùc chaân cô baûn
Vcc : Nguoàn +5VDC
GND : Noái mass
RST : Reset, taùc duïng möùc cao
XTAL1 vaø XTAL2 : 2 ngoõ vaøo gaén tuï thaïch anh taïo xung Clock
cho vi ñieàu khieån.
P0.7 → P0.0 : Caùc chaân cuûa PORT 0
P1.7 → P1.0 : Caùc chaân cuûa PORT 1
P2.7 → P2.0 : Caùc chaân cuûa PORT 2
P3.7 → P3.0 : Caùc chaân cuûa PORT 3
Löu yù (chaân Px.7 laø MSB ñoái vôùi döõ lieäu nhaäp hoaëc
xuaát)
Moät soá chaân khaùc vaø ñaëc tính xuaát nhaäp cuûa caùc PORT seõ
trình chi tieát sau.
35
Ñieän aùp nguoàn toái ña cho pheùp : 6,6V
Doøng ñieän ngoõ ra toái ña cho pheùp : 15mA
Thanh ghi
ñòa chæ
boä nhôù
ngaên xeáp
Thanh ghi
ñòa ñòa
Khoái xöû chæ boä
lyù trung nhôù
taâm
Khoái giaûi
maõ leänh
vaø ñieàu
khieån
Thanh ghi
leänh
Khoái ñònh
Maïch dao thôøi
ñoäng taïo
xung Clock
Hoaït ñoäng cuûa heä thoáng coù theå moâ taû toång quaùt nhö sau
:
Khi vi ñieàu khieån ñöôïc RESET (maïch RESET phaûi coù khaû naêng
RESET töï ñoäng vaøo thôøi ñieåm môùi caáp ñieän cho heä thoáng), byte
maõ leänh ñaàu tieân löu trong boä nhôù ROM ôû ñòa chæ 0000h seõ ñöôïc
naïp vaøo thanh ghi leänh (INSTRUCTION REGISTER, goïi taét laø thanh ghi
IR). Maïch giaûi maõ beân trong khoái “TIMING AND CONTROL” seõ giaûi maõ
leänh ñang löu tröõ trong thanh ghi IR vaø xuaát caùc tín hieäu ñieàu khieån
36
ñeán caùc khoái khaùc tuyø theo noäi dung cuûa maõ leänh. Caùc khoái
trong heä thoáng khi nhaän tín hieäu ñieàu khieån naøy seõ hoaït ñoäng
ñoàng boä theo xung Clock ñeå thöïc hieän moät coâng vieäc naøo ñoù (tuyø
theo noäi dung cuûa leänh).
Khi moät leänh ñöôïc thi haønh xong, leänh keá seõ ñöôïc ñoïc vaøo
thanh ghi IR vaø seõ ñöôïc giaûi maõ ñeå thöïc hieän. Ñeå cuï theå hoaù
vaán ñeà, sau ñaây ta seõ trình baøy vai troø cuûa khoái vaø caùc thanh ghi
ñaëc bieät trong heä thoáng.
3.1 Thanh ghi boä ñeám chöông trình (PROGRAM COUNTER – PC).
Ñaây laø thanh ghi 16 bit chöùa ñòa chæ cuûa moät vò trí trong boä
nhôù maø vò trí naøy seõ ñöôïc ñoïc ngay sau khi leänh hieän haønh ñöôïc
thöïc hieän xong. Ngay sau khi RESET vi ñieàu khieån, noäi dung cuûa thanh
ghi naøy laø 0000h. Noäi dung naøy seõ ñöôïc chuyeån vaøo thanh ghi ñòa
chæ (PROGRAM ADDRESS REGISTER) ñeå chæ ñònh oâ nhôù ñöôïc truy
xuaát. Khi oâ nhôù ñöôïc truy xuaát, noäi dung cuûa noù seõ ñöôïc naïp ngay
vaøo thanh ghi leänh (IR) vaø ñöôïc giaûi maõ ñeå thöïc hieän leänh. Trong
thôøi gian leänh ñang ñöôïc giaûi maõ thì noäi dung cuûa PC töï ñoäng taêng
leân moät ñôn vò ñeå chuaån bò ñoïc oâ nhôù keá trong boä nhôù. Trong khi
ñoù noäi dung cuûa thanh ghi ñòa chæ khoâng taêng. Khi leänh ñöôïc thöïc
hieän xong, noäi dung cuûa PC môùi ñöôïc chuyeån vaøo thanh ghi ñòa chæ
vaø luùc naøy oâ nhôù keá ñöôïc chæ ñònh ñeå ñoïc leänh tieáp theo.
37
08h.FAh = 16.250 = 4000 = 0FA0h
C AC Z RS1 RS0 OV - P
Côø nhôù C :
Bit C ñöôïc goïi laø bit Carry hay côø Carry khi thöïc hieän moät pheùp
coäng. Neáu pheùp coäng cho keát quaû laø moät soá > FF töùc laø keát
quaû bò traøn thì côø Carry ñöôïc phaát (töùc laø C = 1).
Bit C ñöôïc goïi laø bit Borrow hay côø Borrow khi thöïc hieän pheùp
tröø. Côø ñöôïc phaát khi soá bò tröø beù hôn soá tröø.
Côø nhôø phuï seõ ñöôïc phaát (AC = 1) neáu coù soá nhôù ñöôïc taïo ra
töø bit 3 hoaëc keát quaû 4 bit thaáp trong thanh ghi A coù giaù trò lôùn hôn
9.
Côø Zero:
Côø naøy ñöôïc phaát khi keát quaû cuûa moät pheùp toaùn coù giaù trò
baèng 0
38
duøng ñeå löu tröõ döõ lieäu taïm thôøi trong quaù trình xöû lyù. Caùc thanh
ghi naøy coù teân laø R0 ñeán R7 vaø ñöôïc ñaët trong bank naøo tuyø
thuoäc vaøo 2 bit RS1 vaø RS0 trong thanh ghi traïng thaùi.
RS1RS0 = 00 RS1RS0 = 01 RS1RS0 = 10 RS1RS0 = 11
Cheá ñoä maëc (Phaûi thieát (Phaûi thieát (Phaûi thieát
ñònh laäp) laäp) laäp)
1F 1F 1F 1F R7
1E 1E 1E 1E R6
1D 1D 1D 1D R5
1C 1C 1C 1C R4
Bank 3 Bank 3 Bank 3 Bank 3
1B 1B 1B 1B R3
1A 1A 1A 1A R2
19 19 19 19 R1
18 18 18 18 R0
17 17 17 R7 17
16 16 16 R6 16
15 15 15 R5 15
14 14 14 R4 14
Bank 2 Bank 2 Bank 2 Bank 2
13 13 13 R3 13
12 12 12 R2 12
11 11 11 R1 11
10 10 10 R0 10
0F 0F R7 0F 0F
0E 0E R6 0E 0E
0D 0D R5 0D 0D
0C 0C R4 0C 0C
Bank 1 Bank 1 Bank 1 Bank 1
0B 0B R3 0B 0B
0A 0A R2 0A 0A
09 09 R1 09 09
08 08 R0 08 08
07 R7 07 07 07
06 R6 06 06 06
05 R5 05 05 05
04 R4 04 04 04
Bank 0 Bank 0 Bank 0 Bank 0
03 R3 03 03 03
02 R2 02 02 02
01 R1 01 01 01
00 R0 00 00 00
Address Address Address Address
Vôùi caùch boá trí naøy, moät thanh ghi baát kyø trong soá 8 thanh ghi
töø R0 ñeán R7, ví duï thanh ghi R1, coù theå naèm ôû 4 vò trí khaùc nhau.
Neáu RS1RS0 = 00 thì ñòa chæ cuûa R1 laø 01h. Neáu RS1RS0 = 01 thì ñòa chæ
cuûa R1 laø 08h. Ñieàu naøy thuaän lôïi ôû choã khi moät chöông trình chính
coù söû duïng thanh ghi coù teân R1 thì trong chöông trình con ta cuõng coù
theå söû duïng thanh ghi coù teân R1 nhöng tröôùc khi thöïc hieän caùc
leänh trong chöông trình con ñoù, ta thay ñoåi caùc bit R S1 vaø RS0 ñeå choïn
bank thanh ghi khaùc.
Ví duï: Trong chöông trình chính, RS1RS0 = 00 vaø thanh ghi R1 coù ñòa
chæ 01h. Giaû söû trong chöông trình chính coù söû duïng leänh MOV
R1,#05h (leänh naøy seõ chuyeån soá 05h = 0000 0101b vaøo thanh ghi
R1). Sau leänh naøy oâ nhôù ôû ñòa chæ 01h coù noäi dung laø 05h.
Baây giôø giaû söû chöông trình chính coù chöùa moät chöông trình con
maø trong chöông trình con coù söû duïng leänh MOV R1,#03h nhöng
tröôùc khi thöïc hieän leänh naøy coù leänh : SETB RS0 (leänh naøy laøm
cho bit RS0 = 1). Cheá ñoä maëc ñònh laø RS1RS0 = 00. Nhö vaäy sau leänh
SETB RS0 ta coù RS1RS0 = 01 vaø thanh ghi R1 baây giôø coù ñòa chæ laø
08h. Sau leänh MOV R1,#03h thì oâ nhôù ôû vò trí 08h coù noäi dung laø
03h. Ñieàu naøy coù nghóa laø noäi dung cuûa oâ nhôù ôû ñòa chæ 01h
(töông öùng vôùi thanh ghi R1 trong chöông trình chính) khoâng heà aûnh
höôûng gì sau leänh MOV R1,#03h trong chöông trình con.
39
Nhö vaäy maëc duø chöông trình chính vaø chöông trình con ñeàu söû
duïng thanh ghi coù cuøng teân laø R1 nhöng thöïc teá laø söû duïng 2 oâ
nhôù ôû hai vò trí khaùc nhau. Tuy nhieân khi chöông trình con thöïc hieän
xong, tröôùc khi quay veà chöông trình chính, phaûi thöïc hieän leänh CLR
RS0 ñeå traû laïi RS1RS0 = 00 thì ñòa chæ cuûa R1 trong chöông trình chính
môùi ñuùng laø 01h.
Löu yù :
ÔÛ cheá ñoä maëc ñònh, töùc laø cheá ñoä do vi ñieàu khieån töï thieát
laäp (ngöôøi laäp trình khoâng can thieäp) ngay sau khi vi ñieàu khieån
ñöôïc RESET thì RS1RS0 = 00 vaø caùc thanh ghi R0 ñeán R7 naèm trong bank
0. Luùc naøy caùc oâ nhôù töø 08h trôû leân coù theå khoâng duøng ñöôïc vì
noù laø vuøng maëc ñònh daønh rieâng cho ngaên xeáp (seõ trình baøy sau).
Ñeå söû duïng vuøng nhôù naøy, ta phaûi dôøi vuøng nhôù ngaên xeáp ñeán
vò trí khaùc. Vieäc naøy ñöôïc goïi laø khôûi taïo boä nhôù ngaên xeáp. Sau
khi ñaõ thieát laäp moät vuøng khaùc cho ngaên xeáp thì caùc bank 1, 2, 3
coù theå ñöôïc söû duïng ñeå chöùa caùc thanh ghi R0→R7 cuûa chöông
trình con 1, 2, 3 (toái ña laø 3).
3.5 Thanh ghi con troû ngaên xeáp (Stack Pointer - SP)
Ngaên xeáp laø moät phaàn cuûa boä nhôù RAM ñöôïc duøng laøm
nôi löu tröõ döõ lieäu taïm thôøi. Vuøng nhôù naøy ñöôïc tri xuaát theo kieåu
LI-FO (Last In – First Out töùc laø Vaøo sau – Ra tröôùc). Döõ lieäu naøo
ñöôïc “caát” vaøo sau cuøng thì seõ ñöôïc “laáy” ra tröôùc nhaát. Ñieàu naøy
cuõng gioáng nhö ta xeáp saùch leân giaù vaø sau ñoù laáy saùch treân giaù
xuoáng.
Thanh ghi SP chöùa ñòa chæ cuûa oâ nhôù trong vuøng nhôù ngaên xeáp
nôi maø döõ lieäu seõ ñöôïc “caát” vaøo hoaëc “laáy” ra. Tuy nhieân tröôùc
khi “caát” döõ lieäu vaøo, noäi dung cuûa SP töï ñoäng taêng theâm moät
ñôn vò vaø tröôùc khi “laáy” ra, noäi dung cuûa SP töï ñoäng giaûm ñi moät
ñôn vò.
Ñòa chæ thaáp nhaát cuûa vuøng nhôù ngaên xeáp (ôû cheá ñoä maéc
ñònh, töùc laø ngay sau khi RESET vi ñieàu khieån) laø 08h. Ñieàu naøy coù
nghóa laø noäi dung cuûa thanh ghi SP (ôû cheá ñoä maëc ñònh laø 07h).
Neáu muoán dôøi vuøng nhôù ngaên xeáp ñeán choã khaùc thì sau khi
RESET heä thoáng, ta phaûi naïp vaøo thanh ghi SP moät ñòa chæ môùi
phuø hôïp. Vieäc naøy ñöôïc goïi laø khôûi taïo vuøng nhôù ngaên xeáp.
Vuøng nhôù ngaên xeáp phaûi ñöôïc boá trí ôû nôi khoâng chöùa caùc thanh
ghi chöùc naêng vaø vuøng ñoù khoâng duøng ñeå löu döõ lieäu naøo khaùc
ngoaøi döõ lieäu ñöôïc caát vaøo bôùi leänh PUSH hoaëc caùc leänh goïi
chöông trình con (ACALL vaø LCALL).
Hoaït ñoäng cuûa leänh PUSH
Caáu truùc toång quaùt cuûa leänh laø : PUSH direct
direct laø töø khoaù mang tính toång quaùt theå hieän kieåu ñònh ñòa
chæ tröïc tieáp. Khi vieát chöông trình, noù seõ seõ ñöôïc thay baèng moät
ñòa chæ cuï theå nôi maø vi ñieàu khieån seõ laáy döõ lieäu ôû ñoù löu vaøo
40
moät oâ nhôù trong vuøng nhôù ngaên xeáp. Thanh ghi SP chöùa chæ nôi
löu vaøo. Tröôùc khi löu, noäi dung cuûa SP töï ñoäng taêng theâm 1 ñôn vò.
Ví duï : Giaû söû thanh ghi SP ñang chöùa döõ lieäu laø 07h = 0000
0111b
Baây giôø thöïc hieän leänh PUSH 03h
Quaù trình xaûy ra nhö sau :
Vi ñieàu khieån troû ñeán oâ nhôù coù ñòa chæ 03h trong vuøng
nhôù RAM
Noäi dung cuûa SP taêng theâm moät ñôn vò töùc laø : SP = 07h +
01h = 08h
Döõ lieäu trong oâ nhôù ôû ñòa chæ 03h ñöôïc laáy ra
Vi ñieàu khieån ñoïc noäi dung trong SP, keát quaû ñoïc ñöôïc laø
08h
Vi ñieàu khieån troû ñeán oâ nhôù coù ñòa chæ 08h
Döõ lieäu ñaõ laáy ra töø oâ nhôù ôû ñòa chæ 03h baây giôø ñöôïc
löu vaøo oâ nhôù coù ñòa chæ 08h.
41
Ngöôïc laïi : Leänh POP ñöôïc duøng ñeå duy chuyeån döõ lieäu töø
vuøng nhôù ngaên xeáp ñeán moät oâ nhôù xaùc ñònh. Nôi laáy döõ lieäu
ñöôïc xaùc ñònh baèng noäi dung trong SP – 1.
Hai leänh PUSH vaø POP treân ñaây thöôøng duøng khi caàn hoaùn ñoåi
döõ lieäu giöõa hai oâ nhôù. Vieäc naøy coù theå hieåu ñôn giaûn hôn nhö
sau.
Giaû söû ta coù hai bieán a vaø b vaø hieän taïi thì : a = 2 vaø b = 5
Baây giôø ta caàn hoaùn ñoåi giaù trò cuûa a vôùi b. Töùc laø sau khi
hoaùn ñoåi ta coù a = 5 vaø b = 2. Quaù trình coù theå giaûi quyeát nhö sau
:
Ban 2 5
ñaàu a b
GIAÛI THUAÄT HOAÙN ÑOÅI NOÄI DUNG A VAØ B
Coâng vieäc Keát quaû sau khi
thöïc hieän
2
Sau böôùc naøy noäi
taïm
dung trong a seõ
Böôùc
ñöôïc thay theá baèng
2 5 noäi dung trong b
a b töùc laø a = 5
Chuyeån noäi dung cuûa b cho a
2
Sau böôùc naøy noäi
taïm
Böôùc dung trong b seõ
3 ñöôïc thay theá baèng
5 noäi dung trong taïm
a b
Chuyeån noäi dung trong taïm
cho b
Nhö vaäy sau 3 böôùc ta coù : a = 5 vaø b = 2 töùc laø noäi dung trong
a vaø b ñaõ ñöôïc hoaùn ñoåi cho nhau. Ñeå thöïc hieän vieäc naøy ta caàn
moät bieán trung gian laø bieán taïm vaø caàn coù 3 laàn duy chuyeån döõ
lieäu.
42
Laàn thöù nhaát laø töø a vaøo taïm (haõy lieân töôûng ñeán leänh
PUSH)
Laàn thöù hai laø töø b vaøo a
Laàn thöù ba laø töø taïm vaøo b (haõy lieân töôûng ñeán leänh POP)
AÙp duïng ví duï treân, SV haõy vieát moät ñoaïn chöông trình ñeå thöïc
hieän hoaùn ñoåi noäi dung giöõa hai oâ nhôù coù ñòa chæ 03h vaø 05h.
Cho bieát leänh duy chuyeån döõ lieäu töø oâ nhôù coù ñòa chæ 05h ñeán
oâ nhôù coù ñòa chæ 03h laø : MOV 03h,05h
Caùc leänh goïi chöông trình con vaø leänh trôû veà.
Leänh goïi chöông trình con (ôû xa vò trí leänh ñang thöïc thi)
Caáu truùc toång quaùt : LCALL addr16
addr16 laø töø khoaù toång quaùt ñaïi dieän cho moät soá nhò phaân 16
bit (coù theå vieát döôùi daïng nhò phaân hoaëc HEXA). Khi laäp trình,
addr16 ñöôïc thay baèng moät soá 16bit maø soá naøy chính laø ñòa chæ
nôi chöông trình seõ “nhaûy ñeán” thöïc hieän taïi ñoù.
Ta bieát raèng chöông trình laø moät taäp hôïp caùc maõ leänh ñöôïc
saép xeáp theo moät trình töï nhaát ñònh ñeå thöïc hieän tuaàn töï caùc
coâng vieäc nhaèm giaûi quyeát moät vaán ñeà gì ñoù. Taát nhieân ta cuõng
caàn bieát raèng caùc maõ leänh naøy khoâng phaûi do chuùng ta vieát ra
maø chuùng ta chæ vieát caùc doøng leänh baèng caùc töø gôïi nhôù, ví duï
leänh duy chuyeån coù töø khoaù laø MOV. Chöông trình bieân dòch seõ
giuùp chuyeån caùc töø gôïi nhôù naøy thaønh soá nhò phaân (maõ leänh)
vaø sau ñoù trình ñieàu khieån maïch naïp seõ naïp caùc byte nhò phaân
naøy vaøo boä nhôù ROM cuûa vi ñieàu khieån ñeå thöïc hieän.
Khi chöông trình ñang thöïc hieän, noäi dung trong thanh ghi PC
luoân laø ñòa chæ cuûa leänh saép ñöôïc thöïc hieän. Vaäy neáu vi
ñieàu khieån ñang thi haønh leänh ôû vò trí x cuûa boä nhôù vaø leänh ñoù
laø leänh goïi chöông trình con (ACALL hoaëc LCALL) thì vi ñieàu khieån seõ
phaûi “haønh ñoäng” nhö theá naøo ñeå khi thi haønh xong chöông trình con
thì thöïc hieän ñuùng leänh keá ngay sau leänh ACALL hoaëc LCALL. “Haønh
ñoäng” ñoù nhö sau :
Tröôùc nhaát vi ñieàu khieån “caát” noäi dung trong PC chính laø ñòa
chæ cuûa leänh keá vaøo vuøng nhôù ngaên xeáp. Noäi dung naøy
chieám 2 byte vì PC laø thanh ghi 16 bit.
Ñòa chæ maø ta khai baùo ôû choã addr16 seõ ñöôïc naïp vaøo thanh
ghi PC.
Noäi dung cuûa PC ñöôïc chuyeån cho thanh ghi ñòa chæ.
Vi ñieàu khieån troû ñeán oâ nhôù coù ñòa chæ ñang hieän haønh
trong thanh ghi ñòa chæ.
Döõ lieäu trong oâ nhôù chæ ñònh ñöôïc naïp vaøo IR ñeå giaûi maõ.
Trong thôøi gian giaûi maõ, PC töï ñoäng taêng theâm 1 ñeå chuaån bò
ñoùn leänh keá.
43
Nhö vaäy vi ñieàu khieån ñang thi haønh chöông trình ôû moät ñòa chæ
môùi (ñaây laø chöông trình con).
“Haønh ñoäng” tieáp theo khi thi haønh xong chöông trình con laø gì ?
ÔÛ cuoái chöông trình con seõ coù moät leänh laø RET (vieát taét cuûa
töø RETURN töùc laø trôû veà) ñoái vôùi chöông trình con bình thöôøng
hoaëc RETI (vieát taét cuûa töø RETURN from INTERRUPT töùc laø trôû veà
töø chöông trình xöû lyù ngaét). Khi gaëp leänh naøy, vi ñieàu khieån seõ
laáy laïi döõ lieäu maø tröôùc ñaây noù ñaõ caát vaøo ngaên xeáp ñeå naïp
laïi cho PC. Sau ñoù noäi dung cuûa PC seõ chuyeån cho thanh ghi ñòa chæ.
Nhö vaäy vi ñieàu khieån seõ thi haønh leänh tieáp theo ngay sau leänh
ACALL hoaëc LCALL maø tröôùc ñaây noù chöa thöïc hieän.
Phaàn trình baøy treân chæ nhaèm muïc ñích giuùp ta hieåu roõ veà
hoaït ñoäng cuûa thanh ghi SP vaø vuøng nhôù ngaên xeáp. Ta seõ trình
baøy kyõ hôn veà caùc leänh cuõng nhö nhö theá naøo laø ngaét vaø xöû lyù
ngaét trong caùc phaàn tieáp sau.
Boä nhôù noäi cuûa vi ñieàu khieån hoï MCS-51 goàm hai phaàn laø boä
nhôù RAM duøng ñeå löu tröõ döõ lieäu taïm thôøi vaø boä nhôù ROM duøng
ñeå löu chöông trình ñieàu khieån.
Ñoái vôùi 89C51, boä nhôù RAM coù 256 byte chia thaønh 2 phaàn:
128 byte ñòa chæ thaáp ñöôïc chia thaønh 3 vuøng.
Vuøng thöù nhaát laø 32 byte ñaàu tieân töø ñòa chæ 00h ñeán
1Fh. Ngöôøi ta thöôøng goïi vuøng nhôù naøy laø vuøng nhôù 4 bank,
moãi bank 8 byte. Caùc thanh ghi töø R0 ñeán R7 ñöôïc boá trí trong
bank naøo tuyø thuoäc vaøo traïng thaùi cuûa 2 bit RS1 vaø RS0 trong
thanh ghi traïng thaùi (PSW). Ñieàu naøy ñaõ ñöôïc trình baøy chi tieát
ôû phaàn tröôùc.
16 byte tieáp theo töø ñòa chæ 20h ñeán 2Fh laø vuøng nhôù cho
pheùp truy caäp ñeán töøng bit. Moãi bit coù moät ñòa chæ rieâng.
Trong vuøng nhôù naøy ta coù theå truy xuaát byte hoaëc truy xuaát
bit tuyø yù.
80 byte coøn laïi töø ñòa chæ 30h ñeán 7Fh laø vuøng RAM ña
duïng. Vuøng nhôù naøy chæ coù theå truy xuaát byte vaø cho pheùp
laäp trình vieân tuyø yù söû duïng. Ngöôøi ta thöôøng daønh ra moät
soá byte ôû cuoái vuøng nhôù naøy ñeå laøm vuøng nhôù ngaên xeáp.
Ví duï neáu sau khi RESET heä thoáng ta duøng leänh : MOV SP,#5Fh
thì thanh ghi SP seõ coù noäi dung laø 5Fh = 0101 1111b vaø vuøng
nhôù ngaên xeáp seõ coù ñòa chæ töø 60h ñeán 7Fh. Tröôøng hôïp
naøy ta ñaõ daønh 32 byte cho vuøng nhôù ngaên xeáp.
128 byte ñòa chæ cao cuûa boä nhôù RAM laø vuøng nhôù daønh
rieâng cho caùc thanh ghi chöùc naêng cuûa vi ñieàu khieån. Trong soá naøy
44
coù moät soá vò trí chöa duøng ñeán. Chi tieát veà boä nhôù RAM cuûa vi
ñieàu khieån 89C51 ñöôïc trình baøy treân hình veõ sau.
7F FF
...
F0 F7 F6 F5 F4 F3 F2 F1 F0 B
...
RAM ña duïng
(80 byte) E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC (hay A)
...
D0 D7 D6 D5 D4 D3 D2 D1D0 PSW
30
...
2F 7F 7E 7D 7C 7B 7A 79 78 B8 - - - BC BB BA B9 B8 IP
...
2E 77 76 75 74 73 72 71 70
2D 6F 6E 6D 6C 6B 6A 69 68 B0 B7 B6 B5 B4 B3 B2 B1 B0 P3
...
2C 67 66 65 64 63 62 61 60
2B 5F 5E 5D 5C 5B 5A 59 58 A8 AF - - AC AB AA A9 A8 IE
2A 57 56 55 54 53 52
...
51 50
29 4F 4E 4D 4C 4B 4A 49 48 A0 A7 A6 A5 A4 A3 A2 A1 A0 P2
28 47 46 45 44 43 42 41 40
...
27 3F 3E 3D 3C 3B 3A 39 38 99 SBUF
26 37 36 35 34 33 32 31 30 98 9F 9E 9D 9C 9B 9A 99 98 SCON
25 2F 2E 2D 2C 2B 2A 29 28
...
24 27 26 25 24 23 22 21 20
23 1F 1E 1D 1C 1B 1A 19 18 90 97 96 95 94 93 92 91 90
22 17 16 15 14 13 12 11 10
...
21 0F 0E 0D 0C 0B 0A 09 08
20 07 06 05 04 03 02 01 00 8D TH1 (Timer 1)
1F 8C TH0
Bank 3
8B TL1
...
(8 byte)
18 8A TL0 (Timer 0)
17 89 TMOD
Bank 2
...
(8 byte) 88 8F 8E 8D 8C 8B 8A 89 88 TCON
10 87 PCON
0F
...
Bank 1
...
(8 byte)
08 83 DPH
DPTR
07 82 DPL
Bank 0
...
(8 byte) 81 SP
00 80 87 86 85 84 83 82 81 80 P0
Address Address Name
Moät soá vò trí nhôù cho pheùp truy xuaát tôùi töøng bit. Moät soá vò trí
nhôù ngoaøi ñòa chæ coùn coù moät teân. Ví duï ôû vò trí nhôù coù ñòa chæ
byte A0 laø moät thanh ghi 8 bit coù teân laø P2. Moãi bit cuûa thanh ghi
naøy laïi coù moät ñòa chæ rieâng. Ta coù theå truy xuaát thanh ghi naøy
45
(ghi döõ lieäu leân thanh ghi hoaëc ñoïc döõ lieäu töø thanh ghi) baèng
nhieàu caùch.
Ví duï Ñeå ghi döõ lieäu 0111 0110b = 76h leân thanh ghi P2 ta coù 3
caùch nhö sau:
Caùch 1 : MOV P2,#76h (P2 laø teân cuûa thanh ghi nôi döõ lieäu
seõ ghi vaøo)
Caùch 2 : MOV A0,#76h (A0 laø ñòa chæ nôi döõ lieäu seõ ghi
vaøo)
Caùch 3 :
CLR 0A7h (xoaù bit ôû ñòa chæ A7h, soá 0 ñöôïc
theâm vaøo neáu ñòa chæ hoaëc döõ
lieäu coù chöùa kyù töï).
SETB 0A6h (Set bit ôû ñòa chæ A6h)
SETB 0A5h (Set bit ôû ñòa chæ A5h)
SETB 0A4h (Set bit ôû ñòa chæ A4h)
CLRB 0A3h (Xoaù bit ôû ñòa chæ A3h)
SETB 0A2h (Set bit ôû ñòa chæ A2h)
SETB 0A1h (Set bit ôû ñòa chæ A1h)
CLR 0A0h (Xoaù bit ôû ñòa chæ A0h)
Caùch thöù 3 daøi nhaát nhöng noù seõ tieän duïng trong tröôøng hôïp
sau :
Giaû söû trong thanh ghi P2 ñang chöùa döõ lieäu laø : 0111 0110b =
76h (cuõ)
Baây giôø muoán thay ñoåi döõ lieäu trong P2 thanh : 0110 0110b =
66h (môùi)
Nhaän thaáy döõ lieäu môùi khaùc vôùi döõ lieäu cuõ duy nhaát 1 bit,
ñoù laø bit thöù 4 (löu yù laø bit taän cuøng beân traùi laø bit thöù 0). Bit
naøy trong döõ lieäu cuõ laø 1 nhöng trong döõ lieäu môùi laø 0. Caùch ñôn
giaûn ñeå ñoåi döõ lieäu trong P2 theo yeâu caàu treân laø duøng leänh :
CLR 0A4h (leänh naøy seõ xoaù bit thöù 4, ñòa chæ cuûa bit laø A4h).
Ngoaøi ra coøn coù hai caùch khaùc laø :
Caùch 1 : MOV P2,#66h
Caùch 2 : MOV A0,#66h
Hai caùch sau naøy coù theå aûnh höôûng nhaát thôøi leân caùc bit
khaùc trong quaù trình duy chuyeån döõ lieäu. Ngoaøi ra, leänh ñöôïc duøng
ôû caùch thöù 2 chieám 3 byte trong boä nhôù (daøi hôn leänh CLR 0A4h
moät byte).
+5V
+
RESET 10µF +
150
47µF 0,1µF
Maïch RESET 10kΩ
+Auto 1 P1.0 Vcc 40
+ Handy Maïch loïc
2 P1.1 P0.0 39 nhieãu
nguoàn
3 P1.2 P0.1 38
PORT 1
4 P1.3 P0.2 37
PORT 0
5 P1.4 P0.3 36
6 P1.5 P0.4 35
7 P1.6 P0.5 34
8 P1.7 P0.6 33
10 P3.0 EA 31
11 P3.1 ALE 30
12 P3.2 PSEN 29
PORT 3
13 P3.3 P2.7 28
14 P3.4 P2.6 27
15 P3.5 P2.5 26
PORT 2
Sô ñoà keát noái vi ñieàu khieån vôùi boä nhôù ROM ngoaøi
48
JP1
+5V Vcc Vcc U1 Vcc Vcc
1
20
40
U2
2 U3
28
1 39 D0 D0 2 19 A0
P1.0 P0.0/AD0 1D 1Q
VCC
VCC
2 38 D1 D1 3 18 A1
0 3 P1.1 P0.1/AD1 37 D2 D2 4 2D 2Q 17 A2 A12 2
P1.2 P0.2/AD2 3D 3Q A12
VCC
4 36 D3 D3 5 16 A3 A11 23
5 P1.3 P0.3/AD3 35 D4 D4 6 4D 4Q 15 A4 A10 21 A11
6 P1.4 P0.4/AD4 34 D5 D5 7 5D 5Q 14 A5 A9 24 A10
7 P1.5 P0.5/AD5 33 D6 D6 8 6D 6Q 13 A6 A8 25 A9 11 D0
8 P1.6 P0.6/AD6 32 D7 D7 9 7D 7Q 12 A7 A7 3 A8 D0 12 D1
P1.7 P0.7/AD7 8D 8Q A6 4 A7 D1 13 D2
9 31 Vcc 11 A5 5 A6 D2 15 D3
RST EA 30 C A4 6 A5 D3 16 D4
10 ALE 29 1 A3 7 A4 D4 17 D5
P3.0/RXD PSEN OC A3 D5
GND
11 A2 8 18 D6
12 P3.1/TXD 28 A1 9 A2 D6 19 D7
P3.2/INT0 P2.7/A15 74LS373 A1 D7
13 27 A0 10
10
14 P3.3/INT1 P2.6/A14 26 A0
15 P3.4/T0 P2.5/A13 25 A12
16 P3.5/T1 P2.4/A12 24 A11 0 Vcc 27
17 P3.6/WR P2.3/A11 23 A10 WE
P3.7/RD P2.2/A10 22 A9 22
18 P2.1/A9 21 A8 OE
XTAL2 P2.0/A8 20
19 CE
XTAL1
GND
GND
AT89C51 28C64A
14
20
0 0 0
+5V
...
...
...
...
...
...
...
Moät PORT coù theå chæ duøng laøm PORT nhaäp hoaëc chæ duøng laøm
PORT xuaát. Tuy nhieân moät soá tröôøng hôïp öùng duïng ñaëc bieät naøo
ñoù, ngöôøi ta duøng PORT vöøa ñeå xuaát, vöøa ñeå nhaäp.
Ngay sau khi RESET heä thoáng, taát caû caùc boä choát ôû moãi PORT
ñeàu ñöôïc SET leân 1 laøm cho MOS-FET noái vôùi chaân PORT ngöng daãn.
49
Luùc naøy PORT ôû traïng thaùi saún saøng cho vieäc nhaäp döõ lieäu. Moät
leänh nhaäp döõ lieäu, ví duï : MOV A,P1 seõ ñoïc traïng thaùi caùc chaân
cuûa PORT 1 (Read Pin) vaø nhaäp caùc traïng thaùi ñoù vaøo thanh ghi A.
Neáu PORT ñöôïc duøng laøm PORT xuaát thì ngay sau khi RESET, traïng
thaùi tín hieäu treân caùc chaân PORT ñeàu laø möùc 1 do caùc maïch choát
ñöôïc SET. Sau ñoù traïng thaùi caùc chaân PORT seõ do chöông trình ñieàu
khieån.
Neáu moät PORT vöøa laøm PORT nhaäp, vöøa laøm PORT xuaát thì
tröôùc khi nhaäp phaûi SET boä choát. Vieäc naøy ñöôïc töï ñoäng thöïc
hieän ngay sau khi RESET, tuy nhieân caàn thöïc hieän laïi baèng leänh trong
chöông trình vì coù theå moät leänh xuaát tröôùc ñoù ñaõ xoaù moät bit
naøo ñoù trong boä choát vaø khi ñoù MOS-FET töông öùng vôùi ngoõ ra bò
xoaù seõ daãn baõo hoaø, keùo chaân PORT xuoáng möùc thaáp, coù theå
laøm sai döõ lieäu nhaäp.
Ñieän trôû keùo leân (Rp) chæ coù trong PORT 1, 2 vaø 3. PORT 0 khoâng
coù ñieän trôû naøy. Vì vaäy khi duøng PORT 0, ta caàn maéc theâm ñieän
trôû keùo leân (coù giaù trò khoaûng 1kΩ). Ñieän trôû naøy neân duøng loaïi
maûng cho goïn.
+5V Ñieä
n trôûmaû
ng
PORT0
50