SlideShare a Scribd company logo
1 of 21
Download to read offline
Ngôn ngữ lập trình Assembly
         cho vi điều khiển 8051


                   Microcontroller
                   Chapter 3

                   Ngo Nhu Khoa
                   Department of Computer Engineering

DCE                ThaiNguyen University of Technology
Các vấn đề
 Mã máy - Machine code
 Các chế độ địa chỉ của 8051
 Các lệnh Jump, Loop và Call
 Thường trình con - Subroutines
 Các vòng trễ đơn giản




    10/1/2005           2         DCE
1. Mã đối tượng của 8051
 Assembler chuyển đổi mã lệnh assembly thành mã
 máy/đối tượng
 Sự chuyển đổi từ mã assembly sang mã đối tượng là
 duy nhất
  –   Data sheet for 8051 lists the table of conversion
  –   Manual assembly is cool !
 Mã đối tượng là 1 chuỗi các lệnh máy
 Mỗi lệnh máy có thể có độ dài 1 byte hoặc nhiều hơn
 Các lệnh máy là 1 giá trị nhị phân và được viết ở hệ 16




       10/1/2005                3                         DCE
1. Mã đối tượng của 8051 (…)
 Assemblers tạo ra 1 file .lst trong quá trình dịch.
 Instruction to m/c code translation on a line by line
 basis is listed

Instruction              Hex code         #bytes
nop                      00               1
inc R0                   08               1
mov A, #55H              74 55            2
mov R0, #0AAH            78 AA            2
mov R0, 0AAH             A8 AA            2
mov DPTR, #55AAH         90 55 AA         3
     10/1/2005             4                             DCE
1. Mã đối tượng của 8051 (…)
Hex                Assembly                  Address   Value

                                             8000      79
0000:              .equ cout, 0x0030
                                             8001      61
0000:              .equ cin, 0x0032          8002      78
0000:              .equ esc, 0x004E          8003      1A
                                             8004      E9
8000:              .org 0x8000
                                             8005      12
8000: 79 61             mov r1, #'a'         8006      00
8002: 78 1A             mov r0, #26          8007      30
                   next_char:                8008      09
                                             8009      D8
8004: E9                mov A, r1            800A      F9
8005: 12 00 30          lcall cout           800B      12
8008: 09                inc r1               800C      00
                                             800D      32
8009: D8 F9             djnz r0, next_char   800E      02
800B: 12 00 32          lcall cin            800F      00
800E: 02 00 00          ljmp 0x0000          8010      00


       10/1/2005                  5                         DCE
2. Các chế độ địa chỉ của 8051
 CPU có thể truy xuất dữ liệu theo nhiều cách khác
 nhau
  –   Chỉ định dữ liệu trực tiếp trong lệnh
  –   Sử dụng các chế độ địa chỉ khác nhau đối với dữ liệu được
      lưu trữ trong bộ nhớ mã lệnh và bộ nhớ dữ liệu
 5 chế độ địa chỉ
  –   Tức thì - Immediate
  –   Thanh ghi - Register
  –   Trực tiếp - Direct
  –   Gián tiếp thanh ghi - Register Indirect
  –   Chỉ số - Indexed



       10/1/2005                 6                           DCE
2.1. Chế độ địa chỉ tức thì
 Toán hạng (dữ liệu) được chỉ định trực tiếp trong lệnh
 (mã lệnh)
 Toán hạng là 1 hằng, được biết trong thời gian dịch
 Dữ liệu tức thì phải có tiền tố là dấu “#”
 Ví dụ:
     mov A, #25H ;A ← #0x25
     mov DPTR, #1FFFH ;DPTR ← #0x1FFF
     temp EQU 40 ;assembler directive
     mov R1, #temp ;R1 ← 28H (40 decimal)



     10/1/2005           7                          DCE
2.2. Chế độ địa chỉ thanh ghi
 Yêu cầu phải sử dụng các thanh ghi để lưu giữ dữ liệu
 Đặt toán hạng vào 1 thanh ghi và thao tác với nó bằng
 cách tham chiếu đến thanh ghi chứa (theo tên) trong lệnh
      mov A, R0      ;A ← contents (R0)
      mov R2, A      ;R2 ← contents (A)
      ADD A, R1      ;A ← contents (A) + contents (R1)
 Các thanh ghi nguồn và đích phải cùng kích thước
 Các lệnh dịch chuyển dữ liệu giữa các thanh ghi không
 thể áp dụng cho mọi trường hợp, cho mọi thanh ghi:
      mov R4, R7 ; invalid
  –   Kiểm tra với danh sách lệnh trước khi sử dụng



       10/1/2005               8                      DCE
