chương Các lệnh nhảy, vòng lặp lệnh gọi Trong chuỗi lệnh cần thực thường có nhu cần cần chuyển điều khiển chương trình đến vị trí khác Có nhiều lệnh để thực điều 8051, chương ta tìm hiểu lệnh chuyển điều khiển có hợp ngữ 8051 lệnh sử dụng cho vòng lặp, lệnh nhảy có điều khiển, lệnh gọi cuối mô tả chương trình giữ chậm thời gian 3.1 Vòng lặp lệnh nhảy 3.1.1 Tạo vòng lặp 8051 Qúa trình lặp lại chuỗi lệnh với số lần định gọi vòng lặp Vòng lặp hoạt động sử dụng rộng rÃi mà vi sử lý thực Trong 8051 hoạt động vòng lặp thực hiƯn bëi lƯnh “DJNZ ghi, nh·n” Trong lƯnh nµy ghi giảm xuống, không không nhảy đến địa đích tham chiếu nhÃn Trước bắt đầu vòng lặp ghi nạp với đếm cho số lần lặp lại Lưu ý rằng, lệnh việc giảm ghi định để nhảy kết hợp vào lệnh đơn Ví dụ 3.1: Viết chương trình để: a) xoá ACC sau b) cộng vào ACC 10 lần Lời giải: BACK: MOV MOV ADD DJNZ MOV A, #0 R2, #10 A, #10 R2, AGAIN R5, A ; Xo¸ ACC, A = ; Nạp đếm R2 = 10 ; Cộng 03 vào ACC ; Lặp lại R2 = (10 lần) ; Cắt A vào ghi R5 Trong chương trình ghi R2 sử dụng đếm Bộ đếm lúc đầu đặt 10 Mỗi lần lặp lại lệnh DJNZ giảm R2 không nhảy đến địa đích gắn với nhÃn AGAIN Hoạt động lặp lại tiếp tục R2 trở không Sau R2 = thoát khỏi vòng lặp thực đứng trường hợp lÖnh “MOV R5, A” Lu ý r»ng lÖnh DJNZ ghi ghi ghi R0 - R7 Bộ đếm ngăn nhớ RAM nh ta sÏ thÊy ë ch¬ng VÝ dơ 3.2: Số lần cực đại mà vòng lặp ví dụ 3.1 lặp lại bao nhiêu? Lời giải: Vì ghi R2 chứa số đếm ghi bit nên chứa giá trị cực đại FFH hay 155 Do số lần lặp lại cực đại mà vòng lặp vÝ dơ 3.1 cã thĨ thùc hiƯn lµ 256 3.2.1 Vòng lặp bền vòng lặp Như trình bày ví dụ 3.2 số đếm cực đại 256 Vậy điều xảy ta muốn lặp hành động nhiều 256 lần? Để làm điều ta sử dụng vòng lặp bên vòng lặp gọi vòng lặp lồng (Nested Loop) Trong vòng lặp lồng ta sử dụng ghi để giữ số đếm Xét ví dụ 3.3 CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ 3.3: HÃy viết chương trình a) nạp ghi ACC với giá trị 55H b) bù ACC 700 lần Lời giải: Vì 700 lớn 256 (là số cực đại mà ghi vó thể chứa được) nên ta phải dùng hai ghi để chứa số đếm Đoạn mà trình bày cách sử dụng hai ghi R2 R3 ®Ĩ chøa sè ®Õm NEXT: AGAIN: ` MOV MOV MOV CPL DJNZ DJNZ A, #55H R3, #10 R2, #70 A R2, AGAIN R3, NEXT ; N¹p A = 55H ; Nạp R3 = 10 số đếm vòng lặp ; Nạp R2 = 70 số đếm vòng lặp ; Bù ghi A ; Lặp lại 70 lần (vòng lặp trong) Trong chương trình ghi R2 dùng để chứa số đếm vòng lặp Trong lệnh DJNZ R2, AGAIN R2 = thẳng xuống lệnh JNZ R3, NEXT thực Lệnh ép CPU nạp R2 với số đếm 70 vòng lặp bắt đầu lại trình tiếp tục R3 trở không vòng lặp kết thúc 3.1.3 Các lệnh nhảy có điều kiện Các lệnh nhảy có điều kiện 8051 tổng hợp bảng 3.1 Các chi tiết lệnh cho phụ lơc AppendixA Trong b¶ng 3.1 lu ý r»ng mét sè lệnh JZ (nhảy A = 0) JC (nhảy có nhớ) nhảy điều kiện định thoả mÃn Kế tiếp ta xét số lệnh nhảy có điều kiện với Ví dụ minh hoạ sau a- Lệnh JZ (nhảy A = 0) Trong lƯnh nµy néi dung cđa ghi A kiểm tra Nếu không nhảy đến địa đích Ví dụ xét đoạn mà sau: MOV JZ MOV JZ OVER A, R0 OVER A, R1 OVER ; Nạp giá trị R0 vào A ; Nhảy đến OVER A = ; Nạp giá trị R1 vào A ; Nhảy đến OVER A = Trong chương trình R0 R1 có giá trị nhảy ®Õn ®Þa chØ cã nh·n OVER Lu ý r»ng lƯnh JZ sử dụng ghi A Nã chØ cã thÓ kiÓm tra xem ghi A có không không không áp dụng cho ghi khác Quan trọng ta thực lệnh số học đếm giảm để sử dụng lệnh JNZ ví dụ 3.4 Ví dụ 3.4: Viết chương trình để xác định xem R5 có chứa giá trị không? Nếu nạp cho giá trị 55H Lời giải: MOV JNZ MOV CuuDuongThanCong.com A, R5 NEXT R5, #55H ; Sao néi dung R5 vµo A ; Nhảy đến NEXT A không ; https://fb.com/tailieudientucntt NEXT: b- Lệnh JNC (nhảy nhớ, cờ CY = 0) Trong lệnh bit cờ nhớ ghi cờ PSW dùng để thực định nhảy Khi thực lệnh “JNC nh·n” th× bé xư lý kiĨm tra cê nhí xem có bật không (CY = 1) Nếu không bật CPU bắt đầu nạp thực lệnh từ địa nhÃn Nếu cờ CY = không nhảy thực lệnh JNC Cần phải lưu ý r»ng cịng cã lƯnh “JC nh·n” Trong lƯnh JC th× CY = nhảy đến địa đích nhÃn Ta xét ví dụ lệnh ứng dụng chương sau Ngoài có lệnh JB (nhảy bit có mức cao) JNB (nhảy bit có mức thấp) Các lệnh trình bày chương nói thao tác bit Bảng 3.1: Các lệnh nhảy có điều kiện Lệnh JZ JNZ DJNZ CJNE A, byte CJNE re, # data JC JNC JB JNB JBC Hoạt động Nhảy A = Nhảy A Giảm nhảy A = Nhảy nÕu A byte Nh¶y nÕu Byte data Nh¶y nÕu CY = Nh¶y nÕu CY = Nh¶y nÕu bit = Nh¶y nÕu bit = Nh¶y nÕu bit = xoá Ví dụ 3.5: HÃy tìm tổng giá trị 79H, F5H E2H Đặt vào ghi R0 (byte thấp) R5 (byte cao) Lêi gi¶i: MOV MOV ADD JNC INC N-1: ADD JNC INC N-2: ADD JNC INC OVER: MOV A, #0 R5, A A #79H N-1 R5 ; Xo¸ ghi A = ; Xo¸ R5 ; Céng 79H vµo A (A = + 79H = 79H) ; NÕu kh«ng cã nhí céng kÕ tiÕp ; NÕu CY = 1, tăng R5 A, #0F5H N-2 R5 A, #0E2H OVER R5 R0, A ; Céng F5H vµo A (A = 79H + F5H = 6EH) vµ CY = ; Nh¶y nÕu CY = ; NÕu CY = tăng R5 (R5 = 1) ; Cộng E2H vào A (A = GE + E2 = 50) vµ CY = ; Nh¶y nÕu CY = ; NÕu CY = tăng R5 ; Bây R0 = 50H R5 = 02 c- Tất lệnh nhảy có điều kiện phép nhảy ngắn CuuDuongThanCong.com https://fb.com/tailieudientucntt Cần phải lưu ý tất lệnh nhảy có điều kiện phép nhảy ngắn, có nghĩa địa đích phải nằm khoảng -127 đến +127 byte nội dung đếm chương trình PC 3.1.4 Các lệnh nhảy không điều kiện Lệnh nhảy không điều kiện phép nhảy điều khiển truyền không điều kiện đến địa đích Trong 8051 có hai lệnh nhảy không điều kiện là: LJMP - nhảy xa SJMP - nhảy gần a- Nhảy xa LJMP: Nhảy xa LJMP lệnh byte byte mà lệnh hai byte lại địa 16 bit đích Địa đích 02 byte có phép phép nhảy đến vị trí nhớ khoảng 0000 - FFFFH HÃy nhớ rằng, đếm chương trình 8051 16 bit, cho không gian địa 64k byte, nhớ chương trình ROM chíp lớn 8051 có 4k byte ROM chíp cho không gian chương trình, byte quý giá Vì lý mà có lệnh nhảy gần SJMP có byte so với lệnh nhảy xa LZ0MP dài byte Điều tiết kiệm số byte nhớ nhiều ứng dụng mà không gian nhớ có hạn hẹp b- Lệnh nhảy gồm SJMP Trong byte byte mà lệnh byte thứ hai tương đối địa đích Đích tương đối phạm vi 00 - FFH chia thành lệnh nhảy tới nhảy lùi: Nghĩa -128 đến +127 byte nhớ tương đối so với địa thời đếm chương trình Nếu lệnh nhảy tới địa đích nằm khoảng 127 byte từ giá trị thời đếm chương trình Nếu địa đích phía sau nằm khoảng -128 byte từ giá trị hành PC 3.1.5 Tính toán địa lệnh nhảy gần Ngoài lệnh nhảy gần SJMP tất lệnh nhảy có điều kiện JNC, JZ DJNZ lệnh nhảy gần thực tế chúng lệnh byte Trong lệnh byte thứ mà lệnh, byte thứ hai địa tương đối Địa đích tương đối so với giá trị đếm chương trình Để tính toán địa đích byte thứ hai cộng vào ghi PC lệnh đứng sau lệnh nhảy Để hiểu điều hÃy xét ví dụ 3.6 Ví dụ 3.6: Sử dụng tệp tin liệt kê hÃy kiểm tra việc tín toán địa nhảy trước 01 02 03 04 05 06 07 08 09 10 11 12 0000 0000 0002 0004 0006 0007 0008 0009 000B 000D 000E 000F CuuDuongThanCong.com 7800 7455 6003 08 04 04 2477 5005 E4 F8 F9 AGAIN: INC NEXT: ORG MOV MOV JZ NIC INC ADD JNC CLR MOV MOV A 0000 R0, #0 A, #55H NEXT R0 A A, #77h OVER A R0, A R1, A https://fb.com/tailieudientucntt 13 14 15 16 17 18 0010 0011 0012 0013 0015 0017 FA FB 2B 50F2 80FE OVER: HERE: MOV MOV ADD JNC SJMP END R2, A R3, A A, R3 AGAIN SHERE Lêi giải: Trước hết lưu ý lệnh JZ JNC lệnh nhảy trước Địa đích lệnh nhảy trước tính toán cách cộng giá trị PC lệnh sau vào byte thứ hai lệnh nhảy gần gọi địa tương đối dòng 04 lệnh JZ NEXT có mà lệnh 60 toán hạng 03 địa 0004 0005 03 địa tương đối, tương đối so với địa lệnh là: INC R0 0006 Bằng việc cộng 0006 vào địa đích nhÃn NEXT 0009 tạo Bằng cách tương tự dòng lệnh JNC OVER có mà lệnh toán hạng 50 05 50 mà lệnh 05 địa tương đối Do vậy, 05 cộng vào OD địa lệnh CLA A đứng sau lệnh JNC OVER cho giá trị 12H địa nhÃn OVER Ví dụ 3.7: HÃy kiểm tra tính toán địa lƯnh nh¶y lïi vÝ dơ 3.6 Lêi gi¶i: Trong danh sách liệt kê chương trình lệnh JNC AGAIN có mà lệnh 50 địa tương đối F2H Khi địa tương đối F2H cộng vào 15H địa lệnh đứng díi lƯnh nh¶y ta cã 15H + F2H = 07 (và phần nhớ bỏ đi) Để ý 07 địa nhÃn AGAIN Và hÃy xét lệnh SJMP HERE có mà lệnh 80 địa tương đối FE giá trị PC lệnh 0017H cộng vào địa tương đối FEH ta nhận 0015H địa nhÃn HERE (17H + FEH = 15H) phần nhớ bỏ đi) Lưu ý r»ng FEH lµ -2 vµ 17h + (-2) = 15H Về phép cộng số âm bàn chương 3.1.6 Tính toán địa đích nhảy lùi Trong trường hợp nhảy tới giá trị thay số dương khoảng từ đến 127 (00 đến 7F dạng Hex) lệnh nhảy lùi giá trị thay số âm nằm khoảng từ đến -128 giải thích ví dụ 3.7 Cần phải nhấn mạnh rằng, SJMP nhảy tới hay nhảy lùi lệnh nhảy địa địa đích không lớn -128 đến +127 byte so với địa gắn liền với lệnh đứng sau lệnh SJMP Nếu có nỗ lực vi phạm luật hợp ngữ tạo lỗi báo lệnh nhảy phạm vi 3.2 Các lệnh gọi CALL Một lệnh chuyển điều khiển khác lệnh CALL dùng để gọi chương trình Các chương trình thường sử dụng để thực thi công việc cần phải thực thường xuyên Điều làm cho chương trình trở nên có cấu trúc việc tiết kiệm thêm không gian nhớ Trong 8051 có lệnh để gọi là: Gọi xa CALL gọi tuyệt đối ACALL mà định sử dụng lệnh phụ thuộc vào địa ®Ých 3.2.1 LÖnh gäi xa LCALL CuuDuongThanCong.com https://fb.com/tailieudientucntt Trong lÖnh byte byte mà lệnh, hai byte sau dùng cho địa chương trình đích Do LCALL dùng để gọi chương trình vị trí phạm vi 64k byte, không gian địa 8051 Để đảm bảo sau thực chương trình gọi để 8051 biết chỗ quay trở tự động cất vào ngăn xếp địa lệnh đứng sau lệnh gọi LCALL Khi chương trình gọi, điều khiển chuyển đến chương trình xử lý cất đếm chương trình PC vào ngăn xếp bắt đầu nạp lệnh vào vị trí Sau kết thúc thực chương trình lệnh trở RET chuyển điều khiển cho nguồn gọi Mỗi chương trình cần lệnh RET lệnh cuối (xem ví dụ 3.8) Các điểm sau cần phải lưu ý từ ví dụ 3.8 Lưu ý đến chương trình DELAY thực lệnh LCALL DELAY địa lệnh kế MOV A, #0AAH đẩy vào ngăn xếp 8051 bắt đầu thực lệnh địa 300H Trong chương trình DELAY, lúc đầu đếm R5 đặt giá trị 255 (R5 = FFH) Do vậy, vòng lặp lặp lại 256 lần Khi R5 trở điều khiển rơi xuống lệnh quay trở RET mà kéo địa từ ngăn xếp vào đếm chương trình tiếp tục thực lệnh sau lệnh gọi CALL Ví dụ 3.8: HÃy viết chương trình để chốt tất bit cổng P1 cách gửi đến giá trị 55H AAH liên tục HÃy đặt độ trễ thời gian lần xuất liệu tới cổng P1 Chương trình sử dụng để kiểm tra cổng 8051 chương Lời giải: ORG 0000 MOV A, #55H ; Nạp A với giá trị 55H MOV P1, A ; Gưi 55H ®Õn cỉng P1 LCALL DELAY ; T¹o trƠ thêi gian MOV A, #0AAH ; N¹p A với giá trị AAH MOV P1, A ; Gửi AAH đến cổng P1 LCALL DELAY ; Giữ chậm SJMP BACK ; Lặp lại vô tận ; - Đây chương trình tạo độ trễ thời gian ORG 300H ; Đặt chương trình trễ thời gian địa 300H DELAY: MOV R5, #00H ; Nạp đếm R5 = 255H (hay FFH) AGAIN: DJNZ R5, AGAIN ; Tiếp tục R5 không RET ; Trả điều khiển nguồn gọi (khi R5 = 0) END ; Kêt thúc tệp tin hợp ngữ BACK: Lỵng thêi gian trƠ vÝ dơ 8.3 phơc thc vào tần số 8051 Cách tính xác thời gian giải thích chương Tuy nhiên ta tăng thời gian độ trễ cách sử dụng vòng lặp lồng DELAY: NEXT: AGAIN: MOV MOV DJNZ DJNZ CuuDuongThanCong.com R4, #255 R5, #255 R5, AGAIN R4, NEXT ; Vòng lặp lồng giữ chậm ; Nạp R4 = 255 (FFH dạng hex) ; Nạp R5 = 255 (FFH dạng hex) ; Lặp lại RT = ; Giảm R4 ;Tiếp tục nạp R5 R4 = https://fb.com/tailieudientucntt RET ; Trë vÒ (khi R4 = 0) 3.2.2 Lệnh gọi CALL vai trò ngăn xếp Ngăn xếp trỏ ngăn xếp ta nghiên cứu chương cuối Để hiểu tầm quan trọng ngăn xếp vi điều khiển khảo sát nội dung ngăn xếp trỏ ngăn xếp ví dụ 8.3 Điều trình bày ví dụ 3.9 Ví dụ 3.9: HÃy phân tích nội dung ngăn xếp sau thực lệnh LCALL 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 0000 0000 0002 0004 0007 0009 000B 000E 0010 0010 0300 0300 0300 0302 0304 0305 7455 F590 120300 74AA F590 120300 80F0 7DFF DDFE 22 OR6 BACK: MOV A, #55H MOV P1, A LCALL DELAY MOV A, #0AAH MOV P1, A LCALL DELAY SJMP BACK ; Nạp A với giá trị 55H ; Gửi 55H tíi cỉng P1 ; T¹o trƠ thêi gian ; Nạp A với giá trị AAH ; Gửi AAH tới cỉng P1 ; T¹o trƠ thêi gian ; TiÕp tơc thực ; Đây chương trình gi÷ chËm MOV 300H DELAY: MOV R5, #FFH ; N¹p R5 = 255 AGAIN:DJNZ R5, AGAIN ; Dõng ë ®©y RET ; Trë vỊ ngn gäi END ; KÕt thúc nạp tin hợp ngữ Lời giải: Khi lệnh LCALL thực địa lệnh MOV A, #0AAH cất vào ngăn xếp Lưu ý r»ng byte thÊp vµo tríc vµ byte cao vµo sau Lệnh cuối chương trình gọi phải lệnh trở RET để chuyển CPU kéo (POP) byte đỉnh ngăn xếp vào đếm chương trình PC tiếp tục thực lệnh địa 07 Sơ đồ bên khung ngăn xếp sau lần gọi LCALL 0A 09 08 SP = 00 07 09 3.2.3 Sư dơng lƯnh PUSH POP chương trình Khi gọi chương trình ngăn xếp phải bám vị trí mà CPU cần trở Sau kết thúc chương trình lý phải cẩn thận thao tác với nội dung ngăn xếp Nguyên tắc số lần đẩy vào (PUSH) kéo (POP) phải phù hợp chương trình gọi vào Hay nói cách khác lệnh PUSH phải cã mét lƯnh POP Xem vÝ dơ 3.10 3.2.4 Gäi chương trình CuuDuongThanCong.com https://fb.com/tailieudientucntt Trong lập trình hợp ngữ thường có chương trình nhiều chương trình mà chúng gọi từ chương trình Điều cho phép ta tạo chương trình mô-đun riêng biệt Mỗi mô-đun kiểm tra tách biệt sau kết hợp với với chương trình Quan trọng chương trình lớn mô-đun phân cho lập trình viên khác nhằm rút ngắn thời gian phát triển Ví dụ 3.10: Phân tích ngăn xếp lệnh LCALL đoạn mà 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 0000 0000 7455 0002 F590 0004 7C99 0006 7D67 0008 120300 000B 74AA 000D F590 000F 120300 0012 80EC 0014 0300 0300 C004 0302 C005 0304 7CFF 0306 7DFF 0308 DDFE 030A DCFA 030C D005 030E D004 0310 22 0311 ORG MOV A, #55H ; Nạp A với giá trị 55H MOV P1, A ; Gưi 55H cỉng P1 MOV R4, #99H MOV R5, #67H LCALL DELAY ; Tạo giữ chậm thời gian MOV A, #0AAH ; N¹p A víi AAH MOV P1, A ; Gưi AAH cỉng P1 LCALL DELAY SJMP BACK ; Tiếp tục thực ; Đây chương trình DELAY ORG 300H PUSH ; Đẩy R4 vào ngăn xếp PUSH ; Đẩy R5 vào ngăn xếp MOV R4, 00FH ; Gán R4 = FFH MOV R5, #00FH ; G¸n R5 = 255 DJNZ R5, AGAIN DJNZ R4, NEXT POP ; KÐo ®Ønh ngăn xếp vào R5 POP ; Kéo đỉnh ngăn xÕp vµo R4 RET ; Trë vỊ ngn gäi END ; Kết thúc tệp tin hợp ngữ BACK: DELAY NEXT: AGAIN: Lời giải: Trước hết lưu ý lệnh PUSH POP ta phải xác định địa trực tiếp ghi đẩy vào, kéo từ ngăn xếp Dưới sơ đồ khung ngăn xếp Sau lệnh LCALL thứ 0B 0A 09 00 PCH 08 0B PCL Sau lÖnh PUSH 0B 0A 09 0B 99 00 0B R4 PCH PCL 0B 0A 09 08 Sau lÖnh POSH 67 R5 09 R4 00 PCL 0B PCL Cần phải nhấn mạnh việc sử dụng LCALL địa đích chương trình phạm vi 64k byte không gian nhớ 8051 Điều không áp dụng cho tất lệnh gọi CALL chẳng hạn ACALL ®©y: CuuDuongThanCong.com https://fb.com/tailieudientucntt ; MAIN program calling subroutines ORG MAIN: LCALL SUBR-1 LCALL SUBR-2 LCALL SUBR-3 HERE: SJMP ; - end of MAIN ; SUBR-1l RET ; - end of subroutinel ; SUBR-1l RET ; - end of subroutinel ; SUBR-1l RET ; - end of subroutinel END MAIN ; end of the asm file Hình 3.1: Chương trình hợp ngữ 8051 có gọi chương trình 3.2.5 LƯnh gäi tut ®èi ACALL (Absolute call) LƯnh ACALL lệnh byte khác với lệnh LCALL dài byte Do ACALL có byte nên địa đích chương trình phải nằm khoảng 2k byte địa có 11bit byte sử dụng cho địa Không có khác biệt ACALL LCALL khái niệm cất đếm chương trình vào ngăn xếp hay chức lệnh trở RET Sự khác địa đích lệnh LCALL nằm đâu phạm vi 64k byte không gian địa 8051, địa lệnh ACALL phải nằm khoảng byte Trong nhiỊu biÕn thÕ cđa 8051 c¸c h·ng cung cấp ROM chíp có 1k byte Trong trường hợp việc sử dụng ACALL thay cho LCALL tiết kiệm số byte nhớ không gian ROM chương trình Ví dụ 3.11: Một nhà phát triển sử dụng chíp vi điều khiển Atmel AT89C1051 cho sản phẩm Chíp có 1k byte ROM Flash chíp Hỏi lệnh LCALL ACALL lệnh hữu ích lập trình cho chíp Lời giải: Lệnh ACALL hữu ích lệnh byte Nó tiết kiệm byte lần gọi sử dụng Tất nhiên, việc sử dụng lệnh gọn nhẹ, lập trình hiệu b»ng c¸ch cã mét hiĨu biÕt chi tiÕt vỊ tÊt lệnh hỗ trợ vi xử lý đà cho sử dụng chúng cách khôn ngoan Xét ví dụ 3.12 Ví dụ 3.12: HÃy viết lại chương trình ví dụ 3.8 cách hiệu mà bạn có thể: Lời giải: CuuDuongThanCong.com https://fb.com/tailieudientucntt ORG MOV A, #55H ; Nạp Avới giá trị 55H BACK: MOV P1, A ; Xuất giá trị A cỉng P1 ACALL DELAY ; Gi÷ chËm CPL A ; Bï thµnh ghi A SJMP BACK ; Tiếp tục thực vô hạn ; Đây chương trình giữ chậm DELAY DELAY: MOV R5, #0FFH ; N¹p R5 = 255 (hay FFH) làm cho đếm AGAIN: DJNZ R5, AGAIN ; Dừng R5 = RET ; Trở END ; Kết thúc 3.3 Tạo tính toán thời gian giữ chậm 3.3.1 Chu kỳ máy: Đối với CPU để thực lệnh chu kỳ đồng hồ coi chu kú m¸y Phơ lơc AppendixA.2 cung cÊp danh s¸ch liệt kê lệnh 8051 chu kỳ máy chúng Để tính toán độ trễ thời gian, ta sử dụng danh sách liệt kê Trong họ 8051 độ dài chu kỳ máy phụ thuộc vào tần số dao động thạch anh nối vào hệ thống 8051 Bộ dao động thạch anh với mạch điện chip cung cấp xung đồng hồ cho CPU 8051 (xem chương 4) Tần số tinh thể thạch anh nối tới họ 8051 dao động khoảng 4MHz đến 30 MHz phụ thuộc vào tốc độ chíp nhà sản xuất Thường xuyên dao động thạch anh tần số 10.0592MHz sử dụng để làm cho hệ 8051 tương thích víi cỉng nèi tiÕp cđa PC IBM (xem ch¬ng 10) Trong 8051, chu kỳ máy kéo dài 12 chu kỳ dao động Do vậy, để tính toán chu kỳ máy ta lấy 1/12 tần số tinh thể thạch anh, sau lấy giá trị nghịch đảo ví dụ 3.13 Ví dụ 3.13: Đoạn mà trình bày tần số thạch anh cho hệ thống dựa 8051 khác HÃy tìm chu kỳ máy trường hợp: a) 11.0592MHz b) 16MHz c) 20MHz Lời giải: a) 11.0592/12 = 921.6kHz; Chu kỳ máy 1/921.6kHz = 1.085ms (micro giây) b) 16MHz/12 = 1.333MHz; Chu kú m¸y MC = 1/1.333MHz = 0.75ms c) 20MHz/12 = 1.66MHz Þ MC = 1/1.66MHz = 0.60ms VÝ dơ 3.14: §èi víi mét hƯ thèng 8051 cã 11.0592MHz hÃy tìm thời gian cần thiết để thực lệnh sau a) MOV R3, #55 d) LJMP e) SJMP b) DEC R3 f) NOP g) MUL AB c) DJNZ R2 đích Lời giải: Chu kỳ máy cho hệ thống 8051 có tần số đồng hồ 11.0592MHz Là 1.085ms đà tính ví dụ 3.13 Bảng A-1 phụ lục Appendix A trình bày số chu kỳ máy lệnh Vậy ta có: CuuDuongThanCong.com https://fb.com/tailieudientucntt LÖnh (a) MOV (b) DEC (c) DJNZ (d) LJMP (e) SJMP (f) NOP (g) MUL Chu kú m¸y 1 2 R3, #55 R3 R2, target AB Thêi gian thùc hiÖn ´ 1.085 ms = 1.085 ms ´ 1.085 ms = 1.085 ms ´ 1.085 ms = 2.17 ms ´ 1.085 ms = 2.17 ms ´ 1.085 ms = 2.17 ms ´ 1.085 ms = 1.085 ms 1.085 ms = 4.34 ms 3.3.2 Tính toán độ trễ Như đà trình bày đây, chương trình giữ chậm gồm có hai phần: (1) thiết lập đếm (2) vòng lặp Hầu hết thời gian giữ chậm thực thân vòng lặp trình bày ví dụ 3.15 Ví dụ 3.15: HÃy tìm kích thước thời gian giữ chậm chương trình sau, tần số giao động thach anh lµ 11.0592MHz A, #55H P1, A ACALL DELAY CPL A SJMP AGAIN ; Time delay DELAY: MOV R3, #200 HERE : DJNZ R3, HERE RET AGAIN: MOV MOV Lêi gi¶i: Tõ b¶ng A-1 cđa phơ lơc Appendix A ta cã c¸c chu kú m¸y cho lệnh chương trình giữ chậm lµ: DELAY: HERE : MOV DJNZ RET R3, #200 R3, HERE Do vËy tỉng thêi gian gi÷ chËm lµ [(200 ´ 2) + + 1] ´ 1.085 = 436.17ms Thông thường ta tính thời gian giữ chậm dựa lệnh bên vòng lặp bỏ qua chu kỳ đồng hồ liên quan với lệnh vòng lặp Trong ví dụ 3.15 giá trị lớn mà R3 chứa 255, cách tăng độ trễ sử dụng lệnh UOP (không làm gì) vòng lặp để tiêu tốn thời gian cách đơn giản Điều ví dụ 3.16 Ví dụ 3.16: HÃy tìm độ trễ thời gian cho chương trình sau Giả thiết tần số dao động thạch anh lµ 11.0592MHz CuuDuongThanCong.com https://fb.com/tailieudientucntt DELAY: MOV HERE : NOP NOP NOP NOP DJNZ R3, #250 R3, HERE RET Sè chu kú m¸y 1 1 Lời giải: Thời gian trễ bên vòng lặp HERE lµ [250 (1 + + + + + 2)] ´ 1.0851ms = 1627.5ms Céng thªm hai lệnh vòng lặp ta có 1627.5ms 1.085ms = 1629.67ms 3.3.3 Độ trễ thời gian vòng lặp vòng lặp Một cách khác để nhận giá trị từ độ trễ lớn sử dụng vòng lặp bên vòng lặp gọi vòng lặp lồng Xem ví dụ 3.17 Ví dụ 3.17: Đối với chu kỳ máy 1.085ms hÃy tính thời gian giữ chậm chương trình sau: DELAY: AGAIN: HERE: MOV MOV NOP NOP DJNZ DJNZ RET R2, #200 R3, #250 R3, HERE R2, AGAIN chu kú máy 1 1 2 Lời giải: Đối với vòng lặp HERE ta có (4 250) 1.085ms = 1085ms Vòng lặp AGAIN lặp vòng lặp HERE 200 lần, thời gian trễ 200 1085ms 217000ms, nên ta không tính tổng phí Tuy nhiên, lệnh MOV R3, #250 DJNZ R2, AGAIN đầu cuối vòng lặp AGAIN cộng (3 200 ´ 1.085ms) = 651ms vµo thêi gian trƠ vµ kÕt qu¶ ta cã 217000 + 651 = 217651ms = 217.651 miligiây cho tổng thời gian trễ liên quan đến chương trình giữ chậm DELAY nói Lưu ý rằng, trường hợp vòng lặp lồng vòng lặp giữ chậm khác thời gian xấp xỉ gần dúng ta bỏ qua lệnh đầu cuối chương trình CuuDuongThanCong.com https://fb.com/tailieudientucntt ... với số đếm 70 vòng lặp bắt đầu lại trình tiếp tục R3 trở không vòng lặp kết thúc 3. 1 .3 Các lệnh nhảy có điều kiện Các lệnh nhảy có điều kiện 8051 tổng hợp bảng 3. 1 Các chi tiết lệnh cho phụ lục... lực vi phạm luật hợp ngữ tạo lỗi báo lệnh nhảy phạm vi 3. 2 Các lệnh gọi CALL Một lệnh chuyển điều khiển khác lệnh CALL dùng để gọi chương trình Các chương trình thường sử dụng để thực thi công vi? ??c... 1.085ms = 1629.67ms 3. 3 .3 Độ trễ thời gian vòng lặp vòng lặp Một cách khác để nhận giá trị từ độ trễ lớn sử dụng vòng lặp bên vòng lặp gọi vòng lặp lồng Xem ví dụ 3. 17 Ví dụ 3. 17: Đối víi mét chu