Giáo trình Lập trình C cho họ vi điều khiển 8051 - Chương 3: Khởi tạo chương trình Timer và chương trình ngắt

Các Timer thường được khởi tạo 1 lần ở đầu chương trình đểthiết lập mode

hoạt động phục vụ các ứng dụng điều khiển liên quan đến định thời hay đếm xung

ngoại.

 Tùy thuộc vào yêu cầu cụthểmà ta điều khiển cho Timer bắt đầu đếm, ngừng

hay khởi động đếm lại từ đầu.

 Thanh ghi TMOD là thanh ghi đầu tiên cần phải khởi tạo đểthiết lập trạng thái

hoạt động cho các Timer.

pdf12 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 3465 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình Lập trình C cho họ vi điều khiển 8051 - Chương 3: Khởi tạo chương trình Timer và chương trình ngắt, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 for(t=0;t<20;t++) 
{ 
 TMOD=0x01; 
 TH0=0xC350; 
 TL0=0xC350; 
 TR0=1; 
 while(!TF0); 
 TF0=0; 
ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
Biên soạn: Nguyễn Bá Thuận Page 5 of 12 
 TR0=0; 
} 
} 
main() //chương trình chính 
{ 
 while(1) //vòng lập vô tận 
 { 
 led=0; //cho led ở mức 0 
 delay_1(5); //delay 5 giây 
 led=1; //cho led ở mức 1 
 delay_1(2); //delay 2 giây 
 } 
} 
3. BÀI TẬP ỨNG DỤNG. 
- Hãy viết chương trình con delay 50 miro giây. 
- Hãy viết chương trình con delay 20ms. 
- Hãy viết chương trình con delay 2h. 
- Hãy viết chương trình con delay 1day. 
II. KHỞI TẠO CHƯƠNG TRÌNH NGẮT. 
1. CÁC THANH GHI ĐIỀU KHIỂN NGẮT 
Tổ chức ngắt của 8051: 
- 8051 có 5 nguồn ngắt: 2 ngắt bên ngoài (INT0 và INT1), 2 ngắt Timer, 1 ngắt 
Port nối tiếp. 2 ngắt bên ngoài có thể được lập trình để kích ngắt bằng cạnh xuống 
hoặc bằng mức thấp. 
- Việc tranh chấp giữa các nguồn ngắt được giải quyết bằng mạch ưu tiên ngắt 
bên trong 8051. Có 2 thanh ghi điều khiển ngắt: Thanh ghi cho phép ngắt IE và thanh 
ghi ưu tiên ngắt IP. 
Thanh ghi cho phép ngắt IE (Interrupt Enable) : Có địa chỉ Byte là 0A8H 
Bit Symbol Bit Address Description ( 1 : cho phép; 0 : không cho phép) 
IE.7 EA AFH 
Cấm tất cả các ngắt, nếu EA = 0. 
Nếu EA = 1, mỗi nguồn ngắt được cho phép 
hoặc cấm bằng set hoặc clear các bit tương ứng 
IE.6 - AEH Không dùng 
ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
Biên soạn: Nguyễn Bá Thuận Page 6 of 12 
IE.5 - ADH Cho phép ngắt bộ định thời 2 (TIMER 2) 
IE.4 ES ACH Cho phép ngắt Port nối tiếp 
IE.3 ET1 ABH Cho phép ngắt TIMER1 
IE.2 EX1 AAH Cho phép ngắt ngoài 1 
IE.1 ET0 A8H Cho phép ngắt TIMER0 
IE.0 EX0 A9H Cho phép ngắt ngoài 0 
Các thanh ghi cho phép ngắt IP (Interrupt Priority): Có địa chỉ Byte là 0B8H 
Bit Symbol Bit Address Description (1 = Mức cao, 0 = Mức thấp) 
IP.7 - - Không dùng 
IP.6 - - Không dùng 
IP.5 PT2 0BDH Ưu tiên cho phép ngắt bộ định thời 2 
IP.4 PS 0BCH Ưu tiên cho phép ngắt Port nối tiếp 
IP.3 PT1 0BBH Ưu tiên cho phép ngắt TIMER 1 
IP.2 PX1 0BAH Ưu tiên cho phép ngắt ngoài 1 
IP.1 PT0 0B9H Ưu tiên cho phép ngắt TIMER 0 
IP.0 PX0 0B8H Ưu tiên cho phép ngắt ngoài 0 
Nếu 2 ngắt cùng mức ưu tiên xảy ra đồng thời thì thứ tự ưu tiên như sau: PS, 
PT1, PX1, PX0. 
Ngắt Timer: 
 Ngắt Timer xảy ra khi cờ TFx được xét (bộ đếm tràn). Cờ TFx được clear bằng 
