Giáo trình Vi điều khiển 8051 Assembly - Chương 9: Lập trình cho bộ đếm/bộ định thời trong 8051

Thanh ghi 16 bít của bộ Timer 0 được truy cập như byte thấp và byte cao. Thanh

ghi byte thấp được gọi là TL0 (Timer 0 bow byte) và thanh ghi byte cao là TH0 (Timer 0

High byte). Các thanh ghi này có thể được truy cập như mọi thanh ghi khác chẳng hạn

như A, B, R0, R1, R2 v.v. Ví dụ, lệnh “MOV TL0, #4FH” là chuyển giá trị 4FH vào

TL0, byte thấp của bộ định thời 0. Các thanh ghi này cũng có thể được đọc như các thanh

ghi khác. Ví dụ “MOV R5, TH0” là lưu byte cao TH0 của Timer 0 vào R5.

pdf18 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: dkS00TYs | Lượt xem: 7301 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình Vi điều khiển 8051 Assembly - Chương 9: Lập trình cho bộ đếm/bộ định thời trong 8051, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
TR0 ; Dừng Timer0 
 CLR TF0 ; Xoá cờ TF cho vòng sau. 
 RET 
Lời giải: 
 Để tìm giá trị cho TH ở chế độ 2 thì trình hợp ngữ cần thực hiện chuyển đổi số âm 
khi ta nhập vào. Điều này cũng làm cho việc tính toán trở nê dễ dàng. Vì ta đang sử dụng 
150 xung đồng hồ, nên ta có thời gian trễ cho chương trình con DELAY là 150 ´ 
1.085ms và tần số là .kHz048,2
T
1f == 
 Để ý rằng trong nhiều tính toán thời gian trễ ta đã bỏ các xung đồng hồ liên quan 
đến tổng phí các lệnh trong vòng lặp. Để tính toán chính xác hơn thời gian trễ và cả tần 
số ta đang cần phải đưa chúng vào. Nếu ta dùng một máy hiện sóng số và ta không nhận 
được tần số đúng như ta tính toán thì đó là do tổng phí liên quan đến các lệnh gọi trong 
vòng lặp. 
 Trong phần này ta đã dùng bộ định thời 8051 để tạo thời gian trễ. Tuy nhiên, công 
dụng mạnh hơn và sáng tạo hơn của các bộ định thời này là sử dụng chúng như các bộ 
đếm sự kiện. Chúng ta sẽ bàn về công dụng của bộ đếm này ở phần kế tiếp. 
9.2 Lập trình cho bộ đếm. 
 ở phần trên đây ta đã sử dụng các bộ định thời của 8051 để tạo ra các độ trễ thời 
gian. Các bộ định thời này cũng có thể được dùng như các bộ đếm các sự kiện xảy ra bên 
ngoài 8051. Công dụng của bộ đếm/ bộ định thời như bộ đếm sự kiện sẽ được tình bày ở 
phần này. Chừng nào còn liên quan đến công dụng củ bộ định thời như bộ đếm sự kiện 
thì mọi vấn đề mà ta nói về lập trình bộ định thời ở phần trước cũng được áp dụng cho 
việc lập trình như là một bộ đếm ngoại trừ nguồn tần số. Đối với bộ định thời/ bộ đếm 
khi dùng nó như bộ định thời thì nguồn tần số là tần số thạch anh của 8051. Tuy nhiên, 
khi nó được dùng như một bộ đếm thì nguồn xung để tăng nội dung các thanh ghi TH và 
TL là từ bên ngoài 8051. ở chế độ bộ đếm, hãy lưu ý rằng các thanh ghi TMOD và TH, 
TL cũng giống như đối với bộ định thời được bàn ở phần trước, thậm chí chúng vẫn có 
cùng tên gọi. Các chế độ của các bộ định thời cũng giống nhau. 
9.2.1 Bít C/T trong thanh ghi TMOD. 
 Xem lại phần trên đây về bít C/T trong thanh ghi TMOD ta thấy rằng nó quyết 
