Bài giảng Vi điều khiển - Chương 4: Lập trình 8051 số học và lôgic

pdf 23 trang phuongnguyen 3570
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi điều khiển - Chương 4: Lập trình 8051 số học và lôgic", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_vi_dieu_khien_chuong_4_lap_trinh_8051_so_hoc_va_lo.pdf

Nội dung text: Bài giảng Vi điều khiển - Chương 4: Lập trình 8051 số học và lôgic

  1. LẬP TRÌNH 8051 SỐ HỌC VÀ LÔ GIC Microcontroller Chapter 4 Ngo Nhu Khoa Department of Computer Engineering DCE ThaiNguyen University of Technology
  2. Các chủ đề z Số học các số có dấu và số không dấu z Các số nhị phân và mã BCD z Các lệnh cộng z Phép trừ z Phép nhân z Phép chia z Các phép toán Logic z Các phép Quay và hoán đổi z Bộ nhớ địa chỉ hoá Bit và các lệnh trên bit đơn 10/1/2005 2 DCE
  3. 1. Phép cộng không dấu z Cú pháp add a, source ; A = A + source – Giá trị nhớ (nếu có) sẽ đặt trong cờ CY mov A, #0F5H add A, #0BH ; A = F5 + B0 = 00, CY=1 z Phép cộng các số 16 bit addc A, source ; A = A + source + CY – Cộng 2 byte thấp bằng lệnh add – Lưu lại kết quả – Cộng 2 byte cao bằng lệnh addc 10/1/2005 3 DCE
  4. 1. Phép cộng không dấu z Ví dụ phép cộng các số 16 bit Cộng UUVV và PPQQ clr C mov A, QQ add A, VV mov r6, A mov A, PP addc A, UU mov r7, A Kết quả là số 16 bit đặt trong các thanh ghi R7:R6 và CY 10/1/2005 4 DCE
  5. 2. Cộng các số BCD z BCD – Binary Coded Decimal – 4 bits được sử dụng để mô tả 1 số hệ 10 từ 0-9 z Gói BCD chứa 2 số BCD trong 1 Byte – 17 PBCD = 17decimal = 11hex z Phép cộng gói BCD có thể không là 1 số BCD hợp lệ. Do đó người ta phải sử dụng lệnh hiệu chỉnh thập phân (da A) để sửa lại z Sau phép cộng 2 gói BCD, gọi da để nhận được PBCD đúng mov A, #47H ; first BCD = 47d mov B, #25H ; second BCD = 25d add A,B ; A = 6CH (binary addition of 47H and 25H) da A ; A = 72H (BCD result of addition) 10/1/2005 5 DCE
  6. 2. Cộng các số BCD z Để hiệu chỉnh 1 số BCD không hợp lệ, cộng 6 với chữ số mà lớn hơn 9 z Cơ chế thực hiện của lệnh da – Nếu nibble thấp > 9 hay AC=1 thì cộng 6 (0110) với nibble thấp – Nếu nibble cao > 9 hay CY=1 thì cộng 6 với nibble cao z Chú ý: da chỉ có hiệu lực đối với lệnh ADD. Với các lệnh khác (inc, sub, ), thì sự hiệu chỉnh này phải được thực hiện bằng tay. 10/1/2005 6 DCE
  7. 3. Phép trừ không dấu z Cú pháp: subb x, y ; x = x-y with borrow from CY z Thực hiện: – Lấy số bù 2 của số trừ (y) – Cộng nó với số bị trừ (x) – Đảo bit cờ nhớ z Nếu cờ CY được lập sau phép trừ, thì kết quả là số âm với giá trị tuyệt đối là số bù 2 của kết quả z Chú ý: – Lệnh subb thực hiện trừ có nhớ, nếu CY được lập trước khi gọi lệnh. đặc điểm này được sử dụng cho phép trừ các số 16bit – Để nhận được thông thường, phải xoá cờ CY trước khi gọi lệnh subb 10/1/2005 7 DCE
  8. 3. Phép trừ không dấu z Ví dụ clr c ; xoá cờ CY cho phép trừ mov A, #4CH ; subb A, #6EH ; hai toán hạng, thực hiện: 4C – 6E jnc done ; nếu CY= 0 kết qủa là số dương cpl A ; CY=1, kết quả là số âm $ đảo bit giá trị chứa trong A inc A ; và cộng thêm 1 done: mov R1, A ; kết quả cuối cùng đặt trong R1 z Trừ 2 số 16 bit: 2762H – 1296H clr C ; xóa CY mov A, #62H ; subb A, #96H ; 62H – 96H = CCH và CY=1 mov R7, A ; lưu byte thấp của kết quả vào R7 mov A, #27H ; trừ các byte cao subb A, #12H ; 27H – 12H - 1 = 14H mov R6, A ; lưu byte cao KQ vào R6; 16 bit KQ đặt trong R6:R7 10/1/2005 8 DCE
  9. 4. Phép nhân và phép chia z MUL AB ; A x B, kết quả đặt trong BA mov A, #25H ; operand1: 25H mov B, #65H ; operand2: 65H mul AB ; 25H * 65H = E99H ; B = 0EH, A = 99H z DIV AB ; A/B, đặt thương trong A số dư trong B mov A, #95H mov B, #10 div AB ; A = 9 (thương - quotient), B = 5 (dư - remainder) 10/1/2005 9 DCE
  10. 5.1. Các số có dấu – Khái niệm z Biểu diễn dấu – Chỉ dùng 1 bit trong số tất cả các bit biểu diễn cho các số – Thường là MSB (most significant bit) được gán làm bít dấu – Các bit còn lại biểu diễn độ lớn của số - magnitude z 8051 chỉ có các thanh ghi 8-bit – Chỉ có thể dùng 7 bit để biểu diễn độ lớn các số có dấu – Các số dương trong 8051 = 0 đến +127 (7 bits) – Các số âm: từ -128 đến –1 10/1/2005 10 DCE
  11. 5.2. Các số có dấu – Số âm z Biểu diễn số âm trong số học các số có dấu như sau: – Bit dấu (MSB) được lập là 1 – Độ lớn là 1 dạng của số bù 2 z Các ví dụ Khoảng -128 = 80H Biểu diễn: –5 Biểu diễn: –34H Biểu diễn: –128 -127 = 81H 5 = 0000 0101 34H = 0011 0100 128 = 1000 0000 Cpl = 1111 1010 Cpl = 1100 1011 Cpl = 0111 1111 -1 = FFH +1 = 1111 1011 +1 = 1100 1100 +1 = 1000 0000 0 = 00H Hex = FBH Hex = CCH Hex = 80H 1 = 01H Vậy: –5 = FBh Vậy: –34H = CCH Vậy: –128 = 80H +127 = 7FH 10/1/2005 11 DCE
  12. 5.3. Các số có dấu – Sử dụng z Các ứng dụng trong thực tế có thể yêu cầu 1 giá trị xác định được biểu diễn như 1 số có dấu – Đo nhiệt độ:–20deg, +10deg vv – Đo mức Nước/Gas/Beer trong bể chứa z Dữ liệu được thu nhận và lưu trữ như là 1 mảng các số có dấu – Một số phần tử trong mảng có thể là âm, trong khi các phần tử khác lại là số dương – Việc nhận diện số âm nhờ MSB. Nếu MSB=1, số đó là âm z Cùng các phép toán (add, sub, mul, div vv) có thể cần thiết được thực hiện trên các phần tử của mảng và kết quả cũng có thể là số dương hoặc âm. 10/1/2005 12 DCE
  13. 6. 8051 – Số học các số có dấu z 8051 sử dụng sự biểu diễn số âm trong lệnh trừ (subb). Tuy nhiên, như thế chưa đủ! z Khi các số có dấu được sử dụng, thì người lập trình phải quan tâm đến số học các số có dấu. z Sự tràn số phải được đề cập đến. Cờ nhớ là chưa đủ, vì chỉ có 7 bit để biểu diễn giá trị của các số có dấu. z Do đó, 8051 còn cung cấp 1 cờ khác, đó là cờ tràn – OV cho mục đích này. 10/1/2005 13 DCE
  14. 6. 8051 – Số học các số có dấu z Phép cộng A+B A = 01H, B = FFH A+B A = FEH, B = FFH A = +1, B = -1 A = -2, B = -1 A = 0000 0001 A = 1111 1110 B = 1111 1111 B = 1111 1111 + = 1 0000 0000 + = 1 1111 1101 A+B = 0H A+B = FDH = -3 z Phép trừ A-B; A = 01H, B = FFH A-B; A = FEH, B = 01H A = +1, B = -1 A = -2, B = +1 2’s(B) = 0000 0000 +1 = 0000 0001 2’s(B) = 1111 1110 +1 = 1111 1111 A = 0000 0001 A = 1111 1110 2’s(B) = 0000 0001 2’s(B) = 1111 1111 + = 0 0000 0010 + = 1 1111 1101 A-B = 02H A-B = FDH = -3 10/1/2005 14 DCE
  15. 6. 8051 – Số học các số có dấu z Sự tràn có thể xảy ra do độ lớn của các số có dấu, mà nó có thể làm thay đổi bit dấu. z Cờ OV được kiểm tra để xác định lỗi xảy ra trong số học các số có dấu. z Ví dụ A+B, A=+96 (60H), B=+70(46H) A = 0110 0000 B = 0100 0110 + = 1010 0110 = A6H = -90 (wrong) OV = 1, CY=0 96+70 = 166 > +127 10/1/2005 15 DCE
  16. 6. 8051 – Cờ tràn z Sau các phép toán số học, OV được lập nếu: – Nhớ từ D6 sang D7, nhưng không nhớ từ D7 – Nhớ từ D7 nhưng không nhớ từ D6 sang D7 – Các trường hợp trên chỉ thỉ 1 kết quả sai trong khi 8051 thực hiện các phép toán với số có có dấu. z Sau một lệnh số học liên quan đến các số có dấu, kiểm tra cờ OV, để xác định lỗi – Sử dụng lệnh jb PSW.2 hay jnb PSW.2 – PSW.2 = OV 10/1/2005 16 DCE
  17. 7. 8051 Các lệnh logic z AND – anl dest, source ; dest = dest AND source – Thường sử dụng làm mặt nạ để che đi(set to 0) 1 vài bit trong 1 toán hạng z OR – orl dest, source ; dest = dest OR source – Commonly used to set a few bits in an operand z XOR – xrl dest, source ; dest = dest XOR source – Commonly used to clear a register, check if two registers have the same value and toggle a few bits z Complement – cpl A ; A = A’ z None of these instructions affect any flags 10/1/2005 17 DCE
  18. 8. 8051 – Lệnh so sánh z CJNE – Cjne dest, source, rel address – So sánh đích (dest) với nguồn (source), và nhảy đến địa chỉ quan hệ (relative address) nếu không bằng nhau – Về cơ bản, 1 phép trừ mà không làm thay đổi các toán hạng, nhưng lại tác động đến cờ CY: – dest > source CY=0 Cmp: cjne R5, #80, NEQ – dest #80 – Kiểm soát liên tục P1 Loop: mov A, P1 – và chỉ thoát, nếu:P1=63H cjne A, #63, loop 10/1/2005 18 DCE
  19. 9. 8051 – Hoán đổi và Quay z Thao tác quay Bitwise được yêu cầu trong nhiều ứng dụng, như truyền thông nối tiếp, điều khiển, z Quay phải Example for RR Example for RL – rr A ; rotate right A mov A, #AAH mov A, #55H z Quay trái rr A ; now A = 55H rl A ; now A = AAH – rl A ; rotate left A rr A ; now A = 2AH rl A ; now A = 54H z Quay phải/trái có nhớ – Sử dụng CY trong phép quay (9 bit rotate) theo thứ tự sau: – rlc A ; D7 CY D0 – rrc A ; D0 CY D7 z Hoán đổi các nibble – swap A ; Hoán đổi D7-D4 với D3-D0 10/1/2005 19 DCE
  20. 10. 8051 – Các lệnh Bit đơn z Lập bit – set bit_name ;bit = 1 z Xoá bit – clr bit_name ;bit = 0 z Đảo bit – cpl bit_name ;bit = bit’ z Lệnh nhảy có điều kiện trên giá trị của bit – jb (jump if bit=1) – jnb (jump if bit=0) – jbc (jump if bit=1 and clear the bit) 10/1/2005 20 DCE
  21. 11. Bit addressable Regs and Memory z Các cổng I/O (P0 – P3), B, PSW, IP, IE, ACC, SCON và TCON là các thah ghi cókhả năng địa chỉ hoá theo Bit (BARs) z Các bit của BARs có thể được tham chiếu đến theo cú pháp Register.bitnum (P0.1, PSW.2, IE.4 vv) hay bởi địa chỉ của chúng z Địa chỉ Bit là địa chỉ cơ sở của thanh ghi + số thứ tự Bit – ACC địa chỉ cơ sở là E0H, do đó ACC.1=E1H, ACC.7=E7H – P0, địa chỉ cơ sở là 80H, do đó P0.0=80H, P0.5=84H z 16 bytes của bộ nhớ RAM nội cũng được địa chỉ hoá Bit – 20H đến 2FH có 1 địa chỉ bit từ 00H đến 7FH – clr 67H ; xoá D7H của RAM tại vị trí 2CH – setb 05H ; lập bit 5 của RAM, tại vị trí 20H 10/1/2005 21 DCE
  22. 12. Các lệnh đơn bit với cờ nhớ CY z 8051 có các lệnh đặc biệt để thao tác trực tiếp với cờ nhớ CY – setb C; clr C; cpl C; mov b,C; mov C,b; jnc, jc, anl C,b; anl C,/b; orl C,b; orl C,/b – anl C, /b ;C = CY AND b’ z Ví dụ: Bật quạt (P2.2) và ngắt đèn (P2.3) Fan_on: setb C orl C,P2.2 ;CY = CY OR P2.2 mov P2.2, C ; bật quạt nếu nó chưa thực sự bật Light_off: clr C anl C,P2.3 ;CY = CY AND P2.3 mov P2.3,C ; tắt đèn, nếu nó chưa thực sự tắt 10/1/2005 22 DCE
  23. Chương 4: Ôn tập z Số học các số có dấu và không dấu z Các số nhị phân và mã BCD z Phép cộng, trừ, nhân và chia z Số học và biểu diễn số có dấu z Các phép toán Logic z Các lệnh quay và hoán đổi z Vùng nhớ địa chỉ hoá Bit và các lệnh tác động đơn bit 10/1/2005 23 DCE