2.3. Chế độ địa chỉ trực tiếp
 Đối với dữ liệu được lưu trữ trên RAM và các thanh ghi
  –   Tất cả các vùng nhớ đều các thể truy xuất bằng địa chỉ.
  –   Như truy xuất đến tất cả các thanh ghi, các cổng, các thiết bị ngoại
      vi trong 8051.
 Sử dụng địa chỉ của trực tiếp toán hạng trong lệnh.
       mov A, 40H ; A ← mem[40H] (note no # sign before 40H)
 Chế độ địa chỉ thanh ghi tương tự như chế độ địa chỉ trực
 tiếp
       mov A, 4H ; 4H is the address for R4
       mov A, R4 ; tương tự như trên. Cả 2 lệnh đều như nhau
                 ;nhưng có thể có mã khác nhau
 Ngăn xếp trong 8051 chỉ sử dụng chế độ địa chỉ trực tiếp


       10/1/2005                   9                                   DCE
2.4. Chế độ gián tiếp thanh ghi
 1 thanh ghi được sử dụng như 1 con trỏ
  –   Thanh ghi lưu giữ địa chỉ của dữ liệu
 Chỉ có các thanh ghi R0, R1 và DPTR có thể được sử
 dụng cho mục đích này trong 8051
 R0 và R1 có thể được sử dụng đối với bộ nhớ nội (256
 bytes bao gồm cả SFRs) hay từ 00H đến 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]
 Thanh ghi DPTR có thể được sử dụng đối với bộ nhớ
 ngoài, trỏ đến ô nhớ bất kỳ trong khoảng 64K
       movx A, @DPTR ;A ← external_mem[DPTR]
       movx @DPTR, A ;vice versa

       10/1/2005                  10              DCE
2.5. Chế độ địa chỉ chỉ số
 Sử dụng 1 thanh ghi để lưu trữ con trỏ (địa chỉ cơ
 sở) và 1 thanh ghi khác để lưu giá trị lệch
 Địa chỉ kết quả là tổng sum = base+offset
  –   Chuyển byte mã có quan hệ với DPTR vào A. Địa chỉ kết
      quả là: DPTR + A
 movc A, @A+DPTR ;A ← ext_code_mem [(A + DPTR)]
  – Chuyển byte mã có quan hệ với PC vào A. Địa chỉ kết quả là
    PC + A
 movc A, @A+PC ;A ← ext_code_mem [(A + PC)]
 Được sử dụng rộng rãi trong thực hiện các bảng tra,
 các mảng dữ liệu, tạo ra ký tự,… trong bộ nhớ mã
 lệnh (ROM)

       10/1/2005            11                             DCE
2.5. Ví dụ
 Chương trình đọc vào 1 giá trị x từ P1 và đưa ra x2 ở
 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




     10/1/2005               12                          DCE
3. Các lệnh điều khiển chương trình
 Rẽ nhánh không điều kiện
  –   ajmp addr11 ; absolute jump - nhảy theo địa chỉ tuyệt đối
  –   ljmp addr16 ; long jump - nhảy xa
  –   sjmp rel ; nhảy gần đến địa chỉ quan hệ
  –   jmp @A+DPTR ; jump indirect - nhảy gián tiếp
 Rẽ nhánh có điều kiện
  –   jz, jnz rel ; nhảy gần đến địa chỉ quan hệ nếu điều kiện thoả mãn
  –   djnz rel ; giảm toán hạng nguồn và nhảy nếu khác không
  –   cjne rel ; so sánh và nhảy nếu không bằng
 Gọi thường trình con (Subroutine)
  –   acall addr11 ; gọi tuyệt đối 1 thường trình con
  –   lcall addr16 ; gọi 1 thương trình con ở xa
  –   ret ; trở về chương trình chính từ 1 thường trình con
  –   reti ; trở về từ 1 chương trình phục vụ ngắt (ISV)


       10/1/2005                  13                                      DCE
3.1. Địa chỉ đích
 Địa chỉ đích có thể là:
  –   Tuyệt đối: Một giá trị địa chỉ vật lý
          addr16: địa chỉ 16 bit, ở vị trí bất kỳ trong không gian 64k
          addr11: địa chỉ 11 bit, ở vị trí bất kỳ trong không gian 2k
  –   rel: relative – quan hệ (tiến hay lùi) -128 bytes đến +127 bytes từ vị trí
      của mã lệnh hiện thời
 Địa chỉ đích được tính toán cho các lệnh nhảy quan hệ
  –   PC của lệnh kế tiếp + địa chỉ quan hệ
  –   Đối với nhảy lùi, bỏ đi giá trị nhớ
          PC = 15H, SJMP 0FEH
          Địa chỉ là 15H + FEH = 13H
          Nhảy đến vị trí lệnh kế tiếp -2byte (lệnh hiện thời)



       10/1/2005                       14                                     DCE
