Tải bản đầy đủ (.docx) (19 trang)

Tài liệu về 89c51

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 (680.71 KB, 19 trang )

1. Kiến trúc vi điều khiển 8051
1.1 Tổ chức bộ nhớ
Các vi điều khiển thuộc họ 8051 đều tổ chức thành 2 không gian chương trình và dữ liệu, hình
1.1.1 và hình 1.1.2 sẽ mô tả điều này. Kiến trúc vi xử lý 8 bit của 8051 này cho phép truy nhập
và tính toán nhanh hơn đối với không gian dữ liệu nhờ việc phân chia 2 không gian bộ nhớ
chương trình và dữ liệu như trên. Tuy nhiên bộ nhớ ngoài được truy nhập bởi hệ thống 16 bit địa
chỉ vẫn có thể thực hiện nhờ thanh ghi con trỏ.
Bộ nhớ chương trình (ROM, EPROM) là bộ nhớ chỉ đọc, có thể mở rộng tối đa 64Kbyte. Vói
họ vi điều khiển 89xx, bộ nhớ chương trình được tích hợp sẵn trong chip có kích thước nhỏ nhất
là 4kByte. Với các vi điều khiển không tích hợp sẵn bộ nhớ chương trình trên chip, buộc phải
thiết kế bộ nhớ chương trình bên ngoài. Ví dụ sử dụng EPROM: 2764 (64Kbyte), khi đó chân
PSEN phải ở mức tích cực (5V).
Hình 1.1.1 Cấu trúc vi điều khiển 89C51
Bộ nhớ dữ liệu (RAM) tồn tại độc lập so với bộ nhớ chương trình. Họ vi điều khiển 8051 có
bộ nhớ dữ liệu tích hợp trên chip nhỏ nhất là 128byte và có thể mở rộng với bộ nhớ dữ liệu ngoài
lên tới 64kByte. Với những vi điều khiển không tích hợp ROM trên chip thì vẫn có RAM trên
chip là 128byte. Khi sử dụng RAM ngoài, CPU đọc và ghi dữ liệu nhờ tín hiệu trên các chân RD
và WR. Khi sử dụng cả bộ nhớ chương trình và bộ nhớ dữ liệu bên ngoài thì buộc phải kết hợp
chân RD và PSEN bởi cổng logic AND để phân biệt tín hiệu truy xuất dữ liệu trên ROM hay
RAM ngoài.
Bộ nhớ chương trình:
Hình 1.1.2 Cấu trúc bộ nhớ chương trình
Hình 1.1.3 Địa chỉ các ngắt trên bộ nhớ chương trình
Hình 1.1.2 mô tả cấu trúc bộ nhớ chương trình. Sau khi khởi động, CPU bắt đầu thực hiện
chương trình ở vị trí 0000H. Hình 1.1.3 mô tả địa chỉ ngắt mặc định trên bộ nhớ chương trình.
Mối khi xảy ra ngắt, con trỏ của CPU sẽ nhảy đến đúng địa chỉ ngắt tương ứng và thực thi
chương trình tại đó. Ví dụ ngắt ngoài 0 sẽ có địa chỉ là 0003H, khi xảy ra ngắt ngoài 0 thì con trỏ
chương trình sẽ nhảy đến đúng địa chỉ 0003H để thực thi chương trình tại đó. Nếu trong chương
trình ứng dụng không xử dụng đến ngắt ngoài 0 thì địa chỉ 0003H vẫn có thể dùng cho mục đích
khác (sử dụng cho bộ nhớ chương trình). Bởi vậy khi lập trình bằng ngôn ngữ Assembly, phần
đầu chương trình bao giờ cũng phải cho chương trình nhảy đến địa chỉ cao hơn địa chỉ chứa các


