Tải bản đầy đủ (.doc) (16 trang)

Kiến trúc vi điều khiển 8051

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 (485.44 KB, 16 trang )

1. Kiến trúc vi điều khiển 8051
1.3 Truy xuất địa chỉ
8051 có các kiểu truy xuất địa chỉ khác nhau:









Thanh ghi (Register)
Trực tiếp (Direct)
Gián tiếp (Indirect)
Tức thời (Immediate)
Tương đối (Relative)
Tuyệt đối (Absolute)
Dài (Long)
Chỉ số (Indexed)

Truy xuất địa chỉ thanh ghi

8051 cho phép truy xuất 8 thanh ghi “làm việc”, được đánh số từ R0 → R7. Các lệnh sử dụng
kiểu định địa chỉ thanh ghi được mã hóa bằng các dùng 3 bit thấp nhất của opcode( của lệnh) để
chỉ ra 1 thanh ghi bên trong không gian địa chỉ logic này. Vậy : 1 mã chức năng + địa chỉ toán
hạng → 1 lệnh ngắn 1 byte.
Truy xuất địa chỉ kiểu trực tiếp

Kiểu định địa chỉ trực tiếp được sử dụng để truy xuất các biến nhớ hoặc các thanh ghi trên
chip. Một byte thêm vào tiếp theo opcode dùng để xác định địa chỉ. Trong 8051 có 128 byte bộ


nhớ RAM. Bộ nhớ RAM được gán địa chỉ từ 00H đến FFH và được phân chia như sau:




Các ngăn nhớ từ 00H đến 1FH được gán cho các băng thanh ghi và ngăn xếp
Các ngăn nhớ từ 20H đến 2FH được dành cho không gian định địa chỉ bít để lưu dữ liệu
theo từng bit
Các ngăn nhớ từ 30H đến 7FH là không gian để lưu dữ liệu có kích thước 1 byte

Chế độ định địa chỉ trực tiếp có thể truy cập toàn bộ không gian của bộ nhớ RAM. Tuy nhiên,
chế độ này thường được dùng để truy cập các ngăn nhớ RAM từ 30H đến 7FH, vì thực tế đối với
không gian nhớ danh cho băng thanh ghi thì đã được truy cập bằng tên thanh ghi như R0- R7. ở
chế độ định địa chỉ trực tiếp , địa chỉ ngăn nhớ RAM chứa dữ liệu là toán hạng của lệnh.
Ví dụ:
MOV R0, 40

; sao nội dung ngăn nhớ 40H của RAM vào R0


MOV R4, 7FH

; chuyển nội dung ngăn nhớ 7FH vào R4.

Một ứng dụng quan trọng của chế độ định địa chỉ trực tiếp là ngăn xếp. Trong họ 8051, chỉ có
chế độ định địa chỉ trực tiếp là được phép cất và lấy dữ liệu từ ngăn xếp
Truy xuất địa chỉ kiểu gián tiếp

Ở chế độ này, thanh ghi được dùng để trỏ đến dữ liệu có trong bộ nhớ.
Nếu dữ liệu có trên chip CPU thì chỉ các thanh ghi R0 và R1 mới được sử dụng, và như vậy

cũng có nghĩa là không thể dùng các thanh ghi R2-R7 để trỏ đến địa chỉ của toán hạng ở chế độ
định địa chỉ này. Nếu R0 và R1 được dùng làm con trỏ, nghĩa là chúng lưu địa chỉ của ngăn nhớ
RAM thì trước các thanh ghi cần đặt dấu " @" như các ví dụ sau:
MOV A, @R0
MOV @R1, B

; chuyển ngăn nhớ RAM có địa chỉ ở R0 vào A
; chuyển B vào ngăn nhớ RAM có địa chỉ ở R1

