136
BÀI GING VI XNGƯỜI TRÌNH BÀY: NGUYN TRUNG NHÂN BMÔN: HTHNG ĐIN KHOA: ĐIN

bgiang_VXL

Embed Size (px)

Citation preview

Page 1: bgiang_VXL

BÀI GIẢNG VI XỬ

LÝNGƯỜI TRÌNH BÀY: NGUYỄN TRUNG NHÂN

BỘ

MÔN: HỆ

THỐNG ĐIỆN

KHOA: ĐIỆN

Page 2: bgiang_VXL

GIỚI THIỆU PHẦN CỨNGChương 1

Page 3: bgiang_VXL

• 89C51 thuộc họ MCS51• 4Kbyte EPROM (1000 chu kỳ ghi/xóa)• 128 byte RAM• 32 I/O• 2 timer/counter 16bit• 6 nguồn ngắt

Page 4: bgiang_VXL

SƠ ĐỒ CHÂN

Page 5: bgiang_VXL
Page 6: bgiang_VXL
Page 7: bgiang_VXL

MÔ TẢ CÁC CHÂN• Port 0: là port 8 bit có 2 chức năng

– Là I/O port đối với các thiết kế cỡ nhỏ ( khôngsử dụng bộ nhớ mở rộng)

– Là byte thấp của address/data bus khi thiết kếcó sử dụng bộ nhớ mở rộng

• Port 1: là I/O port 8 bit• Port 2: là port 8 bit có 2 chức năng

– Là I/O port đối với các thiết kế cỡ nhỏ ( khôngsử dụng bộ nhớ mở rộng)

– Là byte cao của address/data bus khi thiết kếcó sử dụng bộ nhớ mở rộng

Page 8: bgiang_VXL

• Port 3: là port 8 bit có nhiều chức năng– Là I/O port– Có công dụng chuyển đổi có liên hệ với các

tính năng đặc biệt của 89C51 được mô tảbởi bảng sau:

Page 9: bgiang_VXL

CÁC TÍN HIỆU ĐIỀU KHIỂN

• PSEN ( Program Store Enable)– Là tín hiệu để cho phép đọc bộ nhớ chương

trình mở rộng ( bộ nhớ ngoài)– Khi 89C51 đọc mã lệnh từ bộ nhớ chương

trình mở rộng thì PSEN được tích cực (mứcthấp) 2 lần trong mỗi chu kỳ máy

– Khi 89C51 thi hành chương trình trong ROMnội thì PSEN sẽ ở mức cao.

Page 10: bgiang_VXL

• ALE/PROG ( Program Store Enable)– ALE ( Address Latch Enable) là tín hiệu chốt

byte thấp của địa chỉ trong suốt quá trình truyxuất bộ nhớ ngoài

– Chân này cũng được làm ngõ vào xung lậptrình (PROG) cho EPROM

– Ở chế độ họat động bình thường thì xungALE có tốc độ bằng 1/6 tần số dao động trênchip và có thể được dùng làm nguồn xungnhịp cho các phần khác của hệ thống

Page 11: bgiang_VXL

• EA ( External Access)– Khi truy xuất ROM nội thì chân EA phải được nối

với nguồn +5V– Khi truy xuất ROM ngoài thì chân EA phải được

nối với GND ( 0V)• RST ( Reset)

– Khi tín hiệu này được đưa lên mức cao trong ítnhất 2 chu kỳ máy thì sẽ khởi động lại hệ thống

• XTAL1, XTAL2 :– Đây là ngõ vào và ngõ ra của bộ dao động tạo

xung nhịp• Nguồn nuôi:

– Sử dụng nguồn +5V ở chân 40 và GND ở chân20

Page 12: bgiang_VXL

TỔ CHỨC BỘ NHỚ

• 89C51 có cả ROM nội và RAM nội, tuynhiên có thể mở rộng thêm bằng các thiếtbị nhớ bên ngoài

• RAM nội bao gồm nhiều phần:– RAM lưu trữ đa dụng– RAM được địa chỉ hóa từng bit– Các bank thanh ghi– Các thanh ghi chức năng đặc biệt

Page 13: bgiang_VXL
Page 14: bgiang_VXL

• RAM đa dụng có địa chỉ từ 30H đến 7FHcó thể được truy xuất tự do dùng cáchđánh địa chỉ trực tiếp hoặc gián tiếp.

• RAM được địa chỉ hóa từng bit có địa chỉtừ 20H đến 2FH và một phần trong cácthanh ghi chức năng đặc biệt. Các bit cóthể được đặt, xóa, and, or…với một lệnhđơn.

• Có 4 bank thanh ghi, mỗi bank có 8 thanhghi từ R0 đến R7.

Page 15: bgiang_VXL

– Các bit RS1 và RS0 trong thanh ghiPSW sẽ được dùng để chọn bank thanhghi tích cực

– Trạng thái mặc định thì các thanh ghinày sẽ ở bank 0

– Lệnh sử dụng các thanh ghi này sẽ ngắnvà nhanh hơn các lệnh tương ứng sửdụng địa chỉ trực tiếp

Page 16: bgiang_VXL

• Thanh ghi PSW (từ trạng thái chươngtrình)

Page 17: bgiang_VXL

– Cờ carry (CY) được xác lập khi phép cộng cónhớ ở bit 7 và phép trừ có mượn ở bit 7

• Ví dụ : thanh ghi A đang chứa giá trị FFH, sau khithực hiện lệnh ADD A,#1 thì kết quả của phéptóan là 00H được chứa trong thanh ghi A đồng thờibit CY của thanh ghi PSW sẽ được xác lập (đặt lênmức 1)

– Cờ AC được xác lập khi phép cộng trên sốBCD có nhớ

– Cờ F0 là cờ có công dụng tổng quát dành chocác ứng dụng của người lập trình

– Cờ báo tràn OV được xác lập khi có sự trànsố học trong các phép toán cộng, trừ. Khithực hiện các phép toán với số không dấu thìkhông cần quan tâm đến cờ này.

Page 18: bgiang_VXL

– Bit parity chẵn P: tổng số các bit 1 trong thanhghi A và bit P phải là một số chẵn

• Thanh ghi B:– Được sử dụng cùng với thanh ghi A cho các

phép tóan nhân và chia• Con trỏ dữ liệu DPTR :

– Được dùng khi truy xuất bộ nhớ ngoài. DPTRdùng để xác định địa chỉ của bộ nhớ ngoàicần truy xuất

• Các thanh ghi port– P0, P1, P2, P3– Tất cả các port này đều được địa chỉ hóa

từng bit

Page 19: bgiang_VXL

• Thanh ghi định thời gian– 89C51 có 2 timer/counter 16 bit có chức năngđịnh thời gian và đếm sự kiện

– Timer 0 có 2 thanh ghi TH0 (byte cao) và TL0(byte thấp)

– Timer 1 có 2 thanh ghi TH1 (byte cao) và TL1(byte thấp)