bằng phần mềm hoặc khi vi điều khiển thực hiện chương trình con phục vụ ngắt Timer 
Ngắt ngoài: 
- Ngắt ngoài xảy ra khi có mức thấp hoặc cạnh âm trên chân 0INT (bit P3.2) hoặc 
1INT (bit P3.3) của 8051 
+ Khi chân 0INT nhân được tín hiệu điều khiển ( với mức áp thấp ), nó sẽ dừng ngay 
chương trình đang chạy và nhảy tới địa chỉ 0003H của bộ nhớ EEPROM và cho thi 
hành chương trình đã có ở địa chỉ này. 
+ Khi chân 1INT nhân được tín hiệu điều khiển ( với mức áp thấp ), nó sẽ dừng ngay 
chương trình đang chạy và nhảy tới địa chỉ 0013H của bộ nhớø EEPROM và cho thi 
hành chương trình đã có ở địa chỉ này. 
- Kích bằng cạnh hay kích bằng mức được lựa chọn bằng hai bit IT0 hoặc IT1 trong 
thanh ghi SCON . 
ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
Biên soạn: Nguyễn Bá Thuận Page 7 of 12 
+ Nếu IT1=0 ngắt ngoài 1 được kích khởi mức bởi việc phát hiện mức áp thấp tại chân 
1INT 
+ Nếu IT1=1 ngắt ngoài 1 được kích khởi cạnh bởi việc phát hiện mức áp thấp tại chân 
1INT 
- Có hai bit IE0 và IE1 trong TCON chỉ ra trạng thái có hay không có ngắt ngoài 
(phát hiện cạnh xuống tại chân 0INT hay 1INT ) . 
Ngắt dùng RESET 
Có thể xem tác dụng Reset (cho bit tại chân số 9 lên 1) cũng là một ngắt đặt biệt. 
Khi tín hiệu Reset xuất hiện, nó sẽ dừng ngay chương trình chính và nhảy về địa chỉ 
gốc 0000h của bộ nhớ EEPROM và cho chạy chương trình bắt đầu bằng địa chỉ này. 
2. CÁCH KHỞI TẠO CHƯƠNG TRÌNH NGẮT. 
a. Khởi tạo ngắt timer 
Void Tênhàm(void) interrupt nguồn ngắt using băng thanhghi 
{ 
// chương trình phục vụ ngắt ơ đây 
} 
Chú ý về hàm ngắt: 
+ Hàm ngắt không được phép trả lại giá trị hay truyền biến vào hàm. 
+ Tên hàm bất kì. 
+ interrupt là từ khóa phân biệt hàm ngắt với hàm thường. 
+ Nguồn ngắt từ 0 tới 5 theo bảng vector ngắt. 
+ Băng thanh ghi trên ram chọn từ 0 đến 3. 
Tựy theo bạn viết hàm ngắt cho nguồn nào bạn chọn nguồn ngắt từ bảng sau: 
Interrupt Flag Vector Address 
System Reset RST 0000H 
External 0 IE 0 0003H 
Timer 0 TF 0 000BH 
External 1 IE 1 0013H 
Timer 1 TF 1 001BH 
Serial Port R1 or T1 0023H 
Timer 2 TF2 or EXF2 002BH 
Riêng ngắt Reset không tính, bắt đầu đếm từ 0 và từ ngắt ngoài 0. Ví dụ: tôi cần viết hàm 
ngắt cho bộ định thời timer 1 hàm ngắt sẽ là. 
ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
Biên soạn: Nguyễn Bá Thuận Page 8 of 12 
void timer1_isr(void) interrupt 3 using 0 
{ 
// lệnh cần thực hiện. 
} 
- Về using 0: Có 4 băng thanh ghi bạn có thể chọn cho chương trình phục vụ ngắt, cái này 
cũng không quan trọng. Trong hàm ngắt các bạn có thể bỏ đi từ using 0, khi đó vi điều 
khiển sẽ tự sắp xếp là dùng băng thanh ghi nào. 
- Hàm ngắt khác hàm bình thường chỗ nào. Hàm bình thường ví dụ hàm delay, cứ khi 
bạn gọi nó thì nó sẽ được thực hiện, có nghĩa là nó có vị trí cố định trong tiến trình hàm 
main, có nghĩa là bạn biết nó xảy ra khi nào. Còn hàm ngắt thì không có tiến trình cố 
định, điều kiện ngắt có thể xảy ra bất kì lúc nào trong tiến trình hàm main và cứ khi nào 
có điều kiện ngắt thì hàm ngắt sẽ được gọi tự động. 
Bắt đầu chương trình có ngắt: 
-Trước khi bắt đầu cho chạy chương trình ta phải cho phép ngắt toàn cục được xảy 
ra bằng cách gán EA(Enable All interrupt) bằng 1, thì ngắt mới xảy ra. 
-Thường thì ngay vào đầu chương trình(hàm main) trước vòng while(1) chúng ta 
đặt công việc khởi tạo, cấu hình và cho phép kiểm tra ngắt. Ví dụ với bộ định thởi timer ta 
gán các giá trị phù hợp cho thanh ghi TCON( Timer CONtrol). 
TCON Điều khiển bộ đinh thời 
TCON.7 TF1 
Cờ tràn của bộ định thời 1. Cờ này được set bởi phần 
cứng khi có tràn, được xoá bởi phần mềm, hoặc bởi 
phần cứng khi bộ vi xử lý trỏ đến trình phục vụ ngắt 
TCON.6 TR1 
Bit điều khiển hoạt động của bộ định thời 1. Bit này 
được set hoặc xoá bởi phần mềm để điều khiển bộ 
định thời hoạt động hay ngưng 
TCON.5 TF0 Cừ tràn của bộ định thời 0 
TCON.4 TR0 Bit điều khiển hoạt động của bộ định thời 0 
TCON.3 IE1 
Cừ ngắt bên ngoài 1 (kích khởi cạnh). Cờ này được 
trên chân INT1, được xoá bởi phần mềm. 
TCON.2 IT1 Cờ ngắt bên ngoài 1 (kích khởi cạnh hoặc mức). 
này được set hoặc xoá bởi phần mềm khi xảy ra cạnh TCON.1 IE0 Cờ ngắt bên ngoài 0 (kích khởi cạnh) 
TCON.0 IT0 Cờ ngắt bên ngoài 0 ( kích khởi cạnh hoặc mức) 
ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
Biên soạn: Nguyễn Bá Thuận Page 9 of 12 
Ví dụ để chạy bộ định thời timer 1 ta dùng câu lệnh: TR1=0; TR1(Timer Run 1). Còn 
bạn nào thích khó thì:TCON=0xxx; Còn các loại ngắt khác quá trình tương tự. 
Sau khi khởi tạo xong và cho ngắt timer 1 chạy thì điều gì xảy ra? Khi bắt đầu cho timer 
1 chạy thì bộ đếm của timer sẽ đếm dao động của thạch anh, cứ 12 dao động của thạch 
anh(1 chu kì máy), bộ đếm của timer 1 TL1(Timer Low1) sẽ tăng 1,có thể nói timer 1 
đếm số chu kì máy. Đối với chế độ 8 bít. TL1 là 1 thanh ghi 8 bít, là bộ đếm của bộ định 
thời rõ rồi. Nó đếm được từ 0, đến 255. Nếu nó đếm đến 256 thì bộ đếm tràn, TL1 quay 
vòng lại bằng 0, và cờ ngắt TF1(Timer Flag 1) tự động được gán lên 1(bằng phần cứng 
của vi điều khiển) như 1 công tắc tự động bật, và ngắt xảy ra. Còn với chế độ 16 bít, bộ 
đếm của bộ định thời còn 1 thanh ghi 8 bít nữa là TH1(Timer high 1), nếu cấu hình cho 
timer 1 hoạt động ở chế độ 16 bit thì khi TL1 tràn nó sẽ đếm sang TH1(TH1 sẽ tăng 1). 
Như vậy ta có thể đếm: 216 chu kì máy( 2 thanh ghi 8+8=16 bít). 
Chú ý là khi bộ đếm tràn ngắt sẽ xảy ra. Nếu ta cần đếm 256 chu kì máy thì khi khởi tạo 
ta cho TL1=0; , còn nếu không muốn đếm 256 chu kì mày mà ta chỉ cần đếm 100 thôi 
ngắt đã xảy ra rồi thì ta fải làm như sau: 256-100 = 156; và khi khởi tạo ta gán : 
TL1=155; vì đếm từ 155 đến 255 là đủ 100 lần thì ngắt xảy ra. 
Chương trình khởi tạo timer 0. 
void khoitaotimer0(void) // Hàm khởi tạo 
{ 
EA=0; // Cam ngat toan cuc 
TMOD=0x02; // Timer 0 che do 2 8 bit auto reload 
TH0=0x9B; // Gia tri nap lai 155 doi ra so hex 
TL0=0x9B; // Gia tri khoi tao 155 doi ra so hex 
ET0=1; // Cho phep ngat timer 0 
EA=1; // Cho phep ngat toan cuc 
TR0=1; // Chay timer 0 bat dau dem so chu ki may 
} 
Ví dụ ứng dụng. 
Ứng dụng ngắt timer để tạo chương trình phát xung nhấp nháy tại chân p0^0. 
#include 
sbit led=P0^0; 
void timer0()interrupt 1 
{ 
led=~led; 
} 
void khoitaotimer0() 
{ 
ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
Biên soạn: Nguyễn Bá Thuận Page 10 of 12 
 EA=0; 
 TMOD=0X02; 
 TH0=0x9B; 
 TL0=0x9B; 
 ET0=1; 
 EA=1; 
 TR0=1; 
} 
main() 
{ 
 khoitaotimer0(); 
} 
Chương trình đã được lập trình và mô phỏng 
ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
Biên soạn: Nguyễn Bá Thuận Page 11 of 12 
b. Khởi tạo ngắt ngoài. 
Chương trình khởi tạo ngắt ngoài 0. 
Void ngatngoai0(void) //khởi tạo hàm ngắt ngoài 0 
{ 
EA=1; //cho phép ngắt toàn cục. 
EX0=1; //cho phép ngắt ngoài 0 
IT0=1; //cho phép tác động cạnh tại chân P3^2 
} 
Ví dụ ứng dụng 
Ứng dụng ngắt ngoài để điều khiển đảo port 0 khi có tác động ngắt ngoài 0 tại chân 
P3^0. 
#include 
void ngatngoai0()interrupt 0 
{ 
P0=~P0; 
} 
void khoitaongatngoai0() 
{ 
 EA=1; 
 EX0=1; 
 IT0=1; 
} 
main() 
{ 
 khoitaongatngoai0(); 
} 
ĐẠI HỌC LẠC HỒNG GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
Biên soạn: Nguyễn Bá Thuận Page 12 of 12 
Chương trình đã được lập trình và mô phỏng 
3. BÀI TẬP ỨNG DỤNG. 
- Hãy khởi tạo ngắt timer 1. 
- Hãy lập trình một ứng dụng khi dùng ngắt timer. 
- Hãy khởi tạo ngắt ngoài 1. 
- Hãy lập trình một ứng dụng khi dùng ngắt ngoài 1. 

File đính kèm:

  • pdfGiáo trình Lập trình C cho họ vi điều khiển 8051 - Chương 3 Khởi tạo chương trình Timer và chương trình ngắt.pdf