Các Lệnh Nhảy, Vòng Lặp Và Lệnh Gọi Các Vi điều Khiển 8051 Chương 3

Tải bản đầy đủ (.pdf) (12 trang)
  1. Trang chủ
  2. >>
  3. Công nghệ thông tin
  4. >>
  5. Mã hóa - Giải mã và thuật toán
Các lệnh nhảy, vòng lặp và lệnh gọi các vi điều khiển 8051 chương 3

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (130.17 KB, 12 trang )

chương 3Các lệnh nhảy, vòng lặp và lệnh gọiTrong một chuỗi lệnh cần thực hiện thường có nhu cần cần chuyển điều khiểnchương trình đến một vị trí khác. Có nhiều lệnh để thực hiện điều này trong 8051, ởchương này ta sẽ tìm hiểu các lệnh chuyển điều khiển có trong hợp ngữ của 8051như các lệnh sử dụng cho vòng lặp, các lệnh nhảy có và không có điều khiển, lệnhgọi và cuối cùng là mô tả về một chương trình con giữ chậm thời gian.3.1 Vòng lặp và các lệnh nhảy.3.1.1 Tạo vòng lặp trong 8051.Qúa trình lặp lại một chuỗi các lệnh với một số lần nhất định được gọi là vònglặp. Vòng lặp là một trong những hoạt động được sử dụng rộng rÃi nhất mà bất kỳ bộvi sử lý nào đều thực hiện. Trong 8051 thì hoạt động vòng lặp được thực hiện bëilƯnh “DJNZ thanh ghi, nh·n”. Trong lƯnh nµy thanh ghi được giảm xuống, nếu nókhông bằng không thì nó nhảy đến địa chỉ đích được tham chiếu bởi nhÃn. Trước khibắt đầu vòng lặp thì thanh ghi được nạp với bộ đếm cho số lần lặp lại. Lưu ý rằng,trong lệnh này việc giảm thanh ghi và quyết định để nhảy được kết hợp vào trongmột lệnh đơn.Ví dụ 3.1:Viết một chương trình để: a) xoá ACC và sau đó b) cộng 3 vào ACC 10 lần.Lời giải:BACK:MOVMOVADDDJNZMOVA, #0R2, #10A, #10R2, AGAINR5, A; Xoá ACC, A = 0; Nạp bộ đếm R2 = 10; Cộng 03 vào ACC; Lặp lại cho đến khi R2 = 0 (10 lần); Cắt A vào thanh ghi R5Trong chương trình trên đây thanh ghi R2 được sử dụng như là bộ đếm. Bộđếm lúc đầu được đặt bằng 10. Mỗi lần lặp lại lệnh DJNZ giảm R2 không bằng 0 thìnó nhảy đến địa chỉ đích gắn với nhÃn AGAIN. Hoạt động lặp lại này tiếp tục chođến khi R2 trở về không. Sau khi R2 = 0 nó thoát khỏi vòng lặp và thực hiện đứngngay dưới nó trong trường hợp này là lƯnh “MOV R5, A”.L­u ý r»ng trong lƯnh DJNZ th× các thanh ghi có thể là bất kỳ thanh ghi nàotrong các thanh ghi R0 - R7. Bộ đếm cũng có thể là một ngăn nhớ trong RAM như tasẽ thấy ở chương 5.Ví dụ 3.2:Số lần cực đại mà vòng lặp ở ví dụ 3.1 có thể lặp lại là bao nhiêu?Lời giải:Vì thanh ghi R2 chứa số đếm và nó là thanh ghi 8 bit nên nó có thể chứa đượcgiá trị cực đại là FFH hay 155. Do vậy số lần lặp lại cực đại mà vòng lặp ở ví dụ 3.1có thể thực hiện là 256.3.2.1 Vòng lặp bền trong một vòng lặp.Như trình bày ở ví dụ 3.2 số đếm cực đại là 256. Vậy điều gì xảy ra nếu tamuốn lặp một hành động nhiều hơn 256 lần? Để làm điều đó thì ta sử dụng một vònglặp bên trong một vòng lặp được gọi là vòng lặp lồng (Nested Loop). Trong mộtvòng lặp lồng ta sử dụng 2 thanh ghi để giữ số ®Õm. XÐt vÝ dơ 3.3 d­íi ®©y.CuuDuongThanCong.com /> Ví dụ 3.3:HÃy viết một chương trình a) nạp thanh ghi ACC với giá trị 55H và b) bùACC 700 lần.Lời giải:Vì 700 lớn hơn 256 (là số cực đại mà một thanh ghi vó thể chứa được) nên taphải dùng hai thanh ghi để chứa số đếm. Đoạn mà dưới đây trình bày cách sử dụnghai thanh ghi R2 và R3 để chứa số đếm.NEXT:AGAIN: `MOVMOVMOVCPLDJNZDJNZA, #55HR3, #10R2, #70AR2, AGAINR3, NEXT; N¹p A = 55H; N¹p R3 = 10 số đếm vòng lặp ngoài; Nạp R2 = 70 số đếm vòng lặp trong; Bù thanh ghi A; Lặp lại 70 lần (vòng lặp trong)Trong chương trình này thanh ghi R2 được dùng để chứa số đếm vòng lặptrong. Trong lệnh DJNZ R2, AGAIN thì mỗi khi R2 = 0 nó đi thẳng xuống và lệnhJNZ R3, NEXT được thực hiện. Lệnh này ép CPU nạp R2 với số đếm 70 và vònglặp trong khi bắt đầu lại quá trình này tiếp tục cho đến khi R3 trở về không và vònglặp ngoài 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 đối với 8051 được tổng hợp trong bảng 3.1. Cácchi tiết về mỗi lệnh được cho trong phụ lục AppendixA. Trong bảng 3.1 lưu ý r»ngmét sè lƯnh nh­ JZ (nh¶y nÕu A = 0) và JC (nhảy nếu có nhớ) chỉ nhảy nếu một điềukiện nhất định được thoả mÃn. Kế tiếp ta xét một số lệnh nhảy có điều kiện với cácVí dụ minh hoạ sau.a- Lệnh JZ (nhảy nếu A = 0). Trong lƯnh nµy néi dung cđa thanh ghi A được kiểmtra. Nếu nó bằng không thì nó nhảy đến địa chỉ đích. Ví dụ xét đoạn mà sau:MOVJZMOVJZOVER ...A, R0OVERA, R1OVER; Nạp giá trị của R0 vào A; Nhảy đến OVER nếu A = 0; Nạp giá trị của R1 vào A; Nhảy đến OVER nếu A = 0Trong chương trình này nếu R0 hoặc R1 có giá trị bằng 0 thì nó nhảy đến địachỉ có nhÃn OVER. Lưu ý rằng lệnh JZ chỉ có thể được sử dơng ®èi víi thanh ghi A.Nã chØ cã thĨ kiĨm tra xem thanh ghi A có bằng không không và nó không áp dụngcho bất kỳ thanh ghi nào khác. Quan trọng hơn là ta không phải thực hiện một lệnhsố học nào như đếm giảm để sử dụng lệnh JNZ như ở ví dụ 3.4 dưới đây.Ví dụ 3.4:Viết một chương trình để xác định xem R5 có chứa giá trị 0 không? Nếu nạpthì nó cho giá trị 55H.Lời giải:MOVJNZMOVCuuDuongThanCong.comA, R5NEXTR5, #55H; Sao nội dung R5 vào A; Nhảy đến NEXT nếu A không bằng 0; /> NEXT:...b- Lệnh JNC (nhảy nếu không có nhớ, cờ CY = 0).Trong lệnh này thì bit cờ nhớ trong thanh ghi cờ PSW được dùng để thực hiệnquyết định nhảy. Khi thùc hiƯn lƯnh “JNC nh·n” th× bé xư lý kiểm tra cờ nhớ xem nócó được bật không (CY = 1). Nếu nó không bật thì CPU bắt đầu nạp và thực hiện cáclệnh từ địa chỉ của nhÃn. Nếu cờ CY = 1 thì nó sẽ không nhảy và thực hiện lệnh kếtiếp dưới JNC.Cần phải lưu ý r»ng cịng cã lƯnh “JC nh·n”. Trong lƯnh JC th× nếu CY = 1 nónhảy đến địa chỉ đích là nh·n. Ta sÏ xÐt c¸c vÝ dơ vỊ c¸c lƯnh này trong các ứngdụng ở các chương sau.Ngoài ra còn có lệnh JB (nhảy nếu bit có mức cao) và JNB (nhảy nếu bit cómức thấp). Các lệnh này được trình bày ở chương 4 và 8 khi nói về thao tác bit.Bảng 3.1: Các lệnh nhảy có điều kiện.LệnhJZJNZDJNZCJNE A, byteCJNE re, # dataJCJNCJBJNBJBCHoạt độngNhảy nếu A = 0Nhảy nếu A 0Giảm và nhảy nếu A = 0Nhảy nếu A byteNh¶y nÕu Byte dataNh¶y nÕu CY = 1Nh¶y nÕu CY = 0Nh¶y nÕu bit = 1Nh¶y nÕu bit = 0Nhảy nếu bit = 1 và xoá nóVí dụ 3.5:HÃy tìm tổng của các giá trị 79H, F5H và E2H. Đặt vào trong các thanh ghiR0 (byte thấp) và R5 (byte cao).Lời giải:MOVMOVADDJNCINCN-1:ADDJNCINCN-2:ADDJNCINCOVER: MOVA, #0R5, AA #79HN-1R5; Xoá thanh ghi A = 0; Xoá R5; Cộng 79H vào A (A = 0 + 79H = 79H); NÕu kh«ng cã nhí cộng kế tiếp; Nếu CY = 1, tăng R5A, #0F5HN-2R5A, #0E2HOVERR5R0, A; Céng F5H vµo A (A = 79H + F5H = 6EH) và CY = 1; Nhảy nếu CY = 0; Nếu CY = 1 tăng R5 (R5 = 1); Céng E2H vµo A (A = GE + E2 = 50) và CY = 1; Nhảy nếu CY = 0; Nếu CY = 1 tăng R5; Bây giờ R0 = 50H và R5 = 02c- Tất cả các lệnh nhảy có điều kiện đều là những phép nhảy ngắn.CuuDuongThanCong.com /> Cần phải lưu ý rằng tất cả các lệnh nhảy có điều kiện đều là các phép nhảyngắn, có nghĩa là địa chỉ của đích đều phải nằm trong khoảng -127 đến +127 bytecủa nội dung bộ đế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 là một phép nhảy trong đó điều khiển được truyềnkhông điều kiện đến địa chỉ đích. Trong 8051 có hai lệnh nhảy không điều kiện đólà: LJMP - nhảy xa và SJMP - nhảy gần.a- Nhảy xa LJMP:Nhảy xa LJMP là một lệnh 3 byte trong đó byte đầu tiên là mà lệnh còn haibyte còn lại là địa chỉ 16 bit của đích. Địa chỉ đích 02 byte có phép một phép nhảyđến bất kỳ vị trí nhớ nào trong khoảng 0000 - FFFFH.HÃy nhớ rằng, mặc dù bộ đếm chương trình trong 8051 là 16 bit, do vậy chokhông gian địa chỉ là 64k byte, nhưng bộ nhớ chương trình ROM trên chíp lớn nhưvậy. 8051 đầu tiên chỉ có 4k byte ROM trên chíp cho không gian chương trình, dovậy mỗi byte đều rất quý giá. Vì lý do đó mà có cả lệnh nhảy gần SJMP chØ cã 2byte so víi lƯnh nh¶y xa LZ0MP dài 3 byte. Điều này có thể tiết kiệm được mét sèbyte bé nhí trong rÊt nhiỊu øng dơng mµ không gian bộ nhớ có hạn hẹp.b- Lệnh nhảy gồm SJMP.Trong 2 byte này thì byte đầu tiên là mà lệnh và byte thứ hai là chỉ tương đốicủa địa chỉ đích. Đích chỉ tương đối trong phạm vi 00 - FFH được chia thành cáclệnh nhảy tới và nhảy lùi: Nghĩa là -128 đến +127 byte của bộ nhớ tương đối so vớiđịa chỉ hiện thời của bộ đếm chương trình. Nếu là lệnh nhảy tới thì địa chỉ đích cóthể nằm trong khoảng 127 byte từ giá trị hiện thời của bộ đếm chương trình. Nếu địachỉ đích ở phía sau thì nó có thể nằm trong khoảng -128 byte từ giá trị hiện hành củaPC.3.1.5 Tính toán địa chỉ lệnh nhảy gần.Ngoài lệnh nhảy gần SJMP thì tất cả mọi lệnh nhảy có điều kiện như JNC, JZvà DJNZ đều là các lệnh nhảy gần bởi một thực tế là chúng đều lệnh 2 byte. Trongnhững lệnh này thì byte thứ nhất đều là mà lệnh, còn byte thứ hai là địa chỉ tươngđối. Địa chỉ đích là tương đối so với giá trị của bộ đếm chương trình. Để tính toánđịa chỉ đích byte thứ hai được cộng vào thanh ghi PC của lệnh đứng ngay sau lệnhnhảy. Để hiểu điều này hÃy xét ví dụ 3.6 dưới đây.Ví dụ 3.6:Sử dụng tệp tin liệt kê dưới đây hÃy kiểm tra việc tín toán địa chỉ nh¶y vỊtr­íc.01020304050607080910111200000000000200040006000700080009000B000D000E000FCuuDuongThanCong.com78007455600308040424775005E4F8F9AGAIN: INCNEXT:ORGMOVMOVJZNICINCADDJNCCLRMOVMOVA0000R0, #0A, #55HNEXTR0AA, #77hOVERAR0, AR1, A /> 131415161718001000110012001300150017FAFB2B50F280FEOVER:HERE:MOVMOVADDJNCSJMPENDR2, AR3, AA, R3AGAINSHERELời giải:Trước hết lưu ý rằng các lệnh JZ và JNC đều là lệnh nhảy về trước. Địa chỉđích đối với lệnh nhảy về trước được tính toán bằng cách cộng giá trị PC của lệnh đingay sau đó vào byte thứ hai của lệnh nhảy gần được gọi là địa chỉ tương đối. ởdòng 04 lệnh JZ NEXT có mà lệnh 60 và toán hạng 03 tại địa chỉ 0004 và 0005. ởđây 03 là địa chỉ tương đối, tương đối so với địa chỉ của lệnh kế tiếp là: INC R0 vàđó là 0006. Bằng việc cộng 0006 vào 3 thì địa chỉ đích của nhÃn NEXT là 0009 đượctạo ra. Bằng cách tương tự như vậy đối với dòng 9 thì lệnh JNC OVER có mà lệnhvà toán hạng là 50 và 05 trong đó 50 là mà lệnh và 05 là địa chỉ tương đối. Do vậy,05 được cộng vào OD là địa chØ cđa lƯnh “CLA A” ®øng ngay sau lƯnh “JNCOVER” và cho giá trị 12H chính là địa chỉ của nhÃn OVER.Ví dụ 3.7:HÃy kiểm tra tính toán địa chỉ của các lệnh nhảy lùi trong ví dụ 3.6.Lời giải:Trong danh sách liệt kê chương trình đó thì lệnh JNC AGAIN có mà lệnh là50 và địa chỉ tương đối là F2H. Khi địa chỉ tương đối của F2H được cộng vào 15H làđịa chỉ của lệnh đứng dưới lệnh nhảy ta có 15H + F2H = 07 (và phần nhớ được bỏđi). Để ý rằng 07 là địa chỉ nh·n AGAIN. Vµ h·y cịng xÐt lƯnh “SJMP HERE” cãm· lệnh 80 và địa chỉ tương đối FE giá trị PC của lệnh kế tiếp là 0017H được cộngvào địa chỉ tương đối FEH ta nhận được 0015H chính là địa chỉ nhÃn HERE (17H +FEH = 15H) phần nhớ được bỏ đi). Lưu ý rằng FEH là -2 và 17h + (-2) = 15H. VỊphÐp céng sè ©m sÏ được bàn ở chương 6.3.1.6 Tính toán địa chỉ đích nhảy lùi.Trong khi ở trường hợp nhảy tới thì giá trị thay thế là một số dương trongkhoảng từ 0 đến 127 (00 đến 7F ở dạng Hex) thì đối với lệnh nhảy lùi giá trị thay thếlà một số âm nằm trong khoảng từ 0 đến -128 như được giải thích ở ví dụ 3.7.Cần phải nhấn mạnh rằng, bất luận SJMP nhảy tới hay nhảy lùi thì đối vớimột lệnh nhảy bất kỳ địa chỉ của địa chỉ đích không bao giờ có thể lớn hơn 0 -128đến +127 byte so với địa chỉ gắn liền với lệnh đứng ngay sau lệnh SJMP. Nếu có mộtsự nỗ lực nào vi phạm luật này thì hợp ngữ sẽ tạo ra một lỗi báo rằng lệnh nhảyngoài 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à lệnh CALL được dùng để gọi mộtchương trình con. Các chương trình con thường được sử dụng để thực thi các côngviệc cần phải được thực hiện thường xuyên. Điều này làm cho chương trình trở nêncó cấu trúc hơn ngoài việc tiết kiệm được thêm không gian bộ nhớ. Trong 8051 có 2lệnh để gọi đó là: Gọi xa CALL và gọi tuyệt đối ACALL mà quyết định sử dụnglệnh nào đó phụ thuộc vào địa chỉ đích.3.2.1 Lệnh gọi xa LCALL.CuuDuongThanCong.com /> Trong lệnh 3 byte này thì byte đầu tiên là mà lệnh, còn hai byte sau đượcdùng cho địa chỉ của chương trình con đích. Do vậy LCALL có thể được dùng để gọicác chương trình con ở bất kỳ vị trí nào trong phạm vi 64k byte, không gian địa chỉcủa 8051. Để đảm bảo rằng sau khi thực hiện một chương trình được gọi để 8051biết được chỗ quay trở về thì nó tự động cất vào ngăn xếp địa chỉ của lệnh đứng ngaysau lệnh gọi LCALL. Khi một chương trình con được gọi, điều khiển được chuyểnđến chương trình con đó và bộ xử lý cất bộ đếm chương trình PC vào ngăn xếp và bắtđầu nạp lệnh vào vị trí mới. Sau khi kết thúc thực hiện chương trình con thì lệnh trởvề RET chuyển điều khiển về cho nguồn gọi. Mỗi chương trình con cần lệnh RETnhư là lệnh cuối cùng (xem ví dụ 3.8).Các điểm sau đây cần phải được lưu ý từ ví dụ 3.8.1. Lưu ý đến chương trình con DELAY khi thực hiện lệnh LCALL DELAYđầu tiên thì địa chỉ của lệnh ngay kế nó là MOV A, #0AAH được đẩy vàongăn xếp và 8051 bắt đầu thực hiện các lệnh ở địa chỉ 300H.2. Trong chương trình con DELAY, lúc đầu bộ đếm R5 được đặt về giá trị 255(R5 = FFH). Do vậy, vòng lặp được lặp lại 256 lần. Khi R5 trở về 0 điềukhiển rơi xuống lệnh quay trở về RET mà nó kéo địa chỉ từ ngăn xếp vào bộđếm chương trình và tiếp tục thùc hiƯn lƯnh sau lƯnh gäi CALL.VÝ dơ 3.8:H·y viÕt một chương trình để chốt tất cả các bit của cổng P1 bằng cách gửiđến nó giá trị 55H và AAH liên tục. HÃy đặt một độ trễ thời gian giữa mỗi lần xuấtdữ liệu tới cổng P1. Chương trình này sẽ được sử dụng để kiểm tra các cổng của8051 trong chương tiếp theo.Lời giải:ORG 0000MOV A, #55H; Nạp A với giá trị 55HMOV P1, A; Gửi 55H đến cỉng P1LCALL DELAY; T¹o trƠ thêi gianMOV A, #0AAH; N¹p A với giá trị AAHMOV P1, A; Gửi AAH đến cổng P1LCALL DELAY; Giữ chậmSJMP BACK; Lặp lại vô tận; ------------------ - Đây là chương trình con tạo độ trễ thời gianORG 300H; Đặt chương trình con trễ thời gian ở địa chỉ 300HDELAY:MOV R5, #00H; Nạp bộ đếm R5 = 255H (hay FFH)AGAIN:DJNZ R5, AGAIN; TiÕp tơc cho ®Õn khi R5 về khôngRET; Trả điều khiển về nguồn gọi (khi R5 = 0)END; Kêt thúc tệp tin của hợp ngữBACK:Lượng thời gian trễ trong ví dụ 8.3 phục thuộc vào tần số của 8051. Cách tínhchính xác thời gian sẽ được giải thích ở chương 4. Tuy nhiên ta có thể tăng thời gianđộ trễ bằng cách sử dụng vòng lặp lồng như chỉ ra dưới đây.DELAY:NEXT:AGAIN:MOVMOVDJNZDJNZCuuDuongThanCong.comR4, #255R5, #255R5, AGAINR4, 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 cho đến khi RT = 0; Giảm R4;Tiếp tục nạp R5 cho đến khi R4 = 0 /> RET; Trë vỊ (khi R4 = 0)3.2.2 LƯnh gäi CALL và vai trò của ngăn xếp.Ngăn xếp và con trỏ ngăn xếp ta sẽ nghiên cứu ở chương cuối. Để hiểu đượctầm quan trọng của ngăn xếp trong các bộ vi điều khiển bây giờ khảo sát nội dungcủa ngăn xếp và con trỏ ngăn xếp đối với ví dụ 8.3. Điều này được trình bày ở ví dụ3.9 dưới đây.Ví dụ 3.9:HÃy phân tích nội dung của ngăn xếp sau khi thực hiện lệnh LCALL đầu tiêndưới đây.001002003004005006007008009010011012013014015016000000000002000400070009000B000E001000100300030003000302030403057455F59012030074AAF59012030080F07DFFDDFE22OR6BACK: MOV A, #55HMOV P1, ALCALL DELAYMOV A, #0AAHMOV P1, ALCALL DELAYSJMP 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ổngP1; Tạo trễ thời gian; Tiếp tục thực hiện; ..................... Đây là chương trình con giữ chậmMOV 300HDELAY:MOV R5, #FFH; Nạp R5 = 255AGAIN:DJNZ R5, AGAIN; Dừng ở đâyRET; Trở về nguồn gọiEND; Kết thúc nạp tin hợp ngữLời giải:Khi lệnh LCALL đầu tiên được thực hiện thì địa chỉ của lệnh MOV A,#0AAH được 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 cùng của chương trình con được gọi phải là lệnh trở về RET để chuyểnCPU kéo (POP) các byte trên đỉnh của ngăn xếp vào bộ đếm chương trình PC và tiếptục thực hiện lệnh tại địa chỉ 07. Sơ đồ bên chỉ ra khung của ngăn xếp sau lần gọiLCALL đầu tiên.0A0908SP=0007093.2.3 Sử dụng lệnh PUSH và POP trong các chương trình con.Khi gọi một chương trình con thì ngăn xếp phải bám được vị trí mà CPU cầntrở về. Sau khi kết thúc chương trình con vì lý do này chúng ta phải cẩn thận mỗi khithao tác với các nội dung của ngăn xếp. Nguyên tắc là số lần đẩy vào (PUSH) và kéora (POP) luôn phải phù hợp trong bất kỳ chương trình con được gọi vào. Hay nóicách khác đối với mỗi lệnh PUSH thì phải có một lệnh POP. Xem ví dụ 3.10.3.2.4 Gọi các chương trình con.CuuDuongThanCong.com /> Trong lập trình hợp ngữ thường có một chương trình chính và rất nhiềuchương trình con mà chúng được gọi từ chương trình chính. Điều này cho phép ta tạomới chương trình con trong một mô-đun riêng biệt. Mỗi mô-đun có thể được kiểmtra tách biệt và sau đó được kết hợp với nhau cùng với chương trình chính. Quantrọng hơn là trong một chương trình lớn thì các mô-đun có thể được phân cho các lậptrình viên khác nhau 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 đối với lệnh LCALL đầu tiên trong đoạn m·.0102030405060708091011121314151617181920212200000000 74550002 F5900004 7C990006 7D670008 120300000B 74AA000D F590000F 1203000012 80EC001403000300 C0040302 C0050304 7CFF0306 7DFF0308 DDFE030A DCFA030C D005030E D0040310 220311ORG0MOVA, #55H; Nạp A với giá trị 55HMOVP1, A; Gửi 55H ra cổng P1MOVR4, #99HMOVR5, #67HLCALLDELAY; Tạo giữ chậm thời gianMOVA, #0AAH; N¹p A víi AAHMOVP1, A; Gưi AAH ra cỉng P1LCALLDELAYSJMPBACK; Tiếp tục thực hiện; ............ Đây là chương trình con DELAYORG300HPUSH4; Đẩy R4 vào ngăn xếpPUSH5; Đẩy R5 vào ngăn xÕpMOVR4, 00FH; G¸n R4 = FFHMOVR5, #00FH; G¸n R5 = 255DJNZR5, AGAINDJNZR4, NEXTPOP5; Kéo đỉnh ngăn xếp vào R5POP4; Kéo đỉnh ngăn xếp vào R4RET; Trở về nguồn gọiEND; Kết thúc tệp tin hợp ngữBACK:DELAYNEXT:AGAIN:Lời giải:Trước hết lưu ý rằng đối với các lệnh PUSH và POP ta phải xác định địa chỉtrực tiếp của thanh ghi được đẩy vào, kéo ra từ ngăn xếp. Dưới đây là sơ đồ khungcủa ngăn xếp.Sau lệnh LCALL thứ nhất0B0A0900PCH080BPCLSau lệnh PUSH 40B0A090B99000BR4PCHPCL0B0A0908Sau lệnh POSH 567R509R400PCL0BPCLCần phải nhấn mạnh rằng trong việc sử dụng LCALL thì địa chỉ đích của cácchương trình con có thể ở đâu đó trong phạm vi 64k byte không gian bộ nhớ của8051. Điều này không áp dụng cho tất cả mọi lệnh gọi CALL chẳng hạn như ®èi víiACALL d­íi ®©y:CuuDuongThanCong.com /> ; MAIN program calling subroutinesORG0MAIN:LCALLSUBR-1LCALLSUBR-2LCALLSUBR-3HERE:SJMP;----------------- end of MAIN;SUBR-1l......RET; ----------------- end of subroutinel; SUBR-1l......RET; ----------------- end of subroutinel; SUBR-1l......RET; ----------------- end of subroutinelENDMAIN123; end of the asm fileHình 3.1: Chương trình chính hợp ngữ của 8051 có gọi các chương trình con.3.2.5 Lệnh gọi tuyệt đối ACALL (Absolute call).Lệnh ACALL là lệnh 2 byte khác với lệnh LCALL dài 3 byte. Do ACALL chỉcó 2 byte nên địa chỉ đích của chương trình con phải nằm trong khoảng 2k byte địachỉ vì chỉ có 11bit của 2 byte được sử dụng cho địa chỉ. Không có sự khác biệt nàogiữa ACALL và LCALL trong khái niệm cất bộ đếm chương trình vào ngăn xếp haytrong chức năng của lệnh trở về RET. Sự khác nhau duy nhất là địa chỉ đích của lệnhLCALL có thể nằm bất cứ đâu trong phạm vi 64k byte không gian địa chỉ của 8051,còn trong khi đó địa chỉ của lệnh ACALL phải nằm trong khoảng 2 byte. Trongnhiều biến thế của 8051 do các hÃng cung cấp thì ROM trên chíp chỉ có 1k byte..Trong những trường hợp như vậy thì việc sử dụng ACALL thay cho LCALL có thểtiết kiệm được một số byte bộ nhớ của 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 một sảnphẩm. Chíp này chỉ có 1k byte ROM Flash trªn chÝp. Hái trong khi lƯnh LCALL vàACALL thì lệnh nào hữu ích nhất trong lập trình cho chíp này.Lời giải:Lệnh ACALL là hữu ích hơn vì nã lµ lƯnh 2 byte. Nã tiÕt kiƯm mét byte mỗilần gọi được sử dụng.Tất nhiên, việc sử dụng các lƯnh gän nhĐ, chóng ta cã thĨ lËp tr×nh hiƯu quảbằng cách có một hiểu biết chi tiết về tất cả các lệnh được hỗ trợ bởi bộ vi xử lý đÃcho và sử dụng chúng một cách khôn ngoan. Xét ví dụ 3.12 dưới đây.Ví dụ 3.12:HÃy viết lại chương trình ở ví dụ 3.8 một cách hiệu quả mà bạn có thể:Lời giải:CuuDuongThanCong.com /> ORG0MOVA, #55H; Nạp Avới giá trị 55HBACK: MOVP1, A; Xuất giá trị trong A ra cổng P1ACALLDELAY; Giữ chậmCPLA; Bù thành ghi ASJMPBACK; Tiếp tục thực hiện vô hạn; -------- Đây là chương trình con giữ chậm DELAYDELAY:MOVR5, #0FFH; Nạp R5 = 255 (hay FFH) làm cho bộ đếmAGAIN: DJNZR5, AGAIN; Dừng ở đây cho đến khi R5 = 0RET; Trở vềEND; Kết thúc3.3 Tạo và tính toán thời gian giữ chậm.3.3.1 Chu kỳ máy:Đối với CPU để thực hiện một lệnh thì mất một chu kỳ đồng hồ này được coinhư các chu kỳ máy. Phụ lục AppendixA.2 cung cấp danh sách liệt kê các lệnh 8051và các chu kỳ máy của chúng. Để tính toán một độ trễ thời gian, ta sử dụng danhsách liệt kê này. Trong họ 8051 thì độ dài của chu kỳ máy phụ thuộc vào tần số củabộ dao động thạch anh được nối vào hệ thống 8051. Bộ dao động thạch anh cùng vớimạch điện trên chip cung cấp xung đồng hồ cho CPU của 8051 (xem chương 4). Tầnsố của tinh thể thạch anh được nối tới họ 8051 dao động trong khoảng 4MHz đến 30MHz phụ thuộc vào tốc độ chíp và nhà sản xuất. Thường xuyên nhất là bộ dao độngthạch anh tần số 10.0592MHz được sử dụng để làm cho hệ 8051 tương thích vớicổng nối tiếp của PC IBM (xem ch­¬ng 10). Trong 8051, mét chu kú máy kéo dài 12chu kỳ dao động. Do vậy, để tính toán chu kỳ máy ta lấy 1/12 của tần số tinh thểthạch anh, sau đó lấy giá trị nghịch đảo như chỉ ra trong ví dụ 3.13.Ví dụ 3.13:Đoạn mà dưới đây trình bày tần số thạch anh cho 3 hệ thống dựa trên 8051khác nhau. HÃy tìm chu kỳ máy của mỗi trường hợp: a) 11.0592MHz b) 16MHz vàc) 20MHz.Lời giải:a) 11.0592/12 = 921.6kHz; Chu kỳ máy là 1/921.6kHz = 1.085ms (micro gi©y)b) 16MHz/12 = 1.333MHz; Chu kú máy MC = 1/1.333MHz = 0.75msc) 20MHz/12 = 1.66MHz ị MC = 1/1.66MHz = 0.60msVÝ 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 hiện các lệnh sau đây.a) MOV R3, #55d) LJMP e) SJMPb) DEC R3f) NOP g) MUL ABc) DJNZ R2 đíchLời giải:Chu kỳ máy cho hệ thống 8051 có tần số đồng hồ là 11.0592MHz Là 1.085msnhư đà tính ở vÝ dơ 3.13. B¶ng A-1 trong phơ lơc Appendix A trình bày số chu kỳmáy đối với các lệnh trên. VËy ta cã:CuuDuongThanCong.com /> LƯnh(a) MOV(b) DEC(c) DJNZ(d) LJMP(e) SJMP(f) NOP(g) MULChu kú m¸y1122214R3, #55R3R2, targetABThêi gian thùc hiÖn1 ´ 1.085 ms = 1.085 ms1 ´ 1.085 ms = 1.085 ms2 ´ 1.085 ms = 2.17 ms2 ´ 1.085 ms = 2.17 ms2 ´ 1.085 ms = 2.17 ms1 ´ 1.085 ms = 1.085 ms4 1.085 ms = 4.34 ms3.3.2 Tính toán độ trễ.Như đà trình bày ở trên đây, một chương trình con giữ chậm gồm có haiphần: (1) thiết lập bộ đếm và (2) một vòng lặp. Hầu hết thời gian giữ chậm được thựchiện bởi thân vòng lặp như trình bày ở ví dụ 3.15.Ví dụ 3.15:HÃy tìm kích thước của thời gian giữ chậm trong chương trình sau, nếu tần sốgiao động thach anh là 11.0592MHz.A, #55HP1, AACALL DELAYCPLASJMP AGAIN; -------- Time delayDELAY: MOVR3, #200HERE :DJNZ R3, HERERETAGAIN: MOVMOVLêi gi¶i:Tõ b¶ng A-1 cđa phơ lơc Appendix A ta cã các chu kỳ máy sao cho các lệnhcủa chương trình con giữ chậm là:DELAY:HERE :MOVDJNZRETR3, #200R3, HERE121Do vậy tổng thời gian giữ chậm là [(200 2) + 1 + 1] ´ 1.085 = 436.17ms.Th«ng th­êng ta tÝnh thêi gian giữ chậm dựa trên các lệnh bên trong vòng lặpvà bỏ qua các chu kỳ đồng hồ liên quan với các lệnh ở ngoài vòng lặp.Trong ví dụ 3.15 giá trị lớn nhất mà R3 có thể chứa là 255, do vậy một cáchtăng độ trễ là sử dụng lệnh UOP (không làm gì) trong vòng lặp để tiêu tốn thời gianmột cách đơn giản. Điều này được chỉ ra trong ví dụ 3.16 dưới đây.Ví dụ 3.16:HÃy tìm độ trễ thời gian cho chương trình con sau. Giả thiết tần số dao độngthạch anh là 11.0592MHz.CuuDuongThanCong.com /> DELAY:MOVHERE :NOPNOPNOPNOPDJNZR3, #250R3, HERERETSố chu kỳ máy1111121Lời giải:Thời gian trễ bên trong vòng lặp HERE là [250 (1 + 1 + 1 + 1 + 1 + 2)] ´1.0851ms = 1627.5ms. Cộng thêm hai lệnh ngoài vòng lặp ta có 1627.5ms 1.085ms= 1629.67ms.3.3.3 Độ trễ thời gian của vòng lặp trong vòng lặp.Một cách khác để nhận được giá trị từ độ trễ lớn là sử dụng một vòng lặp bêntrong vòng lặp và cũng được gọi là vòng lặp lồng nhau. Xem ví dụ 3.17 dưới đây.Ví dụ 3.17:Đối với một chu kỳ máy 1.085ms hÃy tính thời gian giữ chậm trong chươngtrình con sau:DELAY:AGAIN:HERE:MOVMOVNOPNOPDJNZDJNZRETR2, #200R3, #250R3, HERER2, AGAINchu kỳ máy1111221Lời giải:Đối với vòng lặp HERE ta có (4 250) 1.085ms = 1085ms. Vòng lặpAGAIN lặp vòng lặp HERE 200 lần, do vậy thời gian trễ là 200 1085ms 217000ms,nên ta không tính tổng phí. Tuy nhiên, các lệnh MOV R3, #250 và DJNZ R2,AGAIN ở đầu và cuối vòng lặp AGAIN cộng (3 200 ´ 1.085ms) = 651ms vµo thêigian trƠ vµ kÕt qu¶ ta cã 217000 + 651 = 217651ms = 217.651 miligiây cho tổng thờigian trễ liên quan đến chương trình con giữ chậm DELAY nói trên. Lưu ý rằng,trong trường hợp vòng lặp lồng nhau cũng như trong mọi vòng lặp giữ chậm khácthời gian xấp xỉ gần dúng vì ta bỏ qua các lệnh đầu và cuối trong chương tr×nh con.CuuDuongThanCong.com />

