You are on page 1of 126

Đại Học Giao Thông Vận Tải Tp.

HCM
Khoa Điện – Điện Tử Viễn Thông

Học phần: Vi Xử Lý

Chương 3: Lập trình 8051

Giảng viên: ThS. Khổng Hoài Hưng


Chương 3 bao gồm 4 nội dung:

1. Các khái niệm cơ bản về lập trình cho VXL và VĐK

2. Các kiểu định địa chỉ.

3. Tập lệnh.

4. Các kỹ thuật lập trình.


I. Các khái niệm cơ bản về lập trình
cho VXL và VĐK
1. Chương trình

Taát caû caùc hoï vi xöû lyù khaùc nhau coù theå thöïc hieän ñöôïc moïi
coâng vieäc maø ta coù theå thaáy trong cuoäc soáng, töø ñieàu khieån
caùc quaù trình phöùc taïp, truyeàn thoâng, troø chôi ñieän töû…
Moät caâu hoûi ñaët ra laø: vaäy thì caùi gì ñaëc tröng cho boä vi xöû
lyù ñeå noù coù theå thöïc hieän chöùc naêng rieâng bieät cuûa vi xöû lyù.
Ñoù chính laø phaàn meàm (software), hay chöông trình.

4
1. Chương trình

- Chöông trình (program) laø chuoãi caùc caâu leänh hay phaùt bieåu ñöôïc
vieát trong moät daïng ñaëc thuø (ngoân ngöõ laäp trình). Caùc leänh naøy khi
ñöôïc thöïc hieän bôûi vi xöû lyù seõ thöïc hieän nhöõng thao taùc nhaát ñònh vôùi
keát quaû ñoaùn tröôùc ñöôïc.
- Coù nhieàu loaïi ngoân ngöõ laäp trình:
+ Ngoân ngöõ maùy (machine language)
Maõ nhò phaân
Maõ baùt phaân hoaëc thaäp luïc phaân
+ Hôïp ngöõ (assembly language) [caàn coù assembler – trình
dòch hôïp ngöõ]
Maõ kí hieäu
+ Ngoân ngöõ caáp cao [caàn coù compiler – trình bieân dòch]
Pascal, Fortran, Basic, C, C++, … 5
2. Lưu đồ chương trình

-Böôùc ñaàu tieân cuûa vieäc laäp trình laø xaùc ñònh roõ raøng muïc
ñích cuûa chöông trình vaø trình töï caàn thieát ñeå ñaït muïc ñích
ñoù. Moät trong nhöõng coâng cuï quan troïng trong vieäc phaùt
trieån chöông trình laø löu ñoà chöông trình.

- Löu ñoà chöông trình laø bieåu dieãn baèng hình aûnh thöù töï
caùc thao taùc caàn laøm ñeå giaûi quyeát moät vaán ñeå cuï theå. Löu
ñoà chöông trình khoâng phuï thuoäc ngoân ngöõ laäp trình hoaëc
loaïi vi xöû lyù cuï theå naøo. Löu ñoà chöông trình chæ phuï thuoäc
vaøo coâng vieäc maø ngöôøi laäp trình muoán hoaøn thaønh.
6
2. Lưu đồ chương trình

- Caùc khoái cô baûn duøng trong löu ñoà chöông trình:

7
2. Lưu đồ chương trình

-Raát nhieàu ngöôøi laäp trình khi môùi baét ñaàu vôùi vieäc laäp trình
thöôøng khoâng thích söû duïng löu ñoà chöông trình vì nghó raèng
vieäc veõ löu ñoà laø toán thôøi gian. Ñieàu naøy chæ ñuùng vôùi caùc
chöông trình ngaén vaø ñôn giaûn, nhöng tröôøng hôïp chöông trình
daøi hôn thì neáu khoâng coù löu ñoà seõ raát deã bò roái raém. Löu ñoà
chöông trình giuùp saép xeáp caùc yù töôûng vaø lôøi giaûi cuûa töøng vaán
ñeà rieâng bieät. Sau khi hoaøn thaønh löu ñoà, ta coù theå trao ñoåi vôùi
ngöôøi khaùc veà yù töôûng cuûa mình. Coù löu ñoà chöông trình thì duø
sau moät thôøi gian daøi ta vaãn coù theå quay laïi vôùi chöông trình
cuûa mình moät caùch deã daøng maø khoâng bò “laïc” trong caùc doøng
leänh voán raát chi tieát cuûa chöông trình hôïp ngöõ.
8
3. Khuôn dạng của một chương trình hợp ngữ

Moät chöông trình hôïp ngöõ coù theå bao goàm:


- Caùc leänh (instruction) cuûa vi xöû lyù/vi ñieàu khieån
- Caùc chæ daãn (directive) cuûa trình dòch hôïp ngöõ
- Caùc ñieàu khieån (control) cuûa trình dòch hôïp ngöõ
- Caùc chuù thích (comment)
Caùc leänh laø caùc maõ gôïi nhôù quen thuoäc vaø seõ ñöôïc dòch ra maõ maùy
töông öùng vôùi vi xöû lyù/vi ñieàu khieån. Caùc chæ daãn cuûa trình dòch hôïp
ngöõ laø caùc leänh cuûa trình dòch hôïp ngöõ duøng ñeå ñònh nghóa caáu truùc
chöông trình, caùc kyù hieäu, döõ lieäu, caùc haèng soá… Caùc ñieàu khieån cuûa
trình dòch hôïp ngöõ thieát laäp caùc cheá ñoä trình dòch hôïp ngöõ vaø caùc
luoàng hôïp dòch tröïc tieáp. Caùc chuù thích giuùp cho chöông trình deã ñoïc
baèng caùch ñöa ra caùc giaûi thích veà muïc ñích vaø hoaït ñoäng cuûa caùc
chuoãi leänh. 9
3. Khuôn dạng của một chương trình hợp ngữ

Caùc doøng chöùa caùc leänh vaø caùc chæ daãn phaûi ñöôïc vieát theo caùc qui
luaät maø trình dòch hôïp ngöõ hieåu ñöôïc. Moãi doøng ñöôïc chia thaønh caùc
tröôøng caùch bieät nhau bôûi khoaûng traéng hay khoaûng tab. Khuoân daïng
toång quaùt cuûa moãi doøng nhö sau:

Teân (Nhaõn) Maõ gôïi nhôù Caùc toaùn haïng Chuù thích

trong ñoù chæ coù tröôøng maõ gôïi nhôù laø baét buoäc. Vôùi trình dòch hôïp
ngöõ ASM51, tröôøng maõ gôïi nhôù khoâng caàn ôû treân cuøng moät doøng vôùi
tröôøng nhaõn. Tuy nhieân, tröôøng toaùn haïng phaûi ôû treân cuøng moät doøng
vôùi tröôøng maõ gôïi nhôù. Coù theå vieát caùc doøng naøy baèng chöõ hoa hay
chöõ thöôøng vaø chuùng seõ ñöôïc coi laø töông ñöông vì trình dòch hôïp
ngöõ khoâng phaân bieät kieåu chöõ. 10
3. Khuôn dạng của một chương trình hợp ngữ

a. Tröôøng teân
Tröôøng naøy coù theå chöùa caùc nhaõn, teân bieán, hay teân chöông
trình con (thuû tuïc). Caùc teân vaø nhaõn naøy seõ ñöôïc trình dòch hôïp
ngöõ gaùn baèng caùc ñòa chæ cuï theå cuûa leänh (hoaëc döõ lieäu) theo
sau. Teân vaø nhaõn coù theå coù ñoä daøi töø 1 ñeán 31 kyù töï, khoâng chöùa
khoaûng traéng, phaûi baét ñaàu baèng kyù töï chöõ, daáu ‘?’ hay daáu ‘_’
vaø tieáp theo phaûi laø caùc kyù töï chöõ, caùc kyù soá, daáu ‘?’ hay daáu
‘_’. Caùc teân vaø nhaõn khoâng ñöôïc truøng vôùi caùc töø khoùa (caùc maõ
gôïi nhôù, caùc chæ daãn, caùc toaùn töû hay caùc kyù hieäu ñònh nghóa
tröôùc). Noùi chung, ta cöù ñaët caùc teân bình thöôøng vaø coù yù nghóa
laø seõ ít bò loãi. Moät nhaõn ñöôïc keát thuùc baèng daáu ‘:’.
11
3. Khuôn dạng của một chương trình hợp ngữ