ngắt và mã lệnh viết cho các ngắt thì phải viết đúng địa chỉ của các ngắt tương ứng.
Bộ nhớ dữ liệu:
Hình 1.1.4 Cấu trúc bộ nhớ dữ liệu
Hình 1.1.4 mô tả cấu trúc bộ nhớ dữ liệu trong và bộ nhớ dữ liệu ngoài của họ vi điều
khiển 8051. CPU sẽ dùng đến các chân RD và WR khi truy cập đến bộ nhớ dữ liệu
ngoài.
Hình 1.1.5 mô tả cấu trúc bộ nhớ dữ liệu trong chip, được chia thành 3 khối là 128
byte thấp, 128 byte cao và 128 byte đặc biệt.
Hình 1.1.5 Cấu trúc bộ nhớ trong
Hình 1.1.6 mô tả cấu trúc 128 byte thấp của bộ nhớ dữ liệu của họ vi điều khiển 8051. 32 byte
đầu tiên (00H-1FH) được sử dụng cho 4 bộ 8 thanh ghi R0-R7. Hai bit của thanh ghi đặc biệt
PSW sẽ lựa chọn 1 trong 4 bộ thanh ghi mà vi điều khiển sẽ dùng trong khi thực thi chương
trình.
Hình 1.1.6 Cấu trúc 128 byte thấp của bộ nhớ dữ liệu trong
8051 chứa 210 vị trí bit được định địa chỉ trong đó 128 bit chứa trong các byte ở địa chỉ từ 20H đến
2FH (16 byte x 8 bit = 128 bit) và phần còn lại chứa trong các thanh ghi đặc biệt. Ngoài ra 8051 còn có
các port xuất/nhập có thể định địa chỉ từng bit, điều này làm đơn giản việc giao tiếp bằng phần mềm với
các thiết bị xuất/nhập đơn bit.
Vùng RAM đa mục đích có 80 byte đặt ở địa chỉ từ 30H đến 7FH, bên dưới vùng này từ địa chỉ 00H
đến 2FH là vùng nhớ có thể được sử dụng tương tự. Bất kỳ vị trí nhớ nào trong vùng RAM đa mục đích
đều có thể được truy xuất tự do bằng cách sử dụng các kiểu định địa chỉ trực tiếp hoặc gián tiếp.
Bất kỳ vị trí nhớ nào trong vùng RAM đa mục đích đều có thể được truy xuất tự do bằng cách sử dụng
các kiểu định địa chỉ trực tiếp hoặc gián tiếp.
Cũng như các thanh ghi từ R0 đến R7, ta có 21 thanh ghi chức năng đặc biệt SFR chiếm phần trên
của Ram nội từ địa chỉ 80H đến FFH. Cần lưu ý là không phải tất cả 128 địa chỉ từ 80H đến FFH đều
được định nghĩa mà chỉ có 21 địa chỉ được định nghĩa.

Hình 1.1.7. 128 byte cao của bộ nhớ dữ liệu.
1.2. Các thanh ghi đặc biệt
8051 có 21 thanh ghi chức năng đặc biệt SFR chiếm phần trên của Ram nội từ địa chỉ 80H đến FFH.

