6.7. Lập trình điều khiển ngắt
6.7.4. Lập trình với ngắt ngoài
a. Ngắt ngoài của vi điều khiển.
- Chỉ có hai ngắt phần cứng ngoài trong 8051 là INT0 và INT1. Chúng được bố trí trên chân P3.2 và P3.3 và địa chỉ của chúng trong bảng véc tơ ngắt là 0003H và 0013H.
- Ngắt ngoài tác động vào vi điều khiển có thể theo hai cách.
+ Ngắt theo mức: ở chế độ ngắt theo mức thì các chân INT0 và INT1 bình thường ở mức cao và nếu một tín hiệu ở mức thấp được cấp tới chúng thì nó ghi nhãn ngắt. Sau đó bộ vi điều khiển dừng tất cả mọi công việc nó đang thực hiện và nhảy đến bảng véc tơ ngắt để phục vụ ngắt. Điều này được gọi là ngắt được kích hoạt theo mức hay ngắt theo mức và là chế độ ngắt mặc định khi cấp nguồn lại cho 8051. Tín hiệu
mức thấp tại chân INT phải được lấy đi trước khi thực hiện lệnh cuối cùng của trình phục vụ ngắt RETI, nếu không một ngắt khác sẽ lại được tạo ra.
+ Các ngắt theo sườn: Như đã nói ở trước đây trong quá trình bật lại nguồn thì
8051 làm các chân INT0 và INT1 là các ngắt theo mức thấp. Để biến các chân này trở thành các ngắt theo sườn thì chúng ta phải viết chương trình cho các bít của thanh ghi TCON. Thanh thi TCON giữ các bít cờ IT0 và IT1 xác định chế độ ngắt theo sườn hay ngắt theo mức của các ngắt phần cứng. Bằng việc chuyển các bít IT0 và IT1 lên cao qua các lệnh “SETB IT0” và “SETB IT1” thì các ngắt phần cứng ngoài INT0 và INT1 trở thành các ngắt theo sườn.
b. Lập trình với ngắt ngoài của vi điều khiển.
- Khi lập trình với ngắt ngoài của vi điều khiển ta phải lựa chọn ngắt ở cạnh xung hay mức xung.
- Với ngắt ở cạnh xung ( sườn xung ) thường ứng dụng để đếm xung ngoài, chọn là đầu vào tác động của phím bấm, công tắc hay cảm biến...
- Với ngắt ở mức xung thường ứng dụng để lập trình cho vi điều khiển tính thời gian, tính độ rộng
hay tần số của xung...
+VÝ dô 1:
LËp tr×nh cho vi ®iÒu khiÓn 8051 đếm xung ngoài
®a tíi ch©n P3.2 (sử dụng ngắt ngoài 0 ( INT0). HiÓn thị số đếm từ
1.085s 1.085s
1MC
1MC
1 chu trình máy
1.085s 4 chu trình máy (4MC) 4 1.085s
đến chân INT0 hoặc INT1
0- 255 trên led đơn nối với Port1 như hình vẽ - Chương trình phần mềm:
;chuong trinh viet cho VDK 8051 dem xung ngoai su dung ngat ngoai 0 ( INT0) org 00h
jmp main ;nhay toi chuong trinh chinh
org 03h ;khai bao dia chi cua ngat ngoai 0 ngat_ngoai0:
inc r0 ;tang bien dem xung
reti main:
mov ie,#10000001b ;cho phep ngat ngoai 0
setb it0 ;chon ngat ngoai 0 ngat o canh xung mov r0,#0 ;bien dem xung
lap:
mov p1,r0 jmp lap
+VÝ dô 2:
LËp tr×nh cho vi ®iÒu khiÓn 8051
đếm xung ngoài từ 0- 25 sử dụng ngắt ngoài 0 ( INT0). Hiển thị số
đếm trên led 7 đoạn Anot chung.
Biết Port0 kết nối với các đoạn:
a,b,c..h, Port2 làm nhiệm vụ quét led.
Giải:
- ở đây ta phải chọn ngắt ngoài 0 ngắt ở cạnh xung.
- Chân đưa xung đếm là chân P3.2 Giải:
- Vẽ sơ đồ sau trên Proteus:
XTAL2 18
XTAL1 19
30 ALE 31 EA 29 PSEN
9 RST
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 1 P1.0
2 P1.1 3 P1.2 4 P1.3 5 P1.4 6 P1.5 7 P1.6 8 P1.7
P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WRP3.5/T1 1615
U1
80C51
NOT
- Lưu đồ giải thuật:
Hình 6.13 Lưu đồ giải thuật đếm giây sử dụng ngắt ngoài - Chương trình phần mềm:
;chuong trinh viet cho VDK 8051 dem xung ngoai su dung ngat ngoai 0 ( INT0)
;chan cap xung dem p3.2
;hien thi thoi gian tren led 7 doan
;--- org 00h
jmp main ;nhay toi chuong trinh chinh
;---
org 03h ;khai bao dia chi cua ngat ngoai 0 ngat_ngoai0:
inc r0 ;tang bien dem xung
Bắt đầu
- Chuyển địa chỉ của bảng mã vào DPTR.
- Cho phép ngắt ngoài 0 (IE=10000001B)
- Chọn ngắt ngoài 0 ở cạnh xung ( IT0=1)
- Tách và giải mã biến đếm xung
- Hiển thị mã 7 đoạn vừa tách và giải mã được.
Khai báo địa chỉ không ( ORG 0 )
Khai báo địa chỉ ngắt ngoài 0 (ORG 03h)
- Nạp giá trị cho biến đếm tràn =0
So sánh biến
đếm xung với 25
< 25 - Tăng biến đếm xung
=25 - Xoá biến đếm xung
KÕt thóc ngắt ( Reti )
cjne r0,#26,thoat_ngat ;so sanh bien dm xung voi 26 neu chua bang thi thoat ngat mov r0,#0 ;dem lai tu 0
thoat_ngat:
reti
;--- main:
mov ie,#10000001b ;cho phep ngat ngoai 0
mov dptr,#bang_ma ;tro DPTR toi dia chi dau tien cua bang ma setb it0 ;chon ngat ngoai 0 ngat o canh xung
mov r0,#0 ;bien dem xung lap:
call tach_giai_ma call hien_thi jmp lap
;---
;chuong trinh con tach va giai ma bien dem xung tach_giai_ma:
mov a,r0 ;tach bien dem
mov b,#10 div ab
movc a,@a+dptr ;lay ma 7 doan hang chuc mov 30h,a ;cat hang chuc
mov a,b
movc a,@a+dptr ;lay ma 7 doan don vi mov 31h,a ;cat hang don vi ret
;---
;chuong trinh con hien thi hien_thi:
mov p0,31h
mov p2,#11111110b ;hien thi don vi call delay
mov p2,#0ffh ;chong lem
mov p0,30h
mov p2,#11111101b ;hien thi hang chuc call delay
ret
;---
;chuong trinh con tao tre de mat quan sat duoc delay:
mov r7,#50 djnz r7,$
ret
;---
;dinh nghia bang ma 7 doan bang_ma:
db 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h end