You are on page 1of 57

 cng bi ging 8051 Starter Kit

Chng I: Gii thiu h Vi iu khin 8051


Vi iu khin 8051 l mt trong nhng vi iu khin 8 bit thng dng nht
hin nay. Bt u xut hin vo nm 1980, tri qua gn 30 nm, hin c ti hng
trm bin th (derrivatives) c sn xut bi hn 20 hng khc nhau, trong
phi k n cc i gia trong lng bn dn (Semiconductor) nh ATMEL, Texas
Instrument, Philips, Analog Devices Ti Vit Nam, cc bin th ca hng ATMEL
l AT89C51, AT89C52, AT89S51, AT89S52 c thi gian xut hin trn th
trng kh lu v c th ni l c s dng rng ri nht trong cc loi vi iu
khin 8 bit. Chng ny s tp trung m t tng i chi tit cu trc bn trong ca
cc bin th ni trn (tm gi chung l AT89) ca hng ATMEL.
Cu trc ca AT89 dng s khi tng qut

CPU

B nh
chng
trnh

B nh
d liu

Vo/ra
song
song

Vo/ra
ni tip

Ngt

P1

Timer0

P2

Timer1

P3
P4

B nh
thi / b
m

 cng bi ging 8051 Starter Kit


Cu trc bus
Bus a ch ca h vi iu khin 8051 gm 16 ng tn hiu (thng gi l bus a
ch 16 bit). Vi s lng bit a ch nh trn, khng gian nh ca chip c m rng
ti a l 216 = 65536 a ch, tng ng 64K.
Bus d liu ca h vi iu khin 8051 gm 8 ng tn hiu (thng gi l bus d
liu 8 bit), l l do ti sao ni 8051 l h vi iu khin 8 bit. Vi rng ca bus
d liu nh vy, cc chip h 8051 c th x l cc ton hng 8 bit trong mt chu k
lnh.
CPU (Central Processing Unit)
CPU l n v x l trung tm, l b no ca ton b h thng vi in t
c tch hp trn chip vi iu khin. CPU c cu to chnh gm mt n v x l
s hc v lgic ALU (Arithmethic Logic Unit) - ni thc hin tt c cc php ton s
hc v php lgic cho qu trnh x l.
B nh chng trnh (Program Memory)
Khng gian b nh chng trnh ca AT89 l 64K byte, tuy nhin hu ht cc
vi iu khin AT89 trn th trng ch tch hp sn trn chip mt lng b nh
chng trnh nht nh v chim di a ch t 0000h tr i trong khng gian b nh
chng trnh.
AT89C51/AT89S51 c 4K byte b nh chng trnh loi Flash tch hp sn
bn trong chip. y l b nh cho php ghi/xa nhiu ln bng in, chnh v th
cho php ngi s dng thay i chng trnh nhiu ln. S ln ghi/xa c
thng ln ti hng vn ln.
AT89C52/AT89S52 c 8K byte b nh chng trnh cng loi.
B nh chng trnh ca cc chip h 8051 c th thuc mt trong cc loi:
ROM, EPROM, Flash, hoc khng c b nh chng trnh bn trong chip. Tn ca
tng chip th hin chnh loi b nh chng trnh m n mang bn trong, c th l
vi v d sau:
STT
1
2
3
4
5
6
7
8

Tn chip
8051
8052
8031
8032
87C51
87C52
AT89C51 / AT89S51
AT89C52 / AT89S52

ROM
4 Kbyte
8 Kbyte
x
x
x
x
x
x

EPROM
x
x
x
x
4 Kbyte
8 Kbyte
x
x

Flash
x
x
x
x
x
x
4 Kbyte
8 Kbyte

 cng bi ging 8051 Starter Kit


B nh chng trnh dng cha m ca chng trnh np vo chip. Mi
lnh c m ha bi 1 hay vi byte, dung lng ca b nh chng trnh phn
nh s lng lnh m b nh c th cha c. a ch u tin ca b nh
chng trnh (0x0000) chnh l a ch Reset ca 8051. Ngay sau khi reset (do tt
bt ngun, do mc in p ti chn RESET b ko ln 5V...), CPU s nhy n thc
hin lnh t ti a ch ny trc tin, lun lun l nh vy. Phn cn trng trong
khng gian chng trnh khng dng lm g c. Nu mun m rng b nh
chng trnh, ta phi dng b nh chng trnh bn ngoi c dung lng nh
mun. Tuy nhin khi dng b nh chng trnh ngoi, b nh chng trnh onchip
khng dng c na, b nh chng trnh ngoi s chim di a ch ngay t a
ch 0x0000.
Hnh nh minh ha b nh chng trnh
Thn chng
trnh (chng
trnh chnh,
chng trnh
con, chng
trnh x l ngt,
bng cc hng
s ...)
Vector ngt th
n
...
Vector ngt th
1
a ch reset

0x0FFF

0x0030

0x0003
0x0000

B nh d liu (Data Memory)


Vi iu khin h 8051 c khng gian b nh d liu l 64K a ch, cng l
dung lng b nh d liu ln nht m mi chip thuc h ny c th c c (nu
phi ghp mt cch chnh tc, s dng cc ng tn hiu ca bus a ch v d
liu). B nh d liu ca cc chip h 8051 c th thuc mt hay hai loi: SRAM
hoc EEPROM. B nh d liu SRAM c tch hp bn trong mi chip thuc h vi
iu khin ny, c dung lng khc nhau ty loi chip, nhng thng ch khong
vi trm byte. y chnh l ni cha cc bin trung gian trong qu trnh hot ng
ca chip. khi mt in, do bn cht ca SRAM m gi tr ca cc bin ny cng b
mt theo. Khi c in tr li, ni dung ca cc nh cha cc bin ny cng l bt
k, khng th xc nh trc. Bn cnh b nh loi SRAM, mt s chip thuc h
3

 cng bi ging 8051 Starter Kit


8051 cn c thm b nh d liu loi EEPROM vi dung lng ti a vi Kbyte, ty
tng loi chip c th. Di y l mt vi v d v b nh chng trnh ca mt s
loi chip thng dng thuc h 8051.
STT
1
2
3
4
5
6

Tn chip

B nh SRAM
128 byte
256 byte
128 byte
128 byte
256 byte
256 byte

AT89C51
AT89C52
AT89C2051
AT89S51
AT89S52
AT89S8252

B nh EEPROM
0
0
0
0
0
2048 byte

Tng qut v b nh ca 8051, ta c th thy mi chip 8051 gm c nhng


b nh sau:

64
Kbyte

Phn khng gian


a ch cho b nh
chng trnh cn
trng, bng 64
Kbyte tr i lng
b nh onchip

Phn khng gian


a ch cho b nh
d liu (hon ton
trng rng 64K
byte, dnh cho b
nh d liu ghp
thm bn ngoi
nu c)

B nh chng
trnh onchip

B nh SRAM

Dung lng
ty loi chip
i vi cc chip c b nh SRAM 128 byte th a ch ca cc byte SRAM
ny c nh s t 00h n 7Fh. i vi cc chip c b nh SRAM 256 byte th
a ch ca cc byte SRAM c nh s t 00h n FFh. c hai loi chip, SRAM
c a ch t 00h n 7Fh c gi l vng RAM thp, phn c a ch t 80h n
FFh (nu c) c gi l vng RAM cao.
Bn cnh cc b nh, bn trong mi chip 8051 cn c mt tp hp cc thanh
ghi chc nng c bit (SFR Special Function Register). Cc thanh ghi ny lin
quan n hot ng ca cc ngoi vi onchip (cc cng vo ra, timer, ngt ...). a
ch ca chng trng vi di a ch ca vng SRAM cao, tc l cng c a ch t
80h n FFh.

 cng bi ging 8051 Starter Kit

Vng RAM cao,


c a ch t 80h
n FFh

Vng SFR, cng


c a ch t 80h
n FFh

Vng RAM thp


c a ch t 00h
n 7Fh
Vy khi truy cp vo mt a ch thuc di t 00h n 7Fh th s truy cp n
nh thuc vng RAM thp. Tuy nhin khi truy cp n mt a ch x thuc di t
80h n FFh th xy ra vn cn gii quyt: s truy cp n thanh ghi SFR a
ch x hay truy cp n nh a ch x ca vng RAM cao? Nh sn xut quy nh
rng, trong trng hp ny, nu kiu truy cp s dng ch a ch trc tip th s
truy cp vo vng SFR, ngc li nu kiu truy cp s dng ch a ch gin tip
th s truy cp vo vng RAM cao.
B nh d liu RAM onchip thng dng cha cc bin tm thi trong
qu trnh vi iu khin hot ng, cng l ni dnh cho ngn xp hot ng.
Khng gian d liu 64Kbyte c trng hon ton v ch dng c khi ghp ni
vi b nh d liu bn ngoi. Khi ghp ni thm b nh d liu bn ngoi, dung
lng ca cc b nh ny s chim dn cc v tr trong khng gian, tuy nhin khng
h nh hng n 128byte RAM onchip.
Ngn xp trong 8051 lin quan n mt thanh ghi tn l con tr ngn xp SP
(Stack Pointer). Thanh ghi ny lun tr vo nh ca ngn xp, tc l n cha a
ch ca v tr ngay st v tr c th lu a ch/d liu tip theo vo. Khi ct 1 byte a
ch/d liu vo ngn xp, SP t ng tng ln 1 n v sau mi ct a ch/d
liu vo nh c a ch bng vi gi tr ca SP sau khi tng. Khi ly 1 byte a
ch/d liu ra khi ngn xp, gi tr s c ly ra sau SP mi t ng tr i 1
n v. Gi tr sau khi reset ca SP l 0x07, do quy nh ngn xp s ct d liu
t a ch 0x08 tr i. Tuy nhin do c tnh hot ng bnh trng theo chiu tng
a ch m ngn xp thng c b tr ln vng trn cng ca b nh RAM onchip
trnh tranh chp vi cc bin lu trong RAM.

 cng bi ging 8051 Starter Kit

