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.
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:
- Vi_dieu_khien_8051_ Assembly_09_BoDemVaDinhThoi.pdf