C5 Timers

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 43

CHƯƠNG 5

BỘ ĐỊNH THÌ (TIMERS)

Giáo trình Vi Xử Lý Lưu Phú 1


Tóm tắt:
5.1 Giới thiệu
5.2 Thanh chi TMOD
5.3 Thanh ghi TCON
5.4 Các mode timer và cờ báo tràn
5.5 Nguồn tạo xung Timer CK
5.6 Chạy,dừng và điều khiển timer
5.7 Khởi động và truy xuất các thanh ghi timer
5.8 Định thì thời đoạn ngắn,trung bình,dài
5.9 Các ví dụ ứng dụng timer
5.10 Tính chính xac thời gian định thì
5.11 Timer2 của MCU8052
5.12 Tạo baurate Giáo trình Vi Xử Lý Lưu Phú 2
5.1 Giới thiệu
Bộ định thì 3 bit gồm 3 TFF ghép
nối tiếp≡ bộ đếm/chia 23=8
 Khi có xung CK các ngõ ra lần lượt
thay đổi = 000 → 111
 Tần số xung ngõ ra Q FF thứ 3 bằng
1/8 fCK
 FF sau cùng đóng vai trò cờ báo tràn,
Q=1 khi mạch đếm đến xung CK thứ 8
= 111 → 000

Hình 5.1: Sơ đồ nguyên lý bộ định thì 3 bit và giản đồ xung

Giáo trình Vi Xử Lý Lưu Phú 3


5.1 Giới thiệu
 MCU8051 có 2 bộ định thì 16 bit,MCU8052 có 3 bộ định thì 16 bit
 Bộ định thì 16 bit đếm tối đa 216=65536 xung CK,giá trị đếm từ 0000H
đến FFFFH
 Ứng dụng bộ định thì:
(a)định thì thời đoạn(interval timing):đo độ rộng xung,đồng bộ một hoạt
động như kiểm tra trạng thái input/output.
(b)đếm sự kiện(event counting):đếm số xung,trạng thái chuyển mức
logic
(c)tạo baudrate cho cổng nối tiếp onchip(xem chương cổng nối tiếp)
 6 SFR quản lý hoạt động 2 bộ định thì 8051 và thêm 5 SFR quản lý bộ
định thì thứ 3 của 8052
Giáo trình Vi Xử Lý Lưu Phú 4
5.1 Giới thiệu
Bảng B4.1: Các SFR cho Timer
Timer SFR Mục đích Đia chỉ byte Định vị bit
TCON Điều khiển 88H Có
TMOD Đặt mode 89H Không
TL0 Byte thấp Timer0 8AH Không
TL1 Byte thấp Timer1 8BH Không
TH0 Byte cao Timer0 8CH Không
TH1 Byte cao Timer1 8DH Không
T2CON* Điều khiển Timer2 C8H Có
RCAP2L* Bắt byte thấp Timer2 CAH Không
RCAP2H* Bắt byte cao Timer2 CBH Không
TL2* Byte thấp Timer2 CCH Không
TH2* Byte cao Timer2 CDH Không

*Chỉ có trong 8032/8052


Giáo trình Vi Xử Lý Lưu Phú 5
5.2 Thanh ghi TMOD Bảng B4.2: Tóm tắt thanh ghi TMOD
 TMOD(địa chỉ byte 89H):
Bit Tên Timer Mô tả
không truy xuất bit được,đặt mode 7 GATE 1 Bit Gate.Khi Gate=1,Timer chỉ
làm việc cho Timer1 và Timer0. chạy khi ngõ vào 1=1
 4 bit cao quản lý Timer1,4 bit thấp 6 / 1 Bit chọn Đếm/Định thì
1= đếm sự kiện
quản lý Timer0(Bảng B4.2 và B4.3)
0=định thì thời đoạn
 Thường TMOD được nạp data bằng 5 M1 1 Mode bit 1(xem Bảng B4.3)
phần mềm ở đầu chương trình khởi 4 M0 1 Mode bit 0(xem Bảng B4.3)
động mode làm việc cho Timer 3 GATE 0 Bit Gate.Khi Gate=1,Timer chỉ
chạy khi ngõ vào 0=1
2 / 0 Bit chọn Đếm/Định thì
1= đếm sự kiện
0=định thì thời đoạn
1 M1 0 Mode bit 1(xem Bảng B4.3)
0 M0 0 Mode bit 0(xem Bảng B4.3)

Giáo trình Vi Xử Lý Lưu Phú 6


5.2 Thanh ghi TMOD
Bảng B4.3: Các mode Timer Giải:
M1 M0 Mode Mô tả a) Viết lệnh nạp data vào
0 0 0 Mode Timer 13 bit(mode 8048)
0 1 1 Mode Timer 16 bit TMOD như sau:
1 0 2 Mode Timer 8 bit tự động nạp lại MOV TMOD,#00010010B
1 1 3 Mode Timer tách biệt:
Timer0: TL0 là Timer 8 bit điều khiển bằng Hay MOV TMOD,#12H
các bit mode Timer0;TH0 là Timer 8 bit a) Viết lệnh nạp data vào
điều khiển bằng các bit mode Timer1.
Timer1: dừng TMOD như sau:
MOV MOD,#01010001B
Ví dụ 5.1: Khởi động các Timer làm việc như sau: Hay MOV TMOD,#51H
a) Timer0 định thì 8 bit,Timer1 định thì 16 bit
b) Timer0 định thì 16 bit,Timer1 đếm sự kiện 16 bit

Giáo trình Vi Xử Lý Lưu Phú 7


5.3 Thanh ghi TCON Bảng B4.4: Tóm tắt thanh ghi TCON
 TCON(88H) : truy xuất bit được, Bit Ký hiệu Địa chỉ bit Mô tả
điều khiển Timer chạy/dừng và chứa TCON.7 TF1 8FH Cờ báo tràn Timer1.Đặt bằng cứng khi tràn; xóa bằng
mềm hoặc bằng cứng khi bộ xử lý chuyển đến trình
cờ báo tràn phục vụ ngắt (ISR)Timer1
 4 bit cao quản lý Timer,4 bit thấp TCON.6 TR1 8EH Bit điều khiển chạy Timer1.Đặt/xóa bằng mềm để