Hnh nh minh ha b nh d liu

0x7F
Vng RAM
thng (khng
nh a ch bit
c)
0x30
Vng RAM 16
byte c th nh
a ch bit t
0x00 n 0x7F

0x2F

4 bng thanh ghi


mi bng c 8
thanh ghi R0..7

0x1F

0x20

8052 c
thm vng
RAM cao
(a ch
cng t
0x80 n
0xFF)
nhng
truy nhp
phi theo
ch a
ch gin
tip
phn bit
vi vng
SFR

0x00

y l vng cc
thanh ghi chc
nng c bit SFR
(Special Function
Register) c c
8051 v 8052.
Truy nhp
(ghi/c) vng ny
l truy nhp vo
cc a ch t 0x80
n 0xFF nhng
phi theo ch
a ch trc tip

 cng bi ging 8051 Starter Kit

Bn cc thanh ghi chc nng c bit SFR

 cng bi ging 8051 Starter Kit


Cng vo ra song song (I/O Port)
8051 c 4 cng vo ra song song, c tn ln lt l P0, P1, P2 v P3. Tt c
cc cng ny u l cng vo ra hai chiu 8bit. Cc bit ca mi cng l mt chn
trn chip, nh vy mi cng s c 8 chn trn chip.
Hng d liu (dng cng lm cng ra hay cng vo) l c lp gia cc
cng v gia cc chn (cc bit) trong cng mt cng. V d, ta c th nh ngha
cng P0 l cng ra, P1 l cng vo hoc ngc li mt cch ty , vi c 2 cng P2
v P3 cn li cng vy. Trong cng mt cng P0, ta cng c th nh ngha chn
P0.0 l cng vo, P0.1 li l cng ra ty .
Lin quan n mi cng vo/ra song song ca 8051 ch c mt thanh ghi
SFR ( thanh ghi chc nng c bit) c tn trng vi tn ca cng. Ta c cc thanh
ghi P0 dng cho cng P0, thanh ghi P1 dng cho cng P1 y l cc thanh ghi
nh a ch n tng bit (bit addressable), do ta c th dng cc lnh tc ng
bit i vi cc bit ca cc thanh ghi ny. Mi thanh ghi ny gm 8 bit tng ng vi
cc chn (bit) ca cng . Khi mt chn (bit) cng no c dng lm cng vo
th trc bit tng ng trong thanh ghi SFR phi c t mc 1. Nu mt
chn (bit) cng no c dng lm cng ra th gi tr ca bit tng ng trong
thanh ghi SFR s l gi tr lgic mun a ra chn cng . Nu mun a ra mc
lgic cao (in p gn 5V), bit tng ng trong thanh ghi phi c t bng 1,
hin nhin nu mun a ra mc lgic thp (in p gn 0V) th bit tng ng trong
thanh ghi phi c t bng 0. Nh ni trn, cc bit trong thanh ghi cng c
th c t bng 1/0 m khng lm nh hng n cc bit cn li trong cng
bng cch dng cc lnh setb (t ln 1) hay clr (t v 0).
Sau khi t mt chn cng lm cng vo, ta c th dng cc lnh kim tra bit
c vo v kim tra cc mc lgic ca mch ngoi ang p vo l mc 0 hay
mc 1. Cc lnh ny l jb (nhy nu bit bng 1), jnb (nhy nu bit bng 0).
Mi cng c cu trc gm mt latch (chnh l cc bit ca thanh ghi cng),
mch li u ra (output driver) v mch m u vo (input buffer).
Ngoi chc nng vo/ra thng thng, mt s cng cn c tch hp thm
chc nng ca mt s ngoi vi khc. Xem bng lit k sau:

Cc chn cng P1.0 v P1.1 c tch hp vi cc tn hiu ca timer2 trong


trng hp chip l 8052.
Khi dng vi cc chc nng ca cc ngoi vi, chn cng tng ng phi
c t ln 1. Nu khng cc tn hiu s lun b ghim mc 0.

 cng bi ging 8051 Starter Kit


S ca mch ca mt chn cng:

Cng P0 khng c in tr treo cao (pullup resistor) bn trong, mch li to


mc cao ch c khi s dng cng ny vi tnh nng l bus dn knh a ch/d liu.
Nh vy vi chc nng ra thng thng, P0 l cng ra open drain, vi chc nng
vo, P0 l cng vo cao tr (high impedance). Nu mun s dng cng P0 lm
cng vo/ra thng thng, ta phi thm in tr pullup bn ngoi. Gi tr in tr
pullup bn ngoi thng t 4K7 n 10K.
Cc cng P1, P2 v P3 u c in tr pullup bn trong, do c th dng
vi chc nng cng vo/ra thng thng m khng cn c thm in tr pullup bn
ngoi. Thc cht, in tr pullup bn trong l cc FET, khng phi in tr tuyn
tnh thng thng, tuy vy nhng kh nng phun dng ra ca mch li khi u ra
mc cao (hoc khi l u vo) rt nh, ch khong 100 micro Ampe. Trong
datasheet ca AT89S5x (mt trong nhng bin th ca h 8051 do Atmel sn xut)
c thng k s liu nh sau:

 cng bi ging 8051 Starter Kit


Theo , nu ta thit k cc cng phi cung cp cho ti u ra mc cao
mt lng dng in IOH = 60 micro Ampe th mc in p u ra VOH s b ko
st xung, ch c th m bo t 2.4V tr ln bi nh sn xut, khng th cao st
vi 5V nh l thuyt.
Trong khi , kh nng nut dng ca mch li khi u ra mc thp li cao
hn rt nhiu, c th t t vi n hng chc mili Ampe.

Nh vy, khi thit k vi cc phn t bn ngoi, ta nn n c tnh


vo/ra ca cc chn cng. V d khi dng ghp ni vi LED n hoc LED 7
thanh, ta nn thit k chn cng nut dng t LED lm LED sng (cng ni vi
Cathode ca LED), khng nn thit k chn cng phun dng cho LED lm LED
sng (cng ni vi Anode ca LED).

Cng vo ra ni tip (Serial Port)


Cng ni tip trong 8051 ch yu c dng trong cc ng dng c yu cu
truyn thng vi my tnh, hoc vi mt vi iu khin khc. Lin quan n cng ni
tip ch yu c 2 thanh ghi: SCON v SBUF. Ngoi ra, mt thanh ghi khc l thanh
ghi PCON (khng nh a ch bit) c bit 7 tn l SMOD quy nh tc truyn ca
cng ni tip c gp i ln (SMOD = 1) hay khng (SMOD = 0).
D liu c truyn nhn ni tip thng qua hai chn cng P3.0(RxD) v
P3.1(TxD).
Thanh ghi SBUF l thanh ghi 8bit cha d liu truyn hoc nhn. V thc
cht c hai thanh ghi d liu khc nhau, mt dnh cha d liu truyn i, mt
cha d li nhn c. C hai thanh ghi ny u c chung mt tn l SBUF, tuy
nhin CPU hon ton phn bit c mt cch d dng. Khi ta mun truyn d liu
i, ta phi ghi vo thanh ghi SBUF (v d vit lnh mov SBUF,a), cn khi mun c
kim tra d liu nhn v ta phi c thanh ghi SBUF (v d vit lnh mov a,SBUF).
CPU s cn c vo vic thanh ghi SBUF nm v tr ton hng ch (ton hng bn
tri) hay ton hng ngun (ton hng bn phi) quyt nh s truy nhp (c/ghi)
thanh ghi SBUF no. Ngi lp trnh khng cn phi quan tm x l vn ny.
Thanh ghi quy nh ch hot ng v iu khin cng ni tip l thanh ghi SCON
(nh a ch bit).
SM0

SM1

SM2

REN

TB8

RB8

TI

RI

Bit SM0, SM1, SM2 quy nh ch hot ng ca cng ni tip. Thng thng
truyn thng gia 2 vi iu khin hoc gia 1 vi iu khin v 1 my tnh, gi tr ca
bit SM2 c t bng 0. Khi truyn thng theo kiu mng a vi x l
(multiprocessor communication), SM2 c t bng 1. Hai bit SM0 v SM1 thc
s l cc bit quy nh ch hot ng ca cng ni tip, chng to ra 4 t hp
(00,01,10 v 11) ng vi 4 ch hot ng m t trong bng sau.
10

 cng bi ging 8051 Starter Kit

