Tài liệu Vi điều khiển (Microcontroller) - Pdf 91

VI ĐIỀU KHIỂN
(MICROCONTROLLER).
1
VI ĐIỀU KHIỂN (MICROCONTROLLER).
1. CẤU TRÚC CỦA BỘ VI ĐIỀU KHIỂN.
1.1 Giới thiệu về các bộ vi điều khiển.
Bộ vi điều khiển (MCU – Micro Controller Unit) là một hệ thống vi xử lý cơ bản tích hợp
trong cùng một chip, thông thường trong một MCU có một bộ vi xử lý (CPU), một dung
lượng nhớ khoảng vài KB, và một số giao tiếp vào ra cơ bản thích hợp cho các ứng dụng
điều khiển nhỏ. Với cấu trúc như mô tả trên, người sử dụng có thể nhanh chóng thực hiện
một hệ thống phần cứng điều khiển lập trình bằng cách nối một số ít linh kiện cơ bản như
thạnh anh, tụ điện, điện trở … vào bộ vi điều khiển. Mặt khác do không phải thực hiện các
đường mạch nối giữa các khối CPU, bộ nhớ và vào ra nên khả năng chống nhiễu của hệ
thống cao thích hợp cho môi trường công nghiệp. Hiện nay các bộ vi điều khiển đã trở nên
khá phổ biến trong nhiều lĩnh vực với rất nhiều hãng sản xuất như: học MCU 8051 của
Atmel, họ 68HC11 của Motorola, họ Z80MCU của Zilog …
1.2 Cấu trúc tổng quát của các bộ vi điều khiển.
Sơ đồ khối tổng quát của một bộ vi điều khiển bao gồm các khối cơ bản như trình bày trên
hình 8.1:
- Khối xử lý (Processor) đóng vai trò quyết định tất cả các hoạt động của các bộ phận
khác bên trong vi điều khiển.
- Bộ nhớ điều khiển (Control store) thường là loại bộ nhớ ROM có dung lượng vài KB
chứa các chương trình điều khiển.
- Bộ nhớ RAM thường có dung lượng nhỏ sử dụng cho việc khai báo các biến trung gian,
thông thường các thanh ghi của vi điều khiển cũng nằm trong phần bộ nhớ này.
- Khối tạo xung nhịp và định thời (Clock & timing) đóng vai trò tạo xung nhịp định thời
các hoạt động của hệ thống. Thông thường ở các bộ vi điều khiển tích hợp sẵn bộ tạo
xung nhịp bên trong, tần số hoạt động của hệ thống sẽ được xác định bằng thạch anh nối
vào mạch từ bên ngoài.
- Khối điều khiển reset có nhiệm vụ thiết lập lại các trạng thái của hệ thống, cho phép nó
bắt đầu hoạt động trở lại giống như khi mới cấp nguồn.

Clocking
Input &
Output
pins
Hình 8.1: Sơ đồ khối tổng quát của một bộ vi điều khiển .
- Khối giám sát nguồn (power monitoring) cho phép toàn bộ chip hoạt động ở chế độ chờ
(standby) khi không có yêu cầu điều khiển với công suất rất nhỏ. Vì cấu trúc vi điều
khiển cho phép thực hiện một hệ thống nhỏ gọn, nên nó được sử dụng nhiều trong các
thiết bị điều khiển cầm tay và di động có nguồn cung cấp bằng pin, với khối giám sát
nguồn vi điều khiển có thể hoạt động theo định thời hoặc chỉ khi có yêu cầu từ bên
ngoài.
- Các cổng vào ra (I/O): thông thường vi điều khiển có một vài cổng giao tiếp song song
để giao tiếp điều khiển các thiết bị bên ngoài, đôi khi các cổng này sử dụng như các Bus
(dữ liệu, địa chỉ và điều khiển) của một bộ vi xử lý thông thường, cho các hệ thống có
yêu cầu mở rộng về dung lượng bộ nhớ cũng như các cổng vào ra. Ngoài các cổng vào
ra song song, vi điều khiển còn có các cổng vào ra nối tiếp theo chuẩn RS232 hoặc
IEEE448. Trong một số bộ vi điều khiển còn tích hợp cả các khối A/D và D/A, khi đó sẽ
có cả các đường vào ra cho các khối này.
2. MÔ TẢ PHẦN CỨNG CÁC BỘ VI ĐIỀU KHIỂN HỌ MSC-51.
2.1Giới thiệu chung.
Họ IC vi điều khiển MSC-51 được phát triển, chế tạo và bán ở thị trường bởi hãng Intel.
Các nhà chế tạo IC khác như Siemens của Đức, Advanced Micro Devices, Fujitsu, Philips,
Atmel … là các nhà cung cấp những thiết bị họ MCS-51 được cấp giấy phép bảng quyền
thứ 2. 8051 là bộ vi điều khiển đầu tiên được thương mại hoá trên thị trường, sau đó nhiều
thế hệ khác trong họ ra đời, các đặc tính khác nhau của một số bộ vi điều khiển trong họ
này được mô tả trong bảng sau:
Loại Bộ nhớ chương trình Bộ nhớ dữ liệu Số timer
8051
8031
8751

