BỘ ĐỊNH THỜI/ BỘ ĐẾM
(TIMER/COUNTER)
1. Giới thiệu
• Tạo ra những khoảng thời gian chính xác đến
cấp chu kỳ máy, có thể thay đổi khoảng thời
gian đó linh hoạt
• Dùng đếm sự kiện – thường ứng dụng để đọc
encoder.
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
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
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
VỊ TRÍ CÁC THANH GHI CỦA BỘ ĐỊNH THỜI TRONG
VÙNG NHỚ ĐẶC BIỆT- SFR
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
2. Hoạt động
XTAL
oscillator
TH
÷12
C/T = 0
TF bật lên 1
khi FFFF → 0
TR
TH0
D15
D14
D13
D12
D11
D14
D13
D12
D11
Cờ tràn
(Overflow Flag)
TL0
D10
D9
D8
D7
D6
D5
TH1
D15
TF
TL
D4
D3
D2
D1
D0
D2
D1
D0
TL1
D10
D9
D8
D7
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
D6
D5
D4
D3
[email protected]
Minh họa hoạt động của timer
FFF2
TF=0
FFF3
FFF4
FFFF
0000
TF=0
TF=0
TF=0
TF=1
Timer là bộ đếm lên, khi xảy ra trạng thái FFFF 0000 thì cờ TF bật 1
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
3. Các thanh ghi
1. Các thanh ghi của bộ định thời
- Timer 0: TH0, TL0
- Timer 1: TH1, TL1
2. 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ế độ
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
Thanh ghi TCON – Timer/Counter Control Register
TCON
D7
D6
TF1
D5
D3
TF0
TR1
Cờ ngắt
của
Timer1
D4
IE1
TR0
Cờ ngắt
của
Timer0
D2
D1
IE0
IT1
Cờ ngắt
ngoài 1
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
D0
IT0
Cờ ngắt
ngoài 0
[email protected]
Thanh ghi TMOD: Timer Mode
Chọn chế độ hoạt động
TMOD
D7 D6
D5
GATE
M1
C/T
D4
D3
D2
GATE
M0
Chọn chế độ hoạt động
cho TIMER1
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
D1
D0
M1
C/T
M0
Chọn chế độ hoạt động
cho TIMER0
[email protected]
4. Chế độ hoạt động của Timer
Mỗi bộ định thời có thể hoạt động ở 4 chế độ:
- 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ẻ
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
Thanh ghi TMOD: Timer Mode
Chọn chế độ hoạt động
TMOD
D7 D6
D5
GATE
M1
C/T
D4
D3
D2
GATE
M0
Chọn chế độ hoạt động
cho TIMER1
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
D1
D0
M1
C/T
M0
Chọn chế độ hoạt động
cho TIMER0
[email protected]
Bit M0, M1 – của thanh ghi TMOD
TMOD
GATE
C/T M1
M0
M1
M0
Chế độ
0
0
1
1
0
1
0
1
0
1
2
3
GATE C/T
M1
M0
Mô tả
Chế độ định thời 13 bit
Chế độ định thời 16 bit
Chế độ tự động nạp lại 8-bit
Chế độ định thời chia xẻ
To slide 10
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
Ví dụ:
Ví dụ 1:
Xác định xem các timer làm việc ở chế độ nào sau đây. (a) MOV TMOD, #01H (b)
MOV TMOD, #20H (c) MOV TMOD, #12H
Giải:
Đổi từ hexa sang nhị phân, dựa vào bảng chế động hoạt động của timer ta có.
(a) TMOD = 00000001, mode 1 of timer 0 is selected.
(b) TMOD = 00100000, mode 2 of timer 1 is selected.
(c) TMOD = 00010010, mode 2 of timer 0, and mode 1 of timer 1 are selected.
Ví dụ 2:
Tính tần số và chy kỳ của chip 8051 khi sử dụng thạch anh 11.0592Mhz khi bit C/T
của thanh ghi TMOD bằng 0.
Giải:
XTAL
÷12
oscillator
1/12 × 11.0529 MHz = 921.6 MHz; T = 1/921.6 kHz = 1.085 us
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
Lập trình cho bộ định thời Timer 0
•
Ví dụ 3: 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
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
GATE
C/T
M1
M0
[email protected]
Chương trình hoàn chỉnh ví dụ 3
ASM
MOV
TMOD, #00000001B
MOV
TH0, #0FEh
MOV
TL0, #0Ch
CLR
TF0; Xóa cờ tràn
;Khởi động bộ định thời
SETB
TR1
; Chờ cờ tràn bật 1
JNB TF0, $
; Dừng bộ định thời
CLR
TR0
; Nạp lại giá trị
MOV
TH0, #0FEh;
MOV
TL0, #0Ch;
...
// Khởi động bộ định thời
SETB
TR0
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
C
TMOD = 00000001B
TH0 = 0xFE;
TL0 = 0x0C;
TF0 = 0; // Xóa cờ tràn
// Khởi động bộ định thời
TR0 = 1;
// Chờ cờ tràn bật 1
while(!TF0) continue;
// Dừng bộ định thời
TR0 = 0;
// Nạp lại giá trị
TH0 = 0xFE;
TL0 = 0x0C;
...
// Khởi động bộ định thời
TR0 = 1;
[email protected]
Lập trình cho bộ định thời Timer 0 – (tiếp)
•
Ví dụ 4: lập trình cho bộ định thời 0 hoạt động ở chế độ 2, 8-bit tự
nạp lại,
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 = 256 - 200;
//
MOV TH0, #56
TL0 = 256 - 200;
//
MOV TL0, #56
- 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.
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
[email protected]
Chương trình hoàn chỉnh ví dụ 4
ASM
MOV
TMOD, #00000010B
MOV
TH0, #56
MOV
TL0, #56
CLR
TF0; Xóa cờ tràn
;Khởi động bộ định thời
SETB
TR1
; Chờ cờ tràn bật 1
JNB TF0, $
; Dừng bộ định thời
CLR
TR0
...
// Khởi động bộ định thời
SETB
TR0
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
C
TMOD = 0x02;
TH0 = 56;
TL0 = 56;
TF0 = 0; // Xóa cờ tràn
// Khởi động bộ định thời
TR0 = 1;
// Chờ cờ tràn bật 1
while(!TF0);
// Dừng bộ định thời
TR0 = 0;
...
// Khởi động bộ định thời
TR0 = 1;
[email protected]
Tạo trễ sử dụng Timer
MAIN:
MOV
MOV
MOV
AGAIN:
CPL
CALL
JMP
TMOD, #00000010B
TH0, #56
TL0, #56
P1.0
DELAY
AGAIN
DELAY:
CLR
TF0; Xóa cờ tràn
;Khởi động bộ định thời
SETB
TR1
; Chờ cờ tràn bật 1
JNB
TF0, $
; Dừng bộ định thời
CLR
TR0
RET
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
void main() {
TMOD = 0x02;
while(1) {
P1_0 = !P1_0;
delay(56);
}
void delay(unsigned char us){
TH0 = us;
TL0 = us;
TF0 = 0 ; Xóa cờ tràn
;Khởi động bộ định thời
TR1 = 1;
; Chờ cờ tràn bật 1
while(!TF0);
; Dừng bộ định thời
TR0 = 0;
}
[email protected]