SM0
0
0
1
1

SM1
0
1
0
1

Ch
0 - ng b
1 - D b
2 - D b
3 - D b

Khung d liu
8 bit SBUF
8 bit SBUF
8bit SBUF + RB8/TB8
8bit SBUF + RB8/TB8

Baud rate
Fosc/12
Thay i c
Fosc/32 hoc Fosc/64
Thay i c

Ch 0: l ch truyn ng b duy nht. Chn RxD s l tn hiu truyn/nhn


d liu, chn TxD l tn hiu xung nhp. Bit LSB (bit 0) ca d liu c truyn i
trc tin. Tc truyn c nh v bng 1/12 gi tr thch anh.
Ch 1: l ch truyn d b 8 bit. D liu 8 bit c ng khung bi mt bit
Start (= 0) u v mt bit Stop (=1) cui trc khi c truyn i. Tc truyn
thay i c theo ngi lp trnh.
Ch 2: l ch truyn d b 9 bit. D liu 9 bit c ghp thnh bi 8bit trong
thanh ghi SBUF v bit RB8 (trng hp nhn v) hoc TB8 (trng hp truyn i)
trong thanh ghi SCON. Ngoi ra cc bit Start v Stop vn c gn bnh u v
cui khung truyn. Trong ch ny, tc truyn ch c th chn c 1 trong 2
mc: 1/32 hoc 1/64 gi tr ca thch anh (ty thuc vo gi tr ca bit SMOD trong
thanh ghi PCON ni trn).
Ch 3: cng l ch truyn d b 9 bit, khc vi ch 2 ch tc truyn c
th thay i c theo ngi lp trnh nh trong ch 1.
Bit REN trong thanh ghi SCON l bit cho php nhn d liu. D liu ch c nhn
qua cng ni tip khi bit ny = 1.
Bit TB8 l bit d liu th 9 trong trng hp truyn i 9 bit (8 bit kia trong thanh ghi
SBUF).
Bit RB8 l bit d liu th 9 trong trng hp nhn v 9 bit (8 bit kia trong thanh ghi
SBUF).
Bit TI l c ngt truyn, bo hiu vic truyn 1 khung d liu hon tt.
Bit RI l c ngt nhn, bo hiu vic nhn 1 khung d liu hon tt.
to ra tc truyn (Baud rate) ca cng ni tip trong 8051, phi dng
n timer1 ch Auto Reload 8bit. Gi tr np li cha trong thanh ghi TH1 c
tnh ton theo cng thc sau (ph thuc vo Baud rate mong mun v gi tr ca
thch anh).

Tm li s dng cng ni tip ca 8051, hy thc hin cc bc sau:


- Chn ch cho cng ni tip (ng b/d b, 8bit/9bit...), t chn c
gi tr cho cc bit trong thanh ghi SCON. Lu xa cc bit TI v RI.
11

 cng bi ging 8051 Starter Kit


-

Chn tc truyn mong mun, t tnh ra gi tr ca thanh ghi TH1. Cho


timer1 chy ch Auto Reload 8bit (khng dng ngt trn timer1).
t mc u tin ngt v cho php ngt cng ni tip nu mun.
Bt u qu trnh truyn d liu bng mt lnh ghi d liu mun truyn vo
thanh ghi SBUF. Qu trnh truyn kt thc th c TI s t ng t ln 1.
Khi mt khung d liu c nhn y , c RI s t ng t ln 1 v
ngi lp trnh lc ny c th dng lnh c thanh ghi SBUF ly d liu
nhn c ra x l.

Ngt (Interrupt)
8051 ch c mt s lng kh t cc ngun ngt (interrupt source) hoc c
th gi l cc nguyn nhn ngt. Mi ngt c mt vector ngt ring, l mt a ch
c nh nm trong b nh chng trnh, khi ngt xy ra, CPU s t ng nhy n
thc hin lnh nm ti a ch ny. Bng tm tt cc ngt trong 8051 nh sau:
STT

Tn ngt

1 INT0
2 Timer0

3 INT1
4 Timer1

5 Serial Port

M t

C
ngt
Ngt ngoi 0 khi c tn IE0
hiu tch cc theo kiu
chn chn P3.2
Ngt trn timer0 khi TF0
gi tr timer0 trn t
gi tr max v gi tr
min
Ngt ngoi 1 khi c tn IE1
hiu tch cc theo kiu
chn chn P3.3
Ngt trn timer1 khi TF1
gi tr timer1 trn t
gi tr max v gi tr
min
Ngt cng ni tip khi TI, RI
vi iu khin nhn
hoc truyn xong mt
byte bng cng ni
tip

Thanh ghi Vector ngt


cha c
TCON
0x0003
TCON

0x000B

TCON

0x0013

TCON

0x001B

SCON

0x0023

Vi 8052, ngoi cc ngt trn cn c thm ngt ca timer2 (do vi iu khin


ny c thm timer2 trong s cc ngoi vi onchip).
Mi ngt c dnh cho mt vector ngt ko di 8byte. V mt l thuyt, nu
chng trnh ngn, m to ra cha trong 8 byte, ngi lp trnh hon ton c
th t phn chng trnh x l ngt ngay ti vector ngt. Tuy nhin trong hu ht
cc trng hp, chng trnh x l ngt c dung lng m to ra ln hn 8byte
nn ti vector ngt, ta ch t lnh nhy ti chng trnh x l ngt nm vng nh
khc. Nu khng lm vy, m chng trnh x l ngt ny s ln sang, vo
vector ngt k cn.
12

 cng bi ging 8051 Starter Kit


Lin quan n ngt ch yu c hai thanh ghi l thanh ghi IE v thanh ghi IP.

cho php mt ngt, bit tng ng vi ngt v bit EA phi c t


bng 1. Thanh ghi IE l thanh ghi nh a ch bit, do c th dng cc lnh tc
ng bit tc ng ring r ln tng bit m khng lm nh hng n gi tr cc
bit khc. C ngt hot ng c lp vi vic cho php ngt, iu c ngha l c
ngt s t ng t ln bng 1 khi c s kin gy ngt xy ra, bt k s kin c
c cho php ngt hay khng. Do vy, trc khi cho php mt ngt, ta nn xa c
ca ngt m bo sau khi cho php, cc s kin gy ngt trong qu kh
khng th gy ngt na. V d trc khi cho php ngt timer0 m timer 0 chy
v trn (d l trn mt hay nhiu ln) th c TF0 s bng 1, nu sau ta cho php
ngt timer0 th s gy ra ngt ngay do c trn ang bng 1 (s kin trn gy ngt
trong trng hp ny l trn trong qu kh, khng phi s kin ta quan tm n). V
vy hy xa c TF0 trc khi cho php ngt trn timer0.
Ngoi tr c ca ca ngt ni tip (v c ca ngt timer2 trong 8052), cc c
ngt khc u t ng c xa khi CPU thc hin chng trnh phc v ngt. L
do l ngt cng ni tip (v ngt timer2 trong 8052) c gy ra bi 2 nguyn nhn
(c 2 c cho mi ngt), khi xy ra ngt, ngi lp trnh cn phi kim tra xem c
no c t bng 1 phn bit nguyn nhn gy ra ngt l nguyn nhn no
x l thch hp. V d ngt cng ni tip l ngt c gy ra bi 1 trong 2
nguyn nhn: vi iu khin nhn xong hoc truyn xong mt byte d liu qua cng
ni tip. Xy ra s kin no th c ngt tng ng s t ng c t ln bng 1,
nu nhn xong th c RI bng 1, nu truyn xong th c TI bng 1. Trong chng
trnh x l ngt, ngi lp trnh phi kim tra c TI hay c RI bng 1 quyt nh
x l ngt truyn hay x l ngt nhn. Sau khi kim tra, ngi lp trnh phi vit
lnh xa c v vic ny khng c CPU thc hin t ng nh cc c ngt
khc.

13

 cng bi ging 8051 Starter Kit


Ni n ngt khng th khng ni n mc u tin ca ngt. Mc u tin
ca ngt y c th c hiu l s phn bc, quyt nh x l ngt no khi hai
hay nhiu ngt xy ra. C 2 c ch phn bc u tin. Th nht l c ch phn bc
dnh cho cc ngt xy ra ng thi, hai ngt A v B xy ra cng mt thi im nhn
t pha vi iu khin. Th hai l c ch phn bc dnh cho cc ngt xy ra xen k
nhau, trong khi ang x l ngt A th ngt B xy ra, vy th trong tng trng hp,
CPU s x l ra sao? Hy xem di y.
Vi trng hp cc ngt xy ra ng thi, CPU s xem xt mc u tin ca
cc ngt , t quyt nh x l ngt c mc u tin cao hn trc. Mc u tin
trong trng hp ny l mc u tin cng (c quy nh bi nh sn xut, bi cu
trc sn c ca 8051 v ngi lp trnh khng th thay i c).