• Sơ đồ khối và chức năng các khối.
Các bộ vi điều khiển 8051, 8031, 8751, 8951 trong họ MSC – 51 có chung một số đặc tính
như:
- 4 KB bộ nhớ loại ROM để ghi các chương trình điều khiển.
- 128 byte RAM.
- 4 cổng vào ra 8 bit.
- 2 bộ định thời (timer) 16 bit.
- Một cổng giao tiếp nối tiếp chuẩn RS 232.
1
- Có thể quản lý được 64 KB bộ nhớ mở rộng cho chương trình và 64 KB bộ nhớ mở
rộng cho dữ liệu.
- Một bộ xử lý các phép toán logic có thể thao tác trên từng bit.
- 210 bit RAM nội được địa chỉ hoá.
- Bộ nhân/chia 4 µs.
Cấu trúc kết nối phần cứng của các bộ vi điều khiển trong họ gần tương tự như nhau, một
số khác biệt giữa chúng cũng được biểu diễn trên sơ đồ khối hình 8.2.

Khối xử lý trung tâm (CPU) nhận tín hiệu xung nhịp từ bộ dao động, tần số ra của bộ tạo
dao động sẽ tuỳ thuộc vào tần số thạch anh bên ngoài. Hầu hết các bộ vi điều khiển trong
họ đều có ít nhất 128 byte RAM bên trong. Các thanh ghi thông thường nằm trong phần
RAM. Ngoài 8031/32 các vi điều khiển còn lại đều có bộ nhớ ROM lưu trữ chương trình
điều khiển. Bộ nhớ ROM này có thể là Mask-ROM chỉ lập trình được bởi nhà sản xuất, có
thể là EPROM hoặc EEROM có thể lập trình lại nhiều lần bởi người sử dụng.
Các bộ định thời lập trình được có thể đếm theo xung cung cấp từ bên ngoài hoặc xung
chuẩn từ bộ tạo dao động, có bộ đếm này có ứng dụng rất phổ biến trong điều khiển tự
động.
Bộ điều khiển Bus cung cấp các tín hiệu điều khiển giao tiếp với bên ngoài, và kiểm soát
hoạt động của các cổng vào ra dữ liệu song song. Hai trong bốn cổng vào ra song song (P0
1
TIMER 2

RST
T0
T1
T2
T2EX
Serial Port
Timer 0
Timer 1
Timer 2 (8032/52)
INT0INT1
Hình 8.2: Sơ đồ khối vi điều khiển MCS – 51.
và P2) có thể sử dụng làm các Bus địa chỉ và dữ liệu trong chế độ giao tiếp bộ nhớ ngoài.
Cổng vào ra nối tiếp có hai đường truyền và nhận dữ liệu nối tiếp với các thiết bị khác.
Bộ điều khiển ngắt tích hợp trong chip cho phép nhận hai yêu cầu ngắt cung cấp thẳng từ
bên ngoài, hoặc từ cổng nối tiếp và các bộ định thời bên trong.
• Các tín hiệu của 8051.
8051/8951 đều có 40 chân tín hiệu giống nhau. Ngoài các chân nhận các nguồn nuôi và các
linh kiện tạo dao động, các chân còn lại hoạt động giống như các đường vào ra. Tuy nhiên,
trong đó có 24 chân có hai công dụng, mỗi đường này có thể hoạt động như đường xuất
nhập, hoặc như đường điều khiển, hoặc là một đường trong của BUS dữ liệu và BUS địa
chỉ. Các cổng vào ra song song thường có cấu trúc cài.
Các thiết kế của 8051 có thể ở hai chế độ: chế độ tối thiểu, hoặc chế độ mở rộng bộ nhớ
hoặc các thành phần khác. Mỗi cổng 8 đường có thể hoạt động giống như một đơn vị giao
tiếp với các thiết bị vào ra song song như: máy in, các bộ biến đổi A/D, D/A …, hoặc mỗi
đường có thể điều khiển một cách độc lập để có thể giao tiếp với các thiết bị chỉ yêu cầu
một bit như: các công tắc, các LED, các solenoid, đóng mở động cơ…. Việc giao tiếp theo
từng bit, có thể điều khiển bằng các lệnh thao tác bit là một điểm mạnh của các bộ vi điều
khiển so với các bộ vi xử lý thông thường.
Cổng 0: Cổng 0 (các chân 32–39) là một cổng hai chức năng. Trong các thiết kế tối thiểu
(không dùng bộ nhớ mở rộng), nó có chức năng như các đường I/O. Đối với các thiết kế

B4H
B5H
B6H
B7H
Nhận dữ liệu cho cổng nối tiếp.
Truyền dữ liệu cho cổng nối tiếp.
Nhận tín hiệu yêu cầu ngắt (0) từ bên ngoài.
Nhận tín hiệu yêu cầu ngắt (1) từ bên ngoài.
Ngõ vào bên ngoài cho Timer 0.
Ngõ vào bên ngoài cho Timer 1.
Tín hiệu điều khiển ghi cho bộ nhớ bên ngoài.
Tín hiệu điều khiển đọc cho bộ nhớ bên ngoài.
8051 có 4 tín hiệu điều khiển.
1
PSEN (Program Store Enable): PSEN (chân 29) là tín hiệu ngõ ra, nó là tín hiệu điều
khiển để cho phép bộ nhớ chương trình mở rộng, trong hệ thống tín hiệu này thường được
nối đến chân OE (Output Enable) của một EPROM, để cho phép đọc các byte mã lệnh.
PSEN sẽ ở mức thấp trong thời gian lấy mã lệnh. Các mã nhị phân của chương trình, được
đọc từ EPROM qua BUS dữ liệu đưa vào thanh ghi lệnh của 8051 để giải mã. Khi thi hành
chương trình trong ROM nội (8051), PSEN sẽ ở mức không tích cực (mức cao).
ALE (Address Latch Enable): Tín hiệu ra ALE (chân 30), có chức năng tương tự như
trong các vi xử lý 8085, 8088, 8086, nó được dùng cho việc tách kênh các Bus đa hợp (địa
chỉ và dữ liệu). Trong cấu hình bộ nhớ mở rộng (tín hiệu EA = 1), cổng 0 vừa là BUS dữ
liệu vừa là byte thấp của BUS địa chỉ, ALE được sử dụng để chốt địa chỉ vào một bộ cài
bên ngoài trong chu kỳ xung nhịp đầu tiên của chu kỳ truy cập bộ nhớ. Sau đó, các đường
cổng 0 dùng để xuất hoặc nhập dữ liệu trong thời gian còn lại của chu kỳ truy cập bộ nhớ.
Tín hiệu ALE có tần số bằng 1/6 lần tần số dao động trên chip, nó có thể được dùng làm
nguồn xung nhịp cho các phần khác của hệ thống. Nếu xung nhịp trên 8051 là 12 MHz, thì
ALE có tần số 2 MHz, chỉ ngoại trừ khi thi hành lệnh MOVX, một xung ALE sẽ bị mất.
Chân này cũng được làm ngõ vào cho xung lập trình cho EPROM trong 8051.