b. Tröôøng maõ gôïi nhôù

Tröôøng naøy chöùa maõ gôïi nhôù (mnemonic) cho bieát chöùc
naêng cuûa leänh (ví duï nhö ADD, MOV, DIV, MUL, INC…)
hay chæ daãn cuûa trình dòch hôïp ngöõ (ví duï nhö ORG, END,
EQU, DB…). Caùc chæ daãn khoâng ñöôïc dòch ra maõ maùy.

12
3. Khuôn dạng của một chương trình hợp ngữ

c. Tröôøng toaùn haïng (operand)

Tröôøng naøy chöùa ñòa chæ hay döõ lieäu maø leänh seõ söû duïng.
Tuøy theo töøng loaïi leänh maø coù theå coù 0, 1, 2 hay 3 toaùn
haïng. Caùc toaùn haïng caùch nhau bôûi daáu phaåy.

13
3. Khuôn dạng của một chương trình hợp ngữ

d. Tröôøng chuù thích (comment)

Caùc chuù thích ñeå laøm roõ chöông trình ñöôïc ñaët trong
tröôøng chuù thích ôû cuoái doøng leänh. Ñieàu naøy giuùp cho
ngöôøi ñoïc chöông trình deã hieåu caùc thao taùc cuûa chöông
trình hôn. Caùc chuù thích caàn phaûi ñöôïc baét ñaàu baèng daáu
‘;’. Caùc chuù thích coù theå chieám nhieàu doøng rieâng vaø cuõng
phaûi baét ñaàu baèng daáu chaám ‘;’.

14
3. Khuôn dạng của một chương trình hợp ngữ

Khi ta vieát chöông trình baèng kí töï cuûa baûng chöõ caùi, ta goïi ñaây
laø daïng mnemonic (maõ gôïi nhôù). Vi xöû lyù/vi ñieàu khieån khoâng
hieåu ñöôïc caùc chöõ caùi naøy. Chuùng ñoøi hoûi caùc leänh phaûi ñöôïc
vieát döôùi daïng ñaëc bieät goïi laø object code (maõ ñoái töôïng, maõ
leänh). Mnemonic ñöôïc duøng trong chöông trình goác döôùi daïng
source code (maõ nguoàn) do ngöôøi laäp trình vieát baèng hôïp ngöõ
hoaëc (ngoân ngöõ laäp trình khaùc). Coøn object code laø ngoân ngöõ
chæ bao goàm caùc soá 1 vaø 0, ñaây laø ngoân ngöõ maø vi xöû lyù/vi ñieàu
khieån seõ laøm vieäc ñöôïc. Vi xöû lyù/vi ñieàu khieån ñoïc object code
töø boä nhôù döôùi daïng caùc byte vaø bieân dòch caùc döõ lieäu thaønh
leänh caàn thöïc thi. 15
3. Khuôn dạng của một chương trình hợp ngữ

Moät soá chæ daãn cuûa trình dòch hôïp ngöõ thöôøng duøng:

ORG
Daïng: ORG bieuthuc
Chæ daãn ORG thay ñoåi noäi dung boä ñeám chöông trình theo giaù trò cuûa
bieuthuc ñeå thieát laäp nôi baét ñaàu môùi cuûa chöông trình cho caùc phaùt
bieåu theo sau noù.

END
Daïng: END
END laø phaùt bieåu cuoái cuøng cuûa chöông trình nguoàn. Nhaõn khoâng
ñöôïc söû duïng treân doøng naøy. 16
3. Khuôn dạng của một chương trình hợp ngữ

Moät soá chæ daãn cuûa trình dòch hôïp ngöõ thöôøng duøng:

EQU
Daïng: kyhieu EQU bieuthuc
Chæ daãn EQU gaùn giaù trò cuûa bieuthuc cho kyhieu. Kyhieu phaûi laø teân
hôïp leä.

DB
Daïng: nhan: DB bieuthuc{, bieuthuc][…]
Chæ daãn DB thöôøng ñöôïc duøng ñeå ñònh nghóa caùc giaù trò byte töông
öùng vôùi caùc bieuthuc trong boä nhôù chöông trình baét ñaàu töø ñòa chæ
töông öùng vôùi nhan.
17
4. Biên dịch chương trình

-Chöông trình phaûi ñöôïc chuyeån sang thaønh daïng object


code tröôùc khi vi xöû lyù/vi ñieàu khieån coù theå thöïc hieän
chöông trình. Quaù trình chuyeån töø chöông trình daïng
source code sang object code goïi laø bieân dòch/hôïp dòch
(assembling).

- Sau ñoù ta naïp object code naøy vaøo boä nhôù vi xöû lyù/vi ñieàu
khieån vaø vi xöû lyù/vi ñieàu khieån chaïy chöông trình.

18
4. Biên dịch chương trình

-Vieäc chuyeån ñoåi mnemonic sang object code thöôøng thöïc


hieän baèng maùy tính. Tröôùc heát ta duøng moät chöông trình
goïi laø editor ñeå vieát vaø löu maõ nguoàn vaøo boä nhôù. Ta coù theå
söû duïng editor quen thuoäc cuûa Window nhö Notepad hoaëc
trong moâi tröôøng DOS ta söû duïng leänh edit trong Norton
Commandor. Sau ñoù ta cho chaïy chöông trình bieân dòch goïi
laø assembler, chöông trình naøy seõ laáy maõ leänh trong boä
nhôù vaø bieân dòch sang taäp tin döôùi daïng object code. Cuoái
cuøng, ta duøng moät chöông khaùc ñeå naïp object code töø boä
nhôù cuûa maùy tính vaøo boä nhôù cuûa vi xöû lyù/vi ñieàu khieån. 19
5. Nạp chương trình vào bộ nhớ

-Khi vi xöû lyù/vi ñieàu khieån ñöôïc caáp nguoàn ñieän laàn ñaàu
hay ñöôïc khôûi ñoäng laïi baèng caùch kích hoaït vaøo chaân RST
thì vi xöû lyù/vi ñieàu khieån thöïc hieän moät soá leänh beân trong.
Moät trong caùc leänh ñoù laø xuaát moät ñòa chæ ñaëc bieät leân bus
ñòa chæ vaø ñoïc opcode ñaàu tieân taïi ñòa chæ ñoù. Ñoái vôùi Z80,
8080, 8085 vaø hoï MCS-51 thì ñoù laø ñòa chæ 0000H. Do ñoù,
opcode ñaàu tieân cuûa chöông trình caàn thöïc hieän phaûi ñöôïc
ñaët ôû vò trí 0000H trong boä nhôù chöông trình vaø khi vieát
chöông trình neân söû duïng chæ daãn ORG 0000H ôû doøng ñaàu
tieân cuûa chöông trình chính ñeå baùo cho trình dòch hôïp ngöõ
bieát chöông trình ñöôïc baét ñaàu ôû ñòa chæ 0000H. 20
5. Nạp chương trình vào bộ nhớ

-Chöông trình ñöôïc naïp vaøo boä nhôù thöïc chaát chæ laø caùc
soá nhò phaân hay hex. Trong caùc soá naøy, coù soá seõ laø
opcode, coù soá seõ laø döõ lieäu ñöôïc söû duïng bôûi caùc leänh. Vieäc
nhaàm laãn thöù töï leänh seõ daãn ñeán caùc keát quaû khoâng löôøng
tröôùc ñöôïc. Phöông phaùp duy nhaát ñeå phaân bieät giöõa
opcode vaø döõ lieäu laø caàn phaûi bieát ñòa chæ chính xaùc cuûa
opcode ñaàu tieân trong chöông trình vaø naïp chöông trình
ñuùng vò trí vaø theo thöù töï.

