ươ

ố ế

ạ ộ

Ch

ng X: Ho t đ ng port n i ti p

I. Gi

ệ i thi u:

ữ ệ

ế

ữ ệ

ườ ộ

ầ ặ ng c n 8 ho c nhi u  ỉ ế ị t b  ch  cách xa

ữ ệ ề ng dây d n đ  truy n d  li u đ n m t thi c ướ

c g i đi t ng bít m t so

ữ ệ ặ

ượ ề

ừ ượ

ề c truy n đi

ổ ố ế ượ

ố ế

ữ ệ

ớ ữ ệ c truy xu t qua các chân TXD và RXD. D  li u

ữ ệ

ượ

c phát

ượ c thu (nh p) qua chân RXD (P3.0) và d  li u đ ấ

ố Các máy tính truy n d  li u theo hai cách: Song song và n i  ề ế ti p. Trong truy n d  li u song song th ườ đ vài b ố ế Trong truy n thông n i ti p d  li u đ ề v i truy n song song thì m t ho c nhi u byte đ ộ cùng m t lúc.  chuy n đ i n i ti p sang song song v i d  li u nh p. ấ Port n i ti p đ ậ đ (xu t) qua chân TXD(P3.1)

ố ế

ạ ộ

ượ

c gi ọ

c thu và đ ế  th  hai đ

ầ c thu đ y đ  thì

ị ấ

t cho phép ph n m m

ấ ế

B  đ m port n i ti p (SBUF)

ữ  ch  99H nh n d

ở ạ  đi

ố ế ặ

Thanh ghi đi u khi n port n i ti p (SCON)

ở ạ  đi ạ

ố ế ỉ

ỉ  ch   ạ  ch  bit ch a các bit tr ng  ể

Port n i ti p cho ho t đ ng song công (full duplex: thu  ờ ồ ệ và phát đ ng th i) và đ m thu (receiver buffering)  ộ ự ẽ ượ  trong  cho phép m t ký t  s  đ ự ứ ự ậ ượ c nh n. N u CPU đ c ký t khi ký t   th  hai đ ủ ượ ự ứ ấ ướ ứ c khi ký t th  nh t tr ẽ ữ ệ d  li u s  không b  m t. ầ ặ Hai thanh ghi ch c năng đ c bi ố ế truy xu t đ n port n i ti p là: SBUF và SCON. ộ ệ ệ li u đ  thu ho c phát  ề 98H là thanh ghi có đi thái và các bit đi u khi n

II. Các thanh ghi PORT

ệ ố ế

ừ ộ ệ

ữ ệ

ượ

c phát

c ghi vào SBUF và đ ộ ệ

ẽ ượ

ng h p này nó là b  đ m phát c n p vào SBUF thông qua ngõ RXD và

ấ ữ ệ

ữ ệ ọ ượ

ộ ệ

ng h p này nó là b  đ m thu

thanh ghi SBUF đ  truy xu t d  li u thu  ườ ủ

ể ấ ừ ộ ố ế b  dao

1. Thanh ghi đ m n i ti p SBUF(Serial Buffer Register) Thanh ghi SBUF đóng vai trò v a là b  đ m phát  ộ ệ v a là b  đ m thu: ẽ ượ ầ D  li u c n phát đi s  đ ườ qua ngõ TXD, trong tr ạ D  li u thu s  đ ữ ệ ừ đ c d  li u t c, trong tr đ ộ ố ộ ặ ử ụ T c đ  baud c a port n i ti p có th  l y t đ ng trên chip ho c s  d ng timer.

C u trúc c a thanh ghi SBUF:

D  Thanh ghi d ch CLK

SBUF CLK (Chỉ ghi) Q

SBUF ỉ ọ (ch  đ c)

Baud rate clock     (transmit)

SBUF ỉ ọ (ch  đ c)

ộ BUS n i 8051

ữ ệ

Ví d :ụ  các l nh ghi d  li u vào  ọ ữ ệ ừ SBUF và đ c d  li u t

SBUF

MOV SBUF, # 40H

; phát giá tr  40H qua port