1
bản đồ hoá trong bộ nhớ RAM, chúng có thể truy cập giống như các ô nhớ bất kỳ khác.
Ngăn xếp cũng nằm ở bộ nhớ RAM bên trong chip, mà không ở RAM ngoài như các hệ
thống vi xử lý thông thường
• Mô tả về bộ nhớ RAM trong chip của 8051.
RAM bên trong 8051 mô tả trên hình 8.3 bao gồm: 4 tập thanh có địa chỉ 00H tới 1FH,
mỗi tập có 8 thanh ghi được ký hiệu từ R0 tới R7, việc đổi qua các tập thanh ghi khác nhau
được thực hiện bằng hai bit của thanh ghi trạng thái. Vùng nhớ địa chỉ hoá theo bit có địa
chỉ từ 20H tới 2FH, việc truy cập các bit này theo các địa chỉ từ 00 tới 7FH. Vùng nhớ đa
dụng từ 30H tới 7FH. Và các thanh ghi chức năng đặc biệt từ 80H tới FFH, một số thanh
ghi trong vùng này cũng được địa chỉ hoá theo bit.
RAM đa dụng: Ngoài 80 byte RAM đa dụng chiếm các địa chỉ từ 30H–7FH, 32 byte dưới
cùng từ 00H đến 1FH cũng có thể được dùng với mục đích tương tự (mặc dù các địa chỉ
này đã có mục đích khác).
Mọi địa chỉ trong vùng RAM đa dụng đều có thể truy xuất với chế độ địa chỉ trực tiếp hoặc
gián tiếp. Ví dụ, để đọc nội dung ở địa chỉ 5FH của RAM nội vào thanh ghi tích lũy, có thể
dùng lệnh sau:
MOV A, 5FH
Lệnh này di chuyển 1 byte dữ liệu dùng định vị địa chỉ trực tiếp để xác định “địa chỉ
nguồn” (5FH). Đích nhận dữ liệu là thanh ghi tích lũy A.
RAM nội cũng có thể được truy xuất bằng định vị địa chỉ gián tiếp qua R0 hay R1. Ví dụ,
hai lệnh sau thi hành cùng nhiệm vụ như lệnh ở trên:
MOV R0, #5FH
MOV A, @R0
Lệnh đầu dùng địa chỉ tức thời để di chuyển giá trị 5FH vào thanh ghi R0, và lệnh thứ hai
dùng địa chỉ trực tiếp để di chuyển dữ liệu “được trỏ bởi R0” vào thanh ghi tích lũy A.
RAM địa chỉ hoá từng bit: 8051 chứa 210 bit được địa chỉ hoá, trong đó 128 bit là ở các
địa chỉ byte 20H đến 2FH, và phần còn lại là trong các thanh ghi chức năng đặc biệt.
Ý tưởng truy xuất từng bit riêng rẽ bằng phần mềm là một đặc tính tiện lợi của vi điều
khiển nói chung. Các bit có thể được đặt, xóa, AND, OR,... bằng một lệnh. Đa số các vi xử

6F 6E 6D 6C 6B 6A 69 68
67 66 65 64 63 62 61 60
5F 5E 5D 5C 5B 5A 59 58
57 56 55 54 53 52 51 50
4F 4E 4D 6C 4B 4A 49 48
47 46 45 44 43 42 41 40
3F 3E 3D 3C 3B 3A 39 68
37 36 35 34 33 36
2
31 30
2F 2E 2D 2C 2B 2A 29 28
27 26 25 24 23 22 21 20
1F 1E 1D 1C 1B 1A 19 18
17 16 15 14 13 12 11 10
0F 0E 0D 0C 0B 0A 09 08
07 06 05 04 03 02 01 00
Bank 3
Bank 2
Bank 1
Bank 0 (default)
87 86 85 84 83 82 81 80
Not bit addressable
Not bit addressable
Not bit addressable
Not bit addressable
8F 8E 8D 8C 8B 8A 89 88
Not bit addressable
Not bit addressable
Not bit addressable
Not bit addressable

PSW
Acc
B
Hình 8.3: Vùng nhớ RAM trong chip của 8051
00
07
08
0F
10
17
18
1F
20
2F
30
7F
FF
F0
E0
D0
B8
B0
A8
A0
99
98
90
8D
87
88

