You are on page 1of 4

Hoàng Duy Nam

Msv 171601290

Timer ở chế độ 1 và 2 thường được sử dụng nhiều trong các ứng dụng có timer. Để cài đặt timer
hoạt động ở chế độ nào thì ta cần quan tâm đến thanh ghi TMOD

Tmod

Ví dụ sử dụng timer 1, chế độ 1 ( 16 bit ) thì ta có lệnh :

Mov TMOD,#00010000b ( ASM code) hoặc TMOD = 0x10 ( C code ).

Sau khi cài đặt chế độ định thời cho timer ta tiến hành nạp các giá trị định thời cho các thanh ghi
TH0, TL0 ( timer 0), TH1,TL1 ( timer 1).

Nếu sử dụng thạnh anh ngoài có tần số là 12MHz thì tương ứng với 1 chu kì máy= 1 mirco second
(uS). Đối với thạch anh 11.0592MHz thì 1 chu kì máy = 1.0850 microsecond (uS).

 Vídụ cụ thể: muốn tạo khoảng thời gian trễ là 50 milisecond (mS) dùng timer 1, ta cần xác
định được bao nhiêu chu kì máy để tạo ra 1 milisecond. Ta có 1 mS = 1000 uS, do đó số cần
phải nạp vào thanh ghi TH1 và TL1 sẽ là:

Đối với thạch anh 12Mhz : 50000/ 1 = 50000 chu kì máy, lấy 65535-50000=15535 = 3cAF hexa

Đối với thạch anh 11.0592Mhz : 50000/1.0850 ~= 46583 chu kì máy, lấy 65535-46583= 18952 =
4A08 hexa

Do số chu kì máy lớn hơn 8bit ( tối đa 255 ) nên ta chọn timer 1 hoạt động ở chế độ 1 ( 16bit- tối đa
65535 ).TH1 và TL1 là hai thanh ghi ghép 16 bit ( TH – byte cao, TL-byte thấp). Nên ta cần nạp vào
TH1 =3Ch, TL0=0AFh.
Sau khi xác định được giá trị cần nạp cho 2 thanh ghi dữ liệu, ta sẽ cho timer bắt đầu chạy bằng cách
đưa bit TR1 lên mức 1, và cần liên tục kiểm tra cờ tràn TF1, khi timer tràn TF1 sẽ được tự động đưa
lên 1. Sau đó cần phải xoá cờ tràn (chế độ 2 không cần xoá cờ tràn) nếu muốn tiếp tục .

Chương trình tạo hiệu ứng nhấp nháy LED

Code ASM

Org 00h;

MAIN:

Setb P2.0 ; tat LED

Call delay ; đợi 50ms

Clr P2.0 ; bật LED

Call delay ; đợi 50ms

Sjmp MAIN ; lập lại

; chương trình con delay

Delay:

Mov TMOD,#10h ; timer 1, mode 1 (16 bit )

Mov TH1,#3Ch ; or mov TH1,#high(-50000),thời gian delay 50ms

Mov TL1,#0AFh ; or mov TL1,#low(-50000),

Setb TR1 ; cho phép timer chạy

Jnb TF1,$ ; nhảy tại chỗ, không làm gì

Clr TR1 ; nếu timer tràn thì dừng timer

Clr TF1 ; xoá cờ tràn

Ret ; kết thúc chương trình con delay

End ; kết thúc chương trình chính

// code C

#include

Void delay()

TMOD= 0x10; // timer 1, mode 1


TH1=0x3C;

TL1=0xAF;

TR1=1;

While(!TF1){}

TR1=0;

TF1=0;

Void main()

While(1)

P2_0=1;

Delay();

P2^0=0;

Delay();

}
Thời gian tối đa mà timer có thể định thời được là 65535 chu kì máy nên nếu muốn tạo những
khoảng thời gian lâu hơn thì cần dùng thêm vòng lặp. Ví dụ : muốn delay 1s thì ta chỉ cần cho timer
chạy 50ms, và lặp lại 20 lần.

Delay:

Mov R4,#20 ; số lần lặp

Loop:

Mov TMOD,#10h ; timer 1, mode 1 (16 bit )

Mov TH1,#3Ch ; or mov TH1,#high(-50000),thời gian delay 50ms

Mov TL1,#0AFh ; or mov TL1,#low(-50000),

Setb TR1 ; cho phép timer chạy

Jnb TF1,$ ; nhảy tại chỗ, không làm gì

Clr TR1 ; nếu timer tràn thì dừng timer

Clr TF1 ; xoá cờ tràn

Djnz R4,loop

Ret ; kết thúc chương trình con delay

End

Khoảng thời gian delay trên chỉ là tương đối, vì trong đó còn khoảng thời gian thực thi một số lệnh
khác (vd : mov R4,#20, djnz R4,loop,…) nên để đạt được thời gian chính xác ta cần tính luôn thời gian
của các lệnh này rồi mới chọn thông số định thời sao cho đúng giá trị mong muốn. Thực tế, để tạo
delay ta chỉ cần dùng các vòng lặp lồng vào nhau, nhằm tiết kiệm timer cho những mục đích khác.

You might also like