Professional Documents
Culture Documents
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
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 .
Code ASM
Org 00h;
MAIN:
Delay:
// code C
#include
Void delay()
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:
Loop:
Djnz R4,loop
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.