Upload
trandanhhai
View
74
Download
1
Embed Size (px)
Citation preview
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
GIỚI THIỆU PHẦN CỨNGChương 1
• 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
SƠ ĐỒ CHÂN
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
• 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:
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.
• 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
• 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
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
• 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.
– 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
• Thanh ghi PSW (từ trạng thái chươngtrình)
– 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.
– 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
• 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
TẬP LỆNHChương 2
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
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
• Đị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
• Đị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
• Đị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
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
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
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
• 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
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
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
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
• 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
• 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
• 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)
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
• 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
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
• 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
– 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
– 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
BÀI TẬP ÁP DỤNGChương 2: TẬP LỆNH
• 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
• 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
• 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
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
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
TIMER- BỘ ĐỊNH THÌChương 3
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
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
• 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)
• M1,M0 : các bit chọn chế độ
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.
•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
– 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
• 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
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
• 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
• 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
• 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
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
• 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.
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
• 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.
• 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
– 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
• 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
• 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
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
• 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)
• 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
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
• 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
• Cách 1:MOV TMOD, # 0000 0010BMOV TH0,# -50SETB TR0
LOOP: JNB TF0,$CLR TF0CPL P1.0SJMP LOOPEND
• 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
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
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
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
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
HOẠT ĐỘNG CỦA PORT NỐI TIẾP ( SERIAL PORT)
Chương 4
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)
• 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
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
• 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.
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
– 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
– 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:
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
– 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
– 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
• 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
– 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
– 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
• 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
• 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
– Xung nhịp tốc độ baud được lấy từ bộ dao động trên chip:
• 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:
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
– 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
– Đoạn chương trình tạo tốc độ baud:MOV TMOD,#0010 0000BMOV TH1,# -26SETB TR1
• 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
• 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
• Chương trình:MOV TMOD,#20HMOV TH1,#-26SETB TR1MOV SCON,#0100 0010BCALL PHAT
PHAT: JNB TI,$CLR TIMOV SBUF,ARETEND
• 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
• 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
• 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
• 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
CHẾ ĐỘ TRUYỀN THÔNG ĐA XỬ LÝ
• Đâ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
TỔ CHỨC NGẮT (INTERRUPT)Chương 5
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)
• Đố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
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ự
• 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:
• 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:
• 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.
• 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
• 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.
• 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
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
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
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
• Đố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
MAIN: ……………..……………..……………..
ISR-T0: ……………..……………..……………..
RETIISR-T1: ……………..
……………..……………..
RETIEND
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.
– 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:
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
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
• 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
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ả
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
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
• 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