định nguồn xung đồng hồ cho bộ định thời. Nếu bít C/T = 0 thì bộ định thời nhận các 
xung đồng hồ từ bộ giao động thạch anh của 8051. Ngược lại, khi C/T = 1 thì bộ định 
thời được sử dụng như bộ đếm và nhận các xung đồng hồ từ nguồn bên ngoài của 8051. 
Do vậy, khi bít C/T = 1 thì bộ đếm lên, khi các xung được đưa đến chân 14 và 15. Các 
chân này có tên là T0 (đầu vào của bộ định thời Timer0) và T1 (đầu vào của bộ Timer1). 
Lưu ý rằng hai chân này thuộc về cổng P3. Trong trường hợp của bộ Timer0 khi C/T = 1 
thì chân P3.4 cấp xung đồng hồ và bộ đếm tăng lên đối với mỗi xung đồng hồ đi đến từ 
chân này. Tương tự như vậy đói với bộ Timer1 thì khi C/T = 1 với mỗi xung đồng hồ đi 
đến từ P3.5 bộ đếm sẽ đếm tăng lên 1. 
 Bảng 9.1: Các chân cổng P3 được dùng cho Timer0 và Timer1. 
Chân Chân cổng Chức năng Mô tả 
14 P3.4 T0 Đầu vào ngoài của bộ đếm 0 
15 P3.5 T1 Đầu vào ngoài của bộ đếm 1 
Ví dụ 9.18: 
 giả sử rằng xung đồng hồ được cấp tới chân T1, hãy viết chương trình cho bộ đếm 
1 ở chế độ 2 để đếm các xung và hiển thị trạng thái của số đếm TL1 trên cổng P2. 
Lời giải: 
 MOV TMOD, #01100000B ; Chọn bộ đếm 1, chế độ 2, bít C/T = 1 
 xung ngoài. 
 MOV TH1, #0 ; Xoá TH1 
 SETB P3.5 ; Lấy đầu vào T1 
 AGAIN: SETB TR1 ; Khởi động bộ đếm 
 BACK: MOV A, TL1 ; Lấy bản sao số đếm TL1 
 MOV P2, A ; Đưa TL1 hiển thị ra cổng P2. 
 JNB TF1, Back ; Duy trì nó nếu TF = 0 
 CLR TR1 ; Dừng bộ đếm 
 CLR TF1 ; Xoá cờ TF 
 SJMP AGAIN ; Tiếp tục thực hiện 
 Để ý trong chương trình trên về vai trò của lệnh “SETB P3.5” vì các cổng được 
thiết lập dành cho đầu ra khi 8051 được cấp nguồn nên ta muốn P3.5 trở thành đầu vào 
thì phải bật nó lên cao. Hay nói cách khác là ta phải cấu hình (đưa lên cao) chân T1 
(P3.5) để cho phép các xung được cấp vào nó. 
 Trong ví dụ 9.18 chúng ta sử dụng bộ Timer1 như bộ đếm sự kiện để nó đếm lên 
mỗi khi các xung đồng hồ được cấp đến chân P3.5. Các xung đồng hồ này có thể biểu 
diễn số người đi qua cổng hoặc số vòng quay hoặc bất kỳ sự kiện nào khác mà có thể 
chuyển đổi thành các xung. 
 Trong ví dụ 9.19 các thanh ghi TL được chuyển đổi về mã ASCII để hiển thị trên 
một LCD. 
P2
P3.5 
8051 
to 
LEDs 
T1 
 Hình 9.5: a) Bộ Timer0 với đầu vào ngoài (chế độ 1) 
 b) Bộ Timer1 với đầu vào ngoài (chế độ 1) 
Ví dụ 9.19: 
 giả sử rằng một xung tần số 1Hz được nối tới chân đầu vào P3.4. Hãy viét chương 
trình hiển thị bộ đếm 0 trên một LCD. Hãy đặt số ban đầu của TH0 là - 60. 
Lời giải: 
 Để hiển thị số đếm TL trên một LCD ta phải thực hiện chuyển đổi giữ liệu 8 bít 