– Hoạt động của timer được thiết lập bởi thanhghi chế độ TMOD và thanh ghi điều khiểnTCON

Page 20: bgiang_VXL

TẬP LỆNHChương 2

Page 21: bgiang_VXL

Các cách định địa chỉĐịnh địa chỉ thanh ghiĐịnh địa chỉ trực tiếpĐịnh địa chỉ gián tiếp thanh ghiĐịnh địa chỉ tức thời

Tập lệnhNhóm lệnh di chuyển dữ liệuNhóm lệnh số học và luận lýNhóm lệnh điều khiểnNhóm lệnh thực hiện trên bit

Page 22: bgiang_VXL

CÁC CÁCH ĐỊNH ĐỊA CHỈ

• Định địa chỉ thanh ghi (Rn):– 89C51 có 8 thanh ghi làm việc được kí hiệu

từ R0 đến R7.– Trong định địa chỉ thanh ghi, mã lệnh luôn

luôn có 3 bit để chỉ thị một thanh ghi– Ví dụ: MOV A, R0

Page 23: bgiang_VXL
Page 24: bgiang_VXL

• Định địa chỉ trực tiếp (direct):– Lệnh hiện hành sẽ cung cấp địa chỉ tuyệt đối

của ô nhớ sử dụng– Lệnh có ít nhất 2 byte, trong đó địa chỉ ô nhớ

chiếm 1byte– Ví dụ : MOV A, 40H

Page 25: bgiang_VXL

• Định địa chỉ gián tiếp thanh ghi (@Ri):– i = 0,1– Ri hoạt động như một con trỏ thanh ghi, nội

dung của Ri chỉ ra một ô nhớ trong Ram nội– Mã lệnh có bit thấp nhất được dùng để xácđịnh con trỏ thanh ghi nào được sử dụng

– Ví dụ : MOV A, @R0

Page 26: bgiang_VXL

