Tải bản đầy đủ (.pdf) (6 trang)

bài giảng về vi điều khiển 8051

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (350.64 KB, 6 trang )



NỘI DUNG BÀI GIẢNG

CHƯƠNG 1: BỘ VI ĐIỀU KHIỂN 80C51/89C51

Bài 1.6: Khối tạo thời gian và bộ đếm Timer/Counter

1.6.1. Tổng quan về Timer/Counter
+ Chức năng chính của bộ Timer/Counter, đúng như tên gọi, là định thời
(tạo thời gian, đo thời gian), và đếm sự kiện bên ngoài.
+ 8051 có 2 bộ Timer/Counter là T0 và T1, đều là 2 bộ Timer 16 bit. Chúng
có thể hoạt động với tần số bên trong (lấy từ thạch anh), cũng có thể hoạt động với
tần số bên ngoài, đưa vào đầu vào của bộ Timer.
+ Chức năng Counter có thể dùng để đếm sản phẩm, hay đo độ rộng xung.
Ví dụ: đếm số xe ra, vào bãi gửi xe.

1.6.2. Giới thiệu các thanh ghi của bộ Timer

a) Thanh ghi vận hành TH0, TL0, TH1, TL1
Đây chính là các thanh ghi chứa giá trị vận hành của bộ Timer. Dùng kết hợp
2 thanh ghi 8 bit giống như là 1 thanh ghi 16 bit với 2 byte: byte thấp và byte cao.
Thanh ghi byte thấp của bộ Timer 0 được gọi là TL0 (Timer 0 bow byte), thanh ghi
byte cao được gọi là TH0 (Timer 0 high byte), và tương tự đối với Timer 1.


H6. 1 Thanh ghi vận hành của bộ Timer 0

H6. 2 Thanh ghi vận hành của bộ Timer 1



Cứ mỗi lần xuất hiện 1 tín hiệu “kích”, thì giá trị của thanh ghi vận hành
(thanh ghi 16 bit) sẽ được tăng lên 1 đơn vị. Giá trị MAX mà thanh ghi này có thể
đạt được thì tùy vào chế độ vận hành của bộ Timer. Sau khi đạt giá trị MAX thì
thanh ghi sẽ tự động được reset về 0.
Các thanh ghi này đều có thể đọc hoặc ghi tại bất kì thời điểm nào.
b) Thanh ghi TMOD
Đây là thanh ghi thiết lập các chế độ hoạt động của 2 bộ Timer. Thanh ghi
TMOD là thanh ghi 8 bit, trong đó 4 bit thấp dùng để thiết lập cho Timer 0, và 4 bit
cao dành cho Timer 1

H6. 3 Thanh ghi TMOD
+ 2 bit M1, M0:
Đây là các bit cài đặt chế độ hoạt động cho các bộ Timer, như bảng dưới
đây:
M1

M0

Chế độ Ý nghĩa
0 0 0 Bộ định thời 13 bit
0 1 1 Bộ định thời 16 bit
1 0 2 Bộ định thời 8 bit tự nạp lại
1 1 3 Chế độ bộ định thời chia tách

+ Bit C/T
Bit này quyết định xem bộ định thời được dùng như 1 máy tạo độ trễ hay là
bộ đếm sự kiện.
Nếu bit C/T=0 thì bộ định thời được dùng như bộ tạo độ trễ thời gian. Khi đó
nguồn xung clock cấp cho bộ Timer hoạt động sẽ bằng 1/12 tần số của thạch anh
trên mạch.

Nếu bit C/T=1 thì bộ định thời được dùng như 1 bộ đếm sự kiện bên ngoài.
Khi đó nó sẽ dùng nguồn clock ngoài để vận hành.
+ Bit GATE
Một bộ Timer không thể tự động hoạt động hay dừng, mà ta phải thực hiện
một lệnh. Một số bộ định thời thực hiện điều này bằng phần cứng, một số thì thực
hiện bằng phần mềm, một số thì có thể thực hiện bằng cả 2 cách. Các bộ định thời


