Chào các bạn!
Hôm nay, mình xin giới thiệu đến các bạn cách cấu hình và sử dụng ngắt ngoài với VĐK 8051.I. Các nguồn ngắt của VĐK 8051.
Vi điều khiển 8051 gồm có sáu nguồn ngắt như sau (Reset cũng là một nguồn ngắt).II. Các thanh ghi điều khiển ngắt của 8051.
1. Thanh ghi cho phép ngắt/cấm ngắt IE (Interrupt enable).
Hình 2.1: Thanh ghi cho phép ngắt/cấm ngắt.
Ý nghĩa của các bit trong thanh ghi IE như sau.
EX0: Cho phép (EX0 = 1) hoặc cấm (EX0 = 0) ngắt ngoài 0.
ET0: Cho phép (ET0 = 1) hoặc cấm (ET0 = 0) ngắt timer 0.
EX1: Cho phép (EX1 = 1) hoặc cấm (EX1 = 0) ngắt ngoài 1.
ET1: Cho phép (ET1 = 1) hoặc cấm (ET1 = 0) ngắt timer 1.
ES: Cho phép (ES = 1) hoặc cấm (ES = 0) ngắt cổng nối tiếp.
ET2: Cho phép (ET2 = 1) hoặc cấm (ET2 = 0) ngắt timer 2.
EA: Cho phép (EA = 1) hoặc cấm (EA = 0) ngắt toàn cục.
2. Thanh ghi TCON.
Thanh ghi TCON là thanh ghi có chứa các bit điều khiển hoạt động timer, các bit cờ báo tràn timer, các bit cấu hình ngắt kích phát mưc/kich phát sườn sử dụng cho ngắt ngoài.
Hình 2.2: Thanh ghi TCON.
Ý nghĩa của các bit trong thanh ghi TCON như sau.
TF1: Cờ báo tràn của timer 1. Được set lên 1 khi timer 1 tràn và được xóa bởi phần cứng khi chương trình nhày vào trình phục vụ ngắt (chương trình ngắt).
TR1: bit điều khiển hoạt động của timer 1. TR1 = 1: timer 1 bắt đầu hoạt động, TR1 = 0: Dừng timer 1.
TF0: Tương tự TF1, nhưng sử dụng cho timer 0.
TR0: Tương tự TR1, nhưng sử dụng cho timer 0.
IE1: Cờ ngắt ngoài 1 kích phát sườn, được set lên 1 khi phát hiện có sườn xuống ngắt ngoài, và được xóa khi ngắt được xử lý.
IT1: Bit điều khiển kiểu ngắt ngoài 1. Có 2 kiểu ngắt ngoài là ngắt kích phát mức và ngắt kích phát sườn. Bit IT1 được sử dụng để chọn 1 trong 2 kiểu ngắt ngoài này cho ngắt ngoài 1. Khi IT1 = 0, ngắt ngoài 1 là ngắt kích phát mức, ngược lại IT1 = 1, ngắt ngoài 1 là ngắt kích phát sườn.
IE0: Tương tự IE1 nhưng sử dụng cho ngắt ngoài 0.
IT0: Tương tự IT1nhưng sử dụng cho ngắt ngoài 0.
III. Cấu hình ngắt ngoài cho 8051 sử dụng Keil C.
Sau đây, mình xin chia sẻ cách cấu hình ngắt ngoài cho 8051 trong Keil C.
Mình sẽ cấu hình sử dụng ngắt ngoài 0, đối với ngắt ngoài 1 các bạn có thể làm tương tự, chỉ khác nhau là thay đổi các bit cấu hình cho ngắt ngoài 0 sang ngắt ngoài 1.
Sơ đồ mô phỏng được cho như sau.
Hình 3.1: Sơ đồ mạch mô phỏng.
Đối với mạch điện như trên hình 3.1, mình sẽ viết chương trình sử dụng ngắt ngoài để đếm số trên led 7 thanh tăng giá trị từ 0 -> 9.
Như các bạn thấy nút nhấn được nối vào chân P3.2, do vậy mình sẽ sử dụng ngắt ngoài 0 (EX0=1).
Kiểu ngắt ở đây mình sử dụng ngắt kích phát sườn (IT0 = 1).
Để sử dụng ngắt, chúng ta cần thực hiện 2 công việc. 1 là cấu hình các thanh ghi cho phép sử dụng ngắt, và 2 là viết chương trình thực hiện ngắt.
Cấu hình các thanh ghi cho phép sử dụng ngắt được thực hiện trong chương trình chính. Để cấu hình cho phép sử dụng ngắt ngoài 0, kiểu ngắt kích phát sườn ta thực hiện như sau.
/*Cau hinh ngat ngoai 0*/ EX0 = 1; //cho phep ngat ngoai 0 IT0 = 1; //ngat kich phat suon EA = 1; //cho phep ngat toan cuc.
Trong chương trình ngắt, chúng ta sẽ thực hiện công việc tăng giá trị của biến đếm và kiểm tra biến đếm có bị tràn (lớn hơn 9) hay không. Chương trình ngắt được viết như sau
/*Chuong trinh phuc vu ngat ngoai 0*/ void ISR_EX0 (void) interrupt 0 { bt_num ++; if(bt_num > 9) bt_num = 0; }
Công việc còn lại trong chương trình chính là xuất giá trị tương ứng với biến đếm bt_num ra led 7 thanh.
while(1) { /*Xuat gia tri ra led 7 thanh*/ LED_PORT = code_7_seg[bt_num]; }
Các bạn có thể download source code và chương trình mô phỏng Tại Đây.
Chúc các bạn thành công.
Không có nhận xét nào:
Write nhận xét