Sẽ lập bit 0 trong thanh ghi tích lũy, các bit khác không đổi. Có thể thấy rằng E0H đồng
thời là địa chỉ byte của thanh ghi tích lũy, và là địa chỉ bit của bit có trọng số nhỏ nhất trong
thanh ghi tích lũy. Nhưng vì lệnh SETB chỉ tác động trên bit, nên địa chỉ bit sẽ tác động
trong lệnh.
Từ trạng thái chương trình (PSW: Program Status Word): nằm ở địa chỉ D0H chứa các bit
trạng thái như trong bảng sau:
BIT Tên Địa chỉ Chức năng
PSW.7
PSW.6
PSW.5
PSW.4
PSW.3
PSW.2
PSW.1
PSW.0
CY
AC
F0
RS1
RS0
OV
-
P
D7
D6
D5
D4
D3
D2
D1

Khi chương trình được hợp dịch, các địa chỉ bit đúng được thay thế cho các ký hiệu “RS1”
và “RS0”. Tức là, lệnh SETB RS1 hoàn toàn giống như lệnh SETB 0D4H.
* Cờ tràn (OV): được lập sau một lệnh cộng hoặc trừ nếu xảy ra tràn số học. Khi các số có
dấu được cộng hoặc trừ với nhau, phần mềm có thể kiểm tra bit này để xác định dải kết quả
thích hợp. Khi cộng các số không dấu thì không cần xét tới OV. Các kết quả lớn hơn +127
hoặc nhỏ hơn -128 sẽ lập OV. Ví dụ, phép cộng sau bị tràn và bit OV được lập:
0FH + 7FH = 8EH tức là 15 +127 = 142.
Kết quả là một số có dấu 8EH được xem như -116, không phải là kết quả đúng (142), vì
vậy bit OV được lập, khi kiểm tra cờ OV chúng ta có thể hiệu chỉnh lại kết quả cho thích
hợp.
Thanh ghi B: nằm ở địa chỉ F0H được dùng cùng với thanh ghi tích lũy A trong các lệnh
nhân và chia. Lệnh MUL AB, sẽ nhân các giá trị không dấu 8 bit trong A và B, rồi trả về kết
quả 16 bit trong A (byte thấp) và B (byte cao). Lệnh DIV AB sẽ chia A cho B, rồi trả về kết
quả nguyên trong A và phần dư trong B. Thanh ghi B cũng có thể được xem như một thanh
ghi đa dụng. Nó được địa chỉ hoá theo bit (F0H đến F7H).
Con trỏ ngăn xếp (SP): là một thanh ghi 8 bit có địa chỉ 81H. Nó chứa địa chỉ của byte dữ
liệu hiện hành trên đỉnh của ngăn xếp. Các lệnh trên ngăn xếp bao gồm: cất dữ liệu vào
ngăn xếp và lấy dữ liệu ra khỏi ngăn xếp. Lệnh cất dữ liệu vào ngăn xếp sẽ làm tăng SP, và
lệnh lấy dữ liệu ra khỏi ngăn xếp sẽ giảm SP. Ngăn xếp của 8051 được giữ trong RAM nội,
và được giới hạn các địa chỉ có thể truy xuất bằng địa chỉ gián tiếp. Chúng là128 byte đầu
của 8051. Lệnh sau sẽ khởi động lại SP để đỉnh ngăn xếp bắt đầu tại 60H:
MOV SP, #5FH
Sau lệnh trên ngăn xếp của 8051 bị giới hạn trong 32 byte, vì địa chỉ cao nhất của RAM
trên chip là 7FH. Giá trị 5FH được dùng vì SP sẽ tăng lên 60H trước khi cất byte dữ liệu
đầu tiên.
1
Khi người sử dụng không khởi động lại con trỏ ngăn xếp, thì SP lấy giá trị mặc định là
07H khi reset hệ thống, và kết quả là ngăn đầu tiên để cất dữ liệu có địa chỉ là 08H. Khi đó
các tập thanh ghi 1 (có thể cả 2 và 3) sẽ không dùng được vì vùng RAM này đã được sử
dụng làm ngăn xếp.

“quay trở lại và kiểm tra lần nữa”.
Các thanh ghi của bộ định thời (timer): 8051 có hai bộ định thời/đếm 16 bit được dùng
cho việc định thời hoặc đếm sự kiện. Timer 0 có địa chỉ 8AH (TL0: byte thấp) và 8CH
(TH0: byte cao). Timer 1 có địa chỉ 8BH (TL1: byte thấp) và 8DH (TH1: byte cao). Việc
thiết lập hoạt động các timer được thực hiện bằng cách nạp các giá trị thích hợp cho thanh
ghi chế độ Timer (TMOD - Timer Mode) ở địa chỉ 89H, và thanh ghi điều khiển timer
(TCON – Timer Control) ở địa chỉ 88H. Chỉ có TCON được địa chỉ hoá từng bit.
Các thanh ghi cổng nối tiếp: 8051 có một cổng nối tiếp trong chip dành cho việc trao đổi
thông tin với các thiết bị nối tiếp như máy tính, modem hoặc với các IC khác có giao tiếp
1
nối tiếp (các bộ chuyển đổi A/D, các thanh ghi dịch...). Một thanh ghi gọi là bộ đệm dữ liệu
nối tiếp (SBUF) ở địa chỉ 99H sẽ giữ cả hai dữ liệu truyền và nhận. Khi truyền dữ liệu thì
ghi lên SBUF, khi nhận dữ liệu thì đọc SBUF. Các chế độ hoạt động khác nhau được lập
trình qua thanh ghi điều khiển cổng nối tiếp (SCON) được địa chỉ hoá từng bit có địa chỉ
98H.
Các thanh ghi ngắt: 8051 có cấu trúc điều khiển ngắt, cho phép 5 nguồn yêu cầu ngắt, với
2 mức ưu tiên. Các ngắt bị cấm sau khi reset hệ thống, và sẽ được cho phép bằng việc ghi
dữ liệu vào thanh ghi cho phép ngắt (IE) ở địa chỉ A8H. Cả hai thanh ghi được địa chỉ hoá
từng bit.
Thanh ghi điều khiển công suất: Thanh ghi điều khiển công suất (PCON) ở địa chỉ 87H
bao gồm nhiều bit điều khiển. Ý nghĩa của chúng được tóm tắt trong bảng sau:
BIT Tên ký hiệu Chức năng
7
6
5
4
3
2
1
0