21
II. Các kiểu định địa chỉ
II. Các kiểu định địa chỉ

Caùc kieåu ñònh ñòa chæ laø phaàn caàn thieát cho toaøn boä taäp leänh cuûa moãi
moät boä vi xöû lyù hay vi ñieàu khieån. Caùc kieåu ñònh ñòa chæ cho pheùp xaùc
ñònh roõ nguoàn vaø ñích cuûa döõ lieäu theo nhieàu caùch khaùc nhau maø vi
xöû lyù hay vi ñieàu khieån söû duïng trong quaù trình thöïc thi leänh.
Coù 8 kieåu ñònh ñòa chæ ñoái vôùi hoï MCS-51:
- Thanh ghi (register)
- Tröïc tieáp (direct)
- Giaùn tieáp (indirect)
- Töùc thôøi (immediate)
- Töông ñoái (relative)
- Tuyeät ñoái (absolute)
- Daøi (long)
- Chæ soá (index) 23
1. Định địa chỉ thanh ghi

-Trong leänh truy xuaát ñeán caùc thanh ghi R0  R7 cuûa bank thanh ghi
tích cöïc. Caùc leänh naøy ñöôïc maõ hoùa daøi 1 byte, trong ñoù duøng 3 bit
thaáp nhaát ñeå chæ thanh ghi ñöôïc truy xuaát.

- Ngoaøi ra, trong leänh cuõng coù theå truy xuaát ñeán caùc thanh ghi ñaëc
bieät nhö: thanh ghi tích luõy (kyù hieäu A), con troû döõ lieäu (kyù hieäu
DPTR), boä ñeám chöông trình (kyù hieäu PC), côø nhôù (kyù hieäu C) vaø caëp
thanh ghi AB (kyù hieäu AB). Caùc leänh naøy khoâng caàn caùc bit ñòa chæ,
baûn thaân opcode cuûa leänh ñaõ chæ ra thanh ghi ñöôïc duøng.
Ví duï: INC R1 ; taêng noäi dung thanh ghi R1 leân 1
INC A ; taêng noäi dung thanh ghi A leân 1
INC DPTR ; taêng noäi dung thanh ghi DPTR leân 1 24
2. Định địa chỉ trực tiếp

- Duøng ñeå truy xuaát caùc oâ nhôù trong RAM noäi (ñòa chæ töø 00H  7FH)
hay caùc thanh ghi chöùc naêng ñaëc bieät (ñòa chæ töø 80H  FFH). Moät
byte ñöôïc theâm vaøo tieáp theo opcode ñeå xaùc ñònh ñòa chæ. OpcodeÑòa
chæ tröïc tieáp

- Trình dòch hôïp ngöõ cho pheùp söû duïng teân caùc thanh ghi chöùc naêng
ñaëc bieät (thay cho ñòa chæ).

25
2. Định địa chỉ trực tiếp

Ví duï:

INC ACC ; taêng noäi dung thanh ghi A leân 1


Leänh naøy cuøng chöùc naêng vôùi leänh INC A ôû treân
nhöng khaùc kieåu ñònh ñòa chæ  caùc byte maõ
leänh khaùc nhau.

MOV P0,A ; chuyeån noäi dung cuûa thanh ghi


A vaøo Port 0 ( MOV 80H,A)

INC 30H ; taêng noäi dung oâ nhôù 30H leân 1


Noäi dung 30H ban ñaàu laø #06H, sau leänh treân
(30H) = #07H 26
3. Định địa chỉ gián tiếp

-Trong leänh duøng caùc thanh ghi R0 vaø R1 laøm con troû ñeå
chæ ra ñòa chæ oâ nhôù trong RAM noäi maø leänh taùc ñoäng ñeán.
Bit thaáp nhaát trong maõ leänh seõ xaùc ñònh thanh ghi naøo
ñöôïc duøng.

- Quy öôùc: duøng daáu @ tröôùc R0 vaø R1 cho kieåu ñònh ñòa
chæ naøy.
27
3. Định địa chỉ gián tiếp

Ví duï: (R1) = 30H, (30H) = 52H


INC @R1 ; taêng noäi dung oâ nhôù ñöôïc troû
bôûi R1
 (R1) = 30H, (30H) = 53H

28
3. Định địa chỉ gián tiếp

- Kieåu ñònh ñòa chæ naøy


thöôøng duøng khi truy xuaát
tôùi moät vuøng nhôù lieân tieáp.

Ví duï: Caùc böôùc sau ñöôïc


thöïc hieän ñeå xoùa 50 oâ nhôù
trong RAM noäi baét ñaàu töø ñòa
chæ 30H:
29
4. Định địa chỉ tức thời

- Caùc döõ lieäu töùc thôøi ñöôïc duøng tröïc tieáp trong leänh coù theå laø moät
haèng soá, moät kyù soá, moät bieåu thöùc toaùn hoïc… Trình dòch hôïp ngöõ seõ
töï ñoäng tính toaùn vaø thay theá döõ lieäu töùc thôøi vaøo maõ leänh.

- Quy öôùc: duøng daáu # tröôùc caùc toaùn haïng töùc thôøi.

Ví duï: MOV A,#7 ; naïp giaù trò 7 vaøo thanh ghi A, (A) = #7H
MOV A,#7+8 ; naïp giaù trò 15 vaøo thanh ghi A, (A) = #0FH
MOV A,#‘B’ ; naïp giaù trò 66 (maõ ASCII cuûa kyù töï B) vaøo
thanh ghi A, (A) = #42H 30
5. Định địa chỉ tương đối

-Ñöôïc duøng trong caùc leänh nhaûy ngaén.

- Moät ñòa chæ töông ñoái (hay coøn goïi laø offset) laø moät giaù
trò 8 bit coù daáu (töø –128 ñeán +127) cho bieát ñoä leäch töø vò
trí leänh theo ngay sau leänh nhaûy ñeán ñích. Giaù trò naøy ñöôïc
coäng theâm vaøo thanh ghi boä ñeám chöông trình (PC) ñeå taïo
ra ñòa chæ cuûa leänh tieáp theo caàn ñöôïc thöïc thi.

31
5. Định địa chỉ tương đối

-Ví duï:
Tính
offset cho
kieåu ñònh
ñòa chæ
töông ñoái
trong hai
tröôøng
hôïp nhaûy
tôùi vaø
nhaûy luøi.
32
5. Định địa chỉ tương đối

-Thoâng thöôøng caùc ñích nhaûy ñöôïc xaùc ñònh baèng caùc nhaõn vaø trình
dòch hôïp ngöõ seõ xaùc ñònh offset töông ñoái töông öùng.

Ví duï: Neáu nhaõn THERE ñöôïc ñaët ôû ñòa chæ 1040H vaø leänh:
SJMP THERE
ôû trong boä nhôù chöông trình taïi ñòa chæ 1000H vaø 1001H  ñòa chæ
cuûa leänh keá tieáp seõ laø 1000H + 02H = 1002H, neân offset töông ñoái
seõ laø: offset = 1040H – 1002H = 3EH. Trình dòch hôïp ngöõ seõ gaùn
offset töông ñoái laø 3EH cho byte 2 cuûa leänh SJMP THERE.

- Coù öu ñieåm laø khoâng phuï thuoäc vaøo vò trí nhöng bò giôùi haïn veà taàm
nhaûy. 33
6. Định địa chỉ tuyệt đối

- Chæ duøng trong caùc leänh AJMP vaø ACALL.