3.2. Nhảy có điều kiện
 jz, jnz : Điều kiện được xác lập trên thanh ghi chứa
 A==0
  –   Kiểm tra nếu A = 0
  –   jz nhảy nếu A =0 và jnz nhảy nếu A # zero
  –   Không cần thực hiện phép toán số học
 djnz : giảm đi 1 và nhảy nếu không bằng 0
  –   djnz Rn, rel
  –   djnz direct, rel
 jnc : Điều kiện được xác lập trên cờ nhớ CY
  –   jc rel
  –   jnc rel
 Cjne : so sánh và nhảy nếu không bằng
  –   cjne A, direct, rel
  –   cjne ARn, #data, rel
  –   cjne @Rn, #data, rel


       10/1/2005                 15                     DCE
3.2. Nhảy có điều kiện (…)
 Add 3 to A ten times
        mov A, #0         ; clear A
        mov R2, #10     ; R2 ← 10, can also say 0AH
  AGAIN: add A, #03 ; add 3 to A
        djnz R2, AGAIN ; repeat until R2==0
        mov R5, A      ; save the result in R5
 Loop within loop using djnz
       mov R3, #100
  loop1: mov R2, #10 ; trying for 1000 loop iterations
  loop2: nop          ; no operation
       djnz R2, loop2 ; repeat loop2 until R2==0
       djnz R3, loop1 ; repeat loop1 until R3==0

     10/1/2005              16                        DCE
3.3. Nhảy không điều kiện
 LJMP addr16
  –   Long jump. Nhảy đến 1 địa chỉ đích 2 byte
  –   Lệnh có độ dài 3 byte
 SJMP rel
  –   Nhảy đến 1 địa chỉ quan hệ từ PC+127 đến PC-128
  –   Nhảy đến PC + 127 (00H – 7FH)
  –   Nhảy đến PC – 128 (80H – FFH)




       10/1/2005               17                       DCE
4. Các lệnh gọi thường trình
 Thường trình con:
  –   Những đoạn chương trình có thể dùng lại được
 LCALL addr16
  –   Long call. Lệnh 3 byte. Gọi bất kỳ thường trình con nào trong
      không gian mã 64Kb
  –   Cất nội dung PC vào ngăn xếp - push PC
  –   Nhảy đến địa chỉ xác định - jmp address
 ACALL addr11
  –   Lệnh 2 byte. Gọi bất kỳ thường trình con nào trong khoảng 2k
      không gian bộ nhớ mã lệnh
  –   Saves code ROM for devices with less than 64K ROM
 RET
  –   Trở về từ 1 thương trình con
  –   Phục hồi lại PC từ ngăn xếp - pop PC


       10/1/2005                  18                                  DCE
5. Chu kỳ máy
 Là số các chu kỳ đồng hồ được sử dụng để thực
 hiện 1 lệnh
 Có giá trị khác nhau, phụ thuộc lệnh. Lệnh ngắn nhất
 là 1 chu kỳ máy
 Với 8051, 12 chu kỳ đồng hồ là thời gian tối thiểu cần
 thiết cho thực hiện 1 lệnh
 Thời gian của 1 chu kỳ máy:
  –   Tmc = Số Clocks trên chu kỳ máy/ tần số đồng hồ
  –   Với 8051 tần số đồng hồ là 11.0592MHz,
 Tmc = 12 / 11.0592M = 1.085 micro seconds
 Thời gian để thực hiện 1 lệnh
  –   Tinstr = số chu kỳ máy để thực hiện lệnh * Tmc
  –   Với lệnh NOP, số chu kỳ máy = 1. Vì vậy, Tinstr = 1 * 1.085 =
      1.085 micro seconds
       10/1/2005                  19                                  DCE
6. Các vòng trễ đơn giản
 Tìm thời gian trễ cho thường trình con
       DELAY: mov R3, #200 ; 1 machine cycle
       HERE: djnz R3, HERE ; 2 machine cycles
       RET ; 1 machine cycle
 Tính toán
  –   Total machine cycles = 200*2 + 1 + 1 = 402
  –   Time = 402 * 1.085us (giả thiết: 11.0592 MHz clk) =
      436.17us
 Tương tự, với bất kỳ thời gian trễ nào, đều có thể
 được xác định bằng các vòng lặp trong lặp
 Với các bộ trễ lớn hơn, thường sử dụng các bộ định
 thời.
       10/1/2005               20                           DCE
