ch"¬ng 4
LËp tr×nh cho cæng vµo - ra I/0
4.1 M« t¶ ch©n cña 8051.
!"# $% #&# '()*( +,-* #./ (0 1234 5+6 $7 18349 1:;349 <=3222> ?@A #B #&#
C,DA ?B*E +F C(&# *(/A9 #(G*E (H* *(I (/, ()*E #(J* <KL 5<A/M K*NO,*P L/C/EP>
$H*E +F $Q' +AR*E STL 5SA/$ TM/' L/C/EP> +) $H*E #(6U C(R*E #B #(J* ?V OO;
5OP/$MPWW ;(,U ;/XX,PX> '(Y #(Z*E ?@A #B [2 #(J* #(\ #&# #(]# *^*E C(&# *(/A *(I
+)\ X/ K_29 ?0#
RD
9 E(,
WR
9 ?`/ #(a9 $b M,cA +) *Ed'e ;f* U(g, MIA h Xi*E jk' Wl
(m*E #A*E #nU jk' U(,-* og* 1234 #B p2 #(J* +q, Wl #r*E +)\NX/ 6' (s* #(\ #&# ]*E
$7*E t-A #fA '(nU (s*e uAt *(,-*9 +Y (fA (v' #&# *() U(&' 'X,D* #(6*( Ww $7*E #(6U
?B*E +F [2 #(J* +q, (/, ()*E #(J* <KL *-* '/ #(a 'xU #(A*E jR 'g U(,-* og* *)te
P1.2
L4ez
P1.4
P1.5
P1.6
P1.7
RST
P0.0 (
AD0
)
Vcc
1
2
3
5
6
40
39
38
36
35
37
34
33
32
30
29
31
28
27
26
P0.5
(
AD5
)
P0.3
(
AD3
)
PSEN
P0.6
(
AD6
)
P2.5
(
A13
)
P2.3
(
A11
)
P2.1
(
RXD
)
P3.0
(
T
XD
)
P3.1
(
NT0
)
P3.2
(
NT1
)
P3.3
(
T
0
)
P3.4
EA/CPP
ALE/PROG
*l, ?D #(\ (c '(l*E M)j +,c# j) C(R*E #f* o,v' ok +, ?,@A C(,D* '(Ak# (0 1234 (/t
12z4e ;|* (/, #(J* C(&# M)
PSEN
+) AOE ?I}# Ww $7*E #(. tvA 'X\*E #&# (c '(l*E
$ù/ 'X-* 12z4e
4e ;(J* ~
;;
: ;(J* Wl [2 M) ~
;;
#nU ?,c* &U *EAy* #(\ #(6Ue NEAy* ?,c* &U M)
+3~e
pe ;(J* •N<: ;(J* •N<: ;(J* Wl p2 M) •N<e
ze ;(J* XuAO4 +) XuAOp:
1234 #B jk' ok E,/\ ?k*E 'X-* #(6U *(I*E *B t-A #fA #B jk' xA*E ?y*E (y
*E\), ?D #(Ht *Be Bk E,/\ ?k*E '(H#( /*( '(Iê*E xAt-* *(n' ?I}# *l, 'q, #&# #(J*
?fA +)\ XuAO4 5#(J* 4:> +) XuAOp 5#(J* 41>e Bk E,/\ ?k*E '(H#( /*( ?I}# *l,
'q, XuAO4 +) XuAOp #ò*E #f* (/, '7 ?,c* E,& 'X` z2UTe !k' U(6/ #./ '7 ?,c* ?I}#
*l, xAl*E ?n' *(I ?I}# 'XY*( o)t 'X-* (Y*( [ep/e
;f* U(g, MIA h Xi*E #B *(,@A 'l# ?k C(&# *(/A #./ (0 1234e ul# ?k ?I}# #\,
*(I M) 'f* Wl #ù# ?H, #./ ok E,/\ ?k*E ?I}# *l, 'q, #(J* XuAOe ~6 $79 jk' #(6U
4p!Hz (\"# '(nU (s*e uIs*E 'ù *(I +xt '(Y jk' ok +, ?,@A C(,D* #ò*E t-A #fA jk'
',*( '(D #B 'f* Wl C(R*E Mq* (s* p2!Hze K(, 1234 ?I}# *l, 'q, jk' ok E,/\ ?k*E
',*( '(D '(H#( /*( +) #nU *EAy* '(Y '/ #B '(D qA/* W&' 'f* Wl 'X-* #(J* XuAOp oi*E
j&t (,c* WB*Ee NvA '/ qAtv' ?`*( Ww $7*E jk' *EAy* 'f* Wl C(&# ok E,/\ ?k*E
'(H#( /*( #(G*E (H* *(I M) ok E,/\ ?k*E uuO '(Y *B WÏ ?I}# *l, 'q, #(J* XuAO49
#|* #(J* XuAOp '(Y ?D (ë C(R*E *l, *(I (Y*( [epoe
XTAL2
XTAL1
GND
XTAL2
XTAL1
GND
NC
EXTERRNAL
OSCILLATAOR
SIGNAL
Register Reset Value
PC 0000
ACC 0000
B 0000
PSW 0000
SP 0000
DPTR 0007
0000
OIA h Xi*E E,& 'X` #./ ok ?vj #(Is*E 'XY*( L; M) 2 C(, '&, MxU ?D ÐU ;LU *HU
jm Mc*( ?fA ',-* 'õ ok *(q RO! 'H, +` 'X6 *E^* *(q 2222e §,@A *)t #B *E(Ü/ M) '/
EA
?I}# *l, 'q,
~
;;
e §l, +q, #&# '()*( +,-* #. (0 *(I 12z4 +) 12zp j) C(R*E #B RO! 'X-* #(6U '(Y
jm #(Is*E 'XY*( ?I}# MIA #n' ë 'X-* ok *(q RO! *E\), +) #(Z*E ?I}# *HU #(\
12z4_zpe <\ +xt9 ?l, +q, 12z4 '(Y #(J*
EA
U(g, ?I}# *l, ?n' ?D o&\ Xi*E jm
#(Is*E 'XY*( ?I}# #n' ë *E\),e
EA
#B *E(Ü/ M) 'XAt #xU *E\), 5Ex'PX*/M A##PWW> M)
#(J* Wl z4 'X-* +F C,DA <KLe NB M) jk' #(J* ?fA +)\ +) U(g, ?I}# *l, (\"# +q, ~
;;
(\"# •N<e H/t *B, #&#( C(&# M) *B C(R*E ?I}# ?D (ëe
Vcc
Vcc
10
m
F
8.2K
RST
30
m
X1
X2
RST
8.2K
10
m
F
11.0592 MHz
ë #(Is*E 4[ #(Z*E '/ WÏ 'XY*( o)t #&#( 12z4 Ww $7*E #(J* *)t Cv' (}U +q,
PSEN
?D 'XAt #xU #&# #(Is*E 'XY*( ?I}# #n' 'X-* ok *(q RO! ë *E\), 12z4e uX\*E
#&# #(6U 1234 +q, ok *(q RO! 'X-* #(6U *(I 18349 1:;34 (\"# <=3222 '(Y
EA
?I}# *l, +q, ~
;;
e
VÝ dô 4:
Hmt 'Yj #(A Cú j&t ?l, +q, /> XuAO = 44e23:p!Hz o> XuAO = 46!Hze
Lêi gi¶i:
/> 44e23:p!Hz_4p = :p4e6CHze
;(A Cú j&t = 4_:p4e6CHz = 4e213mWe
o> 46!Hz_4p = 4ezzz!Hz
;(A Cú j&t = 4_4ezzz!Hz = 2e83mWe
;&# #(J* jR 'g 'X-* ?Jt U(g, ?I}# *l, j) C(R*E #f* '()*( +,-* *)\ ?I}# Ww
MOV A, #554
BACK: MOV P0, A
ACALL DELAY
CPL A
SJMP BACK
Hình 4.4: ;r*E L2 +q, #&# ?,c* 'Xở Cé\e
/> ;r*E L2 ?fA +)\: ~q, #&# ?,c* 'Xở ?I}# *l, 'q, #r*E L2 *(ij ?D 'H\ *B '()*(
#r*E ?fA +)\ '(Y *B U(g, ?I}# MxU 'XY*( oi*E #&#( E(, 4 'q, 'n' #g #&# o,'e
Đ\H* jm $Iq, ?Jt Wẽ #nA (Y*( L2 MZ# ?fA M) ?fA +)\ oi*E #&#( E(, 4 ?v* *B
+) W/A ?B $b M,cA *(x* ?I}# 'ừ *B ?I}# Ew, ?v* L4e
o>
MOV A,#FFH ; Gán A = FF dạng Hex
MOV P0, A ; Tạo cổng P0 làm cổng đầu vào bằng cách
P0
.2
L2
ez
P0
.4
P0
.5
P0
.6
P0
.7
DS5000
8751
8951
Port 0
ACALL DELAY
SJMP BACK
;r*E L4 *(I ?fA +)\: ĐD o,v* #r*E L4 '()*( ?fA +)\ '(Y *B U(g, ?I}# MxU
'XY*( oi*E #&#( E(, jk' ?v* 'n' #g #&# o,' #./ *Be Oh $\ +@ ?,@A *)t ?I}# o)* ở j7#
M7# AUUP*$,x ;epe uX\*E ?\H* jm W/A9 #r*E L4 MZ# ?fA ?Is# #nA (Y*( *(I #r*E ?fA
'q, 'n' #g #&# #(J* #./ *Be Đ\H* jm W/A ?Jt ?fA ',-* #nA (,*( Lp M) #r*E +)\ oi*E
#&#( E(, jk' ?v* 'n' #g #&# #(J* #./ *B +) W/A ?B $b M,cA *(x* ?I}# 'ừ Lp ?I}# Ew,
M,-* '7# ?v* L4e
MOV A, 0FFH ; Gán A giá trị FF dạng Hex
MOV P2, A ; Tạo P2 là cổng đầu vào bằng cách
; ghi một đến các chân của nó
BACK: MOV A, 2 ; Nhận dữ liệu từ P2
MOV P1, A ; Gửi nó đến P1
SJMP BACK ; Lặp lại
o> ~/, 'X| CéU #./ Lpe
uX\*E #&# (c '(l*E $ự/ 'X-* 18349 1:;34 +) <=3222 '(Y Lp ?I}# $%*E *(I
?fA X/ ?s* E,g*e uAt *(,-* 'X\*E (c '(l*E $ự/ 'X-* 12z4p '(Y #r*E Lp U(g, ?I}#
$%*E #%*E +q, L2 ?D 'H\ X/ ?`/ #(a 46 oX' ?l, +q, ok *(q *E\),e N(I #(a X/ 'X-* (Y*(
[e4 #r*E Lp #ũ*E ?I}# #(a ?`*( *(I M) A1 N A43 o&\ #(]# *^*E CéU #./ *Be ~Y jk'
ok 12z4 #B C(g *^*E 'XA*E #xU 6[C ot'P ok *(q *E\),9 *B #f* jk' ?Iờ*E ?`/ #(a 46
o6'e uX\*E C(, Le2 #A*E #nU 1 o,' '(nU qA/ A2 N A8e ;R*E +,c# #./ Lp M) #A*E #nU
#&# o6' ?`/ #(a A1 N A43e H/t *B, #&#( C(&# C(, 12z4?I}# *l, 'q, ok *(q *E\), '(Y
Lp ?I}# $%*E #(\ 1 o6' #./ ?`/ #(a 46 o,' +) *B C(R*E '(D $%*E #(\ +)\ X/e Đ,@A *)t
Wẽ ?I}# 'XY*( o)t #(, ',v' ở #(Is*E 4[e
uừ *(b*E 'XY*( o)t 'X-* ?Jt '/ #B '(D Cv' MAx* Xi*E 'X\*E #&# (c '(l*E $ự/
'X-* #&# ok +, ?,@A C(,D* 18349 1:;34 (\"# <=3222 '(Y '/ #B z #l*E L29 L4+) Lp #(\
#&# '(/\ '&# +)\ X/ +) *(I '(v M) #B '(D ?. #(\ #&# ]*E $7*E +q, (fA (v' #&# ok +,
?,@A C(,D*e ;|* #nU Lz M)?D $)*( #(\ *Ed' +) '/ Wẽ #%*E o)* $Iq, ?Jte
44 N ;r*E Lz:
;r*E Lz #(,vj 'r*E #k*E M) 1 #(J* 'ừ #(J* 42 ?v* #(J* 48e NB #B '(D ?I}#
Ww $7*E *(I ?fA +)\ (\"# ?fA X/e ;l*E Lz C(R*E #f* #&# ?,c* 'Xở Cé\ #ũ*E *(I L4
+) Lpe !"# $% #l*E Lz ?I}# #nA (Y*( *(I jk' #l*E ?fA X/ C(, '&, MxU9 *(I*E ?Jt
C(R*E U(g, M) #&#( *B ?I}# ]*E $7*E U(r o,v* *(n'e ;l*E Lz #B #(]# *^*E or xA*E
;&# o,' Lze2 +) Lze4 ?I}# $%*E #(\ #&# '6* (,cA *(x* +) U(&' $b M,cA 'X\*E
'XAt@* '(R*E $b M,cA *l, ',vUe XPj #(Is*E 42 ?v' o,v' #&# #(Z*E ?I}# *l, E(éU *(I
'(v *)\e ;&# o,' Lzep +) Lzez ?I}# $)*( #(\ #&# *Ed' *E\), +) #(Z*E ?I}# 'XY*( o)t
#(, ',v' ở #(Is*E 44e B,' Lze[ +) Lze3 ?I}# $%*E #(\ #&# ok ?`*( '(-j 2 +) 4+) #(,
',v' ?I}# 'XY*( o)t ở #(Is*E :e ;Al, #%*E #&# o,' Lze6 +) Lze8 ?I}# #nU #(\ #&# '6*
(,cA E(, +) ?0# #&# ok *(q *E\), ?I}# *l, 'q, #&# (c '(l*E $ự/ 'X-* 12z4e ;(Is*E
4[ Wẽ 'XY*( o)t #&#( #(Z*E ?I}# Ww $7*E *(I '(v *)\ 'X\*E #&# (c '(l*E $ự/ 'X-*
12z4e uX\*E #&# (c '(l*E $ự/ 'X-* 18349 1:;34 (\"# <z3222 '(Y #&# #(J* Lze6 +)
Lze8 ?I}# $%*E #(\ +)\ N X/ #|* #&# #(J* C(&# #./ Lz ?I}# Ww $7*E oY*( '(Iờ*E
'X\*E +/, 'X| #(]# *^*E '(/t ?r,e
4.2 Lập trình vào - ra: thao tác bit.
4.2.1 các cách khác nhau để truy cập toàn bộ 8 bit.
uX\*E ?\H* j) $Iq, ?Jt #ũ*E *(I 'X\*E *(,@A +6 $7 +)\ X/ 'XIq# ?Jt '\)* ok
1 o,' #./ #r*E L4 ?I}# #xUe
BACK: MOV A, # 55H
MOV P1,A
ACALL DELAY
MOV A, #0AAH
MOV P1, A
ACALL DELAY
SJMP BACK
Đ\H* j) 'X-* #(l' j{, o,' #./ L4 jk' #&#( M,-* '7#e ;(Z*E '/ ?m '(d*E jk'
o,v* '(v #./ #(Is*E 'XY*( 'X-* 'XIq# ?Be BJt E,ờ '/ #B '(D +,v' MH, ?\H* jm 'X-* '(P\
#&#( (,cA qAg (s* oi*E #&#( 'XAt #xU 'Xự# ',vU #r*E j) C(R*E qA/ '(/*( E(, 'r*E
*(I W/A:
BACK: MOV P1, # 55H
ACALL DELAY
SJMP BACK
!k' o,v* '(D C(&# #./ ?\H* jm 'X-* M):
AGACN: SETB P1.2 ; Chỉ thay đổi bít P1.2 lên cao
ACALL DELAY
CLR P1.2 ; Xoá bít P1.2 xuống thấp
ACALL DELAY
SJMP AGAIN
OIA h Xi*E o6' L4ep M) o6' '(] z #./ #r*E L49 +Y o6' '(] *(n' M) L4e2 +) o,' '(]
(/, M) L4e4 +e+eee
Bg*E [ez 'XY*( o)t #&# o6' #./ #&# #r*E +)\ X/ #./ 1234e XPj +6 $7 [ep +@
'(/\ '&# o6' #./ #&# o6' +)\ N X/e OIA h Xi*E 'X\*E +6 $7 [ep #&# o,' C(R*E $%*E ?v*
M) C(R*E o` g*( (Iở*Ee ĐJt M) C(g *^*E ?&*( ?`/ #(a '(P\ o,' #./ #&# #r*E +)\ N X/
+) M) jk' 'X\*E *(b*E ?,Dj jH*( *(n' #./ ok +, ?,@A C(,D* 1234e
Ví dụ 4.2: (mt +,v' #(Is*E 'XY*( '(ự# (,c* #&# #R*E +,c# W/A:
/> <At 'XY (,D* '(` o,' L4ep #(\ ?v* C(, *B M-* #&U
o> K(, L4ep M-* #/\9 (mt E(, E,& 'X` [3H +)\ #r*E L2
#> w, jk' xA*E #/\ xAl*E '(nU 5HN'\NO> 'q, Lpez
Lời giải:
SET P1.2 ; Tạo bit P1.2 là đầu vào
MOV A, #45H ; Gán A = 45H
AGAIN: JNB P1.2, AGAIN ; Thoát khi P1.2 = 1
MOV P0, A ; Xuất A tới cổng P0
SETB P2.3 ; Đ"a P2.3 lên cao
CLR P2.3 ; Tạo P2.3 xuống thấp để có xung H-T0-L