Chú ý: ở đây R0 cũng như R1 đều có dấu "@" đứng trước. Nếu không có dấu "@" đứng
trước thì đó là lệnh chuyển nội dung thanh ghi R0 và R1 chứ không phải dữ liệu ngăn nhớ có địa
chỉ trong R0 và R1. Một trong những ưu diểm của chế độ định địa chỉ gián tiếp là cho phép truy
cập dữ liệu linh hoạt hơn so với chế độ định địa chỉ trực tiếp. Tuy nhiên R0 và R1 là các thanh
ghi 8 bit, nên chúng chỉ được phép truy cập đến các ngăn nhớ RAM trong, từ địa chỉ 30H đến
7FH và các thanh ghi SFR. Trong thực tế, có nhiều trường hợp cần truy cập dữ liệu được cất ở
RAM ngoài hoặc không gian ROM trên chip. Trong những trường hợp đó chúng ta cần sử dụng
thanh ghi 16 bit DPTR.
Truy xuất địa chỉ kiểu tức thời

Khi toán hạng là một hằng số thay vì là một biến, hằng số này có thể đưa vào lệnh và đây là
byte dữ liệu tức thời.
Trong hợp ngữ, các toàn hạng tức thời được nhận biết nhờ vào ký tự ‘# ‘ đặt trước chúng.
Toán hạng này có thể là một hằng số học, một biến hoặc một biểu thức số học sử dụng các hằng
số, các ký hiệu và các toán tử. Trình dịch hợp ngữ tính giá trị và thay thế dữ liệu tức thời vào
trong lệnh.
Ví dụ lệnh : MOV A, #12 ;Nạp giá trị 12(OCH) vào thanh chứa A
Tất cả các lệnh sử dụng kiểu định địa chỉ tức thời đều sử dụng hằng dữ liệu 8 bit làm dữ liệu
tức thời. Có một ngoại lệ khi ta khởi động con trỏ dữ liệu 16-bit DPTR, hằng địa chỉ 16 bit được
cần đến.
Truy xuất địa chỉ kiểu tương đối



Kiểu định địa chỉ tương đối chỉ được sử dụng cho các lệnh nhảy. Một địa chỉ tương đối là một
giá trị 8 bit có dấu. Giá trị này được cộng với một bộ đếm chương trình để tạo ra địa chỉ của lệnh
tiếp theo cần thực thi. Định địa chỉ tương đối có điểm lợi là cung cấp cho ta mã không phụ thuộc
vào vị trí, nhưng lại có điểm bất lợi là các đích nhảy bị giới hạn trong tầm.
Truy xuất địa chỉ kiểu tuyệt đối

Kiểu định địa chỉ này được sử dụng với các lệnh ACAll và AJMP. Đây là các lệnh 2 byte cho
phép rẽ nhánh chương trình trong trang 2k hiện hành của bộ nhớ chương trình bằng cách cung
cấp 11 bit thấp của địa chỉ đích. Trong đó có 3 bit cao (A8-A10) và 8 bit thấp (A0-A7) thành lập
byte thứ 2 của lệnh
Truy xuất địa chỉ kiểu dài

Kiểu định địa chỉ dài chỉ được dùng cho các lệnh LCALL và LJMP. Các lệnh 3 byte này chứa
địa chỉ đích 16 bit. Lợi ích của kiểu định địa chỉ này là sử dụng hết toàn bộ không gian nhớ
chương trình 64K, nhưng lại có điểm bất lợi là lệnh dài đến 3-byte và phụ thuộc vào vị trí.
Truy xuất địa chỉ kiểu chỉ số

Chế độ định địa chỉ chỉ số được sử dụng rộng rãi khi truy cập các phần tử dữ liệu của bảng
trong không gian ROM chương trình của 8051. Lệnh được dùng cho mục đích này là "MOVC A,
@A+DPTR". Thanh ghi 16 bit DPTR và thanh ghi A được dùng để tạo ra địa chỉ của phần tử dữ
liệu được lưu trong ROM trên chip. ở lệnh này, nội dung của A được cộng với nội dung thanh ghi
16- bit DPTR để tạo ra địa chỉ 16 bit.

1. Kiến trúc vi điều khiển 8051
1.4 Các loại lệnh
Các lệnh số học




Các lệnh logic


Các lệnh di chuyển dữ liệu


Các lệnh xử lý bit


Các lệnh rẽ nhánh



Các lệnh dịch và quay

Các lệnh làm việc với ngăn xếp


