CHƯƠNG III :
GIỚI THIỆU VI ĐIỀU KHIỂN AT89C52
I. VI ĐIỀU KHIỂN HỌ MCS-51
MCS-51TM là họ vi điều khiển do hãng INTEL sản xuất vào đầu những năm
80 và ngày nay đã trở thành một chuẩn trong công nghiệp. Bắt đầu từ IC tiêu
biểu là 8051 đã cho thấy khả năng thích hợp với những ứng dụng mang tính
điều khiển. Việc xử lí trên byte và các phép toán số học ở cấu trúc dữ liệu nhỏ
được thực hiện bằng nhiều chế độ truy xuất dữ liệu nhanh trên RAM nội. Tập
lệnh cung cấp một bản tiện dụng của những lệnh số học 8 bit gồm cả lệnh nhân
và lệnh chia. Nó cung cấp những hỗ trợ mở rộng on-chip dùng cho những biến 1
bit như là kiểu dữ liệu riêng cho phép quản lí và kiểm tra bit trực tiếp trong
điều khiển và những hệ thống logic đòi hỏi xử lí luận lí.
Sau đây là bảng so sánh các IC trong họ MCS-51TM :
TÊN LINH
KIỆN
8051
8031
8751
8951
8052
8032
8752
8952
BỘ NHỚ
CHƯƠNGù TRÌNH
ON CHIP
4 KB MROM
0 KB
4 KB EPROM
4 KB Flash ROM
xuất ra nó, điển hình là ATMEL Corporation. Hãng này đã kết hợp rất nhiều
tính năng dựa trên nền tảng kỹ thuật của mình để tạo ra các vi điều khiển tương
thích với MCS-51TM nhưng mạnh mẽ hơn.
AT89C52 là một vi điều khiển 8 bit do ATMEL sản xuất, chế tạo theo công
nghệ CMOS, có chất lượng cao, công suất thấp với 8 KB Flash (flash
programmable and erasable read only memory). Thiết bò này được chế tạo bằng
cách sử dụng kỹ thuật bộ nhớ không bốc hơi mật độ cao của ATMEL và tương
thích với chuẩn công nghiệp MCS-51 TM về tập lệnh và các chân ra. Flash onchip cho phép bộ nhớ lập trình được lập trình trong hệ thống bởi một lập trình
viên bình thường. Bằng cách nối 1 CPU 8 bit với một Flash trên một chip đơn,
AT89C52 là một vi điều khiển mạnh (có công suất lớn), cung cấp một sự linh
động cao và giải pháp về giá cả đối với nhiều ứng dụng vi điều khiển.
Các đặc điểm chủ yếu của AT89C52 :
• Tương thích hoàn toàn với họ MCS-51TM của Intel.
• Bộ nhớ chương trình 8K Byte thuộc loại Flash Memory.
• Độ bền : 1000 lần ghi/xóa.
• Tần số hoạt động : 0 Hz đến 24 MHz.
• 3 chế độ khóa bộ nhớ.
• 256 x 8-Bit RAM nội.
• 32 đường I/O lập trình được (4 port).
• 3 timer/counter 16-bit.
• 8 nguồn ngắt.
• Chế độ hạ nguồn và chế độ lười tiêu tốn công suất thấp.
INT1
INT0
Timer 2
Timer 1
P0 P2
PSEN
ALE
P1 P3
TxD
RxD
II.1 Sơ lược về các chân của 8952:
µC 8952 có tất cả 40 chân có chức năng như các đường xuất nhập. Trong đó
có 26 chân có công dụng kép, mỗi đường có thể hoạt động như đường xuất nhập
hoặc như đường điều khiển hoặc là thành phần của bus dữ liệu và bus đòa chỉ.
U 12
3
3
3
3
3
3
3
3
9
8
7
0
0
0
0
0
0
.0
.1
.2
.3
.4
.5
.6
.7
/A
/A
/A
/A
/A
/A
/A
/A
D
D
D
D
D
XTA L1
XTA L2
R ST
0
1
2
3
4
5
6
7
P
P
P2
P2
P2
P2
P2
P2
2 .0 /A
2 .1 /A
.2 /A 1
.3 /A 1
.4 /A 1
.5 /A 1
.6 /A 1
1
2
3
4
5
6
7
8
1
1
1
1
1
1
1
1
0
1
2
3
4
5
6
7
29
30
các mức 1 ra các chân port thì chúng được kéo lên do có điện trở nội và có thể
dùng làm đầu vào. Khi vai trò là cổng nhập, những chân của port 1 bò kéo
xuống thấp sẽ đổ dòng vì có nội trở kéo lên.
Hơn nữa, P1.0 và P1.1 có thể được dùng như là đầu vào bộ đếm
timer/counter 2 bên ngoài (P1.0/T2) và xung kích (P1.1/T2EX).
Port 1 cũng nhận những byte đòa chỉ thấp trong khi lập trình Flash và
trong khi kiểm tra Flash .
c/ Port 2:
Port 2 là một port công dụng kép trên các chân 21 – 28 được dùng như các
đường xuất nhập hoặc là byte cao của bus đòa chỉ đối với các thiết kế dùng bộ
nhớ mở rộng.
d/ Port 3:
Port 3 là một port công dụng kép trên các chân 10 – 17. Các chân của port
này có nhiều chức năng, các công dụng chuyển đổi có liên hệ với các đặc tính
đặc biệt của 8952 như ở bảng sau:
Bit
Tên
Chức năng chuyển đổi
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
(8952) thì PSEN\ sẽ ở mức thụ động (mức cao).
b/ ALE (Address Latch Enable):
Tín hiệu ra ALE trên chân 30 tương hợp với các thiết bò làm việc với các vi
xử lí 8085, 8088, 8086.
µC 8952 dùng ALE một cách tương tự cho việc giải kênh các bus đòa chỉ và
dữ liệu.
Khi port 0 được dùng trong chế độ chuyển đổi: vừa là bus dữ liệu vừa là
byte thấp của bus đòa chỉ, ALE là tín hiệu để chốt byte thấp đòa chỉ vào một
thanh ghi bên ngoài trong nửa đầu chu kì bộ nhớ. Sau đó, các đường port 0
dùng để xuất nhập dữ liệu trong nửa sau của chu kì bộ nhớ.
Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và
có thể được dùng làm nguồn xung nhòp cho các phần khác của hệ thống. Nếu
xung nhòp trên 8952 là 12 Mhz thì ALE có tần số 2 Mhz. Chỉ ngoại trừ khi thi
hành lệnh MOVX, một xung ALE sẽ bò mất. Trong trường hợp là 8051 thì
chân này cũng được làm ngõ vào cho xung lập trình cho EPROM trong chip.
c/ EA\ (External Access):
Tín hiệu vào EA\ trên chân 31 thường được mắc lên mức cao (+5v) hoặc
mức thấp (GND). Nếu ở mức cao, 8952 thi hành chương trình từ ROM nội
trong khoảng đòa chỉ thấp (4K). Nếu ở mức thấp, chương trình chỉ được thi
hành từ bộ nhớ mở rộng.
Khi dùng 8031, EA\ luôn được nối mức thấp vì 8031 không có bộ nhớ
chương trình trên chip. Nếu EA\ được nối mức thấp thì bộ nhớ chương trình
bên trong 8952 sẽ bò cấm và chương trình chỉ được thi hành từ EPROM mở
rộng.
Người ta còn dùng EA\ làm chân cấp điện áp 21V khi lập trình cho
EEPROM trong 8051.
d/ RST (Reset):
Ngõ vào RST trên chân 9 là ngõ reset của 8952. Khi tín hiệu này được đưa
được chọn
qua PSEN\
00
được chọn
qua WR\
và RD\
0000
000
0
Bộ nhớ trên chip
Bộ nhớ
dữ liệu
Bộ nhớ mở rộng
Tóm tắt các vùng bộ nhớ của 8952.
Hai đặc tính cần lưu ý là:
Các thanh ghi và các port xuất nhập đã được xếp trong bộ nhớ và có thể
được truy xuất trực tiếp giống như các đòa chỉ bộ nhớ khác.
Ngăn xếp bên trong RAM nội nhỏ hơn so với RAM ngoài so với bộ xử lí
khác.
II.4.2 Chi tiết về bộ nhớ RAM trên chip:
Như sẽ thấy trong hình sau, RAM bên trong 8952 được phân chia thành các
D D D D D D D _ D PSW
0 7 6 5 4 3 2
0
30
2F 7
F
2 7
E 7
2 6
D F
2 6
C 7
2 5
B F
2 5
A 7
29 4
F
28 4
7
27 3
F
B _ _ _ B B B B B IP
8
C B A 9 8
7
E
7
6
5
3
D
7
C
7
4
6
C
6
4
5
C
5
4
4
C
4
4
3
C
7
B
7
3
6
B
6
7
9
7
1
6
9
6
1
5
9
5
1
4
9
4
1
3
9
7
8
7
0
6
8
6
0
5
8
F
24 2
7
23 1
F
22 1
7
21 0
F
20 0
7
1F
3
6
2
E
2
6
1
E
1
6
0
E
0
6
3 3 3 3
5 4 3 2
0
2
8
2
0
1
8
1
0
0
8
0
0
18
17
BANK 2
10
0F
BANK 1
08
07
BANK 0
( Mặc đònh cho R0 – R7
)
N
8 không được đòa chỉ hóa
3
bit
8 không được đòa chỉ hóa
2
bit
8 không được đòa chỉ hóa
1
bit
8 8 8 8 8 8 8 8 8
0 7 6 5 4 3 2 1 0
DPH
DPL
SP
P0
CÁC THANH GHI CHỨC NĂNG ĐẶC
Tóm tắt bộ nhớ dữ liệu trên chip
Mọi đòa chỉ trong vùng RAM đa dụng đều có thể được truy xuất tự do dùng
cách đánh đòa chỉ trực tiếp hoặc gián tiếp. Ví dụ, để đọc nội dung ở đòa chỉ
5FH của RAM nội vào thanh ghi tích lũy, lệnh sau sẽ được dùng:
MOV A, 5FH
Lệnh này di chuyển 1 byte dữ liệu dùng cách đánh đòa chỉ trực tiếp để xác
đònh “đòa chỉ nguồn” (5FH). Đích nhận dữ liệu được ngầm xác đònh trong mã
lệnh là thanh ghi tích lũy A.
RAM bên trong cũng có thể được truy xuất dùng cách đánh đòa chỉ gián tiếp
; đọc cả byte
ORL A, #10000000B
; set MSB
MOV 2CH, A
; ghi lại cả byte
Các bank thanh ghi:
32 bytes thấp nhất của bộ nhớ nội là dành cho các bank thanh ghi. Bộ lệnh
của 8952 hỗ trợ 8 thanh ghi (R0 – R7) và theo mặc đònh (sau khi reset hệ
thống) các thanh ghi này ở các đòa chỉ 00H – 07H. Lệnh sau đây sẽ đọc nội
dung ở đòa chỉ 05H vào thanh ghi tích lũy :
MOV A, R5
Đây là lệnh một byte dùng đòa chỉ thanh ghi. Tất nhiên, thao tác tương tự có
thể được thi hành bằng lệnh 2 bytes dùng đòa chỉ trực tiếp nằm trong byte thứ
hai:
MOV A, 05H
Các lệnh dùng các thanh ghi R0 đến R7 thì ngắn hơn và nhanh hơn các lệnh
tương ứng nhưng dùng đòa chỉ trực tiếp. Các giá trò dữ liệu được dùng thường
xuyên nên dùng một trong các thanh ghi này.
Bank thanh ghi tích cực có thể được chuyển đổi bằng cách thay đổi các
bit chọn bank thanh ghi trong từ trạng thái chương trình (PSW). Giả sử rằng
bank thanh ghi 3 được tích cực, lệnh sau sẽ ghi nội dung của thanh ghi tích
lũy vào đòa chỉ 18H:
MOV R0, A
Ý tưởng dùng “các bank thanh ghi” cho phép “chuyển hướng” chương trình
nhanh và hiệu quả (từng phần riêng rẽ của phần mềm sẽ có một bộ thanh ghi
riêng không phụ thuộc vào các phần khác).
PSW.4
Kí hiệu
CY
AC
F0
RS1
Đòa chỉ
D7H
D6H
D5H
D4H
Ý nghóa
Cờ nhớ
Cờ nhớ phụ
Cờ 0
Bit 1 chọn bank thanh ghi
•
PSW.3
RS0
D3H
PSW.2
kết quả trở vào cờ nhớ:
AND C, 25H
•
Cờ nhớ phụ:
Khi cộng các số BCD, cờ nhớ phụ (AC) được set nếu kết quả của 4 bit thấp
trong khoảng 0AH đến 0FH. Nếu các giá trò được cộng là số BCD thì sau
lệnh cộng cần có DA A (hiệu chỉnh thập phân thanh ghi tích lũy) để điều
chỉnh kết quả cho phù hợp.
•
Cờ 0:
Cờ 0 (F0) là 1 bit cờ đa dụng dành cho các ứng dụng của người dùng.
• Các bit chọn bank thanh ghi :
Các bit chọn bank thanh ghi (RS0 và RS1) xác đònh bank thanh ghi nào được
tích cực. Chúng được xóa sau khi reset hệ thống và được thay đổi bằng phần
mềm nếu cần. Ví dụ, 3 lệnh sau cho phép bank thanh ghi 3 và di chuyển nội
dung của thanh ghi R7 (đòa chỉ byte 1FH) đến thanh ghi tích lũy:
SETB RS1
SETB RS0
MOV A, R7
Khi chương trình được hợp dòch, các đòa chỉ bit đúng được thay thế cho các
kí hiệu “RS1” và “RS0”.
Vậy, lệnh SETB RS1 sẽ giống như lệnh SETB 0D4H.
• Cờ tràn:
Lệnh MUL AB sẽ nhân các giá trò không dấu 8 bit trong A và B rồi trả về
kết quả 16 bit trong A (byte thấp) và B (byte cao).
Lệnh DIV AB sẽ chia A cho B rồi trả về kết quả nguyên trong A và phần dư
trong B.
Thanh ghi B cũng có thể được xem như thanh ghi đệm đa dụng. Nó được đòa
chỉ hóa từng bit bằng các đòa chỉ bit F0H đến F7H.
c/ Con trỏ ngăn xếp:
Con trỏ ngăn xếp (SP) là một thanh ghi 8 bit ở đòa chỉ 81H. Nó chứa đòa chỉ
của byte dữ liệu hiện hành trên đỉnh của ngăn xếp. Các lệnh trên ngăn xếp
bao gồm các thao tác cất dữ liệu vào ngăn xếp và lấy dữ liệu ra khỏi ngăn
xếp. Lệnh cất dữ liệu vào ngăn xếp sẽ làm tăng SP trước khi cất dữ liệu, và
lệnh lấy dữ liệu ra khỏi ngăn xếp sẽ đọc dữ liệu và giảm SP.
Ngăn xếp của 8952 được giữ trong RAM nội và được giới hạn các đòa chỉ có
thể truy xuất bằng đòa chỉ gián tiếp. Chúng là 128 bytes đầu của 8952.
Để khởi động lại SP với ngăn xếp bắt đầu tại 60H, các lệnh sau đây được
dùng:
MOV SP, #5FH
Trên 8952 ngăn xếp bò giới hạn 32 bytes vì đòa chỉ cao nhất của RAM trên
chip là 7FH. Sở dó dùng giá trò 5FH vì SP sẽ tăng lên 60H trước khi cất byte dữ
liệu đầu tiên.
Người thiết kế có thể chọn không phải khởi động lại con trỏ ngăn xếp mà
để nó lấy giá trò mặc đònh khi reset hệ thống. Giá trò mặc đònh đó là 07H và
kết quả là ngăn đầu tiên để cất dữ liệu có đòa chỉ là 08H.
Nếu phần mềm ứng dụng không khởi động lại SP, thì bank thanh ghi 1 (có
thể cả 2 và 3) sẽ không dùng được vì vùng RAM này đã được dùng làm ngăn
xếp.
Ngăn xếp được truy xuất trực tiếp bằng lệnh PUSH và POP để lưu trữ tạm
thời và lấy lại dữ liệu, hoặc được truy xuất ngầm bằng các lệnh gọi chương
năng giao tiếp thuận lợi.
Ví dụ, nếu một motor được nối qua một cuộn dây có transistor lái đến bit 7
của Port 1, nó có thể được bật và tắt bằng một lệnh đơn:
SETB P1.7 ; bật motor
CLR
P1.7 ; tắt motor
Các lệnh trên dùng dấu chấm để xác đònh một bit trong một byte.
Trình hợp dòch sẽ thi hành sự chuyển đổi cần thiết, vì vậy hai lệnh
sau đây là như nhau:
CLR P1.7
CLR 97H
Trong một ví dụ khác, xem xét giao tiếp đến một thiết bò với một bit trạng
thái gọi là BUSY, được set khi thiết bò đang bận và được xóa khi thiết bò đã
sẵn sàng. Nếu BUSY được nối tới P1.5, vòng lặp sau sẽ được dùng để chờ
thiết bò trở lại trạng thái sẵn sàng:
WAIT :
JB P1.5, WAIT
Lệnh này có nghóa là “nếu bit P1.5 được set thì nhảy tới nhãn
WAIT”.
Nói cách khác “nhảy trở lại và kiểm tra lần nữa”.
f/ Các thanh ghi timer:
µC 8952 chứa ba bộ đònh thời/đếm 16 bits được dùng cho việc đònh thời
hoặc đếm sự kiện.
Timer 0 ở đòa chỉ 8AH (TL0: byte thấp) và 8CH (TH0 : byte cao).
Timer 1 ở đòa chỉ 8BH (TL1: byte thấp) và 8DH (TH1 : byte cao).
3
TR
2
C/
2
1
CP / RL2
T2
0
Chức năng
Cờ tràn Timer 2, set khi Timer 2 tràn và phải được clear
bằng phần mềm. TF2 sẽ không set khi RCLK = 1 hoặc
TCLK = 1.
Cờ ngoài của Timer 2, set khi xảy ra capture hoặc reload do
T2EX xuống thấp và EXEN2 = 1. Nếu ngắt Timer 2 được
kích hoạt, EXF2 = 1 sẽ làm CPU trỏ đến ISR của Timer 2.
EXF2 phải được xóa bằng phần mềm. EXF2 không gây nên
ngắt trong chế độ đếm lên/xuống (DCEN = 1).
Kích hoạt xung clock bộ thu. Khi set, các xung tràn Timer 2
sẽ là xung clock cho bộ thu port nối tiếp trong mode 1 và 3.
98H.
h/ Các thanh ghi ngắt:
µC 8952 có cấu trúc 5 nguồn ngắt (2 mức ưu tiên).
Các ngắt bò cấm sau khi reset hệ thống và sẽ được cho phép bằng việc ghi
thanh ghi cho phép ngắt (IE) ở đòa chỉ A8H.
Cả hai thanh ghi được đòa chỉ hóa từng bit.
i/ Thanh ghi điều khiển công suất:
Thanh ghi điều khiển công suất (PCON) ở đòa chỉ 87H chứa nhiều bit điều
khiển. Chúng được tóm tắt trong bảng sau:
Bi
t
7
Kí
hiệu
SMO
D
6
5
4
3
2
1
_
_
_
thông thường được dùng cho byte cao của bus đòa chỉ.
Trong nửa đầu của mỗi chu kì bộ nhớ, byte thấp của đòa chỉ được cấp trong
Port 0 và được chốt bằng xung ALE. Một IC chốt 74HC373 (hoặc tương
đương) sẽ giữ byte đòa chỉ thấp trong phần còn lại của chu kì bộ nhớ. Trong
nửa sau của chu kì bộ nhớ Port 0 được dùng như bus dữ liệu và được đọc hoặc
ghi tùy theo lệnh.
a/ Truy xuất bộ nhớ chương trình ngoài:
Bộ nhớ chương trình ngoài là một IC ROM được cho phép bởi tín hiệu
PSEN\. Hình sau mô tả cách nối một EPROM vào 8952:
8952
EPROM
PORT 0
D0 - D7
74HC373
EA
D
ALE
G
PORT 2
PSEN
ALE
G
A0 - A7
A8 -A15
PORT 2
RD
WR
PSEN
Q
NC
OE
WR
CS
Giao tiếp giữa 8952 và RAM.
Bộ nhớ dữ liệu ngoài là một bộ nhớ RAM được cho phép ghi/đọc bằng
các tín hiệu WR\ và RD\ (các chân P3.6 và P3.7 thay đổi chức năng).
Chỉ có một cách truy xuất bộ nhớ dữ liệu ngoài là với lệnh MOVX dùng
con trỏ dữ liệu (DPTR) 16 bits hoặc R0 và R1 xem như thanh ghi đòa chỉ.
Kết nối bus đòa chỉ và bus dữ liệu giữa RAM và 8952 cũng giống như
Một IC RAM có thể chứa cả chương trình và dữ liệu bằng cách nối
đường OE\ của RAM vào một mạch logic AND của PSEN\ và RD\.
Mạch trên hình sau cho phép một IC RAM được dùng làm bộ nhớ
chương trình và dữ liệu:
Vậy một chương trình có thể được tải vào RAM (bằng cách ghi nó như
bộ nhớ dữ liệu) và thi hành (bằng cách truy xuất nó như bộ nhớ chương
trình).
II.7 Lệnh Reset:
µC8952 được reset bằng cách giữ chân RST ở mức cao ít nhất trong hai
chu kì máy và trả nó về mức thấp.
Vcc
R 1
100
C
SW 1
1
2
10uf
RESET
R 2
8 .2 k
0
M A ÏC H R E S E T H E Ä T H O ÁN G