BÀI SỐ 1: CHƯƠNG TRÌNH ĐIỀU KHIỂN 8 LED CHÓP TẮT SÁNG TẮT ĐIỀU KHIỂN LED SÁNG THÌ DỮ LIỆU GỞI RA LED LÀ 1, MỨC 0 LED TẮT LƯU ĐỒ BEGIN 8 LED SÁNG DELAY 8 LED TẮT DELAY END VIẾT CHƯƠN
Trang 1GIAO TIẾP VI ĐIỀU KHIỂN VỚI LED ĐƠN
SƠ ĐỒ MẠCH ĐIỆN THEO KIỂU SINK DÒNG: DÒNG CHẠY TỪ VCC QUA LED VÀ ĐIỆN TRỞ HẠN DÒNG VÀO VI ĐIỀU KHIỂN
MỨC LOGIC 0 THÌ LED SÁNG, MỨC LOGIC 1 THÌ LED TẮT
Trang 2BÀI SỐ 1: CHƯƠNG TRÌNH ĐIỀU KHIỂN 8 LED CHÓP TẮT (SÁNG TẮT)
ĐIỀU KHIỂN LED SÁNG THÌ DỮ LIỆU GỞI RA LED LÀ 1, MỨC 0 LED TẮT
LƯU ĐỒ
BEGIN
8 LED SÁNG DELAY
8 LED TẮT DELAY
END
VIẾT CHƯƠNG TRÌNH
Trang 3(H1);CHUONG TRINH DIEU KHIEN 8 LED CUA PORT 0 SANG TAT
(H8) $INCLUDE(TV_DELAY.ASM)
GIẢI THÍCH CHƯƠNG TRÌNH
(H1);CHUONG TRINH DIEU KHIEN 8 LED CUA PORT 0 SANG TAT
LÀ HÀNG CHÚ THÍCH CHƯƠNG TRÌNH ĐIỀU KHIỂN CÁI GÌ
KHÔNG CÓ CŨNG ĐƯỢC NHƯNG NẾU CÓ THÌ PHẢI BẮT ĐẦU BẰNG DẤU ;
KHAI BÁO ĐỊA CHỈ BẮT ĐẦU CỦA CHƯƠNG TRÌNH
LUÔN BẮT ĐẦU TẠI ĐỊA CHỈ 0000H, CÓ THỂ GHI 0H
GỒM CÓ NHÃN ĐỂ NHẢY VÀ LỆNH
CÓ CHỨC NĂNG NẠP DỮ LIỆU 00000000B VÀO PORT0
LÀM TẮT 8 LED, THỜI GIAN THỰC HIỆN LÀ 2µS
LÀ LỆNH GỌI CHƯƠNG TRÌNH CON DELAY ĐỂ LÀM CHẬM LẠI CHO CHÚNG TA NHÌN THẤY
CÓ CHỨC NĂNG NẠP DỮ LIỆU 11111111B VÀO PORT0 LÀM SÁNG 8 LED
GỌI DELAY ĐỂ LÀM CHẬM
LỆNH NHẢY (JUMP) VỀ ĐỂ THỰC HIỆN LẠI
(H8) $INCLUDE(TV_DELAY.ASM)
KHAI BÁO CHƯƠNG TRÌNH CHỨA CÁC CHƯƠNG TRÌNH CON DELAY
TRONG CHƯƠNG TRÌNH “TV_DELAY.ASM” NGƯỜI TA ĐÃ VIẾT SẴN
Trang 4CÁC CHƯƠNG TRÌNH CON DELAY, CHỈ DÙNG NHỮNG CHƯƠNG TRÌNH ĐÃ VIẾT
KẾT THÚC CHƯƠNG TRÌNH
NHỮNG GÌ SAU LỆNH END SẼ KHÔNG CÒN HIỆU LỰC
TÌM HIỂU FILE “*.LST”
Trang 5MCS-51 MACRO ASSEMBLER TAMPRO4 10/31/:9 PAGE 1
DOS 5.0 (038-N) MCS-51 MACRO ASSEMBLER, V2.2
OBJECT MODULE PLACED IN E:\TAM\TAMPRO4.OBJ
ASSEMBLER INVOKED BY: E:\ATS.EXE E:\TAM\TAMPRO4.ASM
LOC OBJ LINE SOURCE
0000 2 ORG 0000H
3
0000 758000 4 LB: MOV P0,#00000000B ;LAM 8 LED TAT
0003 120049 5 CALL DELAY100MS
0006 758001 6 MOV P0,#00000001B ;LAM 8 LED SANG
0009 120049 7 CALL DELAY100MS
000C 80F2 8 JMP LB
9
GIẢI THÍCH
0000 758000 4 LB: MOV P0,#00000000B ;LAM 8 LED TAT
BYTE THỨ NHẤT “75” LÀ MÃ LỆNH
BYTE THỨ HAI “80” LÀ ĐỊA CHỈ CỦA PORT 0
87
80H 86 85 84 83 82 81 80 P0
BYTE THỨ BA “00” LÀ DỮ LIỆU “#DATA”
TƯƠNG TỰ CHO CÁC LỆNH CÒN LẠI
1 Lệnh chuyển dữ liệu vào ô nhớ trực tiếp :
Cú pháp : MOV direct, #data
Mã lệnh :
0 1 1 1 0 1 0 1 a7 a6 a5 a4 a3 a2 a1 a0 d7 d6 d5 d4 d3 d2 d1 d0
Lệnh này chiếm 3 byte và thời gian thực hiện lệnh là 2 chu kỳ máy
Chức năng: Nạp dữ liệu data 8 bit (d0 đến d7 ) vào ô nhớ có địa chỉ direct
Trang 6TÌM HIEÅU FILE “*.HEX”
Trang 7CHỈ CHỨA CÁC MÃ LỆNH DẠNG NHỊ PHÂN:
:1000100030D57FFD22757E0A757F30D57FFDD57E78
:10002000F722757E64757F30D57FFDD57EF722750A
:100030007EC8757F30D57FFDD57EF722757EC87569
:100040007FFAD57FFDD57EF722113C113C22114964
:10005000114922114E114E22757D14113CD57DFBA4
:0A00600022757D28113CD57DFB229E
:00000001FF
Trang 8CÁC LỆNH ĐÃ SỬ DỤNG
2 Lệnh gọi chương trình con dùng địa chỉ tuyệt đối :
Cú pháp : ACALL addr11
Mã lệnh :
a10 a9 a8 1 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0
Lệnh này chiếm 2 byte và thời gian thực hiện lệnh là 2 chu kỳ máy
Chức năng: Khi lệnh này được thực hiện thì vi điều khiển sẽ thực hiện chương trình con tại địa chỉ addr11 Chương trình con không được cách lệnh gọi quá 2 kbyte Addr11 của chương trình con có thể thay bằng nhản (tên của chương trình con)
Chú ý: Trước khi nạp địa chỉ mới vào thanh ghi PC thì địa chỉ của lệnh kế trong chương trình chính được cất vào bộ nhớ ngăn xếp
3 Lệnh gọi chương trình con dùng địa chỉ dài 16 bit :
Cú pháp : LCALL addr16
Mã lệnh :
0 0 0 1 0 0 1 0 A15 a14 a13 a12 a11 a10 a9 a8 A7 a6 a5 a4 a3 a2 a1 a0
Lệnh này chiếm 3 byte và thời gian thực hiện lệnh là 2 chu kỳ máy
Chức năng: Khi lệnh này được thực hiện thì vi điều khiển sẽ thực hiện chương trình con tại địa chỉ addr16 Lệnh này có thể gọi chương trình con ở đâu cũng được trong vùng 64kbyte Addr16 của chương trình con có thể thay bằng nhản (tên của chương trình con)
16 bit địa chỉ A15 – A0 được nạp vào PC, vi điều khiển sẽ thực hiện chương trình con tại địa chỉ vừa nạp vào PC Chú ý: Trước khi nạp địa chỉ vào thanh ghi PC thì địa chỉ của lệnh kế trong chương trình chính được cất vào bộ nhớ ngăn xếp
4 Lệnh nhảy dùng địa chỉ tuyệt đối :
Cú pháp : AJMP addr11
Mã lệnh :
a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 A3 a2 a1 a0
Lệnh này chiếm 2 byte và thời gian thực hiện lệnh là 2 chu kỳ máy
Yù nghĩa của lệnh: vi điều khiển sẽ nhảy đến đến địa chỉ addr11 để thực hiện chương trình tại đó Addr11 có thể thay thế bằng nhản Nhản hay địa chỉ nhảy đến không quá 2 kbyte
11 bit địa chỉ A10 – A0 được nạp vào PC, các bit cao của PC không thay đổi, vi điều khiển sẽ nhảy đến thực hiện lệnh tại địa chỉ PC mới vừa nạp
Lệnh này khác với lệnh gọi chương trình con là không cất địa chỉ trở về Nơi nhảy đến không quá 2 kbyte so với lệnh nhảy
5 Lệnh nhảy dùng địa chỉ 16 bit :
Trang 9 Mã lệnh :
0 0 0 0 0 0 1 0 a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
Lệnh này chiếm 3 byte và thời gian thực hiện lệnh là 2 chu kỳ máy
Chức năng: vi điều khiển sẽ nhảy đến địa chỉ addr16 để thực hiện chương trình tại đó Nơi nhảy đến tùy ý nằm trong vùng 64 kbyte
6 Lệnh nhảy tương đối :
Cú pháp : SJMP rel
Mã lệnh :
1 0 0 0 0 0 0 0 r7 r6 r5 r4 r3 r2 r1 r0
Lệnh này chiếm 2 byte và thời gian thực hiện lệnh là 2 chu kỳ máy
Chức năng: vi điều khiển sẽ nhảy đến lệnh có địa chỉ tương đối (rel) để thực hiện tiếp Có thể thay thế rel bằng nhản
Lệnh này chỉ nhảy trong tầm vực 256 byte: có thể nhảy tới 128 byte và có thể nhảy lùi 128 byte Khi tầm vực nhảy xa hơn ta nên dùng lệnh AJMP hay LJMP
Chú ý: rel [relative: tương đối]: các lệnh có xuất hiện “rel” đều liên quan đến lệnh nhảy: nơi nhảy đến được tính bằng cách lấy nội dung của PC cộng với số lượng byte của các lệnh nằm giữa lệnh nhảy và nơi nhảy đến Chúng ta không cần quan tâm đến điều này vì chương trình biên dịch của máy tính sẽ tính giúp chúng ta
BÀI SỐ 2: CHƯƠNG TRÌNH ĐIỀU KHIỂN 16 LED CHÓP TẮT (SÁNG TẮT) P0 VÀ P1
LƯU ĐỒ ĐIỀU KHIỂN
BEGIN
16 LED SÁNG DELAY
16 LED TẮT DELAY
END
VIẾT CHƯƠNG TRÌNH
;CHUONG TRINH DIEU KHIEN 16 LED SANG TAT - P0 VA P1
ORG 0000H
Trang 10MOV P1,#00000000B
$INCLUDE(TV_DELAY.ASM)
END
BÀI SỐ 3: CTDK 32 LED CHÓP TẮT (SÁNG TẮT) P0, P1, P2, P3
LƯU ĐỒ ĐIỀU KHIỂN
BEGIN
32 LED SÁNG DELAY
32 LED TẮT DELAY
END
VIẾT CHƯƠNG TRÌNH
;CHUONG TRINH DIEU KHIEN 32 LED SANG TAT - P0,P1,P2,P3
ORG 0000H
JMP NHAN1
$INCLUDE(TV_DELAY.ASM)
Trang 11END
BÀI SỐ 4: CTDK SÁNG TẮT DẦN CÁC PORT 0,1,2,3
LƯU ĐỒ ĐIỀU KHIỂN
BEGIN SÁNG P0 DELAY
END
SÁNG P1 DELAY
SÁNG P2 DELAY SÁNG P3 DELAY TẮT P0 DELAY TẮT P1 DELAY TẮT P2 DELAY TẮT P3 DELAY
VIẾT CHƯƠNG TRÌNH
;CHUONG TRINH DIEU KHIEN 32 LED SANG TAT - P0,P1,P2,P3
ORG 0000H
Trang 12MOV P1,#11111111B
$INCLUDE(TV_DELAY.ASM)
END
BÀI SỐ 5: CTDK SÁNG TẮT 1 LED CỦA PORT0
LƯU ĐỒ ĐIỀU KHIỂN
VIẾT CHƯƠNG TRÌNH
;CHUONG TRINH DIEU KHIEN 1 LED CUA PORT 0 SANG TAT
ORG 0000H
JMP NHAN1
$INCLUDE(TV_DELAY.ASM)
END
CÁCH 2
;CHUONG TRINH DIEU KHIEN 1 LED CUA PORT 0 SANG TAT
$INCLUDE(TV_DELAY.ASM)
Trang 13BÀI SỐ 6: CTDK 8 LED CỦA PORT0 SÁNG TẮT DẦN
LƯU ĐỒ ĐIỀU KHIỂN
BEGIN TẮT 8 LED, DELAY
END
LED 0 SÁNG, DELAY LED 1 SÁNG, DELAY
LED 2 SÁNG, DELAY
LED 7 SÁNG, DELAY LED 0 TẮT, DELAY LED 1 TẮT, DELAY LED 7 TẮT, DELAY VIẾT CHƯƠNG TRÌNH DỮ LIỆU ĐIỀU KHIỂN CO CI SÁNG TẮT
0 0 0 0 0 0 0 0 0 8
0 ←0 0 0 0 0 0 0 1 ←1
0 ←0 0 0 0 0 0 1 1 ←1
1 ←0 0 0 0 0 1 1 1 ←0
1 ←0 0 0 0 1 0 0 0 ←0
1 ←0 0 0 0 0 0 0 0 ←0
1 ←0 0 0 0 0 0 0 0 ←0
1 ←0 0 0 0 0 0 0 0 ←0
0 ←0 0 0 0 0 0 0 0 ←0
0 0 0 0 0 0 0 1
Trang 140 0 0 0 0 0 1 1
0 0 0 0 0 1 1 1
0 0 0 0 1 1 1 1
0 0 0 1 1 1 1 1
0 0 1 1 1 1 1 1
0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 0 A7 A6 A5 A4 A3 A2 A1 A0 0 0 0 0 0 0 1 C TRƯỚC KHI THỰC HIỆN 0 1 A7 A6 A5 A4 A3 A2 A1 A0 0 0 0 0 0 0 0 C SAU KHI THỰC HIỆN TẮT HẾT – HẾT SỐ 0
SÁNG HẾT – HẾT SỐ 1
LỆNG XOAY THANH GHI A SANG TRÁI “RLC A”
LỆNH LÀM CỜ C BẰNG 1 LÀ “SETB C”
7 Lệnh xoay trái nội dung thanh ghi A :
Cú pháp : RL A (rotate left)
Mã lệnh :
0 0 1 0 0 0 1 1
Lệnh này chiếm 1 byte và thời gian thực hiện lệnh là 1 chu kỳ máy
Chức năng: Nội dung thanh ghi A được xoay trái 1 bit minh họa như hình vẽ
Ví dụ :
Mov A,#1011 0011b ;
Trang 15Gía trị ban đầu của C ta không cần quan tâm đến kết quả sau khi xoay thì (A) = 0110 0111b và cờ (C) = 1 là
do bit A7 bằng 1 chuyển sang
RL A ;lệnh thứ 2 Kết quả sau khi xoay thì (A) = 11001110b và cờ (C) = 0 là do bit A7 bằng 0 chuyển sang
8 Lệnh xoay trái nội dung thanh ghi A và bit carry :
Cú pháp : RLC A
Mã lệnh :
0 0 1 1 0 0 1 1
Lệnh này chiếm 1 byte và thời gian thực hiện lệnh là 1 chu kỳ máy
Chức năng: Nội dung thanh ghi A và bit C được xoay trái 1 bit
Ví dụ 1: Giả sử cho cờ C = 0 trước khi thực hiện lệnh
Mov A ,#10110011b RLC A ;kết quả (A) = 01100110b và cờ (C) = 1
Ví dụ 2:
Setb c ;làm cờ C bằng 1 Mov A,#00000000b
RLC A ;kết quả (A) = 0000 0001b và cờ (C) = 0 Setb c ;làm cờ C bằng 1
RLC A ;kết quả (A) = 0000 0011b và cờ (C) = 0
…
Setb c ;làm cờ C bằng 1 RLC A ;kết quả (A) = 0111 1111b và cờ (C) = 0 Setb c ;làm cờ C bằng 1 (lần thứ 8) RLC A ;kết quả (A) = 1111 1111b và cờ (C) = 0
Setb c ;làm cờ C bằng 1 (lần thứ 9) RLC A ;kết quả (A) = 1111 1111b và cờ (C) = 1
;xxxx
clr c ;làm cờ C bằng 0 RLC A ;kết quả (A) = 1111 1110b và cờ (C) = 1
9 Lệnh xoay phải nội dung thanh ghi A :
Cú pháp : RR A (rotate right)
Mã lệnh :
Trang 160 0 0 0 0 0 1 1
Lệnh này chiếm 1 byte và thời gian thực hiện lệnh là 1 chu kỳ máy
Chức năng: Nội dung thanh ghi A được xoay phải 1 bit ngược với lệnh RL A
10 Lệnh xoay phải nội dung thanh ghi A và bit carry :
Cú pháp : RRC A
Mã lệnh :
1 1 1 0 0 1 0 0
Lệnh này chiếm 1 byte và thời gian thực hiện lệnh là 1 chu kỳ máy
Chức năng: Nội dung thanh ghi A và bit C được xoay phải 1 bit ngược với lệnh RLC A
;CHUONG TRINH DIEU KHIEN 8 LED CUA PORT 0 SANG TAT
ORG 0000H
;SANG HET 8 LED
Trang 17MOV P0,#00000011B ;TAT LED 0,1
$INCLUDE(TV_DELAY.ASM)
END
CÁCH 2
LƯU ĐỒ
BEGIN TẮT 8 LED
END
DELAY DỊCH ‘0’ VÀO
HẾT ‘1’
S
Đ
DỊCH ‘1’ VÀO DELAY
HẾT ‘0’
CHƯƠNG TRÌNH
Trang 18ORG 0000H
;SANG HET - TAT DAN
$INCLUDE(TV_DELAY.ASM)
END
GIẢI THÍCH CHƯƠNG TRÌNH
(H1) ;CHUONG TRINH DIEU KHIEN 8 LED CUA PORT 0 SANG TAT
KHÔNG CÓ CŨNG ĐƯỢC NHƯNG NẾU CÓ THÌ PHẢI BẮT ĐẦU BẰNG DẤU ;