Giáo trình Kỹ thuật vi điều khiển (Trình độ: Trung cấp) - Trường Cao đẳng nghề Vĩnh Long

Câu hỏi ôn tập BÀI TẬP ỨNG DỤNG Bài 1: Hãy viết chương trình điều khiển tạo xung 1 Hz (sử dụng Timer) tại chân P1.0 và hiển thị mức logic tại chân này lên LED. Tự lựa chọn phương pháp kết nối LED. Bài 2: Hãy viết chương trình điều khiển tạo xung 3 Hz (sử dụng Timer) tại chân P1.0 và hiển thị mức logic tại chân này lên LED. Tự lựa chọn phương pháp kết nối LED. Bài 3: Hãy viết chương trình điều khiển tạo xung 1 Hz hoặc 3 Hz (sử dụng Timer) tại chân P1.0 tùy thuộc vào ta nhấn hay nhả nút nhấn KEY0 và hiển thị mức logic tại chân này lên LED. Tự lựa chọn phương pháp kết nối LED và nút nhấn. Bài 4: Hãy viết chương trình điều khiển đếm liên tục số lượng xung được đưa vào chân T0 của vi điều khiển và hiển thị số lượng xung này lên các LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo xung và các LED 7 đoạn. Bài 5: Hãy viết chương trình điều khiển đo tần số của xung (đơn vị tính là Hz) được đưa vào chân T0 của vi điều khiển và hiển thị giá trị tần số lên LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo xung và các LED 7 đoạn. Bài 6: Hãy viết chương trình điều khiển đo độ rộng xung (đơn vị tính là ms) được đưa vào chân T0 của vi điều khiển và hiển thị giá trị độ rộng xung lên LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo xung và các LED 7 đoạn.