chạy/dừng Timer1
quản lý ngắt(xem chương ngắt) TCON.5 TF0 8DH Cờ báo tràn Timer0.Đặt bằng cứng khi tràn; xóa bằng
mềm hoặc bằng cứng khi CPU chuyển đến trình phục
Ví dụ 5.2: Viết lệnh chạy /dừng vụ ngắt (ISR)Timer0
TCON.4 TR0 8CH Bit điều khiển chạy Timer0.Đặt/xóa bằng mềm để
Timer1 và Time0. chạy/dừng Timer0
TCON.3 IE1 8BH Cờ báo ngắt ngoài 1.Đặt bằng cứng khi nhận dạng
Giải: có cạnh xuống trên ngõ 1;xóa bằng cứng hoặc
bằng mềm khi CPU chuyển đến trình phục vụ ngắt
Chạy /dừng Timer1: ngoài 1

SETB TR1 TCON.2 IT1 8AH Cờ báo loại ngắt ngoài


khai báo ngắt ngoài
1.Đặt/xóa bằng mềm
1 tác động cạnh xuống /mức
…. thấp

CLR TR1 TCON.1 IE0 89H Cờ báo ngắt ngoài


có cạnh xuống trên ngõ
0.Đặt bằng cứng khi nhận dạng
0;xóa bằng cứng hoặc
Chạy/dừng Timer0: bằng mềm khi CPU chuyển đến trình phục vụ ngắt
ngoài 0
SETB TR0 TCON.0 IT0 88H Cờ báo loại ngắt ngoài 0.Đặt/xóa bằng mềm
khai báo ngắt ngoài 0 tác động cạnh xuống /mức
…. thấp

CLR TR0 Giáo trình Vi Xử Lý Lưu Phú 8


5.4 Các mode Timer và cờ báo tràn
 Ký hiệu x thay cho ký hiệu 0/1 của Timer0/Timer1
 Tmerx có 4 mode làm việc: mode 0,mode 1,mode 2,mode 3
5.4.1 Mode 0- Mode Timer 13 bit

Hình 5.2a: Timerx mode 0


 Mode 0 là mode timer 13 bit tương hợp với họ MCU8048 version
trước,rất ít sử dụng hiện nay
 8 bit THx nối cascade với 5 bit thấp TLx tạo thành timer 13 bit(3 bit cao
TLx không sử dụng)

Giáo trình Vi Xử Lý Lưu Phú 9


5.4 Các mode Timer và cờ báo tràn
5.4.2 Mode 1- Mode Timer 16 bit

Hình 5.2b: Timer mode 1


 Mode 1 là mode timer 16 bit kết nối TLx với THx tạo thành bộ timer 16 bit
 Byte thấp TLx với LSB=bit 0 TLx,byte cao THx với MSB=bit 7
 Mỗi xung nhịp Timer CK đưa vào,bộ timer sẽ đếm lên→giá trị đếm/chia tối đa
=216=65536
 Khi (THxTLx)=FFFFH đếm thêm 1 xung timer CK sẽ chuyển sang 0000
→Timer tràn→phần cứng sẽ đặt cờ báo tràn TFx=1,timer vẫn tiếp tục đếm
 TFx có thể được đặt/xóa bằng phần mềm
 Có thể đọc/ghi THx,TLx bất kỳ thời điểm nào
Giáo trình Vi Xử Lý Lưu Phú 10
5.4 Các mode Timer và cờ báo tràn
5.4.2 Mode 1- Mode Timer 16 bit
Ví dụ 5.3: Phân tích các dòng lệnh sau đây:
MOV TMOD,#01H
MOV TH0,#0FCH
MOV TL0,#18H
SETB TR0
JNB TF0,$
CLR TR0

Giải:
 Dòng 1 khởi động Timer0 mode 1 chức năng Timer 16 bit
 Dòng 2 và 3 đặt giá trị đếm cho timer =FC18H,timer đếm từ giá trị này cho đến
FFFFH.Suy ra số xung đếm được cho đến khi timer tràn=0000-FC18=03E8H#1000 xung
 Dòng 4 cho Timer0 chạy
 Dòng 5 chờ cờ TF0=1 Timer0 báo tràn
 Dòng 6 Ngừng chạy Timer0
Giáo trình Vi Xử Lý Lưu Phú 11
5.4 Các mode Timer và cờ báo tràn
5.4.3 Mode 2- Mode Timer 8 bit tự động nạp lại(auto-reload)

Hình 5.2c: Timer mode 2


 Mode 2 là mode timer 8 bit tự động nạp lại giá trị đặt trước
 TLx là bộ timer 8 bit,THx chứa giá trị đặt trước
 Khi timer tràn TLx=FFH→00H,cờ báo tràn TFx=1,đồng thời phần cứng nạp giá trị đặt
trước từ THx sang TLx,TLx sẽ đếm từ giá trị này lên FFH và cứ thế tiếp tục…
 Mode 2 tiện lợi hơn mode 1 ở chỗ Timer tự động nạp giá trị đặt trước khi tràn mà vẫn tiếp
