intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình bộ định thời (TIMER)

Chia sẻ: Đỗ Xuân Nhạ | Ngày: | Loại File: PDF | Số trang:27

133
lượt xem
8
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Khi một ngắt xuất hiện và được CPU chấp nhận, chương trình chính bị ngắt. Các thao tác sau đây xảy ra: - Hoàn tất việc thực thi lệnh hiện hành - Cất bộ đếm chương trình (PC) vào stack - Trạng thái của ngắt hiện hành được lưu giữ lại - Bộ đếm chương trình PC sẽ nạp địa chỉ của chương trình con phục vụ ngắt và đi thực hiện. - Thực hiện xong sẽ quay về chương trình chính tại vị trí nó bị ngắt và thực hiện tiếp chương trình chính....

Chủ đề:
Lưu

Nội dung Text: Lập trình bộ định thời (TIMER)

  1. Lập trình bộ định thời (TIMER)
  2. Giới thiệu bộ định thời 1. Các thanh ghi của bộ định thời - Timer 0: TH0, TL0 - Timer 1: TH1, TL1 - Các thanh ghi trạng thái và cài đặt chế độ hoạt động cho các bộ định thời: + TCON: Điều khiển + TMOD: Chọn chế độ
  3. Vị trí của các bộ định thời trong sơ đồ khối của chip 89X51/52 Các bộ định thời
  4. VỊ TRÍ CÁC THANH GHI CỦA BỘ ĐỊNH THỜI TRONG VÙNG NHỚ ĐẶC BIỆT- SFR
  5. Thanh ghi TMOD: Timer Mode Chọn chế độ hoạt động TMOD D7 D6 D5 D4 D3 D2 D1 D0 GATE M1 GATE M1 C/T M0 C/T M0 Chọn chế độ hoạt động Chọn chế độ hoạt động cho TIMER1 cho TIMER0
  6. Bit M0, M1 – của thanh ghi TMOD TMOD GATE C/T M1 M0 GATE C/T M1 M0 M1 M0 Chế độ Mô tả 0 0 0 Chế độ định thời 13 bit 0 1 1 Chế độ định thời 16 bit 1 0 2 Chế độ tự động nạp lại 8-bit 1 1 3 Chế độ định thời chia xẻ
  7. Thanh ghi TCON – Timer/Counter Control Register TCON D7 D6 D5 D4 D3 D2 D1 D0 TF1 TF0 IE1 IE0 TR1 TR0 IT1 IT0 Cờ ngắt Cờ ngắt Cờ ngắt Cờ ngắt của của ngoài 1 ngoài 0 Timer1 Timer0
  8. Chế độ hoạt động của Timer - Chế độ 0: Chế độ định thời 13 bit - Chế độ 1: Chế độ định thời 16 bit - THx, TLx chứa giá trị đếm hiện tại của bộ định thời - Chế độ 2: Chế độ tự nạp lại 8-bit - Byte thấp giữ giá trị đếm hiện tại - Byte cao giữ giá trị nạp lại - Chế độ 3: Chế độ định thời chia xẻ
  9. Lập trình cho bộ định thời Timer 0 • Ví dụ 1: lập trình cho bộ định thời 0 hoạt động ở chế độ 1, 16 bit, có thời gian tràn là 500us (sử dụng thạch 12Mhz). – Bước 1: Chọn chế độ hoạt động cho Timer 0 TMOD = 00000001B (0x01) – Bước 2: Nạp giá trị tràn cho các thanh ghi TH0, TL0 Vì bộ định thời đếm lên 1 đơn vị sau mỗi chu kỳ máy nên bộ định thời sẽ tràn sau 500 chu kỳ máy khi nạp vào TH0, TL0 giá trị bằng 65536 – 500 = 65036 tương đương 0FE0Ch TH0 = 0xFE; // MOV TH0, #0FEh TL0 = 0X0C; // MOV TL0, #0Ch - Bước 3: Khởi động bộ định thời T0 TF0 = 0; // (CLR TF0) Xóa cờ tràn TR0 = 1; // (SETB TR0) Khởi động bộ định thời - Bước 4: Chờ bộ định thời tràn while(!TF0) continue; // JNB TF0, $ - Bước 5: Nếu tiếp tục muốn sử dụng bộ định thời: Dừng bộ định thời (TR0 = 0), nạp lại giá trị cho TH0, TL0, khởi động lại (TR0 = 1). TMOD GATE C/T M1 M0 GATE C/T M1 M0
  10. Chương trình hoàn chỉnh ví dụ 1 C ASM TMOD = 00000001B MOV TMOD, #00000001B TH0 = 0xFE; MOV TH0, #0FEh TL0 = 0x0C; MOV TL0, #0Ch TF0 = 0; // Xóa cờ tràn CLR TF0; Xóa cờ tràn // Khởi động bộ định thời ;Khởi động bộ định thời TR0 = 1; SETB TR1 // Chờ cờ tràn bật 1 ; Chờ cờ tràn bật 1 while(!TF0) continue; JNB TF0, $ // Dừng bộ định thời ; Dừng bộ định thời TR0 = 0; CLR TR0 // Nạp lại giá trị ; Nạp lại giá trị TH0 = 0xFE; MOV TH0, #0FEh; TL0 = 0x0C; MOV TL0, #0Ch; ... ... // Khởi động bộ định thời // Khởi động bộ định thời TR0 = 1; SETB TR0
  11. Lập trình cho bộ định thời Timer 0 – (tip) • Ví dụ 2: lập trình cho bộ định thời 0 hoạt động ở chế độ 2, 8-bit tự nạp lại, có thời gian tràn là 200us (sử dụng thạch 12Mhz). – Bước 1: Chọn chế độ hoạt động cho Timer 0 TMOD = 00000010B (0x02) – Bước 2: Nạp giá trị tràn cho các thanh ghi TH0, TL0 Ở chế độ 2, thanh ghi TH0 sẽ giữ giá trị nạp lại, vậy TH0 = 255 - 200; // MOV TH0, #55 TL0 = 255 - 200; // MOV TL0, #55 - Bước 3: Khởi động bộ định thời T0 + TF0 = 0; // (CLR TF0) Xóa cờ tràn + TR0 = 1; // (SETB TR0) Khởi động bộ định thời - Bước 4: Chờ bộ định thời tràn - while(!TF0) continue; // JNB TF0, $ - Bước 5: Xóa cờ tràn (TF0 = 0), tiếp tục đợi cờ tràn bật 1 do thanh ghi TL0 tự động được nạp lại.
  12. Chương trình hoàn chỉnh ví dụ 2 C ASM TMOD = 0x02; MOV TMOD, #00000010B TH0 = 55; MOV TH0, #55 TL0 = 55; MOV TL0, #55 TF0 = 0; // Xóa cờ tràn CLR TF0; Xóa cờ tràn // Khởi động bộ định thời ;Khởi động bộ định thời TR0 = 1; SETB TR1 // Chờ cờ tràn bật 1 ; Chờ cờ tràn bật 1 while(!TF0) continue; JNB TF0, $ // Dừng bộ định thời ; Dừng bộ định thời TR0 = 0; CLR TR0 ... ... // Khởi động bộ định thời // Khởi động bộ định thời TR0 = 1; SETB TR0
  13. Tạo trễ sử dụng Timer MAIN: void main() { MOV TMOD, #00000010B TMOD = 0x02; MOV TH0, #55 while(1) { MOV TL0, #55 P1_0 = !P1_0; AGAIN: delay(55); CPL P1.0 } CALL DELAY JMP AGAIN void delay(unsigned char us){ TH0 = us; DELAY: TL0 = us; CLR TF0; Xóa cờ tràn ;Khởi động bộ định thời TF0 = 0 ; Xóa cờ tràn SETB TR1 ;Khởi động bộ định thời ; Chờ cờ tràn bật 1 TR1 = 1; JNB TF0, $ ; Chờ cờ tràn bật 1 ; Dừng bộ định thời while(!TF0) continue; CLR TR0 ; Dừng bộ định thời RET TR0 = 0; }
  14. NGẮT • Giới thiệu ngắt • Các loại ngắt và bảng vector ngắt: • Reset hệ thống RST Địa chỉ vector ngắt 0000H • Ngắt ngoài 0 IE0 0003H • Timer 0 TF0 000BH • Ngắt ngoài 1 IE1 0013H • Timer 1 TF1 001BH • Cổng nối tiếp RI hoặc TI 0023H • Timer 2 TF2 hoặc EXF2 002BH • Các thanh ghi cấu hình ngắt • Lập trình ngắt
  15. Xử lý của CPU đối với 1 ngắt Khi một ngắt xuất hiện và được CPU chấp nhận, chương trình chính bị ngắt. Các thao tác sau đây xảy ra: - Hoàn tất việc thực thi lệnh hiện hành - Cất bộ đếm chương trình (PC) vào stack - Trạng thái của ngắt hiện hành được lưu giữ lại - Bộ đếm chương trình PC sẽ nạp địa chỉ của chương trình con phục vụ ngắt và đi thực hiện. - Thực hiện xong sẽ quay về chương trình chính tại vị trí nó bị ngắt và thực hiện tiếp chương trình chính.
  16. Thanh ghi cho phép ngắt IE (Interrupt Enable Register) IE D7 D6 D5 D4 D3 D2 D1 D0 EA ET2 ET1 ET0 - ES EX1 EX0 Cho phép Cho phép Cho phép Cho phép ngắt toàn ngắt do ngắt do ngắt do cục Timer 2 Timer 1 Timer 0 Không sử Cho phép Cho phép Cho phép dụng ngắt do port ngắt ngắt nối tiếp ngoài 1 ngoài 0
  17. Thanh ghi ưu tiên ngắt IP (Interrupt Priority Register) IP D7 D6 D5 D4 D3 D2 D1 D0 Không sử PT2 PT1 PT0 dụng Không sử PS PX1 PX0 dụng Ưu tiên Ưu tiên Ưu tiên ngắt cho ngắt cho ngắt cho Timer 2 Timer 1 Timer 0 Ưu tiên ngắt Ưu tiên Ưu tiên do port nối ngắt ngắt tiếp ngoài 1 ngoài 0
  18. LẬP TRÌNH NGẮT 1. Lập trình với ngắt timer – Timer 0 – Timer 1 2. Lập trình với ngắt ngoài – Ngắt ngoài 0 – Ngắt ngoài 1 – Ngắt ngoài theo sườn xuống và theo mức 0 3. Ưu tiên ngắt – Thứ tự ưu tiên thực hiện các ngắt – Lập trình theo đổi ưu tiên các ngắt
  19. 1. Lập trình ngắt timer IE – Interrupt Enable Register EA - ET2 ES ET1 EX1 ET0 EX0 • Bước 1: Chọn chế độ hoạt động của timer như ở phần lập trình cho timer • Bước 2: Cho phép ngắt: – Cho phép ngắt do timer ET0 = 1; // Nếu sử dụng ngắt timer 0 ET1 = 1; // Nếu sử dụng ngắt timer 1 – Cho phép ngt toàn cc EA = 1; // Bắt buộc phải có khi sử dụng bất cứ ngắt nào. • Bước 3: Viết chương trình phục vụ ngắt Timer. Chương trình phục vụ ngắt do timer được đặt ở các vector ngắt 000Bh (Timer 0) 001Bh (Timer 1). Các chương trình con phục vụ ngắt cũng giống như các chương trình con khác, tuy nhiên nó được kết thúc bằng lệnh RETI (Return from Interrupt) thay vì lệnh RET.
  20. Ví dụ 1: Viết chương trình nháy LED nối ở chân P1.0 với chu kỳ 500us sử dụng ngắt timer 0. Sử dụng thạch anh 12Mhz. ASM C ORG 0000H LJMP MAIN void main() { TMOD = 0x02; // Timer 0 ở chế độ 2 ORG 001BH TH0 = 5; LJMP T0_ISR TL0 = 5; // Nạp giá trị cho TH0, TF0 = 0; // Xóa cờ tràn ORG 0030H ET0 = 1; MAIN: EA =1; MOV TMOD, #00000010B; Chế độ 2 TR0 = 1; // Khởi động Timer 0 MOV TH0, #55 while(1) continue; MOV TL0, #55 } CLR TF0; Xóa cờ tràn SETB ET0 void T0_ISR() interrupt 1 { SETB EA P1_0 = !P1_0; SETB TR0; Khởi động Timer 0 } JMP $ T0_ISR: CPL P1.0 RETI
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2