Nhn vo bng trn ta thy ngt INT0 l ngt c mc u tin cao nht v ngt
timer2 l ngt c mc u tin thp nht trong s cc ngt. Nh vy nu ngt ngoi
1 v ngt timer0 cng xy ra mt lc, ngt timer0 s c CPU x l trc, sau
mi x l ngt ngoi 1.
Vi trng hp xy ra ngt xen k, khi CPU ang x l ngt A m ngt B xy
ra, CPU s gii quyt theo 2 hng: tip tc x l ngt A nu mc u tin ca ngt
B khng cao hn mc u tin ca ngt A, hoc s dng vic x l ngt A li,
chuyn sang x l ngt B nu mc u tin ca ngt B cao hn mc u tin ca
ngt A. Mc u tin cho cc ngt trong trng hp ny khng phi l mc u tin
cng do nh sn xut quy nh (tc l khng cn c vo bng trn) m l do ngi
lp trnh t. Lp trnh vin c th dng thanh ghi IP quy nh mc u tin cho
cc ngt mt trong hai mc: mc cao v mc thp. t mc u tin ca mt
ngt (trong trng hp xy ra xen k) mc cao, ta t bit tng ng vi ngt
trong thanh ghi IP bng 1, mc thp ng vi gi tr bit = 0.
Thanh ghi IP (Interrupt Priority)
PT2

PS

PT1

PX1

PT0

PX0

Cc bit trong thanh ghi IP tng ng vi cc ngt ng nh trong thanh ghi


IE (bit PX0 dnh cho ngt ngoi 0, bit PT0 dnh cho ngt timer 0)

14

 cng bi ging 8051 Starter Kit


Mt iu d nhn ra l nu mt ngt c t mc u tin cao (bit tng
ng trong thanh ghi IP bng 1) th s chng c ngt no c th xen vo qu trnh x
l n c na.
Ni v mc u tin ngt, c th dng mt v d tng qut sau, gi s hai ngt
timer0 v ngt cng ni tip cng c cho php (cc bit tng ng v bit EA trong
thanh ghi IE c t bng 1), bit PT0 = 0, bit PS = 1 th:
- Nu hai ngt cng xy ra, ngt timer0 s thng th v c phc v trc.
- Nu ngt cng ni tip xy ra trc v ang c x l th ngt timer0 nu
c xy ra cng khng th chen vo, lm dng qu trnh x l ngt cng ni
tip c.
- Nu ngt timer0 xy ra trc v ang c x l m ngt cng ni tip xy
ra th CPU s phi dng vic x l ngt timer0 li, chuyn sang x l ngt
cng ni tip, x l xong mi quay li x l tip ngt timer0.
Nh ni trn, 8051 c 2 ngt ngoi l INT0 v INT1. Ngt ngoi c
hiu l ngt c gy ra bi s kin mc lgic 0 (mc in p thp, gn 0V) hoc
sn xung (s chuyn mc in p t mc cao v mc thp) xy ra chn ngt
tng ng (P3.2 vi ngt ngoi 0 v P3.3 vi ngt ngoi 1). Vic la chn kiu ngt
c thc hin bng cc bit IT (Interrupt Type) nm trong thanh ghi TCON. y l
thanh ghi iu khin timer nhng 4 bit LSB (bit0..3) c dng cho cc ngt ngoi.

Khi bit ITx = 1 th ngt ngoi tng ng c chn kiu l ngt theo sn
xung, ngc li nu bit ITx = 0 th ngt ngoi tng ng c s c kiu ngt l
ngt theo mc thp. Cc bit IE l cc bit c ngt ngoi, ch c tc dng trong trng
hp kiu ngt c chn l ngt theo sn xung.
Khi kiu ngt theo sn xung c chn th ngt s xy ra duy nht mt ln
khi c sn xung ca tn hiu, sau khi tn hiu mc thp, hoc c sn ln,
hoc mc cao th cng khng c ngt xy ra na cho n khi c sn xung tip
theo. C ngt IE s dng ln khi c sn xung v t ng b xa khi CPU bt u
x l ngt.
Khi kiu ngt theo mc thp c chn th ngt s xy ra bt c khi no tn
hiu ti chn ngt mc thp. Nu sau khi x l xong ngt m tn hiu vn mc
thp th li ngt tip, c nh vy cho n khi x l xong ngt ln th n , tn hiu
ln mc cao ri th thi khng ngt na. C ngt IE trong trng hp ny khng c
ngha g c.
Thng thng kiu ngt hay c chn l ngt theo sn xung.

B nh thi/B m (Timer/Counter)
8051 c 2 timer tn l timer0 v timer1. Cc timer ny u l timer 16bit, gi
tr m max do bng 216 = 65536 (m t 0 n 65535).
15

 cng bi ging 8051 Starter Kit


Hai timer c nguyn l hot ng hon ton ging nhau v c lp. Sau khi
cho php chy, mi khi c thm mt xung ti u vo m, gi tr ca timer s t
ng c tng ln 1 n v, c nh vy cho n khi gi tr tng ln vt qu gi tr
max m thanh ghi m c th biu din th gi tr m li c a tr v gi tr min
(thng thng min = 0). S kin ny c hiu l s kin trn timer (overflow) v c
th gy ra ngt nu ngt trn timer c cho php (bit ETx trong thanh ghi IE = 1).
Vic cho timer chy/dng c thc hin bi cc bit TR trong thanh ghi
TCON (nh a ch n tng bit).

Khi bit TRx = 1, timerx s m, ngc li khi TRx = 0, timerx s khng m


mc d vn c xung a vo. Khi dng khng m, gi tr ca timer c gi
nguyn.
Cc bit TFx l cc c bo trn timer, khi s kin trn timer xy ra, c s c
t ng t ln bng 1 v nu ngt trn timer c cho php, ngt s xy ra. Khi
CPU x l ngt trn timerx, c ngt TFx tng ng s t ng c xa v 0.
Gi tr m 16bit ca timerx c lu trong hai thanh ghi THx (byte cao) v
TLx (byte thp). Hai thanh ghi ny c th ghi/c c bt k lc no. Tuy nhin
nh sn xut khuyn co rng nn dng timer (cho bit TRx = 0) trc khi ghi/c
cc thanh ghi cha gi tr m.
Cc timer c th hot ng theo nhiu ch , c quy nh bi cc bit
trong thanh ghi TMOD (khng nh a ch n tng bit).

16

 cng bi ging 8051 Starter Kit

xc nh thi gian, ngi ta chn ngun xung nhp (clock) a vo m


trong timer l xung nhp bn trong (dnh cho CPU). Ngun xung nhp ny thng rt
u n (c tn s n nh), do t s m ca timer ngi ta c th nhn vi
chu k xung nhp tnh ra thi gian tri qua. Timer lc ny c gi chnh xc vi
ci tn timer, tc b nh thi.
m cc s kin bn ngoi, ngi ta chn ngun xung nhp a vo m
trong timer l tn hiu t bn ngoi ( c chun ha v dng xung vung
0V/5V). Cc tn hiu ny s c ni vi cc bit cng c dn knh thm cc tnh
nng T0/T1/T2. Khi c s kin bn ngoi gy ra thay i mc xung u vo m,
timer s t ng tng ln 1 n v ging nh trng hp m xung nhp bn trong.
Lc ny, timer c gi chnh xc vi ci tn khc: counter, tc b m (s kin).
Nhn vo bng m t thanh ghi TMOD bn trn, ta c th nhn thy c 2 b 4
bit ging nhau (gm GATEx, C/Tx, Mx0 v Mx1) dnh cho 2 timer0 v 1. ngha
cc bit l nh nhau i vi mi timer.
Bit GATEx quy nh vic cho php timer m (run timer). Nu GATEx = 0,
timerx s m khi bit TRx bng 1, dng khi bit TRx bng 0. Nu GATEx = 1, timerx
s ch m khi bit TRx = 1 v tn hiu ti chn INTx = 1, dng khi mt trong hai iu
kin trn khng cn tha mn. Thng thng ngi ta dng timer vi GATE = 0, ch
dng timer vi GATE = 1 trong trng hp mun o rng xung v lc timer s
ch m thi gian khi xung a vo chn INTx mc cao.
Bit C/Tx quy nh ngun clock a vo m trong timer. Nu C/Tx = 0, timer
s c cu hnh l b nh thi, nu C/Tx = 1, timer s c cu hnh l b m
s kin.
Hai bit cn li (Mx0 v Mx1) to ra 4 t hp cc gi tr (00,01,10 v 11) ng vi 4
ch hot ng khc nhau ca timerx. Trong 4 ch thng ch dng ch
timer/counter 16bit (Mx1 = 0, Mx0 = 1) v ch Auto Reload 8bit timer/counter
(Mx1 = 1, Mx0 = 0).
Trong ch timer/counter 16bit, gi tr m (cha trong hai thanh ghi THx
v TLx) t ng c tng ln 1 n v mi ln nhn c thm mt xung nhp. Khi
gi tr m tng vt qu gi tr max = 65535 th s trn v 0, c ngt TFx c t
ng t = 1. Ch ny c dng trong cc ng dng m thi gian v m s
kin.
Trong ch Auto Reload 8bit, gi tr m s ch c cha trong thanh ghi
TLx, cn gi tr ca thanh ghi THx bng mt s n (t 0 n 255) do ngi lp trnh
a vo. Khi c thm 1 xung nhp, gi tr m trong TLx ng nhin cng tng ln
1 n v nh bnh thng. Tuy nhin trong trng hp ny, gi tr m ln nht l
255 ch khng phi 65535 nh trng hp trn v timer/counter ch cn 8bit. Do
vy s kin trn lc ny xy ra nhanh hn, ch cn vt qu 255 l gi tr m s
trn. C ngt TFx vn c t ng t = 1 nh trong trng hp trn 16bit. im
khc bit l thay v trn v 0, gi tr THx s c t ng np li (Auto Reload) vo
thanh ghi TLx, do timer/counter sau khi trn s c gi tr bng n (gi tr cha
trong THx) v s m t gi tr n tr i. Ch ny c dng trong vic to Baud
rate cho truyn thng qua cng ni tip.

