You are on page 1of 109

1.

GIỚI THIỆU
1.1. Lịch sử phát triển
Năm 1971, hãng Intel ñã cho ra ñời bộ vi xử lí (microprocessor) ñầu tiên trên
thế giới tên gọi là Intel-4004, nhằm ñáp ứng nhu cầu cấp thiết của một công ty kinh
doanh là hãng truyền thông BUSICOM. Intel-4004 là kết quả của một ý tưởng
quan trọng trong kỹ thuật vi xử lí số. ðó là một kết cấu logic mà có thể thay ñổi
ñược chức năng của nó bằng chương trình ngoài chứ không phát triển theo hướng
tạo ra một cấu trúc cứng chỉ thực hiện một số chức năng nhất ñịnh như trước ñây.

Sau ñó, các bộ vi xử lí mới liên tục ñược ñưa ra thị trường và ngày càng ñược
phát triển, hoàn thiện hơn trong các thế hệ sau :
+ Cũng vào năm 1971, hãng Intel ñưa ra bộ vi xử lí 8-bit ñầu tiên với tên
Intel-8008.
+ Năm 1975, Intel chế tạo bộ vi xử lí 8-bit 8080 và 8085.
+ Cũng vào khoảng thời gian 1975, một loạt các hãng khác trên thế giới
cũng ñã giới thiệu các bộ vi xử lí tương tự: 6800 của Motorola, 1801 của RCA, kế
ñến là 6502 của hãng MOS Technology và Z80 của hãng Zilog.

Vào năm 1976 Intel giới thiệu bộ vi ñiều khiển (microcontroller) 8748, một
chip tương tự như các bộ vi xử lí và là chip ñầu tiên trong họ vi ñiều khiển MCS-
48. IC này và các IC khác tiếp theo của họ MCS-48 ñã nhanh chóng trở thành
chuẩn công nghiệp trong các ứng dụng hướng ñiều khiển (control-oriented
application).
Số Transistor
Pentum IV
“Prescott 125M”
Pentum IV
(42M) 100.000K
Pentum III
(9.5M)
80486 10.000K
Pentum II
(1.2M)
80386 (7.5M)
1000K
(275K)
80286 100K
8080 (134K)
(6K) 8088 10K
4004
(29K)
(2.3K)

1970 1975 1980 1985 1990 1995 2000 2004

Số tranzitor tích hợp trong chip của bộ vi xử lý Intel


1
ðộ phức tạp, sự gọn nhẹ về kích thước và khả năng của các bộ vi ñiều khiển
ñược tăng thêm một bậc quan trọng vào năm 1980 khi Intel công bố chip 8051, bộ
vi ñiều khiển ñầu tiên của họ vi ñiều khiển MCS-51. Họ 8051 là một trong những
họ vi ñiều khiển 8-bit mạnh và linh hoạt nhất, trở thành bộ vi ñiều khiển hàng ñầu
trong những năm gần ñây.

1.2. Bộ vi xử lý
Viết tắt là MicroProcessor, là hạt nhân của hệ vi xử lý, còn gọi là CPU(Central
Unit Control), nắm quyền kiểm soát các thành phần có trong hệ thống, thực hiện
mọi thao tác liên quan ñến các phép tính toán, xử lý, gia công, biến ñổi các dạng
tín hiệu nhị phân trong hệ dưới sự ñiều khiển của chương trình ñược cài ñặt trong
bộ nhớ trung tâm của hệ vi xử lý.
Bộ vi xử lý thường ñược dùng làm CPU cho các máy tính.
Các bộ vi xử lý thông dụng: Intel 4004 (4 bit), Intel 80x86, Intel 8080, Intel
8085, hä Motorola 680 × 0(68000, 68010, 68020, 68030, 68040 v.v...), Pentium,...

1.3. Vi ñiều khiển


Một bộ vi ñiều khiển là một hệ vi xử lí thật sự ñược tổ chức trong một chip
(trong một vỏ IC) bao gồm một bộ vi xử lí (microprocessor), bộ nhớ chương trình
(ROM), bộ nhớ dữ liệu (RAM) và bộ số học-logic (ALU) cùng với các thanh ghi
chức năng, các cổng vào/ra, cơ chế ñiều khiển ngắt, truyền tin nối tiếp, các bộ ñịnh
thời... Hiện nay, các bộ vi ñiều khiển ñược sử dụng rất rộng rãi trong các ngành
công nghiệp, có mặt trong nhiều máy móc, trong các hàng tiêu dùng.
Các bộ vi ñiều khiển thông dụng: 8051, 89C51, M68HC11, Z80....
Kiến trúc máy tính hay kiến trúc vi ñiều khiển cũng tương tự nhau. Do ñó,
chúng ta có thể tìm hiểu về kiến trúc máy tính, ñể hiểu rõ về kiến trúc vi ñiều
khiển. Hai kiến trúc vi ñiều khiển phổ biến hiện nay, là kiến trúc Von Neumann và
kiến trúc Harvard. Sự khác biệt chủ yếu giữa hai kiến trúc này, chính là việc tổ
chức bộ nhớ dữ liệu và bộ nhớ chương trình. Kiến trúc Von Neumann tổ chức bộ
nhớ dữ liệu và bộ nhớ chương trình chung với nhau, chính vì vậy, ñường truyền
(bus) của kiến trúc Von Neumann là ñường truyền chung. Trong khi ñó, kiến trúc
Harvard tách rời bộ nhớ dữ liệu và bộ nhớ chương trình.
Mỗi kiến trúc này có một lợi ñiểm riêng rẽ khác nhau. Kiến trúc Von Neumann
tận dụng ñược tài nguyên bộ nhớ, trong khi ñó kiến trúc Harvard sẽ ñạt tốc ñộ xử

2
lý cao hơn, mặt khác ñường truyền dữ liệu và ñường truyền lệnh ñiều khiển
(chương trình) có thể có dung lượng khác nhau.
Tuy nhiên, các bộ vi ñiều khiển ñược sử dụng trong các sản phẩm tiêu dùng và
các sản phẩm công nghiệp. Không giống như các hệ máy tính ñược xác ñịnh bởi
khả năng ñược lập trình và ñược tái lập trình của chúng, các bộ vi ñiều khiển ñược
lập trình thường trực cho một công việc.
Các hệ máy tính có tỷ lệ RAM-ROM rất cao sao cho các chương trình của
người sử dụng ñược thực thi trong một không gian RAM tương ñối lớn và các
chương trình giao tiếp với phần cứng ñược thực thi trong một không gian ROM
nhỏ.
Các bộ vi ñiều khiển ngược lại có tỷ số ROM-RAM cao. Chương trình ñiều
khiển tương ñối lớn lưu trong ROM trong khi RAM chỉ ñược sử dụng như bộ nhớ
tạm thời.
Các công việc ñược thực hiện bởi các bộ vi ñiều khiển thì không mới. ðiều mới
là các thiết kế ñược thực hiện với ít thành phần hơn so với các thiết kế trước ñó.
Các thiết kế trước ñó yêu cầu hàng chục thậm chí vài trăm IC ñể hiện thực nay chỉ
cần một ít thành phần trong ñó có bộ vi ñiều khiển.
Vấn ñề ở ñây là tốc ñộ, các giải pháp dựa trên bộ vi ñiều khiển không bao giờ
nhanh bằng các giải pháp dựa trên các thành phần rời rạc.

1.4. So sánh bộ Vi xử lý và bộ Vi ñiều khiển

Data bus
CPU
CPU RAM ROM
General- Serial
Purpose RAM ROM I/O Timer COM
Micro- Port Port
Serial
processo I/O Timer COM
r
Port
Address bus
(a) General-Purpose Microcessor (b) Microcontroller
System

Bộ vi xử lý khác bộ vi ñiều khiển ở 3 ñiểm chính: Cấu trúc phần cứng, các ứng
dụng và ñặc trưng của tập lệnh.

3
(Hệ) Vi xử lý Vi ñiều khiển
1.Cấu trúc phần cứng
- CPU ñơn chip, riêng biệt, các thành - CPU, RAM, ROM, I/O và Timer,... nằm
phần thêm vào là RAM, ROM, I/O, trên cùng một chip, tạo nên một hệ máy
Timer bên ngoài ñể tạo thành một hệ vi tính ñầy ñủ.
xử lý. - Cố ñịnh lượng ROM, RAM, I/O port trên
- Lượng ROM, RAM, I/O, Ports tùy ý chip
2.Các ứng dụng
- Chủ yếu dùng làm CPU trong các hệ - Ứng dụng trong các thiết kế nhỏ, cho các
máy vi tính, xử lý thông tin. ứng dụng hướng ñiều khiển (ñơn mục
- Giá thành cao. ñích). Trong quá khứ các thiết kế như vậy
- ða năng, ña mục ñích yêu cầu hàng chục thậm chí hàng trăm vi
mạch số.
- Giá cả thấp.
- Năng lượng tiêu thụ thấp.
- Kích thước nhỏ, gọn.
3. Tập lệnh
- Các lệnh bao quát, mạnh về các kiểu - Các lệnh cung cấp các ñiều khiển xuất
ñịnh ñịa chỉ với các lệnh cung cấp các nhập. Mạch giao tiếp cho nhiều ngõ nhập
hoạt ñộng trên các lượng dữ liệu lớn. và ngõ xuất chỉ sử dụng một bit.
-Các lệnh có thể hoạt ñộng trên các - Có các mạch bên trong và các lệnh dành
1/2byte, byte, từ, từ kép., cung cấp khả cho thao tác xuất nhập, ñịnh thời sự kiện,
năng truy xuất các dãy dữ liệu lớn bằng cho phép và thiết lập các mức ưu tiên cho
cách sử dụng con trỏ hoặc offset. các ngắt ñược tạo ra bởi kích thích bên
ngoài.
- Các lệnh hầu hết ñược thực thi trên từng
byte. Một tiêu chuẩn thiết kế là chương
trình phải ñặt vừa trong ROM nội vì việc
thêm ROM ngoài sẽ làm tăng giá thành
sản phẩm.

Một nhà thiết kế hệ thống sử dụng một bộ vi xử lý công dụng chung chẳng
hạn như Pentium hay 68040 phải bổ sung thêm RAM , ROM, các cổng vào ra và
các bộ ñịnh thời ngoài ñể làm cho chúng hoạt ñộng ñược. Mặc dù việc bổ xung
RAM, ROM và các cổng vào ra bên ngoài làm cho hệ thống cồng cềnh và ñắt hơn,
nhưng chúng có ưu ñiểm là linh hoạt chẳng hạn như người thiết kế có thể quyết
ñịnh về số lượng RAM, ROM và các cổng vào ra cần thiết phù hợp với bài toán
trong tầm tay của mình.
ðiều này không thể có ñược ñối với các bộ vi ñiều khiển. Một bộ vi ñiều
khiển có một CPU (một bộ vi xử lý) cùng với một lượng cố ñịnh RAM, ROM, các
cổng vào ra và một bộ ñịnh thời tất cả trên cùng một chíp. Hay nói cách khác là bộ

4
xử lý, RAM, ROM các cổng vào ra và bộ ñịnh thời ñều ñược nhúng với nhau trên
một chíp; do vậy người thiết kế không thể bổ xung thêm bộ nhớ ngoài, cổng vào ra
hoặc bộ ñịnh thời cho nó. Số lượng cố ñịnh của RAM, ROM trên chíp và số các
cổng vào - ra trong các bộ vi ñiều khiển làm cho chúng trở nên lý tưởng ñối với
nhiều ứng dụng mà trong ñó giá thành và không gian lại hạn chế. Trong nhiều ứng
dụng, ví dụ một ñiều khiển TV từ xa thì không cần công suất tính toán của bộ vi sử
lý 486 hoặc thậm chí như 8086. Trong rất nhiều ứng dụng thì không gian nó
chiếm, công suất nó tiêu tốn và giá thành trên một ñơn vị là những cân nhắc
nghiêm ngặt hơn nhiều so với công suất tính toán. Những ứng dụng thường yêu
cầu một số thao tác vào - ra ñể ñọc các tín hiệu và tắt - mở những bit nhất ñịnh.
ðiều thú vị là một số nhà sản xuất các bộ vi ñiều khiển ñã ñi xa hơn là tích hợp
cả một bộ chuyển ñổi ADC và các ngoại vi khác vào trong bộ vi ñiều khiển.

1.5. Hệ thống nhúng (Embedded System)


Trong tài liệu về các bộ vi xử lý ta thường thấy khái niệm hệ thống nhúng
(Embeded system). Các bộ vi xử lý và các bộ vi ñiều khiển ñược sử dụng rộng rãi
trong các sản phẩm hệ thống nhúng.
Một sản phẩm nhúng sử dụng một bộ vi xử lý (hoặc một bộ vi ñiều khiển) ñể
thực hiện một nhiệm vụ và chỉ một mà thôi. Hay nói cách khác, bộ vi xử lý (vi ñiều
khiển) ñược nhúng (embedded) vào một ứng dụng cụ thể. Khi ñó, trong ROM chứa
một phần mềm ứng dụng cụ thể.
Một máy in là một ví dụ về một việc nhúng vì bộ xử lý bên trong nó chỉ làm
một việc ñó là nhận dữ liệu và in nó ra. ðiều này khác với một máy tình PC dựa
trên bộ xử lý Pentium (hoặc một PC tương thích với IBM × 86 bất kỳ). Một PC có
thể ñược sử dụng cho một số bất kỳ các trạm dịch vụ in, bộ ñầu cuối kiểm kê nhà
băng, máy chơi trò chơi ñiện tử, trạm dịch vụ mạng hoặc trạm ñầu cuối mạng
Internet. Phần mềm cho các ứng dụng khác nhau có thể ñược nạp và chạy. Tất
nhiên là lý do hiển nhiên ñể một PC thực hiện hàng loạt các công việc là nó có bộ
nhớ RAM và một hệ ñiều hành nạp phần mềm ứng dụng thường ñược ñốt vào
trong ROM. Một máy tính PC × 86 chứa hoặc ñược nối tới các sản phẩm nhúng
khác nhau chẳng hạn như bàn phím, máyin, Modem, bộ ñiều khiển ñĩa, Card âm
thanh, bộ ñiều khiển CD = ROM. Chuột v.v... Một nội ngoại vi này có một bộ vi
ñiều khiển bên trong nó ñể thực hiện chỉ một công việc, ví dụ bên trong mỗi con
chuột có một bộ vi ñiều khiển ñể thực thi công việc tìm vị trí chuột và gửi nó ñến
PC.

5
1.6. Các tiêu chí lựa chọn một bộ vi ñiều khiển
Có 4 bộ vi ñiều khiển 8 bit chính. ðó là M6811 của Motorola, 8051 của
Intel, Z80 của Zilog và Pic 16 × của Microchip Technology.
Mỗi một kiểu loại trên ñây ñều có một tập lệnh và thanh ghi riêng duy nhất,
nên chúng không tương thích lẫn nhau. Cũng có những bộ vi ñiều khiển 16 bit và
32 bit ñược sản xuất bởi các hãng sản xuất chíp khác nhau. Với tất cả những bộ vi
ñiều khiển khác nhau như thế này thì lấy gì làm tiêu chuẩn lựa chọn mà các nhà
thiết kế phải cân nhắc? Có ba tiêu chuẩn ñể lựa chọn các bộ vi ñiều khiển là:
1. ðáp ứng ñược yêu cầu ñiều khiển một cách hiệu quả và kinh tế
+ Tốc ñộ, kiểu ñóng vỏ (40 chân DIP, kiểu dán...), kích thước, công suất tiêu
thụ.
+ Dung lượng bộ nhở ROM và RAM trên chip, số cổng I/O, số bộ ñịnh thời...
+ Khả năng dễ dàng nâng cấp (nâng cao hiệu suất, giảm công suất tiêu thụ).
+ Giá thành.
2. Có sẵn các công cụ phát triển phần mềm: Chẳng hạn như các trình biên
dịch ngôn ngữ C, trình mô phỏng và gỡ rối, ñiều kiện hỗ trợ kỹ thuật.
3. Nguồn cung cấp bộ vi ñiều khiển có nhiều và tin cậy.
1.7 Các bước tìm hiểu, học cách sử dụng vi ñiều khiển
- Tìm hiểu về một họ vi ñiều khiển thông dụng: Các kiến thức cơ bản, tập
lệnh, các thao tác vào ra, ñịnh thời, ngắt, giao tiếp ngoại vi,...
- Tìm hiểu tính năng và sử dụng một con vi ñiều khiển thuộc họ trên:
AT89S8252, AT89C51, AT89S51, AT89C52. Download Datasheet, tìm hiểu các
tài nguyên của nó, cách nạp chương trình.
- Học một ngôn ngữ lập trình: Assembly, C. Sử dụng một phần mềm biên
dịch tạo file *.HEX.
- Lắp một mạch nhỏ trên bo mạch thử: Lúc ñầu chỉ cần một vi ñiều khiển và
dao ñộng, reset,...tối thiểu thành phần cần thiết.
- Lập trình các bài toán ñơn giản ñể nạp cho mạch thực hành:
+ Xuất ra các chân.
+ Nháy ñèn LED.
+ ðịnh thời gian bằng Timer.
+ Bấm một nút, ñèn bật/tắt (nhập port, nhập trên từng chân, dùng ngắt
ngoài).
- Thực hiện các bài toán phức tạp hơn:

6
+ Ghép nối với vi mạch mở rộng ngoại vi 8255.
+ ðiều khiển ñộng cơ bước.
+ Hiển thị LCD.
+ Giao tiếp bàn phím.
+ ðiều khiển ñộng cơ một chiều.
+ Giao tiếp máy tính.

7
2. SƠ ðỒ KHỐI VÀ CHÂN
2.1 S¬ ®å khèi

2.2 So s¸nh c¸c thµnh viªn hä 8051


8031 8051 8751 8951 8052 8752
4K 4K 4K 8K 4K
Bé nhí ch−¬ng tr×nh trªn chip 0K
ROM ROM ROM ROM EPROM
128
Bé nhí d÷ liÖu trªn chip 128 128 128 256 256
Bytes
Bé ®Þnh thêi 2 2 2 2 3 3
Sè ch©n vµo/ra 32 32 32 32 32 32
Cæng nèi tiÕp 1 1 1 1 1 1
Nguån ng¾t 5 5 5 5 6 6

2.3 S¬ ®å ch©n
Chức năng các chân:
32 trong số 40 chân của 8051 có công dụng xuất/nhập, tuy nhiên 24 trong 32
ñường này có 2 mục ñích (công dụng). 32 chân nêu trên hình thành 4 port 8 bit.
* Port 0 (chân 32 ñến 39): Có 2 công dụng: Port xuất/nhập hoặc bus dữ liệu
và bus ñịa chỉ ña hợp (byte thấp của bus ñịa chỉ) cho các thiết kế có bộ nhớ ngoài.

8
* Port 1 (chân từ 1 ñến 8): Chỉ có một công dụng là xuất/nhập, ñể giao tiếp
với các thiết bị ngoại vi.
* Port 2 (chân từ 21 ñến 28): Có 2 công dụng, hoặc làm nhiệm vụ xuất/nhập
hoặc là byte ñịa chỉ cao của bus ñịa chỉ 16-bits cho các thiết kế có bộ nhớ ngoài.

* Port 3 (chân từ 10 ñến 17): Port 3 có hai tác dụng. Nó làm nhiệm vụ như
một cổng xuất nhập thông thường. Khi không hoạt ñộng xuất nhập, mỗi chân của
port 3 ñều có một chức năng riêng.
Bit Tên ðịa chỉ Chức năng
P3.0 RxD B0H Chân nhận dữ liệu của Port nối tiếp
P3.1 TxD B1H Chân phát dữ liệu của Port nối tiếp
P3.2 /INT0 B2H Ngõ vào ngắt ngoài 0
P3.3 /INT1 B3H Ngõ vào ngắt ngoài 1
P3.4 T0 B4H Ngõ vào của bộ ñịnh thời/ñếm 0
P3.5 T1 B5H Ngõ vào của bộ ñịnh thời/ñếm 1
P3.6 /WR B6H ðiều khiển ghi bộ nhớ dữ liệu ngoài
P3.7 /RD B7H ðiều khiển ñọc bộ nhớ dữ liệu ngoài

* Chân cho phép bộ nhớ ngoài /PSEN (chân 29): Chân này thường ñược
nối với chân cho phép xuất /OE (Output Entable) của EPRROM (hoặc của ROM)
ñể cho phép ñọc các byte lệnh. Tín hiệu /PSEN ở lôgic 0 trong suốt thời gian tìm
9
nạp lệnh. Các mã nhị phân của chương trình (opcode) ñược ñọc từ EPROM, qua
bus dữ liệu và ñược chốt vào thanh ghi lệnh IE của 8051 ñể ñược giải mã. Khi
thực thi một chương trình trong ROM nội, /PSEN ở lôgic 1 (logic không tích cực).
* Chân cho phép chốt ñịa chỉ ALE (chân 30):
Là tín hiệu xuất ra ñể giải ña hợp bus ñịa chỉ và bus dữ liệu. Trong 1/2 chu kỳ
ñầu bộ nhớ, chân ALE xuất tín hiệu ñể chốt ñịa chỉ (byte thấp của bus ñịa chỉ 16
bit) vào thanh ghi ngoài khi ta sử dụng port 0 làm byte thấp ñịa chỉ. Trong 1/2 chu
kỳ bộ nhớ còn lại port 0 sẽ xuất/nhập dữ liệu. Tín hiệu ALE có tần số bằng 1/2 tần
số của mạch dao ñộng bên trong chip vi ñiều khiển và có thể làm xung clock cho
các phần còn lại của hệ thống (trường hợp ngoại lệ khi thực hiện lệnh MOVX, 1
xung ALE sẽ bị bỏ qua). Chân ALE còn ñược dùng ñể nhập xung ngõ vào lập trình
cho EPROM hoặc Flash ROM ñối với chip có loại ROM này.
* Chân truy xuất ngoài /EA (chân 31):
Chân này ñược nối lên 5V khi thực thi chương trình trong ROM nội. Chân
này ñược nối ñất khi thực thi chương trình bộ nhớ ngoài. Chú ý ñối với các chip
không có ROM nội /EA phải ñược nối ñất. Các chip họ 8051 có EPROM còn nhận
chân /ALE làm chân nhận ñiện áp cấp ñiện 12V cho việc lập trình EPROM nội.
* Chân RESET (RST) (Chân 9): Dùng ñể thiết lập lại trạng thái ban ñầu của
hệ thống hay gọi tắt là reset hệ thống khi ñược treo ở mức logic 1 ít nhất 2 chu kỳ
máy. Các thanh ghi bên trong của 8051 ñược nạp các giá trị thích hợp cho việc
khởi ñộng lại hệ thống.
* Các chân XTAL1 và XTAL2 (chân 18 và chân 19):
Mạch dao ñộng bên trong chip 8051 ñược ghép với thạch anh bên ngoài ở 2
chân XTAL1 và XTAL2. Thường tần số là 12MHz và các tụ ổn ñịnh có giá trị
trong khoảng 30pF ÷ 33 pF.

10
3. TỔ CHỨC BỘ NHỚ

CÁC THANH GHI


Thanh ghi của 8051 dùng ñể lưu trữ dữ liệu hoặc ñịa chỉ. Các thanh ghi của
8051 có kích thước 8 bit và 8051 chỉ có một kiểu dữ liệu 8 bit, 8 bit của thanh ghi
ñược sắp xếp như hình dưới:
D7 D6 D5 D4 D3 D2 D1 D0

D7: MSB - Bit có trọng số cao nhất.


D0: LSB - Bit có trọng số thấp nhất.
Vì chỉ có một kiểu dữ liệu 8 bit, nên mọi dữ liệu lớn hơn 8 bit trước khi xử lý
ñều ñược chia thành các phần 8 bit.
Bộ nhớ: Là một tập các thanh ghi. Bộ nhớ có 2 loại: RAM - Bộ nhớ dữ liệu và
ROM - Bộ nhớ chương trình.
Chip 8051 có không gian bộ nhớ riêng cho chương trình và dữ liệu. Cả bộ nhớ
chương trình và bộ nhớ dữ liệu ñều nằm trong chip. Tuy nhiên ta có thể mở rộng
bộ nhớ chương trình và bộ nhớ dữ liệu bằng cách sử dụng các chip nhớ bên ngoài
với dung lượng tối ña là 64K cho bộ nhớ chương trình và 64K cho bộ nhớ dữ liệu.
3.1 Không gian bộ nhớ nội

11
Không gian bộ nhớ nội của 8051 bao gồm: RAM và ROM.
+ RAM nội bao gồm:
- Các dãy (bank) thanh ghi: 00H ÷ 1FH
- Vùng RAM ñịnh ñịa chỉ bit: 20H ÷ 2FH
- Vùng RAM ña mục ñích (ña chức năng): 30H ÷ 7FH
- Các thanh ghi chức năng ñặc biệt (SFR): 80H ÷ FFH
* Có 2 ñặc tính ñáng ghi nhớ là:
+ Các thanh ghi và các port xuất/nhập ñược ñịnh ñịa chỉ theo kiểu ánh xạ bộ
nhớ (memory mapped) và ñược truy xuất như một vị trí trong bộ nhớ.
+ Vùng stack thường trú trong RAM trên chip (RAM nội) thay vì ở trong
RAM ngoài như ñối với các bộ vi xử lý.
3.2 Các dãy thanh ghi
32 vị trí thấp nhất của bộ nhớ chứa các dãy thanh ghi.
- Các lệnh sử dụng các thanh ghi R0 cho ñến R7 trong dãy thanh ghi là những
lệnh ngắn và thực hiện nhanh hơn so với các lệnh tương ñương sử dụng kiểu ñịnh
ñịa chỉ trực tiếp.
VD: MOV A,R5; 1 byte
MOV A,05H; 2 byte
- Các giá trị dữ liệu thường ñược sử dụng nên ñược chứa ở các thanh ghi này.
- Dãy thanh ghi ñang ñược sử dụng ñược gọi là dãy thanh ghi tích cực. Dãy
thanh ghi tích cực có thể ñược thay ñổi bằng cách thay ñổi các bit chọn trong từ
trạng thái chương trình PSW.
3.3 Vùng RAM ñịnh ñịa chỉ bit
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 (16byte x 8bit = 128bit) và phần còn lại chứa trong các
thanh ghi chức năng ñặc biệt.
Truy xuất các bit riêng rẽ thông qua phần mềm là một ñặc trưng mạnh của hầu
hết các bộ VðK. Các bit có thể ñược set, xóa, AND, OR,... chỉ bằng một lệnh so
với một chuỗi lệnh của VXL.
VD:
VðK: SETB 7FH; //Set bit có ñịa chỉ 7FH bằng 1
VXL: ...
MOV A,2FH; //ðọc cả byte
ORL A,#10000000B; // Set bit
MOV 2FH,A; //Ghi trở lại cả byte

12
3.4 Vùng RAM ña mục ñích
Gồm có 80 bytes ñặt ở ñịa chỉ từ 30H ñến 7FH. Bất kỳ vị trí nhớ nào trong
vùng ña mục ñích ñều có thể ñược truy xuất bằng cách dùng các kiểu ñịnh ñịa chỉ
trực tiếp hoặc gián tiếp.
Ví dụ: + MOV A,5FH; //ðọc nội dung tại ñịa chỉ 5FH của RAM nội vào
thanh ghi chứa A. Kiểu ñịnh ñịa chỉ trực tiếp.
+ MOV R0,#5FH; //Gán cho thanh ghi R0 giá trị 5FH
MOV A,@R0; //ðọc nội dung tại ñịa chỉ ñược chứa trong R0 vào
thanh ghi A. Thanh ghi R0 làm nhiệm vụ là con trỏ dữ liệu.

13
4. CÁC THANH GHI CHỨC NĂNG ðẶC BIỆT (SFR)

Các 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.
Hầu hết các thanh ghi chức năng ñặc biệt ñược truy xuất bằng kiểu ñịnh ñịa chỉ
trực tiếp, một số SFR ñược ñịnh ñịa chỉ từng bit và ñịnh ñịa chỉ từng byte.
+ Các thanh ghi của CPU:
- ACC : Accumulator.
-B : B Register
- PSW : Program Status Word.
- SP : Stack Pointer.
- DPTR : Data Pointer (DHL, DPL).
+ Các thanh ghi ñiều khiển ngắt:
- IE : Interrupt Enable (Cho phép ngắt).
- IP : Interrupt Priority.
+ Các cổng vào/ra:
- P0, P1, P2, P3.
+ ðiều khiển bộ ñịnh thời:
- TMOD : Timer Mode (Chọn mode ñịnh thời).
- TCON : Timer Control (ðiều khiển ñịnh thời).
- TH0 : Timer 0 hight byte (Byte cao của bộ ñịnh thời 0).
- TL0 : Timer 0 low byte (Byte thấp của bộ ñịnh thời 0).
- TH1 : Timer 1 hight byte (Byte cao của bộ ñịnh thời 1).
- TL1 : Timer 1 low byte (Byte thấp của bộ ñịnh thời 1).
+ ðiều khiển các hoạt ñộng nối tiếp:
- SCON : Serial Port Control.
- SBUF : Serial Data Register.
14
+ Thanh ghi ñiều khiển nguồn:
- PCON : Power Control.
4.1 Thanh ghi PSW

Thanh ghi từ trạng thái chương trình, hay còn gọi là thanh ghi cờ. PSW có 8
bit nhưng chỉ có 6 bit ñược 8051 sử dụng. Trong ñó 4 trong số các cờ là cờ ñiều
kiện, nghĩa là chúng báo một số ñiều kiện ñược thiết lập do kết quả thực hiện một
lệnh. Bốn cờ này là: Cờ nhớ CY (Carry), Cờ phụ AC (Auxiliary Carry), cờ chẵn lẻ
P (parity) và cờ tràn OV (Over Flow).

Ký hiệu Chức năng Vị trí


CY Cờ nhớ PSW.7
AC Cờ nhớ phụ PSW.6
F0 Cờ 0 (Flag Zero) dùng cho ña mục ñích PSW.5
RS1 Bit chọn Bank thanh ghi (Bit 1) PSW.4
RS0 Bit chọn Bank thanh ghi (Bit 0) PSW.3
OV Cờ tràn PSW.2
USR Cờ dự trữ ( dành cho người sử dụng) PSW.1
P Cờ kiểm tra chẵn lẻ PSW.0

* CỜ NHỚ - CARRY FLAG


- ðược set bằng 1 nếu có số nhớ từ phép cộng bit D7 hay có số mượn mang ñến
bit 7, là kết quả của phép cộng hoặc trừ 8 bit.
Ví dụ:
MOV A,#FFH
ADD A,#1; Chắc chắn là có tràn
- Còn ñược dùng như một thanh ghi 1 bit ñối với các lệnh logic thao tác trên các
bit.
Ví dụ:
ANL C,25H
- Có thể thiết lập trực tiếp CY lên 1 hoặc xóa về 0: "SETB C" và "CLR C".

* CỜ NHỚ PHỤ - AUXILIARY FLAG


- Baod có nhớ từ bit D3 sang bit D4 ở phép cộng hoặc trừ 8 bit.

15
* RS0, RS 1 - REGISTERS SELECT
- Dùng ñể xác ñịnh dãy thanh ghi tích cực.
- Chúng ñược xóa khi Reset.
* CỜ TRÀN - OV
- ðược set bằng 1 sau phép toán cộng hoặc trừ nếu có xuất hiện một tràn số
học. Khi các số có dấu cộng hoặc trừ, phần mềm có thể kiểm tra bit tràn OV ñể xác
ñịnh kết quả có nằm trong tầm hay không.
- Với các số có dấu, kết quả nhỏ hơn -128 hoặc lớn hơn +127 sẽ set cờ tràn OV
= 1. Với các số không dấu, OV = 1 khi kết quả vượt quá 255.
Ví dụ:
0F thập phân 15
+ 7F + 127
------- ---------
8E 142
Kết quả 8EH biểu diễn số -114 không ñúng với kết quả mong muốn là 142 nên
sẽ set OV = 1.
* CỜ KIỂM TRA CHẴN LẺ - PARITY
- Kiểm tra chẵn lẻ cho thanh chứa A. Phản ánh số bit 1 trong thanh ghi A là
chẵn hay lẻ. Nếu thanh ghi A chứa một số chẵn các bit 1 thì P = 0, còn chứa một
số lẻ các bit 1 thì P = 1.
- Số các bit trong thanh chứa A cộng với bit P luôn luôn là một số chẵn.
- Bit chẵn lẻ ñược sử dụng kết hợp với các chương trình xuất/nhập nối tiếp
trước khi truyền dữ liệu hoặc ñể kiểm tra chẵn lẻ sau khi nhận dữ liệu.
VÍ DỤ

MOV A,#88H MOV A,#9CH


ADD A,#93H ADD A,#64H

88 10001000 9C 10011100
+ 93 + 10010011 + 64 + 01100100
------- --------------- -------- -------------
11B 00011011 100 00000000

C = 1 vì có nhờ từ D7 C = 1 vì có nhờ từ D7
AC = 0 vì ko có nhớ từ D3 sang D4 AC = 1 vì có nhớ từ D3 sang D4
P = 0 vì số bit 1 trong A là 4 (chẵn) P = 0 vì số bit 1 trong A là 0 (chẵn)

16
MOV A,#38H MOV A,#FFH
ADD A,#2FH ADD A,#1

38 00111000
+ 2F + 00101111
------- ---------------
67 01100111 A = 00H, C = 1, AC = 1

C = 0 vì ko có nhờ từ D7
AC = 1 vì có nhớ từ D3 sang D4
P = 1 vì số bit 1 trong A là 5 (lẻ)

Các lệnh ảnh hưởng ñến các bit cờ


Lệnh CY OV AC
ADD X X X
ADDC X X X
SUBB X X X
MUL 0 X
DIV 0 X
DA X
RRC X
RLC X
SETB C 1
CLR C 0
ANL C,bit X
ANI C,bit X
ORL C,bit X
MOV C,bit X
CJNE X

X : Có thể là 0 hoặc 1.
4.2 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.

MUL AB ; Nhân 2 số 8-bit không dấu chứa trong A&B, kết quả 16-bit
chứa
vào cặp thanh ghi B:A (A chứa byte thấp và B chứa byte
cao).
DIV AB ; Chia A bởi B, thương số cất trong A và số dư cất trong B.
- Thanh ghi B còn ñược xử lý như một thanh ghi nháp.

17
4.3 Con trỏ Stack
Ngăn xếp là một vùng của bộ nhớ RAM ñược CPU sử dụng ñể lưu thông tin
tạm thời. Thông tin này có thể là dữ liệu hoặc ñịa chỉ. CPU cần không gian lưu trữ
này vì số các thanh ghi bị hạn chế.
Thanh ghi ñược dùng ñể trỏ ñến ngăn xếp gọi là con trỏ ngăn xếp SP (Stack
Pointer). Con trỏ ngăn xếp rộng 8 bit, tức là có thể trỏ các ñịa chỉ từ 00H ñến FFH.
- Stack pointer chứa ñịa chỉ của dữ liệu hiện ñang ở ñỉnh stack.
- Các lệnh liên quan ñến stack bao gồm lệnh cất dữ liệu vào stack (làm tăng SP
trước khi ghi dữ liệu) và lệnh lấy dữ liệu khỏi Stack (giảm stack).
- 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 bởi kiểu ñịnh ñịa chỉ gián tiếp. Nếu ta khởi ñộng SP ñể bắt ñầu vùng
Stack ở ñịa chỉ 60H bằng lệnh:
MOV SP,#5FH
thì vùng stack ñược giới hạn là 32 byte trên 8051 vì ñịa chỉ cao nhất của RAM
trên chip là 7FH.
- Nếu ta không khởi ñộng stack, nội dung mặc ñịnh của thanh ghi này là 07H
khi ñược cấp nguồn nhằm duy trì sự tương thích với 8048. => Thao tác cất vào
stack ñầu tiên sẽ lưu dữ liệu vào vị trí nhớ có ñịa chỉ 08H (vì SP tăng lên 1 trước
khi thao tác cất vào stack ñầu tiên ñược thực thi).
Như vậy, nếu phần mềm ứng dụng không khởi ñộng SP, dãy thanh ghi 1 (và có
lẽ 2,3) không còn hợp lệ vì vùng này ñược sử dụng làm stack.
- Mỗi lần lưu thanh ghi vào ngăn xếp ñược gọi là cất và lệnh tương ứng là
PUSH, còn ngược lại, mỗi lần nạp nội dung ngăn xếp trở lại thanh ghi ñược gọi là
lệnh lấy ra và lệnh tương ứng là POP.
- 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 bộ ñếm chương trình PC (Program Counter) từ
stack.

CẤT THANH GHI VÀO NGĂN XẾP


Ở 8051 con trỏ ngăn xếp luôn trỏ ñến ngăn nhớ sử dụng cuối cùng (gọi là ñỉnh
ngăn xếp). Khi cất dữ liệu vào ngăn xếp thì con trỏ ngăn xếp SP ñược tăng lên 1.
Mỗi khi lệnh PUSH ñược thực hiện thì nội dung của thanh ghi ñược cất vào ngăn
xếp và SP ñược tăng lên 1
Bài tập:
Hãy xác ñịnh ngăn xếp và con trỏ ngăn xếp ở ñoạn chương trình sau. Giả thiết
vùng ngăn xếp là vùng mặc ñịnh.
mov R6,#25H
mov R1,#12H
mov R4,#0F3H
Push 6
push 1
push 4
end
(Vào View, chọn Memory Window ñể xem nội dung bộ nhớ)

18
Chạy mô phỏng từng bước một trên phần mềm Keil ñể thấy ñược sự thay ñổi
của các nội dung thanh ghi R6, R1, R4 và các giá trị ñó lần lượt cất vào Stack bắt
ñầu từ ñịa chỉ 80H
Bắt ñầu cất Sau PUSH 6 Sau PUSH 1 Sau PUSH 4
0B 0B 0B 0B
0A 0A 0A 0A F3
09 09 09 12 09 12
08 08 25 08 25 08 25
SP = 07 SP = 08 SP = 09 SP = 0A

LẤY NỘI DUNG TỪ NGĂN XẾP


Lấy nội dung ra từ ngăn xếp trở lại thanh ghi là quá trình ngược với cất nội
dung thanh ghi vào ngăn xếp. Mỗi lần lấy ra thì byte trên ñỉnh ngăn xếp ñược sao
chép vào thanh ghi ñược xác ñịnh trong lệnh và con trỏ ngăn xếp giảm xuống 1.
Bài tập:
Khảo sát ngăn xếp và xác ñịnh nội dung của các thanh ghi và SP sau khi thực
hiện ñoạn chương trình sau ñây (tiếp theo ví dụ trên):
mov R6,#25H
mov R1,#12H
mov R4,#0F3H
Push 6
push 1
push 4
POP 3
POP 5
19
POP 2
end

Bắt ñầu lấy Sau POP 3 Sau POP 5 Sau POP 2


0B
0A F3 R5 R5 12 R5 12
09 12 R3 F3 R3 F3 R3 F3
08 25 R2 R2 R2 25
SP = 0A SP = 09 SP = 08 SP = 07
Chạy mô phỏng trên Keil từng bước ñể xem kết quả thực hiện lệnh

GIỚI HẠN TRÊN CỦA NGĂN XẾP


Các ngăn nhớ của RAM từ 08 ñến 1FH có thể ñược dùng làm ngăn xếp. Và khi
ñó, các ngăn nhở RAM từ 20H ñến 2FH dành cho bộ nhớ ñịnh ñịa chỉ bit và không
thể dùng làm ngăn xếp. Nếu trong một chương trình cần có ngăn xếp lớn hơn 24
byte (08 ñến 1FH = 24 byte) thì ta có thể ñổi SP ñể trỏ ñến các ngăn nhớ có ñịa chỉ
từ 30H ñến 7FH bằng lệnh: MOV SP,#xxH.

4.4 Con trỏ dữ liệu DPTR


Data Pointer là một thanh ghi 16-bit, có ñịa chỉ 82H, ñược dùng ñể truy xuất bộ
nhớ chương trình ngoài hoặc bộ nhớ dữ liệu ngoài.
VD:
MOV A,#55H
MOV DPTR,#1000H
MOVX @DPTR,A

83H: DPH (10); 82H: DPL (00)

4.5 Các thanh ghi Port


- P0: 80H; P1: 90H; P2: A0H; P3: 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.
VD:
SETB P1.2; làm ñộng cơ chạy.
CLR P1.2; làm ñộng cơ ngưng.

4.6 Các thanh ghi ñịnh thời


- 8051 có 2 bộ ñếm/ñịnh thời (timer/counter) 16-bit ñể ñịnh các khoảng thời
gian hoặc ñếm các sự kiện.
- 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ỉ 89H và thanh ghi ñiều khiển ñịnh thời
TCON (Timer Control Register) ở ñịa chỉ 88H.

20
4.7 Các thanh ghi của port nối tiếp
- Bên trong 8051 có một port nối tiếp ñể truyền thông với các thiết bị nối tiếp
như các thiết bị ñầu cuối hoặc Modem, hoặc ñể giao tiếp với các IC khác có mạch
giao tiếp nối tiếp.
- Thanh ghi SBUF (Serial Data Buffer): ðịa chỉ 99H, ñược gọi là bộ ñệm dữ
liệu nối tiếp, lưu giữ dữ liệu truyền ñi và dữ liệu nhận về.
- Thanh ghi SCON (Serial Port Control): ðịa chỉ 98H, ñiều khiển chọn các chế
ñộ hoạt ñộng khác nhau của port nối tiếp. Thanh ghi này ñược ñịnh ñịa chỉ từng
bit.
4.8 Các thanh ghi ngắt
- 8051 có một cấu trúc ngắt với 2 mức ưu tiên ngắt và 5 nguyên nhân ngắt.
- Thanh ghi cho phép ngắt IE (Interrupt Enable): ñịa chỉ A8H. Các ngắt bị vô
hiệu hóa sau khi Reset hệ thống và sau ñó ñược cho phép bằng cách ghi vào thanh
ghi IE.
- Mức ưu tiên ngắt ñược thiết lập qua thanh ghi ưu tiên ngắt IP (Interrupt
Priority) ở ñịa chỉ B8H.
- Cả 2 thanh ghi này ñều ñược ñịnh ñịa chỉ từng bit.
4.9 Thanh ghi ñiều khiển nguồn
- PCON: ðịa chỉ 87H, chứa các bit ñiều khiển ñược tóm tắt trong bảng sau.
Bit Ký hiệu Mô tả
Bit tăng gấp ñôi tốc ñộ Baud, bit này khi set
PCON.7 SMOD làm cho tốc ñộ baud tăng 2 lần ở các chế ñộ 1,2
và 3 của port nối tiếp.
PCON.6 - Không ñịnh nghĩa
PCON.5 - Không ñịnh nghĩa
PCON.4 - Không ñịnh nghĩa
PCON.3 GF1 Bit cờ ña mục ñích 1
PCON.2 GF0 Bit cờ ña mục ñích 0
Thiết lập chế ñộ nguồn giảm (Power Down),
PCON.1 PD
chỉ ra khỏi chế ñộ bằng hoạt ñộng Reset.
Thiết lập chế ñộ nghỉ (Idle Mode), chỉ ra khỏi
PCON.0 IDL
chế ñộ bằng một ngắt hoặc reset.

21
5. DAO ðỘNG VÀ HOẠT ðỘNG RESET
5.1 Dao ñộng
Họ 8051 có một bộ dao ñộng trên chip nhưng vẫn cần có một ñồng hồ ở bên
ngoài ñể kích hoạt. Bộ dao ñộng thạch anh bên ngoài ñược nối tới các chân vào
XTAL1 (chân 19) và XTAL2 (chân 18). Khi mắc dao ñộng thạch anh, phải có 2 tụ
ñiện 30pF, một ñầu nối tới XTAL1 và XTAL2, ñầu kia nối ñất.

C2
XTAL2 XTAL2
NC

C1 EXTERRNAL
XTAL1 OSCILLATAO XTAL1
30pF R

GND GND

Họ 8051 có nhiều phiên bản tốc ñộ khác nhau. Tốc ñộ ñược hiểu là tần số cực
ñại của bộ dao ñộng nối tới chân XTAL, ví dụ, chip 24MHz, 12MHz,... Mạch dao
ñộng bên ngoài không nhất thiết là bộ dao ñộng thạch anh mà cũng có thể dùng bộ
dao ñộng TTL. Khi ñó bộ dao ñộng ñược nối tới chân XTAL1, còn chân XTAL2
ñể hở.
Thường ñược sử dụng nhất là bộ dao ñộng thạch anh tần số 11,0592MHz nhằm
tương thích với cổng nối tiếp của IBM PC.

5.2 Hoạt ñộng Reset


Chân RST là chân vào số 9, mức tích cực cao, bình thường ở mức thấp.Khi có
xung tích cực cao ñặt tới chân này thì bộ vi ñiều khiển sẽ kết thúc mọi hoạt ñộng
hiện tại và tiến hành khởi ñộng lại. Khi Reset, trạng thái của tất cả các thanh ghi bị
xóa và ñược nạp lại giá trị ban ñầu như bảng sau. Trong ñó, quan trọng nhất là bộ
ñếm chương trình PC ñược nạp lại giá trị 0000H, tức là µC quay về thực hiện lệnh
ñầu tiên bắt ñầu từ ñịa chỉ này.
Hoạt ñộng Reset của 8051 ñược thực hiện bằng cách giữ chân RST ở mức cao
tối thiểu 2 chu kỳ máy và sau ñó chuyển về mức thấp.

22
23
J2A
0
J1 J3 13
12 25
GND 1 1 11 24
P1.6(MISO) 2 2 10 23
P1.7(SCK) 3 3 9 22
P1.5(MOSI) 4 4 8 21
RESET 5 5 7 20
6 19
5 18
4 17
3 16
2 15
1 14

1,5K
PRINTER PORT

+5V +5V

U1 +5V
1K 1 40
2 P1.0/T2 VCC
3 P1.1/T2-EX 39
1K
4 P1.2 P0.0/AD0 38
5 P1.3 P0.1/AD1 37
6 P1.4/SS P0.2/AD2 36
7 P1.5/MOSI P0.3/AD3 35
8 P1.6/MISO P0.4/AD4 34
P1.7/SCK P0.5/AD5 33
9 P0.6/AD6 32
RST P0.7/AD7
10 31 +5V
+5V 11 P3.0/RXD EA/VPP
12 P3.1/TXD 30
13 P3.2/INT0 ALE/PROG
14 P3.3/INT1 29
15 P3.4/T0 PSEN
16 P3.5/T1 28
C3 SW1 17 P3.6/WR P2.7/A15 27
P3.7/RD P2.6/A14 26
10uF 18 P2.5/A13 25
1K XTAL2 P2.4/A12 24
19 P2.3/A11 23
+5V XTAL1 P2.2/A10 22
20 P2.1/A9 21
GND P2.0/A8
R46
1K
10K AT89S8252
Y1 +5V
0

0
12MHz

C2 C1
30pF 30pF

0 0

24
6. HOẠT ðỘNG TÌM NẠP LỆNH CỦA CPU
Một chương trình hợp ngữ bao gồm một chuỗi các dòng lệnh hợp ngữ.
CPU, trái tim của hệ máy tính, quản lý tất cả các thao tác trên dữ liệu. Hầu hết
các CPU chỉ bao gồm một tập các mạch logic thực hiện liên tục hai thao tác: tìm
nạp lệnh và thực thi lệnh.
CPU có khả năng hiểu và thực thi các lệnh dựa trên một tập các mã nhị phân,
gọi là tập lệnh. Mỗi một mã nhị phân biểu diễn một thao tác ñơn giản.
Bên trong CPU bao gồm:
+ Một tập các thanh ghi (Register): Có nhiệm vụ lưu giữ tạm thời các thông
tin.
+ Một ñơn vị số học ALU (Arithmetic-logic unit): Có nhiệm vụ thao tác trên
các thông tin.
+ Một ñơn vị giải mã và ñiều khiển (Instruction decode and control unit): Có
nhiệm vụ xác ñịnh các thao tác cần thực hiện và thiết lập các hoạt ñộng cần thiết ñể
thực hiện thao tác.
+ Thanh ghi lệnh (Instruction Register): Lưu giữ mã nhị phân của lệnh ñể
ñược thực thi.
+ Bộ ñếm chương trình PC (Program Counter): Lưu giữ ñịa chỉ của lệnh kế
tiếp trong bộ nhớ cần ñược thực thi. Mỗi khi CPU nhận mã lệnh từ bộ nhớ ROM,
thì bộ nhớ chương trình ñược tăng lên 1 ñể trỏ ñến lệnh kế tiếp. Bộ ñếm chương
trình của 8051 rộng 16 bit, ñiều ñó có nghĩa là 8051 có thể truy cập ñược ñịa chỉ
chương trình từ 0000 ñến FFFFH, tổng cộng có 64KByte.

25
Các bước CPU tìm nạp lệnh ñược thực hiện theo thứ tự sau:
1- Nội dung của PC ñược ñặt lên bus ñịa chỉ.
2- Tín hiệu ñiều khiển READ chuyển sang trạng thái tích cực.
3- Dữ liệu (Opcode của lệnh) ñược ñọc từ ROM (RAM) và ñưa lên bus dữ
liệu.
4- Opcode ñược chốt vào thanh ghi lệnh bên trong CPU.
5- PC ñược tăng ñể chuẩn bị tìm nạp lệnh kế tiếp từ bộ nhớ.

26
Giai ñoạn thực thi lệnh bao gồm việc giải mã opcode và tạo ra các tín hiệu ñiều
khiển. Các tín hiệu này ñiều khiển việc xuất nhập giữa các thanh ghi nội với ALU
và thông báo ñể ALU thực hiện các thao tác ñã ñược xác ñịnh.
Một chuỗi các lệnh ñược kết hợp ñể thực hiện một công việc có ý nghĩa gọi là
một chương trình (program) hay phần mềm (software). Mức ñộ mà những công
việc ñược thực hiện ñúng và có hiệu quả phần lớn ñược xác ñịnh bởi chất lượng
của phần mềm, không phải bởi sự phức tạp của CPU.

* CÁC BUS: ðỊA CHỈ, DỮ LIỆU VÀ ðIỀU KHIỂN


- Một bus là một tập các dây mang thông tin có cùng một mục ñích. Việc truy
xuất tới một mạch xung quanh CPU sử dụng ba bus: Bus ñịa chỉ, bus dữ liệu và
bus ñiều khiển.
- Với mỗi thao tác ñọc hoặc ghi, CPU xác ñịnh rõ vị trí của dữ liệu (hoặc lệnh)
bằng cách:
+ ðặt một ñịa chỉ lên bus ñịa chỉ.
+ Sau ñó tích cực một tín hiệu trên bus ñiều khiển ñể chỉ ra thao tác là ñọc
hay ghi.
+ Thao tác ñọc lấy một byte dữ liệu từ bộ nhớ ở vị trí ñã xác ñịnh và ñặt byte
này lên bus dữ liệu. CPU ñọc dữ liệu và ñặt dữ liệu vào một trong các thanh ghi
nội của CPU.
+ Với thao tác ghi, CPU xuất dữ liệu lên bus dữ liệu. Nhờ vào tín hiệu ñiều
khiển, bộ nhớ nhận biết ñây là thao tác ghi và lưu dữ liệu vào vị trí ñã xác ñịnh.

27
7. CÁC MODE ðỊNH ðỊA CHỈ
- Khi một lệnh ñược thực thi và lệnh này yêu cầu dữ liệu, một câu hỏi ñược ñặt
ra là "Dữ liệu chứa ở ñâu?" Câu trả lời cho câu hỏi này tạo ra các kiểu (mode) ñịnh
ñịa chỉ của 8051.
- Các kiểu ñịnh ñịa chỉ là phần cần thiết cho toàn bộ tập lệnh của mỗi một bộ vi
xử lý, bộ vi ñiều khiển. Các kiểu ñịnh ñịa chỉ cho phép ta xác ñịnh rõ nguồn và
ñích của dữ liệu theo nhiều cách khác nhau phụ thuộc vào tình huống lập trình.
- Có 8 kiểu ñịnh ñịa chỉ:
+ Thanh ghi (Register).
+ Trực tiếp (Direct).
+ Gián tiếp qua thanh ghi (Indirect).
+ Tức thời (Immediate).
+ Tương ñối (Relative).
+ Tuyệt ñối (Absolute).
+ Dài (Long).
+ Chỉ số (Indexed).

6.1 ðịnh ñịa chỉ thanh ghi


Người lập trình 8051 có thể truy xuất 8 thanh ghi làm việc ñược ñánh số từ R0
ñến R7. Có 4 dãy thanh ghi "làm việc" nhưng ở một thời ñiểm chỉ có một dãy tích
cực. Các dãy thanh ghi chiếm 32 bytes ñầu tiên của RAM dữ liệu trên chip (từ ñịa
chỉ 00H ñến 1FH) và ta dùng bit 3 và 4 của từ trạng thái chương trình PSW ñể chỉ
ra dãy thanh ghi tích cực.
Hợp ngữ của 8051 chỉ ra kiểu ñịnh ñịa chỉ thanh ghi bằng ký hiệu Rn, trong ñó
n có giá trị từ 0 ñến 7.
VD: ADD A,R7.

6.2 ðịnh ñịa chỉ trực tiếp


Như ñã nói, trong 8051 có 128byte bộ nhớ RAM, ñược gán ñịa chỉ từ 00H ñến
FFH và ñược phân chia:
- 00H ñến 1FH: Gán cho các bank thanh ghi và ngăn xếp.
- 20H ñến 2FH: Không gian dành cho ñịnh dữ liệu từng bit.
- 30H ñến 7FH: Vùng RAM ña mục ñích.
- Từ 80H ñến FFH: Các thanh ghi chức năng ñặc biệt.

28
80H ÷ FFH FSR

30H ÷ 7FH General purpose RAM

Bit addressable locations


20H ÷ 2FH
Register banks and default
00H ÷ 1FH Stack

- ðịa chỉ của dữ liệu ñược chỉ ra trực tiếp trong lệnh.
- Chế ñộ ñịnh ñịa chỉ trực tiếp có thể dùng ñể truy cập toàn bộ không gian của
bộ nhớ trong RAM. Tuy nhiên, thực tế chế ñộ này thường ñược dùng ñể truy cập
các ngăn nhớ RAM từ ñịa chỉ 30H ñến 7FH.
6.3 ðịnh ñịa chỉ gián tiếp
- Làm cách nào nhận biết một biến khi ñịa chỉ của biến ñã ñược xác ñịnh, ñược
tính toán hoặc ñược sửa ñổi trong khi một chương trình ñang chạy? Tình huống
này phát sinh khi ta quản lý các vị trí nhớ liên tiếp, các ñiểm nhập ñược ñịnh chỉ số
trong các bảng chứa trong RAM, các số chính xác hoặc các ký tự.
- Giải pháp là sử dụng kiểu ñịnh ñịa chỉ 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 ở trên chip thì các thanh ghi R0 và R1 ñược sử dụng, hoạt ñộng như những con
trỏ (pointer). Kiểu ñịnh ñịa chỉ gián tiếp ñược nhận biết dựa vào ký hiệu @.
Một trong những ưu ñiểm của chế ñộ ñịnh ñịa chỉ gián tiếp thanh ghi 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.
6.4 ðịnh ñịa chỉ tức thời
- Khi toán hạng nguồn 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. 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 dữ liệu 16-bit ñược cần ñến.
Ví dụ:
MOV A,#65H
MOV R6,#55H
MOV DPTR,#2343H
MOV P1,#0FH

29
VÍ DỤ (Cho 4 kiểu ñịnh ñịa chỉ trên):
Viết chương trình ñể sao giá trị 55H vào các ngăn nhớ RAM tại ñịa chỉ từ 40H
ñến 44H sử dụng:
a) Chế ñộ ñịnh ñịa chỉ trực tiếp.
b) Chế ñộ ñịnh ñịa chỉ gián tiếp không dùng vòng lặp.
c) Chế ñộ gián tiếp có dùng vòng lặp.
Giải:
a) MOV A,#55H ; Nạp vào thanh chứa giá trị 55H
MOV 40H,A ; Ghi A vào thanh ghi có ñịa chỉ 40H
MOV 41H,A ; Ghi A vào thanh ghi có ñịa chỉ 41H
MOV 42H,A ; Ghi A vào thanh ghi có ñịa chỉ 42H
MOV 43H,A ; Ghi A vào thanh ghi có ñịa chỉ 43H
MOV 44H,A ; Ghi A vào thanh ghi có ñịa chỉ 44H
b)
MOV A,#55H ; Nạp vào A giá trị 55H
MOV R0,#40H ; Nạp vào con trỏ R0 = 40H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến
INC R0 ; Tăng con trỏ. Bây giờ R0 = 41H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến (41H)
INC R0 ; Tăng con trỏ. Bây giờ R0 = 42H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến (42)
INC R0 ; Tăng con trỏ. Bây giờ R0 = 43H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến (43)
INC R0 ; Tăng con trỏ. Bây giờ R0 = 44H
MOV @R0,A ; Ghi A vào thanh ghi do R0 trỏ ñến (44)
c)
MOV A,#55H ; Nạp vào A giá trị 55H
MOV R0,#40H ; Nạp vào con trỏ R0 = 40H
MOV R2,#05 ; Nạp bộ ñếm R2 = 5 (tương ứng số ô nhớ)
AGAIN:
MOV @R0,A ; Sao A vào thanh ghi do R0 trỏ ñến
INC R0 ; Tăng con trỏ
DJNZ R2,AGAIN ; Giảm bộ ñếm R2 và lặp lại cho ñến khi R2 =
0 thì
kết thúc
30
6.5 ðịnh ñịa chỉ tương ñối, ñịnh ñịa chỉ tuyệt ñối, ñịnh ñịa chỉ dài
- Các kiểu ñịnh ñịa chỉ tương ñối, tuyệt ñối và ñịnh ñịa chỉ dài ñược sử dụng
cho các lệnh nhảy.
- Một ñịa chỉ tương ñối (hay còn gọi là offset) là một giá trị 8-bit có dấu. Giá trị
này ñược cộng với bộ ñếm chương trình ñể tạo ra ñịa chỉ của lệnh tiếp theo cần
ñược thực thi. Tầm nhảy ñược giới hạn là -128 byte ñến 127 byte (8-bit có dấu).
- ðịnh ñịa chỉ tuyệt ñối chỉ ñượ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 11bit thấp của ñịa chỉ ñích.Trong ñó 3 bit
cao (A8-A10) ñưa vào opcode và 8 bit thấp (A0-A7) thành lập byte thứ 2 của lệnh.
5 bit cao của ñịa chỉ từ A11-A15 không ñổ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 (byte 2 và byte 3 của lệnh).
6.6 ðịnh ñịa chỉ chỉ số
- Sử dụng một thanh ghi nền (hoặc bộ ñếm chương trình hoặc con trỏ dữ liệu)
và một offset (thanh chứa A) tạo thành dạng ñịa chỉ hữu dụng cho lệnh JMP hoặc
MOVC.
- Trong nhiều ứng dụng, các bảng nhảy hoặc các bảng tìm kiếm ñược tạo ra dễ
dàng bằng cách sử dụng kiểu ñịnh ñịa chỉ chỉ số.

31
8. TẬP LỆNH CỦA 8051
Các khái niệm:
- Chương trình là chuỗi các lệnh mà MC phải xử lý, thực hiện.
- Lập chương trình là soạn thảo các lệnh bằng ngôn ngữ lập trình ñể thực hiện
một algorith (thuật toán) cụ thể.
Chương trình = Thuật toán + Cơ sở dữ liệu.
- Ngôn ngữ lập trình:
+ Bậc cao: C, Pascal, C++...
+ Bậc thấp:
* Mã máy: Mỗi một lệnh tương ứng với một mã nhị phân gọi là mã
lệnh, do nhà sản xuất quy ñịnh. MC chỉ hiểu ñược các lệnh ở dạng mã máy. Các
lệnh có thể chiếm 1 byte, 2 byte hoặc 3 byte.
* Mã ngữ: Các lệnh ñược mô tả ở dạng biểu trưng (Symbol). Symbol
có thể là từ viết tắt như MOV, ADD,... hoặc là ký hiệu các khối chức năng ở dạng
Graphic.
- Chương trình dịch: Ví dụ Assembler, thực hiện dịch từ mã ngữ sang mã máy.
- Hệ lệnh của MC: Là tập các lệnh mà người lập trình có thể sử dụng ñể lập
trình, và người lập trình chỉ có thể sử dụng các lệnh trong hệ lệnh mà thôi.
- Mỗi họ MC có một tập lệnh riêng, chương trình viết cho MC họ nào thì chỉ
chạy cho họ ñó.
Tập lệnh của 8051 ñược chia làm 5 nhóm
+ Nhóm lệnh số học.
+ Nhóm lệnh logic.
+ Nhóm lệnh di chuyển dữ liệu.
+ Nhóm lệnh xử lý bit.
+ Nhóm lệnh rẽ nhánh.
Các chữ viết tắt dùng trong tập lệnh
Rn : ðịnh ñịa chỉ thanh ghi sử dụng R0 - R7.
direct : ðịa chỉ trực tiếp 8 bit trong RAM nội (00H-FFH).
@Ri : ðịnh ñịa chỉ gián tiếp sử dụng thanh ghi R0 hoặc R1.
source : Toán hạng nguồn, có thể là Rn, hoặc direct hoặc @Ri.
dest : Toán hạng ñích, có thể là Rn, hoặc direct hoặc @Ri.
#data : Hằng số 8 bit chứa trong lệnh.
#data16 : Hằng số 16 bit.
bit : ðịa chỉ trực tiếp (8 bit) của 1 bit.
32
rel : offset 8-bit có dấu.
addr11 : ðịa chỉ 11 bit trong trang hiện hành.
addr16 : ðịa chỉ 16 bit.

7.1 Nhóm lệnh số học


LỆNH MÔ TẢ
ADD A,source
ADD A,Rn Cộng toán hạng nguồn với A, kết quả chứa trong
ADD A,direct A.
ADD A,@Ri (A) ← (A) + (source)
ADD A,#data
ADDC A,source
Cộng ñồng thời nội dung của một byte ở ñịa chỉ
ADDC A,Rn
ñược chỉ ra trong lệnh với nội dung của thanh chứ
ADDCA,direct
và cờ nhớ. Kết quả ñặt vào thanh chứa.
ADDCA,@Ri
(A) ← (A) + (C) + (Source)
ADDCA,#data
SUBB A,source
SUBB A,Rn Trừ bớt nội dung của thanh chứa A bởi nội dung
SUBBA,direct của toán hạng chỉ ra trong lệnh cùng với cờ nhớ v
SUBBA,@Ri cất kết quả vào thanh chứa.
SUBBA,#data (A) ← (A) - (C) - (source)

INC source
INC A
INC Rn
(source) ← (source) + 1
INC direct
INC @Ri
INC DPTR
DEC A
DEC Rn
(source) ← (source) - 1
DEC direct
DEC @Ri
Nhân các số nguyên không dấu 8-bit chứa trong A
MUL AB và B. Byte thấp của tích số 16-bit cất trong A, byte
cao cất trong B.
Chia số nguyên không dấu 8-bit chứa trong A vớ
DIV AB số nguyên không dấu 8-bit chứa trong B. Thương s
cất trong A, còn số dư cất trong B.
Hiệu chỉnh thập phân nội dung của thanh chứa ñố
DA A
với phép cộng.

33
7.2 Nhóm lệnh logic
LỆNH MÔ TẢ

ANL des,source
ANL A,Rn
ANL A,direct Thực hiện AND từng bit giữa 2 toán hạng ñượ
ANL A,@Ri chỉ ra trong lệnh và lưu kết quả vào toán hạng ñích.
ANL A,#data (des) ← (des) AND (source)
ANL direct,A
ANL direct,#data

ORL des,source
ORL A,Rn
ORL A,direct
Thực hiện OR từng bit giữa 2 toán hạng ñược ch
ORL A,@Ri
ra trong lệnh và lưu kết quả vào toán hạng ñích.
ORL A,#data
(des) ← (des) OR (source)
ORL direct,A
ORL direct,#data
ORL C,bit

XRL A,Rn
XRL A,direct
XRL A,@Ri
XOR
XRL A,#data
XRL direct,A
XRL direct,#data
CLR A Xóa A
CPL A Lấy bù A
RL A Quay trái A
RLC A Quay trái A kể cả cờ nhớ
RR A Quay phải A
RRC A Quay phải A kể cả cờ nhớ
SWAP A Hoán ñổi 2 nibble (2 nửa 4-bit) của A

7.3 Nhóm lệnh di chuyển dữ liệu


LỆNH MÔ TẢ
MOV A,source
MOV A,Rn
MOV A,direct
MOV A,@Ri
Di chuyển toán hạng nguồn ñến ñích.
MOV A,#data

MOV dest,A
MOV Rn,A
34
MOV direct,A
MOV @Ri,A

MOV dest,source
MOV Rn,direct
MOV Rn,#data
MOV direct,Rn
MOV direct,direct
MOV direct,@Ri
MOV direct,#data
MOV @Ri,direct
MOV @Ri,#data
MOV DPTR,#data16
MOVX A,@Ri
MOVX A,@DPTR Di chuyển ở bộ nhớ ngoài. 2 loại ñịa chỉ: ñịa chỉ
MOVX @Ri,A gián tiếp 8-bit (R0 hoặc R1) và ñịa chỉ 16-bit.
MOVX @DPTR,A
MOVC A,@A+DPTR
Bảng nhảy
MOVC A,@A+PC

PUSH direct
Cất vào và lấy dữ liệu ra từ stack
POP direct
XCH A,Rn
XCH A,direct Trao ñổi giữa các byte
XCH A,@Ri XCHD A,@Ri : Trao ñổi các digit thấp
XCHD A,@Ri

7.4 Nhóm lệnh xử lý bit


LỆNH MÔ TẢ

CLR C
CLR bit
SETB C Xóa bit
SETB bit Set bit bằng 1
CPL C Lấy bù bit
CPL bit AND bit với C
ANL C,bit AND NOT bit với C
ANL C,/bit (not bit) OR bit với C
ORL C,bit OR NOT bit với C
ORL C,/bit (not bit) Di chuyển bit ñến bit.
MOV C,bit
MOV bit,C

35
7.5 Nhóm lệnh ñiều khiển rẽ nhánh
LỆNH MÔ TẢ
ACALL addr11 Gọi không ñiều kiện một chương trình con ñặt tạ
LCALL addr16 ñịa chỉ ñược chỉ ra trong lệnh.
RET Quay trở về từ chương trình con
RETI Quay về từ trình phục vụ ngắt
AJMP addr11 Nhảy (chuyển việc thực thi chương trình) không
LJMP addr16 ñiều kiện ñến ñịa chỉ ñược chỉ ra trong lệnh.
SJMP rel Nhảy ngắn, rẽ nhánh không ñiều kiện.
JMP @A+DPTR Nhảy gián tiếp.
Nhảy ñến ñịa chỉ(hoặc nhãn) chỉ ra trong lệnh n
JZ rel nội dung A bằng 0.
Jump if zero
Nhảy ñến ñịa chỉ(hoặc nhãn) chỉ ra trong lệnh n
JNZ rel nội dung A khác 0.
Jump if not zero
Nếu bit ñược chỉ ra trong lệnh ñược set bằng 1,
JB bit,rel nhảy ñến ñịa chỉ ñược chỉ ra trong lệnh. Ngược lạ
thực hiện lệnh tiếp theo.
Nếu bit ñược chỉ ra trong lệnh bằng 0, nhảy ñến
JNB ñịa chỉ ñược chỉ ra trong lệnh. Ngược lại, thực hiệ
lệnh tiếp theo.
Nếu bit ñược chỉ ra trong lệnh bằng 1, xóa bit v
JBC nhảy ñến ñịa chỉ ñược chỉ ra trong lệnh. Ngược lạ
thực hiện lệnh tiếp theo.
CJNE dest,source,rel
So sánh và nhảy ñến ñịa chỉ (hoặc label) ñược ch
CJNE A,direct,rel
ra trong lệnh nếu dest và source không bằng nhau.
CJNE A,#data,rel
Nếu bằng nhau, thực hiện lệnh tiếp theo.
CJNE @Ri,#data,rel
Compare and jump if not equal
CJNE Rn,#data,rel
Giảm byte chỉ ra bởi toán hạng ñầu tiên trong l
và rẽ nhánh ñến ñịa chỉ ñược chỉ ra nếu kết quả sau
DJNZ Rn,rel
khi giảm khác 0. Nếu kết quả sau khi giảm bằng 0
DJNZ direct,rel
thì thực hiện lệnh tiếp theo.
Decrease and jump if not zero
NOP Không làm gì

36
9. LẬP TRÌNH VÀO/RA (I/O)
Bốn cổng P0, P1, P2 và P3 ñều có 8 chân và tạo thành cổng 8 bit. Tất cả các
cổng khi Reset ñều ñược cấu hình làm cổng ra và ở mức logic 1.

* Khái niệm bộ ñệm 3 trạng thái

Trở kháng
Output Input Input
cao (hở
mạch)

Control 0

0 0 1 1

1 1

9.1 Cấu trúc của cổng P1

- Internal bus: Bus nội, giao tiếp với CPU.


- P1.x latch: D Flip-Flop, lưu giữ giá trị của chân.
37
- WRITE TO LATCH: Khi ñược set bằng 1 → ðiều khiển ghi dữ liệu vào bộ
chốt.
- Hai bộ ñệm 3 trạng thái:
+ TB1: ðiều khiển bởi READ LATCH. Khi "READ LATCH" = 1 → ðiều
khiển ñọc giá trị lưu giữ của bộ chốt.
+ TB2: ðiều khiển bởi READ PIN. Khi "READ PIN" = 1 → ðiều khiển ñọc
giá trị từ chân ngoài.

* Ghi "1" ra chân P1.x

1
1
1

* Ghi "0" ra chân P1.x

0
0
0

* ðọc từ chân input


ðể cổng là input, thì phải lập trình tất cả các bit của cổng phải ñược ghi bằng
"1".
38
1

1
Ví dụ:
MOV A,#FFH
MOV P1,A ; ðặt P1 làm cổng vào bằng cách
ghi "1" vào tất cả các bit của cổng
BACK: MOV A,P1 ; Nhận dữ liệu từ cổng P1
MOV P0,A ; Gửi nó ñến cổng P0
SJMP BACK ; Lặp lại

Việc Reset hệ thống sẽ set tất cả các bit của cổng, do vậy các chân của port có
thể ñược dùng làm ngõ nhập mà không cần phải set cổng một cách tường minh.
Tuy nhiên, nếu một bộ chốt của port bị xóa (như CLR P1.5), chân của port không
thể làm nhiệm vụ tiếp theo là ngõ nhập trừ khi trước tiên ta phải set bộ chốt ñó
(SETB P1.5).

* ðọc giá trị của cổng từ bộ chốt


Ví dụ:
MOV P1,#0x0FH ; Thanh ghi P1 có giá trị 0FH
ORL P1,#55H ; OR với giá trị 55H ñược một giá trị mới → ðầu
vào D của bộ chốt thay ñổi → P1 nhận giá trị mới
(Thao tác ðọc - Sửa ñổi - Ghi).
+ "READ LATCH" kích hoạt ñọc dữ liệu từ các ñầu ra Q của bộ chốt vào
CPU.
+ CPU thực hiện OR dữ liệu này với 55H, ñược giá trị mới: F5H.
+ Các ñầu vào D của bộ chốt bị thay ñổi.
+ Ghi kết quả ra P1.

39
9.2 Cấu trúc của cổng P0

Như chỉ ra trên hình vẽ, bộ ñiều khiển xuất của P0 (và P2) có thể ñóng vào
ñường ADDR/DATA bởi tín hiệu CONTROL trong trường hợp truy cập bộ nhớ
ngoài.
Cổng P0 có dạng cực máng ñể hở (open-drain), ñây là ñiểm khác với các cổng
P1,P2 và P3. Khái niệm cực máng ñể hở cũng tương tự như cực collector ñể hở,
tuy nhiên ở ñây áp dụng cho các chip dạng MOS. Do vậy, ñể có thể vừa làm ñầu
vào, vừa làm ñầu ra thì mỗi chân phải ñược nối tới một ñiện trở kéo lên 10K ở bên
ngoài.

40
Hoạt ñộng vào/ra của cổng P0 tương tự như cổng P1.

Hoạt ñộng truy cập bộ nhớ ngoài:


- Trong các thiết kế lớn có bộ nhớ ngoài, port 0 ñược dùng làm bus ñịa chỉ và
bus dữ liệu ña hợp: Byte thấp của bus ñịa chỉ (A0 - A7) và 8-bit của bus dữ liệu
(D0-D7). Port 2 ñược dùng làm byte cao của bus ñịa chỉ (A8 - A15).
- Khả năng mở rộng bộ nhớ ngoài của 8051: Tối ña ñến 64K bộ nhớ chương
trình và 64K bộ nhớ dữ liệu.
- Sắp xếp không ña hợp: Sử dụng 16 ñường ñịa chỉ và 8 ñường dữ liệu, tổng
cộng 24 ñường. Sắp xếp ña hợp: Chỉ cần 16 ñường. Việc tiết kiệm chân cho phép
nhà sản xuất ñóng gói bộ vi ñiều khiển 8051 trong 40 chân.
- Sắp xếp ña hợp có hoạt ñộng như sau: Trong 1/2 chu kỳ ñầu của chu kỳ bộ
nhớ, byte thấp của ñịa chỉ ñược cung cấp bởi port 0 và ñược chốt nhờ tín hiệu
ALE. Mạch chốt 74HC573 giữ cho byte thấp của ñịa chỉ ổn ñịnh trong cả chu kỳ
bộ nhớ. Trong 1/2 sau của chu kỳ bộ nhớ, port 0 ñược sử dụng làm bus dữ liệu và
dữ liệu ñược ñọc hay ghi.

* Truy xuất bộ nhớ chương trình ngoài


Bộ nhớ chương trình ngoài là bộ nhớ chỉ ñọc, ñược cho phép bởi tín hiệu
/PSEN.

A0 - A7

A0 - A7

A8 - A15

1/2 ñầu của chu kỳ tìm nạp lệnh ở ROM ngoài: µC gửi ñịa chỉ tới
ROM, 74HC573 chốt byte thấp của ñịa chỉ tại ñầu ra Q. P0 làm
nửa thấp của bus ñịa chỉ.

41
ðọc lệnh từ ROM

Chốt

1/2 sau của chu kỳ tìm nạp lệnh ở ROM ngoài: 74HC573 chốt và giữ
ổn ñịnh byte thấp của ñịa chỉ tại ñầu ra Q. µC ñọc lệnh từ ROM, P0
làm bus dữ liệu.

* Truy xuất bộ nhớ dữ liệu ngoài


Bộ nhớ dữ liệu ngoài là bộ nhớ ñọc/ghi ñược cho phép bởi các tín hiệu /RD và
/WR ở các chân P3.7 và P3.6. Lệnh dùng ñể truy xuất bộ nhớ dữ liệu ngoài là
MOVX, sử dụng hoặc con trỏ dữ liệu 16-bit DPTR hoặc R0,R1 làm thanh ghi chứa
ñịa chỉ.

42
Port 2 giảm bớt ñược chức năng làm nhiệm vụ cung cấp byte cao của ñịa chỉ
trong các hệ thống tối thiểu thành phần, hệ thống không dùng bộ nhớ chương trình
ngoài và chỉ có một dung lượng nhỏ bộ nhớ dữ liệu ngoài.
Trong hình vẽ minh họa ở trên, 8051 kết nối với RAM ngoài với dung lượng
nhớ là 1KB (1024byte = 210 → chỉ cần 10 bit ñể xác ñịnh ñịa chỉ).

9.3 Cấu trúc của cổng P2

43
9.4 Cấu trúc của cổng P3

44
10. TẠO TRỄ
ðể thực hiện một lệnh thì cần một số chu kỳ ñồng hồ. Ở họ 8051, các chu kỳ
ñồng hồ này ñược gọi là các chu kỳ máy (machine cycle). ðộ dài của chu kỳ máy
của họ 8051 phụ thuộc vào tần số của bộ dao ñộng thạch anh nối với hệ thống
8051. Bộ dao ñộng thạch anh cùng với ñồng hồ trên chip cung cấp xung ñồng hồ
cho 8051. Tần số của dao ñộng thạch anh thường nằm trong khoảng 4MHz ñến
30MHz phụ thuộc vào tốc ñộ chip và nhà sản xuất. Thường ñược sử dụng nhất là
bộ dao ñộng thạch anh tần số 11,0592MHz nhằm tương thích với cổng nối tiếp của
IBM PC.
Một chu kỳ máy gồm một chuỗi (sequence) 6 trạng thái (State), ñược ñánh số từ
S1 ñến S6. Mỗi trạng thái bao gồm 2 chu kỳ xung dao ñộng. Do vậy 1 chu kỳ máy
gồm 12 chu kỳ dao ñộng thạch anh, bằng 1µs nếu tần số dao ñộng là 12MHz.

Ví dụ 1
Hãy tìm chu kỳ máy trong trong trường hợp 3 tần số dao ñộng thạch anh sau
ñây:
a) 11,0592MHz b) 16MHz c) 20MHz
Giải
a) Thời gian của 1 chu kỳ dao ñộng: T = 1/(11,0592*106) = 9,04*108
Chu kỳ máy: 12* T = 1,085µs
b) Chu kỳ máy: 12/(16*106) = 0,75µs
c) Chu kỳ máy: 12/(20*106) = 0,6µs

Ví dụ 2
Hệ thống 8051 có tần số dao ñộng thạch anh là 11,0592MHz. Hãy tìm thời gian
cần thiết ñể thực hiện các lệnh sau ñây:
a) MOV R3,#55H b) DEC R3 c) DJNZ R2, rel
d) LJMP; e) SJMP f) NOP
g) MUL AB

45
Giải
Chu kỳ máy tính ñược là 1,085µs. Trong phụ lục (B) về tập lệnh (Tống Văn
On) ta tra ñược số chu kỳ máy của các lệnh trên, vậy ta có:

STT Lệnh Số chu kỳ máy Thời gian thực hiện


a) MOV R3,#55H 1 1 x 1,085µs = 1,085µs
b) DEC R3 1 1 x 1,085µs = 1,085µs
c) DJNZ R2, rel 2 2 x 1,085µs = 2,17 µs
d) LJMP 2 2 x 1,085µs = 2,17 µs
e) SJMP 2 2 x 1,085µs = 2,17 µs
f) NOP 1 1 x 1,085µs = 1,085µs
g) MUL AB 4 4 x 1,085µs = 4,34µs

Ví dụ 3 NHÁY ðÈN LED


Hãy xác ñịnh thời gian giữ chậm ở chương trình sau, nếu tần số dao ñộng thạch
anh là 11,0592MHz.
MOV A,#55H;
AGAIN: MOV P1,A;
ACALL DELAY
CPL A; Lấy bù A
SJMP AGAIN;
DELAY: MOV R3,#200;
HERE: DJNZ R3,HERE
RET
Giải
Tra bảng phụ lục lệnh, ta có ñược số chu kỳ máy ứng với các lệnh của chương
trình con tạo trễ như sau:
Chu kỳ máy

DELAY: MOV R3,#200; 1


HERE: DJNZ R3,HERE 2
RET 1
Như vậy, tổng thời gian giữ chậm là: [(200 x 2) +1 +1] x 1,085µs = 436,17µs

Thông thường, thời gian tạo trễ ñược xác ñịnh dựa vào thời gian thực hiện các
lệnh bên trong vòng lặp và bỏ qua các lệnh bên ngoài vòng lặp.
46
Giá trị lớn nhất mà một thanh ghi 8-bit lưu giữ ñược là 255, do vậy trong một
số trường hợp ñể hiệu chỉnh ta dùng thêm lệnh NOP (1 chu kỳ máy).

Ví dụ 4 Tạo thời gian trễ lớn dùng vòng lặp lồng nhau.
Chu kỳ máy
DELAY:
MOV R2,#200H 1
AGAIN: MOV R3,#250H 1
HERER: NOP 1
NOP 1
DJNZ R3,HERE 2
DJNZ R2,AGAIN 2
RET; (Lệnh trở về của DELAY) 1

Thời gian trễ của vòng lặp HERE: [250*(1+1+2)]* 1,085µ


µs = 1085µ
µs
Vòng lặp AGAIN thực hiện lặp lại vòng lặp HERE 200 lần, do vậy thời gian trễ
do lặp lại vòng HERE là 200*1085µ
µs = 217000µ
µs. Tuy nhiên, ở ñây còn có thời
gian trễ của lệnh "MOV R3,#250H" và " DJNZ R2,AGAIN" ở ñầu và cuối vòng
lặp AGAIN tạo nên là (1+2)*200*1,085µ
µs = 651µ
µs. Và 2 lệnh " MOV
R2,#200H" và "RET".
Vậy tổng thời gian trễ của cả chương trình con DELAY là:
217000µ
µs + 651µ
µs +1µ
µs +1µ
µs = 217,653ms.

47
11. LẬP TRÌNH TIMER/COUNTER
11.1 Giới thiệu
- 8051 có hai bộ ñịnh thời 16-bit, mỗi bộ có 4 chế ñộ hoạt ñộng. Bộ ñịnh thời
thứ 3 với 3 chế ñộ hoạt ñộng ñược thêm vào ñối với chip 8051. (89C51 có hai bộ
timer/counter 16-bit).
- Các bộ ñịnh thời dùng ñể:
+ ðịnh thời trong một khoảng thời gian.
+ ðếm sự kiện.
+ Tạo tốc ñộ baud cho port nối tiếp của chip 8051.
- Trong các ứng dụng ñịnh thời trong một khoảng thời gian, bộ ñịnh thời ñược
lập trình sao cho sẽ bị tràn sau một khoảng thời gian quy ñịnh và set cờ tràn của bộ
ñịnh thời bằng 1.
- Việc ñếm sự kiện ñược dùng ñể xác ñịnh số lần xuất hiện của một sự kiện. Sự
kiện là một kích thích bên ngoài cung cấp một chuyển trạng thái từ 1 xuống 0 tới
một chân của 8051.
11.2 Các thanh ghi dùng truy xuất Timer/counter
Các bộ ñịnh thời của 8051 ñược truy xuất bằng cách sử dụng 6 thanh ghi chức
năng ñặc biệt sau:

SFR Mục ñích ðịa chỉ ðịnh ñịa chỉ bit


TCON ðiều khiển 88H Có
TMOD Chọn chế ñộ 89H không
TL0 Byte thấp của bộ ñịnh thời 0 8AH không
TL1 Byte thấp của bộ ñịnh thời 1 8BH không
TH0 Byte cao của bộ ñịnh thời 0 8CH không
TH1 Byte cao của bộ ñịnh thời 1 8DH không

*Thanh ghi TCON


- TCON chứa các bit ñiều khiển và trạng thái của bộ ñịnh thời 0 và 1.
- 4 bit cao TCON.4 - TCON.7 ñược dùng ñể ñiều khiển bộ ñịnh thời hoạt ñộng
hoặc ngưng (TR0, TR1), hoặc ñể báo các bộ ñịnh thời tràn (TF0, TF1).
- 4 bit thấp TCON.0 - TCON.3 không dùng ñể ñiều khiển các bộ ñịnh thời,
chúng ñược dùng ñể phát hiện và khởi ñộng các ngắt ngoài.
Bit Ký hiệu ðịa chỉ Mô tả
Cờ tràn của bộ ñịnh thời 1. Cờ này ñược set
bởi phần cứng khi có tràn, ñược xóa bởi phần
TCON.7 TF1 8FH
mềm, hoặc bởi phần cứng khi bộ VðK trỏ ñến
trình phục vụ ngắt.
48
Bit ñiều khiển hoạt ñộng của bộ ñịnh thời 1.
Bit này ñược set hoặc ñược xóa bởi phần mềm
TCON.6 TR1 8EH
ñể ñiều khiển bộ ñịnh thời hoạt ñộng hoặc
ngưng hoạt ñộng.
TCON.5 TF0 8DH Cờ tràn của bộ ñịnh thời 0.
TCON.4 TR0 8CH Bit ñiều khiển hoạt ñộng của bộ ñịnh thời 0.
Cờ ngắt bên ngoài 1 (kích khởi cạnh). Cờ
này ñược set bởi phần cứng khi có cạnh âm
TCON.3 IE1 8BH (xuống) xuất hiện trên chân /INT1, ñược xóa
bởi phần mềm, hoặc phần cứng khi CPU trỏ
ñến trình phục vụ ngắt.
Chọn kích khởi cạnh hay mức cho ngắt ngoài
1. Cờ này ñược set hoặc xóa bởi phần mềm khi
TCON.2 IT1 8AH
xảy ra cạnh âm hoặc mức thấp tại chân ngắt
ngoài.
TCON.1 IE0 89H Cờ ngắt bên ngoài 0.
Chọn kích khởi cạnh hay mức cho ngắt ngoài
TCON.0 IT0 88H
0.

* Thanh ghi TMOD


- Chứa 2 nhóm 4-bit dùng ñể thiết lập chế ñộ hoạt ñộng cho bộ ñịnh thời 0 và
bộ ñịnh thời 1.
- TMOD không ñược ñịnh ñịa chỉ bit và ñiều này cũng không cần thiết.
- TMOD ñược nạp giá trị một lần bằng phần mềm ở thời ñiểm bắt ñầu của một
chương trình ñể khởi ñộng chế ñộ hoạt ñộng của bộ ñịnh thời. Sau ñó , bộ ñịnh thời
có thể ñược dừng, bắt ñầu ... bằng cách truy xuất các thanh ghi ñặc biệt khác của
bộ ñịnh thời.
Bộ ñịnh
Bit Tên Mô tả
thời
Bit ñiều khiển cổng của bộ ñịnh thời 1. Khi
7 GATE 1 ñược set lên 1, bộ ñịnh thời 1 chỉ hoạt ñộng
trong khi /INT1 ở mức cao.
Bit chọn chức năng ñếm hoặc ñịnh thời.
6 C/T 1 1 = ñếm sự kiện.
0 = ñịnh thời gian.
5 M1 1 Bit chọn chế ñộ thứ nhất.
4 M0 1 Bit chọn chế ñộ thứ hai.
3 GATE 0 Bit ñiều khiển cổng của bộ ñịnh thời 0.
Bit chọn chức năng ñếm hoặc ñịnh thời cho
2 C/T 0
bộ ñịnh thời 0.
1 M1 0 Bit chọn chế ñộ thứ nhất.
0 M0 0 Bit chọn chế ñộ thứ hai.

49
Chọn các chế ñộ ñịnh thời
M1 M0 Chế ñộ Mô tả
0 0 0 Chế ñộ ñịnh thời 13-bit.
0 1 1 Chế ñộ ñịnh thời 16-bit.
1 0 2 Chế ñộ tự ñộng nạp lại 8-bit.
1 1 3 Chế ñộ ñịnh thời chia xẻ.

* CÁC BƯỚC LẬP TRÌNH BỘ TIMER/COUNTER


- Nạp giá trị ban ñầu cho các thanh ghi: Chọn bộ Timer/Counter (0,1), chọn
Mod (0,1,2,3), ñặt thời gian cần ñịnh thời cho các thanh ghi TH, TL...
- Kích hoạt cho bộ Timer/Counter hoạt ñộng (bằng lệnh "SETB TR0" cho
Timer 0 và "SETB TR1" cho Timer 1. Timer bắt ñầu ñếm lên.
- Kiểm tra trạng thái của cờ tràn (lệnh JNB TFx,ñích) ñể biết khi nào thời gian
ñịnh thời kết thúc. Khi xảy ra tràn thì cờ tràn TF0 hoặc TF1 sẽ bật lên mức cao.
- Dừng bộ ñịnh thời "CLR TR0" hoặc "CLR TR1".
- Xóa cờ TF (nếu ko phải là ngắt) ñể chuẩn bị cho vòng kế tiếp.
- Quay trở lại bước 2 ñể nạp lại giá trị cần ñịnh thời cho TL và TH (ñối với chế
ñộ 0,1) nếu muốn lặp lại việc ñịnh thời.

11.3 Các chế ñộ ñịnh thời


a) Chế ñộ 0
- Là chế ñộ ñịnh thời 13-bit.
- Giá trị bộ ñếm 13-bit ñược lưu trong các thanh ghi TH-TL nằm trong giới hạn
từ 0000H ñến 1FFFH. Do vậy, khi bộ ñịnh thời ñếm lên ñạt ñến giá trị cực ñại là
1FFFH thì nó sẽ quay về 0000H và cờ tràn TF ñược bật lên 1.
- Thời gian tối ña có thể ñịnh thời: 213 = 8192 µs (OSC = 11,0592MHz).

Ngắt

Cờ
tràn

50
b) Chế ñộ 1
- Là bộ ñịnh thời 16-bit, có cấu hình giống bộ ñịnh thời 13-bit.

- Thời gian ñịnh thời tối ña: 216 = 65536 µs.


- Muốn ñịnh khoảng thời gian lớn hơn ta dùng bộ ñịnh thời 16-bit kết hợp với
các vong lặp.

*Cách xác ñịnh giá trị cần nạp vào bộ ñịnh thời (nạp cho TH và TL)
Giả sử chúng ta ñã biết thời gian trễ cần có, vậy giá trị nạp cho các thanh ghi
TH và TL là bao nhiêu? Tần số dao ñộng thạch anh: 11.0592MHz. Các bước thực
hiện sử dụng máy tính Calculator của Windows như sau:
1- Chọn máy tính Calculator từ Windows và ñặt chế ñộ tính về số thập phân
Decimal.
2- Nhập từ bàn phím thực hiện chia thời gian trễ cho 1,085µs ñược một số
thập phân n.
3- Chuyển số âm "- n." sang số Hexa, ta ñược một số yyxxH là giá trị Hexa
cần nạp cho các thanh ghi của bộ ñịnh thời.
4- ðặt TL = xx và TH = yy.
Giải thích: Các bộ ñịnh thời ñếm lên và thiết lập cờ tràn bằng 1 khi xảy ra tràn
số ñếm từ FFFFH xuống 0000H, vậy thì một khoảng thời gian nµs có thể ñược
ñịnh thời bằng cách khởi ñộng TL và TH chứa số ñếm nhỏ hơn 0000H một lượng
là n, nghĩa là "-n".

Ví dụ
Giả sử tần số XTAL = 11,0592MHz. Hãy xác ñịnh giá trị nạp vào các thanh ghi
TH và TL nếu cần trễ thời gian là 5ms. Hãy viết chương trình cho bộ Timer 0 ñể
tạo ra xung trên chân P2.3 có ñộ rộng 5ms.

51
Giải
Vì tần số XTAL = 11,0592MHz nên bộ ñếm tăng giá trị sau mỗi chu kỳ
1,085µs. ðể có ñộ rộng xung là 5ms thì số nhịp ñồng hồ là:
n = 5ms/1,085µs = 4608.
Giá trị cần nạp vào TH và TL ñược tính bằng cách: Lấy 65536 - 4608 = 60928,
ñổi số này ra Hexa ta có EE00.
Do vậy, giá trị cần nạp vào TH là EE và cần nạp vào TL là 00.
Chương trình:
CLR P2.3 ; Xóa bit P2.3
MOV TMOD,#01 ; Chọn Timer 0, chế ñộ 1 (16 bit).
LOOP: MOV TL0,#0 ; Nạp TL = 00.
MOV TH0,#0xEE ; Nạp TH = EE.
SETB TR0 ; Bắt ñầu ñịnh thời
AGAIN: JNB TF0,AGAIN ; Chờ tràn, nhảy nếu bit TF0 chưa ñược set bằng 1
CLR TR0 ; Dừng bộ ñịnh thời
CLR TF0 ; Xóa cờ tràn TF0 cho vòng sau
CPL P2.3 ; Lấy bù chân P2.3
SJMP LOOP ; Lặp lại
END

c) Chế ñộ 2 (auto-reload)

- Chế ñộ 2 là chế ñộ tự nạp lại 8-bit. Byte thấp của bộ ñịnh thời (TLx) hoạt
ñộng ñịnh thời 8-bit trong khi byte cao của bộ ñịnh thời lưu giữ giá trị nạp lại.

52
- Khi số ñếm tràn từ FFh xuống 00H, không chỉ cờ tràn của bộ ñịnh thời ñược
set lên 1 mà giá trị trong THx còn ñược nạp vào TLx, việc ñếm sẽ tiếp tục từ giá trị
này cho ñến khi xảy ra 1 tràn (FFh → 00h) kế tiếp,...

Ví dụ:
Viết chương trình tạo sóng vuông 10KHz trên chân P1.0 sử dụng bộ ñịnh thời
0.
Giải
- Sóng vuông 10KHz có chu kỳ 100µs với thời gian ở mức cao là 50µs và thời
gian ở mức thấp là 50µs. Vì khoảng thời gian này nhỏ hơn 256 (28) nên ta sử dụng
chế ñộ 2.
- Một tràn xảy ra sau mỗi 50µs yêu cầu một giá trị số ñếm nhỏ hơn 00h một
lượng là +50 phải nạp và nạp lại cho TL0, nghĩa là giá trị nạp cho TH0 là -50
(<FF).
Chương trình:
ORG 0x0030H
MOV TMOD,#02 ; Chọn chế ñộ 2 (Chế ñộ tự nạp lại 8-bit)
MOV TH0,# -50 ; TH0 chứa giá trị nạp lại -50
SETB TR0 ; Bắt ñầu ñịnh thời
LOOP: JNB TF0,LOOP ; Nhảy nếu TF0 = 0 (chờ tràn)
CLR TF0 ; Xóa cờ tràn
CPL P1.0 ; ðổi trạng thái bit P1.0
SJMP LOOP ; Lặp lại
END

Tổng kết: Các bước lập trình cho chế ñộ 2


1- Nạp giá trị cho thanh ghi TMOD ñể chọn bộ ñịnh thời nào (Timer 0,
Timer1) và chế ñộ hoạt ñộng 2.
2- Nạp vào thanh ghi TH giá trị ñịnh thời (-nµs).
3- Khởi ñộng bộ ñịnh thời (SETB TR0 hoặc SETB TR1);
4- Kiểm tra cờ tràn TF bằng lệnh "JNB TFx, ñích" ñể xem cờ ñã ñược bật
chưa. Thoát khỏi vòng lặp khi TF lên mức cao
LOOP: JNB TF0, LOOP
5- Xóa cờ tràn TFx
6- Quay trở lại bước 4 vì chế ñộ 2 là chế ñộ tự nạp lại.
53
d) Chế ñộ 3 (Bộ ñịnh thời chia sẻ)
- Ít ñược sử dụng.
- Chế ñộ 3 là chế ñộ ñịnh thời chia sẻ và có hoạt ñộng khác nhau cho từng bộ
ñịnh thời. Bộ ñịnh thời 0 ở chế ñộ 3 ñược chia làm 2 bộ ñinh thời 8 bit (không tự
ñộng nạp lại) hoạt ñộng riêng rẽ TH0 và TL0, mỗi bộ ñịnh thời sẽ set các cờ tràn
tương ứng TF0 và TF1 khi xảy ra tràn.

Overflow
1/12OSC TL0 TF0
flag

1/12OSC TH0 TF1 Overflow


flag

* Chân GATE trong các bộ ñịnh thời


Ở các ví dụ trên ñây, chúng ta ñã biết công dụng của các cờ TR0 và TR1 dùng
ñể bật/tắt các bộ ñịnh thời. Các bit này thuộc thanh ghi TCON.
+ Khi GATE = 0 thì các bộ ñịnh thời Timer0 và Timer1 ñược khởi ñộng
bằng lệnh tương ứng "SETB TR0" và "SETB TR1".
+ Khi GATE = 1 thì việc khởi ñộng và dừng bộ ñịnh thời Timer 0 và Timer
1 ñược thực hiện từ bên ngoài thông qua chân P3.2 (/INT0) và P3.3 (/INT1) tương
ứng. Lúc ñó, ngoài việc phải set TR0 và TR1 lên bằng 1 còn phải ñưa tín hiệu vào
từ bên ngoài thông qua /INT0 và /INT1.
Ứng dụng: Nhằm ñể cung cấp cho người dùng khả năng kiểm soát hoạt ñộng
ñịnh thời. Ví dụ trong trường hợp còi báo ñộng theo từng thời gian nhất ñịnh: Cứ
sau 10p thì còi báo ñộng kêu. Nếu nối một công tắc chuyển mạch ñến chân /INTx
thì ta có thể dừng hoặc khởi ñộng bộ ñịnh thời và như vậy có thể tắt hoặc mở còi
báo ñộng.

11.4 Lập trình cho bộ ñếm


- Mục ñích: ðể ñếm sự kiện (event) xảy ra bên ngoài 8051.
- Xung từ bên ngoài sẽ làm tăng giá trị các thanh ghi TH, TL.
- Chọn chức năng ñếm bằng bit C/T của thanh ghi TMOD.
Set C/T = 1 → chọn bộ ñếm.
- Bộ ñếm sẽ ñếm lên khi có xung xuất hiện từ:
+ chân T0: Timer/Counter0 external input (P3.4, chân số 14).
+ chân T1: Timer/Counter1 externa input (P3.5, chân số 15).
54
- Các chế ñộ ñếm: Tương tự các chế ñộ ñịnh thời.
+ Chế ñộ ñếm 13-bit.
+ Chế ñộ ñếm 16-bit.
+ Chế ñộ ñếm 8-bit tự ñộng nạp lại.
Ví dụ 1
Giả sử có một nguồn xung sự kiện ñược cấp tới chân T1 (P3.5), hãy viết
chương trình cho bộ ñếm 1 ở chế ñộ 2 ñể ñếm số lần xuất hiện sự kiện và hiển thị
trạng thái của số ñếm TL1 trên cổng P2.
Giải
8051

P1 ðến
LED

P3.5

ORG 0030H
MOV TMOD,#01100000B ; Chọn bộ ñếm 1, chế ñộ 2, C/T=1
MOV TH1,#0 ; Xóa TH1, bắt ñầu ñếm lên từ giá trị
0.
SETB P3.5 ; Lấy ñầu vào là chân T1
AGAIN: SETB TR1 ; Bắt ñầu ñếm
BACK: MOV A,TL1 ; ðọc giá trị ñếm của TL1 vào A
MOV P2,A ; Hiển thị số ñếm ra cổng P1
JNB TF1,BACK ; Kiểm tra cờ tràn
CLR TR1 ; Dừng bộ ñếm
CLR TF1 ; Xóa cờ tràn
SJMP AGAIN ; Lặp lại
END

Ví dụ 2
Giả sử có một dãy xung có tần số 1Hz ñược nối tới chân ñầu vào P3.4. Hãy viết
chương trình hiển thị bộ ñếm 0 lên màn hình LCD. Giá trị ban ñầu của TH0 là -60.
Giải

55
ðể hiển thị số ñếm TL trên màn hình LCD ta phải thực hiện chuyển ñổi dữ liệu
8-bit nhị phân về mã ASCII.
chương trình
ACALL LCD_SET_UP ; Khởi ñộng LCD
MOV TMOD,#00000110B ; Chọn Timer0,Mod2,C/T=1
MOV TH0,# - 60 ; Nạp giá trị ñếm 60 xung
SETB P3.4 ; Lấy T0 làm ñầu vào
AGAIN: SETB TR0 ; Bắt ñầu ñếm T0
BACK: MOV A,TL0 ; ðọc giá trị của TL0 vào A
ACALL CONV ; Chuyển ñổi dữ liệu sang ASCII
ACALL DISPLAY ; Hiển thị lên LCD
JNB TF0,BACK ; Chờ tràn
CLR TR0 ; Dừng bộ ñếm
CLR TF0 ; Xóa cờ tràn
SJMP AGAIN ; Lặp lại
; Chuyển ñổi dữ liệu sang ASCII sử dụng các thanh ghi R2,R3,R4
CONV: MOV B,#10
DIV AB ; Chia số cần chuyển ñổi cho 10
MOV R2,B ; Lưu số dư của phép chia vào R2
MOV B,#10
DIV AB ; Chia cho 10 một lần nữa
ORL A,#30H ; ðổi về ASCII
MOV R4,A ; Lưu số thứ nhất vào R4
MOV A,B ; Lấy số thứ 2 vào A
ORL A,#30H ; ðổi số thứ 2 về ASCII
MOV R3,A ; Lưu số thứ 2 vào R3
MOV A,R2 ; Lấy số thứ nhất vào A
ORL A,#30H ; ðổi số thứ 1 về ASCII
MOV R2,A ; Cất vào R2
RET

56
12. LẬP TRÌNH GIAO TIẾP NỐI TIẾP

I. CƠ SỞ CỦA TRUYỀN THÔNG TIN NỐI TIẾP


Máy tính thường truyền dữ liệu theo 2 phương pháp: song song và nối tiếp.
Truyền dữ liệu song song thường dùng 8 hoặc nhiều ñường dây dẫn ở cách xa một
vài met. Phương pháp này cho phép truyền dữ liệu với tốc ñộ cao nhờ dùng nhiều
dây dẫn ñể truyền dữ liệu ñồng thời, nhưng khoảng cách truyền thì bị hạn chế. ðể
truyền dữ liệu ñi xa thường dùng phương pháp truyền nối tiếp, phương pháp này
truyền dữ liệu theo từng bit một.

Truyền nối tiếp Truyền song song


D0
Máy phát Máy thu
Máy Máy
phát thu

D7

ðể truyền tin nối tiếp, người ta sử dụng một ñường dữ liệu thay thế cho bus dữ
liệu 8 bit của truyền tin song song. Nhờ vậy không chỉ làm giá thành hạ hơn nhiều
mà còn mở ra một khả năng ñể 2 máy tính ở cách rất xa nhau vẫn có thể truyền
thông với nhau.
ðể tổ chức truyền tin nối tiếp, trước hết byte dữ liệu ñược chuyển thành các bit
nối tiếp nhờ thanh ghi dịch vào song song - ra nối tiếp. Tiếp theo, dữ liệu ñược
truyền qua một ñường truyền dữ liệu ñơn. Ở ñầu thu cũng phải có một thanh ghi
dịch vào nối tiếp - ra song song ñể nhận dữ liệu nối tiếp và sau ñó gói chúng lại
thành từng byte một.
Truyền tin có 2 phương pháp: ðồng bộ và dị bộ. Phương pháp ñồng bộ chuyển
một lần một khối dữ liệu (các ký tự), còn phương pháp dị bộ chỉ truyền từng byte
một. Bộ vi ñiều khiển 8051 ñược xây dựng sẵn một bộ thu phát dị bộ tổng hợp
UART (Universal Asynchronous Receiver Transmitter).

Khái niệm truyền dữ liệu ñơn công và song công


- Truyền ñơn công: Máy phát chỉ có phát dữ liệu, bên máy thu chỉ có thu dữ
liệu.

57
- Truyền song công: Mỗi bên ñều vừa có thể phát, vừa có thể thu dữ liệu.
Truyền song công có 2 loại: song công hoàn toàn và bán song công.
+ Bán song công: Tại một thời ñiểm dữ liệu chỉ có thể truyền một
chiều.
+ Song công hoàn toàn: Dữ liệu có thể truyền cả hai chiều ñồng thời.

ðơn công Bộ phát Bộ thu

Bộ phát Bộ phát
Bán song
công
Bộ thu Bộ thu

Bộ phát Bộ phát
Song công
Bộ thu Bộ thu

Truyền thông nối tiếp không ñồng bộ và ñịnh khung dữ liệu


Dữ liệu tới ñầu thu của ñường truyền là các tín hiệu 0 và 1 nối tiếp nhau. ðể xác
ñịnh ñược nội dung của dữ liệu thì giữa ñầu phát và ñầu thu phải có một quy tắc
thống nhất gọi là giao thức (Protocol). Giao thức ñó quy ñịnh: Dữ liệu ñược sắp
xếp như thế nào, có bao nhiêu bit tạo thành một kí tự, khi nào bắt ñầu và khi nào
kết thúc dữ liệu,...
Ở phương pháp không ñồng bộ, mỗi kí tự ñược bố trí vào giữa bit khởi ñộng và
bit dừng, người ta gọi cách thức này là ñịnh khung (frame). Bit khởi ñộng luôn chỉ
có một bit, còn bit dừng có thể có 1 hoặc 2 bit. Bit khởi ñộng luôn có giá trị 0 (mức
thấp), còn bit dừng có giá trị cao (mức 1).
Ví dụ:

Stop 0 1 0 0 0 0 0 1 Start Mark


Space bÝt bÝt

d7 d0
Goes out last Goes out
first
Hướng truyền dữ liệu

58
Trên hình vẽ là khung truyền một ký tự "A" của mã ASCII, có mã Hexa là 41H,
mã nhị phân truyền ñi là 0100 0001, ñược ñịnh khung giữa một bit khởi ñộng và
một bit dừng.
Trình tự truyền ký tự bắt ñầu với bit khởi ñộng, tiếp theo là bit có trọng số nhỏ
nhất D0, tiếp nữa là các bit còn lại cho ñến bit có trọng số lớn nhất là D7, và cuối
cùng là bit dừng ñể báo rằng ñã kết thúc ký tự "A".
Trên hình vẽ ở ví dụ trên, khi không truyền thì tín hiệu ở mức 1 gọi là dấu
(mark), tín hiệu ở mức 0 gọi là khoảng trống (space).
Trong một số hệ thống trước ñây, do thiết bị thu không nhanh nên cần sử dụng
2 bit dừng ñể thiết bị có ñủ thời gian cho việc truyền byte tiếp theo. Tuy nhiên
trong máy tính PC hiện ñại phổ biến sử dụng một bit dừng.
Ở một số hệ thống, nhằm tăng khả năng bảo toàn của dữ liệu, người ta còn thêm
vào khung dữ liệu một bit kiểm tra lỗi chẵn lẻ. Bit kiểm tra này có thể là bậc chẵn
hoặc bậc lẻ. Bit bậc lẻ có tổng các số 1 của các bit dữ liệu cùng với bit kiểm tra là
một số lẻ. Tương tự, bit bậc chẵn có tổng các số 1 của các bit dữ liệu cùng với bit
kiểm tra là một số chẵn. Nếu trong khung dữ liệu có bit kiểm tra chẵn lẻ, thì bit này
ñược gửi ñi sau bit MSB và trước bit dừng.

Tốc ñộ truyền dữ liệu


Tốc ñộ truyền tin nối tiếp ñược tính bằng bit/giây bps (Bit per Second). Một
thuật ngữ khác cũng thường ñược sử dụng là buad.
Tuy nhiên, khái niệm bps và baud không hoàn toàn giống nhau. Baud là ñơn vị
dùng cho modem và ñược ñịnh nghĩa là số lần thay ñổi tín hiệu trong một giây. ðối
với modem, mỗi lần thay ñổi tín hiệu có thể truyền ñược nhiều bit dữ liệu. Còn ñối
với ñường truyền thì tốc ñộ baud và bps là một.

Chuẩn RS232
ðể ñảm bảo sự tương thích giữa các thiết bị truyền dữ liệu nối tiếp do các hãng
khác nhau sản xuất, năm 1960 Hiệp hội công nghiệp ñiện tử EIA ñã xây dựng một
chuẩn giao diện ñược gọi là RS232. Ngày nay, RS232 là chuẩn giao diện I/O ñược
sử dụng rộng rãi nhất.
Tuy nhiên, do chuẩn này ra ñời ñã khá lâu, trước khi có họ mạch vi ñiện tử
TTL, vì vậy các mức ñiện áp vào/ra của nó không tương thích với TTL. Ở RS232,
mức logic 1 tương ñương từ -3V ñến -25V, còn mức 0 tương ứng từ +3V ñến
+25V, khoảng từ -3V ñến +3V không xác ñịnh.

59
Do ñó, ñể kết nối RS232 với máy tính ñều phải qua bộ biến ñổi ñiện áp như
MAX232 ñể chuyển mức logic TTL sang mức ñiện áp của RS232 và ngược lại.
Bảng sau ñây giới thiệu sơ ñồ bố trí chân của RS232 dạng DB-9.

1 5

6 9

Kết nối ñơn giản nhất giữa PC và một bộ vi ñiều khiển yêu cầu tối thiểu những
chân sau: TxD, RxD và GND.

TxD TxD

RxD RxD

GND GND

Chân Mô tả Ý nghĩa
1 Data carrier detect (DCD) Tách tín hiệu mang dữ liệu
2 Received data (RxD) Dữ liệu ñược nhận
3 Transmitted data (TxD) Dữ liệu ñược gửi
4 Data terminal ready (DTR) ðầu cuối dữ liệu sẵn sàng
5 Signal ground (GND) ðất của tín hiệu
6 Data set ready (DSR) Dữ liệu sẵn sàng
7 Request to send (RTS) Yêu cầu gửi
8 Clear to send (CTS) Xóa ñể gửi

9 Ring indicator (RL) Báo chuông

60
NỐI GHÉP 8051 VỚI RS232
Vc
+ c C3
C1 16 8051
2 +
+ Max232
6 C4 11 11 14 2 5
C2
+
P3.1
T1IIN T1OUT TxD 10 12 13 3
11 14
2 R1OUT R1IIN P3.0
12 13
2
RxD
T2IIN T2OUT DB - 9
10 7
R2OUT R2IIN
9 8
15
TTL side Rs232 side

Max232 có hai bộ ñiều khiển ñường truyền là nhận và truyền dữ liệu. Các bộ
ñiều khiển ñường truyền dùng cho TxD gọi là T1 và T2. Trong nhiều ứng dụng thì
chỉ có một cặp ñược dùng. Ví dụ T1 và R1 ñược dùng với nhau cho trường hợp
TxD và RxD của 8051, còn cặp R2 và T2 thì không dùng ñến.
Bộ ñiều khiển T1 của MAX232 có gán T1in và T1out trên các chân 11 và 14
tương ứng. Chân T1in ở phía TTL và ñược nối tới chân P3.1 (TxD) của bộ vi ñiều
khiển, còn T1out ở phía RS232 và ñược nối tới chân RxD (số 2) của DB-9.
Bộ ñiều khiển ñường R1 cũng có gán R1in và R1out trên các chân 13 và 12 tương
ứng. Chân R1in (số 13) ở phía RS232 và ñược nối tới chân TxD (số 3) của DB-9.
Chân R1out ở phía TTL và ñược nối tới chân RxD (P3.0) của vi ñiều khiển.
MAX232 cần 4 tụ ñiện giá trị từ 1µF ñến 22µF, giá trị thường dùng là 10µF.

II. LẬP TRÌNH TRUYỀN THÔNG NỐI TIẾP CHO 8051


ðể thực hiện truyền dữ liệu không có lỗi giữa máy tính PC và hệ 8051 thì tốc
ñộ baud của hệ 8051 phải phù hợp với tốc ñộ baud của cổng COM máy tính PC.
Tốc ñộ baud của cổng COM: 100, 150, 300, 600, 1200, 2400, 4800, 9600,
19200.

* Quan hệ giữa tần số thạch anh và tốc ñộ baud của 8051


Như ta biêt, 1 chu kỳ máy bằng 12 chu kỳ dao ñộng của thạch anh. Vậy tần số
của chu kỳ máy bằng 1/12 tần số của dao ñộng thạch anh. Nếu XTAL =
11,0592MHz thì tần số chu kỳ máy là: 11,0592MHz : 12 = 921,6kHz.

61
Mạch UART truyền nối tiếp của 8051 lại chia tần số chy kỳ máy cho 32 một lần
nữa trước khi ñưa ñến Timer 1 ñể tạo ra tốc ñộ baud. Do vậy, 921,6kHz : 32 =
28,8kHz là tần số sẽ ñược dùng ñể xác ñịnh tốc ñộ baud.

28800Hz
XTAL ÷ 12 ÷ 32
oscillator 921.6kHz by UART

Muốn Timer 1 ñặt tốc ñộ baud thì nó phải ñược lập trình về mode 2, ñó là chế
ñộ 8-bit tự ñộng nạp lại. ðể có tốc ñộ baud tương thích với PC ta phải nạp TH1
theo các giá trị cho trong bảng sau ñây.

Tốc ñộ baud TH1 (thập phân) TH1 (số HEXA)


9600 -3 ED
4800 -6 FA
2400 -12 F4
1200 -24 E8

THANH GHI SBUF


SBUF là thanh ghi 8-bit ñược dùng cho truyền thông nối tiếp của 8051. ðể byte
dữ liệu ñược truyền qua ñường TxD thì cần ñặt dữ liệu trong thanh ghi SBUF.
Tương tự, SBUF lưu một byte dữ liệu khi nó ñược nhận qua ñường RxD của 8051.
SBUF có thể ñược mọi thanh ghi của 8051 truy cập.
MOV SBUF,#"A"
MOV A,SBUF
MOV SBUF,A
Khi byte dữ liệu ñược ghi vào thanh ghi SBUF thì byte sẽ ñược ñịnh khung dữ
liệu với bit Start và Stop và ñược truyền nối tiếp qua chân TxD. Tương tự như vậy,
khi các bit ñược nhận nối tiếp từ RxD thì 8051 mở khung, loại trừ các bit Start và
Stop ñể lấy ra một byte từ dữ liệu nhận ñược và ñặt vào thanh ghi SBUF.

THANH GHI ðIỀU KHIỂN NỐI TIẾP SCON (ðịnh ñịa chỉ bit)

SM0 SM1 SM2 REN TB8 RB8 TI RI

SM0 và SM1: Các bit D7 và D6 của thanh ghi SCON, dùng ñể xác ñịnh chế ñộ
khung dữ liệu bằng cách xác ñịnh số bit của một ký tự và các bit Start và Stop.

62
SM0 SM1
0 0 Mode 0
0 1 Mode 1: 1 Start, 8 bit Data, 1 Stop
1 0 Mode 2
1 1 Mode 3

SM0 SCON.7
Xác ñịnh chế ñộ làm việc cổng
SM1 SCON.6
SM2 SCON.5 Dùng cho truyền thông giữa các bộ vi xử lý
Bật/tắt bằng phần mềm ñể cho/không cho
REN SCON.4
phép thu.
TB8 SCON.3 Ít sử dụng.
RB8 SCON.2 Ít sử dụng.
Cờ ngắt truyền. ðặt bằng phần cứng khi bắt
TI SCON.1 ñầu bit Sop (kết thúc việc truyền một ký tự) ở
mode 1. Xóa bằng phần mềm.
Cờ ngắt truyền. ðặt bằng phần cứng khi bắt
RI SCON.0 ñầu bit Sop (kết thúc việc nhận một ký tự) ở
mode 1. Xóa bằng phần mềm.

Trong các chế ñộ ở trên, chúng ta chỉ quan tâm ñến chế ñộ 1. Ở chế ñộ 1, dữ
liệu ñược ñịnh khung gồm 8 bit dữ liệu, 1 bit Start, 1 bit Stop ñể tương thích với
cổng COM của IBM PC và các máy tính khác. Chế ñộ 1 cho phép tốc ñộ baud thay
ñổi và do Timer 1 của 8051 thiết lập.

REN
Là bit cho phép thu (Receive Enable), bit SCON.4. Khi bit REN ở mức cao thì
nó cho phép 8051 nhận dữ liệu trên chân RxD. Như vậy, nếu muốn 8051 vừa phát
vừa thu dữ liệu thì bit REN phải ñược ñặt lên 1. Nếu REN = 0 thì bộ thu bị khóa.

TI và RI
Cờ ngắt phát (Transmit Interrupt) và cờ ngắt thu (Receive Interrupt). ðây là 2
bit cờ rất quan trọng của thanh ghi SCON.
Khi 8051 kết thúc việc phát 1 ký tự 8-bit thì cờ TI ñược bật ñể báo rằng bộ vi
ñiều khiển sẵn sàng phát byte tiếp theo. Bit TI ñược bật ngay khi bắt ñầu bit Stop
(truyền xong).
Khi 8051 nhận ñược dữ liệu nối tiếp qua chân RxD thì tiến hành tách các bit
Start và Stop ñể lấy ra 8 bit dữ liệu và ñặt vào thanh ghi SBUF. Sau khi quá trình
này hoàn tất, cờ RI ñược bật ñể báo rằng bộ vi ñiều khiển ñã nhận ñược một byte
và cần phải ñược cất ñi chỗ khác nếu không sẽ bị mất. Cờ RI ñược set khi ñang
tách bit Stop (ngay khi vừa nhận xong).

a) TRÌNH TỰ LẬP TRÌNH 8051 TRUYỀN DỮ LIỆU NỐI TIẾP


1- Nạp vào thanh ghi TMOD giá trị 20H: Sử dụng bộ ñịnh thời Timer 1, mode
2 (tự ñộng nạp lại 8 bit).
63
2- Nạp giá trị trong bảng cài ñặt tốc ñộ baud cho thanh ghi TH1 ñể thiết lập tốc
ñộ baud truyền nối tiếp (XTAL=11,0592MHz).
3- Nạp vào thanh ghi SCON giá trị 50H: Chọn chế ñộ nối tiếp Mode 1, ñịnh
khung 8-bit data, 1 Start, 1 Stop.
4- Bật TR1=1 khởi ñộng Timer 1.
5- Ghi byte ký tự cần truyền vào SBUF.
6- Xóa cờ TI (CLR TI) khi kết thúc truyền.
Ví dụ
Viết chương trình cho 8051 ñể truyền nối tiếp liên tục 1 chữ "A" với tốc ñộ
4800 baud.
giải
MOV TMOD,#20H ; Chọn Timer 1, mode 2
MOV TH1,# -6 ; Tốc ñộ 4800baud
MOV SCON,#50H ; REN = 1, SM0=0, SM1=1
SETB TR1 ; Khởi ñộng Timer 1
AGAIN: MOV SBUF,#"A"
HERE: JNB TI,HERE ; Chờ truyền xong ký tự A
CLR TI ; Xóa bit TI cho ký tự kế tiếp
SJMP AGAIN ; Tiếp tục gửi lại chữ A

Ví dụ
Truyền liên tục chữ "YES" với tốc ñộ 9600 baud
giải
MOV TMOD,#20 ; Timer 1, mode 2
MOV TH1,# -3 ; Tốc ñộ 9600 baud
MOV SCON,#50H ; Cho phép thu, mode 1
AGAIN: MOV A,#"Y"
ACALL TRANS ; Truyền ký tự Y
MOV A,#"E"
ACALL TRANS ; Truyền ký tự Y
MOV A,#"S"
ACALL TRANS ; Truyền ký tự Y
SJMP AGAIN ;Tiếp tục lặp lại.
TRANS: MOV SBUF,A
HERE: JNB TI,HERE
CLR TI
RET

TRÌNH TỰ THỰC HIỆN CỦA 8051 KHI TRUYỀN KÝ TỰ QUA TxD


1- Ghi byte ký tự cần truyền vào SBUF.
2- Truyền bit Start.
3- Truyền 8 ký tự lần lượt từng bit một.
4- Truyền bit Stop. Trong khi truyền bit Stop bật cờ TI=1 ñể báo rằng ký tự ñã
truyền xong và bộ vi ñiều khiển sẵn sàng ñể truyền byte tiếp theo.

64
Thông qua việc kiểm tra cờ TI có thể kiểm soát việc nạp dữ liệu vào thanh ghi
SBUF. Nếu nạp một byte vào SBUF trước khi cờ TI ñược bật thì phần dữ liệu của
byte trước chưa truyền hết sẽ bị mất.
Ngay sau khi truyền xong một ký tự (kiểm tra bằng lệnh JNB TI,...) thì cờ TI
cần ñược xóa về 0 bởi người lập trình nhờ lệnh "CLR TI" ñể báo byte mới có thể
truyền.

b) TRÌNH TỰ LẬP TRÌNH NHẬN DỮ LIỆU NỐI TIẾP


1- Nạp giá trị 20H vào TMOD: Chọn Timer 1, mode 2 (8-bit auto reload).
2- Nạp tốc ñộ baud vào TH1. (XTAL = 11,0592MHz)
3- Nạp giá trị 50H vào thanh ghi SCON: Chọn mode 1 (ñịnh khung 8-bit data, 1
Start, 1 Stop), cho phép nhận.
4- Bật TR1 = 1 ñể khởi ñộng Timer 1.
5- Bit cờ RI ñược kiểm tra bằng lệnh "JNB RI,xx" ñể xác ñịnh xem toàn bộ ký
tự ñã ñược nhận chưa.
6- Khi RI ñược thiết lập thì trong SBUF ñã có 1 byte. Nội dung của nó cần
ñược lưu vào một nơi an toàn.
7- Xóa cờ ngắt RI bằng lệnh "CLR RI".
8- Quay trở về bước 5 ñể nhận ký tự tiếp theo.

Ví dụ
Lập trình cho 8051 ñể nhận các byte dữ liệu nối tiếp và ñặt chúng vào cổng P1.
Tốc ñộ baud là 4800, 8 bit dữ liệu và 1 bit Stop.
Giải
MOV TMOD,#20H ; Timer 1, mode 2
MOD TH1,# -6 ; Tốc ñộ 4800
MOV SCON,#50H ; Cho phép thu, mode 1 của UART
SETB TR1 ; Khởi ñộng Timer 1
HERE: JNB RI, HERE ; ðợi nhận hết toàn bộ ký tự
MOV A,SBUF ; Cất ký tự vào thanh ghi A
MOV P1,A ; Gửi ra cổng P1
CLR RI ; Xóa cờ RI ñể sẵn sàng nhận ký tự
tiếp
SJMP HERE ; Tiếp tục nhận dữ liệu

TRÌNH TỰ THỰC HIỆN CỦA 8051 KHI NHẬN KÝ TỰ QUA TxD


1- Nhận bit Start báo rằng bit ngay sau ñó là bit dữ liệu ñầu tiên cần nhận.
2- Ký tự 8-bit ñược nhận lần lượt từng bit một. Khi bit cuối cùng ñược nhận thì
hình thành một byte và ñược ñặt vào trong SBUF.
3- Ngay khi nhận ñược bit Stop thì 8051 bật RI=1 ñể báo rằng toàn bộ ký tự ñã
ñược nhận xong và cần ñược cất ñi trước khi có byte mới nhận về sẽ ghi ñè lên.
Thông qua việc kiểm tra trạng thái của cờ RI=1 mà ta xác ñịnh ñược một ký tự
ñã ñược nhận và nằm trong SBUF. Cần sao lại nội dung của SBUF vào một nơi an
toàn ở một số thanh ghi hay bộ nhớ trước khi có thể bị mất.

65
Sau khi nội dung SBUF ñược cất vào một nơi an toàn thì cờ RI cần ñược xóa về
0 bởi người lập trình bằng lệnh "CLR RI" ñể cho phép chuyển vào SBUF các ký
tự vừa nhận ñược tiếp theo. Nếu không thực hiện bước này thì ký tự tiếp theo sẽ bị
mất.

ðể tránh lãng phí thời gian khi bộ vi ñiều khiển liên tục kiểm tra trạng thái và
bật các cờ TI và RI, ta có thể sử dụng ngắt.

66
13. LẬP TRÌNH NGẮT TRONG 8051
Ngắt (interrupt) là sự xảy ra của một ñiều kiện - một sự kiện - làm cho chương
trình chính bị tạm ngưng trong khi ñiều kiện ñược phục vụ bởi một chương trình
khác.
Trong một hệ thống ñược ñiều khiển bởi ngắt, việc ngắt nhằm ñáp ứng một sự
kiện mà sự kiện này xuất hiện không ñồng bộ với chương trình chính ñang ñược
thực thi và chương trình chính (hay nói cách khác là CPU) không biết trước là sẽ bị
ngắt khi nào.

13.1 PHƯƠNG PHÁP NGẮT VÀ PHƯƠNG PHÁP THĂM DÒ


Một bộ vi ñiều khiển có thể phục vụ một số thiết bị. Có 2 phương pháp phục vụ
thiết bị, ñó là sử dụng ngắt và phương pháp thăm dò (polling).
Ở phương pháp ngắt, mỗi khi có một thiết bị cần phục vụ thì thiết bị sẽ báo cho
bộ vi ñiều khiển biết bằng cách gửi một tín hiệu ngắt. Khi nhận ñược tín hiệu này,
bộ vi ñiều khiển dừng mọi công việc ñang thực hiện ñể chuyển sang phục vụ thiết
bị. Chương trình ñi cùng với ngắt gọi là trình phục vụ ngắt (Interrupt Service
Routine) hay còn gọi là bộ quản lý ngắt (Interrupt handler).
ðối với phương pháp thăm dò, bộ vi ñiều khiển liên tục kiểm tra tình trạng của
thiết bị và khi ñiều kiện ñược ñáp ứng thì tiến hành phục vụ thiết bị. Sau ñó bộ vi
ñiều khiển chuyển qua kiểm tra trạng thái của thiết bị tiếp theo cho ñến khi tất cả
ñều ñược phục vụ.
ðiểm mạnh của phương pháp ngắt là bộ vi ñiều khiển có thể phục vụ ñược
nhiều thiết bị, nhưng dĩ nhiên không cùng một thời ñiểm. Mỗi thiết bị có thể ñược
bộ vi ñiều khiển phục vụ dựa theo mức ưu tiên ñược gán. Ở phương pháp thăm dò
thì không thể gán mức ưu tiên cho thiết bị ñược vì bộ vi ñiều khiển tiến hành kiểm
tra các thiết bị theo phương pháp hỏi vòng. Ngoài ra, phương pháp ngắt cho phép
bộ vi ñiều khiển che hoặc bỏ qua một yêu cầu phục vụ của thiết bị, ñiều mà
phương pháp thăm dò không thực hiện ñược.

13.2 TRÌNH DỊCH VỤ NGẮT - ISR (Interrupt Service Routine)


Chương trình xử lý một ngắt ñược gọi là Trình phục vụ ngắt (ISR) hay Quản lý
ngắt (Interrupt Handler). Khi một ngắt xuất hiện, việc thực thi chương trình chính
bị tạm dừng và CPU thực hiện việc rẽ nhánh ñến trình phục vụ ngắt ISR. CPU thực
thi ISR và kết thúc việc thực thi này khi gặp lệnh RETI; chương trình chính ñược
tiếp tục tại nơi bị tạm dừng. Ta có thể nói chương trình chính ñược thực thi ở mức
nền (base level) còn ISR ñược thực thi ở mức ngắt (interrupt level).
67
Trình phục vụ ngắt của mỗi ngắt có một vị trí cố ñịnh trong bộ nhớ ñể lưu trữ
ñịa chỉ ISR. Tập hợp các ô nhớ lưu trữ ñịa chỉ của tất cả các ISR gọi là bảng vectơ
ngắt.

13.3 TRÌNH TỰ THỰC HIỆN MỘT NGẮT


Khi kích hoạt một ngắt bộ vi ñiều khiển ñi qua các bước sau:
1. Kết thúc lệnh ñang thực hiện và lưu ñịa chỉ của lệnh kế tiếp (PC) vào ngăn
xếp.
2. Lưu tình trạng hiện tại của tất cả các ngắt vào bên trong (nghĩa là không lưu
vào ngăn xếp).
3. Nó nhảy ñến một vị trí cố ñịnh trong bộ nhớ ñược gọi là bảng véc tơ ngắt
nơi lưu giữ ñịa chỉ của một trình phục vụ ngắt.
4. Bộ vi ñiều khiển nhận ñịa chỉ ISR từ bảng véc tơ ngắt và nhảy tới ñịa chỉ ñó.
Nó bắt ñầu thực hiện trình phục vụ ngắt cho ñến lệnh cuối cùng của ISR là
RETI (trở về từ ngắt).
5. Khi gặp lệnh RETI, bộ vi ñiều khiển quay trở về nơi nó ñã bị ngắt. Trước hết
nó nhận ñịa chỉ của bộ ñếm chương trình PC từ ngăn xếp bằng cách nạp hai
byte trên ñỉnh của ngăn xếp vào PC. Sau ñó bắt ñầu thực hiện các lệnh từ ñịa
chỉ ñó.
Lưu ý ở bước 5 ñến vai trò nhạy cảm của ngăn xếp, vì lý do này mà chúng ta
phải cẩn thận khi thao tác các nội dung của ngăn xếp trong ISR. ðặc biệt trong ISR
cũng như bất kỳ chương trình con CALL nào số lần ñẩy vào ngăn xếp (Push) và số
lần lấy ra từ nó (Pop) phải bằng nhau.

68
13.4 BẢNG VECTOR NGẮT CỦA 8051
Khi một ngắt ñược chấp nhận, giá trị ñược nạp cho bộ ñếm chương trình PC
ñược gọi là vector ngắt. Vector ngắt là ñịa chỉ bắt ñầu của trình phục vụ ngắt của
nguyên nhân ngắt tương ứng.
Ngắt ðịa chỉ ROM Chân
RESET 0000 9
Ngắt phần cứng ngoài (INT0) 0003 12 (P3.2)
Ngắt bộ Timer0 (TF0) 000B
Ngắt phần cứng ngoài 1 (INT1) 0013 13 (P3.3)
Ngắt bộ Timer1 (TF1) 001B
Ngắt COM nối tiếp (RI và TI) 0023

Việc Reset hệ thống ñược chứa trong bảng này vì nó cũng ñược xem như là một
ngắt: chương trình chính bị ngắt và bộ ñếm chương trình PC ñược nạp giá trị mới.
1. RESET: Khi chân Reset ñược kích hoạt thì 8051 nhảy về ñịa chỉ 0000.
2. Hai ngắt dành cho bộ ñịnh thời Timer 0 và Timer 1. ðịa chỉ ở bảng vector
ngắt của hai ngắt này tương ứng với Timer 0 và Timer 1 là 000B và 001B.
3. Hai ngắt phần cứng dành cho các thiết bị bên ngoài nối tới chân 12 (P3.2) và
13 (P3.3) của cổng P3 là INT0 và INT1 tương ứng. Các ngắt ngoài cũng còn ñược
gọi là EX1 và EX2. Vị trí nhớ trong bảng vector ngắt của hai ngắt INT0 và INT1
này là 0003H và 0013H.
4. Truyền thông nối tiếp có một ngắt cho cả thu lẫn phát. ðịa chỉ của ngắt này
trong bảng vector ngắt là 0023H.
Số lượng byte hạn chế dành riêng cho từng ngắt: 8 byte. Ví dụ, ñối với ngắt
INT0 ngắt phần cứng bên ngoài 0 thì có tổng cộng là 8 byte từ ñịa chỉ 0003H ñến
000AH dành cho nó. Tương tự như vậy, 8 byte từ ñịa chỉ 000BH ñến 0012H là
dành cho ngắt bộ ñịnh thời 0 là TI0. Nếu trình phục vụ ngắt ñối mặt với một ngắt
ñã cho mà ngắn ñủ ñặt vừa không gian nhớ ñược. Nếu không vừa thì một lệnh
LJMP ñược ñặt vào trong bảng véc tơ ngắt ñể chỉ ñến ñịa chỉ của ISR, ở trường
hợp này thì các byte còn lại ñược cấp cho ngắt này không dùng ñến.
13.5 ƯU TIÊN NGẮT
Mỗi một nguyên nhân ngắt ñược lập trình riêng rẽ ñể có một trong hai mức ưu
tiên thông qua thanh ghi chức năng ñặc biệt ñược ñịnh ñịa chỉ bit: thanh ghi ưu tiên
ngắt IP (interrupt priority), thanh ghi này có ñịa chỉ byte là 0B8H.

69
Bit Ký hiệu ðịa chỉ bit Mô tả
IP.7 . . Không sử dụng
IP.6 . . Không sử dụng
IP.5 PT2 BDH Ưu tiên ngắt cho bộ ñịnh thời 2
IP.4 PS BCH Ưu tiên ngắt cho port nối tiếp
IP.3 PT1 BBH Ưu tiên ngắt cho bộ ñịnh thời 1
IP.2 PX1 BAH Ưu tiên cho ngắt ngoài 1
IP.1 PT0 B9H Ưu tiên ngắt cho bộ ñịnh thời 0
IP.0 PX0 B8H Ưu tiên cho ngắt ngoài 0

Khi hệ thống ñược thiết lập lại trạng thái ban ñầu, thanh ghi IP sẽ mặc ñịnh tất
cả các ngắt ở mức ưu tiên thấp.
Ý tưởng “các mức ưu tiên ngắt” cho phép một trình phục vụ ngắt ñược tạm
dừng bởi một ngắt khác nếu ngắt mới này có mức ưu tiên cao hơn mức ưu tiên của
ngắt hiện ñang ñược phục vụ. ðối với 8051 chỉ có 2 mức ưu tiên ngắt. Nếu có ngắt
với mức ưu tiên cao xuất hiện, trình phục vụ ngắt cho ngắt có mức ưu tiên thấp
phải tạm dừng (nghĩa là bị ngắt). Ta không thể tạm dừng một chương trình phục vụ
ngắt có mức ưu tiên cao.
Chương trình chính do ñược thực thi ở mức nền và không ñược kết hợp với một
ngắt nào nên luôn luôn bị ngắt bởi các ngắt cho dù các ngắt này có mức ưu tiên
thấp hay cao. Nếu có 2 ngắt với mức ưu tiên ngắt khác nhau xuất hiện ñồng thời,
ngắt có mức ưu tiên cao sẽ ñược phục vụ trước.
Nếu có 2 ngắt cùng mức ưu tiên xuất hiện ñồng thời, chuỗi vòng cố ñịnh sẽ xác
ñịnh ngắt nào ñược phục vụ trước. Chuỗi vòng này sẽ là: Ngắt ngoài 0, ngắt do bộ
ñịnh thời 0, ngắt ngoài 1, ngắt do bộ ñịnh thời 1, ngắt do port nối tiếp, ngắt do bộ
ñịnh thời 2.
Trạng thái của tất cả các nguyên nhân ngắt ñược thể hiện thông qua các bit cờ
tương ứng trong các thanh ghi chức năng ñặc biệt có liên quan. Dĩ nhiên nếu một
ngắt nào ñó không ñược phép, nguyên nhân ngắt tương ứng không thể tạo ra ngắt
nhưng phần mềm vẫn có thể kiểm tra cờ ngắt. Ví dụ như bộ ñịnh thời và port nối
tiếp trong các phần trước sử dụng cờ ngắt một cách rộng rãi dù không có ngắt
tương ứng xảy ra, nghĩa là không sử dụng các ngắt.
Ngắt do port nối tiếp là kết quả OR của cờ ngắt khi thu RI (cờ ngắt thu) với cờ
ngắt khi phát TI (cờ ngắt phát). Ngắt do bộ ñịnh thời 2 ñược tạo ra do cờ tràn của
bộ ñịnh thời TF2 hoặc do cờ từ bên ngoài EXF2.
70
13.6 CÁC BƯỚC KHI CHO PHÉP MỘT NGẮT
Khi Reset thì tất cả mọi ngắt ñều bị cấm (bị che) có nghĩa là không có ngắt nào
sẽ ñược bộ vi ñiều khiển ñáp ứng nếu chúng ñược kích hoạt. Các ngắt phải ñược
kích hoạt bằng phần mềm ñể bộ vi ñiều khiển ñáp ứng chúng. Có một thanh ghi
ñược gọi là cho phép ngắt IE (Interrupt Enable) chịu trách nhiệm về việc cho phép
(không che) và cấm (che) các ngắt. IE là thanh ghi có thể ñịnh ñịa chỉ theo bít.

ðể cho phép một ngắt ta phải thực hiện các bước sau:
1. Bít D7 của thanh ghi IE là EA phải ñược bật lên cao ñể cho phép các bít còn lại
của thanh ghi có hiệu lực.
2. Nếu EA = 1 thì tất cả mọi ngắt ñều ñược phép và sẽ ñược ñáp ứng nếu các bít
tương ứng của chúng trong IE có mức cao. Nếu EA = 0 thì không có ngắt nào
sẽ ñược ñáp ứng cho dù bít tương ứng của nó trong IE có giá trị cao.
Thanh ghi cho phép ngắt IE.

D7 D0

EA -- ET2 ES ET1 EX1 ET0 EX0

EA IE.7 Nếu EA = 0 thì mọi ngắt bị cấm


Nếu EA = 1 thì mỗi nguồn ngắt ñược cho phép hoặc bị cấm
bằng các bật hoặc xoá bít cho phép của nó.
71
-- IE.6 Dự phòng cho tương lai
ET2 IE.5 Cho phép hoặc cấm ngắt tràn hoặc thu của Timer2 (8051)
ES IE.4 Cho phép hoặc cấm ngắt cổng nối tiếp
ET1 IE.3 Cho phép hoặc cấm ngắt tràn của Timer1
EX1 IE.2 Cho phép hoặc cấm ngắt ngoài 1
ET0 IE.1 Cho phép hoặc cấm ngắt tràn của Timer0
EX0 IE.0 Cho phép hoặc cấm ngắt ngoài 0
* Người dùng không phải ghi 1 vào bít dự phòng này.
13.7 LẬP TRÌNH NGẮT CHO BỘ ðỊNH THỜI
Trong phần trước chúng ta ñã giới thiệu cách sử dụng các bộ ñịnh thời Timer 0
và Timer 1 bằng phương pháp thăm dò. Trong phần này chúng ta sẽ sử dụng các
ngắt ñể lập trình cho các bộ ñịnh thời của 8051.

Vector ngắt Timer 0 Vector ngắt Timer 1


TF0 TF1
1 000BH 1 001BH
Nhảy tới Nhảy tới

Cờ quay về 0 của bộ ñịnh thời và ngắt


Trong phần lập trình Timer/Counter chúng ta ñã biết rằng cờ bộ ñịnh thời TF
ñược ñặt lên cao khi bộ ñịnh thời ñạt giá trị cực ñại và quay về 0 (Roll - over).
Chúng ta cũng chỉ ra cách hiển thị cờ TF bằng lệnh “JNB TF, ñích”. Khi thăm dò
cờ TF thì ta phải ñợi cho ñến khi cờ TF ñược bật lên. Nhược ñiểm của phương
pháp này là bộ vi ñiều khiển phải kiểm tra cờ TF ñược bật lên và trong quá trình ñó
không thể làm ñược bất kỳ việc gì khác. Sử dụng phương pháp ngắt giải quyết
ñược vấn ñề này. Nếu bit ngắt bộ ñịnh thời trong thanh ghi IE ñược phép thì mỗi
khi bộ ñịnh thời quay trở về 0 cờ TF ñược bật lên và bộ vi ñiều khiển bị ngắt tại
bất kỳ việc gì nó ñang thực hiện và nhảy tới bảng véc tơ ngắt ñể phục vụ ISR.
Bằng cách này thì bộ vi ñiều khiển có thể làm những công việc khác cho ñến khi
nào nó ñược thông báo rằng bộ ñịnh thời ñã quay về 0.
VÍ DỤ
Viết chương trình nhận liên tục dữ liệu 8 bit ở cổng P0 và gửi ñến cổng P1.
Trong thời gian này cần tạo ra trên chân P2.1 một sóng vuông chu kỳ 200µ
µs.