Chương 3 : Ôn tập
 How does 8051 machine code look ?
 What are 8051 addressing modes ?
 What are program control instructions ?
 Conditional Vs Unconditional branches
 Subroutines
 What is Machine cycle ?
 How to calculate exact time spent in executing
 a program ? Or how to write exact time delay
 loops ?

    10/1/2005        21                     DCE

More Related Content

What's hot

Chuong 4. lap trinh hop ngu
Chuong 4. lap trinh hop nguChuong 4. lap trinh hop ngu
Chuong 4. lap trinh hop ngumituan
 
Bài Giảng Vi Xử Lý ICTU
Bài Giảng Vi Xử Lý ICTUBài Giảng Vi Xử Lý ICTU
Bài Giảng Vi Xử Lý ICTUNgô Doãn Tình
 
Họ vi xử lí 8086 intel
Họ vi xử lí 8086 intelHọ vi xử lí 8086 intel
Họ vi xử lí 8086 inteldark_valley
 
Lap trinh assembler
Lap trinh assemblerLap trinh assembler
Lap trinh assemblerleduanmtt
 
Phan2 chuong5 ctrinhcon
Phan2 chuong5 ctrinhconPhan2 chuong5 ctrinhcon
Phan2 chuong5 ctrinhconLy hai
 
Cấu hình osp fv3 cơ bản
Cấu hình osp fv3 cơ bảnCấu hình osp fv3 cơ bản
Cấu hình osp fv3 cơ bảnVNG
 
KTMT Lý Thuyết Tổng Quát
KTMT Lý Thuyết Tổng QuátKTMT Lý Thuyết Tổng Quát
KTMT Lý Thuyết Tổng QuátDavid Nguyen
 
Ktmt c61 hop ngu assembly
Ktmt c61 hop ngu assemblyKtmt c61 hop ngu assembly
Ktmt c61 hop ngu assemblytramhienkhcb
 
Chuong 3 khao sat tap lenh va ltrinh vdk
Chuong 3 khao sat tap lenh va ltrinh vdkChuong 3 khao sat tap lenh va ltrinh vdk
Chuong 3 khao sat tap lenh va ltrinh vdkBút Chì
 
C cho 8051
C cho 8051C cho 8051
C cho 8051Nhan Bui
 
03 lap trinh hop ngu voi 8086
03 lap trinh hop ngu voi 808603 lap trinh hop ngu voi 8086
03 lap trinh hop ngu voi 8086onlylove511
 
Cai dat va_cau_hinh_iptables
Cai dat va_cau_hinh_iptablesCai dat va_cau_hinh_iptables
Cai dat va_cau_hinh_iptablesNguyen Van Hung
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cHồ Lợi
 
Chuong 6 truyen thong noi tiep
Chuong 6 truyen thong noi tiepChuong 6 truyen thong noi tiep
Chuong 6 truyen thong noi tiepBút Chì
 

What's hot (19)

Chuong 4. lap trinh hop ngu
Chuong 4. lap trinh hop nguChuong 4. lap trinh hop ngu
Chuong 4. lap trinh hop ngu
 
Bài Giảng Vi Xử Lý ICTU
Bài Giảng Vi Xử Lý ICTUBài Giảng Vi Xử Lý ICTU
Bài Giảng Vi Xử Lý ICTU
 
Hop ngu mips
Hop ngu mipsHop ngu mips
Hop ngu mips
 
Chuong 05 flip flop
Chuong 05 flip flopChuong 05 flip flop
Chuong 05 flip flop
 
Họ vi xử lí 8086 intel
Họ vi xử lí 8086 intelHọ vi xử lí 8086 intel
Họ vi xử lí 8086 intel
 
Lap trinh assembler
Lap trinh assemblerLap trinh assembler
Lap trinh assembler
 
Phan2 chuong5 ctrinhcon
Phan2 chuong5 ctrinhconPhan2 chuong5 ctrinhcon
Phan2 chuong5 ctrinhcon
 
Cấu hình osp fv3 cơ bản
Cấu hình osp fv3 cơ bảnCấu hình osp fv3 cơ bản
Cấu hình osp fv3 cơ bản
 
KTMT Lý Thuyết Tổng Quát
KTMT Lý Thuyết Tổng QuátKTMT Lý Thuyết Tổng Quát
KTMT Lý Thuyết Tổng Quát
 
Ktmt c61 hop ngu assembly
Ktmt c61 hop ngu assemblyKtmt c61 hop ngu assembly
Ktmt c61 hop ngu assembly
 
Chuong 3 khao sat tap lenh va ltrinh vdk
Chuong 3 khao sat tap lenh va ltrinh vdkChuong 3 khao sat tap lenh va ltrinh vdk
Chuong 3 khao sat tap lenh va ltrinh vdk
 