17

 cng bi ging 8051 Starter Kit

s dng timer ca 8051, hy thc hin cc bc sau:


- Quy nh ch hot ng cho timer bng cch tnh ton v ghi gi tr cho
cc bit trong thanh ghi TMOD.
- Ghi gi tr m khi u mong mun vo 2 thanh ghi m THx v TLx. i
khi ta khng mun timer/counter bt u m t 0 m t mt gi tr no
thi im trn gn hn, hoc chn hn trong tnh ton sau ny. V d nu
cho timer m t 15535 th sau 50000 xung nhp (tc 50000 micro giy vi
thch anh 12MHz) timer s trn, v thi gian mt giy c th d dng tnh ra
kh chnh xc = 20 ln trn ca timer (ng nhin mi ln trn li phi np
li gi tr 15535).
- t mc u tin ngt v cho php ngt trn timer (nu mun).
- Dng bit TRx trong thanh ghi TCON cho timer chy hay dng theo
mun.

18

 cng bi ging 8051 Starter Kit

Chng II: Cc ngn ng lp trnh cho vi iu khin


Trong k thut vi x l ni chung, ngn ng lp trnh thng c chia lm 2
loi: Ngn ng bc thp v Ngn ng bc cao.
Ngn ng bc thp l ngn ng my hoc ngn ng gn vi my. Ngn ng
my l ngn ng bc thp nht, chnh l m my dng nh phn. Lp trnh vi
ngn ng ny ng ngha vi vic lp trnh vin phi vit tng bit 0/1 cho tng m
lnh c th, ng nhin l vic rt vt v v kh khn. K n l ngn ng gn
vi my, chnh l hp ng (Assembly). Vi ngn ng ny, lp trnh vin c th vit
cc lnh c th dng k t, tun theo mt tp hp cc k t nht nh gi l tp
lnh. Ni cch khc, cp ny, lp trnh vin s vit cc lnh dng m gi nh
(mnemonic) thay v phi vit cc bit 0/1 cho cc m lnh c th. Trnh hp ng
(Assembler) - mt phn mm trn my tnh - s m nhim vic dch cc lnh do lp
trnh vin vit dng m gi nh sang dng m my 0/1.
Ngn ng bc cao l cc ngn ng gn vi ngn ng con ngi hn, do
vic lp trnh bng cc ngn ng ny tr nn d dng v n gin hn. C th k
n mt s ngn ng lp trnh bc cao nh C, Basic, Pascal trong C l ngn
ng thng dng hn c trong k thut vi x l. V bn cht, s dng cc ngn ng
ny thay cho ngn ng bc thp l s gim ti cho lp trnh vin trong vic nghin
cu cc tp lnh v xy dng cc cu trc gii thut. Chng trnh vit bng ngn
ng bc cao cng s c mt phn mm trn my tnh gi l trnh bin dch
(Compiler) chuyn sang dng hp ng trc khi chuyn sang m my.
Mi loi ngn ng c u v nhc im ring.
Vi hp ng (i din cho ngn ng bc thp):
u im: m my sinh ra rt ngn gn, thi gian x l ca CPU v
th cng c gim thiu, trnh hp ng (Assembler) ca cc h vi
iu khin u min ph i vi ngi s dng.
Nhc im: kh khn trong vic tip cn vi tp lnh (tuy dng
m gi nh nhng vn cha thc s gn vi ngn ng con ngi),
cc cu trc gii thut (ifelse, for, switchcase) hu ht khng
c sn, v vy qu trnh lp trnh kh khn, mt nhiu thi gian v
cng sc, vic k tha v pht trin l gn nh khng th.
Vi ngn ng C (i din cho ngn ng bc cao):
u im: ngn ng gn vi ngn ng con ngi, cc cu trc gii
thut c sn, do to s thun tin, d dng trong s din t thut
ton, vic k tha v pht trin l kh thi, tn t thi gian.

19

 cng bi ging 8051 Starter Kit


-

Nhc im: m my sinh ra thng di hn so vi hp ng (tt


nhin cng cn ty vo nng lc ca lp trnh vin), thi gian x l
ca CPU v th cng di hn, cc trnh bin dch (Compiler) ty theo
cp ti u m c thit k v bn vi gi rt cao.
Trong thc t hin nay, cc vi iu khin c ti nguyn (resourse) ni chung
v b nh (memory) ni ring rt phong ph v di do. Mt khc cc trnh bin
dch (Compiler) cng c thit k ngy cng ti u, h tr rt nhiu cc thao tc
x l gii thut, cho php trn lnh hp ng vo nhng tnh hung yu cu kht khe
v mt thi gian v lng m my sinh ra. Chnh v th yu cu v ti gin m my
khi lp trnh khng cn qu bc xc nh trc kia. S dng ngn ng bc cao gip
rt ngn rt nhiu thi gian nghin cu, thit k sn phm trc khi a ra th
trng (time to market), nng cao kh nng k tha, pht trin, ci tin cc tnh
nng sn phm, t ko di chu k sng (life time) ca sn phm trn th trng.
l l do ti sao ngn ng bc cao (in hnh l ngn ng C) l s la chn ca
hu ht nhng ngi tc nghip trn lnh vc k thut vi x l.

20

 cng bi ging 8051 Starter Kit

Chng III: Hng dn s dng trnh bin dch Keil C


cho h vi iu khin 8051
Trong s cc trnh bin dch C (C Compiler) cho h vi iu khin 8051, Keil C
l mt trnh bin dch ti u, c s dng rng ri. Chng ny ch yu hng
dn s dng trnh bin dch ny trong vic thit k phn mm cho h vi iu khin
8051.
Ci t
Keil C chy c trn cc H iu hnh Win98, Windows2000, WindowsME,
WindowsXP. ci t, hy chy file setup.exe trong th mc Setup ca Keil C trn
a CD km theo. Tip hy theo cc ch dn ca giao din ci t.
To mt Project mi

Tip g tn project vo hp thoi. Chn ng dn v bm OK.

21

 cng bi ging 8051 Starter Kit

Chn tip loi vi iu khin s s dng (trong trng hp ny l AT89S52).

Chn cu tr li No khi c hi Copy Standart Startup Code to Project


Folder and Add File to Project?

22

 cng bi ging 8051 Starter Kit


To mt file mi

Sau khi Keil to cho ta mt file mc nh dng Text, hy Save File li di


dng mong mun (*.c nu l file m ngun, hoc *.h nu l file header).
Mt Project ch yu s dng hai loi file ni trn.
Tip thc hin son tho cc file theo mun.

23

 cng bi ging 8051 Starter Kit


Cu trc mt chng trnh

Mt s lu khi lp trnh vi Keil C


Khai bo cc file header
Khi s dng loi vi iu khin 8051 no ( la chn trong khi to Project
mi) th phi s dng file header ca loi . Trong trng hp ny ta s dng file
AT89X52.H cho vi iu khi AT89S52. Cc file header c tm trong th mc
C51\INC\ ca Keil C ci ra.
nh ngha hng s trong b nh chng trnh
unsigned char code <tn bin>;
V d nh ngha mt mng 3 hng s:
unsigned char code array[3] = {1,2,3};
nh ngha cc chng trnh con phc v ngt
void <tn chng trnh> (void) interrupt <tn Vector ngt>
<tn chng trnh> do lp trnh vin ty t.
<tn Vector ngt> c tra phn cui file header (AT89X52.H).
Khng nn vit lnh dng biu thc di m nn tch ra thnh tng php tnh nh
thc hin ln lt.

24

 cng bi ging 8051 Starter Kit


Cc tnh nng khc ging nh ANSI C.
Bin dch Project
to ra file m my dng *.hex np vo chip, click chut phi nh hnh v.

Trong hp thoi hin ra, hy check vo Creat Hex File nh ch dn.

25

 cng bi ging 8051 Starter Kit


Cui cng chn theo Menu nh hnh nh, hoc bm phm F7.

File m my *.hex to ra s nm trong cng mt th mc vi cc file khc ca


Project.
S dng phn mm SPI Flash Programmer c sn trn a CD km theo m
file m my (bng nt Open) v np xung chip (nt Program). Phn mm ny chy
trc tip khng cn ci t v chy tt nht trn cc Win98, 2000 v ME, vi
WindowsXP i khi khng tng thch mt s rt t cc trng hp.

26

 cng bi ging 8051 Starter Kit