2.1.1 Điều khiển bật tắt 1 led
Đầu tiên bài học sẽ thực hành điều khiển 1 led sáng tối thật đơn giản. Mạch điện điều khiển
bao gồm 1 led và 1 điện trở nối tiếp nhau. Bài học này sẽ áp dụng cho vi điều khiển 89S51 tuy
nhiên hoàn toàn có thể áp dụng cho các vi điều khiển khác thuộc họ 8051. Bài thực hành này sẽ
điều khiển việc cho phép dòng điện chạy qua led làm led sáng hoặc tối.

Bước 1:
Thiết kế mạch ứng dụng cho vi điều khiển như hình 2.1.1. Trong đó chân P0.0 được nối với
Ka-tốt của led. Nếu P0.0 = 1 thì led sẽ không sáng, P0.0 = 0 led sẽ sáng.

Hình 2.1.1 Sơ đồ nguyên lý mạch điều khiển led


Bước 2:
Lập trình điều khiển Led theo ngôn ngữ lập trình Assembly (có thể dùng chương trình
Reads51)
Nội dung chương trình:
===============================================================
org 0h
; không sử dụng ngắt
start: Clr P0.0 ; Bật led sáng
call delay; Gọi hàm trễ


Setb P0.0 ; Tắt led
call delay; Gọi hàm trễ
sjmp start; Quay trở về ban đầu
;=============================================
;subroutine delay created to rise delay time
;=============================================
delay: mov R1,#255
del1: mov R2,#255
del2: djnz R2,del2
Chờ đến khi R2 giảm về 0
djnz R1,del1 Chờ đến khi R1 giảm về 0
ret
end
===============================================================

Bước 3:
Biên dịch chương trình trên bằng các chương trình biên dịch chuyên dụng cho vi điều khiển
như Reads51. Sau khi biên dịch, chươn trình sẽ tạo ra file mã máy mà vi điều khiển dựa vào đó

để hoạt động. Thông thường file đó sẽ có dạng tên_file.hex. Việc đặt tên file là do người dùng tự
đặt.

Bước 4
Nạp file mã máy mà chương trình biên dịch vừa tạo ra bằng các công cụ và mạch nạp như
trong trang web này hướng dẫn làm như: mạch nạp 89xxxx, mạch nạp 89Cxx, mạch nạp
89Sxxxx, mạch nạp 89Sxx và AVR
Sau khi nạp file mã máy vào vi điều khiển 89S51. Gắn vi điều khiển vào mạch ứng dụng, sẽ
thấy kết q2.2.1 Điều khiển bật tắt led khi nhấn công tắc
Trong công nghiệp khi nhấn phím điều khiển hệ thống, nhu cầu hiển thị tác động của người
vận hành xem đã tác động chưa rất quan trọng. Giải pháp dùng led để hiển thị được sử dụng rất
nhiều. Phần này sẽ mô tả giải pháp dùng vi điều khiển để điều khiển việc hiển thị tác động nhấn
công tắc.

Bước 1:
Xây dựng mạch điều khiển mô tả như hình 2.2.1. Trong ví dụ này, các chân P2.0 đến chân
P2.7 của vi điều khiển được nối với phím bấm nháy và các chân P0.0 đến P0.7 được nối với Katốt của led. Nhiệm vụ là khi nhấn phím tại chân P2.x thì led nối với chân P0.x tương ứng sẽ sáng.


Hình 2.2.1 Sơ đồ nguyên lý hoạt động giao tiếp với công tắc

Bước 2:
Lập trình điều khiển Led theo ngôn ngữ lập trình Assembly (có thể dùng chương trình
Reads51)
Nội dung chương trình:
===============================================================
org 0h
start: mov A,P2 ; Đọc dữ liệu từ cổng P2, lưu vào thanh ghi ACC
mov P0,A ; Đưa dữ liệu ra cổng P0
sjmp start; Quay về ban đầu

end
===============================================================

