Chương Lập trình cho đếm/ định thời 8051 8051 có hai định thời/ đếm Chúng dùng định thời để tạo trễ thời gian đếm để đếm kiện xảy bên BVĐK Trong chương tìm hiểu cách lập trình cho chúng sử dụng chúng nào? 9.1 Lập trình định thời gian 8051 8051 có hai định thời Timer Timer1, phần bàn ghi chúng sau trình bày cách lập trình chúng để tạo độ trễ thời gian 9.1.1 Các ghi sở định thời Cả hai định thời Timer Timer có độ dài 16 bít truy cập hai ghi tách biệt byte thấp byte cao Chúng ta bàn riêng ghi 9.1.1.1 Các ghi cña bé Timer Thanh ghi 16 bÝt cña bé Timer truy cập byte thấp byte cao Thanh ghi byte thấp gọi TL0 (Timer bow byte) vµ ghi byte cao lµ TH0 (Timer High byte) Các ghi truy cập ghi khác chẳng hạn nh A, B, R0, R1, R2 v.v VÝ dô, lệnh MOV TL0, #4FH chuyển giá trị 4FH vào TL0, byte thấp định thời Các ghi đọc ghi khác Ví dụ MOV R5, TH0 lưu byte cao TH0 cđa Timer vµo R5 TH0 D15 D14 D13 D12 D11 D10 D9 TL0 D8 D7 D6 D5 D4 D3 D2 D1 D0 Hình 9.1: Các ghi cđa bé Timer 9.1.1.2 C¸c ghi cđa bé Timer Bộ định thời gian Timer dài 16 bít ghi 16 bít chia thành hai byte TL1 TH1 Các ghi truy cập đọc giống ghi Timer TH1 D15 D14 D13 D12 D11 D10 D9 TL1 D8 D7 D6 D5 D4 D3 D2 D1 D0 Hình 9.2: Các ghi cña bé Timer 9.1.2 Thanh ghi TMOD (chế độ định thời) Cả hai định thời Timer Timer dùng chung ghi gọi IMOD để thiết lập chế độ làm việc khác định thời Thanh ghi TMOD lµ ghi bÝt gåm cã bít thấp thiết lập dành cho Timer vµ bÝt cao dµnh cho Timer Trong ®ã hai bÝt thÊp cđa chóng dïng ®Ĩ thiÕt lËp chế độ định thời, bít cao dùng để xác định phép toán Các phép toán bàn CuuDuongThanCong.com https://fb.com/tailieudientucntt (MSB) GATE (MSB) C/T M1 Timer1 M0 GATE C/T M1 Timer0 M0 H×nh 9.3: Thanh ghi IMOD 9.1.2.1 Các bít M1, M0: Là bít chế độ Timer Timer Chúng chọn chế độ định thời: 0, 1, Chế độ định thời 13, chế độ định thời 16 bít chế độ định thời bít Chúng ta tập chung vào chế độ thường sử dụng rộng rÃi chế độ Chúng ta sớm khám phá đặc tính củ chế độ sau khám phần lại ghi TMOD Các chế độ thiết lập theo trạng thái M1 M0 sau: M1 M0 ChÕ ®é 0 1 1 Chế độ hoạt động Bộ định thời 13 bít gồm bít định thời/ đếm bít đặt trước Bộ định thời 16 bít (không có đặt trước) Bộ định thời bít tự nạp lại Chế độ định thời chia tách 9.1.2.2 C/ T (đồng hồ/ định thời) Bít ghi TMOD dùng để định xem định thời dùng máy tạo độ trễ hay bé ®Õm sù kiƯn NÕu bÝt C/T = dùng định thời tạo ®é chÔ thêi gian Nguån ®ång hå cho chÕ ®é trễ thời gian tần số thạch anh 8051 phần bàn lựa chọn này, công dụng định thời đếm kiện bàn phần Ví dụ 9.1: HÃy hiển thị xem chế độ định thời trường hợp sau: a) MOV TMOD, #01H b) MOV TMOD, #20H c) MOV TMDO, #12H Lời giải: Chúng ta chuyển đổi giá trị từ số Hex sang nhị phân đối chiếu hình 93 ta cã: a) TMOD = 0000 0001, chÕ ®é định thời Timer chọn b) TMOD = 0010 0000, chế độ định thời Timer chọn c) TMOD = 0001 0010, chế độ định thời Timer chế ®é cđa Timer ®ỵc chän 9.1.2.3 Ngn xung ®ång hå cho bé ®Þnh thêi: Nh chóng ta biÕt, định thời cần xung đồng hồ để giữ nhịp Vậy nguồn xung đồng hồ cho định thời 8051 lấy đâu? Nếu C/T = tần số thạch anh liền với 8051 làm nguồn cho đồng hồ định thời Điều có nghĩa độ lớn tần số thạch anh kèm với 8051 định tốc độ nhịp định thời 8051 Tần số định thời 1/12 tần số thạch anh gắn với 8051 Xem ví dụ 9.2 Ví dụ 9.2: HÃy tìm tần số đồng chu kỳ định thời cho hệ dựa 8051 với tần số thạch anh sau: CuuDuongThanCong.com https://fb.com/tailieudientucntt a) 12MHz b) 16MHz c) 11,0592MHz Bộ giao động thạch anh á12 Tần số đồng hồ định thời Lời giải: 1 12MHz = 1MHz T = = 1ms 12 / 1MHz 1 = 0,75ms ´ 16MHz = 1,111Mz vµ T = b) 12 1,333MHz 1 = 1,085ms c) ´ 11,0592MHz = 921,6kHz T = 12 0,9216MHz a) Mặc dù hệ thống dựa 8051 khác với tần số thạch anh từ 10 đến 40MHz, song ta tập chung vào tần số thạch anh 11,0592MHz Lý đằng sau số lẻ hải làm việc với tần suất bouid truyền thông nối tiếp 8051 TÇn sè XTAL = 11,0592MHz cho phÐp hƯ 8051 trun thông với IBM PC mà 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 ghi TMOD bít cổng GATE Để ý hình 9.3 ta thấy hai định thời Timer0 Timer1 có bít GATE Vậy bít GATE dùng để làm gì? Mỗi định thời thực điểm khởi động dừng Một số định thời thực điều phần mềm, số khác phần cứng số khác vừa phần cứng vừa phần mềm Các định thời tren 8051 có hai Việc khởi động dừng định thời khởi động phần mềm bít khởi động định thời TR TR0 TR1 Điều có nhờ lệnh SETB TR1 CLR TR1 Timer1 SETB TRO CLR TR0 Timer0 Lệnh SETB khởi động định thời lệnh CLR dùng để dừng Các lệnh khởi động dừng định thời bít GATE = ghi TMOD Khởi động ngừng định thời phần cứng từ nguồn cách đặt bÝt GATE = ghi TMOD Tuy nhiªn, để tránh lẫn lộn từ ta đặt GATE = có nghĩa không cần khởi động dừng định thời phần cứng từ bên Để sử dụng phần mềm để khởi động dừng định thời phần mềm để khởi động dừng định thời GATE = Chúng ta cần lệnh SETB TRx CLR TRx Việc sử dụng phần cứng để khởi động dừng định thời ta bàn chương 11 bàn ngắt Ví dụ 9.3: Tìm giá trị cho TMOD ta muốn lập trình Timer0 chế độ sử dụng thạch anh XTAL 8051 làm nguồn đồng hồ sử dụng lệnh để khởi động dừng định thời Lời giải: TMOD = 0000 0010: Bộ định thời Timer0, chÕ ®é C/T = dïng nguån XTAL GATE = để dùng phần mềm để khởi động dừng định thời Như vậy, đà có hiểu biết vai trò cđa ghi TMOD, chóng ta sÏ xÐt chÕ ®é định thời cách chúng lập trình để tạo độ trễ thời gian Do chế độ chế độ sử dụng rộng rÃi nên ta xét chi tiết chế độ 9.1.4 Lập trình cho chế độ Mode1 CuuDuongThanCong.com https://fb.com/tailieudientucntt Dưới đặc tính phép toán chế độ Mode1: Nó định thời 16 bít, cho phép giá trị 0000 đến FFFFH nạp vào ghi TL TH định thời Sau TL TH nạp giá trị khởi tạo 16 bít định thời phải khởi động Điều thực SETB TR0 Timer SETB TR1 Timer1 Sau định thời khởi động, bắt đầu đếm lên Nó đếm lên đạt giới hạn FFFFH Khi quay qua từ FFFFH 0000 bật lên bít cờ TF gọi cờ định thời Cờ định thời hiển thị Khi cờ định thời thiết lập từ phương án để dừng định thời lệnh CLR TR0 Timer0 CLR TR1 Timer1 cần phải nhắc lại định thời có cờ TF riêng mình: TF6 Timer0 TF1 ®èi víi Timer1 XTAL oscillator TH ¸12 TL TF goes high when FFFF ® C/T = TF overflow flag TR Sau định thời đạt giới hạn quay quan giá trị FFFFH, muốn lặp lại trình ghi TH TL phải nạp lại với giá trị ban đầu TF phải trì 9.1.4.1 Các bước lập trình chế độ Mode Để tạo độ trễ thời gian dùng chế độ định thời cần phải thực bước Nạp giá trị TMOD cho ghi báo độ định thời (Timer0 hay Timer1) sử dụng chế độ chọn Nạp ghi TL TH với giáa trị đếm ban đầu Khởi động định thời Duy trì hiển thị cờ định thời TF lệnh JNB TFx, đích để xem bật không Thoát vòng lặp TF lên cao Dừng định thời Xoá cờ TF cho vòng Quay trở lại bước để nạp lại TL TH Để tính toàn thời gian trễ xác tần số sóng vuông tạo chân P1.5 ta cần biết tần số XTAL (xem vÝ dô 9.5) Tõ vÝ dô 9.6 ta cã thể phát triển công thức tính toán độ trễ sử dụng chế độ Mode1 (16 bít) định thời tần số thạch anh XTAL = 11, 0592MHz (xem hình 9.4) Máy tính thư mục Accessrry Microsoft Windows giúp ta tìm giá trị TH TL Máy tính hỗ trợ phép tính theo số thập phân, nhị phân thập lôc CuuDuongThanCong.com https://fb.com/tailieudientucntt a) TÝnh theo sè Hex b) TÝnh theo sè thËp ph©n (FFFF - YYXX + 1) 1,085ms YYXX giá Chuyển đổi giá trÞ YYXX cđa TH, TL vỊ sè thËp trÞ khëi tạo TH, TL tương ứng Lưu ý giá trị phân để nhận số thập phân NNNNN sau lấy YYXX theo số Hex (65536 - NNNNN).1,085ms Hình 9.4: Công thức tính toán độ trễ thời gian tần số XTAL = 11, 0592MHz Ví dụ 9.4: Trong chương trình ta tạo sóng vuông với độ đầy xung 50% (cùng tỷ lệ phần cao phần thấp) chân P1.5 Bộ định thời Timer0 dùng để tạo độ trễ thời gian HÃy phân tích chương trình HERE: ; DELAY: AGAIN: MOV TMOD, #01 MOV TL0, #0F2H MOV TH0, #0FFH CPL P1.5 ACALL DELAY SJMP HERE delay using timer0 ; Sử dụng Timer0 chế độ 1(16 bít) ; TL0 = F2H, byte thÊp ; TH0 = FFH, byte cao ; Sư dơng ch©n P1.5 SETB JNB CLR CLR RET ; Khởi động định thời Timer0 ; Hiển thị cờ định thời vượt qua FFFFH ; Dõng bé Timer ; Xo¸ cê bé định thời ; Nạp lại TH, TL TR0 TF0, AGAIN TR0 TF0 Lời giải: Trong chương trình ý bước sau: TMOD nạp giá trị FFF2H nạp TH0 - TL0 Chân P1.5 chọn dùng cho phần cao thấp xung Chương trình DELAY dùng định thời gọi Trong chương trình DELAY định thời Timer0 khởi động lệnh SETB TR0 Bộ Timer0 đếm lên với xung đồng hồ cấp máy phát thạch anh Khi định thời đếm tăng qua trạng thái FFF3, FFF4 đạt giá trị FFFFH Và xung quay không bật cờ định thời TF0 = Tại thời điểm lệnh JNB hạn xuống Bộ Timer0 dùng lệnh CLR TR0 Chương trình DELAY kết thúc trình lặp lại Lưu ý để lặp lại trình ta phải nạp lại ghi TH TL khởi động lại định thời với giả thiết tần số XTAL = 11, 0592MHz FFF2 FFF3 FFF4 FFFF 0000 TF = TF = TF = TF = TF = VÝ dô 9.5: CuuDuongThanCong.com https://fb.com/tailieudientucntt Trong vÝ dô 9.4 h·y tÝnh toán lượng thời gian trễ chương trình DELAY tạo định thời với giá thiết tần số XTAL = 11,0592MHz Lời giải: Bộ định thời làm việc với tần số đồng hồ 1/12 tần sè XTAL, vËy ta cã 11,0592 = 0,9216MHz lµ tần số định thời Kết nhịp xung đồng hồ có 12 = 1,085ms Hay nói cách khác, Timer0 đếm tăng sau 1,085ms chu kỳ T = 0,9216MHz để tạo trễ b»ng sè ®Õm ´1,085ms Sè ®Õm b»ng FFFFH - FFF2H = ODH (13 theo số thập phân) Tuy nhiên, ta phải cộng vào 13 cần thêm nhịp ®ång hå ®Ĩ nã quay tõ FFFFH vỊ vµ bËt cê TF Do vËy, ta cã 14 ´ 1,085ms = 15,19ms cho nửa chu kỳ chu kỳ lµ T = ´ 15,19ms = 30, 38ms lµ thời gian trễ tạo định thời VÝ dơ 9.6: Trong vÝ dơ 9.5 h·y tÝnh to¸n tần số xung vuông tạo chân P1.5 Lời giải: Trong tính toán độ thời gian trễ ví dụ 9.5 ta không tính đến tổng phí lệnh vòng lặp Để tính toán xác ta cần bổ xung thêm chu kỳ thời gian lệnh vòng lặp Để làm ®iỊu ®ã ta sư dơng c¸c chu kú m¸y tõ bảng A-1 phụ lục Appendix A ®©y HERE: ; DELAY: AGAIN: MOV TL0, #0F2H MOV TH0, #0FFH CPL P1-5 ACALL DELAY SJMP HERE delay using timer0 2 2 SETB JNB CLR CLR RET 1 1 TR0 TF0, AGAIN TR0 TF0 Total T = (2 ´ 27 ´ 1.085ms and F = 17067.75Hz) 27 Tỉng sè chu kú ®· bỉ xung x7 nên chu kỳ thời gian trễ T = 27 1.085ms = 58,59ms tần số F = 17067,75Hz Ví dụ 9.7: HÃy tìm độ trễ tạo Timer0 đoạn mà sau sử dụng hai phương pháp hình 9.4 Không tính tổng phí lệnh HERE: AGAIN: CLR MOV MOV MOV SETB SETB JNB CuuDuongThanCong.com P2.3 TMOD, #01 TL0, #3EH TH0, #0B8G P2.3 TR0 TF0, AGAIN ; Xoá P2.3 ; Chọn Timer0, chế độ (16 bÝt) ; TL0 = 3EH, byte thÊp ; TH0 = B8H, byte cao ; BËt P2.3 lªn cao ; Khëi ®éng Timer0 ; HiĨn thÞ cê bé ®Þnh thêi TF0 https://fb.com/tailieudientucntt CLR CLR CLR TR0 TF0 P2.3 ; Dõng bé định thời ; Xoá cờ định thời cho vòng sau Lời giải: a) Độ trễ tạo mà là: (FFFF - B83E + 1) = 47C2H = 18370 hƯ thËp ph©n 18370 ´ 1,085ms = 19, 93145ms b) V× TH - TL = B83EH = 47166 (sè thËp ph©n) ta cã 65536 - 47166 = 18370 Điều có nghĩa định thời gian đếm từ B83EH đến FFFF Nó cộng với số ®Õm ®Ĩ vỊ thµnh mét bé tỉng lµ 18370ms Do vËy ta cã 18370 ´ 1,085ms = 19,93145ms lµ độ rộng xung Ví dụ 9.8: Sửa giá trị TH TL ví dụ 9.7 để nhận ®é 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 tổng phí lệnh Để nhận độ trễ thời gian lớn ta đặt TH TL Điều làm cho định thời ®Õm tõ 0000 ®Õn FFFFH vµ sau ®ã quay qua vÒ CLR MOV MOV MOV SETB SETB JNB CLR CLR CLR HERE: AGAIN: P2.3 TMOD, #01 TL0, #0 TH0, #0 P2.3 TR0 TF0, AGAIN TR0 TF0 P2.3 ; Xo¸ P2.3 ; Chän Timer0, chÕ ®é (16 bÝt) ; §Ỉt TL0 = 0, byte thÊp ; §Ỉt TH0 = 0, byte cao ; BËt P2.3 lªn cao ; Khëi ®éng bé Timer0 ; HiĨn thÞ cê bé ®Þnh thêi TF0 ; Dừng định thời ; Xoá cờ TF0 Thùc hiƯn biÕn TH vµ TL b»ng nghÜa lµ định thời đếm tăng từ 0000 đến FFFFH sau ®ã quay qua vỊ ®Ĩ bËt cê bé định thời TF Kết qua 65536 trạng thái Do vậy, ta có độ trễ = (65536 - 0) ´ 1.085ms = 71.1065ms Trong vÝ dô 9.7 9.8 đà không nạp lại TH TL xung đơn Xét ví dụ 9.9 để xem việc nạp lại làm việc chế độ Ví dụ 9.9: Chương trình tạo sóng vuông chân P2.5 liên tục việc sử dụng Timer1 để tạo độ trễ thời gian HÃy tìm tần số sóng vuông tần số XTAL = 11.0592MHz Trong tính toán không đưa vào tổng phí lệnh vòng lặp: HERE: AGAIN: MOV MOV MOV TMOD, #01H TL1, #34H TH0, #76H SETB JNB CLR CPL CLR SJMP TR1 TF1, BACK TR1 P1.5 TF AGAIN ; Chän Timer0, chế độ (16 bít) ; Đặt byte thấp TL1 = 34H ; Đặt byte cao TH1 = 76H ; (giá trị định thời 7634H) ; Khởi động Timer1 ; lại định thời đếm qua ; Dừng định thời ; Bù chân P1.5 để nhận Hi, L0 ; Xoá cờ định thời ; Nạp lại định thời chế độ không tự động nạp lại Lời giải: CuuDuongThanCong.com https://fb.com/tailieudientucntt Trong chương trình ta lưu ý đến đích SJMP chế độ chương trình phải nạp lại ghi TH TL lần ta muốn có sóng dạng liên tục Dưới kết tính toán: Vì FFFFH - 7634H = 89CBH + = 89CCH vµ 90CCH = 35276 số lần đếm xung đồng hồ, độ trễ 35276 1.085ms = 38274ms tần số (Hz) = 26127Hz 38274 Cũng để ý phần cao phần thấp xung sóng vuông Trong tính toán chưa kể đến tổng phí lệnh vòng lặp 9.1.4.2 Tìm giá trị cần nạp vào định thời giả sử biết lượng thời gian trễ mà ta cần câu hỏi đặt làm để tìm giá trị cần thiết cho thi TH TL Để tính toán giá trị cần nạp vào ghi TH TL hÃy nhìn vào ví dụ sau với việc sử dụng tần số dao động XTAL = 11 0592MHz ®èi víi hƯ 8051 Tõ vÝ dơ 9.10 ta sử dụng bước sau để tìm giá trị ghi TH TL Chia thêi gian trƠ cÇn thiÕt cho 1.0592ms Thùc 65536 - n với n giá trị thập phân nhận từ bước Chuyển đổi kết bước sang số Hex với yyxx giá trị hex ban đầu cần phải nạp vào ghi định thời Đặt TL = xx TH = yy Ví dụ 9.10: giả sử tần số XTAL = 11.0592MHz HÃy tìm giá trị cần nạp vào ghi vào ghi TH TL ta muốn độ thời gian trễ 5ms HÃy trình bày chương trình cho Timer0 để tạo xung với độ rộng 5ms chân P2.3 Lời giải: Vì tần số XTAL = 11.0592MHz nên đếm tăng sau chu kỳ 1.085ms Điều có nghĩa phải nhiều khoảng thời gian 1,085ms để có xung 5ms Để có ta chia 5ms cho 1.085ms nhận số n = 4608 nhịp Để nhận giá trị cần nạp vào TL TH ta tiến hành lÊy 65536 trõ ®i 4608 b»ng 60928 Ta ®ỉi sè số hex thành EE00H Do vậy, giá trị nạp vào TH EE Và TL 00 HERE: AGAIN: CLR MOV MOV MOV SETB SETB JNB CLR CLR P2.3 TMOD, #01 TL0, #0 TH0, #EEH P2.3 TR0 TF0, AGAIN TR0 TF0 ; Xo¸ bÝt P2.3 ; Chän Timer0, chế độ (16 bít) ; Nạp TL = 00 ; Nạp TH = EEH ; Bật P2.3 lên cao ; Khởi động định thời Timer0 ; Hiển thị cê TF0 cho ®Õn bé ®Õm quay vỊ ; Dừng định thời ; Xoá cờ TF0 cho vòng sau Ví dụ 9.11: giả sử ta có tần số XTAL 11,0592MHz hÃy viết chương trình tạo sóng vuông tần số 2kHz chân P2.5 Đây trường hợp giống với ví dụ 9.10 trừ việc ta phải chọn bít để tạo sóng vuông Xét bước sau: CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 = = 500ms chu kỳ sóng vuông f 2kHz b) Khoảng thời gian cao phần thấp T 250ms 250ms = 230 giá trị cần nạp vào ghi c) Số nhịp cần thời gian 1,085ms a) T = cần tìm 65536 - 230 = 65306 dạng hex FF1AH d) giá trị nạp vào TL 1AH TH FFH Chương trình cần viết lµ: AGAIN: BACK: MOV TMOD, #10H MOV TL1, #1AH MOV TH1, #0FFH SETB TR1 JNB TF1, BACK CLR TR1 CPL P1.5 CLR TF1 SUMP AGAIN ; Chọn định thời Timer0, chế độ (16 bít) ; Gán giá trị byte thấp TL1 = 1AH ; Gán giá trị byte cao TH1 = FFH ; Khởi động Timer1 ; giữ nguyên định thời quay ; Dừng định thời ; Bù bít P1.5 để nhận giá trị cao, thấp ; Xoá cờ TF1 ; Nạp lại định thời chế độ 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: = 20ms 50Hz b) TÝnh thêi gian nưa chu kú cho phÇn cao: T = 10ms 10ms = 9216 c) TÝnh sè nhÞp ®ång hå: n = 1,085ms a) TÝnh chu kú sãng vuông: T = d) Tính giá trị cần nạp vào TH vµ TL: 65536 - 9216 = 56320 chun vỊ dạng Hex DC00H TH = DCH TL = 00H AGAIN: BACK: MOV TMOD, #10H MOV TL1, #00 MOV TH1, #0DHCH SETB TR1 JNB TF1, BACK CLR TR1 CPL P2.3 CLR TF1 SUMP AGAIN ; Chọn định thời Timer0, chế độ (16 bít) ; Gán giá trị byte thấp TL1 = 00 ; Gán giá trị byte cao TH1 = DC ; Khëi ®éng Timer1 ; giữ nguyên định thời quay ; Dừng định thời ; Bù bít P1.5 để nhận giá trị cao, thấp ; Xoá cờ TF1 ; Nạp lại định thời chế độ không tự nạp lại 9.1.4.3 Tạo độ trễ thời gian lớn Như ta đà biết từ ví dụ lượng thời gian trễ cần tạo phụ thuộc vào hai yếu tố: a) Tần số thạch anh XTAL b) Thanh ghi 16 bít định thời chế độ Cả hai yếu tố nằm khả điều chỉnh lập trình viên 8051 Ví ta đà biết giá trị lớn độ trễ thời gian đạt cách đặt TH TL CuuDuongThanCong.com https://fb.com/tailieudientucntt Nhưng điều xảy không đủ? Ví dụ 9.13 cách làm để có giá trị độ trễ thời gian lớn 9.1.4.4 Sử dụng bàn tính Windows để tìm TH TL Bàn tính Calculator Windows có máy tính PC dễ sử dụng để tìm giá trị cho TH TL giả sử tìm giá trị cho TH TL với độ trễ thời gian lớn 35.000 nhịp đồng hồ với chu kú 1,085ms Ta thùc hiƯn c¸c bíc nh sau: Chọn máy tính Calculator từ Windows đặt chế ®é tÝnh vỊ sè thËp ph©n Decimal NhËp sè 35.000 vào từ bàn phím Chuyển chế độ Hex Calculator cho ta giá trị 88B8H Chọn +/- để nhận số đổi dấu - 35.000 dạng thập phân chuyển dạng Hex 7748H Hai sè hex cuèi lµ cho TL = 48 vµ hai sè Hex tiÕp theo lµ cho TH = 77 Ta bỏ quan số F phía bên phải Calculator số ta 16 bít Ví dụ 9.13: HÃy kiểm tra chương trình sau tìm độ trễ thời gian theo giây, không tính đến tổng phí lệnh vòng lặp AGAIN: BACK: MOV MOV MOV MOV SETB JNB CLR CLR DJNZ TMOD, #10H R3, #200 TL1, #08 TH1, #08 TR1 TF1, BACK TR1 TF1 R3, AGAIN ; Chän bé Timer1, chÕ ®é (16 bít) ; Chọn đếm độ giữ chậm lớn ; N¹p byte thÊp TL1 = 08 ; N¹p byte cao TH1 = 01 ; Khởi động Timer1 ; giữ nguyên định thời quay ; Dừng định thời ; Xoá cờ định thời TF1 ; Nếu R3 không không nạp lại định thời 9.1.5 Chế độ O Chế độ hoàn toàn giống chế độ khác định thời 16 bít thay 13 bít Bộ đếm 13 bít giữ giá trị 0000 ®Õn 1FFFF TH - TL Do vËy định thời đạt giá trị cực đại 1FFFH quay trở 0000 cờ TF bật lên 9.1.6 Lập trình chế độ Các đặc trưng phép tính chế độ 2: Nó định thời bÝt, vËy nã chØ cho phÐp c¸c gi¸ trị từ 00 đến FFH nạp vào ghi TH định thời Sau TH nạp với giá trị bít 8051 lấy đưa vào TL Sau định thời phải khởi động Điều thực lệnh SETB TR0 Timer0 SETB TR1” ®èi víi Timer1 gièng nh ë chÕ ®é Sau định thời khởi động, bắt đầu đếm tăng lên cách tăng ghi TL Nó đếm đại giá trị giới h¹n FFH cđa nã Khi nã quay trë vỊ 00 từ FFH, thiết lập cờ định thời TF Nếu ta sử dụng định thời Timer0 cờ TF0, Timer1 cờ TF1 CuuDuongThanCong.com https://fb.com/tailieudientucntt TL ¸12 XTAL oscillator TF reload - C/T = TR TF TF goes high when FFFF Khi ghi TL quay trë vÒ 00 tõ FFH TF bật lên ghi TL tự động nạp lại với giá trị ban đầu giữ ghi TH Để lặp lại trình đơn giản việc xoá cờ TF chạy mà không cần can thiệp lập trình viên để nạp lại giả trị ban đầu Điều làm cho chế độ gọi chế độ từ nạp lại so với chế độ ta phải nạp lại ghi TH TL Cần phải nhấn mạnh rằng, chế độ định thời bít Tuy nhiên, lại có khả tự nạp tự nạp lại TH thực chất không thay đổi với giá trị ban đầu giữ nguyên, TL nạp lại giá trị từ TH Chế độ nµy cã nhiỊu øng dơng bao gåm viƯc thiÕt lËp tần số baud truyền thông nối tiếp ta biết chương 10 9.1.5.1 Các bước lập trình cho chế độ Để tạo thời gian trễ sử dụng chế độ định thời cần thực bước sau: Nạp ghi giá trị TMOD để báo định thời gian (Timer0 hay Timer1) sử dụng chế độ làm việc chúng chon Nạp lại ghi TH với giá trị đếm ban đầu Khởi động định thời Duy trì hiển thị cờ định thời TF sử dụng lệnh JNB TFx, đích để xem bật chưa Thoát vòng lặp TF lên cao Xoá cờ TF Quay trở lại bước chế độ chế độ tự nạp lại Ví dụ 9.14 minh hoạ điều Để có độ chễ lớn dùng nhiều ghi vÝ dơ 9.15 VÝ dơ 9.14: gi¶ sư tần số XTAL = 11.0592MHz HÃy tìm a) tần số sóng vuông tạo chân P1.0 chương trình sau b) tần số nhỏ có chương trình giá trị TH để đạt điều MOV MOV SETB JNB CPL CLR SJMP BACK: TMOD, #20H TH1, #5 TR1 TF1, BACK P1.0 TF1 BACK ; Chän Timer1/ chÕ ®é 2/ bÝt/ tù n¹p l¹i ; TH1 = ; Khởi động Timer1 ; giữ nguyên ®Þnh thêi quay vỊ ; Dõng bé ®Þnh thêi ; Xoá cờ định thời TF1 ; Chế độ tự động nạp lại Lời giải: CuuDuongThanCong.com https://fb.com/tailieudientucntt a) Tríc hÕt ®Ĩ ý ®Õn ®Ých cđa lƯnh SJMP Trong chế độ ta không cần phải nạp lại TH chế độ tự nạp Bây ta lấy (256 - 05).1.085ms = 2511.085ms = 272.33ms phần cao xung Cả chu kỳ xung T = 544.66ms tần số = 1,83597 kHz T b) Để nhận tần số nhỏ ta cần tạo T chu kỳ lớn có nghĩa TH = 00 Trong trường hợp ta cã T = ´ 256 ´ 1.085ms = 555.52ms tần số nhỏ = 1,8kHz T Ví dụ 9.15: HÃy tìm tần số xung vuông tạo P1.0 Lời giải: MOV TMOD, #2H ; Chän Timer0, chÕ ®é (8 bÝt tù n¹p l¹i) MOV TH0, #0 ; N¹p TH0 = 00 MOV R5, #250 ; Đếm cho độ trễ lớn ACALL DELAY CPL P1.0 SJMP AGAIN DELAY: SETB TR0 ; Khởi động Timer0 BACK: JNB TF1, BACK ; giữ nguyên định thời quay CLR TR0 ; Dõng Timer0 CLR TF0 ; Xo¸ cê TF0 cho vßng sau DJNZ R5, DELAY RET T = ´ (250 ´ 256 ´ 1.085ms) = 1.38.88ms vµ f = 72Hz AGAIN: Ví dụ 9.16: giả sử ta lập trình chế độ hÃy tìm giá trị (dạng Hex) cần nạp vào TH cho trường hợp sau: a) MOV TH1, #200 c) MOV TH1, #-3 e) MOV TH0, #-48 b) MOV TH0, #-60 d) MOV TH1, #-12 Lời giải: Chúng ta sử dụng bàn tính Calculator Windows để kiểm tra kết cho trình hợp ngữ HÃy chọn Calculator chế ®é Decimal vµ nhËp vµo sè 200 Sau ®ã chän Hex, ấn +/ - để nhận giá trị TH H·y nhí r»ng chóng ta chØ sư dơng ®óng hai chữ số bỏ qua phần bên trái liệu bít Kết ta nhận sau: Dạng thập phân Số bù hai (giá trị TH) - 200 - 60 -3 - 12 - 48 38H C4H FDH F4H DOH 9.1.5.2 Các trình hợp ngữ giá trị âm CuuDuongThanCong.com https://fb.com/tailieudientucntt Vì định thời bít chế độ nên ta trình hợp ngữ tính giá trị cho TH Ví dụ, lệnh MOV TH0, # - 100 trình hợp ngữ tính toán 100 = 9C gán TH = 9CH Điều làm cho công việc dễ dàng Ví dụ 9.17: HÃy tìm a) tần số sóng vuông tạo đoạn mà độ đầy xung sóng AGAIN: BACK: MOV TMOD, #2H MOV TH0, # - 150 SETB TR1 SETB P1.3 ACALL DELAY ACALL P1.3 ACALL DELAY SJMP AGAIN ; Chän Timer0/ chế độ 2/ (8 bít, tự nạp lại) ; Nạp TH0 = 6AH số bù hai - 150 ; Khëi ®éng Timer1 ; P1.3 = SETB JNB CLR CLR RET ; Khởi động Timer0 ;giữ nguyên định thời quay ; Dừng Timer0 ; Xoá cờ TF cho vòng sau TR0 TF0, BACK TR0 TF0 ; P1.3 = Lêi giải: Để tìm giá trị cho TH chế độ trình hợp ngữ cần thực chuyển đổi số âm ta nhập vào Điều 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 DELAY 150 1.085ms tần số f = = 2,048kHz T Để ý nhiều tính toán thời gian trễ ta đà bỏ xung đồng hồ liên quan đến tổng phí lệnh vòng lặp Để tính toán xác thời gian trễ tần số ta cần phải đưa chúng vào Nếu ta dùng máy sóng số ta không nhận tần số ta tính toán tổng phí liên quan đến lệnh gọi vòng lặp Trong phần ta đà dùng định thời 8051 để tạo thời gian trễ Tuy nhiên, công dụng mạnh sáng tạo định thời sử dụng chúng đếm kiện Chúng ta bàn công dụng đếm phần 9.2 Lập trình cho đếm phần ta đà sử dụng định thời 8051 để tạo độ trễ thời gian Các định thời dùng đếm kiện xảy bên 8051 Công dụng đếm/ định thời đếm kiện tình bày phần Chừng liên quan đến công dụng củ định thời đếm kiện vấn đề mà ta nói lập trình định thời phần trước áp dụng cho việc lập trình đếm ngoại trừ nguồn tần số Đối với định thời/ đếm dùng định thời nguồn tần số tần số thạch anh 8051 Tuy nhiên, dùng đếm nguồn xung để tăng nội dung ghi TH TL từ bên 8051 chế độ đếm, hÃy lưu ý ghi TMOD TH, TL giống định thời bàn phần trước, chí chúng có tên gọi Các chế độ định thời gièng 9.2.1 BÝt C/T ghi TMOD CuuDuongThanCong.com https://fb.com/tailieudientucntt Xem lại phần bít C/T ghi TMOD ta thấy định nguồn xung đồng hồ cho định thời Nếu bít C/T = định thời nhận xung đồng hồ từ giao động thạch anh 8051 Ngược lại, C/T = định thời sử dụng đếm nhận xung đồng hồ từ nguồn bên 8051 Do vậy, bít C/T = đếm lên, xung đưa đến chân 14 15 Các chân có tên T0 (đầu vào định thời Timer0) T1 (đầu vào Timer1) Lưu ý hai chân thuộc cổng P3 Trong trường hợp Timer0 C/T = chân P3.4 cấp xung đồng hồ đếm tăng lên xung đồng hồ đến từ chân Tương tự đói với Timer1 C/T = với xung đồng hồ đến từ P3.5 đếm đếm tăng lên Bảng 9.1: Các chân cổng P3 dùng cho Timer0 Timer1 Chân 14 15 Chân cổng P3.4 P3.5 Chức T0 T1 Mô tả Đầu vào đếm Đầu vào đếm Ví dụ 9.18: giả sử xung đồng hồ cấp tới chân T1, hÃy viết chương trình cho ®Õm ë chÕ ®é ®Ĩ ®Õm c¸c xung hiển thị trạng thái số đếm TL1 cỉng P2 Lêi gi¶i: AGAIN: BACK: MOV TMOD, #01100000B MOV SETB SETB MOV MOV JNB CLR CLR SJMP TH1, #0 P3.5 TR1 A, TL1 P2, A TF1, Back TR1 TF1 AGAIN ; Chän bé ®Õm 1, chÕ ®é 2, bÝt C/T = xung ; Xoá TH1 ; Lấy đầu vào T1 ; Khởi động đếm ; Lấy số đếm TL1 ; Đưa TL1 hiển thị cỉng P2 ; Duy tr× nã nÕu TF = ; Dừng đếm ; Xoá cờ TF ; Tiếp tục thực Để ý chương trình vai trò lệnh SETB P3.5 cổng thiết lập dành cho đầu 8051 cấp nguồn nên ta muốn P3.5 trở thành đầu vào phải bật lên cao Hay nói cách khác ta phải cấu hình (đưa lên cao) chân T1 8051 (P3.5) phép xung cấp vào nã 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 để đếm lên xung đồng hồ cấp đến chân P3.5 Các xung đồng hồ biểu diễn số người qua cổng số vòng quay kiện khác mà chuyển đổi thành xung Trong ví dụ 9.19 ghi TL chuyển đổi mà ASCII để hiển thị LCD CuuDuongThanCong.com https://fb.com/tailieudientucntt Timer exterrnal input Pin 3.4 overflow flag TH0 TL0 TR0 - TF0 goes high when FFFF C/T =1 TF0 Timer exterrnal input Pin 3.5 - overflow flag TH1 TR1 TL1 TF1 TF1 goes high when FFFF C/T =1 Hình 9.5: a) Bộ Timer0 với đầu vào (chế độ 1) b) Bộ Timer1 với đầu vào (chế độ 1) Ví dụ 9.19: giả sử xung tần số 1Hz nối tới chân đầu vào P3.4 HÃy viét chương trình hiển thị đếm LCD HÃy đặt số ban đầu TH0 - 60 Lời giải: Để hiển thị số đếm TL LCD ta phải thực chuyển đổi giữ liệu bít nhị phân ASCII ACALL MOV MOV SETB SETB MOV ; Gọi chương trình khởi tạo CLD ; Chọn đếm 0, chế độ 2, bÝt C/T = ; §Õm 60 xung ; LÊy đầu vào T0 AGAIN: ; Sao chép số đếm TL0 BACK: ; Gọi chương trình để chuyển đổi c¸c ghi R2, R3, R4 ACALL CONV ; Gäi chương trình hiển thị LCD ACALL DISLAY ; Thực vòng lặp TF = JNB TF0, BACK ; Dừng đếm CLR TR0 ; Xoá cê TF0 = CLR TF0 ; TiÕp tôc thùc SJMP AGAIN ; Việc chuyển đổi nhị phân mà ASCII trả liệu ASCII có ghi R4, R3, R2 (R2 cã LSD) - ch÷ sè nhá nhÊt CONV: MOV B, #10 ; Chia cho 10 DIV AB MOV R2, B ; Lu gi÷ sè thÊp MOV B, #10 ; Chia cho 10 mét lÇn DIV AB ORL A, #30H ; Đổi ASCII MOV R4, A ; Lu 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 ; Lu nã MOV A, R2 ORL A, #30H ; §ỉi sè thø ba vỊ ASCII MOV R2, A ; Lu sè ASCII vµo R2 RET CuuDuongThanCong.com LCD-SET UP TMOD, #000110B TH0, # - 60 P3.4 TR0 A, TL0 https://fb.com/tailieudientucntt 8051 to LEDs P1 Hz clock T0 P3.4 Sö dụng tần số 60Hz ta tạo giây, phút, Lưu ý vòng đầu tiên, RESET TL0 = 0; Để giải vấn đề hÃy nạp TL0 với giá trị - 60 đầu chương trình Timer0 exterrnal input Pin 3.4 - C/T =1 overflow flag TL0 TR0 TH0 TF0 reload TF0 goes high when FF Timer01e xterrnal input Pin 3.5 - overflow flag TL1 C/T =1 TR1 TH1 TF1 reload TF1 goes high when FF Hình 9.6: Bộ Timer0 với đầu vào (chế độ 2) Hình 9.7: Bộ Timer0 với đầu vào (chế độ 2) Như ví dụ ứng dụng khác định thời gian với bít C/T = 1, ta nạp sóng vuông với tần số 60Hz vào định thời Chương trình tạo đơn vị thời gian chuẩn theo giây, phút, Từ đầu vào ta hiển thị lên LCD Đây đồng hồ số tuyệt vời không thật xác Ví dụ cã thĨ t×m thÊy ë phơ lơc Appendix E Tríc kết thúc chương ta cần nhắc lại hai vÊn ®Ị quan träng Chóng ta cã thĨ nghÜ công dụng lệnh JNB TFx, đích để hiển thị mức cao cờ TF lÃng phí thời gian BVĐK Điều có giải pháp cho vấn đề sử dụng ngắt Khi sử dụng ngắt ta thực công việc khác với BVĐK Khi cờ TF bật báo cho ta biết điểm quan trọng mạnh 8051 (mà ta bàn chương 11) Chúng ta muốn biết ghi TR0 TR1 thuộc đâu Chóng thc vỊ mét ghi gäi lµ TCON m· ban sau (TCON - ghi điều khiển đếm (bộ định thời)) Bảng 9.2: Các lệnh tương đương ghi điều khiển đị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 CuuDuongThanCong.com https://fb.com/tailieudientucntt CLR TR1 = CLR TCON.6 SETB TF1 = SETB TCON.7 CLR TF1 = CLR TCON.7 9.2.2 Thanh ghi TCON Trong ví dụ ta đà thấy công dụng cờ TR0 TR1 để bật/ tắt định thời Các bÝt nµy lµ mét bé phËn cđa ghi TCON (điều khiển định thời) Đây ghi bít, bảng 9.2 bốn bít dùng để lưu cất bít TF TR cho Timer0 Timer1 Còn bốn bít thấp thiết lập dành cho điều khiển bít ngắt mà ta bàn chương 11 Chúng ta phải lưu ý ghi TCON ghi đánh địa theo bít Nên ta thay lệnh SETB TR1 CLR TR1 lệnh tương ứng SET TCON.6 CLR TCON.6 (Bảng 9.2) 9.3 Trường hợp bít GATE = TMOD Tríc kÕt thóc ch¬ng ta cần bàn thêm trường hơpợ bít GATE = 1trong ghi TMOD Tất vừa nói chương giả thiết GATE = Khi GATE = định thời khởi động lệnh SETB TR0 SETB TR1 Timer0 Timer1 tương ứng Vậy điều x¶y bÝt GATE = 1? Nh ta cã thể nhìn thây hình 9.8 9.9 GATE = việc khởi động dừng định thời thực từ bên qua chân P2.3 P3.3 Timer0 Timer1 tương ứng Mặc TRx bật lên lệnh SETB TRx cho phép ta khởi động dừng định thời từ bên thời điểm 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 khởi ®éng bé ®Þnh thêi cã thĨ cã rÊt nhiỊu ứng dụng Ví dụ, chẳng hạn 8051 dùng sản phẩm phát báo động giây dùng Timer0 theo nhiều việc khác Bộ Timer0 bật lên phần mềm qua lệnh SETB TR0 nằm kiểm soát người dùng sản phẩm Tuy nhiên, nối công tắc chuyển mạch tới chân P2.3 ta dừng khởi động định thời gian cách để tắt báo động XTAL oscillator ¸12 C/T = T0 Pin Pin 3.4 C/T =1 TR0 Gate INTO Pin Pin 3.2 H×nh 9.8: Bé định thời/ đếm CuuDuongThanCong.com https://fb.com/tailieudientucntt XTAL oscillator á12 C/T = T1 Pin Pin 3.5 C/T =1 TR0 Gate INT1 Pin Pin 3.3 Hình 9.9: Bộ định thời/ bé ®Õm CuuDuongThanCong.com https://fb.com/tailieudientucntt ... đà sử dụng định thời 8051 để tạo độ trễ thời gian Các định thời dùng đếm kiện xảy bên 8051 Công dụng đếm/ định thời đếm kiện tình bày phần Chừng liên quan đến công dụng củ định thời đếm kiện vấn... mà ta nói lập trình định thời phần trước áp dụng cho việc lập trình đếm ngoại trừ nguồn tần số Đối với định thời/ đếm dùng định thời nguồn tần số tần số thạch anh 8051 Tuy nhiên, dùng đếm nguồn... độ thiết lập theo trạng thái M1 M0 sau: M1 M0 ChÕ ®é 0 1 1 Chế độ hoạt động Bộ định thời 13 bít gồm bít định thời/ đếm bít đặt trước Bộ định thời 16 bít (không có đặt trước) Bộ định thời bít