ChngIV: Hng dn thc hnh mt s bi th nghim mu


vi 8051 Starter Kit
Bi 1: Ghp ni vi LED n Light Emitting Diode
Nguyn l thit k

LED n c ni trc tip vi cng vo ra ca vi iu khin AT89, s dng


in tr hn dng 470 Ohm. Vi iu khin a ra mc logic 0 lm n sang, mc
logic 1 lm n tt.
V d: Thc hin nhp nhy LED.
// Khai bao cac file header
#include
<AT89X52.H>
#include
<Kit8051.h>
// Khai bao cac ham
void Delay(unsigned int n);
void InitSystem(void);
// Dinh nghia cac ham
void Delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
27

 cng bi ging 8051 Starter Kit


}
void InitSystem(void)
{
LCD_E = 0;
}
// Chuong trinh chinh
void main(void)
{
// Khoi tao he thong
InitSystem();
// Vong lap vo tan
while(1)
{
P0 = ~P0;
Delay(1000);
}
}

28

 cng bi ging 8051 Starter Kit

Bi 2: Ghp ni vi LED 7 thanh 7 Segment LED


Nguyn l thit k

LED 7 thanh s dng l loi Anode chung. Cc LED 7 thanh c ni chung


chn d liu vi nhau v ni vi mt cng vo ra 8 bit ca vi iu khin. Vic cp
in cho tng LED c thc hin bi cc transistor, iu khin bi cc chn vo
ra khc ca vi iu khin AT89. Cc LED c cp ngun cho sng cc thi im
khc nhau, vic qut cc LED ny c thc hin lin tc, do hin tng nh lu
vng mc m con ngi nhn thy cc LED hin th mt cch lin tc.
V d: Hin th 4 s 1234 4 LED 7 thanh.
// Khai bao cac file header
#include
<AT89X52.H>
#include
<Kit8051.h>

29

 cng bi ging 8051 Starter Kit


// Khai bao cac bien toan cuc
unsigned char code LED_code[] = {Number0,
Number1,
Number2,
Number3,
Number4,
Number5,
Number6,
Number7,
Number8,
Number9};
// Khai bao cac ham
void Delay(unsigned int n);
void InitSystem(void);
void Display(unsigned char digit1,
unsigned char digit2,
unsigned char digit3,
unsigned char digit4);

// Dinh nghia cac ham


void Delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
}
void Display(unsigned char digit1,
unsigned char digit2,
unsigned char digit3,
unsigned char digit4)
{
// Hien thi so thu nhat
LED = LED_code[digit1];
K1 = 0;
Delay(1);
K1 = 1;

30

 cng bi ging 8051 Starter Kit


// Hien thi so thu hai
LED = LED_code[digit2];
K2 = 0;
Delay(1);
K2 = 1;
// Hien thi so thu ba
LED = LED_code[digit3];
K3 = 0;
Delay(1);
K3 = 1;

// Hien thi so thu tu


LED = LED_code[digit4];
K4 = 0;
Delay(1);
K4 = 1;
}
void InitSystem(void)
{
LCD_E = 0;
}
// Chuong trinh chinh
void main(void)
{
// Khoi tao he thong
InitSystem();
// Vong lap vo tan
while(1)
{
Delay(10);
Display(1,2,3,4);
}
}

31

 cng bi ging 8051 Starter Kit

Bi 3: S dng ngt ngoi ca vi iu khin 8051 External Interrupt


Nguyn l thit k

Ngt ngoi ca AT89 c kch hot bi mt phm bm bn ngoi. Khi phm


bm, mc lgic 0 s c a vo chn ngt ca vi iu khin, khi nh phm, mc
lgic tr li mc cao. T C8 c mc nhm hn ch rung phm do c kh ch to
khng hon ton chnh xc ca cng tc.
V d: Nhn tn hiu phm bm bn ngoi bng ngt, th hin bng vic o trng
thi LED n.
// Khai bao cac file header
#include
<AT89X52.H>
#include
<Kit8051.h>
// Khai bao cac bien toan cuc
// Khai bao cac ham
void InitSystem(void);
// Dinh nghia cac ham
void InitSystem(void)
{
// Cam LCD
LCD_E = 0;
// Chon ngat theo suon xuong
IT1 = 1;
// Cho phep ngat ngoai 1
EX1 = 1;
EA = 1;
}
void ExternalInterrupt(void) interrupt IE1_VECTOR
{
32

 cng bi ging 8051 Starter Kit


// Dao trang thai cua cong P0 (trang thai cac LED) khi co ngat
P0 = ~P0;
}
// Chuong trinh chinh
void main(void)
{
// Khoi tao he thong
InitSystem();
// Vong lap vo tan
while(1);
}

Bi 4: Ghp ni vi ma trn phm Button Matrix


Nguyn l thit k

Phm bm c ni thnh ma trn 3 hng x 3 ct, cc hng v ct c ni


vi cc chn cng vo ra ca vi iu khin AT89. Khi mt phm c bm, n s ni
mt hng v mt ct tng ng. Thut ton qut phm c s dng l ln lt tm
hng v tm ct (hoc ngc li). Khi tm hng, cc hng s c t lm u vo,
cc ct c t lm u ra mc thp. Sau kim tra cc hng xem c hng no
mc thp hay khng (c phm no bm gy ra ni vi ct hay khng)? Sau khi
xc nh c hng s t cc ct lm u vo, hng va tm c lm u ra mc

33

 cng bi ging 8051 Starter Kit


thp. Vic kim tra c tin hnh vi cc ct. Sau khi xc nh c hng v ct
s suy ra phm c bm.
V d: Qut ma trn phm v hin th s th t phm c bm ln LED 7 thanh.
// Khai bao cac file header
#include
<AT89X52.H>
#include
<Kit8051.h>
// Khai bao cac bien toan cuc
unsigned char code LED_code[] = {Number0,
Number1,
Number2,
Number3,
Number4,
Number5,
Number6,
Number7,
Number8,
Number9};
unsigned char stt=0;
// Khai bao cac ham
void Delay(unsigned int n);
void InitSystem(void);
void ScanMatrix(void);
void Display(unsigned char number);

// Dinh nghia cac ham


void Delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
}
void Display(unsigned char number)
{
// Hien thi so thu tu phim bam ra LED cuoi cung
LED = LED_code[number];
K4 = 0;
34

 cng bi ging 8051 Starter Kit


Delay(1);
K4 = 1;
}
void InitSystem(void)
{
// Cam LCD
LCD_E = 0;
// Cau hinh Timer0 o che do 16 bit
TMOD = 0x01;
// Cho phep ngat tran Timer 0
ET0 = 1;
EA = 1;
// Cho Timer 0 chay
TR0 = 1;
}
void Timer0Interrupt(void) interrupt TF0_VECTOR
{
// Dung Timer 0
TR0 = 0;
// Nap lai gia tri = 55536--> con 10000 clock nua la tran
TH0 = (unsigned char)(55536>>8);
TL0 = (unsigned char)(55536);
// Tiep tuc cho chay Timer 0
TR0 = 1;
Display(stt);
}
void ScanMatrix(void)
{
// Chuyen cac hang lam dau vao, cac cot lam dau ra muc thap
ROW_1 = 1;
ROW_2 = 1;
ROW_3 = 1;
COL_1 = 0;
COL_2 = 0;
COL_3 = 0;
// Kiem tra xem co phim bam?
if((!ROW_1)|(!ROW_2)|(!ROW_3))
{
// Chong rung phim
35

 cng bi ging 8051 Starter Kit


Delay(100);
// Kiem tra lai
// Neu la hang 1 co phim bam
if(!ROW_1)
{
// Chuyen cac cot lam dau vao
COL_1 = 1;
COL_2 = 1;
COL_3 = 1;
// Hang 1 lam dau ra muc thap
ROW_1 = 0;
// Kiem tra cac cot de xac dinh phim
if(!COL_1)
stt = 1;
else if (!COL_2)
stt = 2;
else if (!COL_3)
stt = 3;
}
// Neu la hang 2 co phim bam
if(!ROW_2)
{
// Chuyen cac cot lam dau vao
COL_1 = 1;
COL_2 = 1;
COL_3 = 1;
// Hang 2 lam dau ra muc thap
ROW_2 = 0;
// Kiem tra cac cot de xac dinh phim
if(!COL_1)
stt = 4;
else if (!COL_2)
stt = 5;
else if (!COL_3)
stt = 6;
}
// Neu la hang 3 co phim bam
if(!ROW_3)
{
// Chuyen cac cot lam dau vao
COL_1 = 1;
COL_2 = 1;
COL_3 = 1;
// Hang 3 lam dau ra muc thap
ROW_3 = 0;
36

 cng bi ging 8051 Starter Kit


// Kiem tra cac cot de xac dinh phim
if(!COL_1)
stt = 7;
else if (!COL_2)
stt = 8;
else if (!COL_3)
stt = 9;
}
}
}
// Chuong trinh chinh
void main(void)
{
// Khoi tao he thong
InitSystem();
// Vong lap vo tan
while(1)
{
ScanMatrix();
}
}

37

 cng bi ging 8051 Starter Kit

