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-51TM về tập lệnh và các chân ra.. Port 0 cũng có t
Trang 1Chương 5: GIỚI THIỆU VI XỬ LÝ AT89C52
1 VI ĐIỀU KHIỂN HỌ MCS-51MCS-51 tm
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
CHƯƠNGù TRÌNH
ON CHIP
BỘ NHỚ DỮ LIỆU
ON CHIP
TIMER
2 VI ĐIỀU KHIỂN AT89C52
Trang 2Do họ MCS-51TM đã trở thành chuẩn công nghiệp nên có rất nhiều hãng sản 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-51TM về tập lệnh và các chân ra Flash on-chip 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
2.1 Cấu tạo chân
Trang 3Tùy theo khả năng (về kinh tế, kỹ thuật, …) mà các nhà sản xuất các sản phẩm ứng dụng có thể chọn một trong 3 kiểu chân do ATMEL đưa ra
2.2 Sơ đồ khối
Trang 42.3 Mô tả chức năng của các chân
Vcc : áp nguồn.
GND : đất.
Port 0 : là một port I/O 8-bit hai
chiều, cực máng hở Khi xuất ra, mỗi chân port có thể lái 8 đầu vào TTL
Trang 5Nếu ghi các mức 1 ra các chân port thì các chân này có thể dùng như các đầu vào trở kháng cao
Port 0 cũng có thể được cấu hình thành một bus multiplex giữa địa chỉ thấp và dữ liệu khi truy cập chương trình hay dữ liệu từ bên ngoài Trong chế độ này, port 0 có điện trở pullup nội
Port 0 cũng nhận các byte mã chương trình khi lập trình Flash và xuất ra mã chương trình khi kiểm tra, khi đó cần có điện trở pullup bên ngoài
Port 1 : là một port I/O 8-bit hai chiều có pullup nội Đầu ra port 1 có
thể lái 4 đầu vào TTL Khi viết 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
Port 2 : là một port I/O 8-bit hai chiều có pullup nội Đầu ra port 2 có
thể lái 4 đầu vào TTL Khi viết 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 2 bị kéo xuống thấp sẽ đổ dòng vì có nội trở kéo lên
Port 2 phát byte địa chỉ cao trong khi nhận lệnh từ bộ nhớ chương trình
ngoài và trong lúc truy xuất đến bộ nhớ dữ liệu ngoài mà có sử dụng địa chỉ
16 bit (MOVX A, @DPTR) Trong ứng dụng này nó dùng điện trở nội kéo lên mạnh khi xuất 1 Khi truy xuất bộ nhớ dữ liệu ngoài dùng địa chỉ 8 bit, port 2 sẽ phát nội dung của thanh ghi P2
Port 2 cũng nhận byte địa chỉ cao trong lúc lập trình Flash và trong lúc kiểm tra Flash
Port 3 : là một port I/O 8-bit hai chiều có pullup nội Đầu ra port 3 có
thể lái 4 đầu vào TTL Khi viết 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 3 bị kéo xuống thấp sẽ đổ dòng vì có nội trở kéo lên Port 3 cũng có những chức năng của họ MSC-51 được iệt kê ở bảng sau:
BIT
CHỨC NĂNG THAY THẾ
Trang 6P3.0 RXD B0H Nhận dừ liệu cho port nối tiếp
P3.1 TXD B1H Truyền dừ liệu cho port nối tiếp
P3.4 T0 B4H Ngõ vào từ bên ngoài cho
timer/counter 0 P3.5 T1 B5H Ngõ vào từ bên ngoài cho
timer/counter 1 P3.6 WR B6H Xung ghi bộ nhớ dữ liệu ngoài
P3.7 RD B7H Xung đọc bộ nhớ dữ liệu ngoài
Port 3 cũng nhận vài tín hiệu điều khiển trong lúc lập trình Flash và
trong lúc kiểm tra Flash
RST : là ngõ vào Reset Khi ngõ này được đưa lên cao (trong ít nhất hai
chu kì máy), các thanh ghi bên trong AT89C51 được tải những giá trị thích hợp để khởi động hệ thống
ALE/PROG (Address Latch Enable) : ALE là xung xuất cho phép chốt
byte địa chỉ thấp khi truy cập bộ nhớ ngoài Chân này còn là ngõ vào của xung lập trình (PROG) khi lập trình Flash
Trong hoạt động bình thường, ALE được phát xung với tần số 1/6 tần số dao động on-chip và có thể được dùng như xung thời gian chuẩn bên ngoài Tuy nhiên, cần chú ý là một xung ALE sẽ bị mất khi truy cập bộ nhớ ngoài
Có thể hủy bỏ chức năng của ALE bằng cách set bit 0 của thanh ghi ở vị trí 8EH Một khi bit này được set, ALE chỉ tích cực khi có lệnh MOVX hoặc MOVC Nếu không có các lệnh này thì ALE ở mức cao Việc set bit 0 của thanh ghi ở vị trí 8EH không làm ảnh hưởng đến vi điều khiển khi truy cập bộ nhớ ngoài
PSEN (Program Store Enable) : PSEN là xung strobe báo hiệu việc đọc bộ
nhớ chương trình ngoài, PSEN tích cực hai lần (mức thấp) mỗi chu kì máy, ngoại trừ hai xung PSEN bị mất khi truy xuất dữ liệu ngoài Khi thi hành chương trình trong RAM nội, PSEN sẽ ở mức thụ động (mức cao)
Trang 7EA/V PP (External Access) : EA là ngõ vào để cho phép truy xuất bộ nhớ
chương trình từ bên ngoài khi được nối với GND Khi EA được treo lên nguồn VCC, chương trình sẽ được thực thi trong ROM nội Chân này cũng nhận điện áp 12v (VPP) trong khi lập trình Flash
XTAL1 : Đầu vào của bộ khuếch đại dao động đảo và cũng là đầu vào đến
mạch tạo xung clock nội
XTAL2 : Đầu ra của bộ khuếch đại dao động đảo.
2.4 Các thanh ghi chức năng (SFR-Special Funtion Reisters)
AT89C52 có 26 thanh ghi chức năng được thiết kế như là một thành phần của RAM on-chip Do đó mỗi thanh ghi có một địa chỉ của nó, nằm trong vùng từ 80H đến FFH Tuy nhiên, vùng này cũng là vùng bộ nhớ nên việc truy cập các thanh ghi này thông qua các lệnh dùng định vị trực tiếp khác với việc truy cập vùng nhớ dùng định vị gián tiếp
Bảng vị trí các thanh ghi chức năng :
Trang 8Chú ý là không phải tất cả các địa chỉ đều có các thanh ghi, những địa chỉ không có thanh ghi này có thể không có trên chip Đọc những địa chỉ này sẽ có những giá trị ngẫu nhiên và ghi những giá triï này có những tác động không xác định trước
Phần mềm của người dùng không nên ghi những giá trị 1 đến các vị trí này, bởi
vì chúng có thể được dùng trong tương lai Trong trường hợp đó, giá trị của các bit luôn là 0
Ngoài những thanh ghi tương tự 8051, AT89C52 có thêm :
Các thanh ghi Timer 2 các bit điều khiển và trạng thái chứa trong thanh ghi
T2CON và T2MOD cho Timer 2 Cặp thanh ghi RCAP2H và RCAP2L là những thanh ghi Capture/Reload trong chế độ capture 16 bit hay chế độ auto-reload 16
bit
Trang 9hiệu
Chức năng
TF2 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
EXF2 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)
RCLK 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
RCLK = 0 thì bộ thu port nối tiếp sẽ dùng các xung tràn của
Timer 1
TCLK Kích hoạt xung clock bộ phát Khi set, các xung tràn Timer 2
sẽ là xung clock cho bộ phát port nối tiếp trong mode 1 và 3
TCLK = 0 thì bộ phát port nối tiếp sẽ dùng các xung tràn
của Timer 1
EXEN2 Kích hoạt bên ngoài Khi set, cho phép capture hay reload
khi T2EX xuống thấp (nếu Timer 2 không sử dụng cho port
nối tiếp) EXEN2 = 0 làm cho Timer 2 bỏ qua các sự kiện
trên T2EX
TR2 Khởi động/Dừng Timer 2 TR2 = 1 làm khởi động Timer 2
C/T2 Bit lựa chọn timer hay counter C/T2 = 0 : timer C/T2 = 1 :
counter đếm sự kiện bên ngoài (kích cạnh xuống)
CP/RL2 Lựa chọn capture hay reload CP/RL2 = 1: capture xảy ra khi
T2EX xuống thấp nếu EXEN2 = 1 CP/RL2 = 0 : reload xảy
ra khi Timer 2 tràn hoặc khi T2EX xuống thấp nếu EXEN2
= 1 Nếu TCLK hay RCLK = 1, bit này bị bỏ qua và timer bị
ép vào chế độ reload khi Timer 2 tràn
Các thanh ghi ngắt tập các bit riêng lẻ cho phép ngắt chứa trong thanh
ghi IE Thiết lập hai mức ưu tiên cho 6 nguồn ngắt bằng cách set các bit thanh ghi IP
2.5 Bộ nhớ dữ liệu
Trang 10AT89C52 có 256 byte bộ nhớ RAM on-chip Trong đó, 128 byte trên có cùng địa chỉ với vùng thanh ghi chức năng nhưng có cấu tạo vật lý riêng biệt
Khi một lệnh truy cập một vị trí nội có địa chỉ trên 7FH, chế độ địa chỉ nó sử dụng sẽ báo cho CPU biết vùng địa chỉ nào nó cần truy cập : RAM hay SFR Các lệnh dùng địa chỉ trực tiếp sẽ truy cập vùng SFR Ví dụ như lệnh sau đây sẽ truy cập SFR ở địa chỉ 0A0H (port 2)
Lệnh dùng địa chỉ gián tiếp sẽ truy cập 128 byte trên của RAM Ví dụ như cũng truy cập địa chỉ 0A0H nhưng gián tiếp thông qua R0
Chú ý rằng các tác vụ của stack vốn đã sử dụng địa chỉ gián
tiếp nên vùng 128 byte trên của RAM rất tiện dụng để làm
vùng stack
2.6 Đặc tính bộ dao động
XTAL1 là đầu vào và đầu ra tương ứng của bộ khuếch đại
đảo được dùng làm bộ dao động nội on-chip Có thể dùng
thạch anh hay bộ cộng hưởng ceramic đều được
Để lái vi điều khiển từ nguồn xung clock bên ngoài, XTAL2
phải được để trống trong khi XTAL1 nối đến nguồn lái
Không có yêu cầu gì về duty cycle nhưng phải chú ý đến thời
gian tối đa và tối thiểu của mức điện áp cao cũng như mức
điện áp thấp
2.7 Chế độ lười
Trong chế độ lười, CPU rơi vào trạng thái “ngủ” trong khi tất
cả thiết bị ngoại vi vẫn còn tích cực Chế độ này được tạo ra
bằng phần mềm Nội dung của RAM on-chip và giá trị của các SFR vẫn được giữ nguyên Kết thúc chế độ lười bằng cách kích hoạt một ngắt hoặc reset phần cứng
Chú rằng khi kết thúc chế độ lười bằng cách reset phần cứng thì thông thường
vi điều khiển sẽ gọi lại chương trình mà nó vừa thoát, cho đến hai chu kỳ máy trước khi thuật toán reset chiếm quyền điều khiển Phần cứng cấm truy cập RAM nội trong trường hợp này nhưng không cấm truy cập đến các chân port, do đó có thể xảy ra những trường hợp không mong muốn Để loại bỏ trường hợp
Trang 11này, lệnh ngay sau lệnh gọi chế độ lười không nên là lệnh ghi port hay ghi bộ nhớ ngoài
2.8 Chế độ hạ nguồn
Trong chế độ hạ nguồn, bộ dao động ngừng, và lệnh gọi hạ nguồn là lệnh cuối cùng được thực thi RAM on-chip và SFR duy trì giá trị của nó cho đến khi kết thúc chế độ hạ nguồn
Kết thúc chế độ hạ nguồn chỉ bằng một cách duy nhất : reset phần cứng Reset sẽ tạo lại giá trị cho SFR nhưng không thay đổi nội dung của RAM on-chip Không nên reset trước khi Vcc phục hồi mức điện áp thông thường của nó và phải giữ đủ lâu để bộ dao động phục hồi và ổn định
2.9 Trạng thái của một số chân trong chế độ lười và chế độ hạ nguồn
IX TẬP LỆNH CỦA 89C51:
AT89C51 có 255 lệnh chia thành các nhóm lệnh:
+ Nhóm lệnh chuyển dời
+ Nhóm lệnh số học
+ Nhóm lệnh logic
+ Nhóm lệnh chuyển điều khiển
Sau đây là tập lệnh cơ bản của vi xử lý AT89C51:
Các chỉ dẩn thiết lập lệnh
Rn : Thanh ghi R0 đến R7
Data : 8 bit địa chỉ vùng dữ liệu bên trong
@Ri : Định chỉ gián tiếp qua R0 hay R1
#data : Hằng số 8 bit
#data16 : Hằng số 16 bit
addr 16 : 16 bit địa chỉ đích
addr 11 : 11 bit địa chỉ đích
rel : Ofset 8 bit có dấu
Trang 12bit : Bit được định địa chỉ trực tiếp
a) Nhóm lệnh xử lý số học :
ADD A,Rn (1 byte,1chu kỳ máy): (A) = (A)+(Rn) ADD A,data (2;1) : (A) = (A) + (data)
ADD A,@Ri (1;1) : (A) = (A) + ((Ri))
ADD A,#data (2;1) : (A) = ( A) + #data
ADDC A,Rn (1;1) : (A) = ( A) + (C) +(Rn) ADDC A,data ( 2;1) : (A) = (A) + (C) + (data) ADDC A,@Ri (1;1) : (A) = (A) + ((Ri)) + (C) ADDC A,#data ( 2;1) : (A) = (A) + (C) + #data SUBB A,Rn (1;1) : (A) = (A) - (C)- (Rn) SUBB A,data (2;1) : (A) = (A) - (C) -( data) SUBB A,@Ri (1;1) : (A) =(A) -(C) -((Ri))
SUBB A,#data (2;1) : (A) = (A) - (C) - #data
INC A (1;1) : (A) = (A) +1
INC Rn (1;1) : (Rn) = (Rn) +1
INC data (2;1) : (data) = (data) +1
INC @Ri (1;1) : ((Ri)) =((Ri))+1
DEC A (1;1) : (A) =(A) – 1
DEC Rn (1;1) : (Rn) =(Rn) -1
DEC data (2;1) : (data) =(data) –1
DEC @Ri (1;1) : ((Ri)) =((Ri)) –1
INC DPTR (1;2) : (DPTR) =(DPTR) +1
MUL AB (1;4) : (A) = byte cao của (A) * (B)
(B) = byte thấp của (A)* (B) DIV AB (1;4) : chia (A) cho (B) ,kết quả:
( A) = thương số (B) = số dư
DA A (1;1) : hiệu chỉnh thập phân thanh ghi A
b) Nhóm lệnh luận lý:
ANL A,Rn (1;1) : (A) =(A) and (Rn)
ANL A,data (2;1) : (A) =(A) and (data)
ANL A,@Ri (1;1) : (A) = (A) and ((Ri))
ANL A,#data (2;1) : (A) = (A) and #data
ANL data,A (2;1) : (data) = (data) and (A)
Trang 13ANL data,#data (3;2) : (data) =(data) and #data
ANL C,bit (2;2) : (C) =(C) and (bit)
ANL C, bit (2;2) : (C) =(C) and not (bit)
ORL A,Rn (1;1) : (A) = (A) or (Rn)
ORL A,data (2;1) : (A) = (A) or data
ORL A,@Ri (1;1) : (A) = (A) or ((Ri))
ORL A,#data (2;1) : (A) = (A) or #data
ORL data,A (2;1) : (data) = (data) or (A)
ORL data,#data (3;2) : (data ) = (data) or # data
ORL C,bit (2;2) : (C) = (C) or bit
ORL C,/bit (2;2) : (C) = (C) or not bit
XRL A,Rn (1;1) : (A) =(A) xor (Rn)
XRL A,data (2;1) : (A) = (A) xor (data)
XRL A,@Ri (1;1) : (A) = (A) xor ((Ri))
XRL A,#data (2;1) : (A) = (A) xor #data
XRL data,A (2;1) : (data) = (data) xor (A)
XRL data,#data (3;2) : (data) = (data) xor #data
CPL bit (2;1) : (bit) = not (bit)
RL A (1;1) : quay trái nội dung thanh ghi A
RLC A (1;1) : quay trái nội dung thanh ghi A
RR A (1;1) : quay phải nội dung thanh ghi A
RRC A (1;1) : quay phải nội dung thanh ghi A qua cờ nhớ
SWAP A (1;1) : quay trái nội dung thanh ghi A một nibble
c) Nhóm lệnh chuyển dữ liệu :
Trang 14MOV A,@Ri (1;1) : (A) = ((Ri))
MOV A,#data (2;1) : (A) = #data
MOV Rn,data (2;2) : (Rn) = (data)
MOV Rn,#data (2;1) : (Rn) = #data
MOV data,Rn (2;2) : (data) = (Rn)
MOV data,data (3;2) : (data) = (data)
MOV data,@Ri (2;2) : (data) = ((Ri))
MOV data,#data (3;2) : (data) = #data
MOV @Ri,data (2;2) : ((Ri)) = (data)
MOV @Ri,#data (2;1) : ((Ri)) = #data
MOV DPTR,#data16 (3;2) : (DPTR) = #data16
MOV C,bit (2;1) : (C) = (bit)
MOV bit,C (2;2) : (bit) = (C)
MOVC A,@A+DPTR (1;2) : (A) = ((A)+(DPTR))
MOVC A,@A+PC (1;2) : (A) = ((A)+(PC))
MOVX A,@Ri (1;2) : chuyển dữ liệu ngoài 8 bít vào thanh ghi A
MOVX A,@DPTR (1;2) : chuyển dữ kiệu ngoài 16 bit vào thanh ghi A
MOVX @Ri,A (1;2) : chuyển nội dung thanh ghi A ra dữ liệu ngoài 8 bit địa chỉ
MOVX @DPTR,A (1;2) : chuyển nội dung thanh ghi A ra dữ liệu ngoài 16 bit địa chỉ
PUSH data (2;2) : (SP) =(SP) +1
((SP)) = (data) POP data (2;2) : (data) = ((SP))
(SP) = (SP) -1 XCH A,Rn (1;1) : trao đổi dữ liệu giữa thanh ghi Rn
và thanh ghi A
XCH A,data (2;1) : trao đổi giửa thanh ghi A và data XCH A,@Ri (1;1) : trao đổi giữa thanh ghi A và một dữ liệu gián tiếp