intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Vi điều khiển 8051 - Bài 3: Lập trình hợp ngữ cho bộ vi điều khiển 8051

Chia sẻ: _ _ | Ngày: | Loại File: PPT | Số trang:21

1
lượt xem
0
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài giảng Vi điều khiển 8051 - Bài 3: Lập trình hợp ngữ cho bộ vi điều khiển 8051 gồm có những nội dung chính sau: Mã máy; các chế độ định địa chỉ của 8051; các lệnh Jump, Loop, Call; chương trình con; các vòng lặp tạo thời gian giữ chậm đơn giản. Mời các bạn cùng tham khảo để biết thêm nội dung chi tiết!

Chủ đề:
Lưu

Nội dung Text: Bài giảng Vi điều khiển 8051 - Bài 3: Lập trình hợp ngữ cho bộ vi điều khiển 8051

  1. Lập trình hợp ngữ cho bộ VĐK 8051 Bài 3 Bộ môn TĐ Khoa KTĐK
  2. Các chủ đề • Mã máy • Các chế độ định địa chỉ của 8051 • Các lệnh Jump, Loop, Call • Chương trình con • Các vòng lặp tạo thời gian giữ chậm đơn giản
  3. Mã đối tượng của 8051 • Trình hợp dịch sẽ chuyển mã hợp ngữ sang mã máy/mã đối tượng • Mã đối tượng là một dãy dài các lệnh của máy • Mỗi lệnh của máy có thể là một hoặc nhiều byte • Mỗi lệnh của máy có thể là giá trị nhị phân và được viết dưới dạng ký hiệu của số Hex
  4. Mã đối tượng của 8051 • Trình hợp dịch cung cấp một tệp .lst trong khi hợp dịch • Lệnh được dịch sang mã máy theo từng dòng đã viết
  5. Mã đối tượng của 8051
  6. Các chế độ định địa chỉ của 8051 • CPU có thể truy cập dữ liệu theo một số cách sau – Dữ liệu xác định trực tiếp trong câu lệnh – Sử dụng các chế độ định địa chỉ khác nhau để lưu giữ dữ liệu vào bộ nhớ mã lệnh và bộ nhớ dữ liệu • Có 5 chế độ định địa chỉ – Tức thời – Thanh ghi – Trực tiếp – Gián tiếp qua thanh ghi – chỉ số
  7. 1. Chế độ định địa chỉ tức thời • Toán hạng (dữ liệu) được xác định trực tiếp trong câu lệnh (mã lệnh) • Toán hạng là một hằng số, nhận được trong khi hợp dịch • Trước dữ liệu tức thời phải có dấu “#” • Ví dụ:
  8. 2.Chế độ định địa chỉ qua thanh ghi • Bao gồm các thanh ghi được sử dụng để lưu dữ liệu • Đưa toán hạng trong thanh ghi và chuyển nó vào thanh ghi đã chỉ ra trong câu lệnh • Thanh ghi nguồn và đích phải phù hợp về kích thước • Do đó không thể có lệnh chuyển từ một thanh ghi bất kỳ tới một thanh ghi – Mov R4, R7 ; không hợp lệ – Kiểm tra danh sách lệnh trước khi sử dụng – Hợp dịch sẽ gây lỗi trong các trường hợp (…)
  9. 3.Chế độ định địa chỉ trực tiếp • Thực hiện với các dữ liệu được lưu giữ trong RAM và các thanh ghi – Mọi vị trí bộ nhớ có thể truy cập được thông qua các địa chỉ – Tương tự với các thiết bị ngoại vi (SFR), các thanh ghi, các cổng ở 8051 • Sử dụng trực tiếp địa chỉ của toán hạng trong lệnh – Mov a, 40H ; A ← mem[40H] (không có dấu # trước 40H) • Địa chỉ thanh ghi là địa chỉ trực tiếp – Mov A, 4H ; 4H là địa chỉ của R4 – Mov A, R4 ; giống lệnh trước nhưng có sự khác nhau về ; mã lệnh • Mọi thanh ghi và SFR đều có địa chỉ • Ngăn xếp ở 8051 chỉ sử dụng trong các chế độ định địa chỉ trực tiếp
  10. 4.Chế độ gián tiếp qua thanh ghi • Thanh ghi được sử dụng như là con trỏ – Thanh ghi lưu địa chỉ của dữ liệu • Chỉ có R0, R1 và DPTR có thể được sử dụng cho mục đích này • R0 và R1 có thể được sử dụng cho bộ nhớ trong (256 byte bao gồm cả SFR) hoặc từ 00H tới FFH của bộ nhớ ngoài – Mov A, @R0 ; A←internal_mem[R0] – Mov @R1, A ; A←internal_mem[R1] – Movx A, @R0 ; A←external_mem[R0] • DPTR có thể được sử dụng cho bộ nhớ ngoài, cho cả bộ nhớ – Movx A, @DPTR ; A←external_mem[DPTR] – Movx @DPTR, A ; ngược lại
  11. 5.Chế độ định địa chỉ chỉ số • Sử dụng một thanh ghi để lưu con trỏ cơ sở và một thanh ghi lưu giá trị offset • Địa chỉ thực là sum=base+offset – Chuyển byte mã lệnh có liên quan tới DPTR vào A. Địa chỉ thực là DPTR +A • Movc A, @A+DPTR ;A← ext_code_mem[(A+PC)] • Được sử dụng phổ biến để truy cập các dữ liệu của bảng, các mảng dữ liệu, tạo tham số … trong bộ nhớ chương trình (ROM)
  12. Ví dụ về chế độ định địa chỉ chỉ số • Lập trình để đọc giá trị x từ P1 và gửi x 2 tới P2 ORG 0 ; assembler directive mov DPTR, #LUT ; 300H is the LUT address mov A, #0FFH mov P1, A ; program the port P1 to input data Again: mov A, P1 ; read x movc A, @A+DPTR ; get x2 from LUT mov P2, A ; output x2 to P2 sjmp again ; for (1) loop ORG 300H ;Look-up Table starts at 0x0300 LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
  13. Lệnh điều khiển chương trình • Rẽ nhánh không điều kiện – Ajmp addr11 ; nhảy tuyệt đối – Ljmp addr16 ; nhảy dài (3 byte = 1byte code + 2byte địa chỉ đích) – Sjmp rel ; nhảy ngắn tới địa chỉ thực – Jmp @A+DPTR ; nhảy gián tiếp • Rẽ nhánh có điều kiện – Jz, jnz rel ; nhảy ngắn có điều kiện tới địa chỉ thực – Djnz rel ; giảm và nhảy nếu khác 0 – Cjne rel ; so sánh và nhảy nếu không bằng nhau • Gọi chương trình con – Acall addr11 ; gọi chương trình con tuyệt đối – Lcall addr16 ; gọi chương trình con dài – Ret ; trở về từ lệnh gọi chương trình con – Reti ; trở về từ ISV
  14. Rẽ nhánh của chương trình - Địa chỉ đích • Địa chỉ đích có thể là: – Tuyệt đối: một địa chỉ vật lý đầy đủ • Addr16: địa chỉ 16 bit, địa chỉ bất kỳ trong 64K • Addr11: địa chỉ 11 bit, địa chỉ bất kỳ trong 2K – Thực: địa chỉ thực (tăng hoặc giảm) -128 byte tới 127 byte từ vị trí mã lệnh hiện tại • Tính địa chỉ đích để nhảy – PC của lệnh kế tiếp + địa chỉ thực – Đối với nhảy lùi, bỏ qua cờ nhớ • PC=15H, SJMP 0FEH • Địa chỉ là 15+FE = 13H • Về cơ bản nhảy tới lệnh kế tiếp trừ 2 (so với lệnh hiện thời)
  15. Các lệnh nhảy có điều kiện • jz, jnz: điều kiện là A==0 – Kiểm tra để biết A có bằng 0 – Jz nhảy nếu A=0 và jnz nhẩy nếu A≠0 • djnz: giảm 1 và nhảy nếu không bằng 0 – dinz Rn, rel – djnz direct, rel • jnc: điều kiện là cờ nhớ CY – jc rel – Jnc rel • Cjne: so sánh và nhảy nếu không bằng nhau – Cjne A, direct, rel – Cjne Rn, #data, rel – cjne @Rn, #data, rel
  16. Vòng lặp sử dụng lệnh djnz • Cộng 3 vào A 10 lần mov A, #0 ; xoá A mov R2, #10 ; R2 ← 10 AGAIN: add A, #03 ; cộng 3 vào thanh ghi A djnz R2, AGAIN ; lặp lại cho đến khi R2==0 mov R5, A ; lưu kết quả vào R5 • Lặp với vòng lặp sử dụng djnz mov R3, #100 loop1: mov R2, #10 ; lặp lại 1000 lần loop2: nop ; không thực hiện djnz R2, loop2 ; lặp lại loop2 cho đến khi R2==0 djnz R3, loop1 ; lặp lại loop1 cho đến khi R3==0
  17. Các lệnh nhảy không điều kiện • LJMP addr16 – Lệnh nhảy dài. Nhảy tới địa chỉ đich 2 byte – Lệnh 3 byte • SJMP rel – Nhảy tới địa chỉ thực từ PC+127 tới PC-128 – Nhảy tới PC+127 (00H – 7FH) – Nhảy tới PC-128 (80H - FFH)
  18. Các lệnh gọi • Chương trình con – Có thể sử dụng lại các đoạn lệnh • LCALL addr16 – Lệnh gọi dài. Đây là lệnh 3 byte – Gọi bất kỳ một chương trình con nằm trong không gian mã lệnh 64K – PC được lưu trong ngăn xếp • ACALL addr11 – Lệnh 2 byte – Gọi bất kỳ một chương trình con trong không gian mã lệnh 2K – Giống nội dung của LCALL – Tiết kiệm bộ nhớ ROM cho các thiết bị có bộ nhớ ROM nhỏ hơn 64K • RET – Trở về từ vị trí gọi chương trình con, Nạp lại PC từ ngăn xếp
  19. Chu kỳ máy • Số chu kỳ clock cần sử dụng để thực hiện một lệnh • Với 8051, một chu kỳ lệnh cần ít nhất 12 chu kỳ clock • Thời gian trên một chu kỳ máy – Tmc=số clock trên chu kỳ máy/ tần số clock – Với 8051 sử dụng tần số clock là 11.0592MHz • Tmc=12/11.0592 = 1,085µs • Thời gian để thực hiện một lệnh – Tinstr=chu kỳ máy cần thực hiện một lệnh * Tmc – Với lệnh trống, chu kỳ máy =1. Do đó • Tinstr = 1*1.085 =1,085µs
  20. Các vòng lặp giữ chậm đơn giản • Tìm thời gian giữ chậm của chương trình con DELAY: mov R3, #200 ; 1 chu kỳ máy HERE: djnz R3, HERE ; 2 chu kỳ máy RET ; 1 chu kỳ máy • Tính – Tổng số chu kỳ máy =200*2+1+1=402 – Thời gian =402*1,085µs (clk=11.0592) = 436,17µs • Tương tự như vậy, thời gian giữ chậm có thể nhận được bất kỳ với cách tổ chức các vòng lặp tương ứng • Để có thời gian giữ chậm lâu hơn, sử dụng các bộ định thời
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2