ố ế n i ti p

; phát n i dung c a A qua

ố ế

ữ ệ ; đ c d  li u thu đ

ượ ừ c t

ố ế

MOV SBUF, A port n i ti p MOV A, SBUF port n i ti p

ố ế

Thanh ghi đi u khi n port n i ti p

SCON

ộ ệ

ế

ờ TI đ

Đ c xóa b ng ph n m m

ộ ệ

ắ ự ượ c đ t lên m c 1 khi b  đ m thu đã đ y (đã nh n đ  1 ký t )

ứ ầ

ế ộ

ượ

c phát trong ch  đ  UART 9bit, bit này đ

ặ c đ t

REN = 1: Cho phép thu REN = 0: c mấ ắ TI : c  ng t phát ặ ượ c đ t lên m c 1 khi b  đ m phát đã r ng (k t thúc vi c phát  1ký t ). ự ằ ượ ờ RI : c  ng t thu RI đ ằ ượ Đ c xóa b ng ph n m m ượ TB8: bit th  9 đ ằ ho c xóa b ng ph n m m

ầ ượ

ế ộ c trong ch  đ  UART 9bit

RB8: bit th  9 thu đ SM2:

ố ế

ch  đ  truy n thông đa x  lý trong

SM2 =1: Port n i ti p h at đ ng  ẽ

ế ộ

ượ

ế c đ t lên 1 n u bit th  9

ượ

ế ộ các ch  đ  2 và 3; bit c  RI s  không đ thu đ

c là 0

ế ộ

ọ SM0, SM1: ch n ch  đ  ho t  đ ng:ộ

ế ộ

ữ ệ

ố ế

ộ ấ ứ ệ

ướ

ố ằ ả ể c khi phát ph i ki m tra b  đ m

ườ

ữ c kh i đ ng b ng b t c  l nh nào ghi d   ộ ệ ng RXD (P3.0)  ỗ

ị ử c g i ra đ

ng TXD (P3.1). M i bit phát  ệ

ấ ở

ế ộ ạ ộ   Các ch  đ  ho t đ ng ị Ch  đ  thanh ghi d ch 8 bit (Mode 0) ượ c vào và ra qua ngõ RXD. D  li u n i ti p đ ị ấ ị Ngõ TXD là ngõ xu t xung nh p d ch, v i 1 chu k  xung nh p  ặ ẽ ượ ị c phát ho c thu d ch thì 1 bit s  đ ầ ớ ặ ượ ữ ệ c phát ho c thu v i bit đ u tiên là bit LSB D  li u đ ố ị ố ầ ở ộ  1/12 t n s  dao đ ng trên chip T c đ  baud  c  đ nh  ở ộ ự ượ ệ Vi c phát ký t  đ ệ li u vào thanh ghi SBUF, tr ữ ệ ỗ phát đã r ng. D  li u d ch ra ngòai trên đ ượ ị ớ ườ v i các xung nh p đ ợ ệ đi h p l  (trên RXD) trong m t chu k  máy, tín hi u xung  ở ề ố ậ nh p xu ng th p

ộ  S3P1 và tr  v  cao

S6P1.

ượ

Vi c thu đ

c kh i đ ng khi cho phép b  thu

ở ộ

ữ ệ ườ

ư

ể ắ ầ ượ ế ế

ố ế ị ắ ầ

ở ạ

ng

ở ộ ộ ệ ắ ắ ổ (REN) = l và ng t thu (RI)= 0. Quy t c t ng quát  ắ ầ ể ươ ng trình đ  kh i đ ng  đ t REN khi b t đ u ch ậ ồ port n i ti p, r i xóa RI đ  b t đ u nh n d  li u.  c đ a ra đ Khi RI b  xóa, các xung nh p đ ng  ỳ ữ ệ TXD, b t đ u chu k  máy k  ti p và d  li u  ị ấ ị ở ườ ng RXD. L y xung nh p   đ theo xung nh p  ườ ố ế ữ ệ cho d  li u và port n i ti p x y ra   c nh đ ủ c a TXD.

Vi D :ụ