5V sau 10 chu kỳ xung nhịp trước khi tín hiệu RST quay về mức thấp trở lại.
• Giao tiếp với bộ nhớ ngoài.
8051 có khả năng mở rộng thêm 64K bộ nhớ chương trình và 64K bộ nhớ dữ liệu bên
ngoài. Do đó có thể dùng thêm ROM và RAM nếu cần. Cũng có thể sử dụng chức năng mở
rộng dung lượng bộ nhớ, để tăng thêm dung lượng cổng vào ra, lúc này các cổng vào ra sẽ
được truy cập giống như các ô nhớ mở rộng.
1
Khi sử dụng bộ nhớ ngoài, cổng 0 không còn là một cổng vào ra nữa. Nó được ghép kênh
giữa phần thấp của BUS địa chỉ (A0–A7), và BUS dữ liệu (D0–D7). Tín hiệu ALE sẽ tác
động mức cao khi bắt đầu mỗi chu kỳ truy cập bộ nhớ để chốt byte thấp của địa chỉ. Cổng 2
thông thường được dùng cho byte cao của BUS địa chỉ.
Trong nửa đầu của mỗi chu kỳ truy cập bộ nhớ, byte thấp của địa chỉ được cấp ra cổng 0 và
được chốt bằng xung ALE. Có thể sử dụng một IC chốt 74HC373 (hoặc tương đương) để
giữ byte địa chỉ thấp trong phần còn lại của chu kỳ truy cập bộ nhớ. Trong nửa sau của chu
kỳ bộ nhớ cổng 0 được dùng như BUS dữ liệu, chiều truyền dữ liệu trên nó sẽ tùy theo
lệnh.
Truy xuất bộ nhớ chương trình ngoài: Bộ nhớ chương trình ngoài là một bộ nhớ ROM
được cho phép bởi tín hiệu PSEN. Hình 8.4 mô tả một ví dụ về cách nối một EPROM vào
8051:
Một chu kỳ máy của 8051 gồm 12 chu kỳ xung nhịp. Nếu ngõ vào bộ dao động nội là
thạch anh 12 MHz thì một chu kỳ máy kéo dài 1 µs. Trong một chu kỳ máy sẽ có hai xung
ALE, và hai byte được đọc từ bộ nhớ chương trình (nếu lệnh hiện hành là lệnh 1 byte thì
byte thứ hai sẽ được loại bỏ). Giản đồ thời gian của một lần lấy lệnh được trình bày trên
hình 8.5:
1
Port 0
Port 2
8051
ALE
PSEN

PSEN
ALE
CK
Truy xuất bộ nhớ dữ liệu ngoài: Bộ nhớ dữ liệu ngoài là một bộ nhớ RAM được cho
phép ghi/đọc bằng các tín hiệu WR và RD (P3.6 và P3.7). Việc truy xuất bộ nhớ dữ liệu
ngoài có thể thực hiện với lệnh MOVX dùng con trỏ dữ liệu (DPTR), hoặc R0 và R1 xem
như thanh ghi địa chỉ.
Kết nối BUS địa chỉ và BUS dữ liệu giữa RAM và 8051 cũng giống như EPROM, do đó
cũng có thể mở rộng bộ nhớ RAM lên đến 64Kbyte. Tín hiệu yêu cầu đọc RD của 8051
được nối tới chân cho phép xuất (OE) của RAM, và tín hiệu yêu cầu ghi WR được nối tới
chân cho phép ghi (WR) của RAM.
Giản đồ thời gian cho lệnh đọc bộ nhớ dữ liệu ngoài biểu diễn trên hình 8.6 cho lệnh đọc
(MOVX A, @DPTR).
Giản đồ thời gian cho lệnh ghi (MOVX @DPTR, A) cũng tương tự chỉ khác đường WR sẽ
thay vào đường RD và dữ liệu được xuất ra trên cổng 0, trong chu kỳ ghi RD giữ mức cao.
1
S1 S2 S3 S4 S5 S6 S1 S2 S3 S4 S5 S6
DPL Data in
Hình 8.6: Giản đồ thời gian truy cập bộ nhớ dữ liệu ngoài.
PCH DPH (Data pointer high byte)
PCL
Opcode
ALE
PSEN
RD
Port 2
Port 0
Hình 8.7: Truy cập bộ nhớ ngoài theo cấu trúc trang.
Port 0
P2.0

vào ra thông thường. Cổng 0 vẫn được sử dụng làm Bus đa hợp (cung cấp 8 bit địa chỉ
trong nửa chu kỳ đầu, sau đó sử dụng làm Bus dữ liệu). Như vậy các địa chỉ cung cấp từ
cổng 0 cho phép truy cập 256 byte nhớ mỗi trang, việc chọn trang có thể sử dụng các bit
một cổng khác. Hình 8.7 mô tả sơ đồ ghép nối 8051 với dung lượng RAM 1KB truy cập
theo cách phân trang, với các trang được chọn bằng P2.0 và P2.1.
Khi các bit P2.0 và P2.1 được thiết lập để chọn một trong 4 trang, thì lệnh MOVX sẽ đọc
hoặc ghi dữ liệu trong trang đó. Ví dụ với sơ đồ hình 8.7, nếu P2.0 = P2.1 = 0 thì các lệnh
sau sẽ đọc dữ liệu trong ô nhớ 0050H của RAM vào thanh ghi chứa:
MOV R0,#50H
MOVX A,@R0
Để đọc được địa chỉ 3FFH của RAM thì hai bit chọn trang cần được lập lên 1, Các lệnh
sau có thể sử dụng:
SETB P2.0
SETB P2.1
MOV R0,#0FFH
MOV A,@R0.
Giải mã địa chỉ: Nếu cần sử dụng nhiều EPROM và/hoặc nhiều RAM bên ngoài, thì cần
phải giải mã địa chỉ. Mạch giải mã cũng tương tự như các hệ vi xử lý khác. Ví dụ trên hình
1
CS
CS
CS
OE
D
0
–D
7
A
0
–A

A0 –A12
A0 –A12
G
1
G
2A
G
2B
V
CC
Hình 8.8: Giải mã địa chỉ trong hệ thống có nhiều bộ nhớ ngoài.
8.8 mô tả một hệ thống với nhiều bộ nhớ EPROM 2764 (8 KB) cho chương trình, và nhiều
bộ nhớ RAM 6264 (8KB) cho dữ liệu.
Bộ nhớ ngoài sử dụng chung cho chương trình và dữ liệu: Vì bộ nhớ chương trình là
ROM, nên nảy sinh một vấn đề bất tiện khi phát triển phần mềm cho 8051. Đó là làm cách
nào phần mềm có thể sửa đổi chương trình và ghi trở lại khi nó được chứa trong bộ nhớ
“chỉ đọc”. Cách giải quyết là sử dụng chung một vùng nhớ RAM cho cả chương trình và dữ
liệu. Điều này có thể thực hiện bằng cách nối đường OE của RAM vào một mạch logic
AND của PSEN và RD như mô tả trên hình 8.9. Lúc này một chương trình có thể được nạp
vào RAM bằng cách ghi RAḾ như bộ nhớ dữ liệu, và thực hiện bằng cách truy xuất RAḾ
như bộ nhớ chương trình.
• Hoạt động reset.
8051 được reset bằng cách giữ chân RST ở mức cao ít nhất trong hai chu kỳ máy và trả nó
về mức thấp. Sau khi reset thanh ghi đếm chương trình được đặt lại 0000H. Khi RST trở lại
mức thấp, việc thi hành chương trình luôn bắt đầu ở địa chỉ đầu tiên trong bộ nhớ chương
trình (địa chỉ 0000H). Nội dung của RAM nội không bị thay đổi bởi lệnh Reset.
2.2.1 Hoạt động của bộ định thời (timer).
• Giới thiệu.
Bộ định thời bên trong vi điều khiển là một bộ đếm được tạo thành từ một chuỗi các flip-
flop nối tiếp với nhau, mỗi flip-flop là một bộ chia 2. Ngõ vào của Timer là nguồn xung

Điều khiển
Chế độ
Byte thấp của timer 0
Byte thấp của timer 1
Byte cao của timer 0
Byte cao của timer 1
88H
89H
8AH
8BH
8CH
8DH
Có
Không
Không
Không
Không
Không
• Thanh ghi chế độ của timer (TMOD).
Thanh ghi TMOD chứa hai nhóm 4 bit dùng để đặt chế độ làm việc cho Timer 0 và Timer 1
như mô tả trong bảng sau:
BIT Tên Timer Chức năng
7
6
5
4
3
2
1
0

1
0
1
0
1
0
1
2
3
Chế độ định thời 13 bit.
Chế độ định thời 16 bit.
Chế độ tự động nạp lại 8 bit.
Chế độ định thời tách biệt:
Timer 0: TL0 là bộ định thời 8 bit điều khiển bởi chế độ
của timer 0. TH0 tương tự nhưng được điều khiển bởi
chế độ của timer 1.
Timer 1: ngưng hoạt động.
Thanh ghi TMOD không được địa chỉ hoá theo bit vì không cần thiết. Thông thường giá trị
của nó được nạp một lần khi bắt đầu chương trình, để khởi động chế độ của các timer. Sau
đó các timer có thể cho bắt đầu hoạt động hoặc ngưng lại … bằng cách truy cập các thanh
ghi đặc biệt khác của timer.
• Thanh ghi điều khiển timer (TCON).
1
Thanh ghi TCON chứa các bit trạng thái và các bit điều khiển cho Timer 0 và Timer 1 như
mô tả trong bảng sau:
BIT Tên Địa chỉ Chức năng
7
6
5
4

Chọn kiểu tác động ngắt INT1: được lập xoá bằng phần
mềm để chọn kiểu tác động ngắt bằng cạnh xuống hoặc
bằng mức thấp.
Cho phép ngắt INT0.
Chọn kiểu ngắt cho INT0.
Bốn bit thấp của TCON không sử dụng cho các timer, chúng được sử dụng để phát hiện và
khởi động kiểu tác động cho các ngắt bên ngoài.
• Các chế độ timer và cờ báo tràn.
Các timer 0 và 1 có các chế độ hoạt động tương đương nhau, nên trong phần này chỉ số ‘x’
được sử dụng để chỉ thị cho một timer bất kỳ. Ví dụ THx có thể chỉ thị cho TH0 hoặc TH1.
1
TLx
(5 bit)
THx
(8 bit)
TFxTimer
Clock
a) Mode 0
TLx
(5 bit)
THx
(8 bit)
TFxTimer
Clock
c) Mode 2
TLx
(8 bit)
TFx
THx
(5 bit)