Cần lưu ý là không phải tất cả 128 địa chỉ từ 80H đến FFH đều được định nghĩa mà chỉ có 21 địa chỉ
được định nghĩa. Hình 1.2.1 mô tả các thanh ghi đặc biệt trong vùng nhớ dữ liệu 80H đến FFH.
Hình 1.2.1 Các thanh ghi đặc biệt
Thanh ghi chính
Thanh ghi tính toán chính của vi điều khiển 8051 ACC (Accumulator). Là thanh ghi đặc biệt
của 8051 dùng để thực hiện các phép toán của CPU, thường kí hiệu là A.
Thanh ghi phụ
Thanh ghi tính toán phụ của vi điều khiển 8051 là B. Thanh ghi B ở địa chỉ F0H được dùng chung với
thanh chứa A trong các phép toán nhân, chia. Lệnh MUL AB nhân 2 số 8 bit không dấu chứa trong A và
B và chứa kết quả 16 bit vào cặp thanh ghi B, A (thanh chứa A cất byte thấp và thanh ghi B cất byte cao).
Lệnh chia DIV AB chia A bởi B, thương số cất trong thanh chứa A và dư số cất trong thanh ghi B.
Thanh ghi B còn được xử lý như một thanh ghi nháp. Các bit được định địa chỉ của thanh ghi B có địa chỉ
từ F0H đến F7H.
Thanh ghi trạng thái chương trình (PSW)
Thanh ghi trạng thái chương trình PSW là thanh ghi mô tả toàn bộ trạng thái chương trình
đang hoạt động của hệ thống. Hình 1.2.2 và 1.2.2 sẽ mô tả thanh ghi này.
Hình 1.2.1 Thanh ghi trạng thái chương trình PSW
Hình 1.2.2 Chi tiết các bit trong thanh ghi PSW
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 ; chuyển ngăn nhớ RAM có địa chỉ ở R0 vào A
MOV @R1, B ; 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.
Thanh ghi ngăn xếp (Stack Pointer)
Con trỏ stack SP (stack pointer) là 1 thanh ghi 8 bit ở địa chỉ 81H. SP chứa địa chỉ của dữ liệu hiện
đang ở đỉnh của stack. Các lệnh liên quan đến satck bao gồm lệnh cất dữ liệu vào stack và lệnh lấy dữ
liệu ra khỏi stack. Việc cất vào stack làm tăng SP trước khi ghi dữ liệu và việc lấy dữ liệu ra khỏi stack sẽ
giảm SP. Vùng stack của 8051 được giữ trong RAM nội và được giới hạn đến các địa chỉ truy xuất được
bởi kiểu định địa chỉ gián tiếp. Các lệnh PUSH và POP sẽ cất dữ liệu vào stack và lấy dữ liệu từ stack,
các lệnh gọi chương trình con (ACALL, LCALL) và lệnh trở về (RET, RETI) cũng cất và phục hồi nội dung
của bộ đếm chương trình PC (Program counter)
Con trỏ dữ liệu DPTR
Con trỏ dữ liệu DPTR (data pointer) được dùng để truy xuất bộ nhớ chương trình ngoài hoặc bộ nhớ
dữ liệu ngoài. DPTR là một thanh ghi 16 bit có địa chỉ là 82H (DPL, byte thấp) và 83H (DPH, byte cao).
Thanh ghi các cổng P0-P3
Các port xuất/nhập của 8051 bao gồm Port 0 tại địa chỉ 80H, Port 1 tại địa chỉ 90H, Port 2 tại địa chỉ
A0H và Port 3 tại địa chỉ B0H. Tất cả các port đều được định địa chỉ từng bit nhằm cung cấp các khả
năng giao tiếp mạnh.
Thanh ghi bộ đệm truyền thông nối tiếp (Serial Data Buffer)
Bộ đệm truyền thông được chia thành hai bộ đệm, bộ đệm truyền dữ liệu và bộ đệm nhận dữ liệu. Khi
dữ liệu được chuyển vào thanh ghi SBUF, dữ liệu sẽ được chuyển vào bộ đệm truyền dữ liệu và sẽ được
lưu giữ ở đó cho đến khi quá trình truyền dữ liệu qua truyền thông nối tiếp kết thúc. Khi thực hiện việc
chuyển dữ liệu từ SBUF ra ngoài, dữ liệu sẽ được lấy từ bộ đệm nhận dữ liệu của truyền thông nối tiếp.
Thanh ghi của bộ định thời/bộ đếm
8051 có 2 bộ đếm/định thời (counter/timer) 16 bit để định các khoảng thời gian hoặc để đếm các sự
kiện. Các cặp thanh ghi (TH0, TL0) và (TH1, TL1) là các thanh ghi của bộ đếm thời gian. Bộ định thời
0 có địa chỉ 8AH (TL0, byte thấp) và 8CH (TH0, byte cao). Bộ định thời 1 có địa chỉ 8BH
(TL1, byte thấp) và 8DH (TH1, byte cao).
Hoạt động của bộ định thời được thiết lập bởi thanh ghi chế độ định thời TMOD
(Timer Mode Register) ở địa chỉ 88H. Chỉ có TCON được định địa chỉ từng bit.
Các thanh ghi điều khiển

Các thanh ghi điều khiển đặc biệt như IP, IE, TMOD, TCON, SCON và PCON là các thanh ghi điều
khiển và ghi nhận trạng thái của hệ thống ngắt, bộ đếm/định thời, truyền thông nối tiếp. Chi tiết của các
thanh ghi này sẽ được mô tả sau.
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. Thực hành điều khiển các thiết bị vào ra
2.1 Điều khiển LED
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 quả của bài học.
2.1.4 Các bài thực hành mở rộng
• Giống như bài 2.1.3 hãy thực hành điều khiển các led nối với các chân P0.0 đến
P0.7 bằng lệnh: mov P0, #xxxxxxxxb hoặc lệnh setb P0.x và clr P0.x
• Giống như bài 2.1.3 hãy thực hành điều khiển các led nối với các chân P0.0 đến

P0.7 bằng lệnh: rr P0 hoặc rl P0
• Giống như bài 2.1.3 hãy thực hành điều khiển các led nối với các chân P0.0 đến
P0.7 bằng lệnh: rrc P0 hoặc rlc P0

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

Tải bản đầy đủ ngay
×