ữ ệ

Ch

ng trình con đ   phát 1byte d  li u

ở ộ

ở ứ

c kh i đ ng khi bit cho phép REN

ờ  m c 1 và c

ự ượ  đ ở ứ

m c 0

ữ ệ

Ch

ươ PHAT:  JNB TI,$ CLR TI MOV SBUF, A RET ệ Vi c thu ký t ắ ng t thu RI  ươ ể ng trình con dùng đ  thu 1byte d  li u: THU:    JNB RI,$ CLR RI MOV A, SBUF RET

ớ ố ộ Ch  đ  1 (UART 8 bit v i t c đ

ổ ượ

c):

ế ộ ư

ộ ố ế ồ Trong ch  đ  1, port n i ti p c a 89c51 ho t đ ng nh  1  ổ ộ ạ ộ ộ ố

ụ ớ

ự ữ ệ ướ

ộ ụ  d  li u đi tr ở ứ  m c cao. Đôi khi xen thêm bit ki m tra ch n l ữ ệ ố

ổ ữ ệ ủ song song

ể ổ ữ ệ ừ ố ế n i ti p thành

ế ộ baud thay đ i đ ủ b  thu phát không đ ng b  8 bit có t c đ  baud thay đ i  (UART – Universal Asynchronous Receiver Transmitter).  ố ế ữ ệ ộ ỗ B  UART là m t d ng c  thu phát d  li u n i ti p v i m i  ấ ở ứ  m c th p và theo sau  c là bit start  ký t ẵ ẻ ể bit stop    ủ ạ ộ ữ gi a bit d  li u cu i cùng và bit stop. Ho t đ ng ch   ừ ế y u c a UART là chuy n đ i d  li u phát t ế ố ế sang n i ti p và bi n đ i d  li u thu t song song.

ữ ệ

ượ ị

Quá trình phát d  li u: ầ  SBUF đ

ng TXD c d ch ra ngoài trên đ

ằ ườ ữ ệ

ẽ ượ ệ ấ ặ c đ t lên 1 khi xu t hi n bit Stop

ượ c TXD.

ế ậ ượ t l p và đ c qui

ườ ề ả ằ ị ng truy n: b ng ngh ch đ o

T c đ  baud: do ng ở ố ủ Th i gian c a 1 bit trên đ ộ ữ ệ Ghi d  li u c n phát vào SBUF . ữ ệ ừ D  li u t ắ ầ b t đ u b ng bit Start, theo sau là 8bit d  li u và sau  cùng là bit Stop ắ ờ C  ng t phát TI s  đ trên đ ố ườ ậ ộ i l p trình thi ủ ị đ nh b i t c đ  tràn c a Timer1. ờ ủ ố c a t c đ  baud.

ữ ệ

Quá trình thu d  li u:

Đ c kh i đ ng b ng m t s  chuy n tr ng thái t

ộ ự ườ

ể ng RXD.

Vi c thu d  li u b t đ u b ng 8 bit d  li u đ

(cid:0)

ượ ở ộ ằ ứ ố ứ m c 1 xu ng m c 0 trênđ ữ ệ ượ ằ ắ ầ ữ ệ ệ c  ượ ứ ị c   Stop bit ( bit th  9) đ d ch vào trong SBUF  ờ ộ ư  c  RI  đ a vào bit RB8 thu c thanh ghi SCON  = 1

(cid:0)

ố ộ

Ch  đ  2 ­ UART 9 bit t c đ  baud

ế ộ ố ị   c  đ nh

ồ ữ ệ

ữ ệ ể ậ ượ ứ ch  đ  này d  li u thu/phát có 11bit bao g m 1bit Start,  c)

ữ ệ ố