nhị phân về ASCII. 
 ACALL LCD-SET UP ; Gọi chương trình con khởi tạo CLD 
 MOV TMOD, #000110B ; Chọn bộ đếm 0, chế độ 2, bít C/T = 1 
 MOV TH0, # - 60 ; Đếm 60 xung 
 SETB P3.4 ; Lấy đầu vào T0 
 AGAIN: SETB TR0 ; Sao chép số đếm TL0 
 BACK: MOV A, TL0 ; Gọi chương trình con để chuyển đổi 
 trong các thanh ghi R2, R3, R4. 
 ACALL CONV ; Gọi chương trình con hiển thị trên LCD 
 ACALL DISLAY ; Thực hiện vòng lặp nếu TF = 0 
 JNB TF0, BACK ; Dừng bộ đếm 0 
 CLR TR0 ; Xoá cờ TF0 = 0 
 CLR TF0 ; Tiếp tục thực hiện 
 SJMP AGAIN ; Việc chuyển đổi nhị phân về mã ASCII 
khi trả dữ liệu ASCII có trong các thanh ghi R4, R3, R2 (R2 có LSD) - chữ số nhỏ nhất. 
 CONV: MOV B, #10 ; Chia cho 10 
 DIV AB 
 MOV R2, B ; Lưu giữ số thấp 
 MOV B, #10 ; Chia cho 10 một lần nữa 
 DIV AB 
 ORL A, #30H ; Đổi nó về ASCII 
 MOV R4, A ; Lưu chữ số có nghĩa lớn nhất MSD 
 MOV A, B ; 
 ORL A, #30H ; Đổi số thứ hai về ASCII 
 MOV R3, A ; Lưu nó 
 MOV A, R2 
 ORL A, #30H ; Đổi số thứ ba về ASCII 
 MOV R2, A ; Lưu số ASCII vào R2. 
 RET 
 TH0 TL0 TF0 
TF0 goes high 
when FFFF 0 
overflow flag 
TR0 
1T/C =
-
Timer 
exterrnal 
input 
Pin 3.4 
 TH1 TL1 TF1 
TF1 goes high 
when FFFF 0 
overflow flag 
TR1 
1T/C =
-
Timer 
exterrnal 
input 
Pin 3.5 
 Sử dụng tần số 60Hz ta có thể tạo ra các giây, phút, giờ. 
 Lưu ý rằng trong vòng đầu tiên, nó bắt đầu từ 0 vì khi RESET thì TL0 = 0; Để giải 
quyết vấn đề này hãy nạp TL0 với giá trị - 60 ở đầu chương trình. 
 Hình 9.6: Bộ Timer0 với đầu vào ngoài (chế độ 2) 
 Hình 9.7: Bộ Timer0 với đầu vào ngoài (chế độ 2) 
 Như một ví dụ ứng dụng khác của bộ định thời gian với bít C/T = 1, ta có thể nạp 
một sóng vuông ngoài với tần số 60Hz vào bộ định thời. Chương trình sẽ tạo ra các đơn 
vị thời gian chuẩn theo giây, phút, giờ. Từ đầu vào này ta hiển thị lên một LCD. Đây sẽ là 
một đồng hồ số tuyệt vời nhưng nó không thật chính xác. Ví dụ này có thể tìm thấy ở phụ 
lục Appendix E. 
 Trước khi kết thúc chương này ta cần nhắc lại hai vấn đề quan trọng. 
1. Chúng ta có thể nghĩ rằng công dụng của lệnh “JNB TFx, đích” để hiển thị mức 
cao của cờ TF là một sự lãng phí thời gian của BVĐK. Điều đó đúng có một giải 
pháp cho vấn đề này là sử dụng các ngắt. Khi sử dụng các ngắt ta có thể đi thực 
hiện các công việc khác với BVĐK. Khi cờ TF được bật thì nó báo cho ta biết đây 
là điểm quan trọng về thế mạnh của 8051 (mà ta sẽ bàn ở chương 11). 
2. Chúng ta muốn biết các thanh ghi TR0 và TR1 thuộc về đâu. Chúng thuộc về một 
thanh ghi gọi là TCON mã sẽ được ban sau ở đây (TCON - là thanh ghi điều khiển 
bộ đếm (bộ định thời)). 
Bảng 9.2: Các lệnh tương đương đối với thanh ghi điều khiển bộ định thời. 
Đối với Timer0 
 SETB TR0 = SETB TCON.4 
 CLR TR0 = CLR TCON.4 
 SETB TF = SETB TCON.5 
 CLR TF0 = CLR TCON.5 