C cho 8051
C cho 8051C cho 8051
C cho 8051
 
Chapter07 io
Chapter07 ioChapter07 io
Chapter07 io
 
Bao cao full
Bao cao fullBao cao full
Bao cao full
 
03 lap trinh hop ngu voi 8086
03 lap trinh hop ngu voi 808603 lap trinh hop ngu voi 8086
03 lap trinh hop ngu voi 8086
 
Cai dat va_cau_hinh_iptables
Cai dat va_cau_hinh_iptablesCai dat va_cau_hinh_iptables
Cai dat va_cau_hinh_iptables
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của c
 
Chuong 6 truyen thong noi tiep
Chuong 6 truyen thong noi tiepChuong 6 truyen thong noi tiep
Chuong 6 truyen thong noi tiep
 
Tap lenh co_ban
Tap lenh co_banTap lenh co_ban
Tap lenh co_ban
 

Similar to Chap3 8051 microcontroller – assembly

chuong-3-tap-lenh-avr-atmega-324p-p1.pdf
chuong-3-tap-lenh-avr-atmega-324p-p1.pdfchuong-3-tap-lenh-avr-atmega-324p-p1.pdf
chuong-3-tap-lenh-avr-atmega-324p-p1.pdfquocdo23evnhcmc
 
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdfCHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdfTriuPhm15
 
Lập trình C cho 8051
Lập trình C cho 8051Lập trình C cho 8051
Lập trình C cho 8051chilacaiten
 
Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Minh Ngoc Tran
 
418 giaotrinh avr
418 giaotrinh avr418 giaotrinh avr
418 giaotrinh avranhhoi12345
 
Giaotrinh avr tech24.vn
Giaotrinh avr tech24.vnGiaotrinh avr tech24.vn
Giaotrinh avr tech24.vnbibibobo2007
 
Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Ky Nguyen Ad
 
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDĐồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDMr Giap
 
ky thuat vi xu lychuong4.ppt
ky thuat vi xu lychuong4.pptky thuat vi xu lychuong4.ppt
ky thuat vi xu lychuong4.pptChienNguyenViet
 
Lap trinh-c-cho-vdk
Lap trinh-c-cho-vdkLap trinh-c-cho-vdk
Lap trinh-c-cho-vdkHiepsvd Bk
 
Viết Ngôn Ngữ Lập Trình 8051 PIC AVR
Viết Ngôn Ngữ Lập Trình 8051 PIC AVRViết Ngôn Ngữ Lập Trình 8051 PIC AVR
Viết Ngôn Ngữ Lập Trình 8051 PIC AVRMr Giap
 
Cau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xxCau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xxBùi Ngọc Bảo
 
Tim hieu thanh ghi in asm
Tim hieu thanh ghi in asmTim hieu thanh ghi in asm
Tim hieu thanh ghi in asmMy Đá
 

Similar to Chap3 8051 microcontroller – assembly (20)

chuong-3-tap-lenh-avr-atmega-324p-p1.pdf
chuong-3-tap-lenh-avr-atmega-324p-p1.pdfchuong-3-tap-lenh-avr-atmega-324p-p1.pdf
chuong-3-tap-lenh-avr-atmega-324p-p1.pdf
 
Vi xu ly_4_2
Vi xu ly_4_2Vi xu ly_4_2
Vi xu ly_4_2
 
Vi xu ly_4_2
Vi xu ly_4_2Vi xu ly_4_2
Vi xu ly_4_2
 
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdfCHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
CHUONG-3-LẬP-TRÌNH-CHO-HỌ-VI-ĐIỀU-KHIỂN-8051.pdf
 
Lập trình C cho 8051
Lập trình C cho 8051Lập trình C cho 8051
Lập trình C cho 8051
 
Vdk 8051
Vdk 8051 Vdk 8051
Vdk 8051
 
Chuong2 cấu trúc phần cứng 8051
Chuong2 cấu trúc phần cứng 8051Chuong2 cấu trúc phần cứng 8051
Chuong2 cấu trúc phần cứng 8051
 
Chuong 2
Chuong 2Chuong 2
Chuong 2
 
Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-
 
418 giaotrinh avr
418 giaotrinh avr418 giaotrinh avr
418 giaotrinh avr
 
Giaotrinh avr tech24.vn
Giaotrinh avr tech24.vnGiaotrinh avr tech24.vn
Giaotrinh avr tech24.vn
 
Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr
 
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDĐồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
 
ky thuat vi xu lychuong4.ppt
ky thuat vi xu lychuong4.pptky thuat vi xu lychuong4.ppt
ky thuat vi xu lychuong4.ppt
 
Chuong5 hoạt động port nối tiếp
Chuong5 hoạt động port nối tiếpChuong5 hoạt động port nối tiếp
Chuong5 hoạt động port nối tiếp
 