ế ộ 8 bit d  li u, 1bit d  li u th  9 (có th  l p trình đ và cu i cùng là 1bit Stop ứ ữ ệ ữ ệ ượ Khi phát thì bit d  li u th  9 chính là d  li u đ

ẵ ư c đ a  vào bit TB8 trong thanh ghi SCON (có th  là parity  ặ ẻ ch n ho c l )

ứ ượ ư Khi thu thì bit d  li u th  9 đ c đ a vào bit RB8 trong

ữ ệ thanh ghi SCON ố ộ ặ ằ ổ T c đ  baud không đ i và b ng fOSC/32 (ho c 64)

ố ộ

Ch  đ  3 ­ UART 9 bit t c đ  baud  ổ ượ c

ế ộ thay đ i đ

Ch  đ  này gi ng nh

ượ

ế ộ

ế ộ

ộ ạ ừ ố ư ở ế ộ ố ế ộ  ch  đ  2 ngo i tr  t c đ   ể ậ ấ ượ baud có th  l p trình đ c cung c p  c và đ ố ế ộ ậ b i Timer.Th t ra các ch  đ  1, 2, 3 r t gi ng  ố ị ở ố  t c đ  baud (c  đ nh  nhau. Cái khác bi t là  ế ộ ổ trong ch  đ  2, thay đ i trong ch  đ  1 và 3) và  ế ở ố  s  bit data (8 bit trong ch  đ  1,9 trong ch   ộ đ  2 và 3).

ố ộ

ố ế

ủ T c đ  baud c a port n i ti p

ữ ệ

ượ

ơ

T c đ  baud là s  bit d  li u đ

c truy n trong 1 giây. Đ n v  tính

Đ  t o t c đ  baud thì kh i đ ng cho Timer 1 tràn sau m t

ộ ờ

ố là bit/giây (bps) ể ạ ố kho ng th i gian t

ớ ố ng  ng v i t c đ  baud. ở

ở ộ ứ ưở

ng b i 1 bit trong thanh ghi đi u

ả ộ ể

T c đ  baud cũng b   nh h ồ

ươ ị ả ấ

ủ ộ

khi n ngu n cung c p (PCON) bit 7 c a PCON là bit SMOD.  ế ộ ặ Đ t bit SMOD lên 1 làm g p đôi t c đ  baud trong các ch  đ  1,  2 và 3.

ể ặ

c đ nh đ a ch  theo bit, nên đ  đ t bit  SMOD

Vì PCON không đ ầ

ượ lên 1 c n ph i theo các l nh sau:

ờ ủ

ị ệ

ượ

ấ MOV A,PCON ; l y giá tr  hi n th i c a PCON ặ SETB ACC.7  ; đ t bit SMOD lên 1 MOV PCON,A  ; ghi giá tr  ng

c v   PCON

ố ộ

ế ộ

T c đ  baud cho ch  đ  0:

ố ộ

ế ộ

T c đ  baud cho ch  đ  1,3:

te

Timer overflowra 1

Baudrate

SMOD

;

1

16

te

Timer overflowra 1

(cid:0) (cid:0)

Baudrate

SMOD

;

0

32

(cid:0) (cid:0)

ố ộ

ế ộ   T c đ  baud cho ch  đ  2:

ể ạ

VD: S  d ng Timer 1 đ  t o xung

ử ụ ị ố ộ

nh p t c đ  baud

ế ộ i (ch  đ  2)

ế ộ ế ộ ự ạ ạ  n p l ẻ

ế ộ ế ộ ế ộ ế ộ

ế ộ

ế ộ

ọ Ch n ch  đ  cho Timer 1: Ch  đ  13 bit (ch  đ  0)  Ch  đ  16 bit (ch  đ  1) Ch  đ  8 bit t Ch  đ  chia x  (ch  đ  3)

ị ợ

ể ố ế ạ ố

ộ ố ạ N p giá tr  thích h p vào thanh ghi TH1 đ  có t c đ   ộ tràn đúng, t o ra t c đ  baud cho port n i ti p.  ọ ố ộ Ch n t c đ  baud:

ị ầ ố ộ

G i M là giá tr  c n n p cho thanh ghi  ầ TH1 đ  có t c đ  Baud theo yêu c u

ị ể ạ d ng th p phân và hex) đ  đ t

ậ ở ạ ợ ng h p sau.

ớ ầ ố b) 4800 n u SMOD = 1 v i t n s  XTAL =