trên 8051 có thể thực hiện bằng cả 2 cách này. Bit GATE dùng để quyết định việc
khởi động hay dừng bộ Timer bằng phần cứng hay phần mềm.
Nếu bit GATE=0 tức là ta cần khởi động hoặc dừng bộ Timer bằng phần
mềm. Việc này được điều khiển bởi bit TR trong thanh ghi TCON.
Nếu bit GATE=1 tức là ta cần khởi động hoặc dừng bộ Timer bằng phần
cứng. Khi đó chân P2.3 điều khiển cho Timer 0 và P3.3 điều khiển cho Timer 1.
Khi đưa chân tương ứng lên 1 (sử dụng công tắc chuyển mạch) thì bộ Timer tương
ứng sẽ được chạy, và đưa xuống 0 thì Timer sẽ dừng.

c) Thanh ghi TCON
Đây là thanh ghi điều khiển hoạt động của Timer/Counter

H6. 4 Thanh ghi TCON

4 bit thấp để phục vụ cho ngắt ngoài, chúng ta không cần quan tâm ở đây.
Bit TR0: đây là bit dùng để điều khiển việc chạy/dừng của Timer 0 (1 là
chạy, 0 là dừng).
Bit TF0: đây là bit cờ báo hiệu tràn Timer 0. Khi có hiện tượng tràn xảy ra
thì bit này sẽ tự động được lên 1.
Bit TR1 và TF1: 2 bit dùng cho Timer 1, hoạt động tương tự như TR0, TF0.

1.6.3. Các chế độ hoạt động của Timer/Counter.


a) Mode 1
Để Timer/Counter hoạt động ở mode 1 thì ta cần đặt các bit M1=0; M0=1.
Mỗi lần có tín hiệu clock thì giá trị của thanh ghi vận hành T (gồm 2 thanh
ghi TH và TL) sẽ được tăng lên 1 đơn vị, và có thể tăng đến mức TOP là FFFFH
(giá trị thập phân là 65535). Khi đó, ở nhịp xung tiếp theo thì bộ Timer bị tràn và
quay trở về 0000, đồng thời cờ TF0 được bật lên.



H6. 5 Sơ đồ hoạt động của Mode 1

Cờ TF cho ta biết thời điểm mà Timer bị tràn. Ta có thể lập trình để đếm thời
gian, cách tính toán như sau:
Clock cấp cho Timer hoạt động bằng 1/12 tần số thạch anh, nếu ta dùng
thạch anh 12MHz thì tần số của Timer sẽ là 1MHz, tức là cần 1us để thanh ghi vận
hành TH0, TL0 tăng lên 1 đơn vị. Nếu thanh ghi vận hành xuất phát từ 0000 thì sẽ
cần 65536 xung nhịp để tràn, như vậy thời gian cho 1 lần tràn sẽ là 65536us.
Ta có thể tính toán để cho thời gian này đẹp hơn bằng cách không cho bộ
Timer vận hành từ 0000 nữa, mà là 1 giá trị nằm giữa 0000 và FFFF. Giả sử ta
chọn là 5536 thì thời gian cho 1 lần tràn sẽ là 65535-5536+1=60000(us)=60(ms).
Tuy nhiên sau khi tràn thì thanh ghi vận hành TH0 và TL0 lại tự reset về 0. Do đó
để chu kì tiếp theo vận hành tiếp từ giá trị 5536 thì ta phải gán giá trị cho TH0 và
TL0 bằng phần mềm ngay khi bộ Timer bị tràn. 5536 tính theo hệ hexa sẽ là
15A0H, do đó ta sẽ phải gán TH0=15H và TL0=A0H.
Như vậy: thời gian lớn nhất có thể có được khi Timer tràn là 65536us. Tuy
nhiên cũng có lúc ta cần khoảng thời gian lớn hơn như thế. Thế thì cần phải dùng 1
biến đếm đếm số lần tràn, và dựa vào biến đấy để tính toán ra thời gian.
Ví dụ: ta cần đo khoảng thời gian là 1s. Ta chọn giá trị khởi tạo cho thanh
ghi vận hành từ 3CB0H (15536). Thời gian cho 1 lần tràn sẽ là 65535-

15536+1=50000(us)=50(ms). Mỗi lần tràn ta cho 1 biến dem tăng lên 1 đơn vị. Vậy


để có được thời gian 1(s) thì ta cần 1000/50=20 lần tràn, tức khi biến dem mang giá
trị là 20 thì ta sẽ có được khoảng thời gian là 1(s).