Bước 3:
Biên dịch chương trình trên bằng các chương trình biên dịch chuyên dụng cho vi điều khiển
như Reads51. Sau khi biên dịch, chươn trình sẽ tạo ra file mã máy mà vi điều khiển dựa vào đó
để hoạt động. Thông thường file đó sẽ có dạng tên_file.hex. Việc đặt tên file là do người dùng tự
đặt.

Bước 4


Nạp file mã máy mà chương trình biên dịch vừa tạo ra bằng các công cụ và mạch nạp như
trong trang web này hướng dẫn làm như: mạch nạp 89xxxx, mạch nạp 89Cxx, mạch nạp
89Sxxxx, mạch nạp 89Sxx và AVR
Sau khi nạp file mã máy vào vi điều khiển 89S51. Gắn vi điều khiển vào mạch ứng dụng, sẽ
thấy kết quả của bài học.
uả của bài học.

2.2.2 Điều khiển led chạy khi nhấn công tắc
Trong phần này, nội dung bài học là điều khiển led sáng dịch chuyển khi nhấn công tắc. Cụ
thể là led sáng sẽ chuyển động sang trái khi nhấn phím nối với chân P2.0 và chuyển động sang
phải khi nhấn phím nối với chân P2.1.

Bước 1:
Xây dựng mạch điều khiển mô tả như hình 2.2.2. Trong ví dụ này, các chân P2.0 đến chân
P2.7 của vi điều khiển được nối với phím bấm nháy và các chân P0.0 đến P0.7 được nối với Katốt của led. Nhiệm vụ là khi nhấn phím tại chân P2.0 thì led sáng chuyển động sang trái, nhấn
phím nối với chân P2.1 led sáng sẽ chuyển động sang phải.

Hình 2.2.2 Sơ đồ nguyên lý hoạt động giao tiếp với công tắc


Bước 2:
Lập trình điều khiển Led theo ngôn ngữ lập trình Assembly (có thể dùng chương trình
Reads51)


Nội dung chương trình:
===============================================================
org 0h
CekP20: JB P2.0,CekP21 ; kiểm tra P2.0
call RLeft ; gọi hàm điều khiển led -> trái
sjmp CekP20 ; trở về CekP20
CekP21: JB P2.1,CekP20 ; kiểm tra P2.1
call RRight ; gọi hàm điều khiển led -> trái
sjmp CekP20 ; trở về CekP2.0
;===============================================
;this subroutine is used to move LED to the left.
;================================================
RLeft: mov A,#11111110b;Khởi tạo cho led tại P0.0 sáng
RLeft1: mov P0,A ;P0.0 sáng
call delay ;gọi hàm trễ
JB P2.0,RLeft2 ;kiểm tra P2.0
sjmp EndRLeft ;không nhấn phím P2.0, kết thúc
RLeft2: RL A
; dịch thanh ghi A -> trái
sjmp RLeft1
EndRLeft:
ret
;
;=================================================

;this subroutine is used to move LED to the right.
;=================================================
RRight: mov A,#01111111b
RRight1:mov P0,A
call delay
JB P2.0,RRight2
sjmp EndRRight
RRight2:RL A
sjmp RRight1
EndRRight:
ret
;=============================================
;subroutine delay created to rise delay time
;=============================================
delay: mov R1,#255
del1: mov R2,#255
del2: djnz R2,del2
djnz R1,del1
ret
end
===============================================================

Bước 3:
Biên dịch chương trình trên bằng các chương trình biên dịch chuyên dụng cho vi điều khiển
như Reads51. Sau khi biên dịch, chươn trình sẽ tạo ra file mã máy mà vi điều khiển dựa vào đó
để hoạt động. Thông thường file đó sẽ có dạng tên_file.hex. Việc đặt tên file là do người dùng tự
đặt.


Bước 4

Nạp file mã máy mà chương trình biên dịch vừa tạo ra bằng các công cụ và mạch nạp như
trong trang web này hướng dẫn làm như: mạch nạp 89xxxx, mạch nạp 89Cxx, mạch nạp
89Sxxxx, mạch nạp 89Sxx và AVR
Sau khi nạp file mã máy vào vi điều khiển 89S51. Gắn vi điều khiển vào mạch ứng dụng, sẽ
thấy kết quả của bài học.



×