Professional Documents
Culture Documents
Chào các bạn hôm nay mình sẽ hướng dẫn các bạn lập trình ngắt trong 8051
Chương trình bắt đầu từ đầu hàm main(void) và vào hàm while(1) thực hiện dòng
lệnh LED = 0; thực hiện xong tuần tự thực hiện hàm Fn_Delay(5000); tương tự
như thế từ trên xuống dưới cho đến khi lặp lại quá trình trên.
Có thể thấy chắc chắn 1 điều với cơ chế hỏi vòng thì câu lệnh thứ 2 chắc chắn
không được thực hiện nếu vi điều khiển đang thực hiện cậu lệnh số 1. Đó là tính
tuần tự của cơ chế hỏi vòng (polling).
Vậy ngắt thì sao? Đúng như tên mà chúng ta đã gọi cho nó. Khi có 1 việc chúng ta
cần phải thực hiện ngay lúc đó, chúng ta không thể chờ cho chương trình chạy tuần
tự đến nó được, lúc này ta sẽ sử dụng ngắt. Sau khi thực hiện xong ngắt chương
trình sẽ quay lại thực hiện tiếp công việc tại thời điểm bị ngắt.
Ngắt (Interrupt) – là một số sự kiện khẩn cấp bên trong hoặc bên ngoài bộ vi điều
khiển xảy ra, buộc vi điều khiển tạm dừng thực hiện chương trình hiện tại, phục vụ
ngay lập tức nhiệm vụ mà ngắt yêu cầu – nhiệm vụ này gọi là trình phục vụ ngắt
(ISR:Interrupt Service Routine).
2.2. Ưu điểm của Ngắt (Interrupt):
Có thể phục vụ nhiều đối tượng với các mức ưu tiên khác nhau.
Thực hiện ngay những yêu cầu mà không cần chờ chương trình thực hiện tuần tự
những công việc khác.
2.3. Các loại ngắt:
Trong 8051 có 6 loại ngắt sau:
1. Ngắt trên chân RESET: Khi có sự thay đổi mức trên chân RESET của 8051,
chương trình sẽ bị RESET về ban đầu thực hiện.
2. 2 ngắt cho Timer0 và Timer1
3. 2 ngắt ngoài tương ứng với xảy ra điều kiện ngắt khi có sự thay đổi mức/sường
trên 2 chân của vi điều khiển (chân 12 (P3.2) và 13 (P3.3))
4. 1 ngắt truyển thông nối tiếp.
2.4. Trình phục vụ ngắt:
Trình phục vụ ngắt là gì? Có thể hiểu như sau, khi chương trình đang thực hiện
tuần tự nó được yêu cầu phải thực hiện 1 công việc khác ngay. Trình phục vụ ngắt
sẽ là nơi chương trình vào để thực hiện yêu cầu đó.
RESET – –
Timer0 TF0 1
Ngắt ngoài 1 IE1 2
Timer1 TF1 3
6 – Chưa sử dụng
5 – Chưa sử dụng
Điều kiện để chương trình dừng cơ chế hỏi vòng và vào thực hiện trong trình phụ
ngắt là khi cờ TF được bật lên 1.
Chúng ta sửa đầu bài 1 chút cho phù hợp với bài học phần này như sau:
Ví dụ: Viết chương trình thực hiện nhảy vào ngắt 1ms 1 lần (cứ 1ms nhảy vào
ngắt 1 lần).
1. Thiết lập điều kiện ngắt, ở đây là thiết lập thời gian cờ TF bật lên 1.
2. Cho phép ngắt các đơn vị thực hiện ngắt (set bit EA và bit ET0)
3. Viết trình phục vụ ngắt.
4. Dừng bộ định thời (TR0 = 0)
5. Thực hiện các câu lệnh muốn làm khi ngắt.
6. Set lại bộ định thời nếu dùng bộ định thời 16bit không tự nạp lại.
7. Chạy bộ định thời (TR0 = 1)
4. Lập trình ngắt ngoài.
4.1. Giới thiệu:
Như phần trên đã nói, điều kiện xảy ra ngắt ngoài là có sự thay đổi mức/sườn trên 1
trong 2 chân của vi điều khiển (chân 12 (P3.2) và 13 (P3.3)) (2 chân này đọc lập
tương ứng như 2 bộ Timer, khi có sự thay đổi trên bất cứ chân nào cũng xảy ra ngắt
tương ứng)
Xét ví dụ:
Lập trình nút nhấn thực hiện bấm nút thì đèn sáng, bấm lần nữa thì đèn tắt.
1 // Su dung thu vien cua cho 89c51
2 #include <REGX51.H>
3
4 // Dinh nghia cho chan so 0 cua port P1
5 sbit LED = P1^0;
6
7 // Chuong trinh chinh
8 void main(void)
9 {
10 EA = 1; // Cho phep tat ca cac ngat hoat dong
11 EX0 = 1; // Cho phep ngat ngoai 0
12 IT0 = 1; // Thiet lap ngat ngoai 0 cho suon am
13
14 while(1)
15 {
16 ; // Khong lam gi ca
17 }
18 }
19
20 // Trinh phuc vu ngat
21 void ten_tuy_chon(void) interrupt 0 // Khai bao trinh phuc vu ngat cho ngat
22 ngoai 0
23 {
24 LED = ~LED; // Thay doi trang thai cua LED
}
Quy trình thiết lập ngắt ngoài.
1. Cho phép tất cả các ngắt và ngắt ngoài (chú ý chọn ngắt ngoài nào cần nối phần
cứng vào chân tương ứng)
2. Thiết lập chế độ ngắt theo sườn (được giới thiệu trong phần dưới)
3. Viết trình phụ vị ngắt (nhớ khai báo giá đúng như bảng vector ngắt)
4. Viết công việc muốn thực hiện khi xảy ra ngắt ngoài.
4.2. Ngắt theo sườn.
4.2.1. Giới thiệu:
Mặc định khi không set bit IT, điều kiện có ngắt ngoài là 1 trong 2 chân 12 và chân
13 của vi điều khiển chuyển mức xuống 0 (ban đầu các chân của vi điều khiển được
nối trở treo lên mức 1, khi chuyển mức xuống 0 thì xảy ra điều kiện ngắt.
Điều này xảy ra trường hợp đối với nút nhấn, khi có điều kiện ngắt theo mức (nút
nhấn nhấn xuống âm), chương trình nhảy vào trình phục vụ ngắt thực hiện công
việc, khi chương trình nhảy ra do tay ta chưa kịp thả nút nhấn, chương trình lại thực
hiện trình phục vị ngắt lần nữa.
Để giải quyết trường hợp này ta nên set bit IT để thực hiện ngắt theo sườn, việc
nhấn nút nhấn chỉ tạo ra 1 sường âm duy nhất nên giải quyết đc việc nếu ra nhấn
nút nhấn lâu thì chương trình không bị lặp.
Timer0 TF0 1
Timer0 TF1 3