Bi 5: Ghp ni vi my tnh qua giao din RS232


RS232 Communication
Nguyn l thit k

Giao thc truyn thng gia cng COM ca my tnh v cng ni tip UART ca vi
iu khin AT89 l tng thch. Tuy nhin v mt in hc th c s khc bit v
mc lgic gia my tnh v vi iu khin. Vi mch MAX232CPE c s dng
to ra s tng thch v mt in hc, t ng chuyn i mc lgic gia vi iu
khin v my tnh.
V d: Thit k thit b t ng truyn tr li PC nhng d liu nhn c.
// Khai bao cac file header
#include
<AT89X52.H>
#include
<Kit8051.h>

38

 cng bi ging 8051 Starter Kit


// Khai bao cac bien toan cuc
// Khai bao cac ham
void InitSystem(void);
// Dinh nghia cac ham
void InitSystem(void)
{
// Cam LCD
LCD_E = 0;
// Khoi tao cong noi tiep
SCON = 0x50;
// Khoi tao Timer1 dung de tao Baud Rate
TMOD = 0x20;
TH1 = 0xFD;
TR1 = 1;
// Cho phep ngat cong noi tiep
ES = 1;
EA = 1;
}
void SerialPortInterrupt(void) interrupt SIO_VECTOR
{
unsigned char temp;
// Kiem tra xem ngat la do nhan duoc du lieu hay truyen xong du lieu?
if(RI==1)
{
RI = 0;
// Doc du lieu nhan duoc tu bo dem
temp = SBUF;
// Truyen tra lai may tinh
SBUF = temp;
}
else
{
TI = 0;
}
}
// Chuong trinh chinh
39

 cng bi ging 8051 Starter Kit


void main(void)
{
// Khoi tao he thong
InitSystem();
// Vong lap vo tan
while(1);
}

Bi 6: Ghp ni vi LCD Liquid Crystal Display


Nguyn l thit k

40

 cng bi ging 8051 Starter Kit


LCD l thit b hin th chun, tit kim nng lng v khng i hi phi qut lin
tc nh LED 7 thanh. Cc loi LCD k t (character LCD) u tun theo mt tp
lnh chung.

Cc thao tc ghi c c thc hin theo biu thi gian sau:

41

 cng bi ging 8051 Starter Kit


V d: Hin th dng ch Truong CDSP HN ln dng th nht, dng ch 8051
Starter Kit ln dng th hai ca LCD.
// Khai bao cac file header
#include
<AT89X52.H>
#include
<Kit8051.h>
// Khai bao cac bien toan cuc
unsigned char code string1[] = "Truong CDSP HN";
unsigned char code string2[] = "8051 Starter Kit";
// Khai bao cac ham
void InitSystem(void);
void Delay(unsigned int n);
void InitLCD(void);
void WriteCommand(unsigned char command);
void WriteCharacter(unsigned char character);
void WriteLCD(unsigned char x);
void SendString2LCD(unsigned char code *p);
void DisplayText(void);
// Dinh nghia cac ham
void InitSystem(void)
{
// Cam LCD
LCD_E = 0;
// Sang den backlight
LCD_BL = 0;
// Tre de LCD tu khoi tao ben trong (it nhat 15ms)
Delay(100);
// Tat den backlight
LCD_BL = 1;
InitLCD();
}
void Delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
}
42

 cng bi ging 8051 Starter Kit


void InitLCD(void)
{
WriteCommand(0x30);
WriteCommand(0x30);
WriteCommand(0x30);
// 8 bit, 2 lines, font 5x7
WriteCommand(0x38);
// Display on, hide cursor
WriteCommand(0x0C);
// Xoa man hinh
WriteCommand(0x01);
}
void DisplayText(void)
{
// Dich con tro den vi tri thu 2, dong thu nhat
WriteCommand(0x81);
SendString2LCD(string1);
// Dich con tro den dau dong thu hai
WriteCommand(0xC0);
SendString2LCD(string2);
}
void WriteLCD(unsigned char x)
{
LCD_RW = 0;
LCD_DATA = x;
LCD_E = 1;
LCD_E = 0;
Delay(5);
}
void WriteCommand(unsigned char command)
{
LCD_RS = 0;
WriteLCD(command);
}
void WriteCharacter(unsigned char character)
{
43

 cng bi ging 8051 Starter Kit


LCD_RS = 1;
WriteLCD(character);
}
void SendString2LCD(unsigned char code *p)
{
unsigned char i=0;
while(p[i]!=0)
{
WriteCharacter(p[i]);
i++;
Delay(200);
}
}
// Chuong trinh chinh
void main(void)
{
// Khoi tao he thong
InitSystem();
DisplayText();
// Vong lap vo tan
while(1);
}

Bi 7: Ghp ni vi ADC Analog to Digital Converter


Nguyn l thit k

44

 cng bi ging 8051 Starter Kit


ADC0804 l mt trong nhng IC cho php chuyn i in p dng tng t
(analog) sang gi tr dng s (digital), c ng dng trong rt nhiu cc thit b o
lng. u vo in p c th trong di t 0 n +5V. Gi tr s u ra trong di t
0 n 255. Cc tn hiu D0-D7 dng a d liu chuyn i xong ti vi iu
khin. Cc tn hiu CS, RD, WR (u tch cc mc thp) dng ra lnh cho
ADC bt u chuyn i hoc a d liu chuyn i ra. K t khi nhn c
lnh yu cu chuyn i t vi iu khin, ADC s mt mt khong thi gian thc
hin nhim v. Trong khong thi gian ny tnh hiu INTR s mc cao (bo bn).
Khi qu trnh chuyn i kt thc, tn hiu ny s t ng tr li mc thp thng
bo rng ADC chuyn i xong v c th thc hin ln chuyn i tip theo. Lp
trnh vin c th thm d tn hiu INTR bit khi no ADC bn, khi no ADC sn
sng hoc n gin ch cn i mt vi mili giy trc khi c kt qu hoc ra lnh
chuyn i tip theo.
V d: o in p (trong di t 0 n +5V) c to ra t chit p v hin th gi tr
o c ln LCD.
// Khai bao cac file header
#include
<AT89X52.H>
#include
<Kit8051.h>
// Khai bao cac bien toan cuc
unsigned char code string1[] = "8051 Starter Kit";
unsigned char code string2[] = "Dien ap = ";
unsigned char voltage,digit1,digit2;
// Khai bao cac ham
void InitSystem(void);
void Delay(unsigned int n);
void DelayShort(void);
void InitLCD(void);
void WriteCommand(unsigned char command);
void WriteCharacter(unsigned char character);
void WriteLCD(unsigned char x);
void SendString2LCD(unsigned char code *p);
void DisplayText(void);
void DisplayVoltage(void);
void Convert();
void Calculate();

45

 cng bi ging 8051 Starter Kit


// Dinh nghia cac ham
void InitSystem(void)
{
// Cam LCD
LCD_E = 0;
// Sang den backlight
LCD_BL = 0;
// Tre de LCD tu khoi tao ben trong (it nhat 15ms)
Delay(100);
// Tat den backlight
LCD_BL = 1;
InitLCD();
}
void Delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
}
void DelayShort(void)
{
unsigned char i;
for(i=0;i<10;i++);
}
void InitLCD(void)
{
WriteCommand(0x30);
WriteCommand(0x30);
WriteCommand(0x30);
// 8 bit, 2 lines, font 5x7
WriteCommand(0x38);
// Display on, hide cursor
WriteCommand(0x0C);
// Xoa man hinh
WriteCommand(0x01);
}
void DisplayText(void)
46

 cng bi ging 8051 Starter Kit


{
// Dich con tro den dau dong thu nhat
WriteCommand(0x80);
SendString2LCD(string1);
// Dich con tro den dau dong thu hai
WriteCommand(0xC1);
SendString2LCD(string2);
// Dich con tro den vi tri don vi do
WriteCommand(0xCE);
WriteCharacter('V');
}
void WriteLCD(unsigned char x)
{
LCD_RW = 0;
LCD_DATA = x;
LCD_E = 1;
LCD_E = 0;
Delay(5);
}
void WriteCommand(unsigned char command)
{
LCD_RS = 0;
WriteLCD(command);
}
void WriteCharacter(unsigned char character)
{
LCD_RS = 1;
WriteLCD(character);
}
void SendString2LCD(unsigned char code *p)
{
unsigned char i=0;
while(p[i]!=0)
{
WriteCharacter(p[i]);
i++;
Delay(50);
}
47

 cng bi ging 8051 Starter Kit


}
void Convert(void)
{
ADC_CS = 0;
DelayShort();
ADC_WR = 0;
DelayShort();
ADC_WR = 1;
DelayShort();
ADC_CS = 1;
// Tre cho chuyen doi xong
Delay(10);
// Chuyen Port thanh cong vao de chuan bi doc du lieu
ADC_DATA = 0xFF;
ADC_CS = 0;
DelayShort();
ADC_RD = 0;
DelayShort();
// Doc du lieu vao
voltage = ADC_DATA;
ADC_RD = 1;
DelayShort();
ADC_CS = 1;
}
void Calculate(void)
{
unsigned int temp;
temp = (voltage*10);
temp = temp/52;
// tinh ra dien ap tu gia tri ADC dua ve
// tach phan nguyen va phan thap phan
digit1 = (unsigned char) (temp/10);
digit2 = (unsigned char)(temp%10);
// chuyen sang ma ASCII
digit1 = digit1 + 0x30;
digit2 = digit2 + 0x30;
}
void DisplayVoltage(void)
48

 cng bi ging 8051 Starter Kit