tục đếm nên đáp ứng thời gian chính xác hơn!
Giáo trình Vi Xử Lý Lưu Phú 12
5.4 Các mode Timer và cờ báo tràn
5.4.3 Mode 2- Mode Timer 8 bit tự động nạp lại(auto-reload)
Ví dụ 5.4: Phân tích các dòng lệnh sau:  Trong ví dụ 5.3 Timer mode 1,sau khi tràn Timer sẽ
MOV TMOD,#20H đếm từ 0000H trở lên,nên muốn Timer đếm từ giá
MOV TH1,#9CH trị đặt trước,phải ngừng Timer và thêm các lệnh nạp
MOV TL1,TH1 giá trị đặt trước lại cho Timer như dòng 2 và 3
SETB TR1  Trong ví dụ 5.4 Timer mode 2,sau khi tràn Timer tự
JNB TR1,$ động nạp giá trị đặt trước chứa trong THx vào
CPL P1.0 TLx,trong lúc Timer vẫn đếm nên không mất thời
…. gian ngừng Timer để nạp lại giá trị đặt trước,do đó
thời gian định thì của Timer sẽ chính xác hơn!
Giải:
 Dòng 1 khởi động Timer1 mode 1 chức năng Timer 8 bit tự động nạp lại
 Dòng 2 nạp giá trị đặt trước=9CH cho TH1
 Dòng 3 nạp giá trị đặt trước vào TL0 để Timer đếm từ giá trị đặt trước ngay vòng đầu tiên!
 Cho chạy Timer1
 Chờ báo tràn TF1=1
 Bù bit port P1.0 ngay sau khi Timer1 tràn
Giáo trình Vi Xử Lý Lưu Phú 13
5.4 Các mode Timer và cờ báo tràn
5.4.4 Mode 3- Mode Timer tách biệt(Split Timer)
 Mode 3 là mode Timer tách biệt xem như có
3 bộ Timer làm việc cùng một lúc
 Timer0 trong mode 3 được tách thành 2 bộ
timer 8 bit độc lập TL0 và TH0 với lưu ý:
- Bộ timer 8 bit TL0 có cờ báo tràn là TF0,xung
Timer CK chọn từ bit / cho Timer0 trong TMOD,
chạy/dừng điều khiển bằng bit TR0,điều khiển ngoài
bằng bit GATE Timer0
- Bộ timer 8 bit TH0 có cờ báo tràn là TF1,xung
Timer CK cố định từ FOSC/12(FOSC=tần số dao động
CK của MCU),chạy/dừng điều khiển bằng bit TR1
 Timer1 dừng khi khai báo mode 3,hoặc chạy khi Hình 5.2d: Timer mode 3
khai báo một trong 3 mode 0,1,2;không có cờ báo tràn(vì TF1 đã sử dụng cho bộ timer TH0),vẫn
sử dụng bit GATE và / cho Timer1
 Có thể sử dụng Timer1 ở mode 3 như là bộ timer thứ 3 không cần tín hiệu báo tràn như tạo
baudrate cho cổng nối tiếp,bộ đếm/định thì không bị tràn quá 255(8 bit) hay 15635(16 bit) xung
đếm!

Giáo trình Vi Xử Lý Lưu Phú 14