Chuong2
Chuong2Chuong2
Chuong2
 
Lap trinh-c-cho-vdk
Lap trinh-c-cho-vdkLap trinh-c-cho-vdk
Lap trinh-c-cho-vdk
 
Viết Ngôn Ngữ Lập Trình 8051 PIC AVR
Viết Ngôn Ngữ Lập Trình 8051 PIC AVRViết Ngôn Ngữ Lập Trình 8051 PIC AVR
Viết Ngôn Ngữ Lập Trình 8051 PIC AVR
 
Cau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xxCau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xx
 
Tim hieu thanh ghi in asm
Tim hieu thanh ghi in asmTim hieu thanh ghi in asm
Tim hieu thanh ghi in asm
 

Chap3 8051 microcontroller – assembly

  • 1. Ngôn ngữ lập trình Assembly cho vi điều khiển 8051 Microcontroller Chapter 3 Ngo Nhu Khoa Department of Computer Engineering DCE ThaiNguyen University of Technology
  • 2. Các vấn đề Mã máy - Machine code Các chế độ địa chỉ của 8051 Các lệnh Jump, Loop và Call Thường trình con - Subroutines Các vòng trễ đơn giản 10/1/2005 2 DCE
  • 3. 1. Mã đối tượng của 8051 Assembler chuyển đổi mã lệnh assembly thành mã máy/đối tượng Sự chuyển đổi từ mã assembly sang mã đối tượng là duy nhất – Data sheet for 8051 lists the table of conversion – Manual assembly is cool ! Mã đối tượng là 1 chuỗi các lệnh máy Mỗi lệnh máy có thể có độ dài 1 byte hoặc nhiều hơn Các lệnh máy là 1 giá trị nhị phân và được viết ở hệ 16 10/1/2005 3 DCE
  • 4. 1. Mã đối tượng của 8051 (…) Assemblers tạo ra 1 file .lst trong quá trình dịch. Instruction to m/c code translation on a line by line basis is listed Instruction Hex code #bytes nop 00 1 inc R0 08 1 mov A, #55H 74 55 2 mov R0, #0AAH 78 AA 2 mov R0, 0AAH A8 AA 2 mov DPTR, #55AAH 90 55 AA 3 10/1/2005 4 DCE
  • 5. 1. Mã đối tượng của 8051 (…) Hex Assembly Address Value 8000 79 0000: .equ cout, 0x0030 8001 61 0000: .equ cin, 0x0032 8002 78 0000: .equ esc, 0x004E 8003 1A 8004 E9 8000: .org 0x8000 8005 12 8000: 79 61 mov r1, #'a' 8006 00 8002: 78 1A mov r0, #26 8007 30 next_char: 8008 09 8009 D8 8004: E9 mov A, r1 800A F9 8005: 12 00 30 lcall cout 800B 12 8008: 09 inc r1 800C 00 800D 32 8009: D8 F9 djnz r0, next_char 800E 02 800B: 12 00 32 lcall cin 800F 00 800E: 02 00 00 ljmp 0x0000 8010 00 10/1/2005 5 DCE
  • 6. 2. Các chế độ địa chỉ của 8051 CPU có thể truy xuất dữ liệu theo nhiều cách khác nhau – Chỉ định dữ liệu trực tiếp trong lệnh – Sử dụng các chế độ địa chỉ khác nhau đối với dữ liệu được lưu trữ trong bộ nhớ mã lệnh và bộ nhớ dữ liệu 5 chế độ địa chỉ – Tức thì - Immediate – Thanh ghi - Register – Trực tiếp - Direct – Gián tiếp thanh ghi - Register Indirect – Chỉ số - Indexed 10/1/2005 6 DCE
  • 7. 2.1. Chế độ địa chỉ tức thì Toán hạng (dữ liệu) được chỉ định trực tiếp trong lệnh (mã lệnh) Toán hạng là 1 hằng, được biết trong thời gian dịch Dữ liệu tức thì phải có tiền tố là dấu “#” Ví dụ: mov A, #25H ;A ← #0x25 mov DPTR, #1FFFH ;DPTR ← #0x1FFF temp EQU 40 ;assembler directive mov R1, #temp ;R1 ← 28H (40 decimal) 10/1/2005 7 DCE
  • 8. 2.2. Chế độ địa chỉ thanh ghi Yêu cầu phải sử dụng các thanh ghi để lưu giữ dữ liệu Đặt toán hạng vào 1 thanh ghi và thao tác với nó bằng cách tham chiếu đến thanh ghi chứa (theo tên) trong lệnh mov A, R0 ;A ← contents (R0) mov R2, A ;R2 ← contents (A) ADD A, R1 ;A ← contents (A) + contents (R1) Các thanh ghi nguồn và đích phải cùng kích thước Các lệnh dịch chuyển dữ liệu giữa các thanh ghi không thể áp dụng cho mọi trường hợp, cho mọi thanh ghi: mov R4, R7 ; invalid – Kiểm tra với danh sách lệnh trước khi sử dụng 10/1/2005 8 DCE
  • 9. 2.3. Chế độ địa chỉ trực tiếp Đối với dữ liệu được lưu trữ trên RAM và các thanh ghi – Tất cả các vùng nhớ đều các thể truy xuất bằng địa chỉ. – Như truy xuất đến tất cả các thanh ghi, các cổng, các thiết bị ngoại vi trong 8051. Sử dụng địa chỉ của trực tiếp toán hạng trong lệnh. mov A, 40H ; A ← mem[40H] (note no # sign before 40H) Chế độ địa chỉ thanh ghi tương tự như chế độ địa chỉ trực tiếp mov A, 4H ; 4H is the address for R4 mov A, R4 ; tương tự như trên. Cả 2 lệnh đều như nhau ;nhưng có thể có mã khác nhau Ngăn xếp trong 8051 chỉ sử dụng chế độ địa chỉ trực tiếp 10/1/2005 9 DCE
  • 10. 2.4. Chế độ gián tiếp thanh ghi 1 thanh ghi được sử dụng như 1 con trỏ – Thanh ghi lưu giữ địa chỉ của dữ liệu Chỉ có các thanh ghi R0, R1 và DPTR có thể được sử dụng cho mục đích này trong 8051 R0 và R1 có thể được sử dụng đối với bộ nhớ nội (256 bytes bao gồm cả SFRs) hay từ 00H đến 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] Thanh ghi DPTR có thể được sử dụng đối với bộ nhớ ngoài, trỏ đến ô nhớ bất kỳ trong khoảng 64K movx A, @DPTR ;A ← external_mem[DPTR] movx @DPTR, A ;vice versa 10/1/2005 10 DCE
  • 11. 2.5. Chế độ địa chỉ chỉ số Sử dụng 1 thanh ghi để lưu trữ con trỏ (địa chỉ cơ sở) và 1 thanh ghi khác để lưu giá trị lệch Địa chỉ kết quả là tổng sum = base+offset – Chuyển byte mã có quan hệ với DPTR vào A. Địa chỉ kết quả là: DPTR + A movc A, @A+DPTR ;A ← ext_code_mem [(A + DPTR)] – Chuyển byte mã có quan hệ với PC vào A. Địa chỉ kết quả là PC + A movc A, @A+PC ;A ← ext_code_mem [(A + PC)] Được sử dụng rộng rãi trong thực hiện các bảng tra, các mảng dữ liệu, tạo ra ký tự,… trong bộ nhớ mã lệnh (ROM) 10/1/2005 11 DCE
  • 12. 2.5. Ví dụ Chương trình đọc vào 1 giá trị x từ P1 và đưa ra x2 ở 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 10/1/2005 12 DCE
  • 13. 3. Các lệnh điều khiển chương trình Rẽ nhánh không điều kiện – ajmp addr11 ; absolute jump - nhảy theo địa chỉ tuyệt đối – ljmp addr16 ; long jump - nhảy xa – sjmp rel ; nhảy gần đến địa chỉ quan hệ – jmp @A+DPTR ; jump indirect - nhảy gián tiếp Rẽ nhánh có điều kiện – jz, jnz rel ; nhảy gần đến địa chỉ quan hệ nếu điều kiện thoả mãn – djnz rel ; giảm toán hạng nguồn và nhảy nếu khác không – cjne rel ; so sánh và nhảy nếu không bằng Gọi thường trình con (Subroutine) – acall addr11 ; gọi tuyệt đối 1 thường trình con – lcall addr16 ; gọi 1 thương trình con ở xa – ret ; trở về chương trình chính từ 1 thường trình con – reti ; trở về từ 1 chương trình phục vụ ngắt (ISV) 10/1/2005 13 DCE
  • 14. 3.1. Địa chỉ đích Địa chỉ đích có thể là: – Tuyệt đối: Một giá trị địa chỉ vật lý addr16: địa chỉ 16 bit, ở vị trí bất kỳ trong không gian 64k addr11: địa chỉ 11 bit, ở vị trí bất kỳ trong không gian 2k – rel: relative – quan hệ (tiến hay lùi) -128 bytes đến +127 bytes từ vị trí của mã lệnh hiện thời Địa chỉ đích được tính toán cho các lệnh nhảy quan hệ – PC của lệnh kế tiếp + địa chỉ quan hệ – Đối với nhảy lùi, bỏ đi giá trị nhớ PC = 15H, SJMP 0FEH Địa chỉ là 15H + FEH = 13H Nhảy đến vị trí lệnh kế tiếp -2byte (lệnh hiện thời) 10/1/2005 14 DCE
  • 15. 3.2. Nhảy có điều kiện jz, jnz : Điều kiện được xác lập trên thanh ghi chứa A==0 – Kiểm tra nếu A = 0 – jz nhảy nếu A =0 và jnz nhảy nếu A # zero – Không cần thực hiện phép toán số học djnz : giảm đi 1 và nhảy nếu không bằng 0 – djnz Rn, rel – djnz direct, rel jnc : Điều kiện được xác lập trên cờ nhớ CY – jc rel – jnc rel Cjne : so sánh và nhảy nếu không bằng – cjne A, direct, rel – cjne ARn, #data, rel – cjne @Rn, #data, rel 10/1/2005 15 DCE
  • 16. 3.2. Nhảy có điều kiện (…) Add 3 to A ten times mov A, #0 ; clear A mov R2, #10 ; R2 ← 10, can also say 0AH AGAIN: add A, #03 ; add 3 to A djnz R2, AGAIN ; repeat until R2==0 mov R5, A ; save the result in R5 Loop within loop using djnz mov R3, #100 loop1: mov R2, #10 ; trying for 1000 loop iterations loop2: nop ; no operation djnz R2, loop2 ; repeat loop2 until R2==0 djnz R3, loop1 ; repeat loop1 until R3==0 10/1/2005 16 DCE
  • 17. 3.3. Nhảy không điều kiện LJMP addr16 – Long jump. Nhảy đến 1 địa chỉ đích 2 byte – Lệnh có độ dài 3 byte SJMP rel – Nhảy đến 1 địa chỉ quan hệ từ PC+127 đến PC-128 – Nhảy đến PC + 127 (00H – 7FH) – Nhảy đến PC – 128 (80H – FFH) 10/1/2005 17 DCE
  • 18. 4. Các lệnh gọi thường trình Thường trình con: – Những đoạn chương trình có thể dùng lại được LCALL addr16 – Long call. Lệnh 3 byte. Gọi bất kỳ thường trình con nào trong không gian mã 64Kb – Cất nội dung PC vào ngăn xếp - push PC – Nhảy đến địa chỉ xác định - jmp address ACALL addr11 – Lệnh 2 byte. Gọi bất kỳ thường trình con nào trong khoảng 2k không gian bộ nhớ mã lệnh – Saves code ROM for devices with less than 64K ROM RET – Trở về từ 1 thương trình con – Phục hồi lại PC từ ngăn xếp - pop PC 10/1/2005 18 DCE
  • 19. 5. Chu kỳ máy Là số các chu kỳ đồng hồ được sử dụng để thực hiện 1 lệnh Có giá trị khác nhau, phụ thuộc lệnh. Lệnh ngắn nhất là 1 chu kỳ máy Với 8051, 12 chu kỳ đồng hồ là thời gian tối thiểu cần thiết cho thực hiện 1 lệnh Thời gian của 1 chu kỳ máy: – Tmc = Số Clocks trên chu kỳ máy/ tần số đồng hồ – Với 8051 tần số đồng hồ là 11.0592MHz, Tmc = 12 / 11.0592M = 1.085 micro seconds Thời gian để thực hiện 1 lệnh – Tinstr = số chu kỳ máy để thực hiện lệnh * Tmc – Với lệnh NOP, số chu kỳ máy = 1. Vì vậy, Tinstr = 1 * 1.085 = 1.085 micro seconds 10/1/2005 19 DCE
  • 20. 6. Các vòng trễ đơn giản Tìm thời gian trễ cho thường trình con DELAY: mov R3, #200 ; 1 machine cycle HERE: djnz R3, HERE ; 2 machine cycles RET ; 1 machine cycle Tính toán – Total machine cycles = 200*2 + 1 + 1 = 402 – Time = 402 * 1.085us (giả thiết: 11.0592 MHz clk) = 436.17us Tương tự, với bất kỳ thời gian trễ nào, đều có thể được xác định bằng các vòng lặp trong lặp Với các bộ trễ lớn hơn, thường sử dụng các bộ định thời. 10/1/2005 20 DCE
  • 21. Chương 3 : Ôn tập How does 8051 machine code look ? What are 8051 addressing modes ? What are program control instructions ? Conditional Vs Unconditional branches Subroutines What is Machine cycle ? How to calculate exact time spent in executing a program ? Or how to write exact time delay loops ? 10/1/2005 21 DCE