102
có 3 chương trình ngắt timer. Chương trình ngắt timer hoạt động tương tự như chương trình ngắt ngồi nhưng tín hiệu tác động để cho ngắt timer hoạt động là thời gian. Khoảng thời gian cho phép ngắt timer hoạt động được thiết lập bởi các thanh nghi TLx và THx của timer0, timer1 và timer2 tương ứng.
Các thanh ghi điều khiển ngắt:
IE: Thanh ghi điều khiển cho phép ngắt
EA - ET2 ES ET1 EX1 ET0 EX0
Bit 7 Bit 0
Bit 7: EA: Bit cho phép toàn bộ ngắt được hoạt động 1 = Toàn bộ các ngắt được cho phép 0 = Cấm toàn bộ các ngắt
Bit 6: Không được định nghĩa đọc như là 0 Bit 5: ET2: Bit cho phép ngắt từ Timer2
1 = Cho phép ngắt từ Timer2 0 = Cấm ngắt Timer2
Bit 4: ES: Bit cho phép ngắt Port nối tiếp UART 1 = Cho phép ngắt từ Port nối tiếp
0 = Cấm ngắt nối tiếp Bit 3: ET1: Bit cho phép ngắt từ
Timer1 1 = Cho phép ngắt từ Timer1
0 = Cấm ngắt Timer1
Bit 2: EX1: Bit cho phép ngắt ngoài từ chân INT1 1 = Cho phép ngắt ngoài INT1 0 = Cấm ngắt ngoài INT1
Bit 1: ET0: Bit cho phép ngắt từ Timer0 1 = Cho phép ngắt từ
103 Timer0 Timer0
0 = Cấm ngắt từ Timer0
Bit 0: EX0: Bit cho phép ngắt ngoài từ chân INT0 1 = Cho phép ngắt ngoài INT0 0 = Cấm ngắt ngoài INT0
TCON: Thanh ghi điều khiển Timer1 và Timer0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Bit 7 Bit 0
Bit 7: TF1: Cờ báo tràn của Timer1 1 = Timer1 xảy ra tràn 0 = Timer1 không xảy ra tràn
Chú ý: Bit này được thiết lập bởi phần cứng khi xảy ra quá trình tràn bộ đếm Timer và phải được xóa bằng phần mềm. Bit này cũng được sử dụng làm cờ báo xảy ra ngắt của Timer1
Bit 6: TR1: Bit cho phép Timer1 bắt đầu hoạt động 1 = Cho phép Timer1 hoạt động
0 = Không cho phép Timer1 hoạt động Bit 5: TF0: Cờ báo tràn của Timer0
1 = Timer0 xảy ra tràn
0 = Timer0 không xảy ra tràn
Chú ý: Bit này được thiết lập bởi phần cứng khi xảy ra quá trình tràn bộ đếm Timer và phải được xóa bằng phần mềm. Bit này cũng được sử dụng làm cờ báo xảy ra ngắt của Timer0
Bit 4: TR0: Bit cho phép Timer0 bắt đầu hoạt động 1 = Cho phép Timer0 hoạt động
0 = Không cho phép Timer0 hoạt động Bit 3: IE1: Cờ báo xảy ra ngắt ngoài INT1
1 = Xảy ra ngắt trên chân INT1
0 = Không xảy ra ngắt trên chân INT1
Chú ý: Bit này được thiết lập bởi phần cứng khi xảy ra ngắt trên chân INT1 và phải được xóa bằng phần mềm.
Bit 2: IT1: Bit thiết lập trạng thái xảy ra ngắt ngoài trên chân INT1
104
Cho phép ngắt ngoài INT1 xảy ra theo mức logic 0
Bit 1: IE0: Cờ báo xảy ra ngắt ngoài INT0 1 = Xảy ra ngắt trên chân INT0 0 = Không xảy ra ngắt trên chân INT0
Chú ý: Bit này được thiết lập bởi phần cứng khi xảy ra ngắt trên chân INT0
và phải được xóa bằng phần mềm.
Bit 0: IT0: Bit thiết lập trạng thái xảy ra ngắt ngoài trên chân INT0 1 = Cho phép ngắt ngoài INT0 xảy ra trên sườn xuống của xung 0 = Cho phép ngắt ngoài INT0 xảy ra theo mức logic 0
TMOD: Thanh ghi lựa chọn chế độ hoạt động của Timer1 và Timer0.
GATE 1
C/T1# M11 M01 GATE0 C/T0# M10 M00
Bit 7 Bit 0
Bit 7: GATE1: Bit mở cổng cho Timer1 hoạt động
1 = Cho phép Timer1 hoạt động khi chân INT1 ở mức logic1 và bít TR1= 1;
0 = Cho phép Timer1 hoạt động khi bit TR1 = 1; Bit 6: C/T1#: Bit lựa chọn nguồn xung cung cấp cho
Timer1 1 = Nguồn xung được lấy trên chân T1 0 = Nguồn xung được lấy từ bộ dao động thạch anh. Bit 5 – 4: M11:M01: Bit lựa chọn chế độ hoạt động của Timer1
00 = Chế độ 0: 13 bit Timer/Counter với 8 bit trên thanh ghi TH1 và 5 bit trên thanh ghi TL1
01 = Chế độ 1: 16 bit Timer/Counter
10 = Chế độ 2: 8 bit Timer/Counter tự động nạp lại.
11 = Chế độ 3: Chế độ giữ Timer1 khi bit TR1 không thiết lập giá trị và khi Timer0 ở chế độ 3.
Bit 3: GATE0: Bit mở cổng cho Timer0 hoạt động
1 = Cho phép Timer0 hoạt động khi chân INT0 ở mức logic1 và bít TR0= 1;
0 = Cho phép Timer0 hoạt động khi bit TR0 = 1; Bit 2: C/T0#: Bit lựa chọn nguồn xung cung cấp cho
105
0 = Nguồn xung được lấy từ bộ dao động thạch anh. Bit 1 – 0: M10:M00: Bit lựa chọn chế độ hoạt động của Timer0
00 = Chế độ 0: 13 bit Timer/Counter với 8 bit trên thanh ghi TH0 và 5 bit trên thanh ghi TL0
01 = Chế độ 1: 16 bit Timer/Counter
10 = Chế độ 2: 8 bit Timer/Counter tự động nạp lại.
11 = Chế độ 3: Chế độ đếm xung từ bên ngoài với độ phân giải 8 bit
T2CON: Thanh ghi điều khiển Timer2
TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2# CP/RL2 #
Bit 7 Bit 0
Bit 7: TF2: Cờ báo tràn của Timer2 1 = Timer2 xảy ra tràn 0 = Timer2 không xảy ra tràn
Chú ý: Bit này được thiết lập bởi phần cứng khi xảy ra quá trình tràn bộ đếm Timer và phải được xóa bằng phần mềm. Bit này khơng được thiết lập khi 2 bit RCLK và TCLK = 1. Bit này cũng được sử dụng làm cờ báo xảy ra ngắt của Timer2
Bit 6: EXF2: Cờ báo tràn của Timer2 trong chế độ đọc tần số 1 = Timer2 xảy ra tràn khi đọc tần số
0 = Timer2 không xảy ra tràn
Chú ý: Bit này cũng được sử dụng làm cờ báo xảy ra ngắt của Timer2 trong chế độ đọc tần số.
Bit 5: RCLK: Được sử dụng đến khi dùng Timer2 dùng làm nguồn xung tốc độ BAUD cho Port nối tiếp căn cứ theo bảng 11.2.
Chú ý: Nếu không sử dụng Timer2 làm nguồn xung tốc độ BAUD thì phải
xóa bit này về 0 thì Timer2 mới được phép hoạt động ở các chế độ khác.
Bit 4: TCLK: Được sử dụng đến khi dùng Timer2 dùng làm nguồn xung
tốc độ BAUD cho Port nối tiếp căn cứ theo bảng 11.2.
Chú ý: Nếu không sử dụng Timer2 làm nguồn xung tốc độ BAUD thì phải
xóa bit này về 0 thì Timer2 mới được phép hoạt động ở các chế độ khác. Bit 3: EXEN2: Bit cho phép Timer2 hoạt động ở chế độ đọc tần số 1 = Cho phép Timer2 đọc tần số từ chân T2EX0 = Không dùng Timer2 trong chế độ đọc tần số
106
Chú ý: Bit này khơng có tác dụng khi sử dụng Timer2 làm nguồn xung tốc
độ BAUD cho Port nối tiếp
Bit 2: TR2: Bit cho phép Timer2 bắt đầu hoạt động 1 = Cho phép Timer2 hoạt động 0 = Không cho phép Timer2 hoạt động Bit 1: CT2#: Bit lựa chọn nguồn xung cung cấp cho
Timer2 1 = Nguồn xung được lấy từ chân T2
0 = Nguồn xung được lấy từ bộ dao động thạch anh
Bit 0: CP/RL2#: Bit cho phép tự động cập nhật giá trị vào Timer2 trong chế độ đọc tần số.
1 = Cho phép tự động cập nhật giá trị 0 = Không cho phép tự động cập giá trị
Chú ý: Bit này khơng có tác dụng khi sử dụng Timer2 làm nguồn xung tốc
độ BAUD cho Port nối tiếp.
Cấu trúc của chương trình ngắt
- Chương trình con phục vụ ngắt ngồi:
void interrupt_intx (void) interrupt y {
IEx = 0;
//Chương trình điều khiển của ngắt ngồi intx }
Trong đó:
+ x: là tên của ngắt ngoài tương ứng.
+ y: là mức ưu tiên ngắt với các giá trị: 0, 1, 2, 3 (0 là mức ưu tiên
cao nhất)
- Chương trình con phục vụ ngắt Timer:
void interrupt_timerx (void) interrupt y {
TFx = 0;
//Chương trình điều khiển của ngắt Timerx }
Trong đó:
+ x: là tên của ngắt Timer tương ứng
+ y: là mức ưu tiên ngắt với các giá trị: 0, 1, 2, 3 (0 là mức ưu tiên
107
2. Bài tập thực hành:
Lập trình đếm sản phẩm trong một khoảng thời gian nhất định sử dụng ngắt ngoài.
Dụng cụ chuẩn bị:
+ Đồng hồ số
+ Kit thực hành vi điều khiển 8051 + Ocillocope
+ Mạch nạp AT89S52
+ Các loại cáp kết nối 8 sợi, 4 sợi, 2 sợi.
Đề bài: Học sinh tự thiết kế và lập trình theo các yêu cầu sau: Yêu cầu: