ADC 0809 là thiết bị biến đổi tương tự số dùng kỹ thuật CMOS. Tổng cộng 
người sử dụng có 8 kênh làm việc hoàn toàn độc lập với nhau để lựa chọn. Ở đây còn 
chú ý là các điện áp được đo so với điện thế 0V. Còn một đặc điểm đáng quan tâm hơn 
là sự tiêu thụ dòng điện của vi mạch hầu như không đáng kể (chỉ cỡ 300uA). Thời gian 
biến đổi khoảng 100 us. Các thông số kỹ thuật của bộ biến đổi ADC 0809 được kể ra 
như sau:
 Không cần đòi hỏi điều chỉnh điểm 0.
 Quét động 8 kênh bằng các logic địa chỉ.
 Giải tín hiệu lối vào Analog khi điện áp nguồn là +5V.
 Tất cả các tín hiệu tương thích TTL.
 Độ phân giải 8 bit.
 Thời gian biến đổi 100us.
                
              
                                            
                                
            
 
            
                 76 trang
76 trang | 
Chia sẻ: lylyngoc | Lượt xem: 3538 | Lượt tải: 4 
              
            Bạn đang xem trước 20 trang tài liệu Luận văn Ứng dụng kit 8051 dùng để chuyển đổi A/D & D/A, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
i trạng thái chương trình có địa chỉ 0Dh, chứa các bit trạng thái 
chương trình. 
Các bit trạng thái được mô tả như sau: 
* Cờ Carry: 
 Cờ carry có hai chức năng: 
 + Được dùng trong các phép toán số học thông thường. Nó là cờ nhớ của 
phép tính cộng và cờ mượn của phép tính trừ. Ví dụ các thanh ghi ACC có nội dugn 
FFH thì lệnh “ADD A, #1” làm cho ACC bằng 00H và cờ nhớ được set. 
 + Cờ carry còn được dùng như “thanh ghi tích luỹ 1 bit” cho các phép 
toán luận lý trên bit. Ví dụ lệnh sau AND bit 25H với cờ carry và đặc kết quả vào cờ 
carry: “ANL C,25H ;”. 
* Cờ nhớ phụ (auxiliary carry – AC) : 
 Khi cộng các giá trị BCD, cờ AC được set nếu bit thứ ba tràn hay 4 bit 
thấp có giá trị từ 0AH đến 0FH. Khi cộng số BCD, sau phép cộng phải dùng lệnh DA 
A (decimal adjust accumulator) để chỉnh kết quả cộng về dạng BCD. 
* Cờ 0: 
 Cờ này dành cho người sử dụng trong các ứng dụng lập trình. 
* Bit chọn ngăn thanh ghi: 
 Hai bit RS0 và RS1 dùng để cho ngăn thanh ghi, chúng được xóa khi 
reset hệ thống và có thể thay đổi bằng phần mềm. Ví dụ các lệnh sau sẽ chọn nhăn 
thanh ghi thứ ba và ghi nội dung R7 (địa chỉ 1FH) vào ACC. 
 SETB RS0 ; 
 SETB RS1 ; 
 MOV A, R7 ; 
* Cờ tràn (Overflow – OV): 
 Cờ tràn được set kết quả bị tràn (số học) sau phép tính cộng hoặc trừ. 
Đối với phép toán cộng và trừ số có dấu, phần mềm có thể xét bit này để kiểm tra kết 
quả có vượt quá giới hạn hay không. Khi cộng số không dấu ta không quan tâm đến bit 
này. Như vậy kết quả của phép tính cộng hay trừ lớn hơn 127 hoặc nhỏ hơn –128 sẽ 
set cờ tràn. Ví dụ OV sẽ set sau phép tính cộng sau: 
 Hex: 0F Decimal : 15 
 +7F +127 
 8E 142 
 8E tương đương với –116. Rõ ràng kết quả 142 không chính xác. Vì vậy 
bit OV được set. 
B
it 
K
ý hiệu 
Đ
ịa chỉ 
Chức năng 
P
SW .7 
P
SW .6 
P
SW .5 
P
SW .4 
P
C
Y 
A
C 
F
0 
R
S1 
R
D
7h 
D
6h 
D
5h 
D
4h 
D
Cờ nhớ 
Cờ nhớ phụ 
Cờ Zero 
Chọn thanh ghi dự trữ 1 
Chọn thanh ghi dự trữ 2 
00=bank0, địa chỉ 00h-07h 
01=bank1, địa chỉ 08h-0Fh 
10=bank2, địa chỉ 10h-17h 
11=bank3, địa chỉ 18h-1Fh 
SW .3 
P
SW .2 
P
SW .1 
P
SW .0 
S0 
O
V 
P 
3h 
D
2h 
D
1h 
D
0h 
Cờ tràn 
Dự trữ 
Cờ chẵn lẽ 
Bảng 4.3 Thanh ghi PSW 
* Bit parity: 
 Bit Parity được tự động set hoặc xóa trong mỗi chu kỳ máy để tạo nên 
parity chẵn đối với thanh ghi tích luỹ. Số bit 1 trong thanh ghi ACC cộng với P luôn 
luôn là một chẵn. Ví dụ nếu ACC chứa 10101101B, P sẽ là 1. Bit Parity thường được 
liên kết với chương trình truyền nối tiếp có sử dụng parity. 
 Thanh ghi B 
Thanh ghi B có địa chỉ F0h, chủ yếu dùng với thanh ghi ACC trong các phép 
toán nhân và chia. Lệnh MUL AB nhân các số 8 bit không dấu trong thanh ghi A và B. 
Kết quả là một số 16 bit chứa trong thanh ghi ACC (byte thấp) và B (byte cao). Lệnh 
DIV B chia thanh ghi ACC cho B. Kết quả thương số được lưu trong thanh ghi ACC 
số dư được lưu trong thanh ghi B. Thanh ghi B cũng được dùng như những thanh ghi 
khác và có thể truy xuất bit (địa chỉ F0h đến F7h) 
 Con trỏ ngăn chồng (stack pointer – SP) 
Stack – pointer là một thanh ghi 8 bit có địa chỉ 81H. Nó chứa địa chỉ hiện thời 
của đỉnh stack. Khi đẩy dữ liệu vào stack, SP tăng lên một giá trị, tiếp theo dữ liệu 
được ghi vào stack. Khi lấy dữ liệu ra khỏi stack, dữ liệu được đọc ra trước sau đó SP 
được giảm. Stack của 8051 nằm trong vùng RAM nội và có thể truy xuất bằng địa chỉ 
trực tiếp. 128 bytes đầu tiên đối với 8051/8031 và 256 bytes đối với 8052/8032 trong 
vùng RAM nội có thể dùng làm stack. Để tạo ra stack bắt đầu tại 60H, ta khởi động 
thanh ghi SP: 
 MOV SP, #5FH ; 
Như vậy stack được giới hạn trong 32 bytes. Ta dùng giá trị 5FH vì SP sẽ tăng 
lên 60H trước khi đẩy dữ liệu đầu tiên vào stack. 
 Khi lập trình ta không cần phải khởi động lại thanh ghi SP vì nó đã được khởi 
động với giá trị khi reset. Thanh ghi SP chứa giá trị mặc định là 07H. Do đó stack mặc 
định bắt đầu tại 08H. Nếu trình không khởi động lại stack thì các thanh ghi 1, 2, 3 
không thể sử dụng vì nó được dùng làm stack. 
 Stack được truy xuất một cách rõ ràng bằng các lệnh PUSH, POP để lưu trữ tạm 
thời hay truy xuất dữ liệu. Nó cũng có thể được truy xuất ngầm khi có các lệnh gọi đến 
chương trình con. Các lệnh ACALL, LCALL hay ngắt sẽ đẩy thanh ghi đếm chương 
trình (PC) vào stack. Lệnh RET, RETI trả giá trị trong stack lại cho PC. 
 Con trỏ dữ liệu (DPTR) 
Con trỏ dữ liệu dùng để truy xuất mã hay dữ liệu từ bộ nhớ ngoài và thanh ghi 
16 bit. Thanh ghi này gồm hai thanh ghi DPL (byte thấp, địa chỉ 82H) và DPH (byte 
cao, địa chỉ 83H). Ba lệnh sau đây sẽ ghi giá trị 55H vào RAM ngoài tại địa chỉ 
1000H. 
MOV A, #55H; 
MOV DPTR, #1000H; 
MOV @DPTR, A; 
 Các thanh ghi Port: 
Các port của 8051 gồm có port 0 địa chỉ 80H, port 1 địa chỉ 90H, port 2 địa chỉ 
A0H, port 3 địa chỉ B0H. Các port 0, 2 và 3 không được dùng để xuất nhập nếu đang 
sử dụng bộ nhớ ngoài. Còn lại port 1 có thể dùng để xuất nhập (I/O). 
Tất cả các port đều có thể dùng truy xuất bit. Điều này cung cấp cho vi điều 
khiển khả năng giao tiếp rất mạnh. Ta có thể dùng chân P1.7 để đóng mở động cơ. 
Chân P1.7 nối với transitor để lái một relay đóng mở động cơ. Lệnh SETB P1.7 mở 
động cơ. Lệnh CLR P1.7 tắt động cơ. 
Hai lệnh trên dùng toán tử dấu chấm để xác định địa chỉ bit trong một byte. 
 Các thanh ghi bộ định thời: 
8051 có hai bộ định thời 16 bit. Timer 0 có địa chỉ 8AH (TL0 byte thấp) và 
8DH (TH1 byte cao). Ngoài bộ định thời còn có hai thanh ghi: thanh ghi điều khiển 
TCON địa chỉ 88H và thanh ghi xác định mode cho timer TMOD địa chỉ 89H. Trong 
đó chỉ có thanh ghi TCON truy xuất được từng bit. 
 Các thanh ghi cổng nối tiếp: 
8051 chứa cổng nối tiếp bên trong MCU để giao tiếp với các thiết bị nối tiếp 
như thiết bị đầu cuối, modem v.v… Cổng nối tiếp gồm có hai thanh ghi: một thanh ghi 
đệm SBUF là nạp dữ liệu để truyền đi. Đọc SBUF là nhận dữ liệu đã thu được vào. 
Các mode truyền có thể được lập trình thông qua thanh ghi điều khiển cổng kế tiếp. 
Thanh ghi này có thể truy xuất bit và có địa chỉ 98H. 
 Các thanh ghi ngắt: 
8051 có 5 nguồn ngắt và hai mức ưu tiên. Các ngắt bị cấm khi reset hệ thống. 
Các ngắt được cho phép thông qua thanh ghi IE có địa chỉ 0AH. Các mức ưu tiên cũng 
được set bởi thanh ghi IP tại địa chỉ B8H. Cả hai thanh ghi này đều có thể truy xuất 
bit. 
IE có địa chỉ A8H. Ngắt chỉ được chấp nhận khi thanh ghi này đã được lập 
trình. 
 Thanh ghi PCON (Power Control Register) 
Thanh ghi PCON có địa chỉ 87H, chứa các bits điều khiển linh tinh, được tóm tắt 
trong bảng 4.4. 
Bit SMOD nhân đôi tốc độ truyền nối tiếp ở các mode 1, 2 và 3. Các bit 4, 5, 6 
không được định nghĩa. Bit 3 và 2 là hai cờ được tùy ý trong lập trình ứng dụng. 
Các bit PD (power down) và IDL (idle) đều có trong các họ IC MCS-51 nhưng chỉ 
với IC dùng CMOS mà thôi. 
Lệnh set bit IDL là lệnh được thi hành cuối cùng trước khi CPU vào chế độ idle. Ở 
tín hiệu này chế độ xung clock được ngắt ra khỏi CPU, nhưng không ngắt ra khỏi ngắt 
quãng, timer và cổng nối tiếp. Trạng thái CPU và nội dung các thanh ghi được bảo 
toàn. Các chân của cổng song song được giữ ở mức trạng thái của chúng. ALE và 
PSEN ở mức cao. 
Các chế độ idle kết thúc khi có bất kỳ một ngắt nào hoặc reset hệ thống, đồng thời 
bit IDL bị xóa. 
+ Power down Mode 
it 
K
ý hiệu 
Mô tả 
S
OMD 
G
F1 
G
F0 
P
D 
I
DL 
Tốc độ kép; khi được set, tốc độ truyền nối tiếp được 
nhân đôi các chế độ 1,2,3. 
Không được định nghĩa 
 “nt” 
 “nt” 
Cờ dùng cho mục đích tổng quát 1 
Cờ dùng cho mục đích tổng quát 2 
Power down, set mode power down. Chỉ thoát khi 
reset 
Idle mode, set mode idle. Thoát khi có ngắt hoặc 
reset 
Bảng 4.4 Tóm tắt thanh ghi PCON 
 Lệnh set bit PD là lệnh cuối cùng trước khi CPU chuyển sang mode 
power down. 
 Ở chế độ này: (1) bộ dao động nội ngưng hoạt động, (2) các chức năng bị dừng, 
(3) nội dung RAM nội được giữ ở mức logic của chún, (5) ALE và PSEN ở mức thấp. 
Chỉ có thể thoát khỏi chế độ này khi reset hệ thống. 
 Khi ở chế độ power down, Vcc có thể giảm đến 2V. Lưu ý cần phải trả lại mức 
áp 5V cho Vcc khi thoát khỏi chế độ power down. 
VI – BỘ NHỚ NGOÀI 
 Mở rộng bộ nhớ là một khả năng quan trọng đối với vi điều khiển nhằm tránh 
gặp bế tắc trong vấn đề thiết kế. Họ MCs-51 có thể mở rộng 64Kbs và bộ nhớ mã lệnh 
64Kbs dữ liệu. Các IC giao tiếp ngoại vi cũng có thể thêm vào để tăng năng xuất nhập. 
Nó trở thành một phần của bộ dữ liệu ngoại và được giải mã I/O như bộ nhớ. 
 Khi bộ nhớ ngoài được sử dụng, port 0 không được dùng làm cổng xuất nhập. 
Nó trở thành bus dùng để phân kênh địa chỉ và dữ liệu, ALE chốt nó như là bytes thấp 
của bus địa chỉ khi bắt đầu mỗi chu kỳ truy xuất bộ nhớ ngoài. Port 2 thường dùng làm 
byte cao của bus địa chỉ. 
 Chu kỳ bộ nhớ 
 A0  A15 Địa chỉ 
 D0  D7 Dữ liệu 
(a) Không phân kênh (24 chân) 
 Chu kỳ bộ nhớ 
 AD8  AD15 Địa chỉ 
 AD0  AD7 Địa chỉ Dữ liệu 
(b) Phân kênh (16 chân) 
Hình 4.5 Phân kênh bus địa chỉ và bus dữ liệu 
 Hình trên mô tả việc phân kênh và không phân kênh bus địa chỉ và bus dữ liệu. 
Nếu không phân kênh, với 16 chân địa chỉ và 8 chân dữ liệu ta có 24 chân cho bus địa 
chỉ và bus dữ liệu. Trong khi đó nếu phân kênh, 8 chân dữ liệu được dùng chung với 8 
chân thuộc byte thấp của bus địa chỉ nên chỉ có 16 chân cho bus địa chỉ và bus dữ liệu. 
Điều này có ý nghĩa lớn trong việc chế tạo IC. 
 Thứ tự phân kênh như sau : ở nữa chu kỳ đầu, byte thấp của địa chỉ xuất ra port 
0 và được chốt bằng ALE. Byte này được chốt ở bộ chốt trong suốt chu kỳ bộ nhớ. 
Trong nữa chu kỳ tiếp theo port 0 là bus dữ liệu, có thể xuất nhập tùy ý. 
Truy xuất bộ nhớ mã lệnh ngoài (External Code memory): 
 Bộ nhớ mã ngoài được đọc bằng tín hiệu PSEN (hình 4.6). Trong một chu kỳ 
máy ALE tác động 2 lần và 2 bytes được đọc từ bộ nhớ chương trình. Giản đồ thời 
gian của hoạt động này được gọi là chu kỳ lấy lệnh (hình 4.7). 
Truy xuất bộ nhớ dữ liệu ngoài (External Code memory): 
 Đây là bộ nhớ chứa dữ liệu, thường là RAM và được truy xuất bởi tín hiệu RD 
và WR. Dữ liệu này chỉ được truy xuất bằng lệnh MOVX thông qua thanh ghi con trỏ 
dữ liệu DPTR, hoặc R0, R1. 
 RAM giao tiếp với 8051 giống như EPROM. Ngoại trừ chân RD được nối với 
chân OE và chân WR được nối với chân W. Còn lại các bus dữ liệu và địa chỉ nối như 
EPROM. Với 16 đường địa chỉ ta có thể có đến 64Kbs cho vùng nhớ dữ liệu. 
 Giản đồ thời gian của viêc đọc vùng nhó dữ liệu ngoài khi thi hành lệnh “MOV 
A,@DPRT” được cho ở hình 4.8. Lưu ý chỉ có chân RD được dùng cho phép RAM. 
 Giản đồ thời gian của việc ghi cũng tương tự từ đường WR xuống mức thấp và 
dữ liệu xuất ra port 0. 
 Port 2 có thể không dùng làm byte cao của bus địa chỉ trong hệ thống không sử 
dụng vùng nhớ mã ngoài mà sử dụng vùng nhớ dữ liệu ngoài nhỏ. Tám bit địa chỉ có 
thể truy xuất được một vùng nhớ 256 bytes, được gọi là một trang bộ nhớ. Nếu vùng 
nhớ này lớn hơn 256 bytes ta có thể dùng thêm một vài chân của port 2 để chọn trang. 
 Khi truy xuất một trang (256 bytes) của vùng dữ liệu ngoài ta có thể dùng R0 
hoặc R1 để làm con trỏ địa chỉ trỏ đến byte dữ liệu cần truy xuất. Ví dụ những lệnh 
đọc nội dung của RAM ngoài có địa chỉ 0050H vào thanh tích lũy. 
 MOV R0, #50H ; 
 MOV A, @R0 ; 
Giải mã địa chỉ: 
 Nếu 8051 sử dụng cả EPROM và RAM ngoài đòi hỏi phải giải mã địa chỉ. Việc 
giải mã địa chỉ rất quen thuộc đối với hầu hết vi xử lý. Ví dụ nếu dùng EPROM 8K và 
RAM 8K, bus địa chỉ giải mã để chọn IC giới hạn trong 8Kbytes: 0000H đến 1FFFH, 
và 2000H đến 3FFFH, v.v… 
 Thông thường ta dùng IC giải mã 74138 với ngõ vào là 3 bits cao nhất của bus 
địa chỉ. Do đó mỗi ngõ tương ứng với 8Kbs. Các ngõ ra này đưa vào các chân CS của 
các IC nhớ. Lưu ý sự phân chia tín hiệu cho phép xuất của EPROM và RAM khác 
nhau (RD cho RAM và PSEN cho EPROM). 8051 có thể có đến 64Kbytes cho mỗi 
vùng ROM và RAM. 
Hình 4.8: Giản đồ thời gian khi đọc dữ liệu từ bộ nhớ ngoài 
RAM 
W 
OE 
Sự chồng lắp của vùng mã lệnh và dữ liệu ngoài: 
 Vì bộ nhớ mã lệnh chỉ được đọc nên sẽ bất tiện trong việc phát triển phần mềm. 
Làm thế nào để sửa lỗi của chương trình nằm trong kit khi bộ nhớ mã lệnh chỉ có thể 
đọc. Biện pháp thường được sử dụng ở đây là chồng lắp hai vùng mã lệnh và dữ liệu 
lên nhau. Tín hiệu PSEN dùng để đọc mã lệnh và tín hiệu RD dùng để đọc dữ liệu 
trong cùng một bộ nhớ. RAM chứa cả chương trình và dữ liệu. Hai tín hiệu RD và 
PSEN được đưa vào cổng AND. Ngõ ra của cổng AND nối với chân OE của RAM. 
Mạch ở hình 4.9 cho phép ghi dữ liệu vào RAM. Vì vậy chương trình có thể được load 
vào RAM (bằng cách ghi dữ liệu vào RAM) và thi hành (bằng cách truy xuất như bộ 
nhớ mã lệnh). 
 WR 
 RD 
 PSEN 
Hình 4.9 Mạch tạo nên sự chồng lắp hai vùng nhớ 
VII – HOẠT ĐỘNG RESET 
 8051 được reset khi giữ chân RST ở mức cao ít nhất trong hai chu kỳ máy và 
sau đó trả về mức thấp. RST có thể được nối với switch hoặc mạng tụ, trở để tạo tính 
reset. 
 Trạng thái của tất cả thanh ghi sau khi reset hệ thống tóm tắt trong bảng 4.5. 
Thanh ghi đếm chương trình được nạp giá trị 0000H sau khi reset. Khi RST xuống 
mức thấp chương trình luôn bắt đầu tại điểm 0000H. Nội dung các thanh ghi trong 
RAM nội không bị ảnh hưởng bởi hoạt động reset. 
Thanh ghi Nội dung 
PC 
ACC 
B 
PSW 
SP 
DPTR 
PORT 0..3 
IP 
IE 
Timer registers 
SCON 
SBUF 
PCON (HMOS) 
PCON (CMOS) 
0000H 
00H 
00H 
00H 
07H 
0000H 
FFH 
XXX00000B 
0XX00000B 
00H 
00H 
00H 
0XXXXXXXB 
0XXX0000B 
Bảng 4.5 Giá trị các thanh sau khi reset hệ thống 
Chương IV 
TÓM TẮT TẬP LỆNH 
I – GIỚI THIỆU: 
 Chương trình được xây dựng nên từ tập lệnh, tuân theo cú pháp và cấu trúc 
logic. Một họ vi xử lý luôn đi kèm theo tập lệnh của nó. Chương này gới thiệu tập lệnh 
của họ MCs-51, việc định vị và một vài ví dụ về các tình huống gặp phải khi lập trình. 
Chương này không bàn về kỹ thuật lập trình cũng như về trình biên dịch. 
 Tập lệnh họ vi điều khiển MCx-51 tối ưu cho các điều khiển ứng dụng 8 bit. Nó 
cung cấp các cách định vị nhanh, gọn thuận tiện cho việc truy xuất dữ liệu 8 bit trong 
vùng RAM nội. Tập lệnh cũng đưa ra một số lệnh thao tác trên bit thuận tiện cho việc 
điều khiển và các hệ thống logic có yêu cầu xử lý luận lý. 
 Là một xử lý 8 bit, các lệnh của 8051 là mã 8 bit. Do đó tập lệnh có tối đa 256 
lệnh. Trong đó 255 lệnh được định nghĩa. Trong một lệnh, ngoài mã lệnh (1 byte) ra 
còn có thể có dữ liệu và địa chỉ. Trong tập lệnh 8051 có 139 lệnh 1 byte, 92 lệnh 2 
byte và 24 lệnh 3 byte. Phần phụ lục sẽ mô tả đầy đủ về mỗi mã, về mã gợi nhớ, số 
byte lệnh, số chu kỳ hành lệnh. 
II – CÁC MODE ĐỊNH VỊ (ADDRESSING MODE) 
 Khi lệnh thao tác trên dữ liệu, một câu hỏi được đặt ra là “dữ liệu ở đâu?”. Để 
trả lời câu hỏi này ta xem xét qua các mode định vị của 8051. 
 Định vị dữ liệu là một phần quan trọng trong tập lệnh. Chúng xác định dữ liệu 
nguồn và đích theo những cách khác nhau tùy theo cách lập trình. Trong phần này ta 
sẽ lhảo sát kỹ từng mode định vị và cho mỗi loại một ví dụ. Có 8 mode định vị: 
 Thanh ghi 
 Trực tiếp 
 Gián tiếp 
 Tức thời (Immediate) 
 Tương đối 
 Xa 
 Chỉ số 
Định vị bằng thanh ghi: 
 Người lâp trình truy xuất dữ liệu chứa trong các thanh ghi từ R0 đến R7 thông 
qua tên gọi của chúng. Địa chỉ của 8 thanh ghi này được giải mã thông qua bit thấp 
nhất của chúng. Do đó mã lệnh và toán hạng địa chỉ được gom chung vào 1 byte. 
Opcode 5-bit n n n 
 Ví dụ lệnh sau cộng nội dung R7 vào thanh ghi tích luỹ: 
 ADD A, R7; 
 Mã lệnh là 001011111B. Trong đó 5 bit cao 00101 chỉ mã lệnh 3 bit thấp 111 
chỉ thanh ghi R7. 
 Một vài lệnh xác định trực tiếp trên thanh ghi như thanh ghi tích luỹ, con trỏ dữ 
liệu …do đó không cần đến các bit địa chỉ. Bản thân mã lệnh đã mô tả thanh ghi. 
Định vị trực tiếp : 
 Định vị trực tiếp có thể truy xuất bất kỳ byte nào trong vùng nhớ nội hoặc các 
thanh ghi chức năng. Một byte được thêm vào mã lệnh để xác định vị trí thanh ghi 
được dùng. 
Opcode 8-bit Direct Adress 8-bit 
 Tùy thuộc vào bit cao nhất của byte địa chỉ trực tiếp, một trong hai vùng nhớ sẽ 
được chọn. Khi bit 7 của địa chỉ trực tiếp bằng 0: địa chỉ trực tiếp có giá trị từ 0 đến 
127 (00H – 0FH) và 128 bytes thấp của on chip RAM được tham khảo đến, Tất cả các 
I/O port, thanh ghi chức năng. Thanh ghi điều khiển, thanh ghi trạng thái có địa chỉ từ 
128 đến 255 (80H-FFh). Khi bit 7=1 byte địa chỉ trực tiếp nằm trong giới hạn này, 
tương ứng với thanh ghi chức năng sẽ được truy xuất. Ví dụ port 0 và port 1 có địa chỉ 
tương ứng là 80H và 90H. Ta không cần phải biết địa chỉ của những thanh ghi này, 
trình biên dịch luôn hiểu các mã gợi nhớ ngắn gọn của nó như P0, P1, TMOD… 
Định vị gián tiếp: 
 Làm thế nào để nhận dạng một biến, nếu địa chỉ của nó được xác định, tính 
toán, thay đổi khi chương trình đang chạy. Vấn đề này được đặt ra khi thao tác các vị 
trí nhớ liên tục, chuỗi số, hay xâu ký tự. Thanh ghi và địa chỉ trực tiếp không thể dùng 
vì toán hạng địa chỉ phải được nhân biết trong thời gian biên dịch. 
 Để giải quyết vấn đề trên 8051 sử dụng địa chỉ gián tiếp. R1 và R0 được coi 
như những con trỏ. Nội dung của chúng chỉ đến một địa chỉ nào đó trong RAM khi 
đọc hoặc ghi dữ liệu. Bit thấp nhất trong byte mã lệnh xác định thanh ghi nào (R0 hay 
R1) được dùng làm con trỏ. 
 Ngôn ngữ assembly của 8051 dùng ký hiệu @ đặt trước R0 hay R1 để mô tả 
định vị gián tiếp. Ví dụ, nếu R1 chứa 40H và tại vị trí 40H trong bộ nhớ nội chứa giá 
trị 55H, lệnh: 
 MOV A, @R1; 
Chuyển giá trị 55H vào thanh ghi tích luỹ. 
Opcode 7-bit i 
 Định vị gián tiếp trở nên quan trọng khi phải thao tác từng byte bộ nhớ nội một 
cách liên tục. Ví dụ những lệnh sau sẽ xóa vùng RAM từ địa chỉ 60H đến 70H: 
 MOV R0, #60H; 
 MOV @R0, #0; 
LOOP: INC R0; 
 CJNE R0, #80H, LOOP; 
 Lệnh đầu tiên khởi động thanh ghi với địa chỉ đầu tiên của khối bộ nhớ. Lệnh 
thứ hai dùng lệnh gián tiếp để chuyển giá trị 00H vào vị trí được trỏ bởi R0. Lệnh thứ 
3 tăng giá trị con trỏ đến địa chỉ tiếp theo. Và lệnh cuối kiểm tra xem con trỏ đến cuối 
khối chưa. Lệnh kiểm tra dùng giá trị 80H chứ không phải giá trị 7FH vì việc xảy ra 
sau việc dịch chuyển gián tiếp. Như vậy chắc chắn cuối cùng sẽ được ghi trước khi kết 
thúc. 
Định vị tức thời : 
 Khi một toán hạng nguồn là một hằng số không phải là một biến. Hằng số có 
thể được gom vào trong lệnh như một dữ liệu tức thời. Byte được thêm vào sẽ chứa giá 
trị. 
Trong ngôn ngữ assembly toán hạng tức thời được đặt trước bằng ký hiệu số 
(#). Toán hạng có thể là một hằng số, ký hiệu hoặc toán tử. Trình biên dịch sẽ tính toán 
giá trị và gán dữ liệu tức thời vào lệnh. 
 Tất cả các lệnh dùng định vị tức thời đều sử dụng hằng dữ liệu 8 bit. Ngoại trừ 
khi khởi động thanh ghi con trỏ dữ liệu (DPTR) 
 MOV DPTR, #40000H; 
Là một lệnh 3 bytes nạp số 16 bit vào thanh ghi con trỏ. 
Định vị tương đối: 
 Định vị tương đối chỉ dùng trong các lệnh jump. Địa chỉ tương đối (offset) là 
một số 8 bit có dấu được cộng vào thanh ghi đếm chương trình để chỉ ra địa chỉ của 
lệnh tiếp theo phải thi hành. Vì offset là một số 8 bit có dấu nên tầm nhảy chỉ giới hạn 
trong khoảng cách +127 và –128 vị trí. 
 Trước khi cộng, thanh ghi đếm chương trình tăng lên đến địa chỉ sau lệnh jump. 
Vì vậy, địa chỉ mới là tương đối so với địa chỉ lệnh kế tiếp chứ không phải địa chỉ lệnh 
jump. 
 Thông thường chi tiết này không liên quan đến người lập trình, khi mà đích 
nhảy đến được mô tả bằng một nhãn. Trình biên dịch sẽ định giá trị offset tương đối 
tương ứng. 
 Ví dụ nếu nhãn THERE được đặt tại lệnh có địa chỉ 1040H và lệnh 
 SJMP THERE 
Ở tại vị trí 1000H và 1001H. Trình biên dịch sẽ gán giá trị offset tương đối là 3EH tại 
byte thứ hai của lệnh. 
Định vị tuyệt đối: 
 Định vị tuyệt đối chỉ dùng đối với các lệnh ACALL, AJMP. Lệnh 2 byte này 
cho phép rẽ nhánh trong phạm vi 2Kbytes bộ nhớ. 5bit cao của địa chỉ đích là 5 bit cao 
hiện thời trong thanh ghi đếm chương trìng. Vì vậy lệnh theo sau lệnh rẽ nhánh và lệnh 
kết thúc rẽ nhánh kết thuác nằm trong phạm vi 2Kbytes. 
Addr 10 – Addr8 Opcode 5-bit 
Định vị xa: 
 Định vị xa chỉ sử dụng cho các lệnh LCALL và LMP. Các lệnh 3-byte này có 
địa chỉ đích là số 16-bit đặt trong byte 2 và byte 3. Điều thuận tiện là toàn bộ vùng mã 
Opcode Immediate data 
Relative offset Opcode 
Addr7 - Addr0 
lệnh đều có thể được sử dụng. Nhưng một điều bất tiện là lệnh 3-byte quá dài và phụ 
thuộc vị trí (position-dependent). Phụ thuộc vị trí là một điệu bất tiện bởi vì chương 
trình không thể thi hành tại một địa chỉ khác. 
 Opcode Addr15 – Addr8 Addr7 – Addr0 
Định vị chỉ số : 
 Định vị chỉ số dùng một thanh ghi cơ sở (PC hoặc DPTR) và một thanh ghi làm 
offset (ACC) tạo ra một địa chỉ sẽ bị tác động bởi các lệnh JMP hoặc MOVC. 
 Thanh ghi nền offset địa chỉ tác động 
 PC or DPTR + ACC = 
 Các ví dụ được cung cấp trong phụ lục cho các lệnh: 
 MOVC A, @A+ 
 JMP @A+DPTR 
III – PHÂN LOẠI LỆNH: 
 Các lệnh 8051 được chia thành 5 nhóm như sau: 
 Số học 
 Logic 
 Trao đổi dữ liệu 
 Luận lý 
 Rẽ nhánh chương trình 
Các lệnh số học 
 Các lệnh số học thường sử dụng 4 mode định vị. Lệnh ADD A có thể được viết 
bằng nhiều cách khác nhau: 
 ADD A, 7FH (Định vị trực tiếp) 
 ADD A, @R0 (---------gián tiếp) 
 ADD A, R7 (---------thanh ghi) 
 ADD A, #35H (--------- tức thời) 
 Tất cả các lệnh số học thi hành trong một chu kỳ máy, ngoại trừ lệnh INC 
DPTR (2 chu kỳ máy), MUL AB và DIV AB (4 chu kỳ máy). 
 8051 cung cấp cách định vị rất mạnh cho vùng RAM nội của nó. Bất kỳ byte 
nhớ nào cũng đều có tể tăng, giảm bằng định vị trực tiếp mà không cần thông qua 
thanh ghi tích luỹ. 
 Lệnh INC có thể thao tác trên con trỏ dữ liệu (16 bit). Nhưng lệnh DEC không 
được định nghĩa trên con trỏ. Do đó để thực hiện được điều này ta có các lệnh sau: 
 DEC DPL ; giảm byte thấp DPTR 
 MOV R7, DPL ; chuyển vào DPL 
 CJNE R7, #0FFH, SKIP ; nếu vượt quá FF 
 DEC DPH ; giảm luôn byte cao 
SKIP : (tiếp tục) 
 Các lênh MUL AB và DIV AB chỉ thao tác trên các thanh ghi A và B. 
Lệnh Logic : 
 Các lệnh logic biểu diễn các toán tử luận lý như AND, OR, EA-OR và NOT … 
Các lệnh này trên từng bit của byte dữ liệu. Ví dụ thanh ghi ACC chứa số 10101101B 
thì lệnh: 
 ANL A, #10110010B 
Chứa kết quả 10100000 vào thanh ghi ACC. Các mode định vị trong lệnh logic cũng 
giống như trong lệnh số học. Tất cả các lệnh logic dùng đến thanh ghi ACC như một 
toán hạng đều là những lệnh một chu kỳ. Các lệnh khác đều chiếm 2 chu kỳ máy. 
 Lệnh logic có thể thao tác trực tiếp bất cứ byte nào trong vùng nhớ nội. Lệnh 
XRL , #data đảo nhanh và dễ dàng các bit của port. 
 XRL P1, #0FFH; 
 Lệnh này mô tả hoạt động read-modify-write. 8 bit của port 1 được đọc, sau đó 
mỗi bit của XOR với bit tương ứng trong byte dữ liệu tức thời đều là 1, XOR sẽ đảo 
mỗi bit được đọc. Kết quả được viết trở lại port 1. 
Các lệnh chuyển dịch dữ liệu: 
RAM nội 
 Các lệnh chuyển dịch dữ liệu trong vùng RAM nội chỉ chiếm 1 hoặc 2 chu kỳ 
máy. Lệnh có dạng: 
 MOV , 
 Một nét đặc trưng của họ MSC-51 là stack nằm trong vùng RAM nội và lớn dần 
lên phía tên của bộ nhớ. Lệnh PUSH trước tiên tăng con trỏ stack, sau đó mới sao chép 
byte vào stack. PUSH và POP chỉ dùng định vị trực tiếp. Thế nhưng bản thân stack lại 
dùng định vị trực tiếp thông qua con trỏ stack (SP). 
 8031/8051 không dùng 128 byte cao trong vùng nhớ nội làm stack. Nếu SP 
vượt quá 127 bytes được push bị mất và byte được pop không xác định. 
 Lệnh dịch chuyển dữ liệu 16-bit (MOV dùng để khởi động con trỏ dữ liệu. 
 Lệnh 
 XCV A, 
Chuyển đổi dữ liệu giữa A và byte được định vị. 
Lệnh 
 XCHD A, @R1 
chuyển đổi 4 bit thấp của thanh ghi ACC với byte được R1 chỉ đến. 
RAM ngoài 
 Dịch chuyển dữ liệu giữa bộ nhớ trong và ngoài sử dụng mode định vị gián tiếp. 
Địa chỉ gián tiếp có thể là một byte hay 2 byte (DPTR). Các lệnh dịch chuyển dữ liệu 
thao tác trên bộ nhớ ngoài đều chiếm hai chu kỳ máy và dùng thanh ghi tích luỹ làm 
toán hạng nguồn hoặc đích. 
Look-Up Tables 
 Hai lệnh được cho sẵn để đọc một bảng dữ liệu trong bộ nhớ chương trình. Khi 
truy xuất đến vùng nhớ chương trình thì nội dung của bảng chỉ được đọc mà không 
được ghi. Từ gợi nhớ MOVC tức là “move constant”. MOVC dùng thanh ghi đếm 
chương trình cũng như con trỏ dữ liệu kàm thanh ghi nền và thanh ghi tích luỹ làm 
offset. 
 MOVC A,@A+DPTR ; 
Có thể đọc được một số trong bảng 256 phần tử vào thanh ghi tích luỹ. Trong đó thanh 
ghi tích luỹ chỉ đến một vị trí trong còn con trỏ DPTR chỉ đến vị trí đầu bảng. 
 MOVC A,@A+PC ; 
 Cũng tương tự như trên, chỉ khác là thanh ghi PC được dùng làm thanh ghi nền 
và bảng được truy xuất thông qua chương trình con. Trước tiên chỉ số yêu cầu được 
nạp cho thanh ghi tích luỹ sau đó chương trình con được gọi. Việc khởi động và gọi 
cụ thể như sau: 
 MOV A,ENTRY_NUMBER 
 CALL LOOK_UP 
 . 
 . 
 . 
LOOK_UP : INC A 
 MOVC A, @A+PC 
 Ret 
TAB: DB data, data, data … 
 Bảng được đặt ngay sau lệnh RET của chương trình con. Lệnh INC cần thiết vì 
PC sẽ chỉ đến lệnh RET sau khi thi hành MOVC. Việc tăng thanh ghi A cho phép nhảy 
qua khỏi lệnh RET. 
Các lệnh luận lý 
 Các lệnh luận lý của 8051 thao tác trên bit đơn. RAM nội cung cấp 128 bit và 
các thanh ghi chức năng cung cấp 128 bit khác. Lệnh truy xuất đến các bit thông 
thường như set, xóa, đảo, AND, OR … 
 Tất cả các bit đều truy xuất bằng định vị trực tiếp với các bit có địa chỉ từ 00H – 
7Fh trong 128 địa chỉ thấp và 80H-FFH trong SFRs. Các bit trong vùng địa chỉ thấp 
đạt tại 20F đến 2FH, được đánh số lần lượt từ bit 0 của địa chỉ 200H (bit 00H) đến bit 
7 của địa chỉ 2FH (bit 7Fh). 
 Ví dụ 
 SETB P.1.7 set bit 7 port 1 
 Bit carry trong PSW được sử dụng như single-bit accumulator. 
 Ví dụ 
 CLR C 
 CLR CY ; xóa carry 
Test bit 
 Các lệnh test bit thường là các lệnh rẽ nhánh chương trình. Chúng kiểm tra 
trạng thái các bit để nhảy đến chương trình tương ứng nếu thỏa điều kiện. 
Lệnh rẽ nhánh chương trình 
 Có một số lệnh điều khiển dòng chương trình, chúng gồm các lệnh gọi chương 
trình con và trả về từ một chương trình con hoặc rẽ nhánh có điều kiện và không có 
điều kiện. Những khả năng này có thể được cải tiến hơn nữa khi sử dụng 3 mode định 
vị trong các lệnh rẽ nhánh chương trình. 
 Có 3 kệnh JMP khác nhau:SJMP, LJMP và AJMP (tương ứng là định vị tương 
đối, định vị xa và định vị tuyệt đối). Trình biên dịch Intel chấp nhận lệnh chung chung 
JMP nếu người lập trình không quan tâm đến sự thay đổi biên dịch. Trong khi trình 
biên dịch của những hãng khác không có đặc tính này. JMP được biên dịch thành 
AJMP nếu đích nằm ở trước và khoảng nhảy nằm trong phạm vi 2Kbytes. Trong các 
trường hợp khác có thể dịch thành LJMP. Lệnh CALL cũng tương tự như vậy. 
 Lệnh SJMP định địa chỉ đích như một offset tương đối. Vì vậy lệnh này dài 2 
bytes. Khoảng cách nhảy bị giới hạn từ –128 đến +127 bytes tương đối so lệnh sau 
lệnh SJMP. 
 Lệnh LJMP xác định một địa chỉ đích là một số 16 bit. Vì vậy lệnh này dài 3 
bytes. Địa chỉ đích có thể ở bất kỳ trong vùng nhớ chương trình 63KB. 
 Lệnh AJMP xác định địa chỉ đích là một số 11 bit. Giống như SJMP, lệnh này 
dài 2 bytes, nhưng được biên dịch khác. Mã lệnh chứa 3 bit trong vòng 11 bit địa chủ 
và byte thứ hai chứa 8 bit còn lại của địa chỉ đích. Khi lệnh được thi hành 11 bit này 
được đặt vào 11 bit thấp trong thanh ghi PC và 5 bit cao trong thanh ghi PC không đổi. 
Vì vậy đích phải nằm trong phạm vi 2 Kbytes. 
 Trong tất cả các trường hợp, người lập trình xác định địa chỉ bit bằng một nhãn 
hoặc như một số 16 bit. Trình biên dịch sẽ đặt địa chỉ đích vào vị trí đúng trong lệnh 
được biên dịch. 
Jump Tables 
 Lệnh “JMP @ A+DPTR” cung cấp lệnh nhảy phụ thuộc điều kiện theo một 
bảng nhảy (jump tables). Địa chỉ đích sẽ được tính trong khi thi hành chương trình như 
tổng của DPTR và thanh ghi tích luỹ. Đầu tiên DPTR được nạp địa chỉ của bảng và 
thanh ghi tích luỹ được dùng làm chỉ số. Ví dụ nếu có 5 trường hợp nhảy, giá trị từ 0 
đến 4 được nạp cho thanh ghi tích luỹ và lệnh nhảy tương ứng với từng trường hợp 
được mô tả như sau: 
 MOV DPTR, #JUMP_TABLE ; 
 MOV A, INDEX_NUMBER ; 
 RL A 
 JMP @A+DPTR 
 Lệnh RL ở trên đổi chỉ số (từ 0 đến 4) thành các số chẵn từ 0 đến 8, vì mỗi 
điểm xâm nhập trong bảng là một địa chỉ 2-byte. 
 JNP_TABLE : AJMP CASE0 
 AJMP CASE1 
 AJMP CASE2 
 AJMP CASE3 
Chương trình và con ngắt 
 Có hai lệnh CALL khác nhau: ACALL và LCALL dùng định vị tuyệt đối và xa. 
Giống như lệnh JMP, lệnh CALL đưôc trình biên dịch của Intel dùng khi người lập 
trình không quan tâm đến địa chỉ được biên dịch. Lệnh này đẩy thanh ghi PC vào stack 
và nạp PC với giá trị được chỉ ra trong lệnh. Lưu ý PC sẽ được trả lại giá trị địa chỉ sau 
lệnh CALL khi nó chấm dứt chương trình con. 
 Các lệnh LJMP và ACALL đều có những hạn chế giống như LJMP và AJMP 
được mô tả ở trên. 
 Chương trình con kết thúc bằng lệnh RET, nó sẽ trả điều khiển lại cho chương 
trình chính. Không có gì bí ẩn khi RET trả điều khiển lại cho chương trình chính, nó 
chỉ đơn giản lấy 2 bytes cuối cùng của stack và đặt chúng vào thanh ghi PC. 
 Lệnh RETI dùng để quay trở về chương trình chính từ trong chương trình phục 
vụ ngắt. Sự khác nhau giữa RET và RETI chỉ là RETI ký hiệu cho ngắt điều khiển hệ 
thống. 
Lệnh nhảy có điều kiện 
 8051 cung cấp một số lệnh nhảy có điều kiện. Tất cả những lệnh này đều xác 
định địa chỉ đích bằng định vị tương đối. Giới hạn khoảng cách nhảy từ –128 đến +127 
bytes kể từ sau lệnh nhảy có điều kiện. Tuy nhiên người lập trình cũng có thể định một 
địa chỉ bằng nhhãn hoặc một số 16 bit. 
 Không có bit zero trong thanh ghi PSW. JZ và JNZ test nội dung thanh ghi 
ACC cho điều khiển nhảy. 
 Lệnh DJNZ (nhảy nếu khác 0) được dùng để điều khiển vòng lặp. Để vòng lập 
thi hành N lần, nạp biến đếm với N và đặt DJNZ ở cuối vòng lặp để bắt đầu vòng lặp. 
Ví dụ vòng lặp sau thi hành 10 lần: 
 MOV R0,#10 ; 
LOOPP: (bắt đầu vòng lặp) 
 . 
 . 
 . 
 (kết thúc vòng lặp) 
 DJNZ R7, LOOP ; 
 (tiếp tục) 
 Lệnh CJNZ (so sánh và nhảy nếu không bằng) cũng dùng để điều khiển vòng 
lặp. Hai bytes được xác định trong vùng toán hạng của lệnh và lệnh nhảy sẽ thi hành 
nếu hai bytes này khác nhau. Ví dụ, nếu một ký tự được đọc vào thanh ghi ACC từ 
cổng nối tiếp và nhảy đến nhãn TERMINAL nếu ký tự đọc vào là CONTROL-C (03H) 
. 
 CJNE A, #03, SKIP ; 
 SJMP TERMINAL ; 
SKIP: (tiếp tục) 
 Lệnh jump chỉ xảy ra khi A=03H. 
 Một ứng dụng khác của lệnh này là so sánh lớn hơn và bé hơn. Hai byte trong 
miền toán hạng là những số không dấu. Nếu toán hạng đầu nhỏ hơn toán hạng thứ hai 
thì cờ carry được set. Nếu toán hạng đầu lớn hơn hoặc bằng toán hạng thứ hai thì cờ 
carry được xóa. Ví dụ nếu muốn nhảy đến BIG nếu ACC lớn hơn hoặc bằng 20H, ta có 
các lệnh sau: 
 CJNE A,#20H,$+3 
 JNC BIG 
 Ký hiệu dollars “$” là một ký hiệu đặt biệt của trình biên dịch thay thế cho địa 
chỉ của lệnh hiện thời. Vì CJNE là một lệnh 3-bytes, “$+3” là địa chỉ của lệnh tiếp 
theo. 
Chương V 
GIỚI THIỆU VỀ KIT VI ĐIỀU KHIỂN 8051 
I –CHỨC NĂNG CÁC PHÍM: 
1 – Bàn phím: 
 Kít vi điều khiển có tất cả là 26 phím nhấn như hình 1 được chia thành các 
nhóm như sau: 
 16 phím nhập dữ liệu của chương trình dạng số thập lục phân từ 0 đến F. 
 Các phím chức năng 
Hình 1 Q 
 G T P K I 
 C D E F R 
 8 9 A B S 
 4 5 6 7 
 0 1 2 3 
2 – Chức năng của phím: 
 Khi mới cấp điện cho máy 4 Led bên trái sẽ hiển thị 4 số 0000, bốn 
led bên phải tắt 
 Nếu không hiển thị đúng hãy nhấn phím “Q”. Phím “Q” có chức 
năng Reset mạch khi khởi động hoặc khi muốn thoát khỏi chương 
trình vi điều khiển đang thực hiện (chức năng như phím RESET của 
máy vi tính) 
3 – Chức năng của phím: 
 Muốn nhập dữ liệu mới vào ô nhớ có địa chỉ ví dụ 4000, hãy dùng 
các phím nhập dữ liệu đánh số 4000, địa chỉ này sẽ xuất hiện ở 4 led 
bên phải. 
 Nhấn phím “S” thì địa chỉ 4000 sẽ thay thế cho địa chỉ trước đó ở 4 
led bên trái. 
 4 led còn lại chỉ có 2 led sáng đó chính là nội dung của ô nhớ tương 
ứng với địa chỉ 4 led bên trái 
4 – Chức năng của phím: 
 Dùng để lưu trữ dữ liệu vào ô nhớ có địa chỉ ở 4 led bên trái, ví dụ 
muốn lưu trữ dữ liệu là “3F” vào ô nhớ có địa chỉ là 4000, hãy đánh 
“3F” từ các phím dữ liệu, dữ liệu mới “3F” sẽ thay thế dữ liệu cũ 
trước đó. 
 Sau đó nhấn phím “” để lưu trữ dữ liệu này vào ô nhớ 4000. Địa chỉ 
sẽ tăng lên 1 là 4001 để sẵn sàng nhận dữ liệu tiếp theo và 2 led bên 
trái hiển thị nội dung của ô nhớ 4001. 
 Chức năng của phím này lưu trữ dữ liệu đồng thời tăng địa chỉ của ô 
nhớ. 
S 
 
Q 
 
5 – Chức năng của phím: 
 Có chức năng giảm địa chỉ của ô nhớ xuống 1 đơn vị tương ứng với mỗi lần 
nhấn. Ví dụ muốn kiểm tra lại ô nhớ vừa nhập là 4000 xem có đúng là dữ 
liệu “3F” không, hãy nhấn phím “”. Nếu sai thì nhập lại, nếu đúng thì nhấn 
phím tăng địa chỉ để nạp các dữ liệu tiếp theo. 
6 – Chức năng của phím: 
 Sau khi nhập dữ liệu của một chương trình tại địa chỉ 4000, để vi điều khiển 
thực hiện chương trình này hãy nhấn ohím “P”. Khi đó trên màn hình 8 Led 
sẽ xuất hiện “PC 4000”. Nếu muốn thực hiện chương trình tại địa chỉ 4000 
hãy nhấn phím tăng địa chỉ, khi đó trên màn hình sẽ xuất hiện thêm dấu “=” 
như sau: “PC =4000”. Sau đó nhấn phím “G”. Chương trình sẽ được thi 
hành. 
 Nếu chương trình lưu tại địa chỉ khác với địa chỉ 4000 thì trước khi nhấn 
phím tăng địa chỉ hãy đánh địa chỉ của chương trình đó vào bằng các phím 
nhập dữ liệu. Sau đó nhấn phím tăng địa chỉ, ví dụ muốn thực hiện chương 
trình tại địa chỉ 5000 thì trên màn hình 8 led sẽ hiển thị “PC =5000”. Nhấn 
tiếp phím “G” chương trình sẽ được thi hàn htại địa chỉ 5000. 
7 - Chức năng của phím: 
 Dùng để xem nội dung các thanh ghi, trước tiên nhấn phím “R” và sau 
đó nhấn phím thập phân tương ứng từ “6” cho đến “F” 
 Nhấn phím thập phân “A”: xem nội dung thanh ghi A 
 Nhấn phím thập phân “B”: xem nội dung thanh ghi B 
 Nhấn phím thập phân “C”: xem nội dung thanh ghi C 
 Nhấn phím thập phân “D”: xem nội dung thanh ghi D 
 Nhấn phím thập phân “E”: xem nội dung thanh ghi E 
 Nhấn phím thập phân “F”: xem nội dung thanh ghi F 
 Nhấn phím thập phân “8”: xem nội dung thanh ghi H 
 Nhấn phím thập phân “9”: xem nội dung thanh ghi L 
 Nhấn phím thập phân “7”: xem nội dung cặp thanh ghi SP 
 Nhấn phím thập phân “6”: xem nội dung cặp thanh ghi PC 
P 
R 
I 
8 – Chức năng của phím: 
 Phím này tác động đến ngắt cứng của hệ thống vi xử lý. Chương trình sẽ bị 
ngừng sau khi nhấn phím “I”, nếu nhấn “I” thêm lần nữa hệ thống sẽ được 
đặt lại trạng thái mặc định ban đầu tương đương với reset máy bằng phím 
“Q” 
9 – Chức năng của phím: 
 Chức năng của phím này là thực hiện chương trình từng bước. Trình tự nhấn 
phím giống như phím “G”. Nếu nhấn phím “G” để thực hiện cả chương 
trình tại địa chỉ chứa trong cặp thanh ghi PC, ta nhấn phím “T” chương trình 
sẽ được thực hiện từng lệnh tại địa chỉ chứa trong PC. 
* Chú ý: nếu nhấn phím “G” không thông qua phím “P” và các phím khác thì 
chương trình mặc nhiên sẽ thực hiện tại địa chỉ 4000. 
 Có 1 số chương trình chức năng chưa nạp vào EPROM 
II – GIỚI THIỆU CẤU TRÚC PHẦN CỨNG KIT VI XỬ LÝ: 
1 – Tần số làm việc: 
 Kit vi điều khiển sử dụng vi điều khiển 8051 hoặc 8951 của Intel với tần số 
hoạt động 12MHz. 
 Các chương trình về thời gian được viết tương ứng với địa chỉ này. 
2 – Tổ chức bộ nhớ: 
 a . Bộ nhớ EPROM: 
 Có dung lượng 16KB sử dụng 2 EPROM 2764, chương trình hệ thống 
chứa ở EPROM thứ nhất, EPROM thứ 2 chưa sử dụng được thiết kế ở dạng 
socket. 
 EPROM 1 có địa chỉ từ 0000H – 1FFFH 
 EPROM 2 có địa chỉ từ 2000H – 3FFFH 
b . Bộ nhớ RAM: 
Bộ nhớ RAM có dung lượng 16KB sử dụng 2 IC 6264: 
 RAM 1 có địa chỉ từ 4000H – 5FFFH 
 RAM 2 có địa chỉ từ 6000H – 7FFFH 
 Chương trình có thể sử dụng toàn bộ các vùng nhớ RAM 
3 – Các IC ngoại vi: trong hệ thống có sử dụng 2 IC 8255A dùng để giao tiếp 
với thiết bị ngoại vi. 
T 
Địa chỉ của các port 8255-1 8255-2 
Port A 8000H A000H 
Port B 8001H A001H 
Port C 8002H A002H 
Thanh ghi điều khiển 8003H A003H 
Bảng đồ nhớ của 2 IC 8255 
 Các ngõ ra của IC 8255A –1, 8255 – 2, đưa ra bên ngoài bằng 
connector 64 chân có sơ đồ chân ở bảng tra. Mỗi IC 8255A có 3 port, 
mỗi port có 8 chân điều khiển nên số chân đưa ra bên ngoài để điều 
khiển là 48. 
4 – Khối giải mã hiển thị – quét phím sử dụng IC 8279: 
 Vùng địa chỉ sử dụng của IC 8279 là C000H – C001H , trong đó: 
 Địa chỉ C000H là địa chỉ dùng để gởi dữ liệu cần hiển thị và đọc mã 
phím. 
 Địa chỉ C001H là địa chỉ dùng để gởi từ điều khiển ra 8279 – đọc 
thanh ghi trạng thái. 
a . Phần giải mã hiển thị: 
Gồm có 8 led với thứ tự Led1 đến Led8 theo hướng từ phải sang trái 
như hình 2. 
Cấu trúc byte dữ liệu của led 
p g f e d c b A 
 Hệ thống sử dụng Led loại Anode chung nên muốn đoạn nào sáng thì bit dữ 
liệu tương ứng với đoạn đó bằng 1. Đoạn nào tắt thì bit tương ứng với đoạn đó bằng 0. 
Ví dụ muốn sáng số “9” thì byte dữ liệu sẽ gởi ra led là: 
0 1 1 0 1 1 1 1 
Tương ứng với số hex là 6FH. Sau đây là mã 7 đoạn của 1 chữ số và chữ cái: 
a 
b 
c 
d 
e 
f g 
p 
LED8 
LED 
7 
LED6 
LED5 
LED4 
LED 
3 
LED 
2 
LED 
1 
 p G f e d c b a Hex 
Số 0 0 0 1 1 1 1 1 1 3F 
Số 1 0 0 0 0 0 1 1 0 06 
Số 2 0 1 0 1 1 0 1 1 5B 
Số 3 0 1 0 0 1 1 1 1 4F 
Số 4 0 1 1 0 0 1 1 0 66 
Số 5 0 1 1 0 1 1 0 1 6D 
Số 6 0 1 1 1 1 1 0 1 7D 
Số 7 0 0 0 0 0 1 1 1 07 
Số 8 0 1 1 1 1 1 1 1 7F 
Số 9 0 1 1 0 1 1 1 1 6F 
Chữ A 0 1 1 1 0 1 1 1 77 
Chữ b 0 1 1 1 1 1 0 0 7C 
Chữ C 0 0 1 1 1 0 0 1 39 
Chữ d 0 1 0 1 1 1 1 0 5E 
Chữ E 0 1 1 1 1 0 0 1 79 
Chữ F 0 1 1 1 0 0 0 1 71 
Chữ P 0 1 1 1 0 0 1 1 73 
Chữ H 0 1 1 1 0 1 1 0 76 
Chữ U 0 0 1 1 1 1 1 0 3E 
 Có thể tìm các mã tương ứng còn lại 
 Có 2 cách hiển thị dữ liệu trên các Led: 
 Cách 1: khi gởi các dữ liệu mới ra địa chỉ C000H thì dữ liệu này sẽ hiển thị ở Led 
1, dữ liệu trước đó của các led sẽ dịch sang trái theo chiều mũi tên trong hình 3. 
Riêng byte dữ liệu trước đó của led 8 sẽ dịch và mất đi. 
 LED8 LED7 LED6 LED5 LED4 LED3 LED2 LED1 
Mũi tên nằm ngang chỉ chiều nhận dữ liệu từ vi điều khiển đưa đến led 1. Các 
mũi tên vòng cung chỉ chiều dịch chuyển dữ liệu. 
 * Chú ý: nếu muốn xóa hết màn hình 8 led thì gởi 8 byte 00h liên tiếp ra 
A000h. 
 Cách 2: kiểu gởi dữ liệu ở cách 1 còn được gọi là kiểu dịch chuyển dữ liệu tuần tự. 
Bên cạnh đó 8279 còn cho phép gởi dữ liệu trực tiếp đến bất kỳ led nào trong 8 led 
– tổ chức của led không có gì thay đổi địa chỉ gởi dữ liệu vẫn là C000H nhưng mỗi 
led còn có thêm 1 địa chỉ điều khiển như trong hình 4. Địa chỉ điều khiển của led 
phải gởi ra địa chỉ C001H trước khi gởi dữ liệu ra địa chỉ C000H. 
 80H 81H 82H 83H 84H 85H 86H 87H 
b. Phần giải mã bàn phím: 
Chương trình con giải mã bàn phím được viết tại địa chỉ 0223H sử dụng các 
thanh ghi R2, A, DPTR, R6, R7, ô nhớ 41h. Khi gọi chương trình con 0223H: 
 Nếu không ấn phím thì sau khi thực hiện xong chương trình sẽ trở về 
chương trình chính với nội dung thanh ghi A =FFH 
 Nếu có ấn phím thì mã của phím ấn chứa trong A. 
Chương trình này nếu có ấn phím hoặc không ấn phím đều trở về chương trình 
sau khi thực hiện xong và phải chú ý cất dữ liệu trong các thanh ghi khi gọi chương 
trình con này 
Bảng mã các phím số: 
Phím Mã Phím Mã Phím Mã Phím Mã 
LED8 
LED 
7 
LED6 
LED5 
LED4 
LED 
3 
LED 
2 
LED 
1 
0 00 4 04 8 08 C 0C 
1 01 5 05 9 09 D 0D 
2 02 6 06 A 0A E 0E 
3 03 7 07 B 0B F 0F 
Bảng mã các phím chức năng: 
Phím Mã Phím Mã 
T 10 S 14 
G 11 15 
R 12 P 16 
 13 K 17 
PHẦN II 
THIẾT KẾ 
Chương I 
THIẾT KẾ PHẦN CỨNG 
I – MẠCH CHUYỂN ĐỔI AD: 
1 – Giới thiệu ADC 0809 
 ADC 0809 là thiết bị biến đổi tương tự số dùng kỹ thuật CMOS. Tổng cộng 
người sử dụng có 8 kênh làm việc hoàn toàn độc lập với nhau để lựa chọn. Ở đây còn 
chú ý là các điện áp được đo so với điện thế 0V. Còn một đặc điểm đáng quan tâm hơn 
là sự tiêu thụ dòng điện của vi mạch hầu như không đáng kể (chỉ cỡ 300uA). Thời gian 
biến đổi khoảng 100 us. Các thông số kỹ thuật của bộ biến đổi ADC 0809 được kể ra 
như sau: 
 Không cần đòi hỏi điều chỉnh điểm 0. 
 Quét động 8 kênh bằng các logic địa chỉ. 
 Giải tín hiệu lối vào Analog khi điện áp nguồn là +5V. 
 Tất cả các tín hiệu tương thích TTL. 
 Độ phân giải 8 bit. 
 Thời gian biến đổi 100us. 
 Dòng tiêu thụ (bình thường): 0.3 mA. 
 Tần số cung cấp cho chân clock: 10KHz ÷ 1280KHz. Thông thường vào 
khoảng 640KHz. 
Tín hiệu giữ nhịp dùng cho bộ biến đổi AD cần phải tạo được ở bên ngoài và 
được dẫn đến chân clock. Điện áp so sánh được đưa qua tầng lặp lại điện áp để làm 
chân REF+. 
Chân này có điệntrở lối vào cỡ 2.5K. Mẫu bit ở các lối vào địa chỉ A, B, C sẽ 
xác định xem kênh nào phải được lựa chọn. 
2 – Nguyên tắc hoạt động 
 Nguyên tắc làm việc của bộ biến đổi ADC 0809 cũng không có gì phức tạp. 
Một xung dương ở chân start kích hoạt sự biến đổi. Qua đó mẫu bit ở lối vào địa chỉ A, 
B, C cũng đồng thời được chốt và xác định kênh cấn biến đổi. Trong quá trình biến 
đổi, chân ra EOC (End of Conversion) đứng ở mức Low. Sau cả 100us mức này sẽ 
chuyển sang high và báo hiệu kết thúc quá trình chuyển đổi. Sau đó kết quả của quá 
trình chuyển đổi sẽ xếp hàng ở đường dẫn dữ liệu D0 ÷ D7. Khi OE (Output Enable) = 
1, các đường dẫn có thể đọc tiếp. 
3 – Mạch tạo dao động cho ADC 0809: 
 0,7 
 V0 (f= ) 
 RC 
 Do tần số làm việc tương đối cao, ta sử dụng bộ đa hài tạo sóng xuống dùng 
Trigger Schmitt theo công nghệ TTL. Với mạch điện như trên ta có tần số dao động: 
F  0,7  700 KHz 
 RC 
4 – Mạch so sánh lặp lại điện áp: 
Ta sử dụng OP-AMP LM 358 để lập lại điện áp nhằm phối hợp tổng trở với ngõ 
vào REF+ của ADC 0809: đồng thời cung cấp mức áp chuẩn để đưa vào REF+ để tạo 
các mức logic ở ngõ ra tương ứng. 
 Các điện trở 1K, 2K. 10K và VR 10K nhằm tạo cầu phân áp và chọn mức áp 
chuẩn đưa vào REF+ 
 VZ = 5,6V ổn áp, giữ điện áp cố định 
 Ngõ ra bộ so sánh là 5V. Với giá trị này ta có sự thay đổi AV ở ngõ vào để 
thay đổi 1 mức logic ở ngõ ra là: 
AV = 5/256  20mV 
5 – Mạch tạo giao tiếp với KIT 8051: 
 8 bit ra của 0809 được nối với PortA của 8255 –1 
1K
C2
C
10K
2.2K
10K
VR1
3
2
5.6V +
-
LM358
3
2
1
8
4
 3 chân chọn kênh A0, A1, A2 của 0809 được nối PB0  PB2. Vì vậy khi ghi 
một dữ liệu vào vùng nhớ của 0809 tức chọn kênh của nó. 
 Chân Start nối PC4, ALE nối PC5 
 Chân OE được nối lên Vcc. Luôn ở trạng thái cho phép đọc dữ liệu. 
 Chân EOC được nối với PCC. Trong quá trình thực hiện chuyển đổi vi điều 
khiển sẽ đọc giá trị EOC tại PCO. Nếu EOC = 1: hoàn thành quá trình 
chuyển đổi, vi điều khiển sẽ đọc dữ liệu lưu trữ vào RAM để xử lý. 
 PC1 được nối qua R1K đưa lên +5V (PC1 = 1). Khi có ấn phím PC1 = 0, 
được đưa vào vi điều khiển để báo chọn kênh. 
II – MẠCH CHUYỂN ĐỔI DA 0808 
 DAC 0808 có nhiệm vụ biến đổi mã nhị phân thành dòng (tín hiệu analog). 
Dòng này có chiều chạy vào Iout của DAC 0808 và có cường độ thay đổi theo tỉ lệ với 
data ở ngã vào. Khi data thay đổi từ 0  255 Iref, ở mạch dòng mã nhị phân được đưa 
từ KIT 8051 qua Port A của 8255-2 để đưa vào DAC 0808. 
 Tín hiệu DAC 0808 tạo ra dòng nên còn phải có mạch chuyển dòng thành áp 
dùng LM324. Ta cần điện áp thay đổi từ 0-5V mà dòng thay đổi từ 0  2mA nên ta cần 
điều chỉnh VR 5K cho phù hợp. 
Sơ đồ nguyên lý card chuyển đổi A/D – D/A
SƠ ĐỒ BỐ TRÍ LINH KIỆN 
SƠ ĐỒ MẠCH IN MẶT TRÊN 
Chương II 
THIẾT KẾ PHẦN MỀM 
I – LƯU ĐỒ GIẢI THUẬT 
1 – Lưu đồ chương trình chính: 
START 
Khởi động 8255-1 
MODE0 
Nạp địa chỉ cho kênh 
đầu tiên vào r7 
Chương trình xóa 8LED 
Chương trình hiển thị thứ tự 
kênh chọn tại LED 8 
Chương trình chuyển đổi data 
Chương trình xuất data ra D/A 
Chương trình đổi HEX-BCD 
Chương trình giải mã LED 7 đoạn 
Chương trình hiển thị 
Chương trình delay 
Khởi động Port C 
 Kiểm tra nhấn phím N 
PC4 = 0 
 Y 
Tăng R7 để dò kênh kế 
 N 
R7= 08 
 Y 
Khởi động Port B 
8255 -1 
Ghi A vào 0809 
Chọn kênh 
Khởi động 0809 
ALE = 1, ST = 
Lưu kết quả 
2 – Lưu đồ chương trình con chuyển đổi: 
START 
Nhập kênh cần quét 
r7  a 
 Chuyển đổi N 
kết thúc 
 Y 
END 
II- CHƯƠNG TRÌNH: 
Chương trình chính chuyển đổi A/D – D/A: 
ORG 4000H 
MOV A, #91H ; Khởi tạo 8255-1 port A 
MOV DPTR, #8003H 
MOV @DPTR, A 
X1 : MOV R7, #00H ; Nạp địa chỉ để chọn kênh quét 
X2: LCALL CLEAR ; Gọi chương trình xóa 
 LCALL DISPLAY – 1 ; Hiển thị số kênh chọn ở LED 
 LCALL CHUYENDOI ; Gọi chương trình chuyển đổi 
 LCALL OUT ; Gọi chương trình xuất ra D/A 
 LCALL HEX – BCD ; Gọi chương trình chuyển số hex sang 
BCD 
 LCALL DECODE ; Gọi chương trình giải mã 7 đoạn 
 LCALL DISPLAY – 2 ; Gọi chương trình hiển thị dữ liệu vừa 
chuyển đổi 
 LCALL DELAY ; Gọi chương trình delay 
 MOV DPTR, #8002 ; Kiểm tra nhấn phím 
 MOV A, @DPTR 
 ANL A, 02H 
 JNZ X2 
INC R7 ; Tăng lên để dò kênh kế 
CJMP 08, X2 ; Kiểm tra đã dò hết kênh chưa 
LJMP X1 ; quay trở lại 
*********************************************************** 
Các chương trình con phục vụ cho chương trình chính 
*********************************************************** 
Chương trình con xóa vùng data hiển thị cho 8 kênh từ 5000h – 507Fh 
ORG 4880H 
MOV DPTR, #5000H ; Dùng ram ngoài để lưu trữ 
MOV A, #00H 
MOV R0, #80H ; Xóa từ 5000h đến 507Fh 
CLE1: MOVX @DPTR, A 
 INC DPTR 
 DJNZ R0, CLE1 
 RET 
*********************************************************** 
Chương trình con thực hiện quá trình chuyển đổi kênh thứ n trong R7 
*********************************************************** 
ORG 4500H 
MOV A, R7 ;Chọn kênh thứ n, ALE =0 
MOV DPTR, A ; Điều khiển quá trình chuyển đổi cho kênh 
thứ n 
ORL A, #10H ; Cho ALE =1 
MOVX @DPTR, A 
ORL A, #20H ; Cho ALE =1, ST =1 
MOVX @DPTR, A 
NOP 
NOP 
NOP 
CLR A ; Cho ALE =0, ST =0 
MOVX @DPTR, A 
; Kiểm tra quá trình chuyển đổi kết thúc hay chưa 
CTC1: MOV DPTR, #PORTC 
 MOVX A, @DPTR 
 ANL A, #01H 
 JZ CTC1 ; Nếu chưa xong thì quay lại 
; Xong quá trình biến đổi bắt đầu nhận dữ liệu 
 MOV DPTR, #PORTA 
 MOVX A,@DPTR 
 RET 
*********************************************************** 
Chương trình hiển thị thứ tự số kênh chọn 
*********************************************************** 
ORG 4100H 
MOV A, #80H ; Chọn vị trí led để hiển thị 
MOV DPTR, C001 
MOVX @DPTR, A 
MOV A, R7 
MOV 83, 43 ; Nạp byte cao địa chỉ chứa mã hiển thị 
MOV 82, A ; Nạp byte thấp địa chỉ chứa mã hiển thị 
MOV A, @DPTR ; Hiển thị ra Led 
MOV DPTR, C000 
MOVX @DPTR, A 
LCALL DELAY 
RET 
*********************************************************** 
Chương trình xuất ra D/A 
*********************************************************** 
ORG 4200H 
MOV R0, A ; Cất dữ liệu vào thanh ghi R0 
MOV A, #80 ; Khởi tạo 8255 – 2 Mode 0 
MOV DPTR, A003 
MOV @DPTR, A 
MOV A, R0 ; Nạp trở lại dữ liệu vào thanh ghi A 
MOV DPTR, A000 ; Xuất dữ liệu ra Port A 
MOV @DPTR, A 
RET 
*********************************************************** 
Chương trình chuyển số HEX sang số BCD 
*********************************************************** 
ORG 4600H 
MOV DPTR, #5008H 
MOV B, #10 ; Nạp 10 vào thanh ghi B 
DIV AB 
MOV R0, A ; Cất tạm A sang R0 
MOV A, B 
MOVX @DPTR, A ; Cất data đơn vị vào 5008H 
INC DPTR ; Tăng lên để lưu hàng chục 
MOV A, R0 ; Lấy lại data hàng chục, hàng trăm 
MOV B, #10 ; Nạp 10 vào thanh ghi B 
DIV AB 
MOV R0, A ; Cất tạm A sang R0 
MOV A, B 
MOVX @DPTR, A ;Cất data hàng chục vào 5009H 
INC DPTR ;Tăng lên để lưu hàng trăm 
MOV A, R0 ;Lấy lại data hàng trăm 
MOVX @DPTR, A ;Cất data hàng trăm vào 500AH 
RET 
*********************************************************** 
Chương trình giải mã 7 đoạn 
*********************************************************** 
ORG 4700H 
MOV R0, #08H ;Quản lý byte địa chỉ thấp 
MOV DPTR, #5000H 
DECO1:PUSH 82 ; Cất DPTR 
 PUSH 83 ;Cất DPTR 
 MOV DPTR, #5000H 
 MOV A, R0 
 MOVC A, @A+DPTR 
 MOV DPTR, #0200H 
 MOVC A, @A+DPTR 
 POP 83H 
 POP 82H 
 MOVX @DPTR, A 
 INC DPTR 
 INC R0 
 CJNE R0, #0BH, DECO1 
 RET 
******************************************************** 
Chương trình hiển thị 
******************************************************** 
ORG 4800H 
 MOV R0, #87H ; Từ điều khiển 8279 
 MOV R1, #00 ; Địa chỉ tương đối vùng data 
DISP: MOV DPTR, #CW79 ; Địa chỉ điều khiển 8279 
 MOV A, R0 
 MOV @DPTR, A 
 MOV DPTR, #5000H 
 MOV A, R1 ;Chuyển địa chỉ tương đối từ R1 sang A 
 MOVC A, @A+DPTR ;Lấy byte dữ liệu 
 MOV DPTR, #DT79 ;Địa chỉ hiển thị 8279 
 MOVX @DPTR, A 
 DEC R0 
 INC R1 
 CJNE R1, #08, DISP 
 RET 
*********************************************************** 
Vùng chứa mã hiển thị kênh chọn tại LED 8 
*********************************************************** 
ORG 4300H 
4300 3F 
4301 06 
4302 5B 
4303 4F 
4304 66 
4305 6D 
4306 7D 
4307 07 
*********************************************************** 
Chương trình con delay 
*********************************************************** 
ORG 488CH 
MOV 7DH, #05H 
DEL3: MOV 7FH, #0A0H 
DEL2: MOV 7EH, #0FFH 
DEL1: DJNZ 7EH, DEL1 
 DJNZ 7FH, DEL2 
DJNZ 7DH, DEL3 
RET 
KẾT LUẬN 
 Sau 6 tuần thực hiện đề tài dưới sự hướng dẫn của thầy Lê Thanh Đạo em 
nhận thấy kiến thức của mình đã được củng cố và mở rộng hơn. Tuy vậy đề tài 
vẫn còn rất nhiều thiếu sót, vì thế em rất mong được sự đóng góp chân thành của 
quý thầy cô để đề tài ngày càng trở nên phong phú và hoàn thiện. 
Ngày 25 Tháng 02 Năm 2000 
Sinh viên thực hiện 
 Nguyễn Vũ Anh Duy 
PHẦN III 
PHỤ LỤC 
TÀI LIỆU THAM KHẢO 
1 –Vi điều khiển trong đo lường và điều khiển 
- Ngô Diên Tập 
2 – Đo lường và điều khiển bằng máy tính 
- Ngô Diên Tập 
3 – Digital system principles and applications 
- Ronald J.Tocci 
4 – Electronic divices and circuits 
- Theodore F.Bogart 
5 – The 8051 Microcontroller 
- I.Scott Mackenzie 
            Các file đính kèm theo tài liệu này:
 ung_dung_kit_8051_dung_de_chuyen_doi_ad_da_0621.pdf ung_dung_kit_8051_dung_de_chuyen_doi_ad_da_0621.pdf