ụ Ví d  1:Tìm giá tr  TH1 ( ườ ố ộ t c đ  baud cho các tr ế a) 9600 11.0592MHz

ầ ố ố V i t n s  XTAL = 11.0592MHz và SMOD = 1 ta có t n s

ớ ầ ấ c p cho Timer 1 là

fTimer = f OSC/12 = 11.0592MHz / 12 = 921600Hz Baudrate = 921600 /16 = 57600 v i SMOD =1 ậ a) 57600/9600 = 6 do v y TH1 = ­ 6 hay TH1 = FAH ậ b) 57600/4800 = 12 do v y TH1 = ­ 12 hay TH1 = F4H

ế ằ

ụ ạ ố ộ ộ

ộ t r ng b   Ví d : T o t c đ  baud 1200bps bi ử ụ dao đ ng trên chip s  d ng th ch anh 12MHz

ả ử ộ Ta có fosc =12MHz Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz Ttimer = 1/ ftimer = 1/106  = 1µs T c đ  tràn timer 1 là ( gi s  bit SMOD trong thanh ghi

ị ằ

ố PCON có giá tr  b ng 0): Ta có  f baud = f tràn T1 / 32 Suy ra  f tràn T1 = f baud x 32 = 1200x32 = 38400Hz Suy ra  T tràn T1 = 1/ f tràn T1 = 1/38400 =  26µs

ị ầ

Nh  v y giá tr  c n n p cho thanh ghi timer là ­26

T tràn T1 =26Ttimer ư ậ

ươ ể ề ữ ệ ng trình con đ  truy n d  li u trong thanh ghi A

ế ằ ộ

ọ ố ế t r ng port n i ti p h at đ ng  ầ ố ạ ớ ố ộ

ử ụ

ụ ở

trên)

ở ộ

ố ố ế

ộ ể

ự ầ

ở ộ

ể ạ ố S  d ng Timer1 đ  t o t c đ  baud (gi ng ví d   ề Kh i đ ng thanh ghi đi u khi n port n i ti p:  UART 8bit : Mode 1 (SM0 SM1= 0 1) SM2=0 Set bit c  TI =1 đ  phát ký t

l n đ u tiên ngay khi kh i đ ng

MOV TMOD,#20H MOV TH1,#­26 SETB TR1 MOV SCON,#0100 0010B CALL PHAT PHAT:  JNB TI,$

CLR TI MOV SBUF,A RET

END

ế t ch VD: Vi ở ế ộ ố ế ra port n i ti p. Bi  ch  đ   UART 8bit v i t c đ  baud là 1200bps, t n s  th ch anh là  12MHz

ế ươ ữ ệ ừ ố ế t ch port n i ti p.

ớ ố ch  đ  UART 8 bit v i t c

MOV TMOD,#20H MOV TH1,#­26 SETB TR1 MOV SCON,#0101 0000B JNB RI,$ CLR RI MOV A, SBUF END

ậ ng trình nh n 1 byte d  li u t ở ế ộ ộ ọ ố ế t r ng port n i ti p h at đ ng  ầ ố ạ VD: Vi ế ằ Bi ộ đ  baud là 1200bps, t n s  th ch anh là 12MHz.

Ví Dụ

ế

ở ổ

ữ ệ

Hãy vi

ng trình nh n liên t c d  li u 8 bít

ế

ươ t ch ử

ỳ ể ạ

c ng  ạ P0 và g i nó đ n c ng P1 trong khi nó cùng lúc t o  ộ ra m t sóng vuông chu k  200μs trên chân P2.1. Hãy  ố ử ụ s   d ng  b   Timer  0  đ   t o  ra  sóng  vuông,  t n  s   ủ c a 8051 là XTAL = 11.0592 MHz.

ử ụ ộ ở ự ộ ạ ạ ị ạ Ta s  d ng b  Timer0 đ ng n p l i) giá tr  n p