- Cho pheùp reõ nhaùnh chöông trình trong trang 2K hieän haønh cuûa boä
nhôù chöông trình (töùc taàm nhaûy cuûa leänh laø trong trang 2K hieän
haønh cuûa boä nhôù chöông trình).
-11 bit thaáp cuûa ñòa chæ ñích, trong ñoù 3 bit cao (A8  A10) ñöôïc ñöa
vaøo cuøng vôùi opcode taïo thaønh byte thöù 1 cuûa leänh vaø 8 bit thaáp (A0
 A7) taïo thaønh byte thöù 2 cuûa leänh. 5 bit cao cuûa ñòa chæ ñích laø 5
bit cao hieän haønh cuûa boä ñeám chöông trình (PC)  leänh theo ngay
sau leänh reõ nhaùnh vaø ñích ñeán phaûi ôû trong cuøng 1 trang 2K.

34
6. Định địa chỉ tuyệt đối

Kieåu ñònh ñòa chæ naøy coù taàm nhaûy bò haïn cheá vaø cung caáp maõ phuï
thuoäc vò trí. 35
6. Định địa chỉ tuyệt đối

Ví duï: Neáu nhaõn THERE ñaët taïi ñòa chæ 0F46H vaø leänh:

AJMP THERE

ôû trong boä nhôù taïi ñòa chæ 0900H vaø 0901H  leänh theo ngay sau
leänh nhaûy baét ñaàu ôû ñòa chæ 0902H seõ coù 5 bit cao ñòa chæ truøng vôùi
ñòa chæ nhaõn THERE laø 00001.

 Maõ hoaù leänh:

36
7. Định địa chỉ dài

-Chæ duøng trong caùc leänh LCALL vaø LJMP.

- Ñaây laø caùc leänh reõ nhaùnh 3 byte, vôùi 2 byte sau (byte 2 vaø
byte 3) laø ñòa chæ ñích cuûa leänh (16 bit).

- Öu ñieåm laø coù theå söû duïng toaøn boä vuøng nhôù chöông
trình 64K, nhöng leänh laïi daøi ñeán 3 byte vaø phuï thuoäc vaøo
vò trí.
37
8. Định địa chỉ chỉ số

-Duøng moät ñòa chæ neàn (chöùa trong thanh ghi PC hay
DPTR) vaø moät offset (chöùa trong thanh ghi A) ñeå taïo ñòa
chæ ñöôïc taùc ñoäng cho caùc leänh JMP hoaëc MOVC.

(Ñòa chæ ñöôïc taùc ñoäng) = (PC) hoaëc (DPTR) + (A)

- Thöôøng duøng khi truy xuaát döõ lieäu trong moät baûng döõ
lieäu ñaõ ñöôïc ñònh nghóa tröôùc. Khi ñoù, thanh ghi PC hay
DPTR seõ giöõ ñòa chæ ñaàu baûng vaø thanh ghi A giöõ ñòa chæ
offset cuûa döõ lieäu caàn truy xuaát trong baûng.
38
8. Định địa chỉ chỉ số

Ví duï: Baûng caùc giaù trò bình


phöông cuûa soá nguyeân (0^2, 1^2,
2^2, 3^2, 4^2).
Neáu DPTR chöùa ñòa chæ ñaàu baûng
(töông öùng nhaõn TABLE) vaø (A)
= #3, thì sau khi thöïc hieän leänh:
MOVC A, @A+DPTR

 (A) = 09H = 3^2. 39


III. Tập lệnh
III. Tập lệnh

Taäp leänh cuûa 8051 ñöôïc chia laøm 5 nhoùm:


- Nhoùm leänh soá hoïc
- Nhoùm leänh logic
- Nhoùm leänh chuyeån döõ lieäu
- Nhoùm leänh reõ nhaùnh (chuyeån ñieàu khieån)
- Nhoùm leänh xöû lyù bit

41
1. Các định hướng biên dịch
(Assembler directives)

 Assembler Directives
 Instructions for the ASSEMBLER
 NOT 8051 instructions
 Examples:
;cseg stands for “code segment”
cseg at 1000h ;address of next instruction
is 1000h

GREEN_LED equ P1.6 ;symbol for Port 1, bit 6

42
1. Các định hướng biên dịch
(Assembler directives)

 DATA
 Used to define a name for memory locations
SP DATA 0x81 ;special function registers
MY_VAL DATA 0x44 ;RAM location

 EQU
 Used to create symbols that can be used to
represent registers, numbers, and addresses
LIMIT EQU 2000
VALUE EQU LIMIT – 200 + 'A'
SERIAL EQU SBUF
COUNT EQU R5
MY_VAL EQU 0x44
43
2. Nhóm lệnh chuyển dữ liệu
(Data transfer instructions)

44
3. Nhóm lệnh logic (Logic instructions)

45
4. Nhóm lệnh số học (Arithmetic instructions)

46
5. Nhóm lệnh rẽ nhánh (chuyển điều khiển)
(Program flow instructions)

47
6. Nhóm lệnh xử lý bit
(Bit processing instructions)

48
IV. Các kỹ thuật lập trình
IV. Các kỹ thuật lập trình

Laäp trình caáu truùc (structured programming) laø moät kyõ thuaät toå
chöùc vaø maõ hoùa caùc chöông trình nhaèm giaûm söï phöùc taïp, deã
daøng gôõ roái vaø hieäu chænh chöông trình.

Laäp trình caáu truùc nhaán maïnh ñeán caùc nhieäm vuï laäp trình.
Ngöôøi laäp trình phaân tích moät nhieäm vuï lôùn thaønh nhieàu coâng
vieäc nhoû hôn, sau ñoù daàn daàn chi tieát, cuï theå hoùa ñeå ñöôïc caùc
vaán ñeà ñôn giaûn.

50
IV. Các kỹ thuật lập trình

Qua ñoù, tìm ra caùch giaûi quyeát vaán ñeà döôùi daïng nhöõng thuaät
giaûi cuï theå roõ raøng, ñeå coù theå minh hoïa baèng ngoân ngöõ giaûi
thuaät.

Trong laäp trình caáu truùc, caùc thuaät giaûi naøy ñöôïc goïi laø caùc
chöông trình con. Caùch thöùc phaân tích vaø thieát keá nhö vaäy ta
goïi laø nguyeân lyù laäp trình töø treân xuoáng (top-down), ñeå theå hieän
quaù trình suy dieãn töø caùi chung nhaát cho ñeán caùi cuï theå nhaát.

51
IV. Các kỹ thuật lập trình

Taát caû caùc vaán ñeà laäp trình ñeàu coù theå ñöôïc giaûi quyeát chæ
döïa treân 3 caáu truùc:

* Caùc phaùt bieåu


* Caùc voøng laëp
* Caùc löïa choïn

52
1. Các phát biểu

- Caùc phaùt bieåu laø moät caùch thöùc cô baûn ñeå thöïc hieän moät
coâng vieäc naøo ñoù.

- Caùc phaùt bieåu coøn bao goàm caû vieäc gaùn giaù trò cho 1 bieán
hoaëc goïi chöông trình con.

53
2. Các cấu trúc vòng lặp

- Ñöôïc söû duïng ñeå thöïc hieän moät hoaëc moät soá coâng vieäc
laëp ñi laëp laïi nhieàu laàn.

- Coù hai daïng voøng laëp cô baûn:

a. While ………… Do

b. Repeat ………… Until

54
2. Các cấu trúc vòng lặp

While ………… Do
+ Cuù phaùp:

WHILE [ñieàu kieän] DO


[caùc phaùt bieåu]

+ Löu ñoà:

55
2. Các cấu trúc vòng lặp

Ví duï: Vieát chöông trình con SUM tính toång cuûa moät chuoãi
caùc soá. Caùc thoâng soá truyeàn vaøo chöông trình con laø
chieàu daøi cuûa chuoãi soá (ñöôïc chöùa trong thanh ghi R7)
vaø ñòa chæ baét ñaàu cuûa chuoãi soá ñoù trong RAM noäi (ñöôïc
chöùa trong thanh ghi R0). Keát quaû traû veà ñöôïc chöùa
trong thanh ghi A.