Các bước lập trình ở chế độ Mode 1 để tạo thời gian trễ:
1. Cài đặt giá trị cho thanh ghi TMOD: bộ Timer nào (Timer 0 hay Timer 1)
được sử dụng và Mode nào được sử dụng.
2. Nạp giá trị vận hành ban đầu cho các thanh ghi TH và TL.
3. Khởi động bộ Timer bằng cách SET bit TR trong thanh ghi TCON
4. Xét xem khi nào thì cờ TF được bật lên, thoát vòng lặp.
5. Dừng bộ định thời bằng cách xóa bit TR.
6. Xóa cờ TF chuẩn bị cho vòng kế tiếp.
7. Quay trở lại bước 2 để nạp lại giá trị cho TH, TL.

b) Mode 0
Để Timer/Counter hoạt động ở mode 1 thì ta cần đặt các bit M1=0; M0=0.
Về cách thức hoạt động thì Mode 0 giống hệt Mode 1, chỉ khác là bộ Timer
16 bit được thay thế băng bộ Timer 13 bit, tức giá trị lớn nhất TOP=1FFFH

c) Mode 2
Ở mode này thì Timer chỉ hoạt động với 8 bit, tức là giá trị lớn nhất mà thanh
ghi vận hành có thể đạt được là FFH.
Đối với Mode 0 và Mode 1 thì mỗi lần Timer bị tràn ta lại phải nạp lại giá trị
cho 2 thanh ghi TH, TL. Nhưng ở Mode này thì việc này được tiến hành tự động.
Đầu tiên, ta nạp 1 giá trị ban đầu cho thanh ghi TH. Sau đó khi ta khởi động
cho Timer chạy thì thanh ghi TL sẽ lấy giá trị của TH làm giá trị ban đầu. Khi bộ
Timer bị tràn thì cờ TF được bật lên, đồng thời thanh ghi TL sẽ lấy giá trị của TH
(không thay đổi) làm giá trị khởi đầu cho quá trình đếm tiếp theo.

Như vậy thì việc nạp lại giá trị khởi tạo cho bộ Timer được tiến hành 1 cách
tự động mà không cần can thiệp của người lập trình.
Cách tính toán thời gian thì cũng giống như ở Mode 1, khi tính toán thì chú ý
mức TOP bây giờ là FFH chứ không phải là FFFFH.

d) Mode 3
Mode 3 được gọi là chế độ Timer chia tách. Ở Mode này thì Timer 1 không
hoạt động, còn Timer 0 được tách ra làm 2 Timer 8 bit. Khi đó TL0 và TH0 hoạt
động độc lập nhau, với các cờ báo tràn TF0 dành cho TL0, và TF1 dành cho TH0.


Khi cho Timer 0 chạy ở Mode 3 thì vẫn có thể cho Timer 1 chạy ở Mode
khác (0,1,2), giống như là ta có 3 Timer đồng thời vậy. Tuy nhiên cờ báo tràn của
Timer 1 khi đó (TF1) sẽ không bị ảnh hưởng bởi việc tràn của Timer 1 nữa, vì khi
đó nó được dùng làm cờ báo tràn cho TH0. Bộ Timer 1 khi đó có thể được sử dụng
bởi PORT nối tiếp (làm nhiệm vụ của bộ tạo xung baud), hoặc được sử dụng theo
cách mà không yêu cầu ngắt.

1.6.4. Chế độ Counter (bộ đếm)
Khi ta thiết lập bit C/T trong thanh ghi TMOD=1 thì bộ định thời dùng
nguồn clock ngoài để hoạt động. Tức là thanh ghi vận hành TH và TL sẽ không
tăng 1 cách tự động sau 1 khoảng thời gian nữa mà khi có xung tác động vào đầu
vào của bộ Timer thì thanh ghi này mới tăng. Do đó bộ Timer với cách thức vận
hành như thế này được gọi là bộ đếm sự kiện.
Chân đầu vào của Timer 0 có tên là T0, và của Timer 1 có tên là T1.

Các chế độ hoạt động của bộ đếm cũng giống hệt như trên, tuy nhiên ta
không dùng chế độ này để đếm thời gian được, mà dựa vào giá trị của 2 thanh ghi
TH, TL để đếm sự kiện. Cứ mỗi sự kiện xảy ra sẽ được chuyển hóa thành 1 xung,
giá trị của thanh ghi TL sẽ được tăng lên 1, và dựa vào giá trị của 2 thanh ghi TH,

TL để đếm số sự kiện xảy ra.

×