1. Ví dụ minh họa xử lý ngắt Timer:
Vớ dụ 1: Viết chương trỡnh sử dụng Timer 0 và cỏc ngắt ủể tạo ra một súng vuụng cú tần số 10 KHz trên chân P1.0, fOsc = 12MHz.
Giải ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 000BH ;ðiểm nhập ISR của Timer 0.
T0ISR: ;ISR của Timer 0.
CPL P1.0 ;Lấy bù.
RETI ;Kết thúc ISR của Timer 0.
ORG 0030H ;ðiểm nhập chương trình chính.
MAIN: ;Chương trỡnh chớnh bắt ủầu.
MOV TMOD, #02H ;Chọn chế ủộ 2 cho Timer 0.
MOV TH0, #(-50) ;ðịnh thời 50às.
SETB TR0 ;Cho Timer 0 hoạt ủộng.
MOV IE, #82H ;Cho phép ngắt Timer 0 . SJMP $ ;Không làm gì (nhảy tại chỗ).
END ;Kết thúc chương trình.
Lưu ý: Lệnh SJMP$ cú thể ủược thay thế bằng một ủoạn lệnh ủể thực thi những cụng việc khỏc. Việc thay thế này khụng ảnh hưởng gỡ ủến việc tạo súng vuụng f=10KHz tại chõn P1.0. Vỡ cứ sau mỗi 50às thỡ những cụng việc ủú sẽ bị tạm dừng (ngắt Timer 0 xuất hiện) ủể CPU thực hiện việc tạo súng vuụng rồi quay về thực hiện tiếp những cụng việc ủú.
Ngay sau khi reset hệ thống, bộ ủếm chương trỡnh PC ủược nạp 0000H. Lệnh ủầu tiờn ủược thực thi là LJMP MAIN, lệnh này rẽ nhỏnh ủến chương trỡnh chớnh ở ủịa chỉ 0030H trong bộ nhớ chương trỡnh. Ba lệnh ủầu tiờn của chương trỡnh chớnh sẽ khởi ủộng Timer 0 ở chế ủộ 8 bit tự ủộng nạp
Chương 6: Hoạt ủộng ngắt (Interrupt). Trường ðH Cụng nghiệp Tp.HCM.
50às do chương trỡnh chớnh ủang ở trong vũng lặp “khụng làm gỡ”. Khi ngắt xuất hiện sau mỗi 50às, chương trỡnh chớnh bị ngắt và ISR cho Timer0 ủược thực thi. Ở vớ dụ trờn ISR này chỉ ủơn giản lấy bự bit của port và quay trở về chương trỡnh chớnh nơi vũng lặp “khụng làm gỡ” ủược thực thi ủể chờ một ngắt mới sau mỗi 50às.
Lưu ý là cờ tràn TF0 khụng cần ủược xúa bởi phần mềm do khi cỏc ngắt ủược cho phộp thỡ cờ này tự ủộng ủược xúa bởi phần cứng khi CPU trỏ ủến trỡnh phục vụ ngắt.
Vớ dụ 2: Viết chương trỡnh sử dụng cỏc ngắt ủể tạo ủồng thời cỏc dạng súng vuụng cú tần số 7 KHz và 500 Hz tại cỏc chõn P1.7 và P1.6 (khụng quan tõm ủến ủộ lệch pha của hai súng này), fOsc = 12MHz.
Giải ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 000BH ;ðiểm nhập ISR của Timer 0.
LJMP T0ISR ;Lệnh nhảy ủến ISR Timer 0.
ORG 001BH ;ðiểm nhập ISR của Timer 1.
LJMP T1ISR ;Lệnh nhảy ủến ISR Timer 1.
ORG 0030H ;ðiểm nhập chương trình chính.
MAIN: ;Chương trỡnh chớnh bắt ủầu.
MOV TMOD, #12H ;Chọn chế ủộ 2 cho Timer 0.
;Chọn chế ủộ 1 cho Timer 1.
MOV TH0, #-71 ;ðịnh thời 71às.
SETB TR0 ;Cho Timer 0 hoạt ủộng.
SETB TF1 ;Buộc Timer 1 ngắt.
MOV IE, #8AH ;Cho phộp cỏc ngắt hoạt ủộng.
SJMP $ ;Không làm gì (nhảy tại chỗ).
T0ISR: ;ISR của ngắt Timer 0.
CPL P1.7 ;Lấy bù.
RETI ;Kết thúc ISR của Timer 0.
T1ISR: ;ISR của ngắt Timer 1.
CLR TR1 ;Dừng Timer 1.
MOV TH1, #HIGH(-1000) ;ðịnh thời 1ms.
MOV TL1, #LOW(-1000)
SETB TR1 ;Cho Timer 1 hoạt ủộng.
CPL P1.6 ;Lấy bù.
RETI ;Kết thúc ISR của Timer 1.
END ;Kết thúc chương trình.
Chương 6: Hoạt ủộng ngắt (Interrupt). Trường ðH Cụng nghiệp Tp.HCM.
Lưu ý: Lệnh SJMP$ cú thể ủược thay thế bằng một ủoạn lệnh ủể thực thi những cụng việc khỏc. Việc thay thế này khụng ảnh hưởng gỡ ủến việc tạo súng vuụng f = 7KHz và f = 500Hz tại chõn P1.7 và chõn P1.6. Vỡ cứ sau mỗi 71às và 1ms thỡ những cụng việc ủú sẽ bị tạm dừng (ngắt Timer 0 và ngắt Timer 1 xuất hiện) ủể CPU thực hiện việc tạo súng vuụng rồi quay về thực hiện tiếp những cụng việc ủú.
Việc tổ hợp cỏc ngừ ra này rất khú tạo ra ủược trờn một hệ thống khụng sử dụng ủiều khiển ngắt. Timer 0 hoạt ủộng ở chế ủộ 2, ủược sử dụng ủể tạo ra dạng súng 7 KHz trờn chõn P1.7. Timer 1 hoạt ủộng ở chế ủộ 1, ủược sử dụng ủể tạo ra dạng súng 500 Hz trờn chõn P1.6. Sở dĩ trong trường hợp này, Timer 1 phải ủược thiết lập ủể hoạt ủộng ở chế ủộ 1 là do dạng súng 500Hz yờu cầu thời gian mức cao và thời gian mức thấp là 1ms, chế ủộ 2 khụng sử dụng ủược trong trường hợp này.
Cũng cần chỳ ý là cỏc thanh ghi TH1/TL1 khụng ủược khởi ủộng ở ủầu chương trỡnh chớnh như trường hợp của thanh ghi TH0. Do TH1/TL1 phải ủược nạp lại sau mỗi lần bộ ủịnh thời tràn, TF1 ủược set bằng 1 trong chương trỡnh chớnh bởi phần mềm (lệnh SETB TF1) ủược sử dụng ủể buộc phải cú một ngắt ban ủầu ngay trước khi cỏc ngắt ủược cho phộp. ðiều này cú hiệu quả cho việc bắt ủầu dạng sóng 500Hz.
Vớ dụ 3: Viết chương trỡnh liờn tục nhận dữ liệu 8 bit ở cổng P0 và sau ủú gửi dữ liệu này ủến cổng P1. Trong thời gian này cần tạo ra trờn chõn P2.1 một súng vuụng cú chu kỳ là 200às. Sử dụng Timer 0 ủể tạo súng vuụng, fOsc = 11,0592MHz.
Giải ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 000BH ;ðiểm nhập ISR của Timer 0.
CPL P2.1 ;ðảo trạng thái chân P2.1, tạo xung.
RETI ;Kết thúc ISR của Timer 0.
ORG 0030H ;ðiểm nhập chương trình chính.
MAIN: ;Chương trỡnh chớnh bắt ủầu.
MOV TMOD, #02H ;Chọn chế ủộ 2 cho Timer 0.
MOV P0, #0FFH ;Cấu hình Port 0 là cổng vào.
MOV TH0, #(-92) ;ðịnh thời 100às (nữa chu kỳ).
MOV IE, #82H ;Cho phộp ngắt Timer 0 hoạt ủộng.
SETB TR0 ;Cho Timer 0 hoạt ủộng.
BACK:
MOV A, P0 ;Nhận dữ liệu từ P0.
MOV P1, A ;Xuất dữ liệu vừa nhận ủược ra P1.
SJMP BACK
Chương 6: Hoạt ủộng ngắt (Interrupt). Trường ðH Cụng nghiệp Tp.HCM.
Vớ dụ 4: Viết chương trỡnh liờn tục nhận dữ liệu 8 bit ở cổng P0 và sau ủú gửi dữ liệu này ủến cổng P1. Trong thời gian này cần tạo ra trên chân P2.1 một sóng vuông với yêu cầu: thời gian sóng ở mức cao là 1085às và thời gian súng ở mức thấp là 15às. Sử dụng Timer 1 ủể tạo súng vuụng, fOsc=11,0592MHz.
8051 P2.1
T = 200às 11,0592MHz
P0.0 P0.7
P1.0 P1.7
DATA 8 BIT DATA 8 BIT
tH tL T
1085às 15às
Giải ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 001BH ;ðiểm nhập ISR của Timer 1.
LJMP T1ISR ;Lệnh nhảy ủến ISR Timer 1.
ORG 0030H ;ðiểm nhập chương trình chính.
MAIN: ;Chương trỡnh chớnh bắt ủầu.
MOV TMOD, #10H ;Chọn chế ủộ 1 cho Timer 1.
MOV P0, #0FFH ;Cấu hình Port 0 là cổng vào.
MOV TL1, #18H ;ðịnh thời 1085às (cho nữa chu kỳ ủầu).
MOV TH1, #0FCH ;
MOV IE, #88H ;Cho phộp ngắt Timer 1 hoạt ủộng.
SETB TR1 ;Cho Timer 1 hoạt ủộng.
BACK:
MOV A, P0 ;Nhận dữ liệu từ P0.
MOV P1, A ;Xuất dữ liệu vừa nhận ủược ra P1.
SJMP BACK ;Lặp lại liên tục hai thao tác trên.
T1ISR: ;ISR của ngắt Timer 1.
CLR TR1 ;Dừng Timer 1.
CLR P2.1 ;ðảo trạng thái chân P2.1, tạo xung.
MOV R2, #4 ;ðịnh thời 8TMachine (tổng thời gian: 15às), DJNZ R2, $ ;tạo thời gian trễ (cho nữa chu kỳ sau).
MOV TL1, #18H ;ðịnh thời 1085às (cho nữa chu kỳ ủầu).
MOV TH1, #0FCH ;
SETB TR1 ;Cho Timer 1 hoạt ủộng.
SETB P2.1 ;ðảo trạng thái chân P2.1, tạo xung.
RETI ;Kết thúc ISR của Timer 1.
END ;Kết thúc chương trình.
Chương 6: Hoạt ủộng ngắt (Interrupt). Trường ðH Cụng nghiệp Tp.HCM.
2. Ví dụ minh họa xử lý ngắt port nối tiếp:
Cỏc ngắt do port nối tiếp xuất hiện khi cờ ngắt phỏt TI hoặc cờ ngắt thu RI ủược set bằng 1. Một ngắt phỏt xuất hiện khi việc phỏt một ký tự ủó ghi vào SBUF hoàn tất. Một ngắt thu xuất hiện khi một ký tự ủược thu nhận ủầy ủủ và ủang ở trong SBUF ủể chờ ủược ủọc. Như vậy, ngắt phỏt xảy ra khi bộ ủệm phỏt SBUF rỗng, ngắt thu xảy ra khi bộ ủệm thu SBUF ủầy.
Cỏc ngắt do port nối tiếp cú khỏc với cỏc ngắt do bộ ủịnh thời. Cờ gõy ra ngắt ở port nối tiếp khụng ủược xúa bởi phần cứng khi CPU trỏ tới trỡnh phục vụ ngắt. Lý do là vỡ ở ủõy ta cú hai ngyờn nhân tạo ra ngắt ở port nối tiếp, cụ thể là hai ngắt tạo ra bởi hai cờ TI và RI. Nguyên nhân ngắt phải ủược xỏc ủịnh trong trỡnh phục vụ ngắt và cờ tạo ra ngắt ủược xúa bởi phần mềm. Cần nhắc lại là với cỏc ngắt do bộ ủịnh thời, cờ tạo ra ngắt ủược xúa bởi phần cứng khi CPU trỏ tới trỡnh phục vụ ngắt.
Vớ dụ 1: Viết chương trỡnh sử dụng cỏc ngắt ủể liờn tục phỏt ủi mó ASCII (cú giỏ trị từ 20H ủến 7EH) ủến một thiết bị ủầu cuối nối với 8051 qua port nối tiếp. Biết rằng fOsc=11,0592MHz.
Giải ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 0023H ;ðiểm nhập ISR port nối tiếp.
LJMP SPISR ;Lệnh nhảy ủến ISR port nối tiếp.
ORG 0030H ;ðiểm nhập chương trình chính.
MAIN: ;Chương trỡnh chớnh bắt ủầu.
MOV SCON, #42H ;Chọn chế ủộ 1 cho port nối
;tiếp, TI=1 ủể buộc cú ngắt
;và gởi ký tự ủầu tiờn.
MOV TMOD, #20H ;Chọn chế ủộ 2 cho Timer 1.
MOV TH1, #(-24) ;Tốc ủộ baud = 1200.
SETB TR1 ;Cho Timer 1 hoạt ủộng.
MOV A, #20H ;Nạp mó cho ký tự ủầu tiờn.
MOV IE, #90H ;Cho phép ngắt port nối tiếp.
SJMP $ ;Không làm gì (nhảy tại chỗ).
SPISR: ;ISR của ngắt port nối tiếp.
CJNE A, #7FH, SKIP ;Kiểm tra kết thúc bảng mã.
MOV A, #20H ;Trở lại ký tự ủầu tiờn.
SKIP:
MOV SBUF, A ;Truyền ký tự ra port nối tiếp.
INC A ;Lấy mã của ký tự kế tiếp.
CLR TI ;Xóa cờ ngắt phát.
RETI ;Kết thúc ISR của port nối tiếp.
END ;Kết thúc chương trình.
Lưu ý: Lệnh SJMP$ cú thể ủược thay thế bằng một ủoạn lệnh ủể thực thi những cụng việc khỏc. Việc thay thế này khụng ảnh hưởng gỡ ủến việc phỏt mó ASCII thụng qua port nối tiếp. Vỡ cứ sau mỗi lần port nối tiếp truyền xong một ký tự thỡ những cụng việc ủú sẽ bị tạm dừng (ngắt port nối tiếp xuất hiện) ủể CPU thực hiện việc kiểm tra ký tự kết thỳc bảng mó và lấy mó của ký tự kế tiếp ủể tiếp tục phỏt ủi rồi quay về thực hiện tiếp những cụng việc ủú.
Bảng mã ASCII bao gồm 128 mã 7 bit (xem thêm trong phần phụ lục “Phụ lục 4 – Bảng mã ASCII”). Sau khi nhảy ủến nhón MAIN ở ủịa chỉ 0030H, ba lệnh ủầu tiờn dựng khởi ủộng Timer 1 ủể
Chương 6: Hoạt ủộng ngắt (Interrupt). Trường ðH Cụng nghiệp Tp.HCM.
chế ủộ 1 (UART 8 bit cú tộc ủộ baud thay ủổi) và cho TI=1 ủể buộc tạo ra một ngắt trước khi cỏc ngắt ủược cho phộp hoạt ủộng. Sau ủú mó ASCII ủầu tiờn (20H) ủược nạp cho thanh ghi A và cỏc ngắt do port nối tiếp ủược cho phộp. Cuối cựng phần chớnh của chương trỡnh ủi vào vũng lặp “khụng làm gỡ”
(tức là lệnh SJMP $).
Trỡnh phục vụ ngắt của port nối tiếp làm tất cả cụng việc một khi chương trỡnh chớnh ủó thiết lập cỏc ủiều kiện ban ủầu. Hai lệnh ủầu tiờn kiểm tra thanh ghi A và nếu mó ASCII ủạt ủến 7FH (nghĩa là mó vừa mới ủược phỏt ủi là 7EH) thỡ thanh ghi A sẽ ủược thiết lập lại với nội dung là 20H. Sau ủú mó ASCII ủược gửi ủến bộ ủệm của port nối tiếp (lệnh MOV SBUF,A) ủể ủược phỏt ủi. Thực hiện việc tăng giỏ trị trong thanh ghi A ủể cú mó kế tiếp, cờ phỏt ủược xúa (lệnh CLR TI) và trỡnh phục vụ ngắt kết thỳc (lệnh RETI). ðiều khiển sẽ trả về chương trỡnh chớnh và lệnh SJMP $ ủược thực thi cho ủến khi TI lại ủược set bằng 1 cho lần phỏt dữ liệu kế tiếp.
Nếu ta so sỏnh tốc ủộ của CPU với tốc ủộ truyền dữ liệu, ta nhận thấy rằng lệnh SJMP $ ủược thực thi với phần trăm tỉ lệ thời gian rất lớn trong chương trình này. Phần trăm tỉ lệ này là bao nhiêu? Ở tốc ủộ 1200 baud, mỗi một bit ủược truyền ủi trong một khoảng thời gian là 0,8333ms. Như vậy 8 bit dữ liệu cộng với 1 bit start, 1 bit stop (một lần truyền một dữ liệu gồm 10 bit) chiếm 8,333ms. Thời gian thực thi tệ nhất của trình phục vụ ngắt SPISR là tổng của số chu kỳ cho mỗi lệnh nhân với 1,085às (tức 1TMachine), thời gian này tớnh ủược là 8 x 1,085às = 8,68às. Do vậy, với 8333às dựng ủể truyền một dữ liệu mà chỉ cú 8,68às dành cho trỡnh phục vu ngắt SPISR. Lệnh SJMP $ thực thi trong khoảng thời gian 8333às - 8,68às = 8324,32às tức là khoảng 99,9% thời gian. Do vậy ngắt cần ủược sử dụng ủể cú thể loại bỏ ủược khoảng thời gian “khụng làm gỡ” này (chiếm ủến 99,9% thời gian hoạt ủộng của chương trỡnh truyền dữ liệu này. Muốn vậy thỡ lệnh SJMP $ cú thể ủược thay bởi cỏc lệnh khỏc ủể thực hiện những cụng việc khỏc theo yờu cầu của ứng dụng. Cỏc ngắt vẫn xuất hiện và cỏc ký tự vẫn ủược phỏt từ port nối tiếp sau mỗi 8,333ms.
Vớ dụ 2: Viết chương trỡnh ủiều khiển 8051 ủọc dữ liệu từ cổng P1 và ghi liờn tục tới cổng P2.
ðồng thời ủưa một bản sao dữ liệu tới port nối tiếp ủể thực hiện việc truyền dữ liệu nối tiếp. Biết rằng tốc ủộ truyền là 9600 baud và fOsc = 11,0592MHz
Giải ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 0023H ;ðiểm nhập ISR port nối tiếp.
LJMP SPISR ;Lệnh nhảy ủến ISR port nối tiếp.
ORG 0030H ;ðiểm nhập chương trình chính.
MAIN: ;Chương trỡnh chớnh bắt ủầu.
MOV P1, #0FFH ;Cấu hình Port 1 là cổng vào.
MOV SCON, #42H ;Chọn chế ủộ 1 cho port nối tiếp, cấm thu.
MOV TMOD, #20H ;Chọn chế ủộ 2 cho Timer 1.
MOV TH1, #(-3) ;Tốc ủộ baud = 9600.
MOV IE, #90H ;Cho phép ngắt port nối tiếp.
SETB TR1 ;Cho Timer 1 hoạt ủộng.
BACK:
MOV A, P1 ;ðọc dữ liệu từ P1.
MOV P2, A ;Xuất dữ liệu nhận ủược ra P2.
SJMP BACK ;Lặp lại các thao tác trên.
SPISR: ;ISR của ngắt port nối tiếp.
CLR TI ;Xóa cờ ngắt phát TI.
MOV SBUF, A ;Xuất dữ liệu nhận ủược ra port nối tiếp.
Chương 6: Hoạt ủộng ngắt (Interrupt). Trường ðH Cụng nghiệp Tp.HCM.
RETI ;Kết thúc ISR của port nối tiếp.
END ;Kết thúc chương trình.
Vớ dụ 3: Viết chương trỡnh ủiều khiển 8051 ủọc dữ liệu từ cổng P1 và ghi liờn tục tới cổng P2.
Trong khi ủú dữ liệu nhận ủược từ port nối tiếp thỡ ủược gửi ủến cổng P0. Biết rằng tốc ủộ truyền là 9600 baud và fOsc = 11,0592MHz
Giải ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 0023H ;ðiểm nhập ISR port nối tiếp.
LJMP SPISR ;Lệnh nhảy ủến ISR port nối tiếp.
ORG 0030H ;ðiểm nhập chương trình chính.
MAIN: ;Chương trỡnh chớnh bắt ủầu.
MOV P1, #0FFH ;Cấu hình Port 1 là cổng vào.
MOV SCON, #52H ;Chọn chế ủộ 1 cho port nối tiếp.
MOV TMOD, #20H ;Chọn chế ủộ 2 cho Timer 1.
MOV TH1, #(-3) ;Tốc ủộ baud = 9600.
MOV IE, #90H ;Cho phép ngắt port nối tiếp.
SETB TR1 ;Cho Timer 1 hoạt ủộng.
BACK:
MOV A, P1 ;ðọc dữ liệu từ P1.
MOV P2, A ;Xuất dữ liệu nhận ủược ra P2.
SJMP BACK ;Lặp lại các thao tác trên.
SPISR: ;ISR của ngắt port nối tiếp.
CLR RI ;Xóa cờ ngắt thu RI.
MOV A, SBUF ;Nhận dữ liệu từ port nối tiếp.
MOV P0, A ;Xuất dữ liệu nhận ủược ra P0.
RETI ;Kết thúc ISR của port nối tiếp.
END ;Kết thúc chương trình.
Vớ dụ 4: Viết chương trỡnh cú sử dụng cỏc ngắt ủể thực hiện cỏc cộng việc sau:
• Nhận dữ liệu từ port nối tiếp, sau ủú thỡ gửi dữ liệu này ủến cổng P0.
• Nhận dữ liệu từ cổng P1, sau ủú thỡ gửi dữ liệu này ủến port nối tiếp và cổng P2.
• Sử dụng Timer 0 ủể tạo súng vuụng cú tần số 5KHz tại P0.1.
Biết rằng tốc ủộ truyền là 4800 baud và fOsc = 11,0592MHz Giải ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 000BH ;ðiểm nhập ISR Timer 0.
CPL P0.1 ;Lấy bù chân P1.0, tạo xung.
RETI ;Kết thúc ISR của port nối tiếp.
ORG 0023H ;ðiểm nhập ISR port nối tiếp.
LJMP SPISR ;Lệnh nhảy ủến ISR port nối tiếp.
ORG 0030H ;ðiểm nhập chương trình chính.
Chương 6: Hoạt ủộng ngắt (Interrupt). Trường ðH Cụng nghiệp Tp.HCM.
MOV SCON, #52H ;Chọn chế ủộ 1 cho port nối tiếp.
MOV TMOD, #22H ;Chọn chế ủộ 2 cho Timer 0, Timer 1.
MOV TH1, #(-6) ;Tốc ủộ baud = 4800.
MOV TH0, #(-92) ;ðịnh thời 100às (nữa chu kỳ), f = 5KHz.
MOV IE, #92H ;Cho phép ngắt port nối tiếp và Timer 0.
SETB TR1 ;Cho Timer 1 hoạt ủộng.
SETB TR0 ;Cho Timer 0 hoạt ủộng.
BACK:
MOV A, P1 ;ðọc dữ liệu từ P1.
MOV P2, A ;Xuất dữ liệu nhận ủược ra P2.
SJMP BACK ;Lặp lại các thao tác trên.
SPISR:
JB TI, TRANS ;Kiểm tra thu xong (RI) hay phát
;xong (TI), nếu thu xong (RI = 1) thì:
CLR RI ;Xóa cờ ngắt thu RI.
MOV A, SBUF ;Nhận dữ liệu từ port nối tiếp.
MOV P0, A ;Xuất dữ liệu nhận ủược ra P0.
RETI ;Kết thúc ISR của port nối tiếp.
TRANS: ;Nếu phát xong (TI = 1) thì:
CLR TI ;Xóa cờ ngắt phát TI.
MOV SBUF, A ;Xuất dữ liệu nhận ủược ra port nối tiếp.
RETI ;Kết thúc ISR của port nối tiếp.
END ;Kết thúc chương trình.
3. Ví dụ minh họa xử lý ngắt ngoài:
Ngắt ngoài xảy ra khi cú mức thấp hoặc cú cạnh õm tỏc ủộng lờn chõn INT0\ hoặc chõn INT1\
của 8051. Khi một ngắt ngoài ủược tạo ra, cờ tạo ra ngắt (IE0 và IE1) ủược xúa bởi phần cứng khi CPU trỏ ủến trỡnh phục vụ ngắt nếu ngắt thuộc loại tỏc ủộng cạnh õm, cũn nếu ngắt thuộc loại tỏc ủộng mức thấp thỡ nguyờn nhõn ngắt ngoài sẽ ủiều khiển mức của cờ thay vỡ là phần cứng trờn chip.
Vớ dụ 1: Viết chương trỡnh sử dụng cỏc ngắt ủể thiết kế bộ ủiều khiển lũ nung sao cho nhiệt ủộ trong lò duy trì ở mức 120OC ± 5OC.
Giải
Giả sử ta dựng mạch giao tiếp như hỡnh bờn dưới. Cuộn dõy ủiều khiển tắt/mở lũ ủược nối với P1.7 sao cho:
P1.7 = 1 thì mở lò và P1.7 = 0 thì tắt lò
Bộ cảm biến nhiệt ủộ ủược nối với INT0\ và INT1\, cung cấp cỏc tớn hiệu HOT\ và COLD\ như sau:
HOT\ = 0 nếu T > 125OC và COLD\ = 0 nếu T < 115OC
Chương trỡnh sẽ cho lũ hoạt ủộng (mở lũ) khi T < 115OC và cho lũ ngưng hoạt ủộng (tắt lũ) khi T > 125OC.