pdf145 trang | Chia sẻ: Tiểu Khải Minh | Ngày: 21/02/2024 | Lượt xem: 82 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Kỹ thuật vi điều khiển (Trình độ: Trung cấp) - Trường Cao đẳng nghề Vĩnh Long, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
cao/số thấp. MOV R7, B ; Lưu giá trị hàng đơn vị vào R7. MOV B, #10 ; Nạp (B) = 10. DIV AB ; Chia cho 10, tách lấy số cao/số thấp. MOV R6, B ; Lưu giá trị hàng chục vào R6. MOV R5, A ; Lưu giá trị hàng trăm vào R5. Ví dụ 20: Viết đoạn lệnh đọc và kiểm tra các giá trị tại Port 1 xem có chứa giá trị 45H hay không? Nếu (P1) = 45H thì xuất giá trị 99H ra Port 2, ngược lại thì thoát khỏi đoạn lệnh. Giải MOV P2, #00H ; Xoá P2, (P2) = 0. MOV P1, #0FFH ; Cấu hình P1 là port nhập. MOV R0, #45H ; Nạp (R0) = 45H, giá trị cần kiểm tra. MOV A, P1 ; Đọc dữ liệu từ P1. XRL A, R0 ; Kiểm tra dữ liệu có bằng 45H, nếu bằng JNZ EXIT ; thì (A) = 0, không bằng thì (A) ≠ 0. MOV P2, #99H ; Nạp (P2) = 99H nếu (P1) = 45H. EXIT: Ví dụ 21: Viết đoạn lệnh để lấy "bù 2" của giá trị chứa trong thanh ghi R0. Giải MOV A, R0 ; Nạp dữ liệu cần lấy bù vào A. CPL A ; Lấy bù 1. ADD A, #1 ; Cộng thêm 1 để được bù 2. Ví dụ 22: 97 Viết đoạn lệnh kiểm tra thanh ghi A xem có chứa giá trị 99H hay không? Nếu (A) = 99H thì nạp giá trị FFH vào thanh ghi R1, ngược lại thì nạp giá trị 00H vào thanh ghi R1. Giải MOV R1, #0 ; Nạp (R0) = 00H. CJNE A, #99H, NEXT ; So sánh A với giá trị 99H, nếu không ; bằng thì nhảy đến NEXT. MOV R1, #0FFH ; Nạp (R0) = FFH nếu (A) = 99H. NEXT: Ví dụ 23: Giả sử giá trị nhiệt độ đọc được từ một cảm biến nhiệt được đưa tới ngõ vào Port 1 (dạng số nhị phân 8 bit). Hãy viết đoạn lệnh đọc nhiệt độ này và so sánh với giá trị nhiệt độ chuẩn 75. Dựa vào kết quả so sánh để đặt giá trị nhiệt độ này vào các thanh ghi như sau: Nếu t = 75OC thì (A) = 75. Nếu t < 75OC thì (R1) = t. Nếu t > 75OC thì (R2) = t. Giải MOV P1, #0FFH ; Cấu hình P1 là port nhập. MOV A, P1 ; Đọc dữ liệu (t) từ P1. CJNE A, #75, OVER ; So sánh dữ liệu (t) với giá trị 75, nếu ; không bằng thì nhảy đến OVER. SJMP EXIT ; Nếu (A) = 75 thì thoát chương trình. OVER: ; Trường hợp khi dữ liệu (t) khác 75. JNC NEXT ; Nhảy đến NEXT nếu dữ liệu (t) > 75, (C) = 0. MOV R1, A ; Nếu dữ liệu (t) < 75 thì nạp dữ liệu vào SJMP EXIT ; R1 (R1 = A = t) và thoát chương trình. NEXT: ; Trường hợp khi dữ liệu (t) > 75. MOV R2, A ; Nạp dữ liệu vào R2 (R2 = A = t). EXIT: Ví dụ 24: Viết đoạn lệnh liên tục kiểm tra giá trị tại Port 1 nếu giá trị này khác 63H. Còn trường hợp nếu (P1) = 63H thì thoát đoạn lệnh không kiểm tra nữa. Giải MOV P1, #0FFH ; Cấu hình P1 là port nhập. HERE: MOV A, P1 ; Đọc dữ liệu từ P1. 98 CJNE A, #63H, HERE ; Duy trì kiểm tra đến khi (P1) = 63H. Ví dụ 25: Giả sử các ô nhớ của RAM bên trong có địa chỉ từ 40H – 44H chứa nhiệt độ của các ngày được chỉ ra dưới đây. Hãy viết đoạn lệnh kiểm tra xem có giá trị nào bằng 35 không? Nếu có thì đặt địa chỉ của ô nhớ đó vào R4, ngược lại thì làm cho R4 = 0. (40H) = 46, (41H) = 49, (42H) = 39, (43H) = 35, (44H) = 34 Giải MOV R4, #0 ; Xoá (R4) = 0. MOV R0, #40H ; Nạp địa chỉ bắt đầu chứa trong RAM. MOV R1, #5 ; Nạp giá trị bộ đếm (số lượng ô nhớ). MOV A, #35 ; Nạp giá trị cần tìm vào A, (A) = 35. BACK: CJNE A, @R0, NEXT ; So sánh dữ liệu do R0 trỏ đến với 35. MOV R4, R0 ; Nếu bằng thì lưu địa chỉ ô nhớ đó vào R4. SJMP EXIT ; Thoát chương trình. NEXT: ; Trường hợp dữ liệu do R0 trỏ đến khác 35. INC R0 ; Tăng con trỏ đến ô nhớ kế tiếp. DJNZ R2, BACK ; Lặp lại cho đến khi bộ đếm bằng 0. EXIT: Ví dụ 26: Viết đoạn lệnh tìm tổng các chữ số 1 trong thanh ghi R0. Giải MOV R1, #0 ; Xoá (R1) = 0, lưu số chữ số 1. MOV R2, #8 ; Nạp giá trị bộ đếm (số bit kiểm tra). MOV A, R0 ; Nạp dữ liệu cần kiểm tra từ R0 vào A. LOOP: RLC A ; Xoay trái, đưa bit cần kiểm tra vào cờ CY. JNC NEXT ; Kiểm tra cờ CY. INC R1 ; Tăng giá trị của R1 nếu cờ (CY) = 1. NEXT: DJNZ R2, LOOP ; Lặp lại cho đến khi bộ đếm bằng 0. Ví dụ 27: Viết đoạn lệnh để chuyển đổi số BCD nén chứa trong thanh ghi A thành hai số mã ASCII và chứa hai số này trong thanh ghi R2 và R3. Giải MOV A, #29H ; Nạp (A) = 29H, mã BCD nén của số 29. MOV R2, A ; Lưu lại số BCD cần chyển đổi trong R2. 99 ANL A, #0FH ; Xoá (che) 4 bit cao của số BCD – (A) = 09H. ORL A, #30H ; Chuyển thành mã ASCII – (A) = 39H. MOV R3, A ; Cất vào R3 ((R3) = 39H – mã ASCII của 9). MOV A, R2 ; Lấy lại số BCD lúc ban đầu – (A) = 29H. ANL A, #0F0H ; Xoá (che) 4 bit thấp của số BCD – (A) = 20H. SWAP A ; Hoán chyển vị trí 4 bit cao vẫp bit thấp. ORL A, #30H ; Chuyển thành mã ASCII – (A) = 32H. MOV R2, A ; Cất vào R2 ((R2) = 32H – mã ASCII của 2). Ví dụ 28: Giả sử bit P2.3 là một đầu vào và biểu diễn nhiệt độ của một lò nhiệt. Nếu (P2.3) = 1 có nghĩa là lò quá nóng. Hãy liên tục kiểm tra bit này, nếu nhiệt độ quá cao thì hãy gửi một xung mức cao đến P1.5 để bật còi báo hiệu. Giải JNB P2.3, $ ; Duy trì kiểm tra đầu vào. SETB P1.5 ; Khi (P2.3) = 1, tạo mức cao cho P1.5 rồi CLR P1.5 ; tạo mức thấp cho P1.5, phát một xung. Ví dụ 29: Viết đoạn lệnh kiểm tra xem thanh ghi A có chứa một số chẵn hay không? Nếu có thì chia cho 2, nếu không thì tăng lên 1 để chẵn hoá số đó rồi chia nó cho 2. Giải MOV B, #2 ; Gán số chia, (B) = 2. JNB ACC.0, OK ; Kiểm tra nếu là số chẵn thì nhảy đến OK. INC A ; Chẵn hoá nếu là số lẻ. OK: DIV AB ; Chia A cho 2. Câu hỏi ôn tập 1. Trình bày các cách định địa chỉ 2. Tốc độ baud là gì? 100 BÀI 4: BỘ ĐỊNH THỜI Mục tiêu: - Trình bày được cấu tạo và các chế độ làm việc của bộ định thời 8051 theo nội dung đã học; - Thực hiện khởi tạo bộ nhớ đúng yêu cầu kỹ thuật; - Thực hiện đọc bộ định thời trong khi hoạt động đúng yêu cầu kỹ thuật; - Thực hiện lập trình điều khiển dùng bộ định thời đúng yêu cầu kỹ thuật . Nội dung: 1. Mở đầu ❖ Tần số: tần số xung ngõ ra bằng tần số xung ngõ vào chia cho 2N. ❖ Giá trị: giá trị nhị phân trong các FF của bộ định thời là số đếm của các xung clock tại ngõ vào từ khi bộ định thời bắt đầu đếm. ❖ Tràn: xảy ra hiện tượng tràn (cờ tràn = 1) khi số đếm chuyển từ giá trị lớn nhất xuống giá trị nhỏ nhất của bộ định thời. Ví dụ: Bộ định thời 16 bit (chứa 16 FF bên trong). ❖ Tần số: 65536 162 IN f IN f OUT f == ❖ Giá trị: số đếm nằm trong khoảng 0 (0000H) → 65535 (FFFFH). ❖ Tràn: cờ tràn bằng 1 khi số đếm từ FFFFH chuyển xuống 0000H. ❖ Hình minh họa đơn giản hoạt động của bộ định thời 3 bit: 101 Hoạt động của một bộ định thời 3 bit đơn giản được minh họa trong hình trên. Mỗi một tầng là D FF kích khởi cạnh âm hoạt động như một mạch chia 2 do ta nối ngõ ra Q với ngõ vào D. Flipflop cờ (Flag FF) là một mạch chốt D được set bằng 1 bởi tầng cuối của bộ định thời. Giản đồ thời gian cho thấy tầng thứ nhất (Q0) chia 2 tần số xung clock, tầng thứ hai (Q1) chia 4 tần số xung clock, Số đếm được ghi ở dạng thập phân và được kiểm tra dễ dàng bằng cách khảo sát trạng thái của 3 flipflop. Ví dụ, số đếm là 4 xuất hiện khi Q2 = 1, Q1 = 0, Q0 = 0. Các flipflop ở trên là các flipflop tác động cạnh âm (nghĩa là trạng thái của các flipflop sẽ thay đổi theo cạnh âm của xung clock). Khi số đếm tràn từ 111 xuống 000, ngõ ra Q2 có cạnh âm làm cho trạng thái của flipflop cờ đổi từ 0 lên 1 (ngõ vào D của flipflop này luôn luôn ở logic 1). ❖ Ứng dụng định thời gian (TIMER): bộ định thời được lập trình sao cho sẽ tràn sau một khoảng thời gian đã qui định và khi đó cờ tràn của bộ định thời sẽ bằng 1. ❖ Ứng dụng đếm sự kiện (COUNTER): để xác định số lần xuất hiện của một kích thích từ bên ngoài tới một chân của chip 8051 (kích thích là sự chuyển trạng thái từ 1 xuống 0). ❖ Ứng dụng tạo tốc độ baud cho port nối tiếp: xem thêm trong phần “Hoạt động port nối tiếp.”. 102 2. Thanh ghi SFR của timer 2.1.Thanh ghi chế độ TMOD - Thanh ghi THx/TLx. ❖ TL0: Chứa byte thấp của bộ định thời 0. ❖ TL1: Chứa byte thấp của bộ định thời 1. ❖ TH0: Chứa byte cao của bộ định thời 0. ❖ TH0: Chứa byte cao của bộ định thời 1. ❖ Thanh ghi TMOD (Timer Mode Register) chứa các bit dùng để thiết lập chế độ hoạt động cho bộ định thời 0 và bộ định thời 1. ❖ Thanh ghi TMOD được nạp giá trị một lần tại thời điểm bắt đầu của chương trình để qui định chế độ hoạt động của các bộ định thời. ❖ Cấu trúc thanh ghi TMOD: ❖ Các chế độ hoạt động của bộ định thời: 103 Ví dụ 1: Cho biết giá trị cần nạp cho thanh ghi TMOD để ❖ Timer 0: là bộ định thời gian 16 bit, được điều khiển bằng phần mềm (bit TR0). ❖ Timer 1: là bộ đếm xung 13 bit, được điều khiển bằng phần cứng (chân 1INT ). Giải Phân tích: (1): Chế độ 16 bit.  M1 = 0, M0 = 1. (2): Bộ định thời gian.  TC / = 0. (3): Điều khiển bằng phần mềm.  GATE = 0. (4): Chế độ 13 bit.  M1 = 0, M0 = 0. (5): Bộ đếm xung.  TC / = 1. (6): Điều khiển bằng phần cứng.  GATE = 1. Từ đó ta có: (TMOD) = 11000001B = C1H. Ví dụ 2: Cho biết giá trị cần nạp cho thanh ghi TMOD để ❖ Timer 0: không sử dụng. ❖ Timer 1: là bộ định thời gian 8 bit tự nạp lại, được điều khiển bằng phần mềm (bit TR1). Giải Phân tích: (1): Không sử dụng.  M1 = 0, M0 = 0. (2): Không sử dụng.  TC / = 0. (3): Không sử dụng.  GATE = 0. Do Timer 0 không sử dụng, nên ta có thiết lập nó ở bất cứ chế độ nào. Thông thường để dễ dàng ta nên cho: GATE=0, TC / = 0, M1 = 0 và M0 = 0. (4): Chế độ 8 bit tự động nạp lại.  M1 = 1, M0 = 0. (5): Bộ định thời gian.  TC / = 0. (6): Điều khiển bằng phần mềm.  GATE = 0. 104 Từ đó ta có: (TMOD) = 00100000B = 20H. Ví dụ 3: Cho biết (TMOD) = A5H. Hãy cho biết chế độ hoạt động của các Timer 0 và Timer 1. Giải Ta có: (TMOD) = A5H = 10100101B. Giải thích: M1 = 1, M0 = 0.  (4): Chế độ 8 bit tự động nạp lại. TC / = 0.  (5): Bộ định thời gian. GATE = 1.  (6): Điều khiển bằng phần cứng. M1 = 0, M0 = 1.  (1): Chế độ 16 bit. TC / = 1.  (2): Bộ đếm xung. GATE = 0.  (3): Điều khiển bằng phần mềm. Từ đó ta có: o Timer 0: là bộ đếm xung 16 bit, được điều khiển bằng phần mềm (bit TR0). o Timer 1: là bộ định thời gian 8 bit tự nạp lại, được điều khiển bằng phần cứng (chân 1INT ). Ví dụ 4: Cho biết (TMOD) = 21H. Hãy cho biết chế độ hoạt động của các Timer 0 và Timer 1. Giải Ta có: (TMOD) = 21H = 00100001B. Giải thích: 105 M1 = 1, M0 = 0.  (4): Chế độ 8 bit tự động nạp lại. TC / = 0.  (5): Bộ định thời gian. GATE = 0.  (6): Điều khiển bằng phần mềm. M1 = 0, M0 = 1.  (1): Chế độ 16 bit. TC / = 0.  (2): Bộ định thời gian. GATE = 0.  (3): Điều khiển bằng phần mềm. Từ đó ta có: ❖ Timer 0: là bộ định thời gian 16 bit, được điều khiển bằng phần mềm (bit TR0). ❖ Timer 1: là bộ định thời gian 8 bit tự nạp lại, được điều khiển bằng phần mềm (bit TR1). 2.2. Thanh ghi điều khiển TCON ❖ Thanh ghi TCON (Timer Control Register) chứa các bit dùng để điều khiển và báo trạng thái của bộ định thời 0 và bộ định thời 1. ❖ Cấu trúc thanh ghi TCON: 106 ❖ Lưu ý:Các bit IT0, IT1, IE0, IE1 không dùng để điều khiển các bộ định thời. Các bit này được dùng để phát hiện và khởi động các ngắt ngoài. Việc thảo luận các bit này sẽ được trình bày trong “Hoạt động ngắt.”. 3. Các chế độ làm việc 3.1.Chế độ Timer 13 bit Chế độ 0 (Mode 0): ❖ Chế độ định thời 13 bit. ❖ Sử dụng 8 bit của thanh ghi THx và 5 bit thấp của thanh ghi TLx để tạo ra bộ định thời. ❖ Số đếm: 0000H → 1FFFH nghĩa là từ 0 → 8191. Thời gian định thời: từ 1.TTimer→ 213.TTimer nghĩa là từ 1.TTimer → 8192.TTimer. ❖ Thanh ghi THx và TLx chứa giá trị của bộ định thời. ❖ Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong THx/TLx. ❖ Xảy ra tràn (cờ tràn TFx=1) khi số đếm chuyển từ 1FFFH sang 0000H và việc đếm sẽ tiếp tục đếm lên từ giá trị 0000H. Hình 0.2: Kiến trúc của Timer 0 ở chế độ 0 (Mode 0). 107 3.2.Chế độ Timer 16 bit - Chế độ định thời 16 bit (Chế độ 1): Chế độ 1 (Mode 1): ❖ Chế độ định thời 16 bit. ❖ Sử dụng thanh ghi THx và TLx để tạo ra bộ định thời. ❖ Số đếm: 0000H → FFFFH nghĩa là từ 0 → 65535. Thời gian định thời: từ 1.TTimer→ 216.TTimer nghĩa là từ 1.TTimer→ 65536.TTimer. ❖ Thanh ghi THx và TLx chứa giá trị của bộ định thời. ❖ Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong THx/TLx. ❖ Xảy ra tràn (cờ tràn TFx=1) khi số đếm chuyển từ FFFFH sang 0000H và việc đếm sẽ tiếp tục đếm lên từ giá trị 0000H. Hình 0.3: Kiến trúc của Timer 0 ở chế độ 1 (Mode 1). - Chế độ định thời 8 bit tự nạp lại (Chế độ 2): 108 Chế độ 2 (Mode 2): ❖ Chế độ định thời 8 bit tự nạp lại. ❖ Sử dụng thanh ghi TLx để tạo ra bộ định thời. ❖ Số đếm: 00H → FFH nghĩa là từ 0 → 255. Thời gian định thời: từ 1.TTimer→ 28.TTimer nghĩa là từ 1.TTimer→ 256.TTimer. ❖ Thanh ghi TLx chứa giá trị của bộ định thời và thanh ghi THx chứa giá trị sẽ được dùng để nạp lại cho bộ định thời. ❖ Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong TLx (THx không thay đổi giá trị). ❖ Xảy ra tràn (cờ tràn TFx=1) khi số đếm chuyển từ FFH sang 00H, đồng thời giá trị trong THx sẽ được nạp vào TLx và việc đếm sẽ tiếp tục đếm lên từ giá trị chứa trong thanh ghi TLx (giá trị này bằng với giá trị của THx). Hình 0.4: Kiến trúc của Timer 0 ở chế độ 2 (Mode 2). 3.4.Chế độ tách biệt Timer - Chế độ định thời chia xẻ (Chế độ 3): 109 Chế độ 3 (Mode 3) là: ❖ Chế độ định thời chia xẻ. ❖ Bộ định thời 0 được chia ra: • Bộ định thời 8 bit thứ I: • Sử dụng thanh ghi TL0 để tạo ra bộ định thời. • Số đếm: 00H → FFH nghĩa là từ 0 → 255. Thời gian định thời:từ 1.TTimer→ 28.TTimer nghĩa là từ 1.TTimer→ 256.TTimer. • Thanh ghi TL0 chứa giá trị của bộ định thời. • Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong TL0. • Xảy ra tràn (cờ tràn TF0=1) khi số đếm chuyển từ FFH sang 00H và việc đếm sẽ tiếp tục đếm lên từ giá trị 00H. • Bộ định thời 8 bit thứ II: • Sử dụng thanh ghi TH0 để tạo ra bộ định thời. • Số đếm: 00H → FFH nghĩa là từ 0 → 255. Thời gian định thời:từ 1.TTimer→ 28.TTimer nghĩa là từ 1.TTimer→ 256.TTimer. • Thanh ghi TH0 chứa giá trị của bộ định thời. • Khi có xung clock, bộ định thời bắt đầu đếm lên từ giá trị chứa trong TH0. • Xảy ra tràn (cờ tràn TF1=1) khi số đếm chuyển từ FFH sang 00H và việc đếm sẽ tiếp tục đếm lên từ giá trị 00H. ❖ Bộ định thời 1: • Là bộ định thời 16 bit. • Không hoạt động ở chế độ 3 nhưng có thể hoạt động các chế độ khác (chế độ 0, 1, 2). 110 • Không có cờ báo tràn như các bộ định thời khác. Hình 0.5: Kiến trúc của Timer 0 ở chế độ 3 (Mode 3). 4. Nguồn cung cấp xung cho Timer Nguồn xung cho bộ định thời được tạo ra từ: ❖ Mạch dao động trên chip→ dùng cho tính năng định thời gian. ❖ Xung kích thích bên ngoài→ dùng cho tính năng đếm sự kiện. 4.1.Chức năng định thời Trường hợp định thời gian: Nếu C/T=0 thì: ❖ Bộ định thời được dùng để định thời gian (Timer). ❖ Nguồn xung clock định thời được lấy từ mạch dao động trên chip. Lưu ý: • Tần số xung clock cung cấp cho bộ định thời bằng 1/12 tần số của mạch dao động trên chip 8051. 111 • Thời gian định thời là khoảng thời gian được tính từ lúc bộ định thời bắt đầu đếm lên (từ giá trị chứa trong các thanh ghi THx/TLx) cho đến lúc bộ định thời bắt đầu tràn (thời gian này phụ thuộc vào giá trị ban đầu được nạp cho các thanh ghi THx và TLx). Ví dụ: Tìm tần số xung clock và chu kỳ của bộ định thời đối với trường hợp các hệ thống vi điều khiển xây dựng trên chip 8051 với tần số thạch anh như sau: 11,0592 MHz, 12 MHz và 16 MHz. Giải Gọi fTIMER là tần số xung clock của bộ định thời, fOSC là tần số xung clock của thạch anh. Theo như trên đã trình bày, ta có: ( ) ( ) ( ) ( ) ( )s KHz TIMER fTIMER T KHz MHzOSC f TIMER fMHz OSC f 085,1 6,921 11 6,921 12 0592,11 12 0592,11 === ===→= ( ) ( ) ( ) ( ) ( )s MHz TIMER fTIMER T MHz MHzOSC f TIMER fMHz OSC f 1 1 11 1 12 12 12 12 === ===→= ( ) ( ) ( ) ( ) ( )s MHz TIMER fTIMER T MHz MHzOSC f TIMER fMHz OSC f 75,0 333,1 11 333,1 12 16 12 16 === ===→= 4.2.Chức năng đếm sự kiện ❖ Trường hợp đếm sự kiện: Nếu C/T=1 thì: ❖ Bộ định thời được dùng để đếm sự kiện (Counter). 112 ❖ Nguồn xung clock định thời được lấy từ xung kích thích bên ngoài tại hai chân T0 và T1 của chip 8051. Lưu ý: • Tần số kích thích tối đa cho phép tại chân T0 và T1: 2)(1,0 TIMER f MAXTT f = fTIMER: tần số xung clock định thời. fT0,T1(MAX): tần số kích thích tối đa cho phép tại T0 và T1. Ví dụ: Tính tần số kích thích tối đa cho phép tại chân T0 và T1 đối với trường hợp các hệ thống vi điều khiển xây dựng trên chip 8051 với tần số thạch anh như sau: 11,0592 MHz, 12 MHz và 16 MHz. Giải ( ) ( ) ( )KHz KHzTIMER f MAXTT fMHz OSC f 8,460 2 6,921 2)(1,0 0592,11 ===→= ( ) ( ) ( )KHz MHzTIMER f MAXTT fMHz OSC f 500 2 1 2)(1,0 12 ===→= ( ) ( ) ( )KHz MHzTIMER f MAXTT fMHz OSC f 5,666 2 333,1 2)(1,0 16 ===→= • Số lượng sự kiện (số xung) mà bộ định thời đếm được sẽ được chứa trong các thanh ghi THx/TLx, giá trị trong các thanh ghi này sẽ tăng theo mỗi xung kích thích bên ngoài tại T0 và T1 của chip 8051. Một kích thích được gọi là một sự kiện (một xung) khi xảy ra sự chuyển trạng thái từ 1 xuống 0 ở chân T0 hoặc T1. 5. Khởi động, dừng, điều khiển Timer Các bước cơ bản để khởi động Timer: ❖ Chọn chế độ hoạt động cho Timer, cho bit GATE=0 và C/T=0: MOV TMOD, #...(1) ❖ Chọn giá trị thích hợp (khoảng thời gian định thời) cho Timer: MOV THx, #...(2) MOV TLx, #...(3) ❖ Cho Timer chạy: SETB TRx ❖ Kiểm tra cờ báo tràn (kiểm tra đủ thời gian định thời): JNB TFx, $ 113 hoặc WAIT: JNB TFx, WAIT ❖ Xóa cờ báo tràn (chuẩn bị cho lần định thời tiếp theo): CLR TFx ❖ Dừng Timer (sau khi đã hoàn tất quá trình định thời): CLR TRx Lưu ý: x: Số thứ tự của Timer sử dụng. (1): Giá trị này phụ thuộc vào Timer được chọn và chế độ hoạt động của Timer đó. (2), (3): Giá trị này phụ thuộc vào khoảng thời gian cần định thời. Cũng cần lưu ý thêm, việc chọn giá trị cho không phải lúc nào ta cũng phải chọn giá trị cho cả hai thanh ghi này mà nó tùy thuộc vào từng chế hoạt động của Timer (Mode 0: THx/TLx, Mode 1: THx/TLx, Mode 2: THx, Mode 3: THx hoặc TLx). Các giá trị trên phải thoả mãn điều kiện sau: ❖ Chế độ 8 bit: giá trị trong khoảng từ -255 đến -1 (tương ứng từ 255.TTIMER đến 1.TTIMER). Ví dụ: MOV TH1, #(-255)→ định thời 255.TTIMER ❖ Chế độ 13 bit: giá trị trong khoảng từ -8191 đến -1 (tương ứng từ 8191.TTIMER đến 1.TTIMER). Ví dụ: MOV TL1, #LOW(-8000)→ định thời 8000.TTIMER MOV TH1, #HIGH(-8000) ❖ Chế độ 16 bit: giá trị trong khoảng từ -65535 đến -1 (tương ứng từ 65535.TTIMER đến 1.TTIMER). Ví dụ: MOV TL1, #LOW(-10000)→ định thời 10000.TTIMER MOV TH1, #HIGH(-10000) Trường hợp đặc biệt nếu giá trị (N) nạp vào thanh ghi THx/TLx là giá trị 0 thì thời gian định thời sẽ là lớn nhất cho từng chế độ. ❖ Chế độ 8 bit: N = 0 → tDELAY = 256.TTIMER. ❖ Chế độ 13 bit: N = 0 → tDELAY = 8192.TTIMER. ❖ Chế độ 16 bit: N = 0 → tDELAY = 65536.TTIMER. 6. Khởi tạo và truy xuất thanh ghi Timer Các bước cơ bản để khởi động Counter: ❖ Chọn chế độ hoạt động cho Counter, cho bit GATE=0 và C/T=1: MOV TMOD, #...(1) 114 ❖ Xoá các giá trị chứa trong thanh ghi THx và TLx (nghĩa là cho số xung ban đầu bằng 0): MOV THx, #00H MOV TLx, #00H ❖ Cho Counter chạy: SETB TRx ❖ Kiểm tra cờ báo tràn (kiểm tra số đếm bị tràn) để xử lý trường hợp số đếm bị tràn. ❖ Xóa cờ báo tràn (sau khi đã xử lý cho trường hợp số đếm bị tràn): CLR TFx ❖ Dừng Counter (sau khi đã hoàn tất quá trình đếm xung): CLR TRx ❖ Đọc số xung đếm được trong thanh ghi THx và TLx. Lưu ý: x: Số thứ tự của Counter sử dụng. (1): Giá trị này phụ thuộc vào Counter được chọn và chế độ hoạt động của Counter. Giá trị này phải thoả mãn điều kiện sau: ❖ Chế độ 8 bit: số lượng xung tối đa mà Counter đếm được từ 0 đến 255. ❖ Chế độ 13 bit: số lượng xung tối đa mà Counter đếm được từ 0 đến 8191. ❖ Chế độ 16 bit: số lượng xung tối đa mà Counter đếm được từ 0 đến 65535. Trong quá trình đọc số xung đếm được chứa trong các thanh ghi THx/TLx ta phải chú ý đến trường hợp Counter bị tràn. Vì khi đó giá trị trong thanh ghi THx/TLx (nơi chứa số xung đếm được) sẽ trở về 0. Cho nên nếu ta không có biện pháp xử lý cho trường hợp này thì kết quả là số xung mà ta nhận được sẽ bị sai. Vì thế, nếu ta giả sử ban đầu Counter được khởi động với giá trị là 0 thì cứ mỗi lần Counter bị tràn thì ta phải cộng thêm vào số xung đọc về 256 xung (trường hợp 8 bit) hoặc 8192 xung (trường hợp 13 bit) hoặc 65536 xung (trường hợp 16 bit). 7. Timer 2 của 8052 Họ vi điều khiển MCS52 có 3 timer T0, T1, T2. Các timer T0, T1 có các thanh ghi và hoạt động giống như họ 51. Các thanh ghi của timer/counter T2 bao gồm: thanh ghi TL2, TH2, thanh ghi điều khiển T2CON, thanh ghi RCAP2L và RCAP2H. Timer/counter T2 có thể dùng để định thời timer hặc dùng như bộ đếm counter để đếm xung ngoài đưa đến ngõ vào T2 chính là chân P1.0 115 Timer/counter T2 có 3 kiểu hoạt động: tự động nạp lại, thu nhận và thiết lập tốc độ baud phục vụ cho truyền dữ liệu. 8. Bài tập - Sơ đồ nguyên lý. Hình 0.6: Sơ đồ nguyên lý khối LED đơn (Point LED). - Sơ đồ bố trí linh kiện. Hình 0.7: Khối Khối LED đơn (Point LED). BÀI THỰC HÀNH Viết chương trình, mô phỏng và lắp ráp mạch điều khiển 8 LED đơn được nối với Port 0 sáng tắt (có sử dụng bộ đệm đảo) với thời gian trễ là 500ms. - Lưu đồ giải thuật. ❖ Bước 1: Vẽ lưu đồ giải thuật của chương trình điều khiển. GND GND +5V L E D 5 L E D 2 L E D 1 L E D 6 L E D 4 L E D 0 L E D 7 L E D 3 L E D 2 L E D 1 L E D 4 L E D 0 L E D 5 L E D 3 L E D 6 L E D 7 L E D 0 D29 LED L E D 3 D22 LED D23 LED R3 330 1 2 3 4 5 6 7 8 9 D1 LED J1 POWER 1 2 3 D13 LED D4 LED D27 LED J3 BARLED2 1 2 3 4 5 6 7 8 D25 LED D21 LED D19 LED D31 LED D30 LED D12 LED D10 LED D24 LED D7 LED R2 330 1 2 3 4 5 6 7 8 9 D8 LED D26 LED D9 LED R4 330 1 2 3 4 5 6 7 8 9 D15 LED D2 LED D20 LED D14 LED J5 BARLED4 1 2 3 4 5 6 7 8 J2 BARLED1 1 2 3 4 5 6 7 8 D5 LED J4 BARLED3 1 2 3 4 5 6 7 8 D32 LED D3 LED D11 LED R1 330 1 2 3 4 5 6 7 8 9 D16 LED D6 LED D18 LED D17 LED D28 LED L E D 4 L E D 5 L E D 2 L E D 1 L E D 7 L E D 6 VCC VCC VCC VCCVCC L E D 2 L E D 1 L E D 0 L E D 5 L E D 3 L E D 6 L E D 4 L E D 7 116 Hình 0.8: Lưu đồ giải thuật của chương trình. - Chương trình điều khiển. Sử dụng phần mềm Topview Simulation để thực hiện việc viết chương trình và biên dịch, kiểm tra lỗi cú pháp của chương trình. ❖ Bước 2: Khởi động phần mềm Topview Simulation. ❖ Bước 3: Mở chức năng soạn thảo một chương trình mới và đặt tên tập tin chương trình là: A1.ASM ❖ Bước 4: Viết chương trình điều khiển dưới đây vào máy tính. ;*************************************************** ;CHUONG TRINH DIEU KHIEN 8 LED SANG TAT ;*************************************************** ;KET NOI: 8 LED ->PORT0 (CO DEM DAO). ;*************************************************** ORG 00H CHOPTAT: MOV P0,#00H ;LED TAT LCALL DELAY500MS MOV P0,#0FFH ;LED SANG 117 LCALL DELAY500MS SJMP CHOPTAT ;QUAY LAI ;**************************************************** DELAY500MS: ;CHUONG TRINH CON TAO THOI GIAN TRE 500MS PUSH 00H MOV R0,#100 MOV TMOD,#01H LOOP2: MOV TH0,#HIGH(-5000) MOV TL0,#LOW(-5000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 DJNZ R0,LOOP2 POP 00H RET END ❖ Bước 5: Lưu chương trình trên vào máy tính. ❖ Bước 6: Thực hiện biên dịch và kiểm tra lỗi chương trình. • Nếu có bất kỳ lỗi nào xuất hiện thì thực hiện việc hiệu chỉnh khắc phục các lỗi này. Nguyên nhân phát sinh lỗi thông thường do cú pháp của các lệnh không chính xác, cần phải được kiểm tra lại. Sau khi hoàn tất việc hiệu chỉnh sai sót thì quay trở về thực hiện từ Bước 5. • Nếu không có lỗi xuất hiện thì phần mềm sẽ tự động tạo tập tin mã máy với tên là: A1.HEX và thực hiện tiếp theo các phần nội dung dưới đây. - Mô phỏng hoạt động. Sử dụng phần mềm ISIS 7 Professional (Protues 7.10) để thực hiện việc mô phỏng quá trình hoạt động của hệ thống vi điều khiển. ❖ Bước 7: Khởi động phần mềm ISIS 7 Professional (Protues 7.10). ❖ Bước 8: Vẽ sơ đồ thiết kế mạch mô phỏng điều khiển LED đơn như Hình 4.5.4 dưới đây. 118 Hình 0.9: Sơ đồ nguyên lý mô phỏng hệ thống điều khiển.  Mạch mô phỏng này đã được thiết kế sẵn và lưu trong máy tính với tên tập tin là: A-8LED.DSN. Vì thế người học có thể tự vẽ thiết kế mạch mô phỏng hoặc lấy mạch mô phỏng có sẵn trong cơ sở dữ liệu của môn học. ❖ Bước 9: Chọn tập tin chương trình cần mô phỏng (tập tin mã máy đã được tạo ra từ Bước 6) cho hệ thống vi điều khiển: A1.HEX ❖ Bước 10: Thực hiện chạy mô phỏng và quan sát trực tiếp kết quả trên màn hình máy tính. • Nếu có bất kỳ lỗi nào xuất hiện thì thực hiện việc hiệu chỉnh khắc phục các lỗi này. Nguyên nhân phát sinh lỗi thông thường do giải thuật chương trình không chính xác hoặc do mạch mô phỏng vẽ không chính xác, cần phải được kiểm tra lại. Sau khi hoàn tất việc hiệu chỉnh sai sót thì quay trở về thực hiện từ Bước 5 (do giải thuật chương trình không chính xác) hoặc Bước 8 (do mạch mô phỏng vẽ không chính xác). • Nếu không có lỗi xuất hiện thì thực hiện tiếp theo các phần nội dung dưới đây. - Lắp mạch và nạp chương trình điều khiển. Sử dụng các khối "Microcontroller Unit Slot", "Point LED", "Inverter" và "Power Supply" có sẵn trên mô hình thực hành vi điều khiển để lắp ráp mạch theo thiết kế bên trên. D 7 D 0 D 1 D 2 D 3 D 4 D 5 D 6 AD7 AD7 AD0 D0AD0 AD0 AD1 AD1 AD2 AD2 AD3 AD3 AD4 AD4 AD5 AD5 AD6 AD6 AD7 AD6 AD5 AD4 AD3 AD2 AD1 D7 D6 D5 D4 D3 D2 D1 D0 D1 D2 D3 D4 D5 D6 D7 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 C1 33p C2 33p X1 12MHz C3 10uF R1 10k +5V D1 R2 330 +5V D2 R3 330 +5V D3 R4 330 +5V D4 R5 330 +5V D5 R6 330 +5V D6 R7 330 +5V D7 R8 330 +5V D8 R9 330 +5V 1B 1 2B 2 3B 3 4B 4 5B 5 6B 6 7B 7 8B 8 1C 18 2C 17 3C 16 4C 15 5C 14 6C 13 7C 12 8C 11 COM 10 U2 ULN2803 +5V 2 3 4 5 6 7 8 9 1 RP1 10K + 5 V MAÏCH ÑIEÀU KHIEÅN LED ÑÔN 2 3 4 5 6 7 8 9 1 RP2 10K +5V 119 ❖ Bước 11: Kết nối các khối trên mô hình như Hình 4.5.5 để tạo thành hệ thống mạch điều khiển như bên trên. • Tắt nguồn AC cấp cho mô hình thực hành. • Dùng dây bus 8 nối J130 (PORT0) ở khối "Microcontroller Unit Slot" với J61 (INPUT 1) ở khối "Driver Arrays (Inverter)". • Dùng dây bus 8 nối J65 (OUTPUT 1) ở khối "Driver Arrays (Inverter)" với J2 (BAR LED 1) ở khối "Point LED". • Dùng hai dây bus 3 nối J1 (POWER) ở khối "Point LED" và J62 (POWER) ở khối "Driver Arrays (Inverter)" với nguồn +5V ở khối "Power Supply". Hình 0.10: Sơ đồ kết nối mạch trên mô hình. Sử dụng phần mềm Flash Magic để thực hiện việc nạp chương trình cho vi điều khiển P89V51RB2 trên mô hình thực hành. ❖ Bước 12: Bật nguồn AC cấp cho mô hình thực hành. ❖ Bước 13: Khởi động phần mềm Flash Magic. ❖ Bước 14: Kiểm tra cấu hình phần mềm (loại vi điều khiển, cổng COM, tốc độ truyền, chuẩn giao tiếp,... ❖ Bước 15: Chọn tập tin chương trình điều khiển (tập tin mã máy đã được tạo ra từ Bước 6): xxx.HEX ❖ Bước 16: Nạp chương trình vào vi điều khiển. ❖ Bước 17: Nhấn nút "Master Reset" ở khối "Microcontroller Unit Slot" để chạy chương trình và quan sát trực tiếp kết quả trên mô hình thực hành. 120 • Nếu có bất kỳ lỗi nào xuất hiện thì thực hiện việc hiệu chỉnh khắc phục các lỗi này. Nguyên nhân phát sinh lỗi thường do việc lắp ráp phần cứng không chính xác hoặc các linh kiện bị hư hỏng, cần phải được kiểm tra lại. Sau khi hoàn tất việc kiểm tra và hiệu chỉnh sai sót thì quay trở về thực hiện từ Bước 15. • Nếu không có lỗi xuất hiện thì hoàn tất bài thực hành. BÀI TẬP THỰC HÀNH Bài tập mẫu. ❖ Bài tập số 1: Nội dung: "Chương trình con điều khiển tạo thời gian trễ 200s sử dụng Timer." Lưu đồ giải thuật: Chương trình điều khiển: ;*************************************************** ;CHUONG TRINH DIEU KHIEN 8 LED SANG TAT ;*************************************************** ;KET NOI: 8 LED ->PORT0 (CO DEM DAO). ;*************************************************** ORG 00H CHOPTAT: MOV P0,#00H ;LED TAT LCALL DELAY200US MOV P0,#0FFH ;LED SANG 121 LCALL DELAY200US SJMP CHOPTAT ;QUAY LAI ;*************************************************** ;CHUONG TRINH CON TAO THOI GIAN TRE ;*************************************************** ;TIME DELAY: 200US ;*************************************************** ;TUONG DOI: TIME = [R0]*[R1]*2T ;CHINH XAC: TIME = 2T+2T+1T+(1T+2T*[R1]+2T)*[R0]+2T+2T+2T ; VOI T LA CHU KY MAY ;*************************************************** DELAY200US: PUSH 00H PUSH 01H MOV R0,#10 DEL: MOV R1,#10 DJNZ R1,$ DJNZ R0,DEL POP 01H POP 00H RET END ❖ Bài tập số 2: Nội dung: " Chương trình con điều khiển tạo thời gian trễ 20ms sử dụng Timer." Lưu đồ giải thuật: 122 Chương trình điều khiển: ;*************************************************** ;CHUONG TRINH DIEU KHIEN 8 LED SANG TAT ;*************************************************** ;KET NOI: 8 LED ->PORT0 (CO DEM DAO). ;*************************************************** ORG 00H CHOPTAT: MOV P0,#00H ;LED TAT LCALL DELAY20MS MOV P0,#0FFH ;LED SANG LCALL DELAY20MS SJMP CHOPTAT ;QUAY LAI ;*************************************************** ;CHUONG TRINH CON TAO THOI GIAN TRE ;*************************************************** ;TIME DELAY: 20MS ;*************************************************** ;TUONG DOI: TIME = (|TH0,TL0|)*T ;CHINH XAC: TIME = 2T+2T+2T+1T+(|TH0,TL0|)*T+1T+1T++2T ; VOI T LA CHU KY MAY ;*************************************************** DELAY20MS: MOV TMOD,#01H MOV TH0,#HIGH(-20000) MOV TL0,#LOW(-20000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET END ❖ Bài tập số 3: Nội dung: " Chương trình con điều khiển tạo thời gian trễ 2s sử dụng Timer." Lưu đồ giải thuật: 123 Chương trình điều khiển: ;*************************************************** ;CHUONG TRINH DIEU KHIEN 8 LED SANG TAT ;*************************************************** ;KET NOI: 8 LED ->PORT0 (CO DEM DAO). ;*************************************************** ORG 00H CHOPTAT: MOV P0,#00H ;LED TAT LCALL DELAY2S MOV P0,#0FFH ;LED SANG LCALL DELAY2S SJMP CHOPTAT ;QUAY LAI ;*************************************************** ;CHUONG TRINH CON TAO THOI GIAN TRE ;*************************************************** ;TIME DELAY: 2S ;*************************************************** ;TUONG DOI: TIME = (|TH0,TL0|)*[R0]*T 124 ;CHINH XAC: TIME = 2T+1T+2T+(2T+2T+1T+(|TH0,TL0|)*T+1T+1T+2T)*[R0]+2T+2T ; VOI T LA CHU KY MAY ;*************************************************** DELAY2S: PUSH 00H MOV R0,#200 MOV TMOD,#01H DEL: MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 DJNZ R0,DEL POP 00H RET END BÀI TẬP ỨNG DỤNG Bài 1: Hãy viết chương trình con điều khiển tạo thời gian trễ 250s sử dụng Timer. Bài 2: Hãy viết chương trình con điều khiển tạo thời gian trễ 1ms sử dụng Timer. Bài 3: Hãy viết chương trình con điều khiển tạo thời gian trễ 100ms sử dụng Timer. Bài 4: Hãy viết chương trình con điều khiển tạo thời gian trễ 1s sử dụng Timer. Bài 5: Hãy viết chương trình con điều khiển tạo thời gian trễ 3s sử dụng Timer. Bài 6: Hãy viết chương trình con điều khiển tạo thời gian trễ 10s sử dụng Timer. Bài 7: Hãy viết chương trình con điều khiển tạo thời gian trễ 1 phút sử dụng Timer. Bài 8: Hãy viết chương trình con điều khiển tạo thời gian trễ 1 giờ sử dụng Timer. Ứng dụng đếm sự kiện trong lập trình điều khiển thiết bị ngoại vi. - Sơ đồ nguyên lý. 125 Hình 0.1: Sơ đồ nguyên lý khối phát xung vuông (Square Wave Generator). - Sơ đồ bố trí linh kiện. Hình 0.2: Khối phát xung vuông (Square Wave Generator). BÀI THỰC HÀNH Viết chương trình, mô phỏng và lắp ráp mạch điều khiển đếm liên tục số lượng xung (0000 – 9999) được đưa vào chân T1 của vi điều khiển và hiển thị số lượng xung này lên các LED 7 đoạn (PULSE được nối với chân T1, LED7 – LED4 được nối với Port0, SEL IN1 được nối với Port1) - Lưu đồ giải thuật. VCC C56 220p C55 220p Y5 32.768 KHz VCC C57 104 VCC C149 104 1024 Hz 2048 Hz 256 Hz 512 Hz 32 Hz 128 Hz 64 Hz 8 Hz J248 CLOCK OUT 1 2 3 4 5 6 7 8 J249 CLOCK OUT 1 2 3 J246 POWER 1 2 3 VCC GND +5V GND 2 Hz 4 Hz 1 Hz R94 10M U40A 4013 D 5 CLK 3 Q 1 Q 2 VDD 14S 6 GND 7 R 4 U41 4060 CLK 11 RST 12 Q4 7 Q5 5 Q6 4 Q7 6 Q8 14 Q9 13 Q10 15 Q12 1 Q13 2 Q14 3VCC 16 GND 8 OSC 9 OSC 10 VCC 126 ❖ Bước 1: Vẽ lưu đồ giải thuật của chương trình điều khiển. Hình 0.3: Lưu đồ giải thuật của chương trình. - Chương trình điều khiển. Sử dụng phần mềm Topview Simulation để thực hiện việc viết chương trình và biên dịch, kiểm tra lỗi cú pháp của chương trình. ❖ Bước 2: Khởi động phần mềm Topview Simulation. ❖ Bước 3: Mở chức năng soạn thảo một chương trình mới và đặt tên tập tin chương trình là: K1.ASM ❖ Bước 4: Viết chương trình điều khiển dưới đây vào máy tính. ;*************************************************** ;CHUONG TRINH DIEU KHIEN TIMER/COUNTER DEM (0000 - 9999) VA HIEN THI XUNG TAI CHAN T1 ;*************************************************** ;KET NOI: PORT0 -> 7 SEGMENT (DP -> A) ; PORT1 -> SELECT LED ; PULSE -> T1 PIN ;*************************************************** ORG 00H MAIN: MOV TMOD,#50H ;COUNTER 16 BIT (MODE 1) MOV TH1,#0 ;XOA COUNTER 1 MOV TL1,#0 127 SETB TR1 ;CHO PHEP COUNTER BAT DAU HOAT DONG MP1: MOV R7,TH1 ;CHUYEN SO XUNG DEM DUOC (TH1, TL1) RA HIEN THI MOV R6,TL1 ACALL BIN16TOBCD ;DOI MA BIN SANG MA BCD ACALL BCD4TO7SEG ;DOI MA BCD SANG MA 7 DOAN ACALL DISP7SEGMUL4 ;HIEN THI GIA TRI LEN LED SJMP MP1 ;*************************************************** BIN16TOBCD: ;CTC CHUYEN DOI SO BINARY 16 BIT (<= 9999) SANG SO BCD. PUSH ACC PUSH B MOV B,#10 ACALL DIV16TO8 ;LAY R7,R6 CHIA CHO 10 PUSH B ;CAT SO HANG DON VI MOV B,#10 ACALL DIV16TO8 ;TIEP TUC CHIA CHO 10 PUSH B ;CAT SO HANG CHUC MOV B,#10 MOV A,R6 DIV AB ;TIEP TUC CHIA CHO 10 PUSH B ;CAT SO HANG TRAM, ACC CHUA SO HANG NGAN SWAP A ;DUA SO HANG NGAN LEN 4 BIT CAO POP B ;LAY SO HANG TRAM TU STACK ORL A,B ;KET HOP SO HANG NGAN VA SO HANG TRAM MOV R7,A ;R7 = NGAN - TRAM POP ACC ;LAY SO HANG CHUC TU STACK SWAP A ;DUA SO HANG CHUC LEN 4 BIT CAO POP B ;LAY SO HANG DON VI TU STACK ORL A,B ;KET HOP SO HANG CHUC VA SO HANG DON VI MOV R6,A ;R6 = CHUC - DON VI POP B POP ACC RET ;*************************************************** 128 DIV16TO8: ;CTC CHIA SO BINARY 16 BIT CHO SO BINARY 8 BIT. PUSH 02H ;CAT THANH GHI R2 PUSH ACC ;CAT THANH GHI A MOV R2,#16 ;CHO PHEP DICH 16 LAN CLR A DIVIDE: CLR C XCH A,R6 ;DICH BIT 7 CUA R6 VAO RLC A ;CARRY, BIT 0 CUA R6 XCH A,R6 ;BANG 0. XCH A,R7 ;DICH BIT CARRY VAO RLC A ;BIT 0 CUA R7 XCH A,R7 RLC A ;DICH BIT 7 CUA R7 VAO A. CJNE A,B,NOT_EQUAL ;XEM SO BIT DA DICH >= SJMP A_GREATER_EQ_B ;SO CHIA CHUA ? NOT_EQUAL: JC BELOW ;N: THUONG SO = 0 TRONG R6. A_GREATER_EQ_B: SUBB A,B ;Y: SO DU CAT TRONG A. XCH A,R6 ORL A,#1 ;THUONG SO = 1 XCH A,R6 ;CAT TRONG R6 BELOW: DJNZ R2,DIVIDE ;DICH TIEP DEN 16 LAN. XCH A,B ;SAU 16 LAN DICH TA DUOC B = SO DU. POP ACC POP 02H RET ;*************************************************** BCD4TO7SEG: ;CTC GIAI MA TU SO BCD NEN SANG MA 7 DOAN (2 SO BCD NEN). PUSH DPH ;CATTAM THOI GIA TRI CAC THANH GHI PUSH DPL PUSH ACC MOV DPTR,#CODE7SEG ;DIA CHI VUNG MA 7 DOAN MOV A,R6 ;LAY SO BCD CAN GIAI MA 129 ANL A,#0FH ;XOA 4 BIT CAO MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG MOV 60H,A ;CAT BCD HANG DON VI VAO O NHO MOV A,R6 ;LAY SO BCD CAN GIAI MA ANL A,#0F0H ;XOA 4 BIT THAP SWAP A ;HOAN CHUYEN CAO - THAP MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG MOV 61H,A ;CAT BCD HANG CHUC VAO O NHO MOV A,R7 ;LAY SO BCD CAN GIAI MA ANL A,#0FH ;XOA 4 BIT CAO MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG MOV 62H,A ;CAT BCD HANG TRAM VAO O NHO MOV A,R7 ;LAY SO BCD CAN GIAI MA ANL A,#0F0H ;XOA 4 BIT THAP SWAP A ;HOAN CHUYEN CAO - THAP MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG MOV 63H,A ;CAT BCD HANG NGAN VAO O NHO POP ACC ;PHUC HOI GIA TRI CHO CAC THANH GHI POP DPL POP DPH RET CODE7SEG: ;VUNG CHUA MA 7 DOAN (0 -> 9) DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;*************************************************** DISP7SEGMUL4: ;CTC QUET HIEN THI LED 7 DOAN (4 LED 7 DOAN). PUSH ACC ;CATTAM THOI GIA TRI CAC THANH GHI PUSH 00H MOV A,#0F7H ;MA QUET MOV R0,#63H ;DIA CHI VUNG MA HIEN THI DISP: MOV P0,@R0 ;XUAT MA HIEN THI MOV P1,A ;XUAT MA QUET LCALL DELAYLED MOV P1,#0FFH ;CHONG LEM DEC R0 ;LAY MA HIEN THI KE TIEP RR A ;CHUYEN SANG LED KE TIEP CJNE R0,#5FH,DISP ;KIEM TRA DA QUET XONG CHUA 130 POP 00H ;PHUC HOI GIA TRI CHO CAC THANH GHI POP ACC RET ;*************************************************** DELAYLED: ;CHUONG TRINH CON TAO THOI GIAN TRE 2.5MS PUSH 00H PUSH 01H MOV R1,#5 DEL: MOV R0,#250 DJNZ R0,$ DJNZ R1,DEL POP 01H POP 00H RET END ❖ Bước 5: Lưu chương trình trên vào máy tính. ❖ Bước 6: Thực hiện biên dịch và kiểm tra lỗi chương trình. • Nếu có bất kỳ lỗi nào xuất hiện thì thực hiện việc hiệu chỉnh khắc phục các lỗi này. Nguyên nhân phát sinh lỗi thông thường do cú pháp của các lệnh không chính xác, cần phải được kiểm tra lại. Sau khi hoàn tất việc hiệu chỉnh sai sót thì quay trở về thực hiện từ Bước 5. • Nếu không có lỗi xuất hiện thì phần mềm sẽ tự động tạo tập tin mã máy với tên là: K1.HEX và thực hiện tiếp theo các phần nội dung dưới đây. - Mô phỏng hoạt động. Sử dụng phần mềm ISIS 7 Professional (Protues 7.10) để thực hiện việc mô phỏng quá trình hoạt động của hệ thống vi điều khiển. ❖ Bước 7: Khởi động phần mềm ISIS 7 Professional (Protues 7.10). ❖ Bước 8: Vẽ sơ đồ thiết kế mạch mô phỏng điều khiển xxx như Hình 4.6.4 dưới đây. 131 Hình 0.4: Sơ đồ nguyên lý mô phỏng hệ thống điều khiển.  Mạch mô phỏng này đã được thiết kế sẵn và lưu trong máy tính với tên tập tin là: xxx.DSN. Vì thế người học có thể tự vẽ thiết kế mạch mô phỏng hoặc lấy mạch mô phỏng có sẵn trong cơ sở dữ liệu của môn học. ❖ Bước 9: Chọn tập tin chương trình cần mô phỏng (tập tin mã máy đã được tạo ra từ Bước 6) cho hệ thống vi điều khiển: K1.HEX ❖ Bước 10: Thực hiện chạy mô phỏng và quan sát trực tiếp kết quả trên màn hình máy tính. • Nếu có bất kỳ lỗi nào xuất hiện thì thực hiện việc hiệu chỉnh khắc phục các lỗi này. Nguyên nhân phát sinh lỗi thông thường do giải thuật chương trình không chính xác hoặc do mạch mô phỏng vẽ không chính xác, cần phải được kiểm tra lại. Sau khi hoàn tất việc hiệu chỉnh sai sót thì quay trở về thực hiện từ Bước 5 (do giải thuật chương trình không chính xác) hoặc Bước 8 (do mạch mô phỏng vẽ không chính xác). • Nếu không có lỗi xuất hiện thì thực hiện tiếp theo các phần nội dung dưới đây. - Lắp mạch và nạp chương trình điều khiển. Sử dụng các khối "Microcontroller Unit Slot", "Square Wave Generator", "7 Segment Display" và "Power Supply" có sẵn trên mô hình thực hành vi điều khiển để lắp ráp mạch theo thiết kế bên trên. ❖ Bước 11: Kết nối các khối trên mô hình như Hình 4.6.5 để tạo thành hệ thống mạch điều khiển như bên trên. • Tắt nguồn AC cấp cho mô hình thực hành. AD7 AD0 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 AD6 AD5 AD4 AD3 AD2 AD1 A B C D E F G A B C D E F G AD0 A AD1 B AD2 C AD3 D AD4 E AD5 F AD6 G A B C D E F G A B C D E F G P1.3 P 1 .0 P 1 .1 P 1 .2 P 1 .3 P1.2 P1.1 P1.0 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 C1 33p C2 33p X1 12MHz 2 3 4 5 6 7 8 9 1 RP1 10K + 5 V MAÏCH ÑIEÀU KHIEÅN TIMER/COUNTER (ÑEÁM XUNG) LED7 Q1 A1015 +5V LED6 Q2 A1015 +5V R2 1K R3 1K R4 56 R5 56 R6 56 R7 56 R8 56 R9 56 R10 56 LED5 Q3 A1015 +5V LED4 Q4 A1015 +5V R11 1K R12 1K C3 10uF R1 10k +5V A B U1(P3.5/T1) 132 • Dùng dây bus 4 nối J64 (PORT1) ở khối vi điều khiển với J1 (SEL IN1) ở khối LED 7 đoạn (chú ý là ta chỉ nối 4 bit thấp của J64 với J1). • Dùng dây bus 8 nối J63 (PORT0 / DATA) ở khối vi điều khiển với J4 (7SEG IN MUL) ở khối giải mã. • Dùng dây bus 1 nối J33 (PULSE) ở khối tạo xung với J66 (PORT3 / FUNCTION) ở khối vi điều khiển (chú ý là ta chỉ nối bit 5 (chân T1) của J66 và J33 lại với nhau). • Dùng dây bus 3 nối J113 (POWER) ở khối tạo xung và J110 (POWER) ở khối LED 7 đoạn với nguồn +5V ở khối nguồn. Hình 0.5: Sơ đồ kết nối mạch trên mô hình. Sử dụng phần mềm Flash Magic để thực hiện việc nạp chương trình cho vi điều khiển P89V51RB2 trên mô hình thực hành. ❖ Bước 12: Bật nguồn AC cấp cho mô hình thực hành. ❖ Bước 13: Khởi động phần mềm Flash Magic. ❖ Bước 14: Kiểm tra cấu hình phần mềm (loại vi điều khiển, cổng COM, tốc độ truyền, chuẩn giao tiếp,... ❖ Bước 15: Chọn tập tin chương trình điều khiển (tập tin mã máy đã được tạo ra từ Bước 6): K1.HEX ❖ Bước 16: Nạp chương trình vào vi điều khiển. ❖ Bước 17: Nhấn nút "Master Reset" ở khối "Microcontroller Unit Slot" để chạy chương trình và quan sát trực tiếp kết quả trên mô hình thực hành. • Nếu có bất kỳ lỗi nào xuất hiện thì thực hiện việc hiệu chỉnh khắc phục các lỗi này. Nguyên nhân phát sinh lỗi thường do việc lắp ráp phần cứng không chính xác hoặc các linh kiện bị hư hỏng, cần phải được kiểm tra lại. Sau khi 133 hoàn tất việc kiểm tra và hiệu chỉnh sai sót thì quay trở về thực hiện từ Bước 15. • Nếu không có lỗi xuất hiện thì hoàn tất bài thực hành. BÀI TẬP THỰC HÀNH Nội dung: "Chương trình điều khiển đo tần số của xung (0000 – 9999, đơn vị là Hz) được đưa vào chân T1 của vi điều khiển và hiển thị tần số của xung này lên các LED 7 đoạn (PULSE được nối với chân T1, LED7 – LED4 được nối với Port0, SEL IN1 được nối với Port1)" Lưu đồ giải thuật: 134 Chương trình điều khiển: ;*************************************************** ;CHUONG TRINH DIEU KHIEN TIMER/COUNTER DO TAN SO XUNG TAI CHAN T1 ;*************************************************** ;KET NOI: PORT0 -> 7 SEGMENT (DP -> A) PORT1 -> SELECT LED; PULSE -> T1 PIN ;*************************************************** ORG 00H ;DIEM NHAP RESET SJMP MAIN 135 ORG 0BH ;DIEM NHAP ISR TIMER0 LJMP T0ISR ORG 30H ;DIEM NHAP CHUONG TRINH CHINH MAIN: MOV TMOD,#51H ;TIMER1: COUNTER 16 BIT (MODE 1), TIMER0: TIMER 16 BIT (MODE 1) MOV TH0,#HIGH(-50000) ;NAP GIA TRI THOI GIAN TRE 50 MS MOV TL0,#LOW(-50000) SETB TR0 ;CHO TIMER BAT DAU CHAY MOV IE,#82H ;CHO PHEP NGAT TIMER0 HOAT DONG MP1: MOV 40H,#0 ;NAP GIA TRI BIEN DEM SO LAN NGAT TIMER0 MOV R7,TH1 ;CHUYEN SO XUNG DEM DUOC (TH1, TL1) RA HIEN THI MOV R6,TL1 MOV TH1,#0 ;XOA COUNTER 1, CHUAN BI CHO LAN DEM XUNG TIEP THEO MOV TL1,#0 SETB TR1 ;COUNTER BAT DAU DEM ACALL BIN16TOBCD ;DOI MA BIN SANG MA BCD ACALLBCD4TO7SEG ;DOI MA BCD SANG MA 7 DOAN MP2: ACALL DISP7SEGMUL4 ;HIEN THI GIA TRI LEN LED MOV A,40H CJNE A,#20,MP2 ;KIEM TRA DU 20 LAN NGAT = 1S CLR TR1 ;DUNG COUNTER SAU 1S -> SO XUNG TRONG 1S = TAN SO XUNG SJMP MP1 ;*************************************************** BIN16TOBCD: ;CTC CHUYEN DOI SO BINARY 16 BIT (<= 9999) SANG SO BCD. PUSH ACC PUSH B MOV B,#10 ACALL DIV16TO8 ;LAY R7,R6 CHIA CHO 10 PUSH B ;CAT SO HANG DON VI MOV B,#10 136 ACALL DIV16TO8 ;TIEP TUC CHIA CHO 10 PUSH B ;CAT SO HANG CHUC MOV B,#10 MOV A,R6 DIV AB ;TIEP TUC CHIA CHO 10 PUSH B ;CAT SO HANG TRAM, ACC CHUA SO HANG NGAN SWAP A ;DUA SO HANG NGAN LEN 4 BIT CAO POP B ;LAY SO HANG TRAM TU STACK ORL A,B ;KET HOP SO HANG NGAN VA SO HANG TRAM MOV R7,A ;R7 = NGAN - TRAM POP ACC ;LAY SO HANG CHUC TU STACK SWAP A ;DUA SO HANG CHUC LEN 4 BIT CAO POP B ;LAY SO HANG DON VI TU STACK ORL A,B ;KET HOP SO HANG CHUC VA SO HANG DON VI MOV R6,A ;R6 = CHUC - DON VI POP B POP ACC RET ;*************************************************** DIV16TO8: ;CTC CHIA SO BINARY 16 BIT CHO SO BINARY 8 BIT. PUSH 02H ;CAT THANH GHI R2 PUSH ACC ;CAT THANH GHI A MOV R2,#16 ;CHO PHEP DICH 16 LAN CLR A DIVIDE: CLR C XCH A,R6 ;DICH BIT 7 CUA R6 VAO RLC A ;CARRY, BIT 0 CUA R6 XCH A,R6 ;BANG 0. XCH A,R7 ;DICH BIT CARRY VAO RLC A ;BIT 0 CUA R7 XCH A,R7 RLC A ;DICH BIT 7 CUA R7 VAO A. CJNE A,B,NOT_EQUAL ;XEM SO BIT DA DICH >= SJMP A_GREATER_EQ_B ;SO CHIA CHUA ? NOT_EQUAL: JC BELOW ;N: THUONG SO = 0 TRONG R6. 137 A_GREATER_EQ_B: SUBB A,B ;Y: SO DU CAT TRONG A. XCH A,R6 ORL A,#1 ;THUONG SO = 1 XCH A,R6 ;CAT TRONG R6 BELOW: DJNZ R2,DIVIDE ;DICH TIEP DEN 16 LAN. XCH A,B ;SAU 16 LAN DICH TA DUOC B = SO DU. POP ACC POP 02H RET ;*************************************************** BCD4TO7SEG: ;CTC GIAI MA TU SO BCD NEN SANG MA 7 DOAN (2 SO BCD NEN). PUSH DPH ;CATTAM THOI GIA TRI CAC THANH GHI PUSH DPL PUSH ACC MOV DPTR,#CODE7SEG ;DIA CHI VUNG MA 7 DOAN MOV A,R6 ;LAY SO BCD CAN GIAI MA ANL A,#0FH ;XOA 4 BIT CAO MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG MOV 60H,A ;CAT BCD HANG DON VI VAO O NHO MOV A,R6 ;LAY SO BCD CAN GIAI MA ANL A,#0F0H ;XOA 4 BIT THAP SWAP A ;HOAN CHUYEN CAO - THAP MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG MOV 61H,A ;CAT BCD HANG CHUC VAO O NHO MOV A,R7 ;LAY SO BCD CAN GIAI MA ANL A,#0FH ;XOA 4 BIT CAO MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG MOV 62H,A ;CAT BCD HANG TRAM VAO O NHO MOV A,R7 ;LAY SO BCD CAN GIAI MA 138 ANL A,#0F0H ;XOA 4 BIT THAP SWAP A ;HOAN CHUYEN CAO - THAP MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG MOV 63H,A ;CAT BCD HANG NGAN VAO O NHO POP ACC ;PHUC HOI GIA TRI CHO CAC THANH GHI POP DPL POP DPH RET CODE7SEG: ;VUNG CHUA MA 7 DOAN (0 -> 9) DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;*************************************************** DISP7SEGMUL4: ;CTC QUET HIEN THI LED 7 DOAN (4 LED 7 DOAN). PUSH ACC ;CATTAM THOI GIA TRI CAC THANH GHI PUSH 00H MOV A,#0F7H ;MA QUET MOV R0,#63H ;DIA CHI VUNG MA HIEN THI DISP: MOV P0,@R0 ;XUAT MA HIEN THI MOV P1,A ;XUAT MA QUET LCALL DELAYLED MOV P1,#0FFH ;CHONG LEM DEC R0 ;LAY MA HIEN THI KE TIEP RR A ;CHUYEN SANG LED KE TIEP CJNE R0,#5FH,DISP ;KIEM TRA DA QUET XONG CHUA POP 00H ;PHUC HOI GIA TRI CHO CAC THANH GHI POP ACC RET ;*************************************************** DELAYLED: ;CHUONG TRINH CON TAO THOI GIAN TRE 2.5MS PUSH 00H PUSH 01H MOV R1,#5 DEL: MOV R0,#250 DJNZ R0,$ DJNZ R1,DEL 139 POP 01H POP 00H RET ;*************************************************** T0ISR: ;ISR TIMER0 - 50MS CLR TR0 CLR TF0 MOV TH0,#HIGH(-50000) ;NAP GIA TRI THOI GIAN TRE 50 MS MOV TL0,#LOW(-50000) INC 40H ;TANG BIEN DEM SO LAN NGAT - 1 LAN = 50MS SETB TR0 RETI END Câu hỏi ôn tập BÀI TẬP ỨNG DỤNG Bài 1: Hãy viết chương trình điều khiển tạo xung 1 Hz (sử dụng Timer) tại chân P1.0 và hiển thị mức logic tại chân này lên LED. Tự lựa chọn phương pháp kết nối LED. Bài 2: Hãy viết chương trình điều khiển tạo xung 3 Hz (sử dụng Timer) tại chân P1.0 và hiển thị mức logic tại chân này lên LED. Tự lựa chọn phương pháp kết nối LED. Bài 3: Hãy viết chương trình điều khiển tạo xung 1 Hz hoặc 3 Hz (sử dụng Timer) tại chân P1.0 tùy thuộc vào ta nhấn hay nhả nút nhấn KEY0 và hiển thị mức logic tại chân này lên LED. Tự lựa chọn phương pháp kết nối LED và nút nhấn. Bài 4: Hãy viết chương trình điều khiển đếm liên tục số lượng xung được đưa vào chân T0 của vi điều khiển và hiển thị số lượng xung này lên các LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo xung và các LED 7 đoạn. Bài 5: Hãy viết chương trình điều khiển đo tần số của xung (đơn vị tính là Hz) được đưa vào chân T0 của vi điều khiển và hiển thị giá trị tần số lên LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo xung và các LED 7 đoạn. Bài 6: Hãy viết chương trình điều khiển đo độ rộng xung (đơn vị tính là ms) được đưa vào chân T0 của vi điều khiển và hiển thị giá trị độ rộng xung lên LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo xung và các LED 7 đoạn.

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_ky_thuat_vi_dieu_khien_trinh_do_trung_cap_truong.pdf
  • pdfgiao_trinh_ky_thuat_vi_dieu_khien_phan_2_2607 (1)_2500957.pdf
Tài liệu liên quan