56
2. Các cấu trúc vòng lặp

Pseudo-code:

[sum = 0]
WHILE [length > 0] DO
Begin
[sum = sum + @pointer]
[taêng pointer]
[giaûm length]
End
57
2. Các cấu trúc
vòng lặp

Löu ñoà
(flowchart):

58
2. Các cấu trúc vòng lặp

Maõ 8051 assembly:

SUM: CLR A
LOOP: CJNE R7, #0, STATEMENT
JMP EXIT
STATEMENT: ADD A, @R0
INC R0
DEC R7
JMP LOOP
EXIT: RET
59
2. Các cấu trúc vòng lặp

Maõ 8051 assembly (another method):

SUM: CLR A
INC R7
MORE: DJNZ R7, SKIP
RET
SKIP: ADD A, @R0
INC R0
SJMP MORE

60
2. Các cấu trúc vòng lặp

Repeat …………Until
+ Cuù phaùp:

REPEAT [caùc phaùt bieåu]


UNTIL [ñieàu kieän]

+ Löu ñoà:

61
2. Các cấu trúc vòng lặp

Ví duï: Vieát chöông trình con ñeå tìm moät chuoãi ñöôïc keát
thuùc bôûi kyù töï Null ñöôïc troû bôûi thanh ghi R0 vaø xaùc
ñònh xem trong chuoãi coù kyù töï Z hay khoâng. Keát quaû traû
veà ACC = Z neáu coù kyù töï Z ôû trong chuoãi, neáu khoâng thì
ACC = 0.

62
2. Các cấu trúc vòng lặp

Pseudo-code:

REPEAT
[ACC = @pointer]
[taêng pointer]
Until [ACC == ‘Z’ or ACC == 0]

63
2. Các cấu trúc
vòng lặp

Löu ñoà
(flowchart):

64
2. Các cấu trúc vòng lặp

Maõ 8051 assembly:

STATEMENT: MOV A, @R0


INC R0
JZ EXIT
CJNE A, #’Z’, STATEMENT
EXIT: RET

65
2. Các cấu trúc vòng lặp

Ví duï 2: Vieát chöông trình laáy 10 byte trong RAM noäi,


ñòa chæ baét ñaàu laø 30H ghi ra RAM ngoaøi ôû ñòa chæ baét
ñaàu laø 2000H.

Require: using CJNE loop and DJNZ loop

66
2. Các cấu trúc vòng lặp

Caùch 1: Duøng voøng laëp CJNE

ORG 0000H
MOV R0,#30H ; R0 troû tôùi ñòa chæ 30H trong RAM
; noäi
MOV DPTR,#2000H ; DPTR troû tôùi ñòa chæ ngoaøi 2000H
LOOP: MOV A,@R0 ; ghi noäi dung oâ nhôù ñöôïc troû bôûi
;R0 vaøo A
MOVX @DPTR, A ; ghi noäi dung trong A ra ñòa chæ
;ñöôïc troû bôûi DPTR
INC R0 ; taêng chæ soá ñòa chæ trong R0
INC DPTR ; taêng chæ soá ñòa chæ trong DPTR
CJNE R0,#2AH,LOOP ; ñuû 10 byte chöa?
END 67
2. Các cấu trúc vòng lặp

Caùch 2: Duøng voøng laëp DJNZ


ORG 0000H
MOV R0,#30H ; R0 troû tôùi ñòa chæ 30H trong RAM
;noäi
MOV DPTR,#2000H ; DPTR troû tôùi ñòa chæ ngoaøi 2000H
MOV R7,#10 ; R7 chöùa soá laàn laëp laø 10
LOOP: MOV A,@R0 ; ghi noäi dung oâ nhôù ñöôïc troû bôûi
;R0 vaøo A
MOVX @DPTR, A ; ghi noäi dung trong A ra ñòa chæ
;ñöôïc troû bôûi DPTR
INC R0 ; taêng chæ soá ñòa chæ trong R0
INC DPTR ; taêng chæ soá ñòa chæ trong DPTR
DJNZ R7,LOOP ; ñuû 10 byte chöa?
END 68
2. Các cấu trúc vòng lặp

Moving data Moving data

Destination Destination

Copy direction Copy direction

Note: Departure and destination in the same memory zone


69
2. Các cấu trúc vòng lặp

Ví duï 3: Vieát chöông trình coäng moät chuoãi soá BCD khoâng
neùn (unpacked – BCD) ñöôïc caát trong RAM noäi baét ñaàu
töø oâ nhôù 31H. Chieàu daøi chuoãi chöùa trong oâ nhôù 30H.
Keát quaû (giaû söû laø 1 byte) caát vaøo oâ nhôù 2FH.

70
2. Các cấu trúc vòng lặp

ORG 0000H
MOV R0,#31H ; R0 troû tôùi ñòa chæ 31H trong RAM noäi
CLR A ; ban ñaàu cho (A) = 0
LOOP: ADD A,@R0 ; coäng noäi dung oâ nhôù ñöôïc troû bôûi R0 vaøo
;A
INC R0 ; taêng chæ soá ñòa chæ trong R0
DJNZ 30H,LOOP ; heát chuoãi chöa?
MOV 2FH,A ; caát keát quaû sau khi coäng vaøo oâ nhôù 2FH
END

71
2. Các cấu trúc vòng lặp

Ví duï 4: Vieát chöông trình ñoåi caùc kyù töï chöõ thöôøng trong caùc oâ nhôù
töø 30H  39H trong RAM noäi sang chöõ hoa. Bieát:

72
2. Các cấu trúc vòng lặp

Nhaän xeùt:

Ñeå ñoåi chöõ hoa sang chöõ thöôøng ta ñaët bit 5 (hay coäng
theâm 32) trong maõ ASCII cuûa chöõ hoa. Ngöôïc laïi, ñeå
ñoåi chöõ thöôøng sang chöõ hoa ta xoùa bit 5 (hay tröø ñi 32)
trong maõ ASCII cuûa chöõ thöôøng.

73
2. Các cấu trúc vòng lặp

ORG 0000H
MOV R0,#30H ; R0 troû tôùi ñòa chæ 30H trong RAM noäi
LOOP: XCH A,@R0 ; hoaùn ñoåi noäi dung A vaø oâ nhôù ñöôïc troû
;bôûi R0
ANL A,#11011111B ; xoùa bit 5 trong maõ ASCII, caùc bit khaùc
;giöõ nguyeân
XCH A,@R0 ; caát keát quaû trôû laïi oâ nhôù ñöôïc troû bôûi R0
INC R0 ; taêng chæ soá ñòa chæ trong R0
CJNE R0,#3AH,LOOP ; xöû lyù xong oâ nhôù 39H chöa?
END

74
3. Các cấu trúc lựa chọn

If ……Then……Else
+ Cuù phaùp:

IF [ñieàu kieän]
THEN [phaùt bieåu 1]
ELSE [phaùt bieåu 2]

+ Löu ñoà:

75
3. Các cấu trúc lựa chọn

Ví duï 1: vieát moät ñoaïn chöông trình nhaäp moät kyù töï töø RAM ngoaøi
coù ñòa chæ laø 2000H vaø kieåm tra kyù töï ñoù. Neáu kyù töï nhaän ñöôïc laø
loaïi maõ ASCII hieån thò ñöôïc (coù giaù trò trong khoaûng 20H  7EH)
thì xuaát laïi noù, neáu khoâng thì xuaát laïi kyù töï ‘.’ ra RAM ngoaøi ôû
ñòa chæ 2001H.

76
3. Các cấu
trúc
lựa chọn

Löu ñoà
(flowcha
rt):

77
3. Các cấu trúc lựa chọn

Pseudo-code:

[nhaäp kyù töï]