{
// Dua con tro den vi tri can hien thi
WriteCommand(0xCB);
WriteCharacter(digit1);
WriteCharacter('.');
WriteCharacter(digit2);
}
// Chuong trinh chinh
void main(void)
{
// Khoi tao he thong
InitSystem();
DisplayText();
// Vong lap vo tan
while(1)
{
Convert();
Calculate();
DisplayVoltage();
}
}

Bi 8: Thit k h giao tip t xa bng hng ngoi


Infrared Communication
Nguyn l thit k

49

 cng bi ging 8051 Starter Kit


Mch pht c thit k vi mt transistor cng sut nh c th ng ct
ngun cp cho LED hng ngoi tn s ~36KHz. y l tn s c dng trong
cc thit b thu pht hng ngoi ph bin trong sinh hot (TV, iu ha nhit , u
a CD,)

Mch thu c thit k vi mt thu hng ngoi sn c trn th trng. Mt


thu ny c thit k vi b lc thng mt di, ch cho php cc tn s xp x
36KHz i qua. Do loi mt thu ny c bit nhy cm vi nhiu ngun nui nn u
vo ngun nui cho mt c thit k vi mt mch lc RC thay v ni trc tip ln
ngun ca mch th nghim. Bnh thng u ra ca mt thu mc cao, khi nhn
c tn hiu hng ngoi tn s ~36KHz truyn ti, u ra ca mt thu s lp tc
xung mc lgic thp (mc 0). Khi ht tn hiu hng ngoi, u ra li tr v mc
logic cao (mc 1). Nh vo vic o khong thi gian mc thp ca u ra, ngi
ta c th bit c thi gian pht xung tng ng bn pht, t suy ra m
c truyn i. Trong v d sau s s dng tia hng ngoi truyn i 3 loi m,
phn bit nhau bi thi gian pht i (2ms, 4ms v 6ms). Cc ngng phn bit
cc m vi nhau v cc m vi nhiu l 1ms, 3ms, 5ms v 7ms.
M th nht ko di 2ms tng ng vi khong 80 xung pht i tn s
~36KHz. M ny c pht i khi mch bn pht nhn c tn hiu t mt trong
ba phm bm ca hng 1.
M th hai ko di 4ms tng ng vi khong 160 xung pht i tn s
~36KHz. M ny c pht i khi mch bn pht nhn c tn hiu t mt trong
ba phm bm ca hng 2.
M th ba ko di 6ms tng ng vi khong 240 xung pht i tn s ~36KHz.
M ny c pht i khi mch bn pht nhn c tn hiu t mt trong ba phm
bm ca hng 3.
V d: Thit k h thu pht tn hiu hng ngoi, thc hin thu pht ba loi m v
hin th ln LCD loi m thu c.
Code mu cho bn pht
// Khai bao cac file header
#include
<AT89X52.H>
50

 cng bi ging 8051 Starter Kit


#include

<Kit8051.h>

// Khai bao cac bien toan cuc


// Khai bao cac ham
void Delay(unsigned int n);
void Delay12us(void);
void InitSystem(void);
void ScanMatrix(void);
void Transmit(unsigned char n);

// Dinh nghia cac ham


void Delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
}
void Delay12us(void)
{
unsigned char i;
i++;
i++;
i++;
i++;
i++;
i++;
}
void InitSystem(void)
{
// Cam LCD
LCD_E = 0;
}
void ScanMatrix(void)
{
// Chuyen cac hang lam dau vao, cac cot lam dau ra muc thap
ROW_1 = 1;
ROW_2 = 1;
51

 cng bi ging 8051 Starter Kit


ROW_3 = 1;
COL_1 = 0;
COL_2 = 0;
COL_3 = 0;
// Kiem tra xem co phim bam?
if((!ROW_1)|(!ROW_2)|(!ROW_3))
{
// Chong rung phim
Delay(100);
// Kiem tra lai
// Neu la hang 1 co phim bam
if(!ROW_1)
{
Transmit(80);
// Doi nha phim
while(!ROW_1);
}
// Neu la hang 2 co phim bam
if(!ROW_2)
{
Transmit(160);
// Doi nha phim
while(!ROW_2);
}
// Neu la hang 3 co phim bam
if(!ROW_3)
{
Transmit(240);
// Doi nha phim
while(!ROW_3);
}
}
}
void Transmit(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
{
IR_LED = 0;
52

 cng bi ging 8051 Starter Kit


Delay12us();
IR_LED = 1;
Delay12us();
}
}
// Chuong trinh chinh
void main(void)
{
// Khoi tao he thong
InitSystem();
// Vong lap vo tan
while(1)
{
ScanMatrix();
}
}
Code mu cho bn thu
// Khai bao cac file header
#include
<AT89X52.H>
#include
<Kit8051.h>
// Khai bao cac bien toan cuc
unsigned char code string1[] = "8051 Starter Kit";
unsigned char code string2[] = "Ma nhan duoc = ";
// Khai bao cac ham
void InitSystem(void);
void Delay(unsigned int n);
void InitLCD(void);
void WriteCommand(unsigned char command);
void WriteCharacter(unsigned char character);
void WriteLCD(unsigned char x);
void SendString2LCD(unsigned char code *p);
void DisplayText(void);
// Dinh nghia cac ham
void InitSystem(void)
{
// Cam LCD
53

 cng bi ging 8051 Starter Kit


LCD_E = 0;
// Tre de LCD tu khoi tao ben trong (it nhat 15ms)
Delay(100);
InitLCD();
// Khoi tao Timer0 o che do 16bit
TMOD = 0x01;
// Cau hinh ngat ngoai 0 theo suon xuong
IT0 = 0;
// Cho phep ngat ngoai 0
EX0 = 1;
EA = 1;
}
void Delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
}
void InitLCD(void)
{
WriteCommand(0x30);
WriteCommand(0x30);
WriteCommand(0x30);
// 8 bit, 2 lines, font 5x7
WriteCommand(0x38);
// Display on, hide cursor
WriteCommand(0x0C);
// Xoa man hinh
WriteCommand(0x01);
}
void DisplayText(void)
{
// Dich con tro den vi tri thu 2, dong thu nhat
54

 cng bi ging 8051 Starter Kit


WriteCommand(0x80);
SendString2LCD(string1);
// Dich con tro den dau dong thu hai
WriteCommand(0xC0);
SendString2LCD(string2);
}
void WriteLCD(unsigned char x)
{
LCD_RW = 0;
LCD_DATA = x;
LCD_E = 1;
LCD_E = 0;
Delay(5);
}
void WriteCommand(unsigned char command)
{
LCD_RS = 0;
WriteLCD(command);
}
void WriteCharacter(unsigned char character)
{
LCD_RS = 1;
WriteLCD(character);
}
void SendString2LCD(unsigned char code *p)
{
unsigned char i=0;
while(p[i]!=0)
{
WriteCharacter(p[i]);
i++;
Delay(100);
}
}
void ExternalInterrupt0(void) interrupt IE0_VECTOR
{
unsigned char temp;
// Xoa Timer 0
55

 cng bi ging 8051 Starter Kit


TH0 = 0;
TL0 = 0;
// Cho Timer 0 chay
TR0 = 1;
// Doi cho den khi tin hieu nhan duoc ket thuc
while(!P3_2);
// Dung Timer 0
TR0 = 0;
// So sanh gia tri cua Timer voi cac nguong de xac dinh ma nhan duoc
temp = TH0;
if((temp>THRESHOLD_1)&&(temp<THRESHOLD_2))
{
// Dua con tro den vi tri mong muon
WriteCommand(0xCF);
// Hien thi ma nhan duoc
WriteCharacter('1');
}
else if((temp>THRESHOLD_2)&&(temp<THRESHOLD_3))
{
// Dua con tro den vi tri mong muon
WriteCommand(0xCF);
// Hien thi ma nhan duoc
WriteCharacter('2');
}
else if((temp>THRESHOLD_3)&&(temp<THRESHOLD_4))
{
// Dua con tro den vi tri mong muon
WriteCommand(0xCF);
// Hien thi ma nhan duoc
WriteCharacter('3');
}
}
// Chuong trinh chinh
void main(void)
{
// Khoi tao he thong
InitSystem();
DisplayText();
// Vong lap vo tan
56

 cng bi ging 8051 Starter Kit


while(1);
}

File header cho ton b cc chng trnh mu trn bao gm file AT89X52.H c
sn ca trnh bin dch Keil. Ngoi ra cn c thm mt file header khc tn l
Kit8051.h do ngi s dng t to ra nhm nh ngha cc hng s, cc tn gi
khc ca cc tn hiu giao tip, iu khin. Chi tit xin tham kho trong a CD km
theo.

57

You might also like