72
Sử dụng bộ Timer 0 ñể tạo ra sóng vuông, tần số của 8051 là XTAL =
11.0592MHz.
GIẢI

START

Nhảy qua bảng


vector ngắt

Sử dụng bộ Timer 0 ở chế ñộ 2 (Auto-Reload), nạp giá trị cho TH0 là


100/1,085µs = 92.

ORG 0x0000
LJMP MAIN ; Bo qua bang Vecto ngat
ORG 000BH ; Vecto ngat cua Timer 0
CPL P2.1 ; Dao muc logic tren chan P2.1
RETI
ORG 0030H ; Dia chi sau bang vecto ngat
MAIN: MOV TMOD,#20H ; Chon Timer 0, che do 2
MOV P0,#0xFF ; Lay P0 lam cong vao
MOV TH0,#-92; Dat TH0 = A4H cho -92
MOV IE,#10000010B; Cho phep ngat Timer 0
SETB TR0 ; Khoi dong bo Timer 0
BACK: MOV A,P0 ; Nhan du lieu tu cong P0
MOV P1,A ; Chuyen du lieu den cong P1
SJMP BACK ;Tiep tuc nhan du lieu va chuyen
du
; lieu chung nao chua bi TF0
ngat
END

73
14. LẬP TRÌNH HỢP NGỮ

Hợp ngữ (Assembly Language programming) là ngôn ngữ của máy tính có vị
trí giữa ngôn ngữ máy và ngôn ngữ cấp cao. Các ngôn ngữ cấp cao ñiển hình như
Pascal, C sử dụng các từ và các phát biểu dễ hiểu ñối với con người. Ngôn ngữ
máy là ngôn ngữ ở dạng số nhị phân của máy tính. Một chương trình viết bằng
ngôn ngữ máy là một chuỗi các byte nhị phân biểu diễn các lệnh mà máy tính thực
thi ñược.
Hợp ngữ thay thế các mã nhị phân của ngôn ngữ máy bằng các mã gợi nhớ giúp
ta dễ nhớ hơn và dễ lập trình hơn.
Một chương trình viết bằng hợp ngữ không thể ñược thực thi trực tiếp bởi máy
tính. Sau khi viết xong, chương trình này phải trải qua quá trình dịch thành ngôn
ngữ máy. Trình dịch hợp ngữ là chương trình dùng ñể dịch một chương trình hợp
ngữ thành chương trình ngôn ngữ máy.

KHUÔN DẠNG CỦA CÁC CHƯƠNG TRÌNH HỢP NGỮ


- Các lệnh (Instruction).
- Các chỉ dẫn (Directive).
- Các ñiều khiển (Control).
- Các chú thích.
Các dòng chứa các lệnh và các chỉ dẫn phải ñược viết theo các qui luật mà trình
dịch hợp ngữ hiểu ñược. Mỗi dòng ñược chia thành các trường cách biệt nhau bởi
các khoảng trắng hoặc các tab.
Khuôn dạng tổng quát của một dòng:

([Nhãn:] [Mã gợi nhớ] [Toán hạng] [,Toán hạng] [....] [;Chú thích])

CẤU TRÚC CHƯƠNG TRÌNH


"Các phát biểu", "Các vòng lặp", "Các lựa chọn" tạo thành một tập ñầy ñủ các
cấu trúc và mọi chương trình ñều có thể ñược thực hiện bằng cách chỉ sử dụng 3
cấu trúc này. ðiều khiển chương trình ñược chuyển qua một cấu trúc ñến cấu trúc
khác mà không có các rẽ nhánh không ñiều kiện. Một cấu trúc có một ñiểm nhập
và một ñiểm thoát.
Một cách ñiển hình, một chương trình có cấu trúc chứa một trật tự có thứ bậc
các chương trình con, mỗi chương trình con có một ñiểm nhập và một ñiểm thoát.

LƯU ðỒ
Các ký hiệu thường dùng:

: Khối ñiều kiện.


74
: Mũi tên chỉ ñường ñi của chương trình.

: Hộp xử lý.

: Khối xuất/nhập.

: Khối kết thúc hoặc bắt ñầu chương trình

BA CẤU TRÚC
Mọi vấn ñề lập trình ñều có thể ñược thực hiện bằng cách dùng 3 cấu trúc:
- Các phát biểu (Statement).
- Các vòng lặp (Loop).
- Sự lựa chọn (Case).
1. Các phát biểu
Các phát biểu cung cấp cho chúng ta cơ chế cơ bản ñể thực hiện một ñiều gì ñó.
Các khả năng bao gồm việc gán một giá trị cho một biến, hoặc gọi một chương
trình con.
2. Cấu trúc vòng lặp
- WHILE/DO
- REPEAT/UNTIL
3. Cấu trúc lựa chọn
- IF/THEN/ELSE
- CASE

75
15. HƯỚNG DẪN SỬ DỤNG PHẦN MỀM

I. GIỚI THIỆU PHẦN MỀM KEIL

Phần mềm Keil µVision3 là một chương trình biên dịch cho phép người sử dụng có
thể viết ñược các chương trình ñiều khiển cho họ vi ñiều khiển MSC-51 bằng ngôn ngữ C
và cả ASM. Nó có chứa hầu hết các hàm chuẩn của ANSI-C. ðiều này giúp cho người sử
dụng có thể tận dụng ñược những hàm chuẩn của C ñể viết chương trình cho vi ñiều
khiển. Việc tổ chức chương trình thành các môdun nhỏ cũng rất dễ thực hiện. Chương
trình biên dịch cho ngôn ngữ C của nó chính là Cx51 Compiler.

Cx51 Compiler hỗ trợ tất cả các kiểu dữ liệu chuẩn của C như: char, short, int, long,
float. Ngoài ra nó còn có một vài kiểu dữ liệu ñặc biệt tương thích với họ vi ñiều khiển
MSC-51.

- Kiểu bit: ñây là kiểu dữ liệu chỉ gồm 2 giá trị 0 và 1. Nó ñược sử dụng ñể gán giá
trị cho các thanh ghi hay các ñịa chỉ có thể truy nhập ñược ñến từng bit.

- Kiểu sbit, sfr, sfr16: ðây là các kiểu dữ liệu dùng ñể ñịnh nghĩa cho các thanh ghi
chức năng ñặc biệt. Kiểu sfr dùng ñể ñịnh nghĩa cho các thanh ghi SFR 8-bit. Còn kiểu
sfr16 dùng ñể ñịnh nghĩa cho các thanh ghi SFR 16-bit như thanh ghi RCAP2 dùng ñể
lưu giữ giá trị nạp lại cho Timer 2. Kiểu sbit dùng ñể ñịnh nghĩa từng bit cho các bit
trong các thanh ghi ñặc biệt mà có thể ñịnh ñịa chỉ bit.

Ví dụ khai báo:

sfr P0 = 0x80; /* Port 0 */

sfr SP = 0x81; /* Stack Pointer */


76
sbit P0_0 = 0x80;

Về cách tổ chức bộ nhớ của vi ñiều khiển trong phần mềm Keil C51:

- Bộ nhớ chương trình: ðây là vùng nhớ chỉ ñọc trong vi ñiều khiển. Nó có thể có
dung lượng tới 64KB. Trong phần mềm Keil C51 thì vùng nhớ này ñược ñịnh dạng bằng
từ khoá code.

Ví dụ khai báo biến thuộc vùng code:

char code str[] = {“LOP_05ðLT_DHBKDN”}; //Khai báo một mảng ký tự chứa


trong vùng nhớ code

- Bộ nhớ dữ liệu trong: ðây là vùng nhớ có thể vừa ghi và ñọc. Có 3 kiểu vùng nhớ
dữ liệu ở bên trong vi ñiều khiển. ðó là các kiểu: data, idata, bdata. Vùng nhớ dữ liệu
kiểu data là vùng nhớ chứa 128 byte dữ liệu ñầu tiên của vi ñiều khiển. Vùng nhớ này có
thể truy cập thông qua ñịa chỉ trực tiếp ñược. Vùng nhớ dữ liệu kiểu idata là vùng nhớ
256 byte dữ liệu truy nhập thông qua ñịa chỉ gián tiếp. Vùng nhớ dữ liệu kiểu bdata là
vùng nhớ chứa 16 byte ñịnh ñịa chỉ bit từ ñịa chỉ 20H ñến 2FH.

Ví dụ: Khai báo biến trong vùng nhớ dữ liệu trong.

unsigned char data v1; //Khai báo biến v1

unsigned int idata v2; //Khai báo biến v2

- Bộ nhớ dữ liệu ngoài: Có 2 kiểu dữ liệu ngoài ở trong Keil C51 là XDATA và
PDATA. XDATA là vùng nhớ dữ liệu ngoài có thể ñịnh ñịa chỉ ñược ñến 64 KB dữ liệu.
PDATA là vùng nhớ chứa từng trang dữ liệu. Mỗi trang dữ liệu ngoài chứa ñược 256
byte. ðể có thể truy cập ñược bộ nhớ dữ liệu ngoài, ta phải dùng từ khoá _at_ ñể ñịnh ñịa
chỉ cho các biến.

Ví dụ khai báo biến trong vùng nhớ dữ liệu ngoài:

float xdata a1 _at_ 0x2000; //Khai báo biến a1 có ñịa chỉ 2000H

unsigned long pdata a2 _at_ 0x2004; // Biến a2 có ñịa chỉ 2004

Con trỏ trong Keil C51 ñược khai báo giống như khai báo con trỏ trong ngôn ngữ C.

Ví dụ về khai báo con trỏ:

char *s; //Con trỏ của một string

77
int *p; //Con trỏ kiểu int

Con trỏ ñược sử dụng ñể truy cập tới bất cứ phần bộ nhớ nào của vi ñiều khiển. Có
hai cách khai báo sử dụng con trỏ. Generic Pointers là kiểu con trỏ dùng chung. Khai báo
con trỏ sẽ chiếm 3 byte của vùng nhớ dữ liệu mà nó trỏ ñến.

Con trỏ còn có thể khai báo vùng nhớ dữ liệu cho con trỏ.

Ví dụ:

char data *str; /* ptr to string in data */

int xdata *numtab; /* ptr to int(s) in xdata */

long code *powtab; /* ptr to long(s) in code */

Ngoài ra, Keil C51 còn là chương trình mô phỏng chip rất tốt bằng chương trình
tích hợp dScope. Nó cho phép người sử dụng mô phỏng chương trình viết trong C chạy
trên nền chip giống như thật. Người sử dụng có thể dễ dàng theo dõi giá trị của Timer,
trạng thái các ngắt, ñầu ra cổng nối tiếp, ñầu ra các port P0, ..., P3.

Ngoài các chức năng hỗ trợ mạnh cho việc lập trình với vi ñiều khiển (ñã giới thiệu
ở phần trên), Keil C51 còn là chương trình mô phỏng chip rất tốt bằng chương trình tích
hợp dScope. Nó cho phép người sử dụng mô phỏng chương trình viết trong Keil chạy
trên nền chip giống như thật. Người sử dụng có thể dễ dàng theo dõi giá trị của Timer,
trạng thái các ngắt, ñầu ra cổng nối tiếp, ñầu ra các port P0...P3.

78
II. CÁCH CÀI ðẶT VÀ SỬ DỤNG PHẦN MỀM
1.1. Phần mềm Keil
1.1.1 Cài ñặt
Chạy Files thực thi: Setup->Setup.exe, xuất hiện hộp thoại:

Chọn Full Version.

79
Bấm Next ñể tiếp tục.

Bấm Yes ñể tiếp tục.

Tại ñây, bạn chọn thư mục sẽ ñặt chương trình Keil (uV3) và bấm Next.
Gõ vào Serial Number (k1dzp - 5iush - a01ue) như hình dưới. ðiền các thông
tin cần thiết khác.

80
ðiền các thông tin khác, bấm Next.

Bấm Next ñể tiếp tục.

81
Bấm Finish: Cài ñặt thành công lúc này sẽ xuất hiện biểu tượng của uV2
và uV3 cả hai ñều sử dụng ñược, mở chương trình UV3 vào phần Help, bạn sẽ
ñược:

Ở ñây có thể xem ñược các hướng dẫn chi tiết của nhà sản xuất

1.1.2 Hướng dẫn sử dụng Keil


Click phải chuột vào biểu tượng Keil trên màn hình destop chọn Open
Xuất hiện giao diện phần mềm Keil. Vào Project chon New Project ñể mở một
file mới.

82
ðặt tên cho New Project và chọn Save.

Sẽ xuất hiện hộp thoại ñể ta chọn loại chip cần lập trình. Phần mềm này hổ trợ
rất nhiều loại chip, ví dụ nêu ta sử dụng ñể lập trình cho chip vi ñiều khiển
AT89S8252 thì các bước tiến hành như sau: Vào thư mục Atmel sẽ xuất hiện danh
sách các loại chip của hãng Atmel tìm và chọn AT89S8252 và bấm OK.

83
Xuất hiện hôp thoại hỏi: “Bạn có muốn sao chép mã nguồn của 8051 và ñưa
vào Project không? ”. Nếu muốn thì chọn Yes nếu không chọn No. Ở ñây ta chọn No
vì ta ñang soạn thảo file mới. Trên màn hình giao diện click vào biểu tượng Create
new file ñể mở trang soạn thảo mới (hoặc vào File chọn New – Ctrl+N).

Trang soạn thảo sẽ có tên mặc ñịnh là Text1. Vào File chọn Save (Ctrl+S) hoặc
click vào biểu tượng save the active document trên thanh công cụ ñể lưu file mới theo
tên mình ñặt.

Gõ tên Project vào ô File name và chọn Save.

84
Click chuột vào Taget1, Click phải chuột vào Source Group1 chọn Add File to
Group ‘Source Group 1’ ñể tạo nhóm cho Project vừa mở.

Chọn Add và ñóng hộp thoại.

85
Xuất hiện tên Project ở Source Group 1 như vậy ta ñã tạo Project mới thành
công. Tiến hành soạn thảo chương trình ở ô bên cạnh như hình dưới.

Sau khi ñã soạn thảo xong chương trình ta tiến hành biên dịch chương trinh
sang file Hex ñể nạp cho chip.Quá trình thực hiện như sau:
- Vào Project chọn Options for File ‘thuchanhKeil.asm’.

Lặp lại thao tác như trên sẽ xuất hiện hộp thoại.

86
Chọn Cancel sẽ xuất hiện hộp thoại Options for Taget ‘Taget 1’. Chip
AT89S8252 sử dụng thạch anh có tần số 12MHz nên ở ô Xtal (MHz) hộp thoại Taget
ta gõ vào số 12.

Vào Output ñánh dấu vào ô Create HEX File. Nếu muốn thay ñổi tên file khi
dich ra Hex File thì gõ tên mới vào ô Name of Executable, nếu không thì giữ nguyên.

87
Tiến hành biên dịch: Vào Project lần lượt chọn Translate, Build Taget, Rebuild
all taget file và sau mổi lần chọn phải xem thông báo ở ô Output Windown. Nếu
chương trình không báo lỗi (0 Error, 0 Warning) thì cứ tiếp tục.

88
Quá trình biên dich sang Hex File ñã thành công.
Chạy thử chương trình.
- Vào Debug chọn Start/Stop Debug Session (Ctrl+F5)

Vào Perpherals ñể ñưa ra các port từ P0 ñến P3, các bộ Timer và xem sự hoạt
ñộng của chương trình.

89
1.2. Phần mềm AEC_ISP
1.2.1 Ghép nối vói PC nạp chương trình cho vi ñiều khiển theo phương thức ISP
AEC_ISP là phần mềm của hãng AEC Electronics ASC. ðây là một phương thức
nạp dữ liệu vào vi ñiều khiển rất thuận tiện, không cần mạch nạp riêng. Các chân ña chức
năng từ P1.4 ñến P1.7 của các chip như AT89S8252, AT89S51, AT89S53… thực hiện
giao tiếp ISP này.

Sơ ñồ ghép nối

Ghi chú: Chiều dài cáp nối từ PC ñến KIT tối ña là 1m.
1.2.2 Hướng dẫn sử dụng AEC_ISP
Lưu ý: ðể có thể nạp chương trình cho vi ñiều khiển bằng phần mềm AEC_ISP
thì phần mềm này phải ñược lưu cùng với Hex file trong một thư mục.
Click phải chuột vào biểu tượng của phần mềm AEC_ISP chọn Open sẽ xuất
hiện giao diện.

90
- Thiết lập phương thức nạp chip:
Vào Setup và chọn các chế ñộ phù hợp sau ñó chọn Save setup.

- Tiến hành nạp


Vào mục Load HEX file to Flash buffer. Nhập tên Hex file muốn nạp vào Input
Filename (ví dụ : led.hex) ấn Enter.

91
Chương trình sẽ ñược dịch sang mã Hexa có dạng như sau.

Ấn Enter và chọn Program hoặc phím (E) ñể nạp chương trình.

Chọn Reset ở mức thấp (Low) và xem kết quả chương trình hiển thị trên KIT.

92
16. ðIỀU KHIỂN NGOẠI VI

Một số vi mạch thông dụng thường dùng trong thiết kế ñiều khiển ngoại vi của
vi ñiều khiển:
1. Mạch chốt tín hiệu 74HC573

Sơ ñồ chân và bảng sự thật vi mạch chốt 74HC573

74HC573 là mạch chốt tín hiệu tốc ñộ cao ñược chế tạo theo công nghệ
CMOS. Các ñặc ñiểm của vi mạch:

- Tốc ñộ truyền tín hiệu từ ñầu vào sang ñầu ra chỉ có 18 ns.

- Phạm vi ñiện áp hoạt ñộng: 2 – 6 V

- Dòng ñiện ñầu vào: lớn nhất 1µA.Hoạt ñộng: Khi chân /LE ở mức cao, ñầu
ra Q phụ thuộc vào ñầu vào D. Khi chân /LE ở mức thấp, tín hiệu ñầu vào D ñược
giữ lại ở ñầu ra cho ñến khi nào chân /LE trở lại mức cao. Khi chân /OE ở mức
cao, tất cả các ñầu ra Q ñều ở mức cao.

2. Mạch giải mã ñịa chỉ 74HC138

93
ðây là vi mạch ñược chế tạo theo công nghệ CMOS. Vi mạch này ñược dùng ñể
giải mã ñịa chỉ khi hệ thống có nhiều linh kiện cần ñịnh ñịa chỉ ghép nối. Nó là một
trong những vi mạch phổ biến nhất trong các mạch vi ñiều khiển. Tín hiệu ñầu vào
là các tín hiệu ñịa chỉ và tín hiệu ñiều khiển. Các chân ñầu ra ñảo Yk phụ thuộc vào
các chân tín hiệu ñầu vào A, B, C. Tuy nhiên các tín hiệu ñịa chỉ chỉ ñược giải mã
khi chân G1(E3) ở mức High, còn các chân /G2A(/E1), /G2B(/E2) ở mức Low.

3. Vi mạch MAX232

Hình thực tế và sơ ñồ chân vi mạch MAX232

Vi mạch MAX232 có nhiệm vụ chuyển mức ñiện áp từ 0 ÷ 5V thành ñiện áp –


12V ÷ +12V theo tiêu chuẩn RS-232 ñể phục vụ cho việc truyền thông nối tiếp.
Trên vi mạch có 2 ngõ vào của chân RxD, 2 ngõ ra của chân RxD, 2 ngõ vào của
chân TxD, 2 ngõ ra của chân TxD. Tín hiệu từ chân RxD của cổng nối tiếp trong
máy tính ñược nối vào chân /R1OUT, tín hiệu từ chân TxD của cổng nối tiếp trong

94
máy tính ñược nối T1IN của MAX232. Tương tự, chân RxD của vi ñiều khiển ñược
nối với chân /T1OUT, còn chân TxD của vi ñiều khiển ñược nối với chân R1IN của
MAX232.

4. Bộ nhớ RAM 32K 62256

Hình thực tế và sơ ñồ chân bộ nhớ RAM HC62256

Vi mạch 62256 ñược dùng làm bộ nhớ dữ liệu ngoài cho các vi ñiều khiển.

- A0 ÷ A14: là 15 bit dùng ñể xác ñịnh ñịa chỉ của các vùng nhớ trong RAM.

- /OE: Output Enable, cho phép ñọc dữ liệu từ RAM ra Data Bus.

- /WE: Write Enable, cho phép ghi dữ liệu vào RAM.

- CS1, CS2: Dùng ñể chọn chip.

- D0 ÷ D7: là các chân nối vào Data Bus của hệ thống.

5. Bộ nhớ EEPROM 32K 28C256

Bộ nhớ EEPROM nhờ sử dụng phương pháp xóa ñiện nên việc thực hiện gần
như tức thì. Có thể chọn từng Byte trong EEPROM ñể xóa. Có thể lập trình và xóa
nội dung cho EEPROM ngay trên bảng mạch chính mà không cần gở vi mạch ra
khỏi ñế. Do ñó không cần thiết bị nạp và xóa bên ngoài.

- A0 ÷A12: Là 12 bit dùng ñể xác ñịnh ñịa chỉ của các vùng nhớ trong
EEPROM.

- /OE: Output Enable, cho phép ñọc dữ liệu từ EEPROM ra Data Bus.

- /WR: Write Enable, cho phép ghi dữ liệu vào EEPROM.

- /CE: Dùng ñể chọn chip.

95
- D0 ÷ D7: là các chân nối vào Data Bus của hệ thống.

6. Màn tinh thể lỏng LCD 20 x4

ðể có thể hiển thị một cách thuận tiện, linh hoạt các thông số của hệ thống
ñồng thời ñảm bảo ñược tính mỹ thuật, ta chọn màn hình tinh thể lỏng LCD 20x4.
ðây là loại màn tinh thể lỏng gồm có 4 dòng, mỗi dòng có thể hiển thị 20 ký tự, rất
tiện cho người sử dụng trong khi làm việc với KIT.

VCC
VCC

5k
GND VRLCD1
J2_LCD

GND 1
VCC 2
Tin hieu dieu khien 3
4
5

LCD 20 x 4
6
7 PB0 7
7 PB1 8
7 PB2 9
7 PB3 10
7 PB4 11
7 PB5 12
7 PB6 13
DATA BUS 7 PB7 14
15
GND 16

150 RLCD1

VCC

VCC

Hình thực tế và sơ ñồ nối chân của LCD 20x4

96
LCD 20x4 có 3 chân ñiều khiển và 8 chân dữ liệu, 3 chân ñiều khiển là RS, R/W, E.

Chân E: ðược gọi là chân “Enable”. Chân này cho phép gửi dữ liệu vào LCD
hay không. ðể có thể gửi dữ liệu vào LCD, ñầu tiên chân này phải ñược ñưa lên
“1”. Sau khi thực hiện xong các lệnh, chân này phải ñưa xuống “0” ñể báo cho biết
rằng LCD ñã thực hiện lệnh và ñang chờ lệnh tiếp theo.