IF [kyù töï == graphic]
THEN [xuaát laïi kyù töï]
ELSE [xuaát kyù töï ‘.’]

78
3. Các cấu trúc lựa chọn

Maõ 8051 assembly:

ENTER: ACALL INCH


ACALL ISGRPH
JNC STMENT2
STMENT1: ACALL OUTCH
JMP EXIT
STMENT2: MOV A, #’.’
ACALL OUTCH
EXIT: (tieáp tuïc)
79
3. Các cấu trúc lựa chọn

Maõ 8051 assembly (another method):

ACALL INCH
ACALLISGRPH
JC SKIP
MOV A, #’.’
SKIP: ACALLOUTCH
(tieáp tuïc)

80
3. Các cấu trúc lựa chọn

Ví duï 2: Vieát chöông trình kieåm tra moät khoái döõ lieäu trong RAM
ngoaøi coù chieàu daøi 100 byte baét ñaàu töø ñòa chæ 1000H xem coù bao
nhieâu giaù trò chaün vaø leû. Soá giaù trò chaün vaø leû ñöôïc löu töông öùng
trong 2 oâ nhôù 30H vaø 31H.

81
3. Các cấu trúc lựa chọn

Maõ 8051 assembly:

ORG 0000H
MOV DPTR,#1000H ; DPTR troû tôùi ñòa chæ ngoaøi 1000H
MOV R7,#100 ; R7 chöùa soá laàn laëp laø 100
LOOP: MOVX A,@DPTR ; ñoïc oâ nhôù ñöôïc troû bôûi DPTR vaøo A ñeå
;kieåm tra
JB ACC.0,ODD ; (ACC.0) = 1  soá leû
INC 30H ; (ACC.0) = 0  soá chaún
SJMP CONT ; xeùt byte keá tieáp
ODD: INC 31H
CONT:INC DPTR ; taêng chæ soá ñòa chæ trong DPTR
DJNZ R7,LOOP ; ñuû 100 byte chöa?
END 82
3. Các cấu trúc lựa chọn

Maõ 8051 assembly (another method):

Coù theå thay doøng leänh JB ACC.0, ODD baèng:


ANL A,#01H
JNZ ODD

83
3. Các cấu trúc lựa chọn

Ví duï 3: Vieát chöông trình con teân COMPARE_8 so saùnh


soá nhò phaân 8 bit trong thanh ghi A vôùi giaù trò chuaån
trong oâ nhôù RAM noäi coù ñòa chæ 30H. Keát quaû traû veà:
+ Neáu (A) > (30H) thì xoùa P1.0
+ Neáu (A) = (30H) thì xoùa P1.1
+ Neáu (A) < (30H) thì xoùa P1.2

84
3. Các cấu trúc lựa chọn

Höôùng daãn: Söû duïng leänh so saùnh CJNE:

CJNE arg1, arg2, arg3


Neáu arg1  arg2 thì C = 0
Neáu arg1 < arg2 thì C = 1

85
3. Các cấu trúc lựa chọn

Löu ñoà
(flowcha
rt):

86
3. Các cấu trúc lựa chọn

Maõ 8051 assembly:

COMPARE_8:
CJNE A,30H,NOT_EQUAL ; (A) # (30H)
CLR P1.1 ; (A) = (30H)
SJMP EXIT
NOT_EQUAL:
JNC GREATER ; (C) = 0  (A) > (30H)
CLR P1.2 ; (C) = 1  (A) < (30H)
SJMP EXIT
GREATER:
CLR P1.0
EXIT:
RET 87
3. Các cấu trúc lựa chọn
Case
+ Cuù phaùp:

CASE [bieåu thöùc] OF


0: [phaùt bieåu 0]
1: [phaùt bieåu 1]
2: [phaùt bieåu 2]
.
.
.
n: [phaùt bieåu n]
[phaùt bieåu maëc ñònh]
END_CASE 88
3. Các cấu trúc lựa chọn

Case Löu ñoà :

89
3. Các cấu trúc lựa chọn

Ví duï: Moät chöông trình yeâu caàu caùc ñaùp öùng 0, 1, 2, hoaëc
3 cuûa moät user ñeå choïn moät trong boán haønh ñoäng. Vieát
ñoaïn chöông trình nhaäp moät kyù töï töø baøn phím vaø nhaûy
ñeán ACT0, ACT1, ACT2 hoaëc ACT3, phuï thuoäc vaøo ñaùp
öùng cuûa user. Boû qua vieäc kieåm tra loãi.

90
3. Các cấu trúc lựa chọn

Pseudo-code:

[nhaäp moät kyù töï]


CASE [kyù töï] OF
‘0’: [haønh ñoäng 0]
‘1’: [haønh ñoäng 1]
‘2’: [haønh ñoäng 2]
‘3’: [haønh ñoäng 3]
END_CASE

91
3. Các cấu trúc lựa chọn
Löu ñoà :

92
3. Các cấu trúc lựa chọn

Maõ 8051 assembly:


CALL INCH
CJNE A, #’0’, SKIP1
ACT0: .
.
SKIP1: CJNE A, #’1’, SKIP2
ACT1: .
.
SKIP2: CJNE A, #’2’, SKIP3
ACT2: .
.
SKIP3: CJNE A, #’3’, EXIT
ACT2: .
.
EXIT: (tieáp tuïc) 93
3. Các cấu trúc lựa chọn
Maõ 8051 assembly (another method):
CALL INCH
ANL A, #3
RL A
MOV DPTR, #TABLE
JMP @A+DPTR
TABLE: AJMP ACT0
AJMPACT1
AJMPACT2
ACT3: .
.
JMP EXIT
ACT0: .
.
JMP EXIT
ACT1: .
.
JMP EXIT
ACT2: .
.
EXIT: (tieáp tuïc) 94
4. Kỹ thuật tạo trễ

Ví duï 1: Vieát chöông trình con teân DELAY_100 ñeå taïo treã
(trì hoaõn) 100 s. Giaû söû duøng thaïch anh 12 MHz (fOSC
= 12 MHz).

95
4. Kỹ thuật tạo trễ

Höôùng daãn: Duøng thôøi gian thöïc thi leänh ñeå tính thôøi gian taïo treã caàn
thieát.
fOSC = 12 MHz  fM = fOSC / 12 = 1 MHz  TM = 1 s

Caùch 1: Duøng caùc leänh NOP


DELAY_100:
; duøng 98 leänh NOP  98 s
NOP
NOP

NOP
RET ; 2 s  98 + 2 = 100 s 96
4. Kỹ thuật tạo trễ

Caùch 2: Duøng voøng laëp ñeå chöông trình ngaén goïn hôn.

DELAY_100:
MOV R7,#49 ; 1 s
LOOP: DJNZ R7,LOOP ; 2 s / 1 leänh  2 x 49 = 98 s
RET ; 2 s

Toång quaùt:

DELAY_T:
MOV R7,#N ; 1 TM, N  255
LOOP: DJNZ R7,LOOP ; 2 TM / 1 leänh  (2 x N) TM
RET ; 2 TM
 toång thôøi gian taïo treã: T = [(1 + 2 x N + 2)TM]  [(2 x N) TM] s 97
4. Kỹ thuật tạo trễ

Chuù yù:

Leänh LOOP: DJNZ R7, LOOP


töông ñöông vôùi leänh DJNZ R7,$

Daáu $ laø moät kyù hieäu ñaëc bieät cuûa trình dòch hôïp
ngöõ ASM51 ñeå tham chieáu vò trí cuûa leänh hieän haønh.

98
4. Kỹ thuật tạo trễ

Ví duï 2: Vieát chöông trình con teân DELAY_10ms ñeå taïo treã
10 ms. Giaû söû duøng thaïch anh 12 MHz (fOSC = 12 MHz).

99
4. Kỹ thuật tạo trễ

Thôøi gian caàn taïo treã: T = 10 ms = 10000 s = 10000 TM.