ế ộ  ch  đ  2 (t cho TH0 là 100/1.085μs = 92.

ORG  0000H

ORG  0030H

;

ữ ệ ậ ổ

ọ ấ ặ

CPL P2.1 MAIN:TMOD, #02H; Ch n b  Timer0,  MOV P0, #0FFH MOV TH0, # ­ 92 MOV IE, #82H ; L y P0 làm c ng vào nh n d  li u ; Đ t TH0 = A4H cho ­ 92 ; IE = 1000 0010 cho phép Timer0

c ng P0

ữ ệ ế

ậ ữ ệ ậ ổ ể ữ ệ

ở ộ SETB  TR0 ; Kh i đ ng b  Timer0 ừ ổ BACK:MOV A, P0 ; Nh n d  li u vào t ể MOV P1, A ; Chuy n d  li u đ n c ng P1 ế ụ SJMP BACK ; Ti p t c nh n và chuy n d  li u END

Vi D :ụ

ể ạ

Hãy vi

ng trình

ế ạ t l i ch ớ

bài t p 2 đ  t o sóng  ấ

thi

ế ầ t t n s  XTAL =  ử ụ

ộ ị

ươ ở ứ vuông v i m c cao kéo dài 1085μs và m c th p  dài 15μs v i gi 11.0592MHz. Hãy s  d ng b  đ nh th i Timer1.

ầ ử ụ

ủ ộ ị

ế ộ Vì 1085μs là 1000 × 1085μs nên ta c n s  d ng ch  đ   1 c a b  đ nh th i Timer1.

ORG  0000H  LJMP MAIN ORG  001BH LJMP ngat ORG  0030H MAIN: MOV TMOD, #10H MOV P0, #0FFH MOV TL1, #018H MOV TH1, #0FCH MOV IE, #88H

ừ ộ ; D ng b  Timer1

DJNZ R2, HERE

SETB TR1 BACK:MOV A, P0 MOV P1, A SJMP BACK Ngat: CLR  TR1 CLR  P2.1 MOV R2, #4 HERE: MOV TL1, #18H MOV TH1, #0FCH SETB TR1 SETB P2.1 RETI END

Ví D :ụ

ươ

ở ộ

ố ế ở

Vi

t ch ộ

ố ế

nh n ra P0 (gi

ế ế ng trình kh i đ ng c ng n i ti p   ch   ế ộ ớ ố đ  UART 8 bit v i t c đ  truy n 4800 bps. Vi t  ầ ố ế ổ ISR cho c ng n i ti p theo yêu c u: truy n tu n  ổ ế ự ự ừ  ‘A’ đ n ‘Z’ ra c ng n i ti p đ ng  t  t  các ký t ự ế ố ế ỗ ầ ờ  đ n c ng n i ti p thì nh n  th i m i l n có ký t ố ả ử ầ ậ ấ ề  s  t n s   v  và xu t ký t ạ th ch anh là 11.0592 MHz).

ố ế

ORG 0000h  LJMP main  ORG 0023h ; Đ a ch  ISR c a c ng n i ti p LJMP

Serial_ISR

truy n đ u tiên

ố ế

i công n i ti p

Main:  TMOD,#20h  MOV TH1,#(­6)  ộ ố MOV TL1,#(­6) ; T c đ  4800 bps SETB TR1  ầ ự MOV R7,#’A’ ; Ký t ắ ạ MOV IE,#90h ; Cho phép ng t t SETB TI ;Cho phép truy n ề

SJMP $

ế

Serial_ISR:  JNB RI, Transmit ; N u không ph i ng t do nh n

ký t

thì truy n CLR RI  ự MOV A,SBUF ; Nh n ký t

ấ MOV P0,A ; Xu t ra Port 0  SJMP exitSerial

ề ; Truy n ký t

Transmit: CLR TI  MOV A,R7  MOV SBUF,A ; Truy n ký t

INC R7 ; Qua ký t

ề ự ế  k

ư

ế ụ

CJNE R7,#’Z’+1,exitSerial ; N u ch a truy n’Z’ thì  ượ ạ c l

ế i thì  ề ừ

ề ; ti p t c truy n, ng ắ ầ MOV R7,#’A’ ; b t đ u truy n t

ký t

‘A’

exitSerial:

RETI  END