Đối với Timer1 
 SETB TR1 = SETB TCON.6 
P1
P3.4 
8051 
to 
LEDs 
T0 1 Hz clock 
 TL0 TF0 
overflow flag 
TR0 
1T/C =
-
Timer0 
exterrnal 
input 
Pin 3.4 
TF0 goes high 
when FF 0 
 TH0 
reload 
 TL1 TF1 
overflow flag 
TR1 
1T/C =
-
Timer01e
xterrnal 
input 
Pin 3.5 
TF1 goes high 
when FF 0 
 TH1 
reload 
 CLR TR1 = CLR TCON.6 
 SETB TF1 = SETB TCON.7 
 CLR TF1 = CLR TCON.7 
9.2.2 Thanh ghi TCON. 
 Trong các ví dụ trên đây ta đã thấy công dụng của các cờ TR0 và TR1 để bật/ tắt 
các bộ định thời. Các bít này là một bộ phận của thanh ghi TCON (điều khiển bộ định 
thời). Đây là thanh ghi 8 bít, như được chỉ ra trong bảng 9.2 thì bốn bít trên được dùng để 
lưu cất các bít TF và TR cho cả Timer0 và Timer1. Còn bốn bít thấp được thiết lập dành 
cho điều khiển các bít ngắt mà ta sẽ bàn ở chương 11. Chúng ta phải lưu ý rằng thanh ghi 
TCON là thanh ghi có thể đánh địa chỉ theo bít được. Nên ta có thể thay các lệnh như 
“SETB TR1” là “CLR TR1” bằng các lệnh tương ứng như “SET TCON.6” và “CLR 
TCON.6” (Bảng 9.2). 
9.3 Trường hợp khi bít GATE = 1 trong TMOD. 
 Trước khi kết thúc chương ta cần bàn thêm về trường hơpợ khi bít GATE = 1trong 
thanh ghi TMOD. Tất cả những gì chúng ta vừa nói trong chương này đều giả thiết 
GATE = 0. Khi GATE = 0 thì bộ định thời được khởi động bằng các lệnh “SETB TR0” 
và “SETB TR1” đối với Timer0 và Timer1 tương ứng. Vậy điều gì xảy ra khi bít GATE = 
1? Như ta có thể nhìn thây trên hình 9.8 và 9.9 thì nếu GATE = 1 thì việc khởi động và 
dừng bộ định thời được thực hiện từ bên ngoài qua chân P2.3 và P3.3 đối với Timer0 và 
Timer1 tương ứng. Mặc dù rằng TRx được bật lên bằng lệnh “SETB TRx” thì cũng cho 
phép ta khởi động và dừng bộ định thời từ bên ngoài tại bất kỳ thời điểm nào thông qua 
công tắc chuyển mạch đơn giản. Phương pháp điều khiển phần cứng để dừng và khởi 
động bộ định thời nay có thể có rất nhiều ứng dụng. Ví dụ, chẳng hạn 8051 được dùng 
trong một sản phẩm phát báo động mỗi giây dùng bộ Timer0 theo nhiều việc khác. Bộ 
Timer0 được bật lên bằng phần mềm qua lệnh “SETB TR0” và nằm ngoài sự kiểm soát 
của người dùng sản phẩm đó. Tuy nhiên, khi nối một công tắc chuyển mạch tới chân 
P2.3 ta có thể dừng và khởi động bộ định thời gian bằng cách đó để tắt báo động. 
 Hình 9.8: Bộ định thời/ bộ đếm 0. 
XTAL 
oscillator 
á12 
0T/C =
1T/C = T0 Pin 
 Pin 3.4 
Gate 
 TR0 
2.3Pin
PinINTO
 Hình 9.9: Bộ định thời/ bộ đếm 1. 
XTAL 
oscillator 
á12 
0T/C =
1T/C = T1 Pin 
 Pin 3.5 
Gate 
 TR0 
3.3Pin
Pin1INT

File đính kèm:

  • pdfVi_dieu_khien_8051_ Assembly_09_BoDemVaDinhThoi.pdf