Neáu duøng voøng laëp nhö ví duï 8 thì thôøi gian taïo treã toái ña khoaûng  2 x 255
= 510s < 10000s. Nhö vaäy caàn duøng 2 voøng laëp loàng nhau.

Chöông trình:
DELAY_10ms:
MOV R7,#20 ; 1 s
LOOP: MOV R6,#250 ; 1 s
DJNZ R6,$ ; 2 s / 1 leänh
DJNZ R7,LOOP ; 2 s / 1 leänh
RET ; 2 s
 toång thôøi gian taïo treã: T = 1 + 20(1 + 2 x 250 + 2) + 2 = 10063 s 
10000 s
100
4. Kỹ thuật tạo trễ

Toång quaùt:

DELAY_T:
MOV R7,#M ; 1 TM
LOOP: MOV R6,#N ; 1 TM
DJNZ R6,$ ; 2 TM / 1 leänh
DJNZ R7,LOOP ; 2 TM / 1 leänh
RET ; 2 TM

 toång thôøi gian taïo treã:

T = [1 + M(1 + 2 x N + 2) + 2]TM  [(2 x M x N)TM] s


101
4. Kỹ thuật tạo trễ

Ví duï 3: Vieát chöông trình taïo soùng vuoâng tuaàn hoaøn ñoái
xöùng taïi chaân P1.0 coù taàn soá laø f= 10 KHz. Giaû söû fOSC
= 12 MHz.

102
4. Kỹ thuật tạo trễ

fOSC = 12 MHz  fM = fOSC / 12 = 1 MHz  TM = 1 s

f = 10 KHz  T = 0,1 ms = 100 s

Soùng vuoâng ñoái xöùng  tH = tL = 50 s = 50TM

103
4. Kỹ thuật tạo trễ

ORG 0000H
LOOP: CPL P1.0 ; 1 s
MOV R7,#28 ; 1 s
DJNZ R7,$ ; 2 x 28 = 46 s
SJMP LOOP ; 2 s
END

104
Questions ???
Bài tập chương 3
Bài tập chương 3

3.1 Haõy cho bieát caùch ñònh ñòa chæ cuûa moãi leänh sau:
a. MOV R1,A b. MOV A,#12H
c. MOV A,@R1 d. PUSH B
e. MOV A,12Hf. SJMP LOOP
g. ACALL SUB1 h. LJMP 0567H

3.2 Ñeå naïp vaøo R4 giaù trò 56H thì coù caàn daáu ‘#’ trong leänh:
MOV R4,#56H khoâng?

3.3 Söï khaùc bieät giöõa 2 leänh sau laø gì?


INC A
INC ACC 107
Bài tập chương 3

3.4 Haõy xaùc ñònh offset töông ñoái cho leänh: SJMP AHEAD
Bieát leänh ñaët taïi ñòa chæ 0400H vaø 0401H, nhaõn AHEAD ñaët taïi
ñòa chæ 041FH.

3.5 Haõy xaùc ñònh offset töông ñoái cho leänh: SJMP BACK
Bieát leänh ñaët taïi ñòa chæ A050H vaø A051H, nhaõn BACK ñaët taïi ñòa
chæ 9FE0H.

3.6 Giaû söû leänh: AJMP THERE


trong boä nhôù chöông trình ôû ñòa chæ 2FF0H vaø 2FF1H, nhaõn
THERE ôû ñòa chæ 2F96H. Haõy xaùc ñònh caùc byte maõ maùy cuûa leänh
treân? 108
Bài tập chương 3

3.7 Giaû söû thanh ghi A chöùa 5AH. Haõy cho bieát giaù trò trong
thanh ghi A sau khi thöïc hieän leänh sau: XRL A,#0FFH
Haõy tìm moät leänh khaùc töông ñöông vôùi leänh treân?

3.8 Giaû söû thanh ghi A chöùa 50H vaø thanh ghi PSW chöùa 0CH.
Haõy cho bieát giaù trò trong thanh ghi A sau khi thöïc hieän leänh sau:
RLC A

109
Bài tập chương 3

3.9 Haõy xaùc ñònh noäi dung cuûa thanh ghi A sau khi thöïc hieän caùc
chuoãi leänh sau:
a. MOV A,#25
MOV R7,#18H
ADD A,R7

b. MOV A,#7FH
MOV 50H,#29H
MOV R0,#50H
XCHD A,@R0

110
Bài tập chương 3

3.10 Cho bieát giaù trò cuûa côø CY sau khi thöïc hieän caùc ñoaïn maõ
sau:
a. CLR C b. MOV A,#54H c. MOV A,#250
CPL C ADD A,#0C4H ADD A,#05

3.11 Caùc leänh naøo sau ñaây laø khoâng hôïp leä:
1.MOV R7,#500 2.MOV A,50H
3.ADD A,R5 4.ADD R3,A
5.MOV R1,#50 6.MOV A,#F5H
7.ADD A,#50H 8.MOV @R1,R7
9.PUSH A 10.MOV A,@R3
11.MOV R7,#00 12.MOV R6,R7
111
Bài tập chương 3

3.12 Cho noäi dung cuûa caùc oâ nhôù vaø thanh ghi: (30H) = 12H; (B)
= 34H; (A) = 05H. Haõy xaùc ñònh noäi dung cuûa oâ nhôù 30H, thanh
ghi A vaø B sau khi thöïc thi ñoaïn chöông trình sau:

MOV R1,#30H
XCH A,B
XCHD A,@R1
SWAP A
XCHD A,@R1
SWAP A

112
Bài tập chương 3

3.13 Xeùt ñoaïn chöông trình sau:

MOV R0,#20H
MOV R1,#30H
MOV R2,#2 ;*
CLR C
NEXT: MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,NEXT
113
Bài tập chương 3

a. Sau khi thöïc hieän leänh thöù 3 (coù chuù thích *), noäi dung cuûa
R0, R1 vaø R2 laø bao nhieâu?

b. Leänh coù nhaõn NEXT ñöôïc thöïc thi bao nhieâu laàn?

c. Sau khi hoaøn taát chöông trình treân thì noäi dung cuûa R0, R1 vaø
R2 laø bao nhieâu?

d. Cho noäi dung cuûa caùc oâ nhôù ban ñaàu laø: (20H) = 23H, (21H) =
45H, (30H) = 67H, (31H) = 89H:
Cho bieát noäi dung cuûa caùc oâ nhôù treân sau khi thöïc thi xong
chöông trình treân?
Chöùc naêng cuûa chöông trình treân? 114
Bài tập chương 3

3.14 Xeùt chöông trình sau:


ORG 0000H
MOV R0,#05H
MOV R1,#40H
MOV R2,#0 ;*
MOV @R1,#0
AGAIN: MOV DPTR,#TABLE
MOV A,R2
MOVC A,@A+DPTR
ADD A,@R1
MOV @R1,A
INC R2
DJNZ R0,AGAIN
AJMP EXIT
TABLE: DB 10H,11H,12H,13H,14H
EXIT: NOP
END 115
Bài tập chương 3

a. Sau khi thöïc hieän leänh coù chuù thích *, noäi dung cuûa R0, R1 vaø R2 laø
bao nhieâu?

b. Leänh coù nhaõn AGAIN ñöôïc thöïc thi bao nhieâu laàn?

c. Sau khi hoaøn taát chöông trình treân thì noäi dung cuûa R0, R1 vaø R2 laø
bao nhieâu?

d. Noäi dung cuûa oâ nhôù 40H sau khi thöïc thi xong chöông trình treân?

e. Chöùc naêng cuûa chöông trình treân?

f. Neáu keát quaû cuûa chöông trình treân ñöôïc caát vaøo oâ nhôù 50H thì leänh
naøo caàn söûa ñoåi? 116
Bài tập chương 3

3.15 Vieát 1 ñoaïn chöông trình xoùa 20 byte oâ nhôù RAM noäi baét ñaàu töø
ñòa chæ 30H.

