You are on page 1of 8

[BÀI 10]:

Lập trình ngắt trong 8051

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

1.Đầu tiên xem lại bài học cũ tại đây:


[MỞ ĐẦU][8051] Tổng hợp hướng dẫn lập trình 8051 từ A – Z + mô phỏng
proteus
2.Tổng quan.
2.1.Giới thiệu:
Trước khi đi sâu vào bài học, mình xin được giới thiệu qua cơ chế về ngắt
(interrupt) và cơ chế hỏi vòng (polling) thường gặp.

Xét đoạn code nháy led đơn sau:

1 /* Chuong trinh chinh */


2 void main (void)
3 {
4 /* Vong lap vo han */
5 while(1)
6 {
7 LED = 0; // Xuat 0 ra chan LED
8 Fn_Delay(5000); // Tre 1 thoi gian
9 LED = 1; // Xuat 1 ra chan LED
10 Fn_Delay(5000); // Tre 1 thoi gian
11 }
12 }
Chương trình sẽ chạy tuần tự như sau:

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 đó.

Khai báo với cấu trúc sau:

1 void name (void) interrupt x //( x: là số thứ tự của ngắt )


2{
3 // chương trình phục vụ ngắt
4}
Với x là số thứ tự ngắt được tuân theo bảng vector ngắt sau:

Ngắt Cờ ngắt Số thứ tự ngắt

RESET – –

Ngắt ngoài 0 IE0 0

Timer0 TF0 1
Ngắt ngoài 1 IE1 2

Timer1 TF1 3

Ngắt truyền thông RI/TI 4


2.5. Thanh ghi cho phép ngắt IE.
Đây là thanh ghi quan trọng, nó cho phép khi có điều kiện ngắt xảy là chương trình
nhảy vào trình phụ vụ ngắt.

Bit Tên Chức năng

7 EA Cho phép/Cấm hoạt động của cả thanh ghi

6 – Chưa sử dụng

5 – Chưa sử dụng

4 ES Cho phép ngắt cổng truyền thông nối tiếp

3 ET1 Cho phép ngắt Timer1

2 EX1 Cho phép ngắt ngoài 1

1 ET0 Cho phép ngắt Timer0

0 EX0 Cho phép ngắt ngoài 0


3. Lập trình ngắt bộ định thời Timer0/Timer1:
3.1. Giới thiệu:
Hãy chắc chắn bạn đã hiểu rõ kiếm thức của bài trước, bởi vì lập trình ngắt bộ định
thời Timer0 và Timer1 có thể hiểu đơn giản như sau:

Đ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.

3.2. Xét ví dụ:


Trong 1 ví dụ bài trước:

Tạo hàm trễ (delay) 1ms.

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).

Trong bài sử dụng Timer0 chết độ 2 – 16 bit không tự nạp lại.

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 TMOD = 0x01; // Buoc 1: Nap gia tri cho thanh ghi TMOD
11 TH0 = 0xFC; // Buoc 2: Gia tri can nap cho 2 thanh ghi la 0xFC17
12 TL0 = 0x17; // Do vay TH chua 2 byte cao, TL chua 2 byte thap
13 TR0 = 1; // Buoc 3: Khoi dong Timer0
14
15 EA = 1; // Cho phep tat ca cac ngat hoat dong
16 ET0 = 1; // Cho phep ngat cua Timer0
17
18 while(1)
19 {
20 ; // Khong lam gi ca
21 }
22 }
23
24 // Trinh phuc vu ngat
25 void ten_tuy_chon(void) interrupt 1 // Khai bao trinh phuc vu ngat
26 cho Timer0
27 {
28 TR0 = 0; // Ngung Timer0
29 LED = ~LED; // Thay doi trang thai cua LED
30 TH0 = 0xFC; // Nap lai gia tri cho 2 thanh ghi TH0 và TL0
31 TL0 = 0x17;
32 TR0 = 1; // Khoi dong Timer0
}
Các bước để thiết lập ngắt cho bộ định thời:

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.

4.2.2. Thanh ghi TCON.


Bit IT thuộc thanh ghi TCON, vị trí của nó như sau:

Bit Tên Chức năng

7 TF1 Cờ tràn Timer1

6 TR1 Khởi động/Dừng Timer1

5 TF0 Cờ tràn Timer0

4 TR0 Khởi động/Dừng Timer0

3 IE1 (chưa quan tâm)

2 IT1 Set bằng 1 – ngắt sườn âm

1 IE0 (chưa quan tâm)


0 IT0 Set bằng 1 – ngắt sườn âm
5. Mức ưu tiên ngắt trong 8051.
Mức ưu tiên quy định việc nếu 2 ngắt cùng cảy ra điều kiện ngắt thì chuwogn trình
sẽ ưu tiên phục vụ công việc nào trước.

Dưới đây là bảng ưu tiên của các ngắt:

Mức ưu tiên từ cao xuống thấp

Ngắt Cờ ngắt Số thứ tự ngắt

Ngắt ngoài 0 IE0 0

Timer0 TF0 1

Ngắt ngoài 0 IE1 2

Timer0 TF1 3

Ngắt truyền thông RI/TI 4


6. Bài tập.
Bài 1: Sử dụng ngắt Timer1 thực hiện nháy led 2ms – 1 lần.
Bài 2: Sử dụng nút nhấn giả lập bộ máy đếm sản phẩm hiển thị led 7 thanh.
Chúc các bạn thành công !

You might also like