• Định địa chỉ tức thời (#data):– Với lệnh này thì data không phải là địa chỉ mà

là dữ liệu thật, dữ liệu 8bit (hằng số)– Ví dụ: MOV A, #12– Khi sử dụng con trỏ dữ liệu DPTR thì cần

phải có dữ liệu 16bit (#data16)– Ví dụ : MOV DPTR, #8000H

Page 27: bgiang_VXL

NHÓM LỆNH CHUYỂN DỮ LiỆU• MOV đích, nguồn

– Chuyển dữ liệu trong không gian bộ nhớ nội– Hướng chuyển dữ liệu là từ Nguồn đến Đích

MOV A, Rn: chuyển nội dung thanh ghi Rn vàoAMOV A, @Ri: chuyển dữ liệu gián tiếp vào AMOV A, direct: chuyển dữ liệu trực tiếp từ ônhớ vào AMOV A, #data: chuyển giá trị dữ liệu tức thờivào A

Page 28: bgiang_VXL

MOV Rn, A: chuyển nội dung thanh ghi A vàothanh ghi RnMOV Rn, direct: chuyển dữ liệu trực tiếp từ ônhớ vào thanh ghi RnMOV Rn, #data: chuyển giá trị dữ liệu tức thờivào thanh ghi Rn

MOV direct, AMOV direct, RnMOV direct, directMOV direct, @RiMOV direct, #data

Page 29: bgiang_VXL

MOV @Ri, AMOV @Ri, directMOV @Ri, #data

MOV DPTR, #data16

XCH A, Rn: hóan đổi dữ liệu giữa A và thanhghi RnXCH A, direct: hoán đổi dữ liệu giữa A và ônhớ trực tiếpXCH A, @Ri: hoán đổi dữ liệu giữa A và ônhớ gián tiếp

Page 30: bgiang_VXL

• MOVX đích, nguồn– Chuyển dữ liệu giữa RAM nội và RAM bên

ngoài– Hướng chuyển dữ liệu là từ Nguồn đến Đích– Địa chỉ của ngọai vi (ô nhớ ngoài) sẽ là nội

dung của thanh ghi DPTR– Khi làm việc với bộ nhớ ngoài có dung lượng

thấp ( <256byte) thì chỉ cần 8bit địa chỉ thấp vàta sẽ sử dụng cách định địa chỉ gián tiếp thanhghi @Ri để chứa địa chỉ 8bit này

Page 31: bgiang_VXL

MOVX @Ri, A: ghi dữ liệu từ A ra ô nhớ ngòaiMOVX A, @Ri: đọc dữ liệu từ ô nhớ ngòai vềAMOVX @DPTR, A : ghi dữ liệu từ A ra ô nhớngòaiMOVX A, @DPTR : đọc dữ liệu từ ô nhớngòai về A

Page 32: bgiang_VXL

Ví dụ áp dụng:• Ở trạng thái ban đầu thanh ghi R1 chứa giá trị

40H, ô nhớ Ram nội ở địa chỉ 40H chứa giá trịFFH, sau khi thực thi lệnh các thanh ghi và ô nhớsẽ có giá trị như thế nào?– MOV A, R1

• Nội dung của A là 40H; Nội dung của R1 là 40H; Nội dung củaô nhớ 40H là FFH

– MOV A, @R1• Nội dung của A là FFH; Nội dung của R1 là 40H; Nội dung của

ô nhớ 40H là FFH

– MOV A, 40H• Nội dung của A là FFH; Nội dung của R1 là 40H; Nội dung của

ô nhớ 40H là FFH

– MOV A, #40H

Page 33: bgiang_VXL

NHÓM LỆNH SỐ HỌC VÀ LUẬN LÝ

• ADD, ADDC : lệnh cộng dữ liệu– Lệnh cộng sẽ lưu kết quả tính tóan vào thanh

ghi A– Lệnh cộng sẽ tác động đến cờ CY trong thanh

ghi PSW– Lệnh ADDC sẽ cộng cả nội dung của cờ nhớ

CY– Ví dụ : A chứa giá trị là 12H, sau khi thực hiện

lệnh ADD A, #36H thì giá trị của A sẽ là 48H vàbit cờ CY=0

Page 34: bgiang_VXL

• SUBB: lệnh trừ dữ liệu– Lệnh trừ sẽ lưu kết quả tính tóan vào thanh ghi

A– Lệnh trừ sẽ tác động đến cờ CY trong thanh

ghi PSW– Để cho kết quả của phép toán được chính xác

thì trước khi dùng lệnh trừ ta nên xóa cờ CY– Ví dụ lệnh SUBB A, R1 sẽ thực hiện phép

tóan: nội dung của thanh ghi A - nội dung củathanh ghi R1 - nội dung bit cờ CY . Kết quảcất trở lại vào thanh ghi A

Page 35: bgiang_VXL

• INC: lệnh tăng lên 1 đơn vị– Lệnh này không tác động đến cờ CY

• DEC: lệnh giảm đi 1 đơn vị– Lệnh này không tác động đến cờ CY

• MUL A,B : lệnh nhân– Lệnh này lấy nội dung của thanh ghi A nhân

với nội dung của thanh ghi B. Byte thấp củakết quả được cất vào A, byte cao của kết quảđược cất vào B

• DIV A,B: lệnh chia– Lệnh này lấy nội dung của thanh ghi A chia cho

nội dung của thanh ghi B. Phần nguyên củakết quả được cất vào A, phần dư của kết quảđược cất vào B

Page 36: bgiang_VXL

• Nhóm lệnh luận lý– ANL : lệnh AND– ORL : lệnh OR– XRL : lệnh XOR– RL A: lệnh quay trái thanh ghi A đi 1 bit– RR A: lệnh quay phải thanh ghi A đi 1 bit– RLC A: quay trái thanh ghi A có cờ CY– RRC A: quay phải thanh ghi A có cờ CY– SWAP A: hóan đổi nội dung 4 bit cao và 4 bit

thấp của thanh ghi A ( tương đương với quay 4lần)

Page 37: bgiang_VXL

NHÓM LỆNH THỰC HIỆN TRÊN BIT

• CLR C : xóa cờ carry (CY) về 0• CLR bit : xóa bit về 0

• SETB C : đặt bit cờ carry lên 1• SETB bit : đặt bit lên 1

• CPL C : lấy bù 1 của cờ carry• CPL bit : lấy bù 1 của bit

Page 38: bgiang_VXL

• MOV C, bit : chuyển bit vào cờ carry• MOV bit, C : chuyển cờ carry vào bit

• ANL C,bit : AND cờ carry với bit, kết quảcất vào C

• ANL C,/bit : AND cờ carry với bù 1 của bit,kết quả cất vào C

• ORL C,bit : OR cờ carry với bit, kết quả cấtvào C

• ORL C,/bit : OR cờ carry với bù 1 của bit,kết quả cất vào C

Page 39: bgiang_VXL

NHÓM LỆNH ĐIỀU KHIỂN• Lệnh gọi chương trình con

– ACALL : gọi chương trình con dùng địa chỉtuyệt đối

– LCALL : gọi chương trình con dùng địa chỉ dài• Lệnh thoát

– RET : trở về chương trình chính từ lệnh gọichương trình con

– RETI : trở về chương trình chính từ lệnh gọichương trình con phục vụ ngắt

Page 40: bgiang_VXL

• Lệnh nhảy không điều kiện– AJMP : lệnh nhảy tuyệt đối– LJMP : lệnh nhảy dài– SJMP : lệnh nhảy ngắn

• Lệnh nhảy có điều kiện– JZ: nhảy nếu A =0– JNZ: nhảy nếu A ≠ 0– JC : nhảy nếu C=1– JNC: nhảy nếu C=0– JB bit: nhảy nếu bit=1– JNB bit: nhảy nếu bit=0

Page 41: bgiang_VXL

– CJNE A, direct, rel : so sánh dữ liệu trong ônhớ trực tiếp với nội dung của A và nhảy đếnnhãn rel nếu kết quả không bằng nhau

– CJNE A, #data, rel : so sánh dữ liệu tức thờivới nội dung của A và nhảy đến nhãn rel nếukết quả không bằng nhau

– CJNE Rn, #data, rel : so sánh dữ liệu tức thờivới nội dung của thanh ghi Rn và nhảy đếnnhãn rel nếu kết quả không bằng nhau

– CJNE @Ri, #data, rel : so sánh dữ liệu tứcthời với gián tiếp thanh ghi và nhảy đến nhãnrel nếu kết quả không bằng nhau

Page 42: bgiang_VXL

– DJNZ Rn, rel: giảm nội dung thanh ghi Rn đi 1đơn vị sau đó so sánh với 0 và nhảy đến nhãnrel nếu kết quả khác 0

– DJNZ direct, rel: giảm nội dung ô nhớ trực tiếpđi 1 đơn vị sau đó so sánh với 0 và nhảy đếnnhãn rel nếu kết quả khác 0

– NOP: lệnh này không làm gì cả nhưng PC vẫntăng lên 1

Page 43: bgiang_VXL

BÀI TẬP ÁP DỤNGChương 2: TẬP LỆNH

Page 44: bgiang_VXL

• Bài 1:Hãy cho biết các lệnh dưới đây thực hiện côngviệc gì? Các địa chỉ bit nào được đặt lên 1 saukhi thực hiện xong lệnh.

MOV R0, # 26HMOV @R0, # 7AH

– Nạp giá trị 26H vào R0– Ghi giá trị 7AH vào ô nhớ Ram nội tại địa chỉ

26H– Do 7AH = 01111010 nên các bit có địa chỉ

36H,35H,34H,33H,31H của ô nhớ 26H sẽđược đặt lên mức 1

Page 45: bgiang_VXL

• Bài 2:Hãy cho biết các lệnh dưới đây thực hiện côngviệc gì? Giá trị của thanh ghi và ô nhớ sau khithực hiện xong lệnh?

MOV R1, # 25HMOV A, # 50HMOV @R1, A

– Nạp giá trị 25H vào R1– Nạp giá trị 50H vào A– Chuyển giá trị 50H vào ô nhớ Ram nội tại địa

chỉ 25H– R1= 25H; A=50H; (ô nhớ 25H) = 50H

Page 46: bgiang_VXL

• Bài 3:Hãy cho viết chương trình thực hiện cổng logicsau:

MOV C, P1.4ORL C, P1.5CPL CMOV P1.7, C

Page 47: bgiang_VXL

Bài 4: a. Viết chương trình cho 8 led sángb. Viết chương trình cho 4 led D1-D4 sángc. Viết chương trình cho 2 led D3-D4

Page 48: bgiang_VXL

Bài 5: a. Viết chương trình cho 8 led sángb. Viết chương trình cho 4 led D1-D4 sángc. Viết chương trình cho 2 led D3-D4

Page 49: bgiang_VXL

TIMER- BỘ ĐỊNH THÌChương 3

Page 50: bgiang_VXL

GIỚI THIỆU• 89C51 có 2 timer 16bit, mỗi timer có 4 chế độ làm việc

• Timer được sử dụng để:– Định khoảng thời gian– Đếm sự kiện– Phát tốc độ baud cho port nối tiếp

• Timer được truy cập khi sử dụng các thanh ghi chức năng đặc biệt: TCON, TMOD, TH0, TL0, TH1, TL1

Page 51: bgiang_VXL

THANH GHI TMOD (Timer Mode Register)

• Thanh ghi TMOD dùng để xác định chế độ làm việc cho Timer 0 và Timer 1

• TMOD không được địa chỉ hóa từng bit.• Nạp bằng phần mềm khi bắt đầu chương trình

Page 52: bgiang_VXL

• Gate: bit mở cổng cho timer– Khi Gate=1: Timer/Counterx chỉ hoạt động khi

chân INTx ở mức 1(phần cứng) và bit TRx =1 (trong thanh ghi TCON)

– Khi Gate=0: Timerx họat động khi bit TRx=1• Ghi chú: X = 0,1

– TRx : TR0 hoặc TR1– Timerx: Timer 0 hoặc Timer 1

• C/T : bit chọn Timer hay Counter– C/T=1 : chọn Counter (đếm sự kiện)– C/T=0 : chọn Timer (định khoảng thời gian)

Page 53: bgiang_VXL

• M1,M0 : các bit chọn chế độ

Page 54: bgiang_VXL

THANH GHI TCON (Timer Control Register)

• Thanh ghi TCON chứa các bit trạng thái và điều khiển cho Timer 0 và Timer 1.

• Được địa chỉ hóa từng bit

• TFx: cờ báo tràn timer. Cờ này được đặt bởi phần cứng khi tràn timer, được xóa bằng phần mềm. Ví dụ: timer 16bit sẽ đếm lên từ 0000H đến FFFFH, do đó tràn timer xảy ra khi số đếm tràn từ FFFFH sang 0000H.

Page 55: bgiang_VXL

•TRx: bit điều khiển timer chạy, được đặt/xóa bằng phần mềm để điều khiển timer chạy/dừng

Page 56: bgiang_VXL

– TRx=1: cho phép timer chạy– TRx=0: dừng timer

• IE1: cờ ngắt ngoài 1, được đặt bởi phần cứng khi phát hiện một cạnh xuống hay một mức thấp ở ngõ INT1, xóa bằng phần cứng khi xử lý ngắt

• IT1: bit điều khiển ngắt ngoài 1, được đặt hay xóa bằng phần mềm để xác định ngắt ngoài 1 tích cực khi có một cạnh xuống hay khi có một mức thấp ở chân INT1

Page 57: bgiang_VXL

• IE0: cờ ngắt ngoài 0, được đặt bởi phần cứng khi phát hiện một cạnh xuống hay một mức thấp ở ngõ INT0, xóa bằng phần cứng khi xử lý ngắt

• IT0: bit điều khiển ngắt ngoài 0, được đặt hay xóa bằng phần mềm để xác định ngắt ngoài 1 tích cực khi có một cạnh xuống hay khi có một mức thấp ở chân INT0

Page 58: bgiang_VXL

CÁC CHẾ ĐỘ HOẠT ĐỘNG CỦA TIMER

• Chế độ 0: – Chế độ timer 13bit, tương thích với 8048 – Trong chế độ này không sử dụng 3bit cao của

thanh ghi TLx, chỉ sử dụng THx và 5bit thấp của TLx

– Giá trị đếm được là từ 0 đến ( 213 -1)Ttimernghiã là từ 0 đến 8191Ttimer

Page 59: bgiang_VXL

• Chế độ 1: – Chế độ timer 16bit– Trong chế độ này sử dụng cả 2 thanh ghi THx

và TLx– Cờ báo tràn là bit TFx trong thanh ghi TCON, được đọc hoặc ghi bằng phần mềm

– Bit có trọng số cao (MSB) trong các thanh ghi timer là bit 7 của THx; bit có trọng số thấp (LSB) là bit 0 của TLx

– Các thanh ghi timer có thể được đọc/ghi bất cứ lúc nào bằng phần mềm

– Giá trị đếm được là từ 0 đến ( 216 -1)Ttimernghiã là từ 0 đến 65535Ttimer

Page 60: bgiang_VXL

• Chế độ 2: – Chế độ timer 8bit tự động nạp lại giá trị ban đầu

– Trong chế độ thanh ghi TLx hoạt động như một timer 8bit, trong khi đó thanh ghi THx vẫn giữ nguyên giá trị được nạp

– Khi số đếm tràn từ FFH sang 00H thì cờ tràn timer được đặt lên 1 đồng thời giá trị trong THx được nạp lại vào TLx và chu trình đếm mới được bắt đầu

– Chế độ này rất thông dụng vì sự tràn timer xảy ra trong những khoảng thời gian nhất định và tuần hòan một khi đã khởi động bộ đếm

– Giá trị đếm được là từ 0 đến ( 28 -1)Ttimernghiã là từ 0 đến 255Ttimer

Page 61: bgiang_VXL

• Chế độ 3: – Chế độ tách timer. Timer 0 được tách thành 2

timer 8bit: TH0 và TL0.Timer 1 dừng– TL0 có cờ báo tràn là TF0; TH0 có cờ báo

tràn là TF1

Page 62: bgiang_VXL

NGUỒN TẠO XUNG NHỊP CHO TIMER

Có 2 nguồn xung nhịp có thể được sử dụngvà nó được chọn bằng bit C/T trong thanhghi TMOD khi khởi động timer.• Xung nhịp định khoảng thời gian:

– Khi C/T =0 thì timer được dùng để địnhkhoảng thời gian.– Nguồn xung nhịp được lấy từ bộ dao độngtrên chip đưa qua một bộ chia 12 để giảm đếntần số thích hợp cho phần lớn các ứng dụng.– ftimer = fosc/12

Page 63: bgiang_VXL

• Xung nhịp đếm sự kiện:– Khi C/T =1 thì timer được dùng cho việc đếm

sự kiện– Xung nhịp được lấy từ nguồn bên ngoài thông

qua ngõ T0 hoặc T1, nguồn bên ngoài sẽcung cấp một xung khi xảy ra một sự kiện

– Giá trị trong các thanh ghi timer (THx và TLx)sẽ tăng lên 1 khi có một sự kiện xảy ra.

– Số sự kiện được xác định bằng phần mềmbằng cách đọc các thanh ghi timer.

Page 64: bgiang_VXL

CÁC BƯỚC CƠ BẢN ĐỂ KHỞI ĐỘNG TIMER

• Nạp giá trị bắt đầu cho thanh ghi TMOD:lựa chọn chế độ cho timer, cho bit Gate=0,C/T=0

• Nạp các giá trị thích hợp cho các thanhghi THx và TLx

• Cho timer chạy : SETB TRx• Chờ cờ báo tràn: có 2 cách:

– JNB TFx, $– Wait: JNB TFx, Wait

Page 65: bgiang_VXL

• Xóa cờ báo tràn:– CLR TFx

• Dừng timer:– CLR TRx

Ví dụ 1:Viết chương trình tạo trễ (delay)100µs dùng Timer 0, biết rằng bộ dao động trên chip sử dụng thạch anh 12MHz.

Page 66: bgiang_VXL

• Bước 1: Tìm tần số dao động và chu kỳ xung nhịp timer:– Ta có fosc =12MHz– Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz– Ttimer = 1/ ftimer = 1/106 = 1µs

• Bước 2: Xác định giá trị cần nạp cho các thanh ghi timer– Ta có tdelay =100µs– Mà Ttimer = 1µs– Suy ra : tdelay =100Ttimer

Page 67: bgiang_VXL

– Do timer họat động như là một bộ đếm lên vàkhi bộ đếm bị tràn thì nó sẽ quay lại về giá trị0 nên giá trị phải nạp cho các thanh ghi timerlà -100

• Bước 3: Xác định giá trị cần nạp chothanh ghi chế độ timer TMOD– Do tdelay =100Ttimer , giá trị này <255 nên

chúng ta có thể chọn timer ở chế độ 1(16bit)hay chế độ 2 (8bit tự động nạp lại)

• Bước 4: Cho timer chạy• Bước 5: Chờ cờ báo tràn• Bước 6: Xóa cờ báo tràn• Bước 7: Dừng timer

Page 68: bgiang_VXL

• Chương trình hoàn chỉnh khi sử dụngTimer 0 ở chế độ 2:

MOV TMOD,# 0000 0010 BMOV TH0,# -100SETB TR0JNB TF0,$CLR TF0CLR TR0END

Page 69: bgiang_VXL

• Chương trình hoàn chỉnh khi sử dụng Timer0 ở chế độ 1:

MOV TMOD,# 0000 0001 BMOV TH0,# high(-100) ; lệnh này sẽ chuyển giá trị -100

sang mã nhị phân và sau đó lấy8bit cao của giá trị này gán vàothanh ghi TH0

MOV TL0,# low(-100) ; lệnh này sẽ chuyển giá trị -100sang mã nhị phân và sau đó lấy8bit thấp của giá trị này gán vàothanh ghi TL0

SETB TR0JNB TF0,$CLR TF0CLR TR0END

Page 70: bgiang_VXL

Ví dụ 2: Viết chương trình tạo trễ 10ms,sử dụng timer 1, tần số dao động trênchip là 12MHz

• Bước 1: Tìm tần số dao động và chu kỳ xung nhịp timer:– Ta có fosc =12MHz– Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz– Ttimer = 1/ ftimer = 1/106 = 1µs

Page 71: bgiang_VXL

• Bước 2: Xác định giá trị cần nạp cho cácthanh ghi timer– Ta có tdelay =10ms– Mà Ttimer = 1µs– Suy ra : tdelay =10000Ttimer

• Bước 3: Xác định giá trị cần nạp chothanh ghi chế độ timer TMOD– Do tdelay =10000Ttimer , nên ta chọn timer ở

chế độ 1(16bit)

Page 72: bgiang_VXL

• Chương trình hoàn chỉnh khi sử dụng Timer 1 ở chế độ 1:

MOV TMOD,#0001 0000 BMOV TH1,#high(-10000)MOV TL1,#low(-10000)SETB TR1JNB TF1, $CLR TF1CLR TR1END

Page 73: bgiang_VXL

Ví dụ 3: Viết chương trình tạo sóngvuông 50% có tần số 10KHz ở ngõ raP1.0, biết tần số dao động trên chip là12MHz

• Bước 1: Tìm tần số dao động và chu kỳ xung nhịp timer:– Ta có fosc =12MHz– Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz– Ttimer = 1/ ftimer = 1/106 = 1µs

Page 74: bgiang_VXL

• Bước 2: Xác định giá trị cần nạp cho cácthanh ghi timer– Ta có tần số xung vuông là 10KHz nên chu kỳ

của xung vuông là T=1/(10.103)=10-4s=100µs– Do xung vuông 50% nên thời gian xung ở

mức cao bằng thời gian xung ở mức thấp :tH = tL = T/2 = 50µs

– Ở đây ta có thể sử dụng 1 timer để tạo thờigian trể là 50µs

Page 75: bgiang_VXL

• Cách 1:MOV TMOD, # 0000 0010BMOV TH0,# -50SETB TR0

LOOP: JNB TF0,$CLR TF0CPL P1.0SJMP LOOPEND

Page 76: bgiang_VXL

• Cách 2:LOOP: SETB P1.0

ACALL Delay_50usCLR P1.0ACALL Delay_50usSJMP LOOP

Delay_50us:MOV TMOD, # 0000 0010BMOV TH0,# -50SETB TR0JNB TF0,$CLR TF0RETEND

Page 77: bgiang_VXL

Ví dụ 4: Hãy cho biết đoạn chương trìnhsau làm công việc gì? biết tần số daođộng trên chip là 12MHz

LOOP: SETB P1.0CLR P1.0SJMP LOOPEND

Page 78: bgiang_VXL

Ví dụ 5: Hãy cho biết đoạn chương trìnhcon SUB làm công việc gì? biết tần sốdao động trên chip là 12MHz

SUB: MOV R0,#250DJNZ R0,$RETEND

Page 79: bgiang_VXL

Ví dụ 6: Hãy cho biết đoạn chương trìnhcon SUB làm công việc gì? biết tần sốdao động trên chip là 12MHz

SUB: MOV R0,#250LOOP: NOP

NOPDJNZ R0,LOOPRETEND

Page 80: bgiang_VXL

Ví dụ 7: Hãy viết chương trình điều khiểncác led sáng luân phiên, thời gian sángcủa mỗi led là 1ms. Biết tần số dao độngtrên chip là 12MHz

Page 81: bgiang_VXL

HOẠT ĐỘNG CỦA PORT NỐI TIẾP ( SERIAL PORT)

Chương 4

Page 82: bgiang_VXL

GIỚI THIỆU • 89C51 có một port nối tiếp hoạt động ở

nhiều chế độ trên một dãi tần số rộng• Chức năng: chuyển dữ liệu từ song song

sang nối tiếp đối với dữ liệu xuất và từ nốitiếp sang song song đối với dữ liệu nhập

• Port nối tiếp được truy xuất qua các chânTXD và RXD. Dữ liệu được thu (nhập) quachân RXD (P3.0) và dữ liệu được phát(xuất) qua chân TXD (P3.1)

Page 83: bgiang_VXL

• Tại mỗi thời điểm chỉ có 1bit được thuhoặc phát. Để đồng bộ giữa thu và phátnối tiếp người ta sử dụng tốc độ baud

• Port nối tiếp họat động song công và cóđệm lúc thu cho phép một ký tự được thuvà được giữ trong khi ký tự thứ 2 đượcnhận. Nếu CPU đọc ký tự thứ nhất trướckhi ký tự thứ 2 được thu đầy đủ thì dữ liệusẽ không bị mất.

• Hai thanh ghi SBUF và SCON dùng đểtruy xuất port nối tiếp

Page 84: bgiang_VXL
Page 85: bgiang_VXL

THANH GHI ĐỆM NỐI TiẾP SBUF• 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ẽ được ghi vào SBUF vàđược phát qua ngõ TXD, trong trường hợpnày nó là bộ đệm phát

– Dữ liệu thu sẽ được nạp vào SBUF thông quangõ RXD và đọc thanh ghi này để truy xuấtdữ liệu thu được, trong trường hợp này nó làbộ đệm thu

Page 86: bgiang_VXL

• Port nối tiếp được dùng để cất dữ liệuphát hoặc thu, khi dịch hết 8 bit thì một dữliệu được phát hoặc được nhận.

• Tốc độ baud của port nối tiếp có thể lấy từbộ dao động trên chip hoặc sử dụng timer.

Page 87: bgiang_VXL

THANH GHI ĐiỀU KHIỂN PORT NỐI TiẾP SCON

• Thanh ghi này được dùng để điều khiển chế độ hoạt động của port nối tiếp

• Được địa chỉ hóa từng bit

• Trong đó :– REN = 1: Cho phép thu– REN = 0: cấm

Page 88: bgiang_VXL

– TI : cờ ngắt phát• TI được đặt lên mức 1 khi bộ đệm phát đã rỗng

(kết thúc việc phát 1 ký tự). • Được xóa bằng phần mềm

– RI : cờ ngắt thu• RI được đặt lên mức 1 khi bộ đệm thu đã đầy (đã

nhận đủ 1 ký tự)• Được xóa bằng phần mềm

– TB8: bit thứ 9 được phát trong chế độ UART 9bit, bit này được đặt hoặc xóa bằng phần mềm

– RB8: bit thứ 9 thu được trong chế độ UART 9bit

Page 89: bgiang_VXL

– SM2:• SM2 =1: Port nối tiếp họat động ở chế độ truyền

thông đa xử lý trong các chế độ 2 và 3; bit cờ RIsẽ không được đặt lên 1 nếu bit thứ 9 thu được là0

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

Page 90: bgiang_VXL

CÁC CHẾ ĐỘ HỌAT ĐỘNG• Chế độ thanh ghi dịch (Mode 0):

– Dữ liệu nối tiếp được vào (thu) và ra (phát) qua ngõ RXD.

– Ngõ TXD là ngõ xuất xung nhịp dịch, với 1 chu kỳ xung nhịp dịch thì 1bit sẽ được phát hoặc thu

– Dữ liệu được phát hoặc thu với bit đầu tiên là bit LSB

– Xung nhịp tốc độ baud cố định ở 1/12 tần số dao động trên chip

Page 91: bgiang_VXL

– Việc phát ký tự được khởi động bằng bất cứlệnh nào ghi dữ liệu vào thanh ghi SBUF,trước khi phát phải kiểm tra bộ đệm phát đãrỗng

– Chương trìnhh con để phát 1byte dữ liệuPHAT: JNB TI,$

CLR TIMOV SBUF, ARET

Page 92: bgiang_VXL

– Việc thu ký tự được khởi động khi bit chophép REN ở mức 1 và cờ ngắt thu RI ở mức0

– Chương trình con dùng để thu 1byte dữ liệu:THU: JNB RI,$

CLR RIMOV A, SBUFRET

Page 93: bgiang_VXL

• Chế độ UART 8bit tốc độ baud thay đổiđược (Mode 1):– UART: ký tự thu/phát gồm các bit dữ liệuđược đi trước bằng 1bit Start, theo sau cùnglà 1bit Stop, có thể có thêm bit parity giữa bitdữ liệu cuối cùng và bit Stop.

• UART 8bit: dữ liệu thu/phát gồm 8bit dữ liệu, 1bitStart ở mức thấp, 1bit Stop ở mức cao. Phát trênchân TXD, thu trên chân RXD

– Tốc độ baud được đặt bằng tốc độ báo tràncủa Timer 1

Page 94: bgiang_VXL

– Truyền dữ liệu được khởi động bằng cách ghi dữ liệu vào SBUF và bộ đếm 4bit sẽ cung cấp xung nhịp tốc độ baud. Dữ liệu được dịch ra ngoài trên đường TXD 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ẽ được đặt lên 1 khi xuất hiện bit Stop trên được TXD

Page 95: bgiang_VXL

– Thu dữ liệu được khởi động bằng một sựchuyển trạng thái từ 1 xuống 0 trên đườngRXD. Bộ đếm tức thời được xóa để đồng bộsố đếm với chuỗi bit đến.

• Chuỗi bit đến được lấy mẫu giữa 16 lần đếm• Bộ thu sẽ phát hiện được bit Start sai bằng cách

yêu cầu trạng thái 0 ở lần đếm thứ 8 sau khi cóchuyển trạng thái từ 1 xuống 0 đầu tiên. Nếu điềunày không xảy ra thì bộ thu được reset và quay vềtrạng thái nghỉ, đợi chuyển trạng thái từ 1 xuống 0kế tiếp

Page 96: bgiang_VXL

• Khi phát hiện được bit Start hợp lệ thì tiếp tục thuký tự. Bit Start được bỏ qua và 8bit dữ liệu đượcđưa vào thanh ghi dịch port nối tiếp theo xung nhịptốc độ baud.

• Khi đã nhận đủ 8bit thì bit Stop được đưa vào bitRB8 trong thanh ghi SCON, thanh ghi SBUF đượcnạp 8bit dữ liệu, cờ ngắt thu RI được đặt lên 1

Page 97: bgiang_VXL

• Chế độ UART 9bit tốc độ baud cố định(Mode 2)– Trong chế độ này dữ liệu thu/phát có 11bit

bao gồm 1bit Start, 8bit dữ liệu, 1bit dữ liệuthứ 9 (có thể lập trình được) 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 bitRB8 trong thanh ghi SCON

Page 98: bgiang_VXL

– Xung nhịp tốc độ baud được lấy từ bộ dao động trên chip:

Page 99: bgiang_VXL

• UART 9bit tốc độ baud thay đổi được(Mode 3)– Chế độ này họat động giống chế độ 2 (Mode

2) tuy nhiên tốc độ baud có thể thay đổi đượcthông qua việc lập trình cho Timer 1

– Xung nhịp tốc độ baud:

Page 100: bgiang_VXL

TỐC ĐỘ BAUD PORT NỐI TiẾP

• Tốc độ baud là số bit dữ liệu được truyềntrong 1 giây. Đơn vị tính là bit/giây (bps)

• Để tạo tốc độ baud thì khởi động choTimer 1 tràn sau một khoảng thời giantương ứng với tốc độ baud

• Ví dụ: tạo tốc độ baud 1200bps biết rằngbộ dao động trên chip sử dụng thạch anh12MHz

Page 101: bgiang_VXL

– 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

T tràn T1 =26Ttimer

• Như vậy giá trị cần nạp cho thanh ghi timer là -26

Page 102: bgiang_VXL

– Đoạn chương trình tạo tốc độ baud:MOV TMOD,#0010 0000BMOV TH1,# -26SETB TR1

Page 103: bgiang_VXL

• Bài tập 1:Viết chương trình con để truyền dữ liệu trongthanh ghi A ra port nối tiếp. Biết rằng port nốitiếp họat động ở chế độ UART 8bit với tốc độbaud là 1200bps, tần số thạch anh là 12MHz

Page 104: bgiang_VXL

• Sử dụng Timer1 để tạo tốc độ baud (giốngví dụ ở trên)

• Khởi động thanh ghi điều khiển port nốitiế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

Page 105: bgiang_VXL

• Chương trình:MOV TMOD,#20HMOV TH1,#-26SETB TR1MOV SCON,#0100 0010BCALL PHAT

PHAT: JNB TI,$CLR TIMOV SBUF,ARETEND

Page 106: bgiang_VXL

• Bài tập 2:Viết chương trình con để truyền ký tự mã ASCIItrong thanh ghi A ra port nối tiếp với bit paritychẵn được thêm vào ở bit thứ 8. Khi ra khỏichương trình con phải trả lại ký tự mã ASCII banđầu . Biết rằng port nối tiếp họat động ở chế độUART 8bit với tốc độ baud là 1200bps, tần sốthạch anh là 12MHz

Page 107: bgiang_VXL

• Mã ASCII là các ký tự 7bit• Bit P trong thanh ghi PSW là bit parity

chẵn• Sử dụng Timer1 để tạo tốc độ baud (giống

ví dụ ở trên)• 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

Page 108: bgiang_VXL

• Chương trình:MOV TMOD,#20HMOV TH1,#-26SETB TR1MOV SCON,#0100 0010BCALL PHAT

PHAT: MOV C, PMOV ACC.7, CJNB TI,$CLR TIMOV SBUF,ACLR ACC.7RETEND

Page 109: bgiang_VXL

• Bài tập 3:Viết chương trình nhận 1 byte dữ liệu từ port nốitiếp .. Biết rằng port nối tiếp họat động ở chế độUART 8bit với tốc độ baud là 1200bps, tần sốthạch anh là 12MHz.

MOV TMOD,#20HMOV TH1,#-26SETB TR1MOV SCON,#0101 0000BJNB RI,$CLR RIMOV A, SBUFEND

Page 110: bgiang_VXL

CHẾ ĐỘ TRUYỀN THÔNG ĐA XỬ LÝ

Page 111: bgiang_VXL

• Đây là một dạng mạng 89C51 kiểu chủ/tớ• Khi bộ xử lý chủ (Master) muốn truyền dữ

liệu đến một trong các bộ xử lý tớ (Slaver)trước hết phải gởi đi một byte địa chỉ đểxác định đích đến. Các slaver sẽ kiểm traxem địa chỉ đó có đúng địa chỉ của mìnhhay không, nếu đúng thì nó sẽ xóa bitSM2 của nó và chuẩn bị nhận dữ liệu. Cácslaver không đúng địa chỉ sẽ giữ SM2 =1và không nhận dữ liệu

Page 112: bgiang_VXL

TỔ CHỨC NGẮT (INTERRUPT)Chương 5

Page 113: bgiang_VXL

GiỚI THIỆU• Ngắt là một sự kiện mà nó gây ra treo tạm

thời chương trình chính để thực thi chươngtrình khác .

• Ngắt cho phép hệ thống đáp ứng bất đồng bộvới một sự kiện và giải quyết sự kiện đótrong khi một chương trình khác đang thựcthi

• Ngắt làm cho một hệ thống có ảo giác làđang làm nhiều việc đồng thời (dĩ nhiên làCPU không thể thực thi mỗi lần hơn 1 lệnh)

Page 114: bgiang_VXL

• Đối với hệ thống được điều khiển bằngngắt thì sự ngắt quãng không xảy ra nhưkết quả của một lệnh gọi chương trình conmà là đáp ứng với một sự kiện bất đồngbộ với chương trình chính (không phụthuộc vào vòng quét của chương trìnhchính)

• Chương trình giải quyết các ngắt gọi làchương trình con phục vụ ngắt (hay bộ xửlý ngắt) ISR

Page 115: bgiang_VXL
Page 116: bgiang_VXL

TỔ CHỨC NGẮT• 89C51 có 6 nguồn ngắt: 2 ngắt ngoài, 3

ngắt timer, 1 ngắt port nối tiếp• Các nguồn ngắt bị cấm sau khi reset hệ

thống và cho phép bằng phần mềm• Khi có nhiều ngắt xảy ra đồng thời hoặc

có một ngắt xảy ra khi ngắt khác đangđược phục vụ thì phải xác định mức độ ưutiên của các ngắt hoặc bằng việc hỏi vòngtuần tự

Page 117: bgiang_VXL

• Mỗi nguồn ngắt được cho phép hoặc cấm qua thanh ghi IE (Interrupt Enable). Thanh ghi này được địa chỉ hóa từng bit:

Page 118: bgiang_VXL

• Mỗi nguồn ngắt được lập trình một trong 2 mức ưu tiên qua thanh ghi IP, thanh ghi này được địa chỉ hóa từng bit:

Page 119: bgiang_VXL

• Thanh ghi IP bị xóa sau khi reset hệthống. Ý tưởng ưu tiên cho phép một ISTsẽ bị ngắt bởi một ngắt khác có mức ưutiên cao hơn

• Nếu hai ngắt có cùng độ ưu tiên xảy rađồng thời thì sự hỏi vòng tuần tự sẽ xácđịnh ngắt nào được phục vụ trước tiên

• Chương trình chính thực thi ở mức nền vàkhông liên hệ với bất kỳ ngắt nào, có thểluôn luôn bị ngắt quãng.

Page 120: bgiang_VXL

• Việc hỏi vòng tuần tự sẽ theo thứ tự sau:Ngắt ngòai 0 → ngắt timer 0 → ngắt ngoài 1→ngắt timer 1→ ngắt port nối tiếp → ngắt timer 2Nghĩa là ngắt nào được hỏi vòng trước thìđược thực hiện trước nếu có cùng độ ưu tiên

Page 121: bgiang_VXL

• Vectơ ngắt:Các chương trình con phục vụ ngắt (ISR)phải được viết đúng vùng địa chỉ dành cho nóđể khi có yêu cầu ngắt xảy ra thì giá trị củaPC sẽ được trỏ đến đúng địa chỉ vùng ngắt đógọi là các vectơ ngắt.

Page 122: bgiang_VXL

• Xử lý ngắt:– Khi một ngắt xảy ra và được CPU chấp nhận,

chương trình chính bị ngắt quãng trong khitruy xuất đến ISR.

– Lệnh RETI ở cuối ISR điều khiển PC quay trởvề chương trình chính

– Những hoạt động sau xảy ra khi có ngắt:• Lệnh hiện hành hòan tất việc thực thi• Cất PC vào ngăn xếp• Trạng thái ngắt hiện hành được lưu trữ• Các ngắt bị chặn ở mức ngắt• PC được nạp địa chỉ vectơ ngắt• ISR được thực thi

Page 123: bgiang_VXL

ISR thực thi và đáp ứng ngắt, nó được hoàntất bằng lệnh RETI, PC được nạp lại giá trị cũtừ ngăn xếp và thực thi chương trình chínhtiếp tục ở chổ mà nó bị ngắt quãng

Page 124: bgiang_VXL

THIẾT KẾ CHƯƠNG TRÌNH DÙNG CÁC NGẮT

• Đối với các ISR có kích thước nhỏ (nhỏhơn 8byte)

ORG 0000H; địa chỉ bắt đầu chương trình

LJMP MAIN ; Nhảy đến chương trình chính, ngòai tấtcả các ngắt

ORG 000BH; Địa chỉ vectơ ngắt timer 0

ISR-T0: ………..; Chương trình con phục vụ ngắt timer 0

…………………RETI ; Kết thúc phục vụ ngắt timer 0, quay trở về chươngtrình chính

Page 125: bgiang_VXL

ORG 001BH; địa chỉ vectơ ngắt timer 1

ISR-T1: ………………; Chương trình con phục vụ ngắt timer 1

…………………RETI; Kết thúc phục vụ ngắt timer 1, quay trở về chương

trình chính

ORG 0030H; ngòai tất cả các ngắt

MAIN: …………..;Chương trình chính

…………………..…………………..END

Page 126: bgiang_VXL

• Đối với ISR có kích thước lớn hơn 8bytethì ISR được bắt đầu với một lệnh nhảysang vùng nhớ khác của bộ nhớ chươngtrình để có thể mở rộng chiều dài của ISR:

ORG 0000H; địa chỉ bắt đầu chương trình

LJMP MAINORG 000BH; Địa chỉ vectơ ngắt timer 0

LJMP ISR-T0ORG 001BH; địa chỉ vectơ ngắt timer 1

LJMP ISR-T1ORG 0030H; Ngoài tất cả các vectơ ngắt

Page 127: bgiang_VXL

MAIN: ……………..……………..……………..

ISR-T0: ……………..……………..……………..

RETIISR-T1: ……………..

……………..……………..

RETIEND

Page 128: bgiang_VXL

NGẮT TIMER• Ngắt timer xảy ra khi các thanh ghi timer

(THx / TLx) bị tràn và cờ báo tràn (TFx)lên mức 1. Khi chương trình con phục vụngắt timer được thực hiện thì cờ TFx tựđộng được xóa về 0

Ví dụ:Viết chương trình tạo sóng vuông 50% có tầnsố 10KHz ở ngõ P1.0 sử dụng ngắt timer 0. Biếtrằng bộ dao động trên chip sử dụng thạch anhcó tần số 12MHz.

Page 129: bgiang_VXL

– Phân tích yêu cầu:• Bộ dao động sử dụng thạch anh 12MHz nên ta có

chu kỳ của xung nhịp timer Ttimer =1µs• Sóng vuông có tần số 10KHz nên chu kỳ sóng là

T=10-4 s =100µs• Do sóng vuông 50% nên ta có tlow = thigh =50µs• Vậy ta sẽ sử dụng timer 0 để tạo thời gian trì hoãn

là 50µs, và chương trình con phục vụ ngắt timer 0 sẽ chỉ cần làm công việc lấy bù bit P1.0. Chương trình chính sẽ nạp các giá trị thích hợp để khởi động cho timer 0 chạy và khởi động ngắt

– Chương trình hòan chỉnh:

Page 130: bgiang_VXL

ORG 0000H; địa chỉ bắt đầu của chương trình

LJMP MAINORG 000BH; Địa chỉ vectơ ngắt timer 0

ISR-T0: CPL P1.0 ; chương trình con phục vụ ngắt timer 0

RETI ORG 0030H ; Bắt đầu chương trình chính tại điểm ngoài

tất cả các ngắt

MAIN: MOV TMOD,#02H ; Timer 0 mode 2

MOV TH0,#-50 ; delay 50us

SETB TR0 ; cho timer 0 chạy

MOV IE,#82H ; cho phép ngắt timer 0

SJMP $ ; không làm gì cả

END

Page 131: bgiang_VXL

NGẮT PORT NỐI TiẾP• Ngắt port nối tiếp xảy ra khi cờ ngắt phát

TI hoặc cờ ngắt thu RI được đặt lên mức1.– Ngắt phát xảy ra khi truyền xong 1 ký tự vừađược ghi vào thanh ghi SBUF

– Ngắt thu xảy ra khi một ký tự đã được nhậnxong và đang đợi trong thanh ghi SBUF đểđược đọc

Page 132: bgiang_VXL

• Khác với ngắt timer, cờ gây ra ngắt portnối tiếp không được xóa đi bằng phầncứng khi CPU chuyển đến ngắt.

• Nguồn ngắt được xác định trong chươngtrình con phục vụ ngắt và phải xóa cờ tạongắt bằng phần mềm

• Ví dụ:Viết chương trình dùng ngắt port nối tiếp để thuliên tục các ký tự và cất vào 10byte ô nhớ RAMnội có địa chỉ đầu là 20H. Tốc độ baud là1200bps, tần số thạch anh là 12MHz

Page 133: bgiang_VXL

ORG 0000H; địa chỉ bắt đầu của chương trìnhLJMP MAINORG 0023H; Địa chỉ vectơ ngắt port nối tiếpLJMP ISR-SP; nhảy đếnchương trình con phục vụ

ngắt port nối tiếpORG 0030H ; Bắt đầu chương trình chính tại điểm ngoài

tất cả các ngắtMAIN: MOV SCON,#50H; Port nối tiếp nhận dữ liệu UART

8bitMOV TMOD,#20H ; Timer 1 mode 2MOV TH1,#-26 ; tạo tốc độ baud 1200bpsSETB TR1 ; cho timer 1 chạyMOV IE,#A0H ; cho phép ngắt port nối tiếpMOV R0, #20H; gánđịa chỉ đầu vào R0SJMP $ ; không làm gì cả

Page 134: bgiang_VXL

ISR-SP : CLR RI;xóa cờ ngắt thu

MOV A, SBUF;đọc dữ liệu thu được vào A

MOV @R0,A; chuyển dữ liệu vào ô nhớ ram nội

INC R0; tăng địa chỉ ô nhớ

CJNE R0,#2AH,EXIT; kiểm tra xem đã đủ 10byte dữ liệu hay chưa, nếu đã đủ thì thóat

EXIT: RETIEND

Page 135: bgiang_VXL

NGẮT NGOÀI• Ngắt ngoài xảy ra khi có một mức thấp

hoặc một cạnh xuống trên chân INT0 hayINT1. Các cờ tạo ngắt này là các bit IE0và IE1 trong thanh ghi TCON

• Sự lựa chọn ngắt tích cực mức thấp haycạnh xuống được lập trình qua các bit IT0hay IT1 trong thanh ghi TCON.– Nếu ITx =0 thì ngắt ngoài được kích khởi

bằng mức thấp– Nếu ITx = 1 thì ngắt ngòai được kích khởi

bằng cạnh xuống

Page 136: bgiang_VXL

• Khi ngắt ngoài sử dụng cạnh xuống thìmỗi lần có cạnh xuống thì cờ IE lên mức1, cờ này tự động được xóa khi vào ISR

• Sử dụng ngắt bằng mức thấp thì cờ IE sẽluôn bằng 1 khi ngõ INTx ở mức thấp vàsẽ trở về 0 khi INTx lên mức cao