Chân RS: “Register Select”. Khi chân này ở mức “0”, LCD sẽ biết rằng các
dữ liệu truyền ñến nó dùng ñể ñiều khiển như các lệnh xóa màn hình, ñặt vị trí con
trỏ.... Nếu RS ở mức “1” các dữ liệu truyền ñến LCD ñược nó hiểu là các dữ liệu
dạng ký tự cần hiển thị.

Chân R/W: Là chân “Read/Write”. ðể có thể ghi dữ liệu lên LCD, chân này
phải ở mức “0”. Còn ñể ñọc dữ liệu từ LCD thì chân này phải ở mức “1”. Tuy nhiên
trong LCD chỉ có một lệnh ñọc dữ liệu từ LCD, ñó chính là lệnh lấy trạng thái của
LCD ñể báo cho biết nó ñang bận hay không. Chính vì vậy chân này hầu như chỉ ở
mức tín hiệu “0”.

DB0 - DB7: 8 chân dữ liệu của LCD.

Mỗi lần thực hiện một lệnh, LCD phải mất một khoảng thời gian ñể hoàn tất
việc này. Chính vì vậy khi ra lệnh thực hiện cho LCD, ta phải trễ một khoảng thời
gian. Sau ñó mới ñược thực hiện lệnh tiếp theo. Tuy nhiên phương pháp trễ không
ñược ổn dịnh và chính xác khi tần số thạch anh thay ñổi, còn một phương pháp nữa
là phương pháp kiểm tra LCD ñã sẵn sàng nhận dữ liệu hay chưa bằng cách kiểm tra
bit có trọng số cao nhất D7 - của thanh ghi lệnh (lưu ý là thanh ghi lệnh, tức khi RS
= 0), khi bit này xuống 0 báo hiệu LCD ñã sẵn sàng nhận lệnh tiếp theo. Phương
pháp này có ưu ñiểm là làm việc ổn ñịnh, ñồng bộ và không phải mất thời gian trễ
dư ra không cần thiết.

97
ðể cho LCD có thể hoạt ñộng, ñầu tiên ta phải khởi tạo LCD, báo cho nó biết
số hàng, số ký tự hiển thị trên một hàng. Các dữ liệu ñiều khiển lần lượt ñược
chuyển vào Data Bus của LCD là 38H, 0EH, và 06H. Sau các lệnh khởi tạo LCD
này ta mới có thể hiển thị ký tự lên trên màn hình LCD.

Việc xóa màn hình, ñưa con trỏ về góc trên bên trái có thể thực hiện ñược bằng
các chuyển dữ liệu ñiều khiển 01H vào Data Bus của LCD.

Các thao tác lập trình với LCD sẽ ñược bàn kỹ trong phần xây dựng các bài thí
nghiệm cho KIT.

Mã lệnh của LCD

Mã Lệnh ñến thanh ghi của Mã Lệnh ñến thanh ghi của
(Hexa) LCD (Hexa) LCD

1 Xóa màn hình hiển thị E Bật hiển thị, nhấp nháy con trỏ

2 Trở về ñầu dòng F Tắt con trỏ, nhấp nháy con trỏ

4 Dịch con trỏ sang trái 10 Dịch vị trí con trỏ sang trái

5 Dịch con trỏ sang phải 14 Dịch vị trí con trỏ sang phải

6 Dịch hiển thị sang phải 18 Dịch toàn bộ hiển thị sang trái

7 Dịch hiển thị sang trái 1C Dịch toàn bộ hiển thị sang phải

8 Tắt con trỏ, tắt hiển thị 80 ðưa con trỏ về ñầu dòng thứ nhất (*)

A Tắt hiển thị, bật con trỏ C0 ðưa con trỏ về ñầu dòng thứ hai (*)

C Bật hiển thị, tắt con trỏ 38 Hai dòng và ma trận 5x7

(*) ðịa chỉ của các dòng cụ thể của LCD như sau

Dòng 1 0080H Dòng 2 0094H

Dòng 3 00C0H Dòng 4 00D4H

Cụ thể, ví dụ ta muốn in kí tự 'A' lên dòng 2 của nữa màn hình 2 (dưới) của
LCD, ta thực hiện:

- ðặt E = 0

- Chuyển sang thanh ghi lệnh: ñặt RS = 0

98
- Gửi mã lệnh ra LCD: MOV LCD_DATA_PORT, #DONG2

- Chuyển sang thanh ghi dữ liệu: ðặt RS = 1

- In kí tự 'A': Mov LCD_DATA_PORT , #'A'

7. Vi mạch 8255
Vi mạch 8255 là một vi mạch chuyên dụng của hãng Intel dùng ñể mở rộng
thêm các cổng giao tiếp cho các vi ñiều khiển cũng như các vi ñiều khiển. Nó ñược
sử dụng rất rộng rãi trong các ứng dụng ñiều khiển bởi tính linh hoạt và ñộ ổn ñịnh
hoạt ñộng. Chip có 3 cổng A, B, C ñược truy cập riêng biệt. Các cổng này ñều có
khả năng lập trình làm cổng vào hoặc ra ñộc lập. Ngoài ra các cổng của 8255 còn có
khả năng bắt tay, do vậy, cho phép giao diện với các thiết bị khác cũng có tín hiệu
bắt tay, ví dụ như máy in.

Hình thực tế và sơ ñồ chân của vi mạch 8255

- PA0 - PA7, PB0-PB7: Cả 8 bit của cổng A, B có thể ñược lập trình thành 8
bit vào, 8 bit ra, hoặc cả 8 bit 2 chiều vào/ra.

- PC0 - PC7: Tất cả các bit của cổng C ñều có thể ñược lập trình thành các bit
vào hoặc các bit ra. 8 bit này cũng có thể ñược chia làm 2 phần: Phần cao (PC4-
PC7) là CU (Uppers bits) và phần thấp (PC0 - PC3) là CL (Lower Bits). Mỗi phần
có thể ñược sử dụng ñộc lập làm ñầu vào hoặc ra. Ngoài ra, từng bit của cổng C từ
PC0 - PC7 cũng có thể ñược lập trình riêng rẽ.

- D0÷
÷D7: Các chân dữ liệu D0-D7 của 8255 ñược nối tới các chân dữ liệu của
bộ vi ñiều khiển ñể cho phép trao ñổi dữ liệu giữa chúng.

- RD, WR: Là hai tín hiệu ñiều khiển tích cực mức thấp và là các chân vào
của 8255. Các chân tín hiệu của /RD /WR của 8031/51 ñược nối ñến các chân này.
99
- RESET: Là tín hiệu vào tích cực mức cao ñược dùng ñể xóa thanh ghi ñiều
khiển. Khi chân RESET ñược kích hoạt thì tất cả các cổng ñược khởi ñộng lại làm
các cổng vào. Trong nhiều thiết kế thì chân này ñược nối tới ñầu ra RESET của bus
hệ thống hoặc ñược nối ñất ñể không bị kích hoạt. Cũng như tất cả các chân vào của
IC, chân này cũng có thể ñể hở.

- A0, A1, /CS: /CS là chân chọn chip, còn A0, A1 cho phép chọn cổng. Các
chân này ñược dùng ñể truy cập các cổng A, B, C hoặc thanh ghi ñiều khiển như
trình bày ở bảng sau:
Bảng 2.7- Bảng chọn cổng của 8255

/CS A1 A0 Chọn cổng

0 0 0 Cổng A

0 0 1 Cổng B

0 1 0 Cổng C

0 1 1 Thanh ghi ñiều khiển

1 x x 8255 Không ñược chọn

Các chế ñộ làm việc của 8255

Các cổng A, B, C của 8255 ñược dùng ñể nhập xuất dữ liệu, còn thanh ghi
ñiều khiển thì ñược lập trình ñể chọn chế ñộ làm việc cho các cổng này. Các cổng
của 8255 ñược lập trình theo các chế ñộ sau:

- Chế ñộ 0 (Mode 0): ðây là chế ñộ vào/ra ñơn giản ở chế ñộ này, các cổng A,
B, CL, CU có thể ñược lập trình làm ñầu vào hoặc ñầu ra. Nên nhấn mạnh rằng, ở
chế ñộ 0 thì tất cả các bit hoặc làm ñầu vào, hoặc làm ñầu ra mà không thể ñiều
khiển riêng rẽ từng bit như các cổng P0- P3 của 8051. Vì các ứng dụng liên quan
ñến 8255 chủ yếu sử dụng chế ñộ này và KIT cũng chỉ sử dụng chế ñộ này nên
chúng ta sẽ tìm hiểu kỹ hơn.

- Chế ñộ 1 (Mode 1): Ở chế ñộ này, cổng A ,B có thể dùng làm cổng vào/ ra
hai chiều với khả năng bắt tay. Tín hiệu bắt tay ñược cấp bởi các bit của cổng C.

100
- Chế ñộ 2 (Mode 2): Ở chế ñộ này, cổng A có thể ñược dùng làm cổng vào/ra
hai chiều với khả năng bắt tay, tín hiệu bắt tay ñược cấp bởi các bit cổng C. Cổng B
có thể ñược dùng như ở chế ñộ vào/ ra ñơn giản hoặc ở chế ñộ bắt tay Mode 1.

- Chế ñộ BSR: ðây là chế ñộ thiết lập / xóa bit (Bit Set/Reset). Ở chế ñộ này
chỉ có những bit riêng rẽ của cổng C có thể lập trình ñược.

8. ADC0809

Sơ ñồ chân của ADC 0809

ADC0809 là vi mạch chuyển ñổi tín hiệu từ tương tự sang số 8 bit. Vi mạch
này ñược chế tạo theo công nghệ CMOS. Bộ chuyển ñổi tương tự số này sử dụng
phương pháp chuyển ñổi xấp xỉ. Sai số của phép chuyển ñổi là 1 bit. Tuy nhiên do
yêu cầu về ñộ chính xác của tín hiệu trong bộ KIT không quá cao nên sai số như
trên là chấp nhận ñược. Sau ñây là một vài ñặc ñiểm của vi mạch ADC0809:

- Nguồn nuôi 5V. Dải tín hiệu lối vào tương tự 5V khi nguồn nuôi là +5V. Có
thể mở rộng thang ño bằng các giải pháp kỹ thuật cho từng mạch cụ thể.

- Dễ dàng giao tiếp với vi ñiều khiển vì ñầu ra có bộ ñệm 3 trạng thái nên có
thể ghép trực tiếp vào kênh dữ liệu của hệ vi ñiều khiển.

- Tổng sai số chưa chỉnh 1/2 LSB.

- Thời gian chuyển ñổi phụ thuộc vào tần số ñồng hồ cấp vào chân CLK. Với
cấu tạo mạch trên ta có xung cấp vào chân CLK là 1MHz và tốc ñộ chuyển ñổi sẽ là
181µs.

- Tần số xung clock 10kHz – 1028 kHz.

- ðảm bảo sai số tuyến tính trong dải nhiệt ñộ từ – 400C ÷ 85OC.

Chức năng của các chân của ADC0809:


101
- IN0 – IN7: 8 chân ñầu vào tương tự.

- A, B, C: Các chân tín hiệu chọn kênh.

- Các chân D0 ÷ D7: Là các ñầu ra số.

- ALE: Chân tín hiệu cho phép chốt số liệu ñầu vào.

- Start: Xung cho phép bắt ñầu chuyển ñổi.

- Clk: ðầu vào cung cấp xung clock cho ADC.

- Ref(+): ðiện áp vào chuẩn +5v.

- Ref(-): ðiện áp vào chuẩn 0.

- OE: Chân cho phép xuất dữ liệu ñã chuyển ñổi ra DataBus.

- EOC: Cho biết quá trình chuyển ñổi ñã kết thúc.

- Vcc: Nguồn cung cấp.

Hoạt ñộng của ADC0809: ðầu tiên ta phát tín hiệu vào 3 chân A, B, C ñể chọn
cổng vào tương tự. ðể bắt ñầu cho ADC0809 hoạt ñộng, ta phát xung vào chân
Start. Tiếp tục phát xung ALE ñể chốt dữ liệu tương tự ñầu vào. Sau khi quá trình
chuyển ñổi tương tự - số ñã diễn ra xong. ADC0809 sẽ tự phát ra một xung trên
chân EOC ñể báo cho biết ñã kết thúc quá trình chuyển ñổi. ðể dữ liệu ñược ñưa ra
các chân D0 ÷ D7, ta phát một xung vào chân OE của ADC0809, bây giờ có thể ñọc
dữ liệu ñược.

Trong mạch nguyên lý của khối vào/ra ADC - DAC, ADC0809 ñược ñiều
khiển bởi 2 cổng của 8255. Cổng PA của 8255 ñược nối với các chân ra số của
ADC, còn việc phát xung ñiều khiển ADC ñược thực hiện bởi 4 bit thấp của cổng
PC.

9. 74LS93

ðây là bộ ñếm chia ñôi cung cấp xung nhịp cho ADC0809 bằng cánh: Lấy
xung từ chân ALE(30) của AT89S8252 rồi ñược chia 2 bởi bộ ñếm 74LS93. Nếu
tần số thạch anh của AT89S8252 là 12MHz thì xung trên ñầu ra ALE là 2MHz và
xung nhịp của ADC0809 là 1MHz.

102
Hình thực tế và sơ ñồ chân của IC74LS93

10 .DAC0808

Hình thực tế và sơ ñồ chân của DAC0808

DAC0808 là vi mạch chuyển ñổi tín hiệu từ số sang tương tự có ñộ chính xác
8 bit. Tín hiệu tương tự là dòng (Iout) và nếu nối ñiện trở tới chân Iout thì kết quả sẽ
ñược chuyển thành ñiện áp. Dòng tổng ñược cấp bởi chân Iout là một hàm số nhị
phân của các ñầu vào D0 – D7 của DAC0808 và ñược tính theo Iref như sau:

 D7 D6 D5 D 4 D3 D 2 D1 D0 
I OUT = I REF  + + + + + + + 
 2 4 8 16 32 64 128 256 

Dòng ñầu vào IREF phải ñược áp vào chân 14. Dòng IREF thường ñạt giá trị
2mA. Nếu IREF = 2mA, còn tất cả ñầu vào nối với mức cao thì dòng ñiện cực ñại ở
ñầu ra là 1.99mA.

Chuyển IOUT sang ñiện áp ở DAC0808

Nếu nối ñiện trở tới chân IOUT thì dòng ñược chuyển thành ñiện áp và có thể
kiểm tra ñầu ra bằng máy hiện sóng. Tuy nhiên, như vậy sẽ làm giảm ñộ chính xác
do bị thay ñổi trở kháng vào của tải. Vì vậy dòng IREF cần ñược cách ly bằng cách
dùng khuyếch ñại thuật toán, ví dụ như HA17741 với ñiện trở hồi tiếp Rf = 5 K.

Chức năng các chân:


103
- A1 ÷ A8: Các ñầu vào số.

- VR+: ðiện áp chuẩn dương.

- VR-: ðiện áp chuẩn âm.

- V- (VEE): ðiện áp so sánh hiệu chỉnh.

- V+: ðiện áp nguồn cung cấp.

- COMP: Chân tín hiệu so sánh.

- IOUT: Dòng ra dương.

- /IOUT: Dòng ra âm.

Sơ ñồ ứng dụng phổ biến của DAC 0808

11. ðiều khiển ñộng cơ bước


ON/OFF STEP MOTOR
1 1 2 5VCS
2 1 3 4 +12V
2 3
3 JP1SM
VCC SW5

VCC
R26 C27.3

C27.2 GND
C26 C27.1
470uF
33nF 22K 100nF 100nF
GND GND
GND

D34 D35 D36 D37


16

U27
12

J27
9

U26 1N4007 1N4007 1N4007 1N4007


GND 2 4 5 4
6 7 2 4
16 PC0 18 10 3
16 PC1 19 7 12 3 2
16 PC2 17 6 1
20 9 11 13
VCC 10 14
VCC
15 5

STEP MOTOR
1

15

L298
1 8
3

L297
D30 D31 D32 D33
11
13
14

1N4007 1N4007 1N4007 1N4007

GND
R27.1 R27.2
0.5 0.5

GND GND

STEPPER MOTOR

104
ðộng cơ bước thực hiện việc chuyển các xung ñiện thành các bước quay mịn
của motor. Do có sự tương ứng 1-1 giữa xung ñiện ñiều khiển và bước quay của
motor nên ñộng cơ bước có ñộ chính xác dịch chuyển cao. Vì vậy ñộng cơ bước
thường ñược sử dụng trong các thiết bị toạ ñộ chính xác như cánh tay robot, máy in,
máy vẽ, thiết bị khoa học...Nguyên lý hoạt ñộng và cấu tạo của ñộng cơ bước ñược
trình bày như sau:

Sơ ñồ cấu tạo của ñộng cơ bước

Như hình vẽ trên là loại ñộng cơ bước loại nam châm vĩnh cửu. Roto làm bằng
nam châm vĩnh cửu còn các cuộn dây ñược quấn trên stato. Bước góc của rôto là 900
. ðộng cơ có 4 cực ñược ñặt ở vị trí ñối diện nhau từng cặp một, gồm X , X và

Y , Y . Tuỳ thuộc vào chiều dòng ñiện chạy qua các cuộn dây mà từ trường của stato

sẽ có một hướng nhất ñịnh. Do ñó roto sẽ ñược ñịnh vị chính xác.

Việc thay ñổi thứ tự chiều dòng ñiện chạy qua các cuộn dây theo một trình tự
nhất ñịnh sẽ ñiều khiển ñược ñộng cơ chạy thuận hay chạy ngược như mong muốn.
Và tốc ñộ của ñộng cơ có thể ñược ñiều chỉnh bằng khoảng thời gian trễ giữa hai lần
thay ñổi thứ tự chiều dòng ñiện.

Theo chiều kim ñồng hồ Ngược chiều kim ñồng hồ

105
Trong mạch nguyên lý có một header 4 ñầu ra ñể ñiều khiển ñộng cơ bước
(Stepper motor). Loại ñộng cơ bước ñược lắp ñặt trên bộ KIT là ñộng cơ bước có
ñiện áp nguồn cấp là 5V và ñộ phân giải là 200, tức là với mỗi nhịp ñiều khiển,
motor bước sẽ quay một góc = 3600/200 = 1,80.

12. L297-L298

Vi mạch L297 tích hợp tất cả các mạch ñiện tử cần thiết ñể ñiều khiển ñộng
cơ bước lưỡng cực và ñơn cực. Sử dụng cùng với cầu công suất kép như L298 tạo ra
một bộ ghép hoàn chỉnh giửa bộ vi xử lý và ñộng cơ bước kiểu lưỡng cực. ðộng cơ
bước kiểu ñơn cực cũng có thể ñiều khiển ñược bằng L297 cộng với 4 cụm công
suất mắc kiểu ðalingtơn.

ðối với ñộng cơ lưỡng cực có dòng ñiện pha không quá 2A thì nên sử dụng
L297 ñồng bộ với L298N, nếu dòng ñiện dưới 1A thì tốt hơn hết là sử dụng L293E
(L293E sẽ rất có lợi khi không cần ñiều khiển ñộ rộng xung). Khi cần dòng ñiện lớn
hơn thì sử dụng bóng bán dẫn công suất hoặc các cặp ðalingtơn. ðối với ñộng cơ
ñơn cực, dãy ðalingtơn như kiểu DLN2075B là phù hợp.

Vi mạch L297 Vi mạch L298

Việc ñiều khiển tốc ñộ ñộng cơ bước phụ thuộc vào tần số phát xung vào chân 18
của vi mạch L297.

106
- Chân 17 dùng ñể chọn chiều quay cho ñộng cơ.

- Chân 19 chọn chế ñộ bước ñủ hay nữa bước.

- Chân 10 nối với ñiện áp tham chiếu. Ta có thể nối với +VCC.

Các ñiện trở RS1 và RS2 là các ñiện trở công suất có gái trị 0,5 Omh.

13. ðiều khiển ñộng cơ ñiện một chiều


SW2
1 1 2 5VCS
2 1 3 4 +12V
2 3
3 JP2 DC

ON/OFF DC MOTOR

IRF9510/TO
RQ1 RQ2
4.7K 4.7K
J4_DC S S

1
2
3
DC1
DC2
P1.0
G Q1 Q2 G

4
D
GND D

DC MOTOR DC1 DC2

D
D

G IRF510/TO G

S Q3 Q4 S

RQ5 R29
P1.1 TL9 TL10 P1.2

4.7K 2N2222 2N2222 GND 4.7K


GND GND

MACH CAU H DK DC MOTOR


MOSFET

Transistor MOS có 3 cực:D - Cực máng (drain), S - Cực nguồn (source), G -


Cực cổng (gate). ðây là transistor ñược ñiều khiển bằng ñiện áp ñặt lên cực cổng.
Transistor MOS tác ñộng rất nhanh, có thể ñóng/mở với tần số trên 100kHz. Khi
transistor dẫn dòng thì ñiện trở của nó khoảng 0,1Ω ñối với MOS-1000V và khoảng
1Ω ñối với MOS-500V. Ngày nay, người ta ñã chế tạ ñược transistor MOS với VDS
ñến 500V và ID bằng vài chục ampe.

Mã hiệu VDS (V) ID (A) RDS on (A) P (W)

IRF 513 60 3.5 0.8 20

IRF 540 100 27 0.085 125

IRF 840 500 8 0.85 125

IRF 9540 100 19 0.20 150

Thông số transistor MOSFETS của hãng Fairchild

107
Sơ ñồ chân IRF 9510/IRF 510

13. LED matrix 8x8

Hình thực tế và sơ ñồ chân LED Matrix 8x8

Là một bảng 64 ñiểm LED bố trí theo kiểu ma trận 8 hàng x 8 cột, tại mỗi
ñiểm 2 LED xanh và ñỏ ñấu chung Anôt, mỗi hàng gồm 8 ñiểm cũng ñấu chung
Anôt với nhau. Như vậy ma trận LED có 24 chân: 8 chân Anôt chung, 8 chân ñiều
khiển ñèn xanh và 8 chân ñiều khiển ñèn ñỏ.

14. Giải mã hiển thị LED 7 thanh

ðể có thể hiển thị ñược các số liệu lên LED 7 thanh, ta cần vi mạch giải mã
7447. Vi mạch này có nhiệm vụ chuyển ñổi dữ liệu ñầu vào từ các chân D0 ÷ D3
thành các tín hiệu ñưa ñến các thanh của LED.

108
U3

7 13
1 D0 A 12
2 D1 B 11
6 D2 C 10
D3 D 9
3 E 15
5 LT F 14
RBI G
4
BI/RBO

7447

Hình thực tế và sơ ñồ chân của 7447


Sau ñây là bảng giải mã tín hiệu của vi mạch 7447:

LED 7 thanh

U5
7
6 a
4 b
2 c
1 d
9 e
10 f
5 g
pt

7 Segs LED

Sơ ñồ chân của LED 7 thanh

Dòng tiêu thụ của ñèn khá lớn, mỗi ñèn có dòng khoảng 100mA. Chính vì vậy
ta cần có ñiện trở giới hạn dòng giữa vi mạch giải mã 7447 và LED.

109

You might also like