5.4 Các mode Timer và cờ báo tràn
5.4.4 Mode 3- Mode Timer tách biệt(Split Timer)
Ví dụ 5.5: Phân tích các dòng lệnh sau: Giải:
1 MOV TMOD,#00110111B  Dòng 1 khởi động Timer 0 mode 3 TL0 đếm
sự kiện,TH0 mặc định là timer(Timer
2 MOV TH1,#0FDH CK=Fosc/12), Timer1 dừng
3 MOV TL1,TH1  Dòng 2 nạp TH1 giá trị đặt trước(chuẩn bị
4 MOV TH0,#9CH cho Timer1 chạy mode 2)
 Dòng 3 nạp giá trị đặt trước vào TL1 để đếm
5 SETB TR0 từ vòng đầu
6 SETB TR1  Dòng 4 nạp giá trị đặt trước cho Timer TH0
7 MOV TMOD,#00100111B  Dòng 5 chạy Timer TL0
 Dòng 6 chạy Timer TH0
8 JNB TF1,$  Dòng 7 chạy Timer1 mode 2
9 CLR TR1  Dòng 8 chờ Timer TH0 tràn
10 CLR TR0  Dòng 9 dừng Timer TH0
11 MOV TMOD,#00110111B  Dòng 10 dừng Timer TL0
Dòng 11 dừng Timer1

Giáo trình Vi Xử Lý Lưu Phú 15
5.5 Nguồn tạo xung Timer CK
 Nguồn tạo xung Timer CK được khai
báo qua bit / trong thanh ghi TMOD

5.5.1 Định thì thời đoạn / =


 Xung Timer CK lấy từ tần số dao động
on chip chia 12
Hình 5.3: Sơ đồ minh họa nguồn tạo xung Timer CK
= /12
 Cho = 12 ℎ → = 1 ℎ # 01 xung Timer CK=1µs
5.5.2 Đếm sự kiện / =
 Xung Timer CK lấy từ nguồn tạo xung bên ngoài
 Chân T0=P3.4 là ngõ vào xung đếm cho Timer0
 Chân T1=P3.5 là ngõ vào xung đếm cho Timer1
 Giá trị tối đa bộ đếm =65536(khai báo Timer mode 1 16 bit)
 Timer tăng 1 giá trị khi phát hiện có cạnh xuống ở ngõ vào tương ứng
 Thời gian đếm 1 xung mất tổng cộng 2MC→tần số xung đếm ngoài max=500Khz(Fosc=12Mhz)

Giáo trình Vi Xử Lý Lưu Phú 16


5.6 Chạy,dừng và điều khiển timer
 Cách đơn giản nhất điều khiển
chạy/dừng timer là đặt/xóa bit TRx
bằng mềm:
SETB TRx ;chạy Timerx
CLR TRx ;dừng Timerx Hình 5.5: Mô hình điều khiển chạy/dừng timer

 Điều khiển bằng bit GATE(bit 7 và bit 3 trong thanh ghi TMOD)
Đặt GATE=1→Timerx chỉ chạy khi TRx=1 và =1
( 0 = 3.2, 1 = 3.3)
Như vậy Timerx dừng khi TRx=0 hoặc =0

Giáo trình Vi Xử Lý Lưu Phú 17


5.6 Chạy,dừng và điều khiển timer

Hình 5.5: Mô hình điều khiển tổng quát cho Timer1 mode 1
Giáo trình Vi Xử Lý Lưu Phú 18
5.6 Chạy,dừng và điều khiển timer
 Tóm tắt mô hình điều khiển chạy/dừng và nguồn xung timer CK cho Timer1 như
hình 5.5(tương tự cho Timer0 với các bit điều khiển tương ứng)
 Nguồn xung timer CK
/ = 0: định thì,timer CK=Fosc/12(Fosc=12Mhz,TtimerCK=1µs)
/ = 1: đếm sự kiện,timer CK= xung ngõ vào T1=P3.5(fmax=500Khz,
Fosc=12Mhz)(Timer0 ngõ vào T0=P3.4)
 Điều khiển chạy/dừng
GATE=0: TR1=1: chạy; TR1=0 : dừng(đặt/xóa TR1 bằng mềm)
GATE=1: TR1=1, 1 = 3.3 = 1: chạy; TR1=0 hoặc 1=0:
dừng(đặt/xóa GATE bằng mềm,đặt/xóa 1 bằng cứng hay mềm)
(Timer0 TR0 và 0 = 3.2)

Giáo trình Vi Xử Lý Lưu Phú 19


5.6 Chạy,dừng và điều khiển timer
Ví dụ 5.6: Thiết kế mạch đo độ rộng xung,cho độ rộng xung max=10ms
Giải:
Ta sử dụng Timer0 làm bộ timer đo độ rộng xung.(Hình vd5.6)
Cho Fosc=12Mhz→1 xung Timer CK=1µs→Độ rộng xung đo max
=10ms=10000µs
Cho xung cần đo vào ngõ 0 = 3.2 làm tín hiệu điều khiển
chạy /dừng Timer0 bên ngoài
Khai báo Timer0 có điều khiển ngoài GATE=1 và mode 1 16 bit
để đếm >10000 xung
Đoạn chương trình như sau:
… Hình vd5.6
MOV TMOD,#09H ;Time0 mode 1 điều khiển ngoài qua P3.2
SETB TR0 ; Timer0 sẵn sàng chạy(chờ P3.2=1)
JNB P3.2,$ ;chờ mức 1 chạy Timer0
JB P3.2,$ ;chờ mức 0 dừng Timer0
MOV B,TH0 ;cất byte cao giá trị đo
MOV A,TL0 ;cất byte thấp giá trị đo
MOV TH0,#0 ;xóa byte cao bộ đếm
MOV TL0,#0 ;xóa byte thấp bộ đếm 20
Giáo trình Vi Xử Lý Lưu Phú
5.7 Khởi động và truy xuất các thanh ghi Timer
5.7.1 Khởi động các thanh ghi Timer
 Khởi động Timer: nạp giá trị data thích hợp vào thanh ghi TMOD để khai báo:
 Điều khiển chạy /dừng : ngoài (ngõ )GATE=1 hay trong GATE=0
 Chức năng : đếmsự kiện(Timer CK ngoài ngõ Tx) / = 1
định thì(Timer CK trong=Fosc/12): / = 0
 Mode 0,1,2,3 tùy theo yêu cầu sử dụng M1M0=00→11
Ví dụ 5.7: Khởi động các Timer làm việc theo các yêu cầu sau,cho Fosc=12Mhz
1. Đếm sản phẩm: cảm biến đếm sản phẩm phát xung đếm đưa vào ngõ P3.4,số lượng sản phẩm
max=200
2. Đo độ rộng xung từ 10µs đến 50ms,tín hiệu đo đưa vào ngõ P3.3
Giải:
 Theo yêu cầu 1,xung đếm đưa vào ngõ P3.4=T0→khai báo Timer0 điều khiển trong(GATE=0),
đếm sự kiện( / = 1), mode 2(M1M0=10) do số lần đếm max=FFH#256>200.
 Theo yêu cầu 2,xung đo đưa vào ngõ P3.3= 1→khai báo Timer1 điều khiển ngoài
(GATE=1),định thì( / = 0),mode 1(M1M0=01) do số xung đếm
max=65535>50000#50000µs
 Lệnh khai báo: MOV TMOD,#10010110B
Hay MOV TMOD,#96H
Giáo trình Vi Xử Lý Lưu Phú 21
5.7 Khởi động và truy xuất các thanh ghi Timer
5.7.2 Truy xuất các thanh ghi Timer
 Có thể đọc/ghi các thanh ghi Timer THx,TLx bất kỳ thời điểm nào
 Thông thường muốn Timer đếm từ giá trị đặt trước,phải nạp giá trị đặt trước vào THx
và TLx
- Mode 1 Timer 16 bit nạp giá trị đặt trước byte cao vào THx và byte thấp vào TLx
- Mode 2 Timer 8 bit tự động nạp lại ,nạp byte giá trị đặt trước vào THx
 Tính giá trị đặt trước để báo tràn
Khi các thanh ghi timer từ FFH→00H(8 bit) hoặc FFFFH→0000H,cờ báo tràn
TFx=1(phần cứng đặt)
 Giả sử muốn timer đếm N=1000 xung sẽ tràn,cách tính giá trị đặt trước như sau:
Chuyển N sang số HEX: 1000=03E8H
Giá trị đặt trước=0000H-03E8H=FC18H
Hay nói cách khác timer phải đếm lên từ giá trị -1000 đến 0
→Giá trị đặt trước bằng bù-2 số nhị phân N
Giáo trình Vi Xử Lý Lưu Phú 22
5.7 Khởi động và truy xuất các thanh ghi Timer
5.7.2 Truy xuất các thanh ghi Timer
Phân tích đoạn chương trình sau:
MOV TH0,#0FCH
MOV TL0,#18H
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0

-Hai dòng đầu nạp giá trị đặt trước cho Timer0 là FC18H để Timer0 đếm 1000 xung tương
ứng với thời gian 1000µs(Fosc=12Mhz) sẽ tràn
-Dòng thứ 4 chờ Timer0 tràn bằng cách kiểm tra cờ TF0=1 là báo tràn
-Dòng 5 dừng Timer0 lại để nạp lại giá trị đặt trước nếu cần,vì khi đó (TH0TL0)=0000H và
Timer0 sẽ đếm từ giá trị này(trường hợp 8 bit không cần dừng vì Timer tự động nạp lại!)
-Dòng 6 phải xóa cờ TF0 bằng mềm để nhận dạng lần báo tràn kế tiếp,vì phần cứng chỉ
đặt cờ TF0 chứ không xóa.
Giáo trình Vi Xử Lý Lưu Phú 23
5.7 Khởi động và truy xuất các thanh ghi Timer
5.7.2 Truy xuất các thanh ghi Timer
 Thay vì tính số bù-2 cho giá trị đặt trước để đếm tràn,assembler cho phép khai báo giá
trị thập phân âm biểu diễn 2 byte bằng toán tử HIGH(byte cao) và LOW(byte thấp),
ví dụ như sau:
MOV TH0,#HIGH(-1000)
MOV TL0,#LOW(-1000)
Khi biên dịch assembler sẽ gán (TH0)=FCH và (TL0)=18H
 Đọc Timer đang hoạt động
Trường hợp cần đọc timer đang hoạt động,cần lưu ý có khả năng sẽ bị sai khi nội
dung TLx tràn làm tăng THx một xung đếm,do tần số Timer CK bằng 1MC và lệnh đọc
tối thiểu 1MC.
Thực hiện các lệnh đọc timer như sau để đảm bảo chính xác:
AGAIN: MOV A,TH1 ;đọc byte cao timer
MOV R6,TL1 ;đọc byte thấp timer
CJNE A,TH1,AGAIN ;byte cao thay đổi,đọc lại
MOV R7,A ;lưu byte cao
Giáo trình Vi Xử Lý Lưu Phú 24
5.8 Định thì thời đoạn ngắn,trung bình ,dài
 Một xung Timer CK=1MC=1µs(Fosc=12Mhz)
 Thời gian thực hiện 1 lệnh min=1MC
 Định thì ngắn vài µs→tính chu kỳ máy các lệnh
 Định thì trung bình từ 10µs đến vài chục ms→Timer
 Định thì dài hơn 65.5ms→kết hợp Timer và vòng lặp bằng mềm
 Ưu điểm định thì dùng timer là phần cứng làm việc định thì,CPU không phải
thực hiện lệnh nên có thể làm việc khác(sẽ thấy rõ trong chương ngắt)
Bảng B5.5: Tóm tắt phương pháp định thì
Thời đoạn max(µs) Phương pháp
≈10 Các lệnh tính MC
256 Timer mode 2 8 bit
65536 Timer mode 1 16 bit
Không giới hạn Timer mode 1 và vòng lặp

Giáo trình Vi Xử Lý Lưu Phú 25


5.9 Các ví dụ ứng dụng timer
Trong các ví dụ ứng dụng sau ,cho Fosc=12Mhz,SV có thể mô phỏng trên Proteus
Ví dụ 5.8: Viết một chương trình tạo xung xuất ra P1.0 với tần số càng cao càng tốt.
Giải:
ORG 8100H
LOOP: SETB P1.0 ; 1MC
CLR P1.0 ; 1MC
SJMP LOOP ; 2MC
END
Do lệnh ngắn nhất là 1MC nên ta đặt/xóa P1.0 và lập lại chu kỳ bằng lệnh lặp vòng
SJMP LOOP

Hình vd5.8: Dạng sóng trên P1.0


Hình vd5.8 minh họa thời gian đáp ứng lệnh,chu kỳ T=4µs,độ rộng xung tp=1µs.
Giáo trình Vi Xử Lý Lưu Phú 26
5.9 Các ví dụ ứng dụng timer
Ví dụ 5.9: Viết một chương trình tạo chuỗi xung vuông đối xứng f=10Khz trên P1.0.
Giải:
Hình vd5.9: Dạng sóng trên P1.0 f=10Khz

Xung vuông đối xứng f=10Khz,thời gian mức 1=thời gian mức 0=50µs
Sử dụng Timer0 mode 2 giá trị đặt trước là -50→timer báo tràn sau 50 xung đếm=50µs
ORG 8100
MOV TMOD,#02H ; Timer0 mode 2 tự động nạp lại
MOV TH0,#-50 ;giá trị đặt trước
MOV TL0,TH0 ;đếm đúng từ vòng đầu
SETB TR0 ;chạy Timer0
LOOP: JNB TF0,LOOP ;chờ báo tràn
CLR TF0 ;xóa cờ báo tràn
CPL P1.0 ;đảo bit sau 50µs
SJMP LOOP ;lập vòng lại
END
Giáo trình Vi Xử Lý Lưu Phú 27
5.9 Các ví dụ ứng dụng timer
 Sử dụng Timer0 mode 2 tự động nạp lại nên không cần dừng timer để nạp lại giá
trị đặt trước
 Dòng lệnh LOOP: JNB TF0,LOOP tương đương như JNB TF0,$ lặp vòng tại chỗ
chờ báo tràn.Chỗ này CPU phải chờ TF0=1 nên chưa thấy rõ tác dụng của Timer.
Nhưng ở chương ngắt ta sẽ thấy không cần phải chờ như vậy,CPU có thể làm
công việc khác!
 Khi TF0=1 timer báo tràn,phải xóa cờ TF0 để nhận dạng lần báo tràn kế tiếp!
 Do phần cứng tự động nạp lại giá trị đặt trước,timer vẫn luôn chạy nên chu kỳ
xung ra rất chính xác!

Giáo trình Vi Xử Lý Lưu Phú 28


5.9 Các ví dụ ứng dụng timer
Ví dụ 5.10: Viết một chương trình tạo chuỗi xung vuông đối xứng f=1Khz trên P1.0.
Giải:
Xung vuông đối xứng f=1Khz,thời gian mức 1=thới gian mức 0=500µs
Sử dụng Timer0 mode 1 giá trị đặt trước là -500→timer báo tràn sau 500
xung đếm=500µs
ORG 8100
MOV TMOD,#01H ;Timer0 mode 1
LOOP: MOV TH0,#HIGH(-500) ;byte cao giá trị đặt trước
MOV TL0,#LOW(-500) ;byte thấp giá trị đặt trước
SETB TR0 ;chạy Timer0
WAIT: JNB TF0,WAIT ;chờ báo tràn
CLR TR0 ;dừng Timer0
CLR TF0 ;xóa cờ báo tràn
CPL P1.0 ;đảo bit sau 500µs
SJMP LOOP ;lặp vòng lại
END
Giáo trình Vi Xử Lý Lưu Phú 29
5.9 Các ví dụ ứng dụng timer
 Dòng 3 và 4 nạp giá trị đặt trước cho các thanh ghi Timer0 bằng toán tử
HIGH,LOW khỏi phải tính giá trị bù-2 của (-500)
 Ngay sau khi TF0=1 Timer0 tràn,phải dừng ngay Timer0 để chuẩn bị nạp lại giá
trị đặt trước
 Lệnh lặp vòng SJMP LOOP đưa chương trình quay về tiếp tục nạp lại giá trị đặt
trước và chạy timer lại
 Do phải dừng timer và mất thời gian nạp lại giá trị đặt trước nên sẽ phát sinh sai
số(sẽ bàn ở phần sau)

Giáo trình Vi Xử Lý Lưu Phú 30


5.9 Các ví dụ ứng dụng timer
Ví dụ 5.12: Viết một chương trình tạo chuỗi xung vuông đối xứng trên P1.0 f1=10Khz và trên P2.0 f2=1Khz.
Giải:
Chọn Timer0 chạy mode 2 giá trị nạp lại=-50,Timer1 mode 1 giá trị nạp lại=-500
ORG 8100
MOV TMOD,#12H ; Timer0 mode 2,Timer 1 mode 1
MOV TH0,#-50 ;giá trị nạp lại Timer0
MOV TL0,TH0 ;nạp ban đầu cho TL0
SETB TR0 ;chạy Timer0
LOOP: MOV TH1,#HIGH(-500) ;giá trị nạp lại Timer1 byte cao
MOV TL1,#LOW(-500) ;giá trị nạp lại Timer1 byte thấp
SETB TR1 ;chạy Timer1
WAIT: JNB TF0,NEXT ; Timer0 chưa tràn,nhảy đến NEXT
CLR TF0 ;Timer0 tràn,xóa cờ báo tràn
CPL P1.0 ;đảo bit P1.0
NEXT: JNB TF1,WAIT ;Timer1 chưa tràn,quay về WAIT
CLR TR1 ;dừng Timer1
CLR TF1 ;xóa cờ báo tràn Timer1
CPL P2.0 ;đảo bit P2.0
SJMP LOOP ;quay về nạp lại Timer1
END
Trong chương trình trên lần lượt xét 2 cờ báo tràn TF0 và TF1,ưu tiên Timer0 trước vì thời gian đếm ngắn hơn!
Giáo trình Vi Xử Lý Lưu Phú 31
5.9 Các ví dụ ứng dụng timer
Ví dụ 5.13: Hình vd5.13 gồm một mạch còi nối với P1.7 và mạch nút nhấn có chống rung nối với P1.6.
Viết một chương trình đọc trạng thái nút nhấn và kích còi kêu trong 1s khi phát hiện có chuyển trạng thái
từ 1 xuống 0 trên P1.6.Đặt P1.7 =1 kích còi kêu.
Giải:
Vấn đề chính là tạo thời gian delay 1s kích còi,
dùng Timer kết hợp lặp vòng đếm số lần timer tràn:
Giá trị đặt trước=10000,lặp vòng đếm=100
→thời gian delay=10000x100=1000000µs=1s.
HUNDRED EQU 100 ;số lần lặp vòng
Hình vd5.13
COUNT EQU -10000 ;thời gian đếm của Timer
ORG 8100
MOV TMOD ,#01H ;Timer0 mode 1
LOOP: JNB P1.6,LOOP ;chờ mức 1
WAIT: JB P1.6,WAIT ;chờ mức 0
SETB P1.7 ;kích còi
CALL DELAY ;chờ 1s
CLR P1.7 ;tắt còi
SJMP LOOP ;quay về kiểm tra nút nhấn

Giáo trình Vi Xử Lý Lưu Phú 32


5.9 Các ví dụ ứng dụng timer
;-----------------------------------------------------------------
;DELAY tạo thời gian trễ 1s bằng cách cho Timer0
;đếm COUNT xung và lặp vòng HUNDRED lần
;--------------------------------------------------------------
DELAY: MOV R7,#HUNDRED ;R7 chứa số lần lặp vòng
AGAIN: MOV TH0,#HIGH(COUNT) ; byte cao giá trị đặt trước
MOV TL0,#LOW(COUNT) ;byte thấp giá trị đặt trước
SETB TR0 ;chạy Timer0
WAIT2: JNB TF0,WAIT2 ;chờ Timer0 tràn
CLR TR0 ;dừng Timer0
CLR TF0 ;xóa cờ báo tràn Timer0
DJNZ R7,AGAIN ;lặp vòng chạy Timer0
RET
END

Giáo trình Vi Xử Lý Lưu Phú 33


5.9 Các ví dụ ứng dụng timer
Ví dụ 5.14: Thiết kế một mạch đếm sản phẩm như hình vd5.14:
 Cảm biến đếm xuất 1 xung khi có 1 sản phẩm đi qua,
tốc độ max của sản phẩm 0,3s/sp
 Mạch làm việc 2 mode tùy theo mức logic của phím
nhấn SW:
- SW=0: mạch đếm lên tự do từ 0 trong 60s
- SW=1: mạch đếm có đặt trước,giá trị đặt trước là số
nhị phân nhập từ P2(data in)
 Liên tục xuất giá trị mạch đếm từ 0 đến giá trị sau 60s
với mode đếm tự do,hoặc từ 0 đến giá trị đặt trước với
mode đếm có đặt trước ra P1(data out) Hình vd5.14
 Kết thúc mode đếm xuất mức 1 ra ngõ Alarm và quay về làm lại từ đầu
Giải:
 Xung đếm từ cảm biến đưa vào ngõ T0=P3.4 →sử dụng Timer0 mode đếm sự kiện(Timer CK ngoài)
 Mode đếm tự do số sản phẩm max=60s/0.3s=200,mode đếm đặt trước data in=8 bit→số đếm
max=255→Chọn Timer0 mode 2
 Tạo thời gian delay 60s trong mode đếm tự do→kết hợp Timer1 mode 1 và các vòng lặp:
Cho Timer1 đếm 60000 xung(Fosc=12Mhz),phải lặp số vòng=60s/60ms=1000 lần

Giáo trình Vi Xử Lý Lưu Phú 34


5.9 Các ví dụ ứng dụng timer CLR C ;xóa cờ C để trừ
DAT_IN EQU P2 SUBB A,B ;trả về số đếm thực
DAT_OUTEQU P1 MOV DAT_OUT,A ;xuất số đếm
COUNT EQU -60000 JNB TF0,WAIT1 ;chờ Timer0 tràn
CLR TF0 ;xóa cờ báo tràn
SW BIT P3.0 SETB ALARM ;set cờ báo kết thúc
ALARM BIT P3.1 JMP START
ORG 0
MOV TMOD,#16H ;Timer1 mode 1CK trong,Timer0 mode2 CK ngoài
START: CLR ALARM ;xóa Alarm
MOV TL0,#0 ;xóa bộ đếm
JNB SW,CT_FREE ;SW=0 nhảy đến mode đếm tự do
MOV A,DAT_IN ;mode đếm đặt trước,nhập giá trị đặt trước
MOV R0,A ;cất giá trị đặt vào R0
CPL A ;bù-2 số đặt trước
ADD A,#1 ;
MOV TL0,A ;nạp số đặt trước vào TL0
SETB TR0 ;bắt đầu đếm
WAIT1: JNB TF0,DISPLAY1 ; chưa tràn nhảy đến xuất giá trị đếm
CLR TR0 ;dừng bộ đếm
DISPLAY1: MOV B,TL0 ;nạp số đếm vào B
MOV A,R0 ;phục hồi giá trị đặt trước
Giáo trình Vi Xử Lý Lưu Phú 35
5.9 Các ví dụ ứng dụng timer
CT_FREE: SETB TR0 ;bắt đầu đếm
MOV R7,#5 ;hệ số nhân
AGAIN: MOV R6,#200 ;số lần lặp vòng
NEXT: MOV TH1,#HIGH(COUNT);Timer1 đếm 60ms
MOV TL1,#LOW(COUNT) ;
SETB TR1 ;chạy Timer1
WAIT0: JNB TF1,DISPLAY0 ;chờ báo tràn
CLR TR1 ;dừng Timer1
DISPLAY0: MOV A,TL0 ;nạp số đếm vào A
MOV DAT_OUT,A ;xuất số đếm
JNB TF1,WAIT0 ;chờ báo tràn Timer1
CLR TF1 ;xóa cờ báo trán
DJNZ R6,NEXT ;lặp vòng 200 lần
DJNZ R7,AGAIN ;lặp vòng 5x200=1000 lần
CLR TR0 ;dừng đếm
SETB ALARM ;set cờ báo kết thúc
JMP START
END
Giáo trình Vi Xử Lý Lưu Phú 36
5.10 Tính chính xác thời gian định thì
 Khảo sát lại ví dụ 5.10,ta tính sai số thời gian khi dừng để nạp lại timer:
ORG 8100
MOV TMOD,#01H ;Timer0 mode 1
LOOP: MOV TH0,#HIGH(-500) ;2MC
MOV TL0,#LOW(-500) ;2MC
SETB TR0 ;1MC
WAIT: JNB TF0,WAIT ;2MC
CLR TR0 ;1MC
CLR TF0 ;1MC
CPL P1.0 ;1MC
SJMP LOOP ;2MC
END
 Sau mỗi lần dừng Timer0 phải mất 12MC để nạp lại giá trị đặt trước và chạy Timer trở lại.
Để độ rộng xung chính xác 500µs ta phải trừ bớt 12µs,như vậy phải khởi nạp:
MOV TH0,#HIGH(-488) ;
MOV TL0,#LOW(-488) ;
Giáo trình Vi Xử Lý Lưu Phú 37
5.10 Tính chính xác thời gian định thì
Ví dụ 5.15: Viết chương trình tạo chuỗi xung vuông đối xứng f=600Hz chính xác trên P1.0,
cho Fosc=12Khz.
Giải:
 Thời đoạn xung=T/2=1/(2x600)=833.33µs
 Giá trị đếm=833 xung→f=600.24Hz#sai số= |600-600.24|/600=0.04%,
 Chọn giá trị đặt trước =833-12=821→Tổng cộng thời đoạn đếm của Timer là 833µs.
ORG 8100
MOV TMOD,#01H ;Timer0 mode 1
LOOP: MOV TH0,#HIGH(-821) ;2MC
MOV TL0,#LOW(-821) ;2MC
SETB TR0 ;1MC
WAIT: JNB TF0,WAIT ;2MC
CLR TR0 ;1MC
CLR TF0 ;1MC
CPL P1.0 ;1MC
SJMP LOOP ;2MC
END

Giáo trình Vi Xử Lý Lưu Phú 38


5.11 Timer 2 của MCU8052 Bảng B5.6: Tóm tắt SFR T2CON
Bit Ký hiệu Địa chỉ bit Mô tả
 MCU8052 có thêm timer thứ 3 là Timer2 T2CON.7 TF2 CFH Cờ báo tràn Timer2(không đặt=1 khi TCLK=1
 5 SFR quản lý hoạt động của Timer2 hoặc RCLK=1)
T2CON.6 EXF2 CEH Cờ báo đk ngoài Timer2.Đặt=1 khi bắt/nạp
- T2CON(C8H) :truy xuất bit được,điều khiển lại(capture/reload) xảy ra do chuyển biến từ
Timer2 1→0 trên ngõ T2EX và EXEN2=1;khi ngắt
Timer2 được phép,EXF2=1 làm CPU chuyển
- RCAP2L(CAH):bắt(capture) byte thấp Timer2 đến trình phục vụ ngắt Timer2;xóa bằng
mềm
- RCAP2H(CBH): bắt byte cao Timer2
T2CON.5 RCLK CDH Xung CK thu Timer2.Khi đặt=1 Timer2 tạo
- TL2(CCH): byte thấp Timer2 baurate thu cổng nối tiếp,Timer1 tạo baurate
phát cổng nối tiếp
- TH2(CDH): byte cao Timer2 T2CON.4 TCLK CCH Xung CK phát Timer2.Khi đặt=1 Timer2 tạo
 Timer2 luôn làm việc ở mode 16 bit baurate phát cổng nối tiếp,Timer1 tạo
baurate thu cổng nối tiếp
 Điều khiển(đk) ngoài Timer2 có 2 ngõ: T2CON.3 EXEN2 CBH Cho phép đk ngoài.Khi đặt=1 bắt/nạp lại xảy
ra khi có chuyển biến từ 1→0 trên ngõ T2EX
- T2=P1.0: xung Timer CK ngoài cho mode đếm
T2CON.2 TR2 CAH Đk chạy/dừng Timer2,đặt/xóa bằng mềm
sự kiện (C/T =1) T2CON.1 C/T C9H Chọn đếm sự kiện/định thì Timer2:
1=đếm sự kiện,0=định thì
- T2EX=P1.1: ngõ ngoài điều khiển bắt/nạp lại T2CON.0 CP/RL2C C8H Cờ chọn bắt/nạp lại Timer2.Khi đặt=1 bắt xảy
(capture/reload) Timer2 với điều kiện bit EXEN2=1 ra khi T2EX=1→0 và EXEN2=1;khi xóa=0 nạp
lại xảy ra khi T2EX=1→0 và EXEN2=1,hoặc tự
động nạp lại khi Timer2 tràn;nếu RCLK=1
hoặc TCLK=1 bit này không tác dụng
Giáo trình Vi Xử Lý Lưu Phú 39
5.11 Timer 2 của MCU8052
5.11.1 Mode tự động nạp lại(auto-reload)
 Chọn CP/RL2C=0 →Timer2 chạy
mode tự động nạp lại
 TH2 và TL2 là bộ timer 16 bit,
RCAP2H và RCAP2L chứa giá trị
đặt trước(nạp lại)
 Tự động nạp lại có 2 kiểu tùy thuộc
bit EXEN2
 EXEN2=0: tự động nạp lại khi
Timer2 tràn TH2TL2=FFFFH→0000H,
đồng thời cờ báo tràn TF2=1,tương tự Hình 5.6: Timer2 mode tự động nạp lại
như Time0 và Timer1,xóa TF2 bằng mềm
để nhận dạng lần báo tràn kế tiếp
 EXEN2=1: tự động nạp lại khi ngõ T2EX=P1.1=1→0,đồng thời cờ báo điều khiển ngoài
EXF2=1, xóa EXF2 bằng mềm để nhận dạng điều khiển nạp lại lần kế tiếp. 40
Giáo trình Vi Xử Lý Lưu Phú
5.11 Timer 2 của MCU8052
5.11.2 Mode bắt(capture)
 Chọn CP/RL2C = 1→Timer2 chạy mode bắt
 Timer2 là bộ timer 16 bit và khi tràn TF2=1
 Đặt EXEN2=1,khi ngõ T2EX=P1.1=1→0:
bắt giá trị đếm của Timer2,nạp nội dung TH2 và
TL2 lần lượt vào RCA2H và RCAP2L,cờ EXF2=1.
 Mode này tương tự như đọc timer đang hoạt
động như đã mô tả ở mục 5.7.2 nhưng chính xác
hơn và sử dụng tín hiệu điều khiển truy xuất ngoài
tại bất kỳ thời điểm nào của chương trình!
Hình 5.7: Timer2 mode bắt

Giáo trình Vi Xử Lý Lưu Phú 41


5.11 Timer 2 của MCU8052
Ví dụ 5.16: Viết chương trình đo độ rộng xung từ 100µs đến 10ms sử dụng Timer2.
Giải:
 Trong ví dụ 5.6 tá có chương trình đo độ rộng xung sử dụng Timer0 điều khiển ngoài qua bit GATE
và ngõ 0.
 Timer2 không có điều khiển ngoài qua bit GATE như Timer0 và Timer1,nhưng ta có thể sử dụng
mode bắt để thiết kế,bằng cách cho tín hiệu xung cần đo vào ngõ T2EX=P1.1:
- Nhận dạng cạnh lên xung bằng mềm→chạy Timer2
- Cạnh xuống xung →bắt giá trị đếm Timer2 chính là giá trị đo độ rộng xung.
CP_R BIT 0C8H
START: MOV TL2,#0 ;xóa bộ đếm
TR2 BIT 0CAH MOV TH2,#0
EXEN2 BIT 0CBH JB T2EX,$ ;chờ cạnh lên xung
EXF2 BIT 0CEH JNB T2EX,$
T2EX BIT P1.1 SETB TR2 ;chạy Timer2
RCAP2L EQU 0CAH SETB EXEN2 ;cho phép đk ngoài qua T2EX
JNB EXF2,$ ;chờ bắt hay cạnh xuống xung
RCAP2H EQU 0CBH CLR TR2 ;dừng Timer2
TL2 EQU 0CCH CLR EXF2 ;xóa cờ báo bắt
TH2 EQU 0CDH MOV A,RCAP2L ;lưu giá trị đo
ORG 0 MOV B,RCAP2H
SETB CP_RL ;mode capture SJMP START
END
CLR EXEN2 ;cấm đk ngoài qua T2EX
Giáo trình Vi Xử Lý Lưu Phú 42
5.12 Tạo baudrate
 Sử dụng Timer1 và/hoặc Timer2 làm nguồn tạo baurate cho hoạt động
cổng nối tiếp
 Phần này sẽ trình bày trong chương cổng nối tiếp

Giáo trình Vi Xử Lý Lưu Phú 43

You might also like