3.16 Vieát 1 ñoaïn chöông trình xoùa 100 byte oâ nhôù RAM ngoaøi baét ñaàu
töø ñòa chæ 1000H.

3.17 Vieát 1 ñoaïn chöông trình ñoïc 20 byte oâ nhôù RAM ngoaøi baét ñaàu töø
ñòa chæ 2000H vaø ghi vaøo RAM noäi baét ñaàu töø ñòa chæ 30H.

3.18 Vieát chöông trình con TINHTB_3SO tính giaù trò trung bình cuûa 3
soá nguyeân döông chöùa trong 3 oâ nhôù 30H, 31H vaø 32H. Keát quaû (phaàn
nguyeân) chöùa trong thanh ghi R7. Giaû söû toång cuûa 3 soá ñoù khoâng lôùn
hôn 255. 117
Bài tập chương 3

3.19 Vieát 1 chöông trình con coäng 2 soá 16 bit khoâng daáu, soá haïng 1 caát
trong R7_A (R7: byte cao, A: byte thaáp), soá haïng 2 caát trong oâ nhôù
31H_30H (31H: byte cao, 30H: byte thaáp). Keát quaû traû veà caát trong
R7_A.

3.20 Vieát 1 chöông trình con tröø 2 soá 16 bit khoâng daáu, soá bò tröø caát
trong R7_A (R7: byte cao, A: byte thaáp), soá tröø caát trong oâ nhôù
31H_30H (31H: byte cao, 30H: byte thaáp). Keát quaû traû veà caát trong
R7_A.

3.21 * Vieát 1 chöông trình con nhaân soá 16 bit caát trong R7_A (R7: byte
cao, A: byte thaáp) vôùi soá 8 bit caát trong B. Keát quaû traû veà 24 bit caát
trong R7_B_A. 118
Bài tập chương 3

3.22 * Vieát 1 chöông trình con chia soá 16 bit caát trong R7_A (R7: byte
cao, A: byte thaáp) cho soá 8 bit caát trong B. Keát quaû: thöông soá caát trong
R7_A, dö soá caát trong B.

3.23 Vieát 1 chöông trình con laáy buø 2 cuûa soá 16 bit caát trong R7_A (R7:
byte cao, A: byte thaáp). Keát quaû traû veà caát trong R7_A.

3.24 Vieát chöông trình con BINTOBCD chuyeån soá nhò phaân trong A
sang soá BCD 3 digit (kyù soá) caát trong caùc oâ nhôù 32H, 31H vaø 30H
(32H: traêm, 31H: chuïc, 30H: ñôn vò).

3.25 Vieát chöông trình con BCDTOBIN chuyeån soá BCD khoâng neùn (2 kyù
soá) trong A sang soá nhò phaân caát trong oâ nhôù 30H. 119
Bài tập chương 3

3.26 * Vieát chöông trình con BCDTOBIN16 chuyeån soá nhò phaân 16 bit
trong R7_A (R7: byte cao, A: byte thaáp) sang soá BCD 5 digit caát trong
caùc oâ nhôù theo thöù töï töø chuïc ngaøn ñeán ñôn vò laø:
34H_33H_32H_31H_30H.

3.27 Vieát chöông trình ñoåi caùc kyù töï chöõ hoa trong caùc oâ nhôù 30H 
3FH trong RAM noäi sang chöõ thöôøng.

3.28 Vieát chöông trình ñoåi caùc kyù töï chöõ hoa trong caùc oâ nhôù 30H 
3FH trong RAM noäi sang chöõ thöôøng vaø ngöôïc laïi.

120
Bài tập chương 3

3.29 Vieát chöông trình con SOSANH16 so saùnh soá 16 bit khoâng
daáu caát trong R7_A (R7: byte cao, A: byte thaáp) vôùi soá 16 bit
khoâng daáu laøm giaù trò chuaån caát trong oâ nhôù 31H_30H (31H:
byte cao, 30H: byte thaáp). Keát quaû traû veà:
- (C) = 1 neáu (R7_A) < (31H_30H)
- (C) = 0 neáu (R7_A)  (31H_30H)
Löu yù: phaûi baûo toaøn noäi dung cuûa caùc thanh ghi vaø oâ nhôù ôû treân.

3.30 Vieát chöông trình kieåm tra moät khoái döõ lieäu trong RAM
ngoaøi coù chieàu daøi 200 byte baét ñaàu töø ñòa chæ 1000H xem coù bao
nhieâu byte coù giaù trò laø 0. Keát quaû (soá byte coù giaù trò laø 0) ñöôïc
löu vaøo oâ nhôù coù ñòa chæ laø 0FFFH trong RAM ngoaøi. 121
Bài tập chương 3

3.31 Vieát chöông trình kieåm tra moät khoái döõ lieäu trong RAM ngoaøi coù chieàu daøi
50 byte baét ñaàu töø ñòa chæ 2000H xem coù bao nhieâu byte coù giaù trò laø 0, döông
vaø aâm. Keát quaû ñöôïc löu vaøo caùc oâ nhôù trong RAM noäi nhö sau:
- OÂ nhôù 30H: chöùa soá byte baèng 0.
- OÂ nhôù 31H: chöùa soá byte döông.
- OÂ nhôù 32H: chöùa soá byte aâm.

3.32 Vieát 1 chöông trình con teân DELAY_500 taïo treã 500s, bieát fOSC = 12
MHz.

3.33 Vieát 1 chöông trình con teân DELAY_20ms taïo treã 20ms, bieát fOSC = 12
MHz.

3.34 Vieát 1 chöông trình con teân DELAY_1s taïo treã 1s, bieát fOSC = 12 MHz. 122
Bài tập chương 3

3.35 Vieát chöông trình xuaát chuoãi xung vuoâng ñoái xöùng coù taàn soá f = 1KHz ra
chaân P1.0.

3.36 Vieát chöông trình xuaát chuoãi xung vuoâng ra chaân P1.0 vôùi taàn soá f =
10KHz, duty cycle = 30% (thôøi gian möùc cao = 30% thôøi gian cuûa chu kì
xung).

3.37 Vieát chöông trình ñieàu khieån ñeøn giao thoâng taïi ngaõ tö ñöôøng (ñeøn xanh
saùng 4s, ñeøn vaøng saùng 1s, ñeøn ñoû saùng 5s). Duøng port 1 ñeå ñieàu khieån caùc ñeøn
vôùi quy ñònh neáu xuaát ra möùc logic 0 laø ñeøn saùng:

Chaân Ñeøn ñöôøng 1 Chaân Ñeøn ñöôøng 2


P1.0 Xanh P1.3 Xanh
P1.1 Vaøng P1.4 Vaøng
P1.2 Ñoû P1.5 Ñoû 123
Bài tập chương 3

3.38 Cho maïch keát noái nhö sau:

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

8051
124
Bài tập chương 3

a. Haõy vieát chöông trình ñeå saùng töøng LED theo chieàu D1  D8
vaø laëp laïi, thôøi gian saùng cuûa moãi LED laø 0,2s.

b. Töông töï caâu a nhöng theo chieàu D8  D1.

c. Keát hôïp caâu a vaø b: saùng theo chieàu D1  D8 roài D8  D1 vaø


laëp laïi.

d. Haõy vieát chöông trình ñeå caùc LED saùng lan toûa theo chieàu D1
 D8 roài taét daàn theo chieàu D1  D8 vaø laëp laïi, thôøi gian caùch
nhau giöõa 2 LED laø 0,2s.

e. Töông töï caâu d nhöng theo chieàu töø D8  D1. 125


Bài tập chương 3

3.39 Cho maïch keát noái nhö sau: Haõy vieát chöông trình
+5V
ñeå xuaát
giaù trò BCD trong oâ nhôù 30H ra LED 7 ñoaïn.

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
330x8

8051
126

You might also like