Tài liệu liên quan

  • Các lệnh nhảy, vòng lặp và lệnh gọi Các lệnh nhảy, vòng lặp và lệnh gọi
    • 12
    • 2
    • 4
  • Tìm hiểu về cảm biến siêu âm loại SRF05 và giao tiếp giữa vi điều khiển 8051 với cảm biến SRF05 Tìm hiểu về cảm biến siêu âm loại SRF05 và giao tiếp giữa vi điều khiển 8051 với cảm biến SRF05
    • 20
    • 5
    • 21
  • LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051 LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
    • 66
    • 1
    • 7
  • Tài liệu Giáo trình Vi điều khiển - Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI ĐIỀU KHIỂN MCS-51 pdf Tài liệu Giáo trình Vi điều khiển - Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI ĐIỀU KHIỂN MCS-51 pdf
    • 22
    • 778
    • 5
  • Tài liệu Chương 1: Các bộ vi điều khiển 8051 pptx Tài liệu Chương 1: Các bộ vi điều khiển 8051 pptx
    • 13
    • 500
    • 3
  • Tài liệu Lập trình 8051 : Các lệnh nhảy , vòng lặp và lệnh gọi docx Tài liệu Lập trình 8051 : Các lệnh nhảy , vòng lặp và lệnh gọi docx
    • 16
    • 721
    • 3
  • Tài liệu Chương 3: Các lệnh nhảy, vòng lặp và lệnh gọi docx Tài liệu Chương 3: Các lệnh nhảy, vòng lặp và lệnh gọi docx
    • 12
    • 397
    • 0
  • Tài liệu Các lệnh nhảy , vòng lặp và lệnh gọi pdf Tài liệu Các lệnh nhảy , vòng lặp và lệnh gọi pdf
    • 12
    • 509
    • 0
  • thiết kế và thi công mạch đếm sản phầm dùng vi điều khiển 8051 . chương trình hệ thống và ứng dụng thiết kế và thi công mạch đếm sản phầm dùng vi điều khiển 8051 . chương trình hệ thống và ứng dụng
    • 29
    • 884
    • 1
  • GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051 GIÁO TRÌNH LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051
    • 6
    • 675
    • 15

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

(130.17 KB - 12 trang) - Các lệnh nhảy, vòng lặp và lệnh gọi các vi điều khiển 8051 chương 3 Tải bản đầy đủ ngay ×

Từ khóa » Chu Kỳ 8051