DIV A B; A= 09 (th−ơng số) ;B =05 (số d−) Lu ý cỏc điểm sau khi thực hiện AB
b) 16MHz c) 11,0592MHz
ACALL DELAY SJMP AGAIN
SJMP AGAIN
SETB TR0 ; Khởi động Timer0
BACK: JNB TF0, BACK ;giữ nguyờn cho đến khi bộ định thời quay về 0
CLR TR0 ; Dừng Timer0
CLR TF0 ; Xoá cờ TF cho vòng saụ
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à Đ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.085às và tần số là 2,048kHz.
T1 1
f = =
ĐĨ ý rằng trong nhiỊu tính toỏn thời gian trễ ta đh 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à 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 đh 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 đh 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à 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, hhy lu ý 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ọ Cỏc chế độ của cỏc bộ định thời cũng giống nhaụ
định nguồn xung đồng hồ cho bộ định thờ 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 ngồ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à 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 ngồ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, hhy 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àị
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 caọ 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ề mh 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. Hhy viột chơng trỡnh hiển thị bộ đếm 0 trờn một LCD. Hhy đặ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ề ASCI
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ó