bit, còn THx vẫn giữ nguyên giá trị cần nạp lại. Khi số đếm tràn từ FFH đến 00H, không
những cờ timer được lập mà giá trị trong THx đồng thời được nạp vào TLx, việc đếm được
thực hiện liên tục từ giá trị trong THx lên đến FFH xuống 00H và nạp lại.… Chế độ này rất
thông dụng vì sự tràn timer xảy ra trong những khoảng thời gian nhất định và tuần hoàn
một khi đã khởi động TMOD và THx.
Chế độ 3 - chế độ timer tách biệt: trong chế độ này timer 0 tách thành hai timer 8 bit. (TL0
và TH0), TL0 có cờ báo tràn là TF0 và TH0 có cờ báo tràn là TF1. Timer 1 không hoạt
động ở chế độ 3, nhưng có thể được khởi động bằng cách chuyển sang chế độ khác. Giới
hạn duy nhất là cờ báo tràn TF1 không còn bị tác động khi timer 1 bị tràn vì nó đã được nối
tới TH0.
Khi timer 0 ở chế độ 3, có thể cho timer 1 chạy và ngưng bằng cách chuyển nó ra ngoài và
vào chế độ 3. Nó vẫn có thể được sử dụng bởi cổng nối tiếp để tạo tốc độ baud, hoặc nó có
thể được sử dụng cho các ứng dụng khác khi không cần ngắt (vì nó không còn được nối
với TF1).
• Nguồn tạo xung nhịp.
Có thể sử dụng hai nguồn tạo xung nhịp cung cấp cho các timer. Chúng được chọn bằng
cách ghi vào bit C/T (counter/timer) trong TMOD. Một nguồn tạo xung nhịp dùng cho định
khoảng thời gian, cái khác cho đếm sự kiện.
Định khoảng thời gian (interval timing): Nếu C/T = 0, hoạt động timer liên tục được chọn
và timer được dùng cho việc định khoảng thời gian. Lúc đó, timer lấy xung nhịp từ bộ dao
động trong chip. Xung nhịp ngõ ra bộ tạo dao động được giảm tần số bằng bộ chia 12 trước
khi cấp vào timer để thích hợp cho phần lớn các ứng dụng. Như vậy với thạch anh 12 MHz,
thì tốc độ xung nhịp cung cấp cho timer sẽ là1 MHz. Báo tràn timer xảy ra sau một số (cố
định) xung nhịp, tuỳ thuộc vào giá trị ban đầu được nạp vào các thanh ghi timer TLx/THx.
Đếm sự kiện (Event counting): Nếu C/T = 1, timer lấy xung nhịp từ nguồn bên ngoài.
Trong hầu hết các ứng dụng, nguồn bên ngoài này cung cấp cho timer một xung khi xảy ra
1
một “sự kiện” – timer dùng đếm sự kiện. Số sự kiện được xác định bằng phần mềm bằng
cách đọc các thanh ghi TLx/THx, vì giá trị 16 bit trong các thanh ghi này tăng thêm 1 cho
mỗi sự kiện.

÷12
C/T
Tx
Hình 8.11: Sơ đồ cung cấp xung nhịp cho timer
Timer
Clock
tần số 12 MHz). Khi INT0 xuống thấp, timer bị “đóng cổng” và thời khoảng của xung tính
bằng µs là số đếm được trong TL0/TH0. (Có thể lập trình INT0 để tạo ra một ngắt khi nó
xuống thấp).
Hình 8.12 minh họa Timer 1 hoạt động ở chế độ 1 như một timer 16 bit. Sơ đồ chỉ các khả
năng điều khiển việc cấp nguồn tạo xung nhịp cho timer.
• Khởi động và truy xuất các thanh ghi timer.
Thông thường các thanh ghi được khởi động một lần ở đầu chương trình để đặt chế độ làm
việc cần thiết. Sau đó trong thân chương trình, các timer được cho chạy, dừng, các bit cờ
được kiểm tra và xóa, các thanh ghi timer được đọc và cập nhật …, theo yêu cầu của các
ứng dụng.
TMOD là thanh ghi đầu tiên được khởi động, vì nó đặt chế độ hoạt động cho timer. Ví dụ
các lệnh sau khởi động Timer 1 ở chế độ 1 có xung nhịp cung cấp từ bộ dao động nội cho
việc định khoảng thời gian:
MOV TMOD, #00010000B
Lệnh trên đặt M1 = 0 và M0 = 1 cho chế độ 1, C/T = 0 và GATE = 0 cho xung nhịp nội, và
xóa các bit chế độ của timer 0. Timer thật sự không bắt đầu định thời cho đến khi bit điều
khiển chạy TR1 được đặt lên 1.
Nếu cần số đếm ban đầu, các thanh ghi timer TL1/TH1 cũng phải được khởi động. Vì các
timer đếm lên và đặt cờ báo tràn khi có sự chuyển tiếp FFFFH sang 0000H. Một khoảng
100 µs có thể được định thời bằng cách khởi động trị cho TL1/TH1 là FF9CH:
MOV TL1, #9CH
MOV TH1, #0FFH
Sau đó cho chạy timer bằng cách đặt bit điều khiển chạy bằng lệnh:
SETB TR1

8051 có một cổng nối tiếp trong chip có thể hoạt động ở nhiều chế độ, trên một dải tần số
rộng. Chức năng chủ yếu của cổng nối tiếp là thực hiện chuyển đổi song song sang nối tiếp
đối với dữ liệu xuất, và chuyển đổi nối tiếp sang song song với dữ liệu nhập.
Việc truy xuất phần cứng qua cổng nối tiếp được thực hiện bằng các chân TXD và RXD.
Các chân này là hai bit của cổng 3, P3.1 (TXD) và P3.0 (RXD).
Cổng nối tiếp cho phép hoạt động song công (full duplex), và bộ đệm thu (receiver
buffering) cho phép một ký tự sẽ đã thu giữ trong bộ đệm, trong khi ký tự thứ hai được
nhận. Nếu CPU đọc ký tự thứ nhất trước khi ký tự thứ hai được thu đầy đủ, thì dữ liệu sẽ
không bị mất.
Hai thanh ghi chức năng đặc biệt cho phép phần mềm truy xuất đến cổng nối tiếp là: SBUF
và SCON. Bộ đệm cổng nối tiếp (SBUF) có địa chỉ 99H thực chất bao gồm hai bộ đệm. Dữ
liệu ghi vào SBUF sẽ được truyền ra thiết bị bên ngoài, và đọc SBUF để truy xuất dữ liệu
thu được. Đây là hai thanh ghi riêng biệt (một thanh ghi chỉ ghi để phát và một thanh ghi
chỉ đọc để thu).
Thanh ghi điều khiển cổng nối tiếp (SCON) có địa chỉ 98H là thanh ghi địa chỉ hoá theo
bit, nó chứa các bit trạng thái và các bit điều khiển. Các bit điều khiển cho phép thiết lập
các chế độ hoạt động cho cổng nối tiếp, và các bit trạng thái chỉ thị việc kết thúc phát hoặc
thu ký tự. Các bit trạng thái có thể được kiểm tra bằng phần mềm hoặc có thể được lập trình
để tạo ngắt.
Tần số làm việc của cổng nối tiếp, còn gọi là tốc độ baud có thể cố định (lấy từ bộ dao
động trên chip). Khi muốn tốc độ baud thay đổi, cần lập trình Timer 1.
• Thanh ghi điều khiển cổng nối tiếp.
1
Chế độ hoạt động của cổng nối tiếp được thiết lập bằng cách ghi dữ liệu vào thanh ghi điều
khiển cổng nối tiếp (SCON). Ý nghĩa các bit của SCON được mô tả trong bảng sau:
Bit Ký hiệu Địa chỉ Chức năng
7
6
5
4

thể xoá bằng phần mềm.
Được lập khi nhận xong một byte dữ liệu, có thể xoá
bằng phần mềm.

Các chế độ truyền cổng nối tiếp với thiết bị bên ngoài được định nghĩa bằng các bit SM1
và SM0 như mô tả trong bảng sau:
SM0 SM1 Chế độ Chức năng Tốc độ baud
0
0
1
1
0
1
0
1
0
1
2
3
Thanh ghi dịch.
8bit UART
9bit UART
9bit UART
Cố định (tần số dao động/12).
Thay đổi (theo giá trị của timer).
Cố định (tần số dao động/12 hoặc 64.
Thay đổi (theo giá trị của timer).
Trước khi sử dụng cổng nối tiếp, phải khởi động SCON để chọn chế độ thích hợp. Ví dụ,
lệnh: MOV SCON, #01010010B
Sẽ khởi động cổng nối tiếp ở chế độ 1 (SM0/SM1 = 0/1), cho phép bộ thu (REN=1) và đặt

RXD
Shift clock
TXD
b) Định thời nhận nối tiếp trong chế độ 0
ALE
Data in
RXD
Shift clock
TXD
D0 D1 D2 D3 D4 D5 D6 D7
Hình 8.13: Định thời thu phát dữ liệu trên cổng nối tiếp ở chế độ 0
Việc thu được khởi động khi bit cho phép bộ thu (REN) là 1, và bit ngắt thu (RI) là 0. Qui
tắc chung là lập REN khi bắt đầu chương trình để khởi động cổng nối tiếp, rồi xóa RI để
bắt đầu nhận dữ liệu. Khi RI bị xóa, các xung nhịp được đưa ra đường TXD khi bắt đầu chu
kỳ máy kế tiếp, và dữ liệu được đưa ra đường RXD theo xung nhịp. Mỗi bit dữ liệu được
nhận vào cổng nối tiếp ở cạnh lên của xung nhịp trên đường TXD như biểu diễn trên hình
8.13b.
Một ứng dụng của chế độ thanh ghi dịch là mở rộng khả năng xuất dữ liệu của 8051. IC
thanh ghi dịch nối tiếp ra song song có thể được nối vào các đường TXD và RXD của 8051
để cung cấp thêm 8 đường ra như trên hình 8.14. Có thể nối nối tiếp thêm các thanh ghi
dịch để mở rộng thêm nhiều cổng vào ra khác nữa.
Chế độ 1 (Truyền bất đồng bộ 8 bit với tốc độ baud thay đổi được): Ở chế độ 1, cổng nối
tiếp của 8051 làm việc như một bộ truyền nhận nối tiếp bất đồng bộ (UART-Universal
Asynchronous Receiver/Transmitter) 8 bit với tốc độ baud thay đổi được. UART thực hiện
thu phát dữ liệu nối tiếp với mỗi ký tự dữ liệu đi trước là bit start ở mức thấp, theo sau là bit
stop ở mức cao. ngoài ra có thể chèn thêm bit kiểm tra chẵn lẻ giữa bit dữ liệu cuối cùng và
bit stop.
Trong chế độ 1, mỗi ký tự dữ liệu bao gồm 10 bit được phát trên TXD hoặc thu trên RXD
bao gồm: 1 bit start (luôn là 0), 8 bit dữ liệu (LSB đầu tiên) và1 bit stop (luôn là 1). Khi thu,
bit stop được đưa vào RB8 trong SCON. Trong 8051 chế độ baud được đặt bằng tốc độ báo


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status