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

8051 có hai bộ định thời/ bộ đếm. Chúng có thể được dùng như các bộ định thời
để tạo một bộ trễ thời gian hoặc như các bộ đếm để đếm các sự kiện xảy ra bên ngoài bộ
BVĐK. Trong chương này chúng ta sẽ tìm hiểu về cách lập trình cho chúng và sử dụng
chúng như thế nào?
9.1 Lập trình các bộ định thời gian của 8051.
8051 có hai bộ định thời là Timer 0 và Timer1, ở phần này chúng ta bàn về các
thanh ghi của chúng và sau đó trình bày cách lập trình chúng như thế nào để tạo ra các
độ trễ thời gian 

pdf 18 trang thamphan 27/12/2022 1400
Bạn đang xem tài liệu "Giáo trình Vi điều khiển - Chương 9: Lập trình cho bộ đếm/ bộ định thời trong 8051", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfgiao_trinh_vi_dieu_khien_chuong_9_lap_trinh_cho_bo_dem_bo_di.pdf

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

  1. CHƯƠNG 9 Lập trình cho bộ đếm/ bộ định thời trong 8051 8051 có hai bộ định thời/ bộ đếm. Chúng có thể được dùng như các bộ định thời để tạo một bộ trễ thời gian hoặc như các bộ đếm để đếm các sự kiện xảy ra bên ngoài bộ BVĐK. Trong chương này chúng ta sẽ tìm hiểu về cách lập trình cho chúng và sử dụng chúng như thế nào? 9.1 Lập trình các bộ định thời gian của 8051. 8051 có hai bộ định thời là Timer 0 và Timer1, ở phần này chúng ta bàn về các thanh ghi của chúng và sau đó trình bày cách lập trình chúng như thế nào để tạo ra các độ trễ thời gian. 9.1.1 Các thanh ghi cơ sở của bộ định thời. Cả hai bộ định thời Timer 0 và Timer 1 đều có độ dài 16 bít được truy cập như hai thanh ghi tách biệt byte thấp và byte cao. Chúng ta sẽ bàn riêng về từng thanh ghi. 9.1.1.1 Các thanh ghi của bộ Timer 0. 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. TH0 TL0 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 Hình 9.1: Các thanh ghi của bộ Timer 0. 9.1.1.2 Các thanh ghi của bộ Timer 1. Bộ định thời gian Timer 1 cũng dài 16 bít và thanh ghi 16 bít của nó được chia ra thành hai byte là TL1 và TH1. Các thanh ghi này được truy cập và đọc giống như các thanh ghi của bộ Timer 0 ở trên. TH1 TL1 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 Hình 9.2: Các thanh ghi của bộ Timer 1. 9.1.2 Thanh ghi TMOD (chế độ của bộ định thời). Cả hai bộ định thời Timer 0 và Timer 1 đều dùng chung một thanh ghi được gọi là IMOD để thiết lập các chế độ làm việc khác nhau của bộ định thời. Thanh ghi TMOD là thanh ghi 8 bít gồm có 4 bít thấp được thiết lập dành cho bộ Timer 0 và 4 bít cao dành cho Timer 1. Trong đó hai bít thấp của chúng dùng để thiết lập chế độ của bộ định thời, còn 2 bít cao dùng để xác định phép toán. Các phép toán này sẽ được bàn dưới đây.
  2. Hãy tìm tần số đồng bộ và chu kỳ của bộ định thời cho các hệ dựa trên 8051 với các tần số thạch anh sau: a) 12MHz b) 16MHz Bộ giao động ÷12 Tần số đồng hồ của c) 11,0592MHz thạch anh bộ định thời Lời giải: 1 1 a) ×12MHz = 1MHz và T = =1 μ s 12 1/1MHz 1 1 b) ×16MHz = 1,111Mz và T = =0,75 μ s 12 1,333MHz 1 1 c) ×11,0592MHz= 921,6kHz và T = =1,085 μ s 12 0,9216MHz Mặc dù các hệ thống dựa trên 8051 khác với tần số thạch anh từ 10 đến 40MHz, song ta chỉ tập chung vào tần số thạch anh 11,0592MHz. Lý do đằng sau một số lẻ như vậy là hải làm việc với tần suất bouid đối với truyền thông nối tiếp của 8051. Tần số XTAL = 11,0592MHz cho phép hệ 8051 truyền thông với IBM PC mà không có lỗi, điều mà ta sẽ biết ở chương 10. 9.1.3 Bít cổng GATE. Một bít khác của thanh ghi TMOD là bít cổng GATE. Để ý trên hình 9.3 ta thấy cả hai bộ định thời Timer0 và Timer1 đều có bít GATE. Vậy bít GATE dùng để làm gì? Mỗi bộ định thời thực hiện điểm khởi động và dừng. Một số bộ định thời thực hiện điều này bằng phần mềm, một số khác bằng phần cứng và một số khác vừa bằng phần cứng vừa bằng phần mềm. Các bộ định thời tren 8051 có cả hai. Việc khởi động và dừng bộ định thời được khởi động bằng phần mềm bởi các bít khởi động bộ định thời TR là TR0 và TR1. Điều này có được nhờ các lệnh “SETB TR1” và “CLR TR1” đối với bộ Timer1 và “SETB TRO” và “CLR TR0” đối với bộ Timer0. Lệnh SETB khởi động bộ định thời và lệnh CLR dùng để dừng nó. Các lệnh này khởi động và dừng các bộ định thời khi bít GATE = 0 trong thanh ghi TMOD. Khởi động và ngừng bộ định thời bằng phần cứng từ nguồn ngoài bằng cách đặt bít GATE = 1 trong thanh ghi TMOD. Tuy nhiên, để tránh sự lẫn lộn ngay từ bây giờ ta đặt GATE = 0 có nghĩa là không cần khởi động và dừng các bộ định thời bằng phần cứng từ bên ngoài. Để sử dụng phần mềm để khởi động và dừng các bộ định thời phần mềm để khởi động và dừng các bộ định thời khi GATE = 0. Chúng ta chỉ cần các lệnh “SETB TRx” và “CLR TRx”. Việc sử dụng phần cứng ngoài để khởi động và dừng bộ định thời ta sẽ bàn ở chương 11 khi bàn về các ngắt. Ví dụ 9.3: Tìm giá trị cho TMOD nếu ta muốn lập trình bộ Timer0 ở chế độ 2 sử dụng thạch anh XTAL 8051 làm nguồn đồng hồ và sử dụng các lệnh để khởi động và dừng bộ định thời. Lời giải: TMOD = 0000 0010: Bộ định thời Timer0, chế độ 2 C/T = 0 dùng nguồn XTAL GATE = 0 để dùng phần mềm trong để khởi động và dừng bộ định thời.
  3. Từ ví dụ 9.6 ta có thể phát triển một công thức tính toán độ trễ sử dụng chế độ Mode1 (16 bít) của bộ định thời đối với tần số thạch anh XTAL = 11, 0592MHz (xem hình 9.4). Máy tính trong thư mục Accessrry của Microsoft Windows có thể giúp ta tìm các giá trị TH và TL. Máy tính này hỗ trợ các phép tính theo số thập phân, nhị phân và thập lục. a) Tính theo số Hex b) Tính theo số thập phân (FFFF - YYXX + 1). 1,085μs trong đó YYXX Chuyển đổi các giá trị YYXX của TH, TL về là các giá trị khởi tạo của TH, TL tương ứng. số thập phân để nhận một số thập phân Lưu ý rằng các giá trị YYXX là theo số Hex. NNNNN sau đó lấy (65536 - NNNNN).1,085μs. Hình 9.4: Công thức tính toán độ trễ thời gian đối với tần số XTAL = 11, 0592MHz. Ví dụ 9.4: Trong chương trình dưới đây ta tạo ra một sóng vuông với độ đầy xung 50% (cùng tỷ lệ giữa phần cao và phần thấp) trên chân P1.5. Bộ định thời Timer0 được dùng để tạo độ trễ thời gian. Hãy phân tích chương trình này. MOV TMOD, #01 ; Sử dụng Timer0 và chế độ 1(16 bít) HERE: MOV TL0, #0F2H ; TL0 = F2H, byte thấp MOV TH0, #0FFH ; TH0 = FFH, byte cao CPL P1.5 ; Sử dụng chân P1.5 ACALL DELAY SJMP HERE ; Nạp lại TH, TL ; delay using timer0. DELAY: SETB TR0 ; Khởi động bộ định thời Timer0 AGAIN: JNB TF0, AGAIN ; Hiển thị cờ bộ định thời cho đến khi nó vượt qua FFFFH. CLR TR0 ; Dừng bộ Timer CLR TF0 ; Xoá cờ bộ định thời 0 RET Lời giải: Trong chương trình trên đây chú ý các bước sau: 1. TMOD được nạp. 2. Giá trị FFF2H được nạp và TH0 - TL0 3. Chân P1.5 được chọn dùng cho phần cao thấp của xung. 4. Chương trình con DELAY dùng bộ định thời được gọi. 5. Trong chương trình con DELAY bộ định thời Timer0 được khởi động bởi lệnh “SETB TR0” 6. Bộ Timer0 đếm lên với mỗi xung đồng hồ được cấp bởi máy phát thạch anh. Khi bộ định thời đếm tăng qua các trạng thái FFF3, FFF4 cho đến khi đạt giá trị FFFFH. Và một xung nữa là nó quay về không và bật cờ bộ định thời TF0 = 1. Tại thời điểm này thì lệnh JNB hạn xuống. 7. Bộ Timer0 được dùng bởi lệnh “CLR TR0”. Chương trình con DELAY kết thúc và quá trình được lặp lại.
  4. Ví dụ 9.7: Hãy tìm ra độ trễ được tạo ra bởi Timer0 trong đoạn mã sau sử dụng cả hai phương pháp của hình 9.4. Không tính các tổng phí của các lệnh. CLR P2.3 ; Xoá P2.3 MOV TMOD, #01 ; Chọn Timer0, chế độ 1 (16 bít) HERE: MOV TL0, #3EH ; TL0 = 3EH, byte thấp MOV TH0, #0B8G ; TH0 = B8H, byte cao SETB P2.3 ; Bật P2.3 lên cao SETB TR0 ; Khởi động Timer0 AGAIN: JNB TF0, AGAIN ; Hiển thị cờ bộ định thời TF0 CLR TR0 ; Dừng bộ định thời. CLR TF0 ; Xoá cờ bộ định thời cho vòng sau CLR P2.3 Lời giải: a) Độ trễ được tạo ra trong mã trên là: (FFFF - B83E + 1) = 47C2H = 18370 hệ thập phân 18370 × 1,085μs = 19, 93145μs. b) Vì TH - TL = B83EH = 47166 (số thập phân) ta có 65536 - 47166 = 18370. Điều này có nghĩa là bộ định thời gian đếm từ B83EH đến FFFF. Nó được cộng với một số đếm để về 0 thành một bộ tổng là 18370μs. Do vậy ta có 18370 × 1,085μs = 19,93145ms là độ rộng xung. Ví dụ 9.8: Sửa giá trị của TH và TL trong ví dụ 9.7 để nhận được độ trễ thời gian lớn nhất có thể. Hãy tính độ trễ theo miligiây. Trong tính toán cần đưa vào cả tổng phí của các lệnh. Để nhận độ trễ thời gian lớn nhất có thể ta đặt TH và TL bằng 0. Điều này làm cho bộ định thời đếm từ 0000 đến FFFFH và sau đó quay qua về 0. CLR P2.3 ; Xoá P2.3 MOV TMOD, #01 ; Chọn Timer0, chế độ 1 (16 bít) HERE: MOV TL0, #0 ; Đặt TL0 = 0, byte thấp MOV TH0, #0 ; Đặt TH0 = 0, byte cao SETB P2.3 ; Bật P2.3 lên cao SETB TR0 ; Khởi động bộ Timer0 AGAIN: JNB TF0, AGAIN ; Hiển thị cờ bộ định thời TF0 CLR TR0 ; Dừng bộ định thời. CLR TF0 ; Xoá cờ TF0 CLR P2.3 Thực hiện biến TH và TL bằng 0 nghĩa là bộ định thời đếm tăng từ 0000 đến FFFFH và sau đó quay qua về 0 để bật cờ bộ định thời TF. Kết quả là nó đi qua 65536 trạng thái. Do vậy, ta có độ trễ = (65536 - 0) × 1.085μs = 71.1065μs. Trong ví dụ 9.7 và 9.8 chúng ta đã không nạp lại TH và TL vì nó là một xung đơn. Xét ví dụ 9.9 dưới đây để xem việc nạp lại làm việc như thế nào ở chế độ 1. Ví dụ 9.9: Chương trình dưới đây tạo ra một sóng vuông trên chân P2.5 liên tục bằng việc sử dụng bộ Timer1 để tạo ra độ trễ thời gian. Hãy tìm tần số của sóng vuông nếu tần số XTAL = 11.0592MHz. Trong tính toán không đưa vào tổng phí của các lệnh vòng lặp: MOV TMOD, #01H ; Chọn Timer0, chế độ 1 (16 bít)
  5. SETB TR0 ; Khởi động bộ định thời Timer0 AGAIN: JNB TF0, AGAIN ; Hiển thị cờ TF0 cho đến khi bộ đếm quay về 0 CLR TR0 ; Dừng bộ định thời. CLR TF0 ; Xoá cờ TF0 cho vòng sau. Ví dụ 9.11: Giả sử ta có tần số XTAL là 11,0592MHz hãy viết chương trình tạo ra một sóng vuông tần số 2kHz trên chân P2.5. Đây là trường hợp giống với ví dụ 9.10 ngoài trừ một việc là ta phải chọn bít để tạo ra sóng vuông. Xét các bước sau: 1 1 a) T = = =500 μ s là chu kỳ của sóng vuông. f 2kHz 1 b) Khoảng thời gian cao và phần thấp là T bằng 250μs. 2 250μ s c) Số nhịp cần trong thời gian đó là = 230 và giá trị cần nạp vào các thanh 1,085μ s ghi cần tìm là 65536 - 230 = 65306 và ở dạng hex là FF1AH. d) giá trị nạp vào TL là 1AH và TH là FFH. Chương trình cần viết là: MOV TMOD, #10H ; Chọn bộ định thời Timer0, chế độ 1 (16 bít) AGAIN: MOV TL1, #1AH ; Gán giá trị byte thấp TL1 = 1AH MOV TH1, #0FFH ; Gán giá trị byte cao TH1 = FFH SETB TR1 ; Khởi động Timer1 BACK: JNB TF1, BACK ; giữ nguyên cho đến khi bộ định thời quay về 0 CLR TR1 ; Dừng bộ định thời. CPL P1.5 ; Bù bít P1.5 để nhận giá trị cao, thấp. CLR TF1 ; Xoá cờ TF1 SUMP AGAIN ; Nạp lại bộ định thời vì chế độ 1 không tự nạp lại. Ví dụ 9.12: Trước hết ta thực hiện các bước sau: 1 a) Tính chu kỳ sóng vuông: T = =20 μ s 50Hz 1 b) Tính thời gian nửa chu kỳ cho phần cao: T= 10 μ s 2 10μ s c) Tính số nhịp đồng hồ: n = = 9216 1,085μ s d) Tính giá trị cần nạp vào TH và TL: 65536 - 9216 = 56320 chuyển về dạng Hex là DC00H và TH = DCH và TL = 00H. MOV TMOD, #10H ; Chọn bộ định thời Timer0, chế độ 1 (16 bít) AGAIN: MOV TL1, #00 ; Gán giá trị byte thấp TL1 = 00 MOV TH1, #0DHCH ; Gán giá trị byte cao TH1 = DC SETB TR1 ; Khởi động Timer1 BACK: JNB TF1, BACK ; giữ nguyên cho đến khi bộ định thời quay về 0
  6. Các đặc trưng và các phép tính của chế độ 2: 1. Nó là một bộ định thời 8 bít, do vậy nó chỉ cho phép các giá trị từ 00 đến FFH được nạp vào thanh ghi TH của bộ định thời. 2. Sau khi TH được nạp với giá trị 8 bít thì 8051 lấy một bản sao của nó đưa vào TL. Sau đó bộ định thời phải được khởi động. Điều này được thực hiện bởi lệnh “SETB TR0” đối với Timer0 và “SETB TR1” đối với Timer1 giống như ở chế độ 1. 3. Sau khi bộ định thời được khởi động, nó bắt đầu đếm tăng lên bằng cách tăng thanh ghi TL. Nó đếm cho đến khi đại giá trị giới hạn FFH của nó. Khi nó quay trở về 00 từ FFH, nó thiết lập cờ bộ định thời TF. Nếu ta sử dụng bộ định thời Timer0 thì đó là cờ TF0, còn Timer1 thì đó là cờ TF1. XTAL ÷12 TL TF oscillator reload TF goes high when FFFF − TF C / T= 0 TR 0 4. Khi thanh ghi TL quay trở về 00 từ FFH thì TF được bật lên 1 thì thanh ghi TL được tự động nạp lại với giá trị ban đầu được giữ bởi thanh ghi TH. Để lặp lại quá trình chúng ta đơn giản chỉ việc xoá cờ TF và để cho nó chạy mà không cần sự can thiệp của lập trình viên để nạp lại giả trị ban đầu. Điều này làm cho chế độ 2 được gọi là chế độ từ nạp lại so với chế độ 1 thì ta phải nạp lại các thanh ghi TH và TL. Cần phải nhấn mạnh rằng, chế độ 2 là bộ định thời 8 bít. Tuy nhiên, nó lại có khả năng tự nạp khi tự nạp lại thì TH thực chất là không thay đổi với giá trị ban đầu được giữ nguyên, còn TL được nạp lại giá trị được sao từ TH. Chế độ này có nhiều ứng dụng bao gồm việc thiết lập tần số baud trong truyền thông nối tiếp như ta sẽ biết ở chương 10. 9.1.5.1 Các bước lập trình cho chế độ 2. Để tạo ra một thời gian trễ sử dụng chế độ 2 của bộ định thời cần thực hiện các bước sau: 1. Nạp thanh ghi giá trị TMOD để báo bộ định thời gian nào (Timer0 hay Timer1) được sử dụng và chế độ làm việc nào của chúng được chon. 2. Nạp lại các thanh ghi TH với giá trị đếm ban đầu. 3. Khởi động bộ định thời. 4. Duy trì hiển thị cờ bộ định thời TF sử dụng lệnh “JNB TFx, đích” để xem nó sẽ được bật chưa. Thoát vòng lặp khi TF lên cao. 5. Xoá cờ TF.
  7. a) MOV TH1, #200 b) MOV TH0, #-60 c) MOV TH1, #-3 d) MOV TH1, #-12 e) MOV TH0, #-48 Lời giải: Chúng ta có thể sử dụng bàn tính Calculator của Windows để kiểm tra kết quả được cho bởi trình hợp ngữ. Hãy chọn Calculator ở chế độ Decimal và nhập vào số 200. Sau đó chọn Hex, rồi ấn +/ - để nhận giá trị của TH. Hãy nhớ rằng chúng ta chỉ sử dụng đúng hai chữ số và bỏ qua phần bên trái vì dữ liệu chúng ta là 8 bít. Kết quả ta nhận được như sau: Dạng thập phân Số bù hai (giá trị TH) - 200 38H - 60 C4H - 3 FDH - 12 F4H - 48 DOH 9.1.5.2 Các trình hợp ngữ và các giá trị âm. Vì bộ định thời là 8 bít trong chế độ 2 nên ta có thể để cho trình hợp ngữ tính giá trị cho TH. Ví dụ, trong lệnh “MOV TH0, # - 100” thì trình hợp ngữ sẽ tính toán – 100 = 9C và gán TH = 9CH. Điều này làm cho công việc của chúng ta dễ dàng hơn. Ví dụ 9.17: Hãy tìm a) tần số sóng vuông được tạo ra trong đoạn mã dưới đây và độ đầy xung của sóng này. MOV TMOD, #2H ; Chọn bộ Timer0/ chế độ 2/ (8 bít, tự nạp lại). MOV TH0, # - 150 ; Nạp TH0 = 6AH là số bù hai của - 150 SETB TR1 ; Khởi động Timer1 AGAIN: SETB P1.3 ; P1.3 = 1 ACALL DELAY ACALL P1.3 ; P1.3 = 0 ACALL DELAY 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 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 1.085μs và tần số là f = = 2,048kHz. T Để ý 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
  8. 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ó. 805 P2 to LEDs T1 P3.5 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. overflow overflow Timer Timer TH0 TL0 TF0 TH1 TF1 exterrna exterrna l input l input TL1 Pin 3.4 TR0 TF0 goes high Pin 3.5 TR1 TF1 goes high when FFFF when FFFF − − C / T= 1 C / T= 1 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
  9. 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 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