You are on page 1of 245

HỌC VIỆN KỸ THUẬT MẬT MÃ

ThS. ĐẶNG HÙNG VIỆT


ThS. VŨ HỒNG QUÂN

GIÁO TRÌNH

KỸ THUẬT VI XỬ LÝ

HÀ NỘI, 2015
MỤC LỤC

DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT ....................................... 4


DANH MỤC BẢNG ............................................................................................. 6
DANH MỤC CÁC HÌNH VẼ .............................................................................. 7
LỜI NÓI ĐẦU .................................................................................................... 11
Chương 1: TỔNG QUAN VỀ BỘ VI XỬ LÝ VÀ HỆ VI XỬ LÝ.................... 13
1.1. Bộ vi xử lý................................................................................................. 13
1.1.1. Khái niệm và quá trình phát triển ............................................................. 13
1.1.2. Phân loại bộ vi xử lý ................................................................................. 15
1.1.3. Cấu trúc và hoạt động của bộ vi xử lý ...................................................... 15
1.2. Hệ vi xử lý................................................................................................. 19
1.2.1. Cấu trúc phần cứng ................................................................................... 19
1.2.2. Phần mềm .................................................................................................. 21
1.2.3. Hoạt động của hệ vi xử lý ......................................................................... 22
1.2.4. Các bước thiết kế một hệ vi xử lý ............................................................. 23
Chương 2: BỘ VI XỬ LÝ INTEL 8086 ............................................................. 26
2.1. Cấu trúc bên trong bộ vi xử lý 8086 ......................................................... 26
2.1.1. Sơ đồ khối ................................................................................................. 26
2.1.2. Đơn vị giao tiếp bus (BIU) ....................................................................... 26
2.1.3. Đơn vị thực hiện lệnh EU ......................................................................... 27
2.1.4. Các thanh ghi ............................................................................................ 28
2.2. Tập lệnh của bộ vi xử lý 8086................................................................... 32
2.2.1. Khái niệm về lệnh và cách mã hóa lệnh ................................................... 32
2.2.2. Các chế độ địa chỉ của 8086 ..................................................................... 36
2.2.3. Mô tả tập lệnh của 8086 ............................................................................ 39
2.3. Lập trình hợp ngữ cho 8086 ...................................................................... 66
2.3.1. Cú pháp của chương trình hợp ngữ........................................................... 68
2.3.2. Dữ liệu cho chương trình .......................................................................... 70

1
2.3.3. Biến và hằng.............................................................................................. 70
2.3.4. Khung chương trình hợp ngữ .................................................................... 73
Chương 3: GHÉP NỐI 8086 VỚI BỘ NHỚ VÀ THIẾT BỊ NGOẠI VI. .......... 82
3.1. Các tín hiệu của 8086 và mạch phụ trợ 8284, 8288 ................................. 82
3.1.1. Các tín hiệu của 8086 ................................................................................ 82
3.1.2. Mạch tạo xung nhịp 8284 và ghép nối với 8086 ...................................... 87
3.1.3. Mạch điều khiển bus 8288 và ghép nối với 8086 ..................................... 89
3.2. Ghép nối 8086 với bus hệ thống ............................................................... 91
3.2.1. Các chu kỳ bus của 8086 .......................................................................... 91
3.2.2. Ghép nối 8086 với bus hệ thống. .............................................................. 93
3.3. Tổ chức bộ nhớ cho 8086.......................................................................... 95
3.3.1. Cấu trúc chung của IC nhớ ....................................................................... 97
3.3.2. Giới thiệu một số IC nhớ tiêu biểu. .......................................................... 98
3.3.3. Nguyên tắc và các bước tổ chức bộ nhớ ................................................. 100
3.3.4. Tổ chức bộ nhớ RAM cho 8086 ............................................................. 102
3.3.5. Tổ chức bộ nhớ ROM cho 8086 ............................................................. 105
3.4. Ghép nối bộ vi xử lý 8086 với cổng vào/ra ............................................ 108
3.4.1. Nguyên tắc ghép nối ............................................................................... 108
3.4.2. Ghép nối với cổng vào/ra đơn giản ......................................................... 110
3.4.3. Ghép nối với cổng vào/ra song song dùng 8255A .................................. 112
3.4.4. Truyền thông nối tiếp dùng 8250A, 8251A ............................................ 125
3.5. Ghép nối 8086 với một số thiết bị ngoại vi ............................................ 156
3.5.1. Ghép nối với bàn phím............................................................................ 156
3.5.2. Ghép nối với bộ hiển thị ......................................................................... 163
3.5.3. Ghép nối với bộ chuyển đổi AD, DA ..................................................... 172
Chương 4: CÁC PHƯƠNG PHÁP VÀO/RA DỮ LIỆU .................................. 182
4.1. Vào/ra bằng phương pháp thăm dò ......................................................... 182
4.1.1. Nguyên lý vào/ra bằng phương pháp thăm dò ........................................ 182
4.1.2. Ưu, nhược điểm....................................................................................... 185

2
4.2. Vào/ra bằng phương pháp ngắt ngắt bộ vi xử lý..................................... 185
4.2.1. Ý nghĩa vào/ra bằng phương pháp ngắt .................................................. 185
4.2.2. Hệ thống ngắt của 8086 .......................................................................... 186
4.2.3. Nguyên lý vào/ra bằng phương pháp ngắt .............................................. 187
4.2.4. Mạch điều khiển ngắt ưu tiên 8259A ...................................................... 188
4.3. Vào/ra bằng phương pháp truy nhập trực tiếp bộ nhớ ............................ 208
4.3.1. Ý nghĩa và nguyên tắc truy nhập trực tiếp bộ nhớ.................................. 208
4.3.2. Bộ điều khiển truy nhập trực tiếp bộ nhớ Intel 8237A ........................... 212
Chương 5: MỘT SỐ BỘ VI XỬ LÝ THÔNG DỤNG ..................................... 224
5.1. Một số bộ vi xử lý tiên tiến của Intel ...................................................... 224
5.1.1. Giới thiệu chung ...................................................................................... 224
5.1.2. Các tính năng tiên tiến ............................................................................ 225
5.2. Bộ vi điều khiển ...................................................................................... 232
5.2.1. Khái niệm vi điều khiển .......................................................................... 232
5.2.2. Họ vi điều khiển 8051 ............................................................................. 233
5.2.3. Một số ví dụ về ghép nối và lập trình cho 8051 ..................................... 234
TÀI LIỆU THAM KHẢO ................................................................................. 244

3
DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT
Ký hiệu Tiếng anh Tiếng việt
ADC Analog-Digital Converter Bộ biến đổi tín hiệu tương tự -
số
ALU Arithemethic logic Unit Bộ thực thi số học và logic
BISYNC Binary synchronous communication Giao thức truyền thông tin hệ
protocol 2 đồng bộ
BIU Bus Interface Unit Khối giao tiếp bus
CPU Central proccessing Unit Khối xử lý trung tâm
DAC Digital- Analog Converter Bộ biến đổi tín hiệu số-tương
tự
DMA Direct Memory Access Truy nhập trực tiếp bộ nhớ
DMAC Direct Memory Access Controller Mạch điều khiển truy nhập bộ
nhớ trực tiếp
DRAM Dynamic RAM RAM động
EEPROM Electrically Erasable Programmable Bộ nhớ chỉ đọc khả trình xóa
Read Only Memory bằng điện
EOI End of Interupt Kết thúc ngắt
EPROM Eraseable Programmale Read Only Bộ nhớ chỉ đọc khả trình xóa
Memory được
EU Excutive Unit Khối xử lý lệnh
FIFO First in first out Vào trước ra trước
GDT Global Descriptor Table Bảng mô tả không gian nhớ
toàn cục
I/O Input/Output Cổng vào/ra
IC Integrated Circuit Vi mạch tích hợp
IQ Instruction Queue Hàng đợi lệnh
LSB Least significant bit Bit có trọng số thấp nhất
LSI Large Scale Integration Công nghệ IC mật độ lớn
LDT Lcal Descriptor Table Bảng mô tả không gian nhớ
cục bộ
MAX Maximum Chế độ tối đa
MIN Minimum Chế độ tối thiều
MMU Memory Managment Unit Khối quản lý bộ nhớ
MSB Most significant bit Bit có trọng số cao nhất
MSW Machine Status Word Từ trạng thái máy
PIC Priority Interupt Controller Mạch điều khiển ngắt ưu tiên
PPI Programmable Peripheral Interface Vào/ra song song lập trình
được
PROM Programable Read Only Memory Bộ nhớ chỉ đọc khả trình

4
RAM Random Access Memory Bộ nhớ truy cập ngẫu nhiên
ROM Read Only Memory Bộ nhớ chỉ đọc
SRAM Static RAM RAM tĩnh
UART Universal Asynchronous Thu phát dữ liệu nố tiếp
Receiver/Transmitter không đồng bộ
USART Universal Synchronous/Asynchronous Thu phát dữ liệu nối tiếp đồng
Receiver/Transmitter bộ/không đồng bộ
VLSI Very Large Scale Integration Công nghệ IC mật độ rất lớn

5
DANH MỤC BẢNG
Bảng 2.1. Các bit mã hoá cho các thanh ghi trong 8086 .................................... 34
Bảng 2.2. Phối hợp MOD và R/M để tạo ra các chế độ địa chỉ.......................... 35
Bảng 2.3. Các thanh ghi đoạn ngầm định trong các chế độ địa chỉ .................... 39
Bảng 2.4. Các kiểu bộ nhớ .................................................................................. 74
Bảng 3.1. Ý nghĩa của các bit S4,S3 ................................................................... 83
Bảng 3.2. Ý nghĩ của các tín hiệu QS1, QS0 ...................................................... 87
Bảng 3.3. Các tín hiệu điều khiển của 8288........................................................ 90
Bảng 3.4. Họ EPROM 27x.................................................................................. 98
Bảng 3.5. Một số IC nhớ RAM ........................................................................... 99
Bảng 3.6. Ý nghĩa sử dụng các tín hiệu A0 và BHE ......................................... 100
Bảng 3.7. Bản đồ địa chỉ tổ chức bộ nhớ RAM (32K*8), sử dụng IC RAM
(8K*8) ............................................................................................................... 103
Bảng 3.8. Bản đồ địa chỉ tổ chức bộ nhớ ROM (64K*8), sử dụng IC ROM
(16K*8) ............................................................................................................. 106
Bảng 3.9. Các bit thâm nhập thanh ghi ............................................................. 113
Bảng 3.10. Các thanh ghi của 8250A và địa chỉ thâm nhập ............................. 131
Bảng 3.11. Chọn các thanh ghi bên trong của 8251A ...................................... 146
Bảng 3.12. Chức năng của LCD HD 44780 ..................................................... 167
Bảng 4.1. Địa chỉ các thanh ghi bên trong của 8237A ..................................... 216
Bảng 4.2. Địa chỉ các thanh ghi trong để ghi/đọc địa chỉ và số từ cần chuyển 216
Bảng 4.3. Địa chỉ các thanh ghi cho điều khiển và trạng thái .......................... 217

6
DANH MỤC CÁC HÌNH VẼ
Hình 1.1. Cấu trúc chung của bộ vi xử lý ........................................................... 16
Hình 1.2. Sơ đồ khối của hệ vi xử lý .................................................................. 19
Hình 2.1. Sơ đồ khối của bộ vi xử lý 8086 ......................................................... 28
Hình 2.2. Thanh ghi cờ của 8086 ........................................................................ 32
Hình 2.3. Dạng thức tổng quát của lệnh của 8086 .............................................. 33
Hình 2.4. Dạng thức của lệnh MOV của 8086.................................................... 34
Hình 2.5. Sơ đồ thực hiện lệnh XLAT ................................................................ 42
Hình 2.6. File chương trình .COM trong bộ nhớ ................................................ 79
Hình 3.1. Sơ đồ chân tín hiệu của 8086 .............................................................. 83
Hình 3.2. Mạch tạo xung đồng hồ 8284.............................................................. 87
Hình 3.3. Mạch 8086 nối với 8284 ................................................................... 89
Hình 3.4. Mạch tạo xung điều khiển .................................................................. 89
Hình 3.5. Chu kỳ bus ghi .................................................................................... 92
Hình 3.6. Chu kỳ bus đọc .................................................................................... 92
Hình 3.7. Sơ đồ ghép nối 8086 với BUS chế độ MIN ....................................... 94
Hình 3.8. Sơ đồ ghép nối 8086 với BUS chế độ MAX ..................................... 95
Hình 3.9. Cấu trúc chung của 1 IC nhớ............................................................... 97
Hình 3.10. Sơ đồ EPROM 2716.......................................................................... 99
Hình 3.11. Sơ đồ SRAM 62256 .......................................................................... 99
Hình 3.12 Sự phân băng cho BUS 16 bit .......................................................... 100
Hình 3.13. Tổ chức bộ nhớ RAM sử dụng mạch logic để giải mã ................... 103
Hình 3.14. Tổ chức bộ nhớ RAM sử dụng mạch 74LS138 để giải mã ............ 104
Hình 3.15. Tổ chức bộ nhớ RAM cho 8086 (làm việc ở chế độ MAX) ........... 105
Hình 3.16. Tổ chức bộ nhớ ROM cho 8086 làm việc ở chế độ MIN ............... 107
Hình 3.17. Tổ chức bộ nhớ ROM cho 8086 làm việc ở chế độ MAX.............. 107
Hình 3.18. Phân vùng địa chỉ cho bộ nhớ và cổng vào ra ................................ 108
Hình 3.19 Mạch giải mã địa chỉ đơn giản cho cổng vào ra ............................. 109
Hình 3.20. Các bộ giải mã cổng vào ra: a) 8 cổng vào; b) 8 cổng ra............... 110

7
Hình 3.21. Một bộ giải mã cho cổng vào địa chỉ chẵn: 78H- 7EH, cổng ra địa
chỉ lẻ: 79H-7FH................................................................................................. 110
Hình 3.22. Một mạch phối ghép ra đơn giản dùng 74LS373 .......................... 111
Hình 3.23. Một mạch phối ghép ra đơn giản dùng 74LS244 .......................... 111
Hình 3.24. Sơ đồ khối chức năng của 8255A ................................................... 112
Hình 3.25. Tổ chức chân tín hiệu của 8255A ................................................... 113
Hình 3.26. Từ điều khiển định nghĩa cấu hình của 8255A ............................... 115
Hình 3.27. Từ điều khiển lập/xoá PCi của 8255A ........................................... 115
Hình 3.28. Đồ thị thời gian Mode 0 (vào/ra cơ sở)........................................... 116
Hình 3.29. Mạch 8255A ở chế độ 1 và các tín hiệu trạng thái ......................... 117
Hình 3.30. Biểu đồ thời gian các tín hiệu của 8255A ở mode 1 ...................... 118
Hình 3.31. Sơ đồ 8255A làm việc ở mode 2 ..................................................... 120
Hình 3.32. Tín hiệu trạng thái ở mode 2 ........................................................... 121
Hình 3.33. Biểu đồ thời gian các tín hiệu của 8255A ở mode 2 ....................... 121
Hình 3.34. Sử dụng 8255A thiết kế 1 cổng vào 16 bit mode 1; 1 cổng ra 8 bit
mode1; 1 cổng vào 8 bit mode 0 cho hệ vi xử lý 8086 ..................................... 123
Hình 3.35. Sơ đồ ghép nối 8086 với 8255A ..................................................... 124
Hình 3.36. Khung cho một ký tự theo mã ASCII để truyền không đồng bộ ... 126
Hình 3.37. Khuôn dạng của bản tin truyền đồng bộ theo giao thức ................. 127
Hình 3.38. Sơ đồ chân tín hiệu UART 8250A .................................................. 128
Hình 3.39. Sơ đồ chức năng 8250A .................................................................. 130
Hình 3.40. Dạng thức của thanh ghi IER .......................................................... 132
Hình 3.41. Dạng thức của thanh ghi IER .......................................................... 133
Hình 3.42. Dạng thức của thanh ghi LCR......................................................... 133
Hình 3.43. Dạng thức của thanh ghi LSR ......................................................... 135
Hình 3.44. Dạng thức của thanh ghi MCR ....................................................... 137
Hình 3.45. Dạng thức của thanh ghi MSR ........................................................ 138
Hình 3.46. Sơ đồ ghép nối của 8250A .............................................................. 140
Hình 3.47. Nối ghép RS-232C bắt tay bằng chương trình ................................ 142

8
Hình 3.48. Nối ghép RS-232C bắt tay bằng phần cứng.................................... 143
Hình 3.49. Sơ đồ chức năng của USART 8251A ............................................. 144
Hình 3.50. Dạng thức của thanh ghi chế độ của 8251A ................................... 147
Hình 3.51. Dạng thức của thanh ghi từ lệnh của 8251A................................... 148
Hình 3.52. Dạng thức của thanh ghi trạng thái của 8251A............................... 150
Hình 3.53. Lưu đồ cho các chương trình 8251A .............................................. 155
Hình 3.54. Ảnh hưởng độ rung của công tắc .................................................... 157
Hình 3.55. Sơ đồ của mạch bàn phím .............................................................. 158
Hình 3.56. Bàn phím điều khiển bằng chương trình ......................................... 159
Hình 3. 57. Lưu đồ thuật toán điều khiển bàn phím ......................................... 160
Hình 3.58. Mạch nối trực tiếp LED 7 đoạn ...................................................... 164
Hình 3.59. Phối ghép hiển thị động .................................................................. 165
Hình 3.60. Sơ đồ Text LCD 44780 ................................................................... 166
Hình 3.61. Ghép nối với LCD 44780 ................................................................ 168
Hình 3.62. Mô tả phối ghép trong thế giới tương tự ......................................... 172
Hình 3.63. Sơ đồ chức năng bộ chuyển đổi ADC 0809.................................... 174
Hình 3.64. Hoạt động của ADC 0809 khi đầu vào là đơn cực ......................... 175
Hình 3.65. Hoạt động của ADC 0809 khi đầu vào là lưỡng cực ...................... 175
Hình 3.66. Đồ thị thời gian của ADC 0809 ...................................................... 176
Hình 3.67. Ghép ADC 0809 với hệ vi xử lý ..................................................... 177
Hình 3.68. Mạch DAC 0808 ............................................................................. 180
Hình 3.69. Phối ghép của DAC......................................................................... 181
Hình 4.1. Điều khiển vào/ra bằng thăm dò không theo ưu tiên ........................ 183
Hình 4.2. Điều khiển vào/ra bằng thăm dò theo ưu tiên .................................. 184
Hình 4.3. Trình tự xử lý ngắt của 8086 ............................................................. 187
Hình 4.4. Sơ đồ nguyên lý chung hoạt động theo cơ chế ngắt ......................... 188
Hình 4.5. Sơ đồ cấu trúc của PIC 8259A .......................................................... 189
Hình 4.6. Sơ đồ chân của PIC 8259A ............................................................... 191
Hình 4.7. Tổ chức của ICW1 ............................................................................ 192

9
Hình 4.8. Tổ chức của ICW2 ............................................................................ 193
Hình 4.9. Tổ chức của ICW3 ............................................................................ 194
Hình 4.10. Tổ chức của ICW4 .......................................................................... 195
Hình 4.11. Thứ tự và điều kiện ghi các từ điều khiển ICW .............................. 196
Hình 4.12. Dạng thức của các từ điều khiển hoạt động OCW.......................... 197
Hình 4.13. Dạng thức của thanh ghi yêu cầu ngắt và thanh ghi phục vụ ......... 200
Hình 4.14 Dạng thức của từ thăm dò trạng thái yêu cầu ngắt .......................... 201
Hình 4.15. Nguyên lý ghép nối với 8259A ....................................................... 202
Hình 4.16. Sơ đồ ghép nối tầng 8259A trong hệ vi xử lý 8086 ........................ 204
Hình 4.17. Sơ đồ tổ chức cho ngoại vi yêu cầu ngắt ....................................... 206
Hình 4.18. Hệ vi xử lý với DMAC ................................................................... 210
Hình 4.19. Sơ đồ khối cấu trúc của DMAC 8237A .......................................... 213
Hình 4.20. Dạng thức của thanh ghi lệnh ......................................................... 219
Hình 4.21. Dạng thức của thanh ghi chế độ ...................................................... 220
Hình 4.22. Dạng thức của thanh ghi yêu cầu .................................................... 220
Hình 4.23. Dạng thức của thanh ghi mặt nạ riêng cho mỗi kênh ..................... 221
Hình 4.24. Dạng thức của thanh ghi mặt nạ tổng hợp ...................................... 221
Hình 4.25. Dạng thức của thanh ghi trạng thái ................................................. 222
Hình 5.1. Bộ mô tả mảng số liệu của 80286 ..................................................... 227
Hình 5.2. Cơ chế quản lý địa chỉ của 80386 ..................................................... 230
Hình 5.3. Cơ chế quản lý theo mảng của 80386 ............................................... 230
Hình 5.4. Cơ chế quản lý theo trang của 80386 ................................................ 231
Hình 5.5 Sơ đồ chân tính hiệu của ON-CHIP 8051 .......................................... 234
Hình 5.6. Sơ đồ nguyên lý ghép nối AT89C51 với LCD HD 44780 ............... 235
Hình 5.7. Sơ đồ ghép nối AT89C51 với Text LCD HD44780 và bàn phím .... 238

10
LỜI NÓI ĐẦU

Trong những thập niên cuối thế kỷ 20, kỹ thuật điện tử đã liên tục có
những tiến bộ vượt bậc, đặc biệt trong kỹ thuật chế tạo mạch vi điện tử. Sự ra
đời và phát triển nhanh chóng của kỹ thuật vi điện tử mà đặc trưng là kỹ thuật
vi xử lý đã tạo ra một bước ngoặt quan trọng trong sự phát triển của khoa học
tính toán và xử lý thông tin.

Các bộ vi xử lý hiện đang phát triển mạnh mẽ, chúng được sử dụng rộng
rãi trong nhiều ứng trong đời sống, như trong các hệ thống tính toán, các hệ
thống thông tin liên lạc, các hệ thống điều khiển, …và đặc biệt có mặt trong
nhiều sản phẩm mật mã của ngành Cơ yếu.

Xuất phát từ yêu cầu thực tế, môn học “Kỹ thuật vi xử lý” đã được Học
viện Kỹ thuật mật mã đưa vào giảng dạy cho mọi loại hình đào tạo. Để giúp
sinh viên có điều kiện tốt hơn trong việc tiếp thu kiến thức môn học, chúng tôi
xây dựng giáo trình “KỸ THUẬT VI XỬ LÝ”. Giáo trình tập trung giới thiệu
bộ vi xử lý Intel 8086 và các ghép nối tiêu biểu để tạo nên hệ vi xử lý. Hệ vi
xử lý dựa trên bộ vi xử lý Intel 8086 tương đối đơn giản, dễ hiểu và hữu ích
cho việc tìm hiểu cũng như phát triển các hệ vi xử lý phức tạp.

Giáo trình được cấu trúc thành 5 chương, với các nội dung sau:

Chương 1 giới thiệu các khái niệm tổng quan về vi xử lý, hệ vi xử lý và


các thành phần căn bản cấu thành hệ vi xử lý. Trong chương này cũng trình
bày các bước cơ bản để thiết kế một hệ vi xử lý chuyên dụng.

Chương 2 trình bày về cấu trúc, tập lệnh của bộ vi xử lý Intel 8086, cách
lập và chạy một chương trình hợp ngữ với cấu trúc đơn giản.

Chương 3 trình bày việc tổ chức ghép nối trong hệ vi xử lý Intel 8086 để
tạo thành hệ vi xử lý căn bản, bao gồm: ghép nối với bus hệ thống, ghép nối
với bộ nhớ, ghép nối với cổng vào/ra và ghép nối với một số thiết bị ngoại vi.

11
Chương 4 cung cấp kiến thức căn bản về các phương pháp trao đổi dữ
liệu với các thiết bị ghép nối trong hệ vi xử lý, bao gồm: vào/ra thăm dò,
vào/ra bằng ngắt và vào/ra trực tiếp bộ nhớ. Chương này cũng giới thiệu vi
mạch trợ giúp cho các phương pháp vào/ra như vi mạch điều khiển ngắt, vi
mạch điều khiển vào ra trực tiếp bộ nhớ.

Chương 5 trình bày sơ bộ các bộ vi xử lý tiên tiến của Intel với các tính
năng tiên tiến của nó. Chương này còn cung cấp các thông tin căn bản về hệ
vi điều khiển Intel 8051 và một số ứng dụng.

Giáo trình được biên soạn dựa trên tham khảo các tài liệu và dựa trên
trao đổi kinh nghiệm giảng dạy với các đồng nghiệp. Trong quá trình biên
soạn, dù đã có nhiều cố gắng song không tránh khỏi thiếu sót. Nhóm tác giả
mong nhận được các ý kiến góp ý cho các thiếu sót cũng như ý kiến cập nhật
và hoàn thiện nội dung của tài liệu.

Hà Nội, tháng 10 năm 2015

Nhóm tác giả

12
Chương 1: TỔNG QUAN VỀ BỘ VI XỬ LÝ VÀ HỆ VI XỬ LÝ

1.1. Bộ vi xử lý
1.1.1. Khái niệm và quá trình phát triển

Bộ vi xử lý (MP-Microprocessor) là một vi mạch logic chế tạo theo công


nghệ LSI cho đến VLSI, hoạt động dưới sự điều khiển của chương trình đặt
trong bộ nhớ. Bộ vi xử lý là hạt nhân của hệ vi xử lý, nắm quyền kiểm soát
toàn bộ các thành phần có trong hệ thống, thực hiện các phép toán số học,
logic, đưa ra các quyết định và thông tin với thế giới bên ngoài qua các cổng
vào/ra dưới sự điều khiển của chương trình cài đặt trong bộ nhớ.

Bộ vi xử lý đầu tiên có khả năng xử lý 4 bit dữ liệu, các bộ vi xử lý này


có tốc độ xử lý rất chậm. Sau đó các nhà thiết kế đã đưa ra các bộ vi xử lý xử
lý dữ liệu 8 bit, 16 bit, 32 bit và 64 bit. Sự phát triển về dung lượng các bit
của vi xử lý làm tăng thêm số lượng các lệnh điều khiển và các lệnh tính toán
phức tạp. Dưới đây là quá trình phát triển vi xử lý của hãng Intel:

- Tháng 4 năm 1971, Intel sản xuất ra chip vi xử lý 4004, xử lý dữ liệu 4


bit, truy xuất 4096 ô nhớ 4 bit và có 45 lệnh.

- Tháng 4 năm 1972, Intel cải tiến và cho ra vi xử lý 8008, xử lý dữ liệu


8 bit, truy xuất 16KB ô nhớ và có 48 lệnh.

- Tháng 4 năm 1974, Intel cải tiến vi xử lý 8008 thành vi xử lý 8080, xử


lý dữ liệu 8 bit, truy xuất 64KB ô nhớ, tốc độ làm việc nhanh gấp 10 lần so
với 8008.

- Tháng 4 năm 1976, Intel cải tiến vi xử lý 8080 thành vi xử lý 8085 có


thêm mạch tạo xung clock được tích hợp bên trong, có nhiều ngắt trên chip
phục vụ cho nhiều ứng dụng và tích hợp mạch điều khiển hệ thống trên chip.

- Tháng 6 năm 1978, Intel sản xuất vi xử lý 8086, xử lý dữ liệu 16 bit, có


20 đường địa chỉ cho phép truy xuất 1MB bộ nhớ, bus dữ liệu bên trong và
bên ngoài đều là 16 bit.

13
- Tháng 6 năm 1979, Intel sản xuất vi xử lý 8088 dựa trên vi xử lý 8086.
8088 có bus dữ liệu ngoài chỉ có 8 bit, bus dữ liệu trong 16 bit, mục đích cải
tiến này nhằm hạ giá thành hệ thống và trở thành vi xử lý trong máy tính
IBM-PC/XT.

- Cuối năm 1981 và 1982, Intel cho ra đời vi xử lý 80186 và phiên bản
mở rộng của vi xử lý 8086 có hỗ trợ quản lý bộ nhớ theo phân đoạn và bảo vệ
bộ nhớ, bus địa chỉ có 24 đường cho phép truy xuất 16MB bộ nhớ.

- Tháng 2 năm 1982, Intel cho ra đời vi xử lý 80286 cũng là vi xử lý 16


bit, chủ yếu phát triển từ vi xử lý 8086 có thêm nhiều chức năng như mạch
định thời được tích hợp, mạch điều khiển DMA, mạch điều khiển ngắt và
mạch chọn chíp bộ nhớ được thiết kế riêng cho các ứng dụng nhúng với giá
thành thấp.

- Tháng 10 năm 1985, Intel cho ra đời vi xử lý 80386, xử lý dữ liệu 32


bit, có quản lý bộ nhớ theo trang và phân đoạn bộ nhớ, bus dữ liệu bên trong
và bên ngoài đều là 32 bit, tập thanh ghi được mở rộng.

- Tháng 4 năm 1989, Intel cho ra đời vi xử lý 80486, có cải thiện kiến
trúc để tăng hiệu suất, cung cấp bộ nhớ cache trên board, đơn vị dấu chấm
động trên board. Có thêm 6 lệnh so với 80386, lệnh định thời được cải tiến để
tăng hiệu suất.

- Tháng 3 năm 1993, Intel cho ra đời vi xửa lý Pentium là vi xử lý 64 bit


có đơn vị dấu chấm động hiệu suất cao. Lệnh định thời được cải tiến so với
80486.

- Thánh 3 năm 1995, Intel cho ra đời vi xử lý Pentium Pro có 2 cấp cache
có sẵn.

- Tháng 3 năm 1997, Intel cho ra đời vi xử lý Pentium II-Pentium


Pro+MMX.

14
- Năm 1999, Intel cho ra đời vi xử lý Pentium III-IA64, mở rộng tạo
luồng SIMD

- Năm 2000, Intel cho ra đời vi xử lý Pentium IV.

- Tháng 4 năm 2005, Intel đã giới thiệu những CPU hai nhân Pentium
Extreme Edition (Pentium EE) và Pentium D đầu tiên. Chúng chứa trong lòng
hai nhân của Pentium IV mã Prescott (Dual Core). Tiếp theo là thế hệ của
CPU Quard Core, Octo Core.
1.1.2. Phân loại bộ vi xử lý

Có rất nhiều loại vi xử lý, nhưng thường được chia ra làm 2 loại:

- Bộ vi xử lý đa năng: bao gồm tất cả các phần tử tính toán trên một chip
(trừ bộ nhớ và các cổng vào ra)

- Bộ vi xử lý on-chip: bao gồm cả bộ nhớ và các cổng vào ra

1.1.3. Cấu trúc và hoạt động của bộ vi xử lý

1.1.3.1. Cấu trúc chung của bộ vi xử lý

Cấu trúc chung của bộ vi xử lý - Hình 1.1

❖ Khối đệm lệnh và giải mã lệnh

- Khối đệm lệnh: gồm 1 hay vài thanh ghi tùy theo từng loại bộ vi xử lý
để chứa tạm thời các byte lệnh trước khi đưa vào giải mã lệnh.

- Khối giải mã lệnh: giải mã byte mã lệnh, xác định thao tác của lệnh để
đưa thông tin đến khối điều khiển. Các thông tin này là các vi lệnh hay vi
chương trình.
❖ Khối điều khiển

Điều khiển và đồng bộ toàn bộ hoạt động của hệ thống, nhiệm vụ của
khối là:

- Nhận tín hiệu nhịp từ bên ngoài (xung đồng bộ) để đồng bộ hoạt động
của CPU.

15
- Điều khiển hệ thống thực hiện lệnh khi chạy một chương trình.

- Nhận tín hiệu yêu cầu điều khiển từ bên ngoài, tạo ra tín hiệu điều
khiển đáp ứng yêu cầu đó.

Khối đệm lệnh Khối các


thanh ghi
ALU
Giaỉ mã lệnh

Khối điều khiển Quản lý bộ nhớ


và tạo địa chỉ

Mạch phối với Bus

Bus điều khiển Bus địa chỉ Bus dữ liệu

Hình 1.1. Cấu trúc chung của bộ vi xử lý

❖ Khối các thanh ghi

Là một khối quan trọng mà người lập trình can thiệp được, được chia ra
thành các loại thanh ghi:

+ Các thanh ghi địa chỉ lệnh: là một vài thanh ghi được dùng để chứa
địa chỉ của byte lệnh tiếp theo trong bộ nhớ mà CPU sẽ đưa vào khối đợi lệnh.
Nội dung của nó sẽ được thay đổi khi CPU làm việc.

Khi khởi động, một giá trị cố định được nạp vào các thanh ghi địa chỉ
lệnh tuỳ theo từng loại bộ vi xử lý. Giá trị này xác định địa chỉ của byte lệnh
đầu tiên sau khi khởi động, được gọi là địa chỉ khởi động.

Khi thực hiện chương trình đối với cấu trúc tuần tự: sau khi một byte
lệnh có địa chỉ là nội dung của các thanh ghi địa chỉ lệnh được CPU đưa vào
khối đợi lệnh thì nội dung của thanh ghi địa chỉ lệnh sẽ tự động tăng lên 1 đơn

16
vị, chuẩn bị cho CPU nhận byte lệnh tiếp theo. Với cấu trúc rẽ nhánh: khi có
lệnh rẽ nhánh, nội dung các thanh ghi này được cất vào một vùng nhớ đặc
biệt, sau đó chúng sẽ được nạp giá trị địa chỉ của lệnh cần rẽ nhánh tới.

+ Các thanh ghi dữ liệu (các thanh ghi đa năng): là các thanh ghi được
địa chỉ hoá có độ dài 8, 16 hoặc 32 bit tuỳ theo từng bộ vi xử lý.

Các thanh ghi dữ liệu được địa chỉ hoá, do đó có thể sử dụng làm các
toán hạng của lệnh, hay để lưu trữ tạm thời các dữ liệu, các kết quả của phép
tính... trong quá trình thực hiện chương trình.

+ Các thanh ghi quản lý bộ nhớ: là các thanh ghi được dùng để chứa các
địa chỉ và thông tin phục vụ cho việc thâm nhập bộ nhớ. Bộ nhớ có những
vùng chứa chương trình, những vùng chứa dữ liệu tương ứng với các thanh
ghi địa chỉ.

+ Các thanh ghi điều khiển: điều khiển sự hoạt động hay mô tả trạng thái
của bộ vi xử lý. Mỗi một bit của thanh thi điều khiển được gọi là một cờ. Các
cờ được chia ra làm 2 loại:

- Cờ trạng thái: phản ánh trạng thái của kết quả phép tính trong ALU.

- Cờ điều khiển:điều khiển quá trình làm việc của bộ vi xử lý.

❖ Khối số học và logic (ALU): thực hiện các phép số học và logic.

1.1.3.2. Hoạt động chung của bộ vi xử lý

❖ Các trạng thái của bộ vi xử lý

Hoạt động của bộ vi xử lý thường ở một trong các trạng thái tiêu biểu
sau:

+ Trạng thái thực hiện chương trình (program): Là trạng thái mà bộ vi


xử lý đọc từng lệnh từ bộ nhớ vào, giải mã, thực hiện lệnh và bảo vệ kết quả.

17
+ Trạng thái ngắt (interrupt): là trạng thái mà bộ vi xử lý chuyển từ
chương trình chính sang chương trình con phục vụ một một yêu cầu ngắt
nhằm mục đích trao đổi dữ liệu với thiết bị ngoại vi hoặc xử lý các sự cố.

+ Trạng thái bus nghỉ: là trạng thái bus không hoạt động, bao gồm các
dạng:

- Trạng thái thả nổi (suspend): ở trạng thái này các chân địa chỉ, dữ
liệu và một số chân điều khiển của bộ vi xử lý được đặt vào trạng
thái trở kháng cao. Thường nó được xử dụng trong các hệ vi xử lý
nối chung bus.

- Trạng thái đợi (wait): là trạng thái bộ vi xử lý không làm gì mà chờ


tác động của tín hiệu điều khiển bên ngoài.

- Trạng thái dừng: thường xuất hiện do lỗi phần cứng trầm trọng hay
có lệnh dừng (HALT), và chỉ có Reset mới đưa hệ hoạt động trở lại.

❖ Hoạt động.

+ Hoạt động trong trạng thái thực hiện chương trình: là quá trình thực
hiện chương trình của bộ vi xử lý dựa trên các chu kỳ lệnh liên tiếp nhau.

Chu kỳ lệnh là quá trình CPU thực hiện các thao tác nhận lệnh, giải mã
lệnh và thực hiện xong 1 lệnh. Các thao tác trên có thể thực hiện nối tiếp hay
song song tuỳ từng thế hệ bộ vi xử lý.

- Nhận lệnh: CPU tạo tín hiệu địa chỉ thực từ nội dung của các thanh ghi
địa chỉ lệnh và gửi ra bus địa chỉ để xác định byte lệnh; tạo tín hiệu điều khiển
để đọc byte lệnh từ bộ nhớ qua bus dữ liệu đưa về khối đệm lệnh trong CPU.
- Giải mã lệnh: CPU giải mã byte mã lệnh, tạo ra các vi chương trình
tương ứng để khối điều khiển điều khiển thực hiện lệnh.
- Thực hiện lệnh: Nếu lệnh chỉ thao tác trong CPU thì khối điều khiển sẽ
điều khiển để thực hiện lệnh. Nếu lệnh đòi hỏi thâm nhập bộ nhớ hay cổng

18
vào/ra thì khối điều khiển sẽ điều khiển tạo tín hiệu địa chỉ và các tín hiệu
điều khiển để thực hiện lệnh.

+ Hoạt động trong trạng thái ngắt: là quá trình hoạt động mà bộ vi xử lý
chuyển từ chương trình chính sang một chương trình con dưới một yêu cầu
ngắt nhằm mục đích trao đổi dữ liệu với thiết bị ngoại vi hoặc xử lý các sự cố,
gọi là chương trình con xử lý ngắt (CTCXLN). Một bộ vi xử lý có thể cho
phép xây dựng nhiều ngắt. Mỗi ngắt tương ứng với một CTCXLN. Khi nhận
được một yêu cầu ngắt, bộ vi xử lý sẽ xác định xem ngắt có được phép hay
không.

- Nếu không được phép, thực hiện tiếp chương trình đang thực hiện và
cho qua yêu cầu ngắt đó.

- Nếu được phép, thực hiện xong lệnh đang thực hiện, gửi địa chỉ quay
trở về và chuyển sang thực hiện CTCXLN tương ứng (nạp địa chỉ của
CTCXLN vào các thanh ghi địa chỉ lệnh của bộ vi xử lý).

Khi kết thúc CTCXLN, bộ vi xử lý quay lại chương trình chính tại điểm
bị ngắt bằng cách nạp lại địa chỉ quay trở về vào thanh ghi địa chỉ lệnh.

1.2. Hệ vi xử lý

1.2.1. Cấu trúc phần cứng

Sơ đồ khối chức năng của hệ vi xử lý được thể hiện trên Hình 1.2.

Bus dữ liệu
Bus điều khiển

CLK CPU
ROM RAM I/O TBNV

Bus địa chỉ

Hình 1.2. Sơ đồ khối của hệ vi xử lý

19
❖ Khối xử lý trung tâm (CPU): là đầu não của hệ vi xử lý, nó điều khiển
hệ thống hoạt động: thực hiện chương trình, điều khiển thiết bị, xử lý sự cố...

❖ Bộ nhớ (memory): là một phần rất quan trọng của hệ vi xử lý, là nơi
chứa chương trình và dữ liệu. Bộ nhớ bao gồm bộ nhớ trong và bộ nhớ ngoài.

- Bộ nhớ ROM: thông tin chỉ được đọc ra trong quá trình làm việc và
không bị mất đi khi mất điện. Bộ nhớ này dùng để chứa chương trình điều
khiển hoạt động của toàn hệ hoặc một phần chương trình điều hành để khi bật
điện CPU có thể lấy lệnh từ đây mà khởi đầu hệ thống.

- Bộ nhớ RAM: thông tin có thể được đọc ra hay ghi vào trong quá trình
làm việc và bị mất đi khi mất nguồn cấp hoặc khi có nội dung mới ghi đè vào.
Một phần của chương trình điều khiển hệ thống; các chương trình ứng dụng;
dữ liệu, các kết quả của chương trình thường được để trong bộ nhớ RAM.

- Bộ nhớ ngoài được dùng để cất trữ lâu dài chương trình và dữ liệu.
Chương trình phải được nạp vào bộ nhớ RAM khi thực hiện. Bộ nhớ ngoài
thường có nhiều loại: băng từ, đĩa từ...

❖ Cổng vào ra (I/O): các cổng vào/ra được dùng làm nơi trung chuyển
dữ liệu giữa CPU với thiết bị ngoại vi (TBNV). Tuỳ theo nhu cầu cụ thể của
công việc, các mạch cổng này có thể được xây dựng từ các mạch logic đơn
giản hoặc từ các vi mạch chuyên dụng lập trình được.

❖ Các bus truyền thông tin: là tập hợp các dây dẫn song song để chuyển
tải một thông tin nhị phân giữa các khối chức năng trong hệ thống, trong hệ vi
xử lý có 3 loại bus:

- Bus địa chỉ: có chiều từ bộ vi xử lý đi ra. Bộ vi xử lý dùng bus này để


quản lý các thành phần có trong hệ bằng cách gán cho mỗi thành phần một địa
chỉ xác định. Khi đọc/ghi bộ nhớ hay cổng vào/ra, CPU sẽ đưa ra trên bus này
địa chỉ của ô nhớ hay cổng vào/ra có liên quan. Tổng các đường dẫn tạo lên
bus địa chỉ phản ánh độ dài từ địa chỉ, hay độ lớn của trường địa chỉ có thể có
của hệ thống.

20
- Bus dữ liệu: dùng để trao đổi dữ liệu giữa CPU với các thành phần bên
ngoài, giữa các thành phần với nhau. Số đường dây của bus dữ liệu tuỳ thuộc
vào các bộ vi xử lý, nó quyết định số bit dữ liệu mà CPU có khả năng xử lý
cùng một lúc. Thông tin trên bus dữ liệu được truyền dẫn theo 2 chiều từ CPU
tới các thiết bị ngoài CPU và ngược lại.

- Bus điều khiển: là tập hợp các dây tín hiệu điều khiển để tạo liên lạc
giữa bộ vi xử lý và các thành phần có trong hệ thống nhằm đồng bộ các chế
độ và thao tác của hệ thống.

❖ Bộ tạo nhịp: cung cấp tín hiệu nhịp cho CPU nhằm đồng bộ các quá
trình hoạt động của hệ thống. Tần số xung nhịp nói lên tốc độ gia công xử lý
tin của CPU cũng như tốc độ hoạt động của hệ thống.

1.2.2. Phần mềm

Phần mềm là một thành phần không thể thiếu được của hệ vi xử lý, đó là
chương trình do người lập trình tạo ra để giải quyết nhiệm vụ bài toán đặt ra
khi thiết kế hệ thống. Các chương trình này được đặt trong bộ nhớ ROM và
RAM khi hệ thống hoạt động.

Trong máy tính, để thuận tiện cho người sử dụng là các đối tượng khác
nhau trên các bài toán khác nhau, thường phần mềm được phân lớp. Các lớp
trong là các chương trình quản lý, điều khiển, các dữ liệu cố định... làm nhiệm
vụ trung gian giữa người và máy được gọi là hệ điều hành (HĐH). Các
chương trình của HĐH thường khá lớn và được nạp một phần trong ROM,
phần còn lại được chứa trong bộ nhớ ngoài và được nạp vào RAM mỗi khi
khởi động máy. Các chương trình ứng dụng do người lập trình viết (lớp
ngoài) để giải quyết một bài toán nào đó, khi thực hiện sẽ được HĐH nạp vào
trong RAM ở vị trí theo sự phân bố của HĐH. Khi phần cứng thực hiện xong
chương trình đó thì bài toán được giải.

21
Như vậy, trong hệ vi xử lý chuyên dụng hay trong máy tính, phần mềm
là để giải quyết bài toán, còn phần cứng được tổ chức để thực hiện phần mềm
đó. Do đó, ta có thể xem phần mềm là linh hồn của một hệ vi xử lý.

1.2.3. Hoạt động của hệ vi xử lý

Hoạt động của hệ vi xử lý diễn ra theo một chương trình. Đây là quá
trình nhận lệnh, giải mã và thực hiện các lệnh liên tiếp từ lệnh bắt đầu cho đến
lệnh kết thúc.

❖ Quá trình nhận lệnh: CPU nhận lệnh từ bộ nhớ trung tâm. Để nhận 1
byte lệnh, từ giá trị của thanh ghi địa chỉ lệnh, CPU tạo ra các bit địa chỉ đưa
ra bus địa chỉ xác định byte lệnh cần lấy vào. Sau đó CPU đưa các tín hiệu
điều khiển đọc byte lệnh về CPU. Khi đó nội dung của các thanh ghi địa chỉ
lệnh tự động tăng 1 đơn vị để chuẩn bị cho việc nhận byte lệnh tiếp theo.

❖ Quá trình giải mã lệnh: byte đầu tiên của lệnh là byte mã lệnh. CPU
giải mã byte mã lệnh này để xác định chức năng của lệnh. Nếu lệnh không
cần toán hạng chuyển sang chu kỳ thực hiện lệnh. Nếu lệnh cần toán hạng,
CPU xác định toán hạng cho lệnh.

❖ Quá trình thực hiện lệnh:

- Nếu là lệnh dừng, CPU dừng quá trình làm việc cho tới khi Reset

- Nếu không phải, CPU thực hiện lệnh và gửi kết quả. Trong quá trình
thực hiện lệnh, nếu là lệnh thao tác ngay trong bộ vi xử lý thì CPU sẽ thực
hiện lệnh, còn nếu là lệnh cần thao tác với bên ngoài thì CPU gửi tín hiệu địa
chỉ và điều khiển để thực hiện.

Sau đó quá trình lại quay lại lệnh tiếp theo. Các quá trình nhận lệnh, giải
mã lệnh và thực hiện lệnh có thể tiến hành tuần tự hay song song tuỳ theo cấu
trúc từng bộ vi xử lý

22
1.2.4. Các bước thiết kế một hệ vi xử lý

Khi thực hiện bài toán thiết kế một hệ vi xử lý đa dụng hoặc chuyên
dụng, thường tiến hành theo trình tự sau:

❖ Bước 1: Phân tích chức năng nhiệm vụ của hệ vi xử lý cần thiết kế.

Nhiệm vụ của hệ vi xử lý cần thiết kế bao giờ cũng được mô tả đầy đủ


bằng các ngôn ngữ kỹ thuật thích hợp. Người thiết kế phải tiến hành nghiên
cứu và phân tích một cách kỹ lưỡng nhiệm vụ và các chức năng chính của hệ
vi xử lý; tìm hiểu và nghiên cứu môi trường làm việc của hệ, các loại đối
tượng điều khiển của hệ, đặc trưng và các tham số của nguồn thông tin mà hệ
cần thu nhận và xử lý... Trên cơ sở của các bước phân tích, phải phân chia
một cách hợp lý chức năng nào thuộc phần cứng đảm nhiệm và chức năng
nào thuộc phần mềm đảm nhiệm, các chức năng nào là để mở để cho phép
người sử dụng có thể can thiệp và phát triển (đối với hệ vi xử lý đa dụng)...

Phần cứng, trước hết là những thành phần không thể thay thế bằng phần
mềm như: các cấu trúc vật lý của hệ (chip vi xử lý, bộ nhớ trung tâm, các
mạch điều khiển, các giao diện ngoại vi và các ngoại vi....). Ngoài ra, có thể
sử dụng phần cứng để thực hiện một số chức năng của phần mềm với mục
đích cải thiện tính năng nào đó, ví dụ như về tốc độ khi phải thực hiện các
phép tính với các hàm toán học phức tạp...

Phần mềm, là phần đảm nhiệm các chức năng còn lại của hệ thống. Nó
thực hiện các thao tác phức tạp, đòi hỏi phải xử lý tình huống, ra các quyết
định trong các điều kiện và yếu tố tác động vào hệ là các điều kiện và yếu tố
động (luôn biến đổi).

❖ Bước 2: Tổ chức phần cứng cho hệ vi xử lý cần thiết kế.

Trên cơ sở phân tích ở bước 1, ở bước này phải tổ chức được phần cứng
của hệ thống. Các nội dung chính cần thực hiện ở bước này là:

23
- Xây dựng sơ đồ khối của hệ vi xử lý cần thiết kế, trong đó mỗi thành
phần được thể hiện bằng một hộp chức năng. Các thành phần này liên hệ với
chip vi xử lý thông qua bus hệ thống của hệ.
- Tiến hành lựa chọn các chip IC thực hiện được các nhiệm vụ, chức
năng của từng thành phần. Quan trọng nhất là lựa chọn chủng loại vi xử lý, nó
sẽ quyết định phần lớn hiệu năng của hệ (tốc độ, khả năng xử lý dữ liệu, khả
năng quản lý không gian nhớ và các thiết bị ngoại vi).
- Xây dựng các sơ đồ chi tiết cho từng thành phần có tính tới cơ chế điều
khiển và cơ chế đồng bộ sao cho thật tối ưu, nhằm tránh hiện tượng xung đột
trạng thái của hệ. Tổ chức bộ nhớ trung tâm có dung lượng và cơ chế nhập
xuất thông tin đúng theo yêu cầu. Tổ chức các ngoại vi cần thiết kế theo đúng
tính năng của từng ngoại vi, đặc biệt quan tâm đến khả năng và phương thức
giao tiếp của chúng với bộ vi xử lý. Các phương thức giao tiếp có thể là hỏi
vòng, ngắt hoặc truy nhập trực tiếp. Mỗi phương thức có ưu, nhược điểm
riêng, khi thiết kế cần phải cân nhắc lựa chọn cho phù hợp. Tổ chức bộ giải
mã địa chỉ cho hệ thống phải bảo đảm tính đơn trị và cân nhắc tới khả năng
mở rộng của hệ (đối với các hệ đa nhiệm).
- Nhiệm vụ cuối cùng trong việc tổ chức phần cứng là nối ghép các thành
phần của hệ vi xử lý với nhau thông qua kênh hệ thống để tạo thành hệ hoàn
chỉnh, sẵn sàng đi vào hoạt động khi có chương trình điều khiển cài đặt bên
trong hệ vi xử lý.
❖ Bước 3: Xây dựng phần mềm cho hệ vi xử lý cần thiết kế.

Công việc của bước này là, trên cơ sở các bước ở trên phải xây dựng
được phần mềm điều khiển của hệ thống. Các nội dung cần thực hiện là:

- Xây dựng thuật toán điều khiển bảo đảm quản lý và phối hợp các chức
năng, chỉ rõ các giới hạn của từng chức năng nhằm làm cơ sở để tổ chức tốt
sơ đồ thuật toán.

24
- Xây dựng lưu đồ thuật toán tổng quát cho hoạt động của hệ vi xử lý.
Tiếp đó là tổ chức các lưu đồ thuật toán cho các modul chức năng, nhằm cụ
thể hóa một cách chi tiết các trình tự thao tác của hệ thống.
- Khi tiến hành viết chương trình nguồn cho hệ vi xử lý, cần lựa chọn
ngôn ngữ phù hợp với vi xử lý, phù hợp với các công cụ phát triển phần mềm
hiện có (dịch, liên kết, nạp và cài đặt vào hệ vi xử lý, khả năng mở rộng các
ứng dụng cho người sử dụng...). Tốt nhất là nên viết dưới dạng file. COM và
viết bằng ngôn ngữ assembly tương thích với loại vi xử lý để vừa bảo đảm
dung lượng chương trình nhỏ, khả năng thực hiện nhanh, dễ dàng trong phát
triển phần mềm.
❖ Bước 4: Nạp chương trình cho hệ vi xử lý là hiệu chỉnh hệ thống.

Đây là bước rất quan trọng, có thể được thực hiện nhiều lần nhằm làm
cho hệ thống tối ưu và tin cậy. Tùy thuộc vào các công cụ hiện có, công việc
hiệu chỉnh phần cứng và phần mềm của hệ vi xử lý với các thiết bị chuẩn,
thiết bị mẫu, thậm chí trên cả hệ thống thực. Việc nạp và cài đặt chương trình
vào ROM của hệ vi xử lý cũng có thể phải tiến hành làm đi làm lại nhiều lần
vì còn phải điều chỉnh và sửa chữa, cho tới khi hệ hoạt động hoàn hảo thì thôi.

25
Chương 2: BỘ VI XỬ LÝ INTEL 8086

Là bộ vi xử lý thuộc thế hệ thứ 3. Bộ vi xử lý 8086 xử lý dữ liệu 16 bit


của Intel, các thông số cơ bản của 8086 như sau:

- Được đóng trong vỏ 40 chân

- Nguồn nuôi: chỉ một loại nguồn +5V

- Có khả ngăng xử lý dữ liệu 8 hay 16 bit.

- Cả bus dữ liệu bên trong và ngoài đều là 16 bit

- Bus địa chỉ 20 bit, bộ vi xử lý sử dụng cả 20 bit để địa chỉ hoá bộ nhớ,
do vậy khả năng địa chỉ hoá tối đa là 1MB bộ nhớ.

- Với cổng vào/ra, bộ vi xử lý sử dụng 8 bit địa chỉ trong chế độ địa chỉ
trực tiếp, và 16 bit địa chỉ trong chế độ địa chỉ gián tiếp.

- Có khả năng làm việc song song giữa đơn vị điều khiển bus (BIU) và
đơn vị xử lý (EU).

- Có thể làm việc ở 2 chế độ: chế độ tối thiểu (MIN), các tín hiệu điều
khiển được lấy trực tiếp từ CPU và được đưa ra bus hệ thống. Còn ở chế độ
mở rộng (MAX), CPU gửi tín hiệu đến bộ điều khiển bus-8228, bộ điều khiển
sẽ tạo tín hiệu điều khiển ra bus hệ thống.

2.1. Cấu trúc bên trong bộ vi xử lý 8086

2.1.1. Sơ đồ khối

Sơ đồ khối của bộ vi xử lý 8086 trên Hình 2.1, bao gồm hai đơn vị
chính: Đơn vị ghép nối bus BIU và đơn vị thực hiện lệnh EU. Hai thành phần
này có khả năng làm việc song song đồng thời và liên hệ với nhau qua hàng
đợi lệnh, chính điều này đã làm tăng đáng kể tốc độ xử lý của CPU. Đơn vị
EU không nối trực tiếp với thế giới bên ngoài.

2.1.2. Đơn vị giao tiếp bus (BIU)

❖ Chức năng: giao tiếp với các thành phần bên ngoài (bộ nhớ, cổng

26
vào/ra) thông qua bus hệ thống. BIU thực hiện các chức năng: tạo địa chỉ vật
lý từ địa chỉ logic của ô nhớ cần truy xuất; đọc mã lệnh từ bộ nhớ đưa tới
hàng đợi lệnh; truy xuất bộ nhớ hay cổng vào/ra để đọc hoặc gửi dữ liệu.

❖ Các khối:

- Bộ cộng: tạo địa chỉ vật lý

- 4 thanh ghi đoạn 16 bit CS, DS, SS, ES; một thanh ghi con trỏ lệnh 16
bit IP (chức năng của các thành ghi này sẽ đề cập ở mục 2.1.4).

- Hàng đợi lệnh IQ (Instruction Queue): dùng để lưu trữ tạm thời các
byte lệnh sẽ được đưa vào thực hiện trong EU. Hàng đợi lệnh được cấu tạo
theo kiểu FIFO (first in first out). Hàng đợi lệnh của 8086 là 6 byte.

- Khối điều khiển bus: Khối điều khiển bus (bus control unit) thực hiện
việc ghép nối giữa CPU với bus hệ thống.

2.1.3. Đơn vị thực hiện lệnh EU

❖ Chức năng:

EU nhận mã lệnh và dữ liệu từ BIU, thực thi lệnh. Kết quả thực thi lệnh
được chuyển ra bộ nhớ hoặc cổng vào/ra thông qua BIU.

❖ Các khối:

- Các thanh ghi tạm thời: lưu mã lệnh, dữ liệu tạm thời. Mã lệnh sau đó
được đưa tới bộ giả mã để xác định lệnh.

- ALU: thực hiện các phép toán số học và logic

- Điều khiển EU: điều khiển quá trình thực hiện lệnh.

- 8 thanh ghi 16 bit: AX, BX, CX, DX, SP, BP, SI, DI và một thanh ghi
cờ (FR) (chức năng của các thanh ghi này sẽ đề cập trong mục 2.1.4)

27
Địa chỉ 20 bit,
AH AL 
BH BL d.liệu 16 bit
CH CL
DH DL
SP CS
BP DS
SI SS
DI ES
IP

Khối điều
khiển Bus
Các thanh ghi tạm thời Bus
ngoài

Điều
ALU khiển
EU
Hàng đợi lệnh
Thanh ghi cờ

EU (Ecutive unit) BIU (bus interface unit)

Hình 2.1. Sơ đồ khối của bộ vi xử lý 8086


2.1.4. Các thanh ghi

❖ Các thanh ghi đoạn

8086 có 20 bit địa chỉ, có khả năng quản lý được 220 = 1M ô nhớ hay 1
Mbyte (vì các bộ nhớ nói chung tổ chức theo byte). Trong không gian nhớ
1Mbyte này bộ nhớ được chia thành các đoạn nhớ khác nhau (điều này rất
hữu ích khi làm việc ở chế độ nhiều người hoặc đa nhiệm) dành riêng để:

- Chứa mã chương trình

- Chứa dữ liệu và kết quả trung gian của chương trình

- Tạo ra một vùng nhớ đặc biệt gọi là ngăn xếp (stack) dùng vào việc
quản lý các thông số của bộ vi xử lý khi gọi chương trình con hoặc trở về từ
chương trình con.

28
Bộ vi xử lý 8086 có 4 thanh ghi đoạn 16 bit: thanh ghi đoạn mã CS thanh
ghi đoạn dữ liệu DS, thanh ghi đoạn ngăn xếp SS và thanh ghi đoạn dữ liệu
phụ ES. Các thanh ghi đoạn này được dùng để chỉ ra địa chỉ đầu của 4 đoạn
nhớ trong chương trình đang thực hiện, dung lượng lớn nhất của mỗi đoạn
nhớ này là 64 KB. Việc thay đổi giá trị của các thanh ghi đoạn làm cho các
đoạn tương ứng có thể dịch chuyển linh hoạt trong phạm vi không gian 1MB.
Vì vậy, các đoạn này có thể nằm cách nhau khi thông tin cần lưu trong chúng
đòi hỏi dung lượng đủ 64KB hoặc cũng có thể nằm trùm nhau do có những
đoạn không cần dùng hết độ dại 64KB, vì thế những đoạn khác có thể bắt đầu
nối tiếp ngay sau đó. Điều này cũng cho phép ta truy nhập vào bất kỳ đoạn
nhớ (64KB) nào nằm trong toàn bộ không gian 1MB.

Nội dung các thanh ghi đoạn sẽ xác định địa chỉ của ô nhớ nằm đầu
đoạn. Địa chỉ này còn gọi là địa chỉ cơ sở (hoặc địa chỉ segment). Địa chỉ của
các ô nhớ khác nằm trong đoạn được tính bằng cách cộng thêm vào địa chỉ cơ
sở một giá trị gọi là địa chỉ lệch (hay độ lệch – offset). Độ lệch này được xác
định bởi các thanh ghi 16 bit khác đóng vai trò thanh ghi lệch (offset register).

Để xác định địa chỉ vật lý (địa chỉ thực) 20 bit của một ô nhớ nào đó
trong một đoạn bất kỳ, CPU phải dùng tới 2 thanh ghi 16 bit (một thanh để
chứa địa chỉ cơ sở, một thanh để chứa độ lệch) và từ nội dung của cặp thanh
ghi đó tạo ra địa chỉ vật lý theo công thức sau:

Địa chỉ vật lý = (thanh ghi đoạn)*16+(thanh ghi lệch)

Việc dùng 2 thanh ghi để ghi nhớ thông tin về địa chỉ thực chất tạo ra
một loại địa chỉ gọi là địa chỉ logic và được ký hiệu như sau:

(thanh ghi đoạn) : (thanh ghi lệch) hay segment : offset.

Địa chỉ kiểu segment : offset là địa chỉ logic vì nó tồn tại dưới dạng giá
trị của các thanh ghi cụ thể bên trong CPU và khi cần thiết truy xuất ô nhớ
nào đó thì nó phải được đổi ra địa chỉ vật lý để rồi được đưa lên bus địa chỉ.
Việc chuyển đổi này do bộ tạo địa chỉ thực hiện (phần tử  trên hình 2.1).

29
Vấn để ở đây khi sử dụng chương trình để điều khiển việc truy xuất một ô
nhớ nào đó thì phải dùng địa chỉ logic và bộ  sẽ tính ra địa chỉ vật lý của ô
nhớ đó. Do vậy công việc của người lập trình khi cần truy xuất đến một ô nhớ
có địa chỉ vật lý xác định trước, thì phải tính được ra địa chỉ logic tương ứng
để sử dụng trong chương trình. Ta có thể nhận thấy một địa chỉ vật lý có thể
được tạo từ nhiều địa chỉ logic.

Ví dụ: địa chỉ vật lý 12345h có thể được tạo ra từ nhiều địa chỉ logic:

địa chỉ segment địa chỉ offset

1000h 2345h

1200h 0345h

1004h 2305h

0300h E345h

... …

❖ Các thanh ghi đa năng

Có 4 thanh ghi đa năng 16 bit: AX, BX, CX, DX. Khi cần xử lý dữ liệu 8
bit thì mỗi thanh ghi này được chia thành các cặp thanh ghi 8 bit độc lập: AH
và AL, BH và BL, CH và CL, DH và DL (trong đó H chỉ phần cao, L chỉ
phần thấp). Mỗi thanh ghi có thể được dùng đa năng để chứa các loại dữ liệu
khác nhau, nhưng cũng có những công việc đặc biệt thì nhất định chỉ thao tác
với một vài thanh ghi nào đó và chính vì vậy các thanh ghi thường được gán
cho những cái tên đặc biệt có ý nghĩa.

- AX (Accumulator –Acc): thanh chứa, các kết quả của các thao tác
thường được chứa ở đây (kết quả của phép nhân, chia). Nếu kết quả là 8 bit
thì AL đóng vai trò là Acc.

- BX (Base): thanh ghi cơ sở, thường chứa địa chỉ cơ sở của bảng dùng
trong lệnh XLAT.

30
- CX (Count): bộ đến, thường được dùng để chứa số lần lặp lại trong
lệnh LOOP, còn CL thường chứa số lần dịch hoặc quay trong các lệnh dịch
quay thanh ghi.

- DX (Data): thanh ghi dữ liệu, DX cùng với AX tham gia vào các thao
tác của phép nhân hoặc chia các ố 16 bit. Ngoài ra DX còn dùng để chứa địa
chỉ của các cổng trong các lệnh vào/ra dữ liệu trực tiếp (IN/OUT)

❖ Các thanh ghi con trỏ và chỉ số

Có 3 thanh ghi con trỏ là: SP, BP và IP; hai thanh ghi chỉ số: DI và SI.
Các thanh ghi này 16 bit, được dùng như các thanh ghi đa năng, nhưng
thường được ngầm định để chứa địa chỉ offset cho các đoạn tương ứng.

- IP (Instruction Pointer): con trỏ lệnh, IP luôn chứa địa chỉ offset của ô
nhớ chứa lệnh tiếp theo cần thực hiện nằm trong đoạn Code.

- BP (Base Pointer): con trỏ cơ sở, BP luôn chứa địa chỉ offset của ô nhớ
nằm trong đoạn Stack.

- SP (Stack Pointer): con trỏ ngăn xếp, SP luôn chứa địa chỉ offset của
đỉnh ngăn xếp.

- SI (Source Index ): thanh ghi chỉ số nguồn; DI (Destination index):


thanh ghi chỉ số đích. Được dùng để chứa địa chỉ offset của mảng nhớ nguồn
và đích trong các thao tác chuỗi. DS:SI ứng với phần tử thuộc chuỗi nguồn,
còn ES:DI ứng với phần tử thuộc chuỗi đích.
❖ Thanh ghi cờ.

Là thanh ghi đặc biệt của CPU (Hình 3.3). Thanh ghi cờ của 8086 là
thanh ghi 16 bit, nhưng chỉ có 9 bit được sử dụng. Mỗi bit cờ được dùng để
phản ánh một trạng thái nhất định của kết quả phép toán do ALU thực hiện
hoặc một trạng thái hoạt động của EU. Dựa vào các cờ này người lập trình có
thể có các lệnh thích hợp tiếp theo cho bộ vi xử lý.

31
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0

x x X X O D I T S Z x A x P x C

Hình 2.2. Thanh ghi cờ của 8086

+ Cờ trạng thái: có 6 cờ trạng thái là AF, CF, SF, PF, ZF, OF: phản ánh
các trạng thái khác nhau của kết quả sau một thao tác nào đó.

- CF (Carry flag): cờ nhớ chính, CF=1 khi có nhớ hoặc mượn từ bit
MSB.

- AF (Axuxiliary flag): cờ nhớ phụ, rất có ý nghĩa khi làm việc với các số
BCD. AF=1 khi có nhớ hoặc mượn từ một số BCD thấp (4 bit thấp) sang một
số BCD cao (4 bit cao).

- SF (Sign flag): cờ dấu, SF=1 khi kết quả âm.

- PF (Parity flag): cờ chẵn lẻ, PF =1 khi số các số 1 ở kết quả phép toán
là chẵn

- ZF (Zero flag): cờ Zero, ZF=1 khi kết quả phép toán bằng 0

- OF (Over flag): cờ tràn, OF=1 khi kết quả là một số bù 2 vượt ra ngoài
giới hạn biểu diễn dành cho nó.

+ Cờ điều khiển: có 3 cờ điều khiển là IF, TF, DF. Các cờ này được lập
xóa bằng các lệnh riêng

- IF (Interrupt flag): cờ ngắt, khi IF=1 CPU cho phép các yêu cầu ngắt
(che được) được tác động.

- TF (Trap flag): cờ bẫy, TF=1 thì CPU sẽ ở chế độ chạy từng lệnh, giúp
cho việc hiệu chỉnh và gỡ rối chương trình.

- DF (Direction flag): cờ hướng, DF=1 khi CPU làm việc với chuỗi ký tự
theo thứ tự từ phải qua trái (vì vậy DF chính là cờ lùi).

2.2. Tập lệnh của bộ vi xử lý 8086

2.2.1. Khái niệm về lệnh và cách mã hóa lệnh

32
Lệnh của bộ vi xử lý được ghi bằng các ký tự dưới dạng gợi nhớ để
người sử dụng dễ nhận biết. Đối với bản thân bộ vi xử lý thì lệnh cho nó được
mã hoá bằng các số 0 và 1 (mã máy), vì đó là dạng biểu diễn thông tin duy
nhất mà máy hiểu được. Vì lệnh cho bộ vi xử lý được cho dưới dạng mã nên
khi nhận lệnh, bộ vi xử lý phải tiến hành giải mã lệnh rồi sau đó mới thực
hiện lệnh. Việc hiểu rõ cách mã hoá lệnh bằng số hệ 2 cho bộ vi xử lý sẽ có
lợi khi dịch “ bằng tay” một lệnh gợi nhớ khi làm việc với các “kit” vi xử lý.

Một lệnh của bộ vi xử lý 8086 có độ dài từ 1 đến 6 byte tùy theo mỗi
lệnh, nhưng được đánh số thứ tự từ 1 đến 6. ý nghĩa của các byte lệnh trên
Hình 2.3.

Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6

Mã lệnh Trợ giúp Dữ liệu Dữ liệu Dữ liệu Dữ liệu

Hình 2.3. Dạng thức tổng quát của lệnh của 8086

- Byte 1: chứa mã lệnh, xác định thao tác của lệnh. Đây là byte lệnh bắt
buộc đối với tất cả các lệnh.

- Byte 2: Nếu lệnh cần phải xác định toán hạng thì có mặt byte 2 để giúp
byte 1 xác định toán hạng cho lệnh.

- Các byte còn lại byte 3, 4, 5, 6: để chứa dữ liệu cho lệnh. Tuỳ theo dữ
liệu cho trong lệnh mà sẽ xuất hiện các byte khi dịch. Nếu lệnh cần dữ liệu là
byte, thì có mặt byte 3. Nếu là Word hay hằng địa chỉ, thì sẽ có thêm byte 3
và 4. Còn nếu cần phải thay đổi hằng địa chỉ cả offset và cả segment, thì cả
byte 3, 4, 5, 6 đều có mặt.

Để hiểu rõ hơn dạng thức của lệnh ta xét lệnh MOV với các toán hạng là
các thanh ghi dữ liệu và ô nhớ (Hình 2.4).

33
Byte 1 Byte 2 Byte 3 Byte 4

1 0 0 0 1 0 DispL DispH
Opcode D W mod REG M/R Dữ liệu cho trong lệnh

Địa chỉ trực tiếp Địa chỉ trực tiếp


phần thấp phần cao

Hình 2.4. Dạng thức của lệnh MOV của 8086

Để mã hoá lệnh MOV cần ít nhất là 2 byte là byte 1 và byte 2. Các byte 3
và byte 4 cần thiết với những lệnh có dữ liệu hay địa chỉ được cho trong lệnh.
Trong đó:

- Mã lệnh (Opcode) gồm 6 bit đầu. Với lệnh MOV để di chuyển dữ liệu
giữa thanh ghi  thanh ghi hoặc thanh ghi  ô nhớ, mã lệnh là 100010 (Đối
với các thanh ghi đoạn thì điều này lại khác).

Trong các thao tác chuyển dữ liệu, một toán hạng bắt buộc phải là thanh
ghi. Bộ vi xử lý dùng 2 hoặc 3 bit để mã hoá các thanh ghi như ở Bảng 2.1.

Bảng 2.1. Các bit mã hoá cho các thanh ghi trong 8086
Thanh ghi Thanh ghi đoạn Mã

W=1 W=0 CS 01
AX AL 000 DS 11
BX BL 011 ES 00
CX CL 001 SS 10
DX DL 101
SP BH 100
DI AH 111
BP CH 101
SI DH 110

34
- Bit D dùng để chỉ hướng đi của dữ liệu. Nếu D=1, dữ liệu đi đến
thanh ghi cho bởi 3 bit của REG, D=0 thì dữ liệu đi từ thanh ghi cho
bởi 3 bit của REG

- Bit W chỉ kích thước toán hạng. W=0 toán hạng là byte, W=1
toán hạng là word.

- Giá trị của 2 bit mod kết hợp với 3 bit R/M tạo ra 5 bit dùng để
chỉ ra chế độ địa chỉ cho các toán hạng của lệnh cho trong Bảng 2.2.

Bảng 2.2. Phối hợp MOD và R/M để tạo ra các chế độ địa chỉ
MOD 00 01 10 11
R/M W=0 W=1
000 [BX]+[SI] [BX]+[SI]+d8 [BX]+[SI]+d16 AL AX
001 [BX]+[DI] [BX]+[DI]+d8 [BX]+[DI]+d16 CL CX
010 [BP]+[SI] [BP]+[SI]+d8 [BP]+[SI]+d16 DL DX
011 [BP]+[DI] [BP]+[DI]+d8 [BP]+[DI]+d16 BL BX
100 [SI] [SI]+d8 [SI]+d16 AH SP
101 [DI] [DI]+d8 [DI]+d16 CH BP
110 d16 [BP]+d8 [BP]+d16 DH SI
(địa chỉ trực tiếp)
111 [BX] [BX]+d8 [BX]+d16 BH DI

Ví dụ 1: Xét lệnh MOV AL, BL

1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1

Mã hoá AL

Opcode
BL
Chuyển tới thanh ghi

Chuyển 1 byte

35
Ví dụ 2: Xét lệnh MOV AL, [BX]

1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1

Mã hoá CL

Opcode
[BX]
Chuyển tới thanh ghi

Chuyển 1 byte

Ví dụ 3: Xét lệnh MOV [BX], CL

1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1

Mã hoá CL

Opcode
[BX]
Chuyển từ thanh ghi

Chuyển 1 byte

Ví dụ 4: Xét lệnh MOV DX, [013Ch]

Byte 1 Byte 2 Byte 3 Byte 4

1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1

Mã hoá DX
Địa chỉ trực tiếp Địa chỉ trực tiếp
Opcode phần thấp (3Ch) phần cao (01h)

d16 (Địa chỉ trực tiếp)


Chuyển tới thanh ghi

Chuyển 1 Word

2.2.2. Các chế độ địa chỉ của 8086

Chế độ địa chỉ (addressing mode) là cách để CPU tìm thấy toán hạng cho
các lệnh của nó khi hoạt động. Một bộ vi xử lý có thể có nhiều chế độ địa chỉ.

36
Các chế độ địa chỉ này được xác định ngay từ khi chế tạo ra bộ vi xử lý và sau
này không thể thay đổi được. Bộ vi xử lý 8086 có các chế độ địa chỉ sau:

2.2.2.1. Chế độ địa chỉ thanh ghi

Các toán hạng là các thanh ghi bên trong CPU và thao tác được thực hiện
ngay trong CPU, vì vậy tốc độ thực hiện lệnh cao.

Ví dụ:

MOV CL,BL ; chuyển nội dung của BL vào CL

ADD AL, DL ; Cộng nội dung của AL và DL rồi đưa kết quả vào AL.

2.2.2.2. Chế độ địa chỉ tức thì

Toán hạng đích (dest) là thanh ghi hay ô nhớ, còn toán hạng nguồn
(source) là một hằng số được cho trong lệnh. Ta có thể dùng chế độ này để
nạp dữ liệu cần thao tác vào bất kỳ thanh ghi nào (trừ các thanh ghi đoạn và
thanh ghi cờ) và bất kỳ ô nhớ nào nằm trong đoạn dữ liệu.

Ví dụ:

MOV CL, 100 ; chuyển 100 vào thanh ghi CL

MOV AX, A000h ; chuyển A000h vào AX

MOV DS, AX ; chuyển nội dung của AX, vào DS

; (không chuyển được trực tiếp A000h vào DS)

MOV [BX], 5 ; chuyển 5 vào ô nhớ có địa chỉ DS:BX

2.2.2.3. Chế độ địa chỉ trực tiếp

Trong chế độ địa chỉ này một toán hạng là ô nhớ mà địa chỉ offset của nó
là một hằng địa chỉ 16 bit cho trực tiếp trong lệnh.

Ví dụ:

MOV AL, [1234h]

MOV [4320h], CX

37
2.2.2.4. Chế độ địa chỉ gián tiếp qua thanh ghi

Trong chế độ địa chỉ này một toán hạng là một thanh ghi được sử dụng
để chứa địa chỉ offset của ô nhớ chứa dữ liệu, còn toán hạng kia chỉ có thể là
thanh ghi, không được là ô nhớ.

Ví dụ:

MOV AX, [BX]

2.2.2.5. Chế độ địa chỉ tương đối cơ sở

Trong chế độ địa chỉ này, các thanh ghi cơ sở như BX và BP và các hằng
số biểu diễn các giá trị dịch chuyển (displacement value) được dùng để tính
địa chỉ hiệu dụng của toán hạng trong các vùng nhớ Data và Stack. Sự có mặt
của các giá trị dịch chuyển xác định tính tương đối (so với cơ sở) của địa chỉ.

Ví dụ:

MOV CX, [BX]+10

hay MOV CX, [BX+10]

2.2.2.6. Chế độ địa chỉ tương đối chỉ số.

Trong chế độ địa chỉ này, địa chỉ offset của ô nhớ được xác định bằng
cách cộng nội dung thanh ghi chỉ số (SI hoặc DI) cho trong lệnh với giá trị
dịch chuyển.

Ví dụ

MOV AX, [SI]+10

Hay MOV AX, [SI+10]

2.2.2.7. Chế độ địa chỉ tương đối chỉ số cơ sở

Kết hợp hai chế độ địa chỉ chỉ số và cơ sở ta có chế độ địa chỉ chỉ số cố
cơ sở. Trong chế độ địa chỉ này ta dùng cả thanh ghi cơ sở và thanh chỉ số để
tính địa chỉ của toán hạng. Nếu ta dùng thêm cả thành phần biểu diễn sự dịch

38
chuyển của địa chỉ thì ta có chế độ địa chỉ phức hợp nhất. Chế độ địa chỉ này
rất phù hợp cho việc địa chỉ hóa các mảng 2 chiều.

Ví dụ

MOV AX, [BX][SI]+8

Hay MOV AX, [BX+SI+8] ; thanh ghi đoạn là DS

MOV CL, [BP+DI+5] ; thanh ghi đoạn là SS

Phương pháp bỏ ngầm định thanh ghi đoạn

Đó là những thanh ghi đoạn đã được ngầm định đối với những offset
được cho trong lệnh khi xác định địa chỉ ô nhớ, được tổng kết trong Bảng 2.3.

Bảng 2.3. Các thanh ghi đoạn ngầm định trong các chế độ địa chỉ
Chế độ địa chỉ Toán hạng Thanh ghi ngầm định
Trực tiếp [offset] DS
Gián tiếp qua thanh ghi [BX] DS
[SI] DS
[DI] DS
Tương đối cơ sở [BX]+Disp DS
[BP]+Disp SS
Tương đối chỉ số [SI]+Disp DS
[DI]+Disp DS
Tương đối chỉ số cơ sở [BX]+[DI]+Disp DS
[BX]+[SI]+Disp DS
[BP]+[DI]+Disp SS
[BP]+[SI]+Disp SS

2.2.3. Mô tả tập lệnh của 8086

Tập lệnh của bộ vi xử lý 8086 được chia thành các nhóm sau:

- Các lệnh chuyển dữ liệu

- Các lệnh số học

39
- Các lệnh thao tác bit

- Các lệnh làm việc với sâu ký tự

- Các lệnh nhảy

- Các lệnh điều khiển

Chú ý: Tất cả các lệnh thao tác với 2 toán hạng của 8086 thì các toán
hạng phải có cùng độ dài dữ liệu.

2.2.3.1. Nhóm lệnh chuyển dữ liệu:

MOV

+ Cú pháp: MOV dest, source

+ Chức năng: chuyển giá trị từ source vào dest

Trong đó dest là một thanh ghi (dữ liệu, đoạn) hay một ô nhớ được xác
định theo các chế độ địa chỉ, còn nguồn có thể là một thanh ghi, ô nhớ hay
một hằng số. Đích và nguồn không thể đồng thời là 2 ô nhớ.

Ví dụ:

MOV AL, 0Ah ; AL  0Ah

MOV CL, BL ; CL  BL

MOV DL, [BX] ; DL  (DS:BX)

MOV AL, Table[BX] ; AL  (DS:Table+BX)

Chú ý:

- Data chỉ nằm ở phía source

- Không thể chuyển dữ liệu trực tiếp giữa 2 ô nhớ

- Không thể nạp trực tiếp một hằng số vào thanh ghi segment mà phải
dùng thanh ghi đệm.

- Không thể dùng CS là đích cho lệnh MOV

40
LEA

+ Cú pháp: LEA reg, mem

+ Chức năng: Đưa địa chỉ offset của ô nhớ (mem) vào thanh ghi đích (reg)

Ví dụ: nếu B là biến nhớ đã được khai báo thì lệnh LEA BX, B sẽ được
nạp địa chỉ offset B vào thanh ghi BX.

LDS

+ Cú pháp: LDS reg, mem

+ Chức năng: chuyển giá trị của 1 word từ một vùng nhớ vào thanh ghi
đích và giá trị của word tiếp theo sau của vùng nhớ vào thanh ghi DS

Ví dụ: giả sử B là 1 biến word, khi đó dùng:

LDS BX, B ; tương đương với việc dùng 3 lệnh sau

MOV BX, B

MOV AX, B+2

MOV DS, AX

LES

+ Cú pháp: LES reg, mem

+ Chức năng: chuyển giá trị của một word từ một vùng nhớ vào thanh
ghi đích và giá trị của word tiếp theo sau của vùng nhớ vào thanh ghi ES.

XCHG

+ Cú pháp: XCHG dest, source


+ Chức năng: chuyển cho nhau giá trị giữa source và dest

Các toán hạng có thể là thanh ghi dữ liệu 8 hay 16 bit (không sử dụng
thanh ghi đoạn) hoặc là ô nhớ được xác định theo các chế độ địa chỉ. Cả 2
toán hạng không đồng thời là 2 ô nhớ.

41
XLAT

+ Cú pháp: XLAT
+ Chức năng: chuyển giá trị 8 bit từ ô nhớ vào thanh ghi AL. Địa chỉ của
ô nhớ là DS:BX+AL

Chú ý: lệnh này thường được dùng cho trường hợp giá trị trong thanh
ghi BX trỏ đến đầu một bảng và giá trị trong thanh ghi AL là chỉ số của từng
thành phần. Để hiểu rõ hơn ta xét mô hình trước và sau khi thực hiện lệnh
XLAT (Hình 2.5)

30h 00100h 30h 00100h


AL 08h . AL 38h .
. .
. . . .
. . . .
 38h 00108h 38h 00108h
39h 00109h 39h 00109h

BX 0100h BX 0100h

(a) Trước khi thực hiện (b) Sau khi thực hiện

Hình 2.5. Sơ đồ thực hiện lệnh XLAT

PUSH

+ Cú pháp: PUSH source


+ Chức năng: Cất giá trị source vào đỉnh ngăn xếp

SP  SP-2

(SP)  source

Trong đó, source là thanh ghi dữ liệu, thanh ghi đoạn (trừ CS) hoặc ô
nhớ 16 bit tìm theo các chế độ địa chỉ khác nhau.

Ví dụ:

PUSH BX ; BX được cất vào ngăn xếp

PUSH [BX] ; cất 2 byte ô nhớ DS:BX và DS:BX+1 vào ngăn xếp.

42
PUSHF

+ Cú pháp: PUSHF
+ Chức năng: cất giá trị thanh ghi cờ vào đỉnh ngăn xếp.

SP  SP-2

(SP)  FR

POP

+ Cú pháp: POP dest


+ Chức năng: chuyển giá trị từ đỉnh ngăn xếp vào dest.

dest  (SP)

SP=SP+2

Trong đó, dest là thanh ghi dữ liệu, thanh ghi đoạn (trừ CS) hoặc ô nhớ
16 bit tìm theo các chế độ địa chỉ khác nhau.

POPF

+ Cú pháp: POPF
+ Chức năng:

IN FR  (SP)

SP  SP+2

IN

+ Cú pháp: IN Acc, port

Hoặc IN Acc, DX

+ Chức năng: Đọc giá trị (8 bit hoặc 16 bit) từ cổng có địa chỉ là port
hoặc địa chỉ là nội dung thanhghi DX vào Acc

Acc  (port)

Acc  (DX)

43
Trong đó, Acc là AL nếu lệnh thao tác với cổng vào 8 bit, còn Acc là AX
nếu lệnh thao tác với cổng vào 16 bit.

Chú ý: việc sử dụng lệnh liên quan đến phần cứng. Nếu phần cứng tổ
chức sử dụng 8 bit địa chỉ (A0-A7) để địa chỉ cổng, thì chương trình sử dụng
địa chỉ trực tiếp (port) là một hằng địa chỉ cho trong lệnh.

Ví dụ: IN AL, 01h

- Nếu phần cứng tổ chức cổng có địa chỉ 16 bit địa (A0-A15) thì chương
trình sử dụng địa chỉ gián tiếp là nội dung của thanh ghi DX

Ví dụ: MOV DX, A000h

IN AL, DX

OUT

+ Cú pháp: OUT port, Acc

Hoặc OUT DX, Acc

+ Chức năng: chuyển giá trị (8 bit hoặc 16 bit) từ thanh ghi AL hoặc AX
ra cổng có địa chỉ là port hoặc địa chỉ là nội dung của DX

Chú ý: việc sử dụng lệnh liên quan đến phần cứng. Nếu phần cứng tổ
chức sử dụng 8 bit địa chỉ (A0-A7) để địa chỉ cổng, thì chương trình sử dụng
địa chỉ trực tiếp (port) là một hằng địa chỉ cho trong lệnh.

Các lệnh chuyển dữ liệu không ảnh hưởng tới các bit cờ, trừ các lệnh thao
tác trực tiếp với thanh ghi cờ.

2.2.3.2. Nhóm các lệnh số học

ADD

+ Cú pháp: ADD dest, source


+ Chức năng: dest  dest+source

44
Trong đó, toán hạng dest và source có thể tìm được theo các chế độ địa
chỉ khác nhau, nhưng phải chứa dữ liệu có cùng độ dài, không được phép
đồng thời là 2 ô nhớ và không là thanh ghi đoạn.

- Ảnh hưởng đến các cờ: AF, CF, OF, PF, SF, ZF

ADC

+ Cú pháp: ADC dest, source


+ Chức năng: dest  dest+source+CF

(toán hạng dest và source giống trong lệnh ADD)

- Ảnh hưởng đến các cờ: AF, CF, OF, PF, SF, ZF

AAA

+ Cú pháp: AAA
+ Chức năng: hiệu chỉnh kết quả sau khi cộng 2 byte ra dạng ASCII.
Lệnh này được thực hiện để hiệu chỉnh kết quả nằm ở thanh ghi AL sau khi
thực hiện lệnh cộng:

- Nếu giá trị của 4 bit thấp của thanh ghi AL>9 hoặc giá trị của cờ AF=1
thì tiến hành cộng 06h vào AL, sau đó cộng 1 vào giá trị của thanh ghi AH và
dựng cờ AF lên 1. Tiếp đến đưa 4 bit cao của thanh ghi AL xuống 0.

- Ngược lại, nếu giá trị của 4 bit thấp của thanh ghi AL  9 và giá trị của
cờ AF=0 thì chỉ cần tiến hành việc đưa 4 bit cao của thanh ghi AL xuống 0.

Ví dụ: MOV AL, 30h ; 30h mã ASCII của 0

MOV BL, 39h ; 39h mã ASCII của 9

ADD AL, BL ; AL =69h

AAA ; thu được AL=09

DAA

+ Cú pháp: DAA

45
+ Chức năng: hiệu chỉnh nội dung của thanh ghi AL sau khi thực hiện
phép cộng hai số BCD. Cách hiệu chỉnh được tiến hành như sau:

- Nếu giá trị của 4 bit thấp của thanh ghi AL > 9 hoặc giá trị của cờ
AF=1 thì tiến hành cộng 06h vào AL và dựng cờ AF lên 1.

- Nếu giá trị của 4 bit cao của thanh ghi AL>9 hoặc cờ CF=1 thì tiến
hành cộng 60h vào AL và dựng cờ CF=1.

Ví dụ:

MOV AL, 28h ; AL=28h

MOV BL, 68h ; BL=68h

ADD AL, BL ; AL=90h và AF=1

DAA ; AL=AL+06h, vì AF=1 và ta có AL=96 là kết quả đúng

SUB

+ Cú pháp: SUB dest, source


+ Chức năng: destdest-source

Trong đó, toán hạng dest và source có thể tìm được theo các chế độ địa
chỉ khác nhau, nhưng phải chứa dữ liệu có cùng độ dài, không được phép
đồng thời là 2 ô nhớ và không là thanh ghi đoạn.

- Ảnh hưởng đến các cờ: AF, CF, OF, PF, SF, ZF (AF và PF chỉ liên
quan đến 8 bit thấp)

SBB

+ Cú pháp: SBB dest, source


+ Chức năng: dest  dest - source - CF
- Ảnh hưởng đến các cờ: AF, CF, OF, PF, SF, ZF (AF và PF chỉ liên
quan đến 8 bit thấp).

46
AAS

+ Cú pháp: AAS
+ Chức năng: hiệu chỉnh kết quả sau khi trừ 2 byte dạng ASCII. Lệnh
này được thực hiện để hiệu chỉnh kết quả ở thanh ghi AL sau khi thực hiện
lệnh trừ.

- Nếu giá trị của 4 bit thấp của thanh ghi AL>9 hoặc giá trị của cờ AF=1
thì tiến hành trừ 06h vào AL, sau đó trừ giá trị của thanh ghi AH đi 1 và dựng
cờ AF lên 1. Tiếp đến đưa 4 bit cao của thanh ghi AL xuống 0 và đặt giá trị
cờ CF=giá trị cờ AF.

- Ngược lại, nếu giá trị của 4 bit thấp của thanh ghi AL  9 và giá trị của
cờ AF=0 thì chỉ cần tiến hành việc đưa 4 bit cao của thanh ghi AL xuống 0 và
đặt giá trị của cờ CF=giá trị cờ AF.

- Ảnh hưởng đến các cờ: AF, CF.


- Không xác định: OF, PF, SF, ZF

Ví dụ:

Giả sử AX=0438h, sau khi thực hiện 2 lệnh sau:

SUB AL, 35h

AAS ; kết quả của AX=0303h

DAS

+ Cú pháp: DAS
+ Chức năng: hiệu chỉnh nội dung của thanh ghi AL về dạng BCD sau
khi thực hiện phép trừ. Lệnh này chỉ có thể được sử dụng sau lệnh trừ 2 số
dạng BCD.

- Nếu 4 bit thấp của AL>9 hoặc AF=1 thì AL  AL-06h

- Nếu 4 bit cao của AL>9 hoặc CF=1 thì AL  AL-60h

- Ảnh hưởng đến các cờ: AF, CF, PF, SF, ZF

47
- Không xác định : OF

INC

+ Cú pháp: INC dest


+ Chức năng: dest  dest+1

Trong đó, dest có thể là thanh ghi công dụng chung hoặc ô nhớ được tìm
trong các chế độ địa chỉ bộ nhớ.

Chú ý: nếu dest=FFh (hoặc FFFFh) thì dest+1=00h (hoặc 0000h) mà


không ảnh hưởng tới cờ CF.

- Ảnh hưởng đến các cờ: AF, OF, PF, SF, ZF


- Không tác động cờ: CF

DEC

+ Cú pháp: DEC dest, source


+ Chức năng: dest  dest-1

Trong đó, dest có thể là thanh ghi công dụng chung hoặc ô nhớ được tìm
trong các chế độ địa chỉ bộ nhớ.

Chú ý: nếu dest=00h (hoặc 0000h) thì dest-1=FFh (hoặc FFFFh) mà


không ảnh hưởng tới cờ CF.

- Ảnh hưởng đến các cờ: AF, OF, PF, SF, ZF


- Không tác động cờ: CF

NEG

+ Cú pháp: NEG dest


+ Chức năng: lấy bù 2 giá trị của toán hạng dest. Kết quả đưa vào toán
hạng dest: dest  -(dest)

Trong đó, dest có thể là thanh ghi công dụng chung hoặc ô nhớ được tìm
trong các chế độ địa chỉ bộ nhớ.

48
Chú ý: nếu dest là -128 hoặc -32768 thì sau khi thực hiện, kết quả không
đổi, tuy nhiên OF=1 báo kết quả tràn.

- Ảnh hưởng đến các cờ: AF, CF, OF, PF, SF, ZF

CMP

+ Cú pháp: CMP dest, source


+ Chức năng: So sánh giá trị của toán hạng dest với toán hạng source.
Sau khi so sánh các toán hạng không bị thay đổi. Lệnh này thường được dùng
để tạo cờ cho các lệnh nhảy có điều kiện, nếu:

CF ZF

Dest=source 0 1

Dest>source 0 0

Dest<source 1 0

Trong đó, toán hạng dest và source có thể tìm được theo các chế độ địa
chỉ khác nhau. Nhưng phải chứa dữ liệu có cùng độ dài và không được phép
đồng thời là 2 ô nhớ.

MUL

+ Cú pháp: MUL source


+ Chức năng: Nhân nội dung của thanh ghi AX hoặc AL với nội dung
toán hạng source. Giá trị của 2 toán hạng đều là không dấu. Kết quả sẽ được
cất như sau:

- Nếu toán hạng source là 8 bit thì kết quả đặt trong thanh ghi AX

- Nếu toán hạng source là 16 bit thì kết quả đặt trong cặp thanh ghi
DXAX

Trong đó, source là số nhân và có thể tìm được theo các chế độ địa chỉ
khác nhau.

49
Chú ý: nếu byte cao (hoặc 16 bit cao) của 16 (hoặc 32) bit kết quả chứa
0 thì CF=OF=0. Như vậy các cờ CF và OF sẽ báo cho ta biết có thể bỏ đi bao
nhiêu số 0 trong kết quả

- Ảnh hưởng đến các cờ: CF, OF


- Không xác định: AF, PF, SF, ZF

Ví dụ:

MOV AL,1

MOV BL, 128

MUL BL ; kết quả đặt trong AX và AX=00000000 10000000

; khi đó CF=OF=0

IMUL

+ Cú pháp: IMUL source


+ Chức năng: Nhân nội dung của thanh ghi AX hoặc AL với nội dung
toán hạng source. Giá trị của 2 toán hạng đều là dạng có dấu. Kết quả sẽ được
cất như sau:

- Nếu toán hạng source là 8 bit thì kết quả đặt trong thanh ghi AX

- Nếu toán hạng source là 16 bit thì kết quả đặt trong cặp thanh ghi
DXAX

Trong đó, source là số nhân và có thể tìm được theo các chế độ địa chỉ
khác nhau.

Chú ý: nếu tích được thu nhỏ, không đủ lấp đầy hết được các chỗ dành
cho nó thì các bit không dùng được thay bằng bit dấu.

- Nếu byte cao (hoặc 16 bit cao) của 16 (hoặc 32) bit kết quả chứa các
giá trị của dấu thì CF=OF=0.

- Nếu byte cao (hoặc 16 bit cao) của 16 (hoặc 32) bit kết quả chứa một
phần kết quả thì CF=OF=1

50
Như vây, CF, OF sẽ báo cho ta biết kết quả cần độ dài thực chất là bao
nhiêu

- Ảnh hưởng đến các cờ: CF, OF


- Không xác định: AF, PF, SF, ZF

Ví dụ 1:

Nếu AL=1, BL=-128 thì

IMUL BL ; có kết quả là: AX=11111111 10000000

; khi đó CF=OF=0

ví dụ 2:

Nếu AL=2, BL=-128 thì

IMUL BL ; có kết quả là: AX=11111111 00000000

; khi đó CF=OF=1

AAM

+ Cú pháp: AAM
+ Chức năng: lệnh này dùng để đổi một số hệ 2, là tích của 2 số BCD
không gói có trong AL sang số BCD không gói để tại AX. Cách đổi, tiến hành
chia giá trị của AL cho 0Ah. Cất thương vào thanh ghi AH và phần dư vào
thanh ghi AL
- Ảnh hưởng đến các cờ: PF, SF, ZF
- Không xác định: AF, CF, OF

Ví dụ: giả sử AL=07h, BL=09h thì sau khi thực hiện

MUL BL ; kết quả sau phép nhân AX=3Fh

AAM ; kết quả là AX=0603h

DIV

+ Cú pháp: DIV source

51
+ Chức năng: chia không dấu giữa giá trị của thanh ghi AX hoặc DXAX
cho nội dung của toán hạng source. Kết quả được cất như sau:

- Nếu toán hạng bị chia là 16 bit thì thương sẽ đặt trong thanh ghi AL,
phần dư đặt trong AH

- Nếu toán hạng bị chia là 32 bit thì thương sẽ đặt trong thanh ghi AX,
phần dư đặt trong DX

Trong đó, source là số chia và có thể tìm được theo các chế độ địa chỉ
khác nhau.

- Không xác định: AF, CF, OF, PF, SF, ZF

IDIV

+ Cú pháp: IDIV source


+ Chức năng: chia có dấu giữa giá trị của thanh ghi AX hoặc DXAX cho
nôị dung của toán hạng source. Kết quả được cất như sau:

- Nếu toán hạng bị chia là 16 bit thì thương sẽ đặt trong thanh ghi AL,
phần dư đặt trong AH

- Nếu toán hạng bị chia là 32 bit thì thương sẽ đặt trong thanh ghi AX,
phần dư đặt trong DX

Trong đó, source là số chia và có thể tìm được theo các chế độ địa chỉ
khác nhau.

- Không xác định: AF, CF, OF, PF, SF, ZF

AAD

+ Cú pháp: AAD
+ Chức năng: Lệnh này đổi 2 số BCD không gói ở AH và AL sang số hệ
2 tương đương để tại AL. Việc này phải thực hiện trước khi làm phép chia
một số BCD không gói (gồm 2 chữ số) để trong AX cho một số BCD không

52
gói khác. Kết quả và số dư cũng là các số BCD không gói. Thuật toán thực
hiện việc đổi như sau:

- Nhân nội dung của AH với 0Ah

- Cộng nội dung của thanh ghi AH với AL

- Đặt AH=00h

- Không xác định: tất cả các cờ

Ví dụ: Giả sử AX=0605h, BL=08h khi đó:

AAD ; sau khi chỉnh AX=41h

DIV BL ; sau khi chia được thương AL=08h, số dư AH=01h

CBW

+ Cú pháp: CBW
+ Chức năng: Khai triển phần dấu của thanh ghi AL sang thanh ghi AH
khi chuyển 1 số có dấu 8 bit sang số có dấu 16 bit. Thuật toán của lệnh này
như sau:

- Nếu bit cao nhất (bit dấu) của AL là 1 (biểu diễn dấu âm) thì đặt giá trị
của AH=FFh

- Ngược lại nếu bit cao nhất của AL là 0 thì đặt giá trị của AH=00h

- Không ảnh hưởng tới các cờ

CWD

+ Cúpháp: CWD
+ Chức năng: Khai triển phần dấu của thanh ghi AX sang thanh ghi DX
khi chuyển một số dạng có dấu 16 bit sang số có dấu dạng 32 bit

- Nếu bit cao nhất (bit dấu) của AX là 1 (biểu diễn dấu âm) thì đặt
giá trị của DX=FFFFh

53
- Ngược lại nếu bit cao nhất của AX là 0 thì đặt giá trị của
DX=0000h

- Không ảnh hưởng tới các cờ

2.2.3.3. Nhóm lệnh thao tác bit

NOT

+ Cú pháp: NOT dest


( )
+ Chức năng: dest  dest

Trong đó, dest có thể tìm được theo các chế độ địa chỉ khác nhau.

- Không tác động đến các cờ.

AND

+ Cú pháp: AND dest, source


+ Chức năng: destdest AND source

Trong đó, toán hạng dest và source có thể tìm được theo các chế độ địa
chỉ khác nhau, nhưng phải chứa dữ liệu cùng độ dài, không được phép đồng
thời là 2 ô nhớ, và không được là thanh ghi đoạn.

- Xóa cờ : CF, OF
- Ảnh hưởng đến các cờ: PF, SF, ZF (PF chỉ có nghĩa khi toán hạng 8 bit)
- không xác định: AF

Ví dụ

MOV AL, 35h

AND AL, 0Fh ; AL=05h (che 4 bit cao của AL)

OR

+ Cú pháp: OR dest, source


+ Chức năng: destdest OR source

54
Trong đó, toán hạng dest và source có thể tìm được theo các chế độ địa
chỉ khác nhau, nhưng phải chứa dữ liệu cùng độ dài, không được phép đồng
thời là 2 ô nhó, và không được là thanh ghi đoạn.

- Xóa cờ : CF, OF
- Ảnh hưởng đến các cờ: PF, SF, ZF (PF chỉ có nghĩa khi toán hạng 8 bit)
- không xác định: AF

Ví dụ:

MOV AL, 03h

OR AL, 80h ; AL=83h (lập bit D7)

XOR

+ Cú pháp: XOR dest, source


+ Chức năng: destdestsource

Trong đó, toán hạng dest và source có thể tìm được theo các chế độ địa
chỉ khác nhau, nhưng phải chứa dữ liệu cùng độ dài, không được phép đồng
thời là 2 ô nhó, và không được là thanh ghi đoạn.

- Xóa cờ : CF, OF
- Ảnh hưởng đến các cờ: PF, SF, ZF (PF chỉ có nghĩa khi toán hạng 8 bit)
- không xác định: AF

Ví dụ:

XOR AL, AL ; xóa AL, cờ CF và OF

TEST

+ Cú pháp: TEST dest, source


+ Chức năng: so sánh nội dung của 2 toán hạng bằng cách thực hiện lệnh
AND giữa 2 toán hạng (nhưng nội dung của chúng không thay đổi). Kết quả
các cờ được tạo ra sẽ được dùng làm điều kiện cho các lệnh nhảy có điều kiện.

55
Trong đó, toán hạng dest và source có thể tìm được theo các chế độ địa
chỉ khác nhau, nhưng phải chứa dữ liệu có cùng độ dài, không được phép là 2
ô nhớ, và không được là thanh ghi đoạn

- Xóa cờ : CF, OF
- Ảnh hưởng đến các cờ: PF, SF, ZF (PF chỉ có nghĩa khi toán hạng 8 bit)
- không xác định: AF

SHL/SAL

+ Cú pháp: SHL/SAL dest, count


+ Chức năng: dịch trái (logic-SHL, số học-SAL) các bit của toán hạng
dest đi count lần (giá trị count được đặt trong CL)
CF MSB LSB

Trong đó, toán hạng dest có thể tìm được theo các chế độ địa chỉ khác
nhau.

Chú ý: nếu count =1 thì có thể đặt số 1 trực tiếp vào toán hạng của lệnh
như sau: SHL/SAL dest, 1

- Ảnh hưởng đến các cờ: PF, SF, ZF (PF chỉ có nghĩa khi toán hạng 8 bit)
- không xác định: AF

SHR

+ Cú pháp: SHR dest, count


+ Chức năng: dịch phải các bit của toán hạng dest đi count lần (giá trị
count được đặt trong CL)

MSB LSB CF

Trong đó, toán hạng dest có thể tìm được theo các chế độ địa chỉ khác
nhau.

56
Chú ý: nếu count =1 thì có thể đặt số 1 trực tiếp vào toán hạng của lệnh
như sau: SHR dest, 1

- Ảnh hưởng đến các cờ: PF, SF, ZF (PF chỉ có nghĩa khi toán hạng 8 bit)
- không xác định: AF

Ví dụ:

MOV AL, 10h

MOV CL, 4

SHR AL, CL ; dịch phải thanh ghi AL đi 4 bit, và AL=01h

SAR

+ Cú pháp: SAR dest, count


+ Chức năng: dịch phải các bit của dest đi count lần (giá trị của count
được đặt trong thanh ghi CL).

MSB LSB CF

Trong đó, toán hạng dest có thể tìm được theo các chế độ địa chỉ khác
nhau.

Chú ý: nếu count=1 thì có thể đặt số 1 trực tiếp vào toán hạng của lệnh
như sau: SAR dest, 1

- Ảnh hưởng đến các cờ: PF, SF, ZF (PF chỉ có nghĩa khi toán hạng 8 bit)
- không xác định: AF

ROL

+ Cú pháp: ROL dest, count


+ Chức năng: quay vòng trái các bit của toán hạng dest đi count lần (giá
trị count được đặt trong thanh ghi CL). Mỗi lần quay giá trị bit cao nhất vừa
được chuyển vào thanh ghi cờ CF đồng thời chuyển vào bit thấp nhất.

57
CF MSB LSB

Trong đó, toán hạng dest có thể tìm được theo các chế độ địa chỉ khác
nhau.

Chú ý: nếu count=1 thì có thể đặt số 1 trực tiếp vào toán hạng của lệnh
như sau: ROL dest, 1

- Ảnh hưởng đến các cờ: CF và OF

Ví dụ:

MOV AL, 0Ah

MOV CL, 8

ROL AL, CL ; sau khi thực hiện lệnh AL vẫn bằng 0Ah

ROR

+ Cú pháp: ROR dest, count


+ Chức năng: quay vòng phải các bit của toán hạng dest đi count lần (giá
trị count được đặt trong thanh ghi CL). Mỗi lần quay giá trị bit thấp nhất vừa
được chuyển vào thanh ghi cờ CF đồng thời chuyển vào bit cao nhất.
MSB LSB CF

Chú ý: nếu count=1 thì có thể đặt số 1 trực tiếp vào toán hạng của lệnh
như sau: ROR dest, 1

- Ảnh hưởng đến các cờ: CF và OF

RCL

+ Cú pháp: RCL dest, count

58
+ Chức năng: quay vòng trái thông qua cờ CF các bit của toán hạng dest
đi count lần (giá trị count được đặt trong thanh ghi CL). Sau mỗi lần quay giá
trị bit cao nhất được chuyển vào thanh ghi CF đồng thời được chuyển vào bit
thấp nhất của toán hạng.

CF MSB LSB

Trong đó, toán hạng dest có thể tìm được theo các chế độ địa chỉ khác
nhau.

Chú ý: nếu count=1 thì có thể đặt số 1 trực tiếp vào toán hạng của lệnh
như sau: RCL dest, 1

- Ảnh hưởng đến các cờ: CF và OF

RCR

+ Cú pháp: RCR dest, count


+ Chức năng: : quay vòng phải thông qua cờ CF các bit của toán hạng
dest đi count lần (giá trị count được đặt trong thanh ghi CL). Sau mỗi lần
quay giá trị bit thấp nhất được chuyển vào thanh ghi CF đồng thời được
chuyển vào bit cao nhất của toán hạng

Trong đó, toán hạng dest có thể tìm được theo các chế độ địa chỉ khác
nhau.

Chú ý: nếu count=1 thì có thể đặt số 1 trực tiếp vào toán hạng của lệnh
như sau: RCR dest, 1

- Ảnh hưởng đến các cờ: CF và OF

2.2.3.4. Nhóm các lệnh làm việc với xâu ký tự

Các lệnh trong nhóm này có thể chia thành 2 nhóm nhỏ sau:

- Nhóm lệnh di chuyển xâu ký tự

59
- Nhóm các tiền tố lặp của lệnh làm việc với xâu ký tự theo sau:

❖ Nhóm lệnh di chuyển xâu ký tự

MOVSB(W)

+ Cú pháp: MOVVB/MOVSW
+ Chức năng: Chuyển một xâu ký tự theo từng byte (từng word) từ vùng
nhớ nguồn sang vùng nhớ đích. DS:SI trỏ đến xâu ký tự nguồn và ES:DI trỏ
đến xâu ký tự đích. Sau mỗi lần chuyển một byte (hoặc một word) thì giá trị
của SI và DI tự động tăng lên 1 (hoặc 2) khi cờ hướng DF=0, hoặc giảm đi 1
(hoặc 2) khi cờ hướng DF=1.
- Không ảnh hưởng tới các cờ

CMPSB(W)

+ Cú pháp: CMPSB/CMPSW
+ Chức năng: so sánh 2 xâu ký tự theo từng byte (hay theo từng word)
nằm ở 2 vùng nhớ. DS:SI và ES:DI trỏ đến 2 xâu ký tự. Sau mỗi lần so sánh
từng byte (hoặc từng word) thì giá trị của SI và DI tự động tăng lên 1 (hoặc 2)
khi cờ hướng DF=0, hoặc giảm đi 1 (hoặc 2) khi cờ hướng DF=1.
- Ảnh hưởng đến các cờ: AF, CF, OF, PF, SF, ZF

SCASB(W)

+ Cú pháp: SCASB/ SCASW


+ Chức năng: so sánh nội dung theo từng byte (hoặc theo từng word) của
vùng nhớ được trỏ bởi ES:DI với nội dung của thanh ghi AL(AX). Sau mỗi
lần so sánh thì giá trị của DI tự động tăng lên 1 (hoặc 2) khi cờ hướng DF=0,
hoặc giảm đi 1 (hoặc 2) khi cờ hướng DF=1.
- Ảnh hưởng đến các cờ: AF, CF, OF, PF, SF, ZF

LODSB

+ Cú pháp: LODSB/ LODSW

60
+ Chức năng: chuyển nội dung theo từng byte (hoặc từng word) của
vùng nhớ được trỏ bởi DS:SI vào thanh ghi AL (hoặc AX). Sau mỗi lần
chuyển thì giá trị của SI tự động tăng lên 1(hoặc 2) khi cờ hướng DF=0, hoặc
giảm đi 1 (hoặc 2) khi cờ hướng DF=1.
- Không ảnh hưởng tới các cờ

STOSB(W)

+ Cú pháp: STOSB/STOSW
+ Chức năng: chuyển nội dung theo từng byte (hoặc từng word) của
thanh ghi AL (hoặc AX) vào vùng nhớ được trỏ bởi ES:DI. Sau mỗi lần
chuyển thì giá trị của DI tự động tăng lên 1 (hoặc 2) khi cờ hướng DF=0, hoặc
giảm đi 1 (hoặc 2) khi cờ hướng DF=1.
- Không ảnh hưởng tới các cờ

❖ Các tiền tố lặp

+ Cú pháp: REP lệnh làm việc với xâu ký tự

hoặc REPE/REPNE/REPZ/REPNZ lệnh làm việc với xâu ký tự

+ Chức năng: tiền tố lặp REP thực hiện lệnh đứng sau nó một số lần cho
đến khi CX=0. Sau mỗi lần thực hiện, nội dung thanh ghi CX giảm đi 1. Tiền
tố này thường đứng trước các lệnh CMPSB(W), SCASB(W).

Ví dụ:

MOV SI, OIBUF

MOV DI, ADDR

MOV CX, COUNT

CLD

REP MOVSB

2.2.3.5. Nhóm các lệnh nhảy

Các lệnh trong nhóm này có thể tạm chia thành 4 nhóm nhỏ:

61
- Nhóm các lệnh nhảy không điều kiện: CALL, RET, JMP
- Nhóm các lệnh nhảy có điều kiện
- Nhóm các lệnh lặp: LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ Và
JCXZ
- Nhóm các lệnh ngắt mềm: INT, INTO, IRET.

❖ Các lệnh nhảy không điều kiện

CALL và RET

+ Cú pháp: CALL nơi_đến

RET ; không có toán hạng

Trong đó, nơi_đến có thể là một nhãn, tên chương trình con, một địa chỉ,
một thanh ghi hoặc ô nhớ 16 bit.

+ Chức năng: dùng để chuyển hoạt động của bộ vi xử lý từ chương trình


chính sang chương trình con. Nếu chương trình con ở trong cùng một đoạn
mã với chương trình chính thì ta có gọi gần (near call). Nếu chương trình con
và chương trình chính nằm ở hai đoạn mã khác nhau thì ta có gọi xa (far call).
Gọi gần và gọi xa khác nhau về cách tạo ra địa chỉ trở về (return address). Địa
chỉ trở về là địa chỉ của lệnh tiếp ngay sau lệnh CALL. Khi gọi gần thì chỉ cần
cấp IP của địa chỉ trở về (vì CS không đổi), khi gọi xa thì phải cất cả CS và IP
của địa chỉ trở về. Địa chỉ trở về được tự động cất tại ngăn xếp khi bắt đầu
thực hiện lệnh gọi và được tự động lấy ra khi gặp lệnh trở về RET.

Như vậy, nếu là gọi gần (chương trình con được khai báo là NEAR):

- SP  SP-2 Và (SP)  IP

- IP  địa chỉ offset của chương trình con

- Khi gặp lệnh RET tại cuối chương trình con thì sẽ có thao tác ngược
lại: (SP) → IP và SP  SP+2

Nếu là gọi xa (chương trình con được khai báo là FAR):

62
- SP  SP-2 và (SP)  CS

- SP  SP-2 và (SP)  IP

- IP  địa chỉ offset của chương trình con

- CS  địa chỉ segment của chương trình con

- Khi gặp lệnh RET tại cuối chương trình con thì sẽ có thao tác ngược
lại:

• (SP) → IP và SP  SP+2

• (SP) → CS và SP  SP+2

JMP

+ Cú pháp: JMP nhãn

Lệnh JMP có các dạng: nhảy ngắn, nhảy gần và nhảy xa

- Nhảy ngắn: JMP SHORT nhãn ; IP  IP+dịch chuyển

(Giá trị dịch chuyển trong khoảng –128 đến 127)

- Nhảy gần: JMP NEAR nhãn ; IP  IP+dịch chuyển

(Giá trị dịch chuyển trong khoảng –32768 đến 32767)

- Nhảy xa: JMP FAR nhãn ; IP  offset nhãn và

; CS  segment nhãn

(Nhãn nằm ở đoạn khác với đọan chứa lệnh nhảy)

Chú ý: không có khai báo thì chương trình mặc định là nhảy ngắn

❖ Các lệnh nhảy có điều kiện

JE/JZ NHAN: Nhảy tới NHAN nếu 2 toán hạng trong phép so sánh
bằng nhau/ nếu cờ ZF=1

JNE/JNZ NHAN: Nhảy tới NHAN nếu 2 toán hạng trong phép so sánh
khác nhau/ nếu cờ ZF=0

63
JL/JNGE NHAN:Nhảy tới NHAN nếu giá trị toán hạng bên trái< giá trị
toán hạng bên phải của phép so sánh; giá trị cờ CF=1

JB/JNAE/JC NHAN: Nhảy tới NHAN nếu giá trị toán hạng bên trái<
giá trị toán hạng bên phải của phép so sánh; giá trị cờ SF  OF.

JLE/JNG NHAN: Nhảy tới NHAN nếu giá trị toán hạng bên trái  giá
trị toán hạng bên phải của phép so sánh; giá trị cờ CF=1 hoặc SF=1

JG/LNBE NHAN:Nhảy tới NHAN nếu giá trị toán hạng bên trái > giá
trị toán hạng bên phải của phép so sánh; giá trị cờ CF=0 và ZF=0

JGE/JNL NHAN: Nhảy tới NHAN nếu giá trị toán hạng bên trái  giá
trị toán hạng bên phải của phép so sánh; giá trị cờ SF=OF

JAE/JNB/JNC NHAN:Nhảy tới NHAN nếu giá trị toán hạng bên trái 
giá trị toán hạng bên phải của phép so sánh; giá trị cờ CF=0

JP/JPE NHAN: Nhảy tới NHAN nếu parity là chẵn; giá trị cờ PF=1

JNP/JPO NHAN: Nhảy tới NHAN nếu không có parity hoặc parity lẻ;
giá trị cờ PF=0

JO NHAN: Nhảy tới NHAN nếu tràn; giá trị cờ OF=0

JS NHAN: Nhảy tới NHAN nếu cờ dấu SF=1

JNS NHAN: Nhảy tới NHAN nếu cờ dấu SF=0

JCXZ NHAN: Nhảy tới NHAN nếu giá trị của thanh ghi CX=0

Chú ý: bước nhảy của các lệnh có điều kiện không vượt quá 128 byte.

❖ Nhóm các lệnh lặp

Thực hiện vòng lặp đến khi điều kiện thỏa mãn

LOOP NHAN: Lặp lại khối lệnh từ NHAN đến lệnh LOOP cho đến khi
giá trị của CX=0. Mỗi khi thực hiện một vòng lặp giá trị của CX tự động giảm
đi 1

64
LOOPZ/LOOPE NHAN: Lặp lại khối lệnh từ NHAN đến lệnh LOOPZ
hoặc LOOPE cho đến khi giá trị của CX=0 và cờ ZF=1. Mỗi khi thực hiện
một vòng lặp giá trị củ CX tự động giảm đi 1.

LOOPNZ/LOOPNE NHAN: Lặp lại khối lệnh từ NHAN đến lệnh


LOOPNZ hoặc LOOPNE cho đến khi giá trị củ CX  0 và cờ ZF=0. Mỗi khi
thực hiện một vòng lặp giá trị của CX tự động giảm đi 1

❖ Nhóm lệnh ngắt mềm

INT

+ Cú pháp: INT số hiệu ngắt (số dạng HEX từ 0 đến FFh)


+ Chức năng: thực hiện ngắt mềm
- Ảnh hưởng đến các cờ: OF=0, TF=0

IRET

+ Cú pháp: IRET
+ Chức năng: trở về chương trình chính sau khi thực hiện chương trình
con phục vụ ngắt
- Ảnh hưởng đến các cờ: AF, CF, OF, PF, SF, ZF
2.2.3.6. Nhóm các lệnh điều khiển

CLC

+ Cú pháp: CLC
+ Chức năng: xóa giá trị cờ CF về 0

CMC

+ Cú pháp: CMC
+ Chức năng: đảo giá trị hiện thời của cờ CF

STC

+ Cú pháp: STC
+ Chức năng: lập giá trị cờ CF lên 1

65
CLD

+ Cú pháp: CLD
+ Chức năng: xóa giá trị cờ DF về 0

STD

+ Cú pháp: STD
+ Chức năng: đưa giá trị cờ DF lên 1

CLI

+ Cú pháp: CLI
+ Chức năng: xóa giá trị cờ IF về 0. Cấm toàn bộ các ngắt che được.

STI

+ Cú pháp: STI
+ Chức năng: đưa giá trị cờ IF lên 1. Cho phép ngắt che được, được tác
động.

HLT

+ Cú pháp: HLT
+ Chức năng: dừng máy

NOP

+ Cú pháp: NOP
+ Chức năng: lệnh không thực hiện gì cả.

2.3. Lập trình hợp ngữ cho 8086

Các bộ vi xử lý chỉ làm việc với các lệnh được viết bằng ngôn ngữ máy
(dạng nhị phân) được lưu trong bộ nhớ của hệ thống vi xử lý. Các chương
trình nguồn ở các ngôn ngữ bậc cao như PASCAL, C, FORTRAN,… dễ hiểu
và dễ viết cho người lập trình, nhưng để máy thực hiện được phải được dịch
ra ngôn ngữ máy. Nhưng mỗi dòng lệnh trong chương trình nguồn có thể
được dịch ra thành một số lệnh trong ngôn ngữ máy, như vậy từ một chương

66
trình nguồn ở ngôn ngữ bậc cao ngắn gọn có thể tạo ra một chương trình ở
dạng nhị phân lớn, chiếm nhiều không gian của bộ nhớ chính và chương trình
được thực hiện chậm hơn. Do vậy ngôn ngữ bậc cao không phù hợp để viết
các chương trình hệ thống với yêu cầu chiếm ít dung lượng bộ nhớ và tốc độ
xử lý nhanh.

Lập trình bằng hợp ngữ (Assembly) là ngôn ngữ lập trình cấp thấp, vì
mỗi dòng lệnh viết bằng hợp ngữ được biên dịch thành một lệnh ở dạng ngôn
ngữ máy của chính vi xử lý và vi xử lý có thể thực hiện được. Hợp ngữ được
đảm bảo một lệnh mã nguồn tương ứng với một lệnh ngôn ngữ máy, cho phép
can thiệp trực tiếp vào các chức năng phần cứng của hệ thống vi xử lý như:
các thanh ghi bên trong vi xử lý, các đơn vị điều khiển vào/ra ngoại vi, bộ
nhớ… Do đó hợp ngữ là ngôn ngữ lập trình định hướng phần cứng, phù hợp
để viết các chương trình hệ thống.

Tuy nhiên hợp ngữ hỏi người lập trình phải am hiểu phần cứng, việc
kiểm tra lỗi và gỡ rối một chương trình khó khăn hơn một chương trình được
viết bằng ngôn ngữ bậc cao và khó khăn trong việc chuyển giao chương trình
được viết lên các máy có cấu trúc khác nhau.

Hiện nay đã có các công cụ và thư viện hỗ trợ viết các chương trình
nguồn bằng hợp ngữ trong môi trường Windows thuận tiện để tạo ra các cửa
sổ giao diện, các thực đơn điều khiển cho người dùng.

Để tạo một chương trình hợp ngữ và chạy nó trên mãy tính PC thường
phải thực hiện 4 bước sau:

- Soạn thảo file chương trình nguồn.


- Hợp dịch file chương trình nguồn thành file đối tượng ở ngôn ngữ
máy (object file)
- Liên kết một hay nhiều file đối tượng tạo ra một file chương trình
chạy được (run propgram file)
- Chạy chương trình.

67
2.3.1. Cú pháp của chương trình hợp ngữ

Một dòng lệnh của chương trình hợp ngữ có thể có các trường sau (tuy
nhiên không nhất thiết phải có mặt tất cả)

Tên Toán tử Toán hạng Chú giải

+ Trường “Tên”: được sử dụng để viết nhãn (Label) cho dòng lệnh, cho
một biến hoặc cho một thủ tục (procedure). Nhãn là con trỏ tượng trưng để
các lệnh tham chiếu tới nó thay cho giá trị địa chỉ của lệnh đó. Chương trình
biên dịch sẽ chuyển thành các địa chỉ của bộ nhớ.

- Chiều dài từ 1-31 ký tự, là chữ cái, số, các ký tự đặc biệt: ?, @, _, $, %.
- Không bắt đầu bằng chữ số và không có dấu cách ở giữa.
- Nếu là dấu chấm thì ở đầu.
- Trường “Tên” có thể có hay không tuỳ trường hợp cụ thể.
- Một nhãn kết thúc bởi dấu (:)

Ví dụ:

cons:

PUSH AX

IN AL, DX

+ Trường “Toán tử”: trong trường toán tử nói chung sẽ có các toán tử
thật thuộc tập lệnh của vi xử lý và toán tử giả (pseudo-operation).

- Toán tử thật biểu thị thao tác của lệnh và sẽ được chương trình dịch ra
mã máy.
- Toán tử giả không được dịch ra mã máy mà chỉ báo cho chương trình
biên dịch làm một việc gì đó.

Ví dụ:

Port1 EQU 10h ; toán tử giả EQU định nghĩa Port1 = 10h.

IN AL, Port1 ; nhận 1 byte dữ liệu từ cổng có địa chỉ 10h.

68
+ Trường “Toán hạng”:

- Với một toán tử thật, trường toán hạng chứa các dữ liệu được thao tác
trong lệnh. Tuỳ theo từng loại lệnh mà ta có thể có 0, 1, hoặc 2 toán hạng
trong một lệnh. Nếu lệnh có 2 toán hạng thì chúng được cách nhau bởi dấu (,).
- Với một lệnh hướng dẫn biên dịch, thì trường này chứa các thông tin
khác nhau liên quan đến các toán tử giả của hướng dẫn.

Ví dụ:

MOV AL, BL ; lệnh có 2 toán hạng

PUSH AX ; lệnh có một toán hạng

NOP ; lệnh không có toán hạng

+ Trường “Chú giải”:chứa các lời giải thích làm cho chương trình sáng
sủa, dễ hiểu khi viết và khi kiểm tra. Trường chú giải phải bắt đầu bằng dấu
(;). Chương trình dịch sẽ bỏ qua khi gặp nó.

Chú ý:

- Một câu lệnh của chương trình hợp ngữ bắt đầu từ đầu dòng và kết thúc
là xuống dòng
- Các trường cách nhau bằng ít nhất bởi dấu cách hoặc dấu tab.
- Trường toán tử bắt buộc phải có trong câu lệnh
- Có thể dùng một vài dòng để làm chú giải cho một công việc nào đó.
Nhưng mỗi dòng chú giải đó phải bắt đầu bằng dấu (;)

Ví dụ:

; khởi đầu thanh ghi DS và ES trong đoạn dữ liệu

MOV AX, @ data

MOV DS, AX

MOV ES, AX

69
2.3.2. Dữ liệu cho chương trình

Dữ liệu của một chương trình hợp ngữ có thể được cho dưới dạng số,
hoặc ký tự.

2.3.2.1. Dữ liệu kiểu số

Dữ liệu kiểu số rất đa dạng, có thể là số hệ 2, hệ 10 hoặc hệ 16

+ Chương trình hợp ngữ mặc định là dùng số hệ 10 cho nên khi dùng số
hệ 10 không cần phải khai báo. Với các số hệ 2 hay hệ 16 phải có chữ B hay
chữ H ở cuối số.

+ Đối với hệ 16 nếu các số bắt đầu bằng các chữ cái (a..f hoặc A..F) thì
phải thêm số 0 ở trước để chương trình dịch có thể hiểu được đó làm một số
hệ 16 chứ không phải là một tên hoặc một nhãn.

Ví dụ:

0101B ; số hệ 2

1234 ; số hệ 10

0ABCDh ; số hệ 16

2.3.2.2. Dữ liệu kiểu ký tự

Chương trình hợp ngữ cho phép sử dụng ký tự hay chuỗi ký tự nhưng
chúng phải được đặt trong cặp dấu trích dẫn đơn hoặc kép, ví dụ 'AB' hoặc
"abc". Trình biên dịch sẽ dịch ký tự ra mã ASCII tương ứng với nó. Vì vậy
khi cung cấp dữ liệu ký tự cho chương trình ta có thể sử dụng bản thân ký tự
được đặt trong dấu trích dẫn hoặc mã ASCII của nó. Ví dụ có thể dùng dữ liệu
ký tự là 'A' hoặc mã ASCII tương ứng là 41h.

2.3.3. Biến và hằng

2.3.3.1. Khai báo biến

Biến trong chương trình hợp ngữ có vai trò như trong ngôn ngữ bậc cao.
Một biến phải được định kiểu dữ liệu là kiểu byte hay kiểu word và sẽ được

70
chương trình dịch gán cho một địa chỉ nhất định trong bộ nhớ. Để định nghĩa
các kiểu dữ liệu khác nhau của biến ta dùng các lệnh giả sau:

+ Toán tử giả Kiểu dữ liệu

DB Định nghĩa biến kiểu byte

DW Định nghĩa biến kiểu từ

DD Định nghĩa biến kiểu từ kép

+ Biến kiểu byte: Biến kiểu byte sẽ chiếm 1 byte trong bộ nhớ. Hướng
dẫn chương trình dịch để định nghĩa biến kiểu byte có dạng như sau:

Tên_biến DB giá_trị_khởi_đầu

Ví dụ:

B1 DB 5 ; dành ra 1 byte trong bộ nhớ cho biến có tên là B1,

; chứa giá trị khởi đầu là 5

Nếu phần giá_trị_khởi_đầu được thay bằng dấu “?” thì biến nhớ sẽ
không được gán giá trị khởi đầu.

B2 DB ? ; B2 là biến byte không được gán giá trị ban đầu

+ Biến kiểu word: Hướng dẫn chương trình dịch để định nghĩa biến kiểu
word có dạng như sau:

Tên_biến DW giá_trị_khởi_đầu

Ví dụ:

W1 DW 30 ; dành 2 byte trong bộ nhớ cho biến có tên là W1

; chứa giá trị khởi đầu là 30

Nếu phần giá_trị_khởi_đầu được thay bằng dấu “?” thì biến nhớ sẽ
không được gán giá trị khởi đầu.

71
+ Biến mảng: Là biến hình thành từ một dãy liên tiếp các phần tử cùng
loại byte hoặc từ.

Ví dụ:

M1 DB 0Ah, 0Bh, 0Ch

Với ví dụ này biến mảng có tên là M1 gồm 3 byte với giá trị khởi đầu là
0Ah, 0Bh, 0Ch. Phần tử đầu mảng là 0Ah và có địa chỉ trùng với địa chỉ của
M1, phần tử thứ 2 là 0Bh có địa chỉ là M1+1…

Khi muốn định nghĩa các phần tử có cùng một giá trị khởi đầu thì có thể
dùng toán tử DUP như sau:

Repeat_count DUP(value)

Trong đó, Repeat_count là số byte (hay word) nhớ được khai báo, còn
value là giá trị khởi đầu cho các byte (hay word) đó.

Ví dụ:

M2 DB 10 DUP(0) ; biến mảng M2 gồm 10 byte có cùng

; giá trị khởi đầu là 0

M3 DB 10 DUP(?) ; biến mảng M3 gồm 10 byte nhưng

; chưa được khởi đầu

M4 DB 0,1,2 DUP(3,2 DUP(5),6) ; biến mảng M4 gồm:

; 0,1,3,5,5,6,3,5,5,6

+ Biến kiểu xâu ký tự : Là trường hợp đặc biệt của biến mảng, trong đó
các phần tử của mảng là các ký tự. Một xâu ký tự có thể được định nghĩa bằng
các ký tự hoặc bằng mã ASCII của các ký tự đó.

72
Ví dụ:

S1 DB ‘abc’ ; tương đương với

S2 DB 61h, 62h, 63h ; hoặc

S3 DB ‘a’, 62h, 63h

2.3.3.2. Khai báo hằng

Để chương trình trở lên dễ đọc người ta thường tạo ra các tên tượng
trưng để biểu diễn các hằng.

Hằng có thể là kiểu số hay kiểu ký tự. Việc gán tên cho hằng được thực
hiện nhờ toán tử giả EQU như sau:

Tên_hằng EQU hằng_số

Ví dụ:

LF EQU 0Ah ; LF là line feed

Chao EQU ‘Hello’

2.3.4. Khung chương trình hợp ngữ

Các vi xử lý Intel từ 8-bit đến 32-bit đều có cơ chế tổ chức bộ nhớ theo
các đoạn (segments). Đối với những chương trình nhỏ với cả dữ liệu và mã
lệnh chiếm không gian nhớ nhỏ hơn kích thước đoạn mặc định 64KB thì việc
lập trình hợp ngữ là đơn giản. Nhưng những chương trình lớn, ví dụ với dữ
liệu hoặc mã lệnh chiếm không gian nhớ lớn hơn kích thước của một đoạn thì
phải giải quyết vấn đề phân đoạn cho chương trình. Việc giới hạn đoạn 64KB
không có ý nghĩa nữa khi các vi xử lý Intel 32-bit làm việc trong chế độ bảo
vệ, bởi vì lúc địa chỉ 32-bit có không gian nhớ đến 4GB, đó là không gian địa
chỉ phẳng (flat address).

Tổ chức phân đoạn nhớ của các vi xử lý Intel ảnh hưởng đến khung của
chương trình hợp ngữ.

73
2.3.4.1. Cấu trúc chương trình hợp ngữ viết trong chế độ đơn giản.

Một chương trình mã máy trong bộ nhớ thường bao gồm các vùng nhớ
khác nhau (code, data, stack, extra) dùng cho các mục đích khác nhau. Chính
vì vậy chương trình hợp ngữ cũng phải có cấu trúc tương tự để khi được dịch
nó sẽ tạo ra mã tương ứng với chương trình mã máy.

❖ Khai báo quy mô bộ nhớ

Hướng dẫn chương trình dịch .MODEL chỉ ra các chế độ bộ nhớ cho
một module Hợp ngữ trong chế độ đoạn đơn giản hoá. Hướng dẫn chương
trình dịch phải được đặt trước các hướng dẫn khác trong chương trình hợp
ngữ, nhưng sau hướng dẫn về loại CPU.

Cú pháp:

.MODEL kiểu_bộ_nhớ ;kiểu_bộ_nhớ: được sử dụng trên Bảng 2.4.

Bảng 2.4. Các kiểu bộ nhớ


Kiểu bộ nhớ Mô tả
TINY - Cả mã lệnh và dữ liệu nằm trong một đoạn.
- Hỗ trợ một đoạn mã lệnh và một đoạn dữ liệu.
SMALL
- Mã lệnh và dữ liệu đều là NEAR
- Hỗ trợ cho nhiều đoạn mã lệnh, một đoạn dữ liệu.
MEDIUM
- Mã lệnh là FAR, dữ liệu là NEAR
- Hỗ trợ cho một đoạn mã lệnh, nhiều đoạn dữ liệu.
COMPACT
- Mã lệnh là NEAR, dữ liệu là FAR
- Hỗ trợ cho nhiều đoạn mã lệnh, nhiều đoạn dữ liệu.
LARGE - Mã lệnh là FAR, dữ liệu là FAR
- Không đoạn nhớ nào lớn hơn 64KB
- Hỗ trợ cho nhiều đoạn mã lệnh, nhiều đoạn dữ liệu.
HUGE - Mã lệnh là FAR, dữ liệu là FAR
- Đoạn nhớ có thể lớn hơn 64KB (do người lập trình viết lệnh)
Ví dụ: .MODEL small

74
❖ Khai báo đoạn ngăn xếp (Stack segment)

Khai báo đoạn ngăn xếp là để dành ra một vùng nhớ đủ lớn để chứa các
biến tạm thời, các địa chỉ nhảy trở về, các giá trị cờ, nội dung các thanh ghi
của vi xử lý.

Cú pháp: .STACK kích_thước

Trong đó, kích_thước quyết định số byte dành cho ngăn xếp. Nếu
kích_thước bị bỏ qua khi khai báo thì chương trình dịch tự động thiết lập 1KB
cho vùng ngăn xếp.

Ví dụ:

.STACK 100

❖ Khái báo đoạn dữ liệu (Data segment)

Đoạn dữ liệu chứa toàn bộ các định nghĩa cho các biến của chương trình.
Các hằng cũng nên được định nghĩa ở đây để đảm bảo tính hệ thống mặc dù
ta có thể để chúng ở trong chương trình như đã nói ở phần trên.

Việc khai báo đoạn dữ liệu được thực hiện nhờ hướng dẫn chương trình
dịch .DATA, việc khai báo biến và hằng được thực hiện tiếp ngay sau đó nhờ
các lệnh giả thích hợp.

Cú pháp:

.DATA

;Khai báo và gán giá trị cho các biến và định nghĩa hằng

Ví dụ:

.DATA

Chao DB ‘Hello!’

CR DB 13

LF DB 10

75
❖ Khai báo đoạn mã

Đánh dấu điểm khởi đầu của vùng nhớ chứa mã lệnh của chương trình.
Việc khai báo đoạn mã được thực hiện nhờ hướng dẫn chương trình dịch
.CODE

Cú pháp: .CODE Tên

“Tên”: ở đây là tên một đoạn. Khi dùng kiểu SMALL thì không cần phải
khai báo tên. Bên trong đoạn mã, các dòng lệnh phải được tổ chức một cách
hợp lý, đúng ngữ pháp dưới dạng một chương trình chính và nếu cần thiết thì
kèm theo các chương trình con. Các chương trình con sẽ được gọi ra bằng các
lệnh CALL có mặt bên trong chương trình chính.

Một thủ tục được định nghĩa nhờ các lệnh giả PROC (để bắt đầu thủ tục)
và ENDP (để kết thúc thủ tục). Như vậy, một chương trình chính có thể được
định nghĩa bằng các lệnh giả PROC và ENDP theo mẫu sau:

Tên_CTC Proc

; các lệnh của thân chương trình chính

CALL tên_ctc

Tên_CTC Endp

Giống như chương trình chính, một chương trình con cũng được định
nghĩa dưới dạng một thủ tục nhờ các lệnh giả PROC và ENDP theo mẫu sau:

Tên_ctc Proc

; các lệnh của chương trình con

RET

Tên_ctc Endp

❖ Khung của chương trình hợp ngữ để dịch ra file có đuôi .EXE

Cấu trúc tổng quát của một chương trình hợp ngữ ở chế độ đoạn đơn
giản hoá có dạng:

76
.MODEL SMALL

.STACK 100

.DATA

; các định nghĩa biến và hằng để ở đây

.CODE

MAIN PROC

; khởi đầu cho DS

MOV AX, @data

MOV DS, AX

; Các lệnh của chương trình chính

; Trở về DOS

MOV AH, 4Ch

INT 21h

MAIN ENDP

; các chương trình con (nếu có) để ở đây

END MAIN

❖ Khung chương trình hợp ngữ để dịch ra file có đuôi .COM

Các chương trình hợp ngữ để dịch ra file có đuôi .EXE có mặt đầy đủ
các đoạn. Còn các chương trình .COM là những chương trình mà các đoạn
lệnh, dữ liệu và ngăn xếp được gộp lại trong một đoạn duy nhất. Do đó, kích
thước của một chương trình .COM không vượt quá 64KB. Như vậy, nếu ta có
các ứng dụng mà dữ liệu và mã chương trình không yêu cầu nhiều về không
gian của bộ nhớ, ta có thể ghép luôn cả dữ liệu, mã chươnng trình và ngăn xếp
chung vào trong cùng một đoạn mã rồi tạo ra file .COM. Với việc tạo ra file

77
này không những ta tiết kiệm được thời gian và bộ nhớ khi chạy chương trình
mà còn tiết kiệm được cả không gian nhớ khi phải lưu trữ nó trên ổ đĩa.

Để có thể dịch được ra chương trình đuôi .COM thì chương trình nguồn
hợp ngữ phải được kết cấu sao cho thích hợp với mục đích này.

Dạng của chương trình Hợp ngữ để dịch được ra file chương trình có
đuôi .COM như sau:

.MODELSmall

.CODE

ORG 100h

START: JMP CONTINUE

; các định nghĩa cho biến và hằng để ở đây

CONTINUE:

MAIN PROC

; các lệnh của chương trình chính để ở đây

INT 20h ; trở về DOS

MAIN ENDP

; các chương trình con (nếu có) để ở đây

END START

+ Điểm khác biệt giữa chương trình hợp ngữ để dịch ra file có đuôi
.COM và .EXE là:

- Đối với chương trình để dịch ra file có đuôi .COM chỉ có một đoạn, vì
thế dòng đầu tiên phải là một lệnh. Chương trình chính bắt đầu bằng lệnh
nhảy JMP qua vùng khai báo dữ liệu.

- Nhãn START chỉ ra điểm bắt đầu của chương trình. Kết thúc là END
START

78
+ Hướng dẫn biên dịch ORG: ORG hằng_số

Trong đó, hằng_số là một số nguyên dương chỉ số byte cần sử dụng cho
lệnh. Khi đó chương trình dịch sẽ đặt vị trí ô nhớ (của lệnh hay dữ liệu) ngay
sau lệnh giả ORG, bắt đầu từ giá trị của offset là hằng_số trong lệnh.

Như trong khung chương trình trên, lệnh ORG 100h sẽ báo cho chương
trình dịch phân bố lệnh JMP tại ô nhớ có địa chỉ offset là 100h để tạo ra một
vùng nháp 100h byte cho đoạn đầu chương trình (PSP) giống như chương
trình .EXE.

+ Ngăn xếp của chương trình .COM

Trong các chương trình .COM, ngăn xếp được đặt cùng một đoạn với mã
lệnh và dữ liêu, người lập trình không phải định nghĩa ngăn xếp. Khi chương
trình .COM được nạp vào bộ nhớ, con trỏ ngăn xếp SP được khởi tạo với giá
trị FFFFh-là Word cuối cùng trong đoạn. Hình 2.6 cho thấy việc phân bố bộ
nhớ cho chương trình .COM

Địa chỉ lệch


0000h Đoạn đầu chương trình (PSP)  IP
0100h JMP CONTINUE

Dữ liệu nằm ở đây

CONTINUE:
(chiều tiến của mã và dữ liệu)


FFFFh (chiều tiến của ngăn xếp)  SP

Hình 2.6. File chương trình .COM trong bộ nhớ

79
Ví dụ: với ví dụ ở mục trên ta viết chương trình để dịch ra chương trình
.COM

.MODELsmall

.CODE

ORG 100h

START: JMP CONTIONUE

Message DB 'chuc ban hoc tot!$'

CONTINUE:

MAIN PROC

MOV DX, offset Message

MOV AH, 9

INT 21h

INT 20h ; trở về DOS

MAIN ENDP

END START

Cấu trúc chương trình hợp ngữ viết trong chế độ đoạn chuẩn (bạn đọc
có thể tham khảo trên các tài liệu khác).

2.3.4.2. Cách tạo, dịch và chạy chương trình Assembler trên máy tính.

Để tạo, dịch một chương trình Assembler phải thực hiện theo trình tự các
bước sau:

1. Tạo file chương trình nguồn

Dùng một chương trình soạn thảo văn bản (SK, NCedit...) để tạo ra môt
file chương trình gọi là file nguồn với các chú ý sau:

+ Các dòng lệnh khi đánh vào phải theo mã ký tự gốc tiếng Anh (khi
type trong DOS hay view trong NC thì hiện ra đúng chương trình được nhập)

80
+ Các dòng lệnh phải được nhập đúng quy cách và đúng khuôn dạng.

+ File chứa chương trình có phần mở rộng .ASM

2. Dịch chương trình

+ Để dịch một chương trình viết dưới khuôn dạng của chế độ đoạn đơn
giản thì phải có các chương trình dịch MASM 5.1 hay TASM 2.0 trở lên để
dịch tệp .ASM ra mã máy dưới dạng tệp .OBJ. Nếu trong bước này trong
chương trình có lỗi cú pháp thì phải quay lại bước 1 để sửa lại chương trình
gốc.

Giả thiết ta có tệp chương trình mang tên VIDU.ASM tại ổ đĩa A và
chương trình dịch hợp ngữ MASM tại ổ C ta có.

A:>C:MASM VIDU  ; tạo ra được file có tên là VIDU.OBJ

+ Dùng chương trình LINK.EXE để nối một hay nhiều tệp .OBJ lại với
nhau thành một tệp chương trình chạy được có đuôi .EXE

A:>C:LINK VIDU  ; tạo ra file chương trình VIDU.EXE

+ Nếu chương trình gốc viết ra là để dịch ra kiểu .COM thì ta phải dùng
chương trình EXE2BIN của DOS để dịch tiếp từ tệp .EXE ra tệp chương trình
chạy được có đuôi .COM

A:>C:EXE2BIN VIDU VIDU.COM ; tạo được file VIDU.COM

3. Chạy chương trình vừa dịch

A:>VIDU 

81
Chương 3: GHÉP NỐI 8086 VỚI BỘ NHỚ VÀ THIẾT BỊ NGOẠI VI.

Trong chương này nghiên cứu sự ghép nối bộ vi xử lý, bộ nhớ, các cổng
vào/ra thông qua các bus trong hệ vi xử lý 8086. Việc trao đổi tín hiệu trong
hệ là theo phương thức song song.

Khi ghép nối phải tuân theo các nguyên tắc sau:

+ Các chân điều khiển đầu vào của IC nào không được sử dụng phải
được đặt ở mức cao hay thấp tùy từng trường hợp cụ thể.

+ Các chân tín hiệu không phải là 3 trạng thái thì không được nối chung
đầu ra với nhau.

3.1. Các tín hiệu của 8086 và mạch phụ trợ 8284, 8288

3.1.1. Các tín hiệu của 8086

Sơ đồ chân tín hiệu của 8086 trên Hình 3.1

3.1.1.1. Các tín hiệu dùng chung cho cả chế độ MIN và MAX

+ Các chân nguồn: Chân 1 và 20 nối đất, chân 40 nối +5v

+ Các chân địa chỉ/dữ liệu:

AD0-AD15 [tín hiệu vào/ra]: các chân dồn kênh cho các tín hiệu của bus
dữ liệu và bus địa chỉ. Xung ALE sẽ báo cho mạch ngoài biết khi nào trên các
đường đó là tín hiệu địa chỉ (ALE=1), dữ liệu (ALE=0).

+ Các chân địa chỉ/trạng thái:

A16/S3, A17/S4, A18/S5, A19/S6 [tín hiệu ra]: Các chân dồn kênh của
địa chỉ phần cao và trạng thái. Là tín hiệu địa chỉ (A16-A19) khi ALE=1, là
tín hiệu trạng thái (S3-S6) khi ALE=0. Trong đó, S6 luôn = 0 (không sử
dụng), S5 phản ánh giá trị cờ IF của thanh ghi cờ. Hai bit S4, S3 cho biết việc
truy nhập đến các đoạn nhớ như trên Bảng 3.1. Các chân này ở trạng thái trở
kháng cao khi CPU chấp nhận treo.

82
Bảng 3.1. Ý nghĩa của các bit S4,S3

S4 S3 Truy nhập đến

0 0 Đoạn dữ liệu phụ (Extra)


0 1 Đoạn ngăn xếp (Stack)
1 0 Đoạn mã hoặc không đoạn nào (Code)
1 1 Đoạn dữ liệu (Data)

Hình 3.1. Sơ đồ chân tín hiệu của 8086


+ Các đường điều khiển và ngắt:

- BHE S7 (Byte hight enlable)-tín hiệu ra ba trạng thái: Trong T1, nếu
BHE =0, 8086 chọn nửa cao của bus dữ liệu (D8-D15). Trong các chu kỳ sau

nó mang thông tin trạng thái.

83
- RD (Read)-tín hiệu ra 3 trạng thái: khi RD =0 CPU sẵn sàng đọc dữ liệu
từ bộ nhớ hay thiết bị ngoại vi. Chân RD ở trạng thái trở kháng cao khi CPU
chấp nhận treo.

- READY (Data transfer ready)-tín hiệu vào: tín hiệu báo cho CPU biết
tình trạng sẵn sàng của bộ nhớ hay thiết bị ngoại vi. Khi READY=1 thì CPU
thực hiện việc đọc/ghi mà không cần phải chèn thêm các chu kỳ đợi. Ngược
lại khi thiết bị ngoại vi hay bộ nhớ có tốc độ chậm chúng đưa READY=0 để
báo cho CPU biết, lúc này CPU kéo dài thời gian thực hiện lệnh đọc/ghi bằng
cách thêm các chu kỳ đợi.

- NMI (Non maskable interupt)-tín hiệu vào: tín hiệu yêu cầu ngắt không
che được. Nó không bị tác động bởi cờ IF. Khi nhận được tín hiệu này CPU
sẽ hoàn thành lệnh đang làm dở, sau đó chuyển sang chương trình con phục
vụ ngắt.

- INTR (Interupt request)-tín hiệu vào: tín hiệu yêu cầu ngắt che được.
Khi có tín hiệu yêu cầu ngắt INTR đưa tới CPU, nếu IF=1 thì CPU sẽ hoàn
thành lệnh đang làm dở, sau đó thực hiện chu kỳ ngắt và đưa ra tín hiệu
INTA = 0 .

- RESET (Restart)-tín hiệu vào: tín hiệu khởi động lại. Khi RESET=1
kéo dài ít nhất 4 chu kỳ xung đồng hồ thì CPU buộc phải khởi động lại. Khi
đó nó xoá các thanh ghi DS, ES, SS, IP và FR về 0 và bắt đầu thực hiện
chương trình tại địa chỉ CS:IP = FFFFh:0000h (cờ IF  0 để không cho phép
các yêu cầu ngắt tác động vào CPU và cờ TF  0 để bộ vi xử lý không bị đặt
trong chế độ chạy từng lệnh).

- TEST (Test interupt)-tín hiệu vào: tín hiệu kiểm tra, nếu TEST=0 ta có
thể kiểm tra bộ vi xử lý bằng lệnh WAIT.

- CLK (Clock input)-tín hiệu vào: tín hiệu xung nhịp để đồng bộ tất cả
các thao tác của CPU.

84
- MN MX (Minimum/Maximum mode)-tín hiệu vào: tín hiệu quy định
CPU làm việc ở chế độ đơn xử lý hay đa xử lý.

3.1.1.2. Các tín hiệu dùng trong chế độ MIN.

Các tín hiệu điều khiển bộ nhớ hay thiết bị ngoại vi được lấy trực tiếp từ
CPU.

- ALE (Address latch enable)-tín hiệu ra: tín hiệu dùng để chốt địa chỉ.
khi ALE=0 thì trên bus dồn kênh AD là tín hiệu địa chỉ.

- DEN (Data enable)-tín hiệu ra 3 trạng thái: tín hiệu cho phép truyền dữ
liệu giữa CPU với bộ nhớ hay cổng vào/ra. Tín hiệu này ở trạng thái trở
kháng cao khi CPU chấp nhận treo.

- DT R (Data transmit/recieve)-tín hiệu ra 3 trạng thái: xác định hướng


truyền dữ liệu. DT R =1 dữ liệu từ CPU, DT R =0 dữ liệu tới CPU.

- M IO (Memory/input output)-tín hiệu ra 3 trạng thái: Xác định CPU


thâm nhập tới bộ nhớ hay cổng vào/ra. M IO =1 tới bộ nhớ, M IO =0 tới cổng
vào/ra.

- WR (Write)-tín hiệu ra 3 trạng thái: tín hiệu cho phép ghi. Khi WR =0
thì trên bus dữ liệu các dữ liệu đã được ổn định và chúng được ghi vào bộ nhớ
hoặc cổng vào/ra tại thời điểm đột biến WR =1. Chân này ở trạng thái trở
kháng cao khi CPU chấp nhận treo.

- INTA (Interupt acknowledge)-tín hiệu ra 3 trạng thái: tín hiệu báo cho
thiết bị ngoại vi viết CPU chấp nhận yêu cầu ngắt INTR. Lúc này CPU đưa ra
tín hiệu INTA =0 để báo cho thiết bị ngoại vi đưa số hiệu ngắt vào bus dữ liệu.

- HOLD (Hold request)-tín hiệu vào: tín hiệu đòi treo CPU để mạch
ngoài thực hiện việc trao đổi dữ liệu theo phương pháp vào/ra trực tiếp-DMA
(direct memory access). Khi HOLD=1 thì CPU sẽ thả nổi bus hệ thống và
nhường quyền điều khiển bus cho bộ điều khiển DMA (DMAC).

85
- HLDA (Hold acknowledge)-tín hiệu ra: tín hiệu báo cho mạch ngoài
biết CPU chấp nhận treo, các bus đã được thả nổi và DMAC được quyền điều
khiển bus.

3.1.1.3. Các tín hiệu dùng trong chế độ MAX

Trong chế độ MAX một số tín hiệu điều khiển cần thiết được tạo ra trên
cơ sở các tín hiệu trạng thái nhờ dùng thêm ở bên ngoài một mạch điều khiển
bus 8288

+ S0, S1, S2 (Status)-tín hiệu ra 3 trạng thái: Để ghép nối với bộ điều khiển
bus 8288. Từ 8288 sẽ đưa ra các tín hiệu điều khiển trong các chu kỳ hoạt
động của bus (được trình bày ở mục 3.1.3).

+ RQ GT0 vµ RQ GT1 (Request/grant)-tín hiệu vào/ra: các tín hiệu yêu


cầu dùng bus của các bộ vi xử lý khác hoặc thông báo chấp nhận treo của
CPU để cho phép các bộ bi xử lý khác dùng bus. RQ GT0 có mức ưu tiên cao
hơn. Trình tự trả lời được diễn ra theo 3 bước:

- Thiết bị yêu cầu làm chủ bus gửi yêu cầu bằng một xung có độ rộng 1
chu kỳ xung nhịp (1 Clk) tới CPU.

- Sau khi nhận được tín hiệu yêu cầu, CPU gửi xung có độ rộng 1 Clk tới
thiết bị yêu cầu để báo rằng bus đã treo và đơn vị yêu cầu có thể dành quyền
làm chủ bus

- Thiết bị làm chủ bus sau khi kết thúc công việc, gửi một xung có độ
rộng 1 Clk tới CPU báo yêu cầu treo đã kết thúc, và CPU trở lại làm chủ bus
trong chu kỳ xung nhịp tiếp theo.

+ LOCK (Lock) – tín hiệu ra 3 trạng thái: tín hiệu báo cho các thiết bị
chủ khác không được thâm nhập bus.

+ QS1, QS2 (Queue status)-tín hiệu ra: tín hiệu cung cấp thông tin trạng
thái theo dõi hàng đợi lệnh trong bộ vi xử lý (Bảng 3.2.)

86
Bảng 3.2. Ý nghĩ của các tín hiệu QS1, QS0
QS1 QS2 Trạng thái hàng đợi lệnh
0 0 Không hoạt động
0 1 Đọc byte mã lệnh đầu tiên từ hàng đợi lệnh
1 0 Đệm lệnh rỗng
1 1 Đọc byte tiếp theo
Trong hệ vi xử lý với sự có mặt của bộ đồng xử lý toán học 8087, các tín
hiệu này được mạch 8087 dùng để đồng bộ quá trình hoạt động của nó với bộ
vi xử lý.

3.1.2. Mạch tạo xung nhịp 8284 và ghép nối với 8086

Mạch tạo tín hiệu xung nhịp 8284 được dùng để cung cấp xung nhịp với
tần số thích hợp cho toàn hệ và đồng bộ tín hiệu RESET và tín hiệu READY
của CPU. Sơ đồ chân tín hiệu của 8284 trên Hình 3.2.

CSYNC 1 18 Vcc
PCLK 2 17 X1
AEN1 3 16 X2
RDY1 4 15 ASYNC
READY 5 8284 14 EFI
RDY2 6 13 F/C
AEN 2 7 12 OSC
CLK 8 11 RES
GND 9 10 RESET

Hình 3.2. Mạch tạo xung đồng hồ 8284

- AEN1 , AEN 2 (Address enable), [I]: Tín hiệu cho phép chọn đầu vào
tương ứng RDY1, RDY2 làm tín hiệu báo tình trạng sẵn sàng của bộ nhớ hoặc
thiết bị ngoại vi.

- RDY1, RDY2 (Bus ready), [I]: cùng với AEN1 , AEN 2 dùng để gây
ra các chu kỳ đợi ở CPU.

87
- ASYNC (Ready sunchroniation select), [I]: chọn đồng bộ hai tầng hoặc
đồng bộ một tầng cho tín hiệu RDY1, RDY2. Trong chế độ đồng bộ một tầng
( ASYNC =1) tín hiệu RDY ảnh hưởng đến tín hiệu READY tới tận sườn
xuống của xung đồng hồ tiếp theo; trong chế độ đồng bộ hai tầng ( ASYNC =0)
tín hiệu RDY chỉ ảnh hưởng tới tín hiệu READY khi có sườn xuống của xung
đồng hồ tiếp theo.

- READY [O] : nối đến đầu READY của CPU. Tín hiệu này được đồng
bộ với các tín hiệu RDY1, RDY2.

- X1, X2 (Crystal), [O]: nối với 2 chân của thạch anh với tần số fx, thạch
anh này là một bộ phận của một mạch dao động bên trong 8284 có nhiệm vụ
tạo xung chuẩn dùng làm tín hiệu đồng bộ cho toàn hệ thống.

- F/C (Frequeny/crystal), [I]: dùng để chọn nguồn tín hiệu chuẩn cho
8284. Khi chân này ở mức cao thì xung đồng hồ bên ngoài sẽ được dùng làm
xung nhịp cho 8284, ngược lại thì xung đồng hồ của mạch dao động bên trong
dùng thạch anh sẽ được chọn để làm xung nhịp.

- EFI (External frequency input), [I]: lối vào cho xung từ bộ dao động
ngoài.

- CLK [O]: Xung nhịp fCLK=fX/3 với độ rỗng 77% nối đến chân CLK của
CPU

- PCLK (Peripheral clock), [O]: xung nhịp fPCLK=fX/6 với độ rỗng 50%
dành cho thiết bị ngoại vi.

- OSC (Osc output), [O]: xung nhịp đã được khuếch đại có tần số bằng FX
của bộ dao động.

- RES(Reset input), [I]: chân khởi động, nối với mạch RC để 8284 có
thể tự khởi động khi bật nguồn.

88
- RESET (Reset Output), [O]: nối RESET của CPU và là tín hiệu khởi
động lại cho toàn hệ.

- CSYNC (Clock synchronisation), [O]: lối vào cho xung đồng bộ chung
khi trong hệ thống có các 8284 dùng dao động ngoài tại chân EFI. Khi dùng
mạch dao động trong thì phải nối đất chân này. Sơ đồ ghép nối vi xử lý 8086
với 8284 trên Hình 3.3.

5V
X1 CLK CLK

X2
10k
8284

RES RESET
8086
K
10
F/C
CSYN RESET
C Khởi động hệ thống

Hình 3.3. Mạch 8086 nối với 8284


3.1.3. Mạch điều khiển bus 8288 và ghép nối với 8086

Như đã giới thiệu ở phần trước vi mạch 8288 là mạch điều khiển bus. Nó
lấy một số tín hiệu điều khiển của CPU và cung cấp tất cả các tín hiệu điều
khiển cần thiết cho hệ vi xử lý khi CPU 8086 làm việc ở chế độ MAX. Sơ đồ
chân tín hiệu của mạch 8228 trên Hình 3.4.
IOB 1 20 Vcc
CLK 2 19 S0
S1 3 18 S2
DT/ R 4 17 MCE / PDEN
ALE 5 8288 16 DEN
AEN 6 15 CEN
MRDC 7 14 INTA
AMWC 8 13 IORC
MWTC 9 12 AIOWC
GND IOWC
10 11
RESET
Hình 3.4. Mạch tạo xung điều khiển
89
- S2 , S1 , S0 [I]: là các tín hiệu trạng thái lấy thẳng từ CPU. Tùy theo các
tín hiệu này mà mạch 8288 sẽ tạo ra các tín hiệu điều khiển khác nhau tại các
chân ra của nó để điều khiển hoạt động của các thiết bị nối với CPU, Bảng 3.3.

Bảng 3.3. Các tín hiệu điều khiển của 8288


S2 S1 S0 Chu kỳ điều khiển của bus Tín hiệu
0 0 0 Chấp nhận yêu cầu ngắt INTA
0 0 1 Đọc cổng I/O IORC
0 1 0 Ghi cổng I/O IOWC , AIOWC
0 1 1 Dừng Không
1 0 0 Đọc mã lệnh MRDC
1 0 1 Đọc bộ nhớ MRDC
1 1 0 Ghi bộ nhớ MWTC , AMWC
1 1 1 Bus rỗi (nghỉ) Không

- CLK [I]: đầu vào nối với xung đồng hồ hệ thống (từ mạch 8284) và
dùng để đồng bộ toàn bộ các xung điều khiển đưa ra từ mạch 8288

- AEN [I] (Address enable): là tín hiệu đầu vào để sau một khoảng thời
gian trễ cỡ 150 ns sẽ kích hoạt các tín hiệu điều khiển ở đầu ra của 8288. Tín
hiệu này để điều khiển sự xuất hiện của các tín hiệu ra (mạch 3 trạng thái), nó
được nối với chân HOLD trong mạch.

- CEN [I] (Command enable): là tín hiệu đầu vào để cho phép đưa ra tín
hiệu DEN và các tín hiệu điều khiển khác của 8288

- IOB [I] (Input/Output bus mode): Tín hiệu để điều khiển mạch 8288
làm việc ở chế độ bus khác nhau. Khi IOB=1 mạch 8288 làm việc ở chế độ
bus vào/ra, khi IOB=0 mạch 8288 làm việc ở chế độ bus hệ thống (như trong
các máy IBM PC).

90
- MRDC [O] (Memory read command): tín hiệu điều khiển đọc bộ nhớ.
Nó kích hoạt bộ nhớ đưa dữ liệu ra bus

- MWTC [O] (Memory write command), AMWC [O] (Advanced MWTC ):


các tín hiệu ghi bộ nhớ. Trong đó, AMWC hoạt động sớm hơn để tạo thêm thời
gian cho các bộ nhớ chậm có được thêm thời gian ghi.

- IORC [O] (I/O read command): tín hiệu điều khiển đọc thiết bị ngoại
vi, nó kích hoạt các thiết bị được chọn để các thiết bị này đưa dữ liệu ra bus

- IOWC [O] (I/O write command), AIOWC [O] (Advanced IOWC ):


các tín hiệu điều khiển ghi ngoại vi. Trong đó, AIOWC hoạt động sớm hơn để
tạo thêm thời gian cho các ngoại vi có được thêm thời gian ghi.

- INTA [O]: đầu ra để thông báo là CPU chấp nhận yêu cầu ngắt của thiết
bị ngoại vi và lúc này các thiết bị ngoại vi sẽ phải đưa số hiệu ngắt ra bus để
CPU đọc.

- DT / R [O] (Data transmit/receive): tín hiệu để điều khiển hướng đi của


̅ = 0: CPU đọc dữ liệu,
dữ liệu trong hệ vào hay ra so với CPU (DT⁄R
̅ = 1: CPU ghi dữ liệu).
DT⁄R

- DEN [O]: tín hiệu điều khiển bus dữ liệu trở thành bus cục bộ hay bus
hệ thống.

- MCE / PDEN [O]: là tín hiệu dùng định chế độ làm việc cho mạch điều
khiển ngắt PIC 8259 để nó làm việc ở chế độ chủ.

- ALE [O]: là tín hiệu cho phép chốt địa chỉ có tại các chân dồn kênh địa
chỉ - dữ liệu AD0 – AD15, tín hiệu này thường nối với chân G của mạch
74LS373 để điều khiển mạch này chốt lấy địa chỉ.

3.2. Ghép nối 8086 với bus hệ thống

3.2.1. Các chu kỳ bus của 8086

91
Chu kỳ bus là một chu kỳ vận chuyển dữ liệu hoàn thành, phụ thuộc vào
số lượng các tín hiệu điều khiển của CPU (hay DMAC,...). Chu kỳ bus có thể
là chu kỳ ghi - Hình 3.5, chu kỳ đọc - Hình 3.6.
T1 T2 T3 T4

CLK
Tw (Chu kỳ đợi – Wait)

ALE Hight active

A16/S3-A19/S6
Address Status Signal

AD0-AD15
Address Data ghi
T giữa w
WR
TWR Low active
DEN
Low active

Hình 3.5. Chu kỳ bus ghi

T1 T2 T3 T4

CLK

Tw
ALE Hight active

A16/S3-A19/S6 Status Signal


Address

AD0-AD15
Address Data

TRD
RD
Low active

DE Low active
N

Hình 3.6. Chu kỳ bus đọc

92
Một chu kỳ bus thường kéo dài khoảng 4 chu kỳ xung clock, mỗi chu kỳ
clock sẽ thực hiện một số nhiệm vụ sau:

+ T1: Trên các chân dồn kênh AD0-AD15, A16/S3-A19/S6 là tín hiệu địa
chỉ. Tín hiệu điều khiển ALE=1 dùng để chốt địa chỉ.

̅̅̅̅, WR
+ T2: Các tín hiệu điều khiển RD ̅̅̅̅̅ và DEN
̅̅̅̅̅̅ tích cực trên các chân
AD0-AD15 là tín hiệu dữ liệu và A16/S3-A19/S6 là tín hiệu trạng thái. Tại cuối
chu kỳ T2 CPU lấy mẫu tín hiệu READY để xử lý trong các chu kỳ tiếp theo
khi nó phải làm việc với bộ nhớ hoặc thiết bị ngoại vi hoạt động chậm.

+ T3: CPU dành thời gian cho bộ nhớ hay thiết bị ngoại vi truy nhập dữ
liệu. Nếu tín hiệu READY = 0 (được lấy mẫu ở cuối chu kỳ T2) thì CPU tự
xen vào giữa T3 và T4 một vài chu kỳ đợi (Tw) nhằm kéo dài thời gian thực
hiện lệnh, tạo điều kiện cho bộ nhớ hoặc thiết bị ngoại vi chậm có đủ thời
gian hoàn thành việc ghi/đọc dữ liệu.

+ T4: Trong chu kỳ này các tín hiệu điều khiển được đưa về trạng thái
không tích cực để chuẩn bị cho chu kỳ bus mới.

3.2.2. Ghép nối 8086 với bus hệ thống.

Để giảm bớt khó khăn về mặt công nghệ do việc phải chế tạo nhiều chân
cho các tín hiệu của mạch CPU, người ta đã tìm cách hạn chế số chân của vi
mạch bằng cách dồn kênh nhiều tín hiệu trên cùng một chân. Ví dụ các chân
AD0-AD15 của 8086. Khi nhận được các tín hiệu đó ở bên ngoài vi mạch ta
phải tiến hành tách các tín hiệu đó ra để tái tạo lại các tín hiệu gốc cho các bus
độc lập. Để thực hiện phải sử dụng các vi mạch chức năng thích hợp ở bên
ngoài (thường là các mạch chốt).

3.2.2.1. Chế độ MIN

Chế độ MIN được sử dụng khi chân MN / MX có mức logic 1 (nối trực
tiếp với nguồn 5V). Ở chế độ này tín hiệu điều khiển do bộ vi xử lý trực tiếp
tạo và đưa ra bus. Sơ đồ ghép nối trên Hình 3.7.

93
LS373 A16-A19
A16/S3 - A19/S6

G OC
CPU
8086
2x A0-A15
AD0 - AD15
LS372

G OC
ALE

2x D0-D15
+5V LS245
MN / MX
G DIR
DEN
DT/ R

BHE LS244 BHE


M/IO
M / IO
RD
RD
WR OC1 OC2 WR

Hình 3.7. Sơ đồ ghép nối 8086 với BUS chế độ MIN

3.2.2.2. Chế độ MAX

Chế độ MAX được thực hiện khi chân MN / MX có mức logic 0 (nối đất).

Trong chế độ MAX, 3 tín hiệu trạng thái S0, S1, S2 của bộ vi xử lý 8086
được đưa tới bộ điều khiển bus 8288 để tạo ra các tín hiệu điều khiển tương
ứng với các chế độ trong Bảng 3.3. Các tín hiệu này được đưa tới các mạch
ngoài điều khiển các khối khác trong hệ.

94
Chế độ MAX được sử dụng khi trong hệ thống có thể có thêm IC đồng
xử lý, DMAC hoặc hệ vi xử lý khác có khả năng chiếm dụng bus. Sơ đồ ghép
nối 8086 với bus ở chế độ MAX trên Hình 3.8.

LS373
A16/S3 - A19/S6 A16-A19

G OC

AD0 -AD15 2x A0-A15


LS372

G OC
CPU
8086
2x D0-D15
LS245

MN/MX 8288 DIR G


ALE
DT / R
DEN

S0 ̅̅̅
S0 AIOWC
̅̅̅
S1 AMWC
S1
MWTC
̅̅̅
S2
S2 IORC
MRDC
INTA

Hình 3.8. Sơ đồ ghép nối 8086 với BUS chế độ MAX

3.3. Tổ chức bộ nhớ cho 8086

Bộ nhớ là thành phần không thể thiếu trong một hệ vi xử lý, nó được sử
dụng để lưu mã lệnh và dữ liệu chương trình. Các vi mạch nhớ thường được
dùng trong hệ vi xử lý gồm:

95
+ ROM (Read Only Memory – Bộ nhớ chỉ đọc): được sử dụng để lưu mã
lệnh chương trình. Nội dung bộ nhớ được lưu từ khi sản xuất (theo đặt hàng).
Nội dung của ROM không bị mất khi mất nguồn nuôi, và chỉ được đọc ra
trong quá trình làm việc.

+ PROM (Programmable ROM): nhà sản xuất tạo ra một con ROM trắng
(chưa ghi thông tin). Người sử dụng có thể tự ghi thông tin vào PROM theo ý
mình một lần duy nhất. Sau khi ghi chương trình PROM chuyển thành ROM.

+ EPROM (Erasable PROM): bộ nhớ EPROM có thể xóa, ghi nhiều lần
bằng máy nạp EPROM.

+ EEPROM (Electric EPROM): bộ nhớ EEPROM có thể được xóa, ghi


nhiều lần ngay trong mạch làm việc mà không đòi hỏi phải thông qua máy
nạp EPROM.

+ RAM (Random Access Memory – Bộ nhớ ghi/đọc): được sử dụng để


lưu dữ liệu. Nội dung của RAM sẽ bị mất đi khi mất nguồn nuôi cấp cho vi
mạch, trong quá trình làm việc có thể ghi dữ liệu vào RAM hoặc đọc dữ liệu
từ RAM.

+ SRAM (Static RAM): Mỗi phần tử nhớ của loại này được cấu tạo từ
mạch lật (flip – flop) nên có đặc điểm là tác động nhanh, thông tin ổn định.
Kèm theo đó là tốn nhiều transistor cho một đơn vị nhớ nên đắt tiền. Chúng
thường được dùng vào những thành phần nhớ quan trọng như thanh ghi,
cache,...

+ DRAM (Dynamic RAM): Mỗi phần tử nhớ của loại này được cấu tạo
từ một tụ điện nhỏ, được chế tạo bằng công nghệ PMOS. Loại này có đặc
điểm là tác động chậm, thông tin không ổn định vì có sự dò điện tích giữa 2
bản tụ (1: tụ được tích điện, 0: tụ không được tích điện) nên cần các mạch phụ
trợ để bù lại lượng điện tích bị dò – gọi là các mạch làm tươi. Loại này rẻ hơn
SRAM và có thể sản xuất vi mạch nhớ với dụng lượng lớn.

96
3.3.1. Cấu trúc chung của IC nhớ

Một bộ nhớ nói chung được cấu tạo từ nhiều vi mạch nhớ ghép lại. Mỗi vi
mạch nhớ thường có cấu trúc trên Hình 3.9.

- A0 – Am-1: m bit địa chỉ A0 D0


A1 D1
- D0 – Dn-1: n bit dữ liệu Address Data

- Dung lượng tính theo bit:


Am-1 Dn-1
2 *n (bits). Nếu n = 8 thì
m
WR WE
OE
dung lượng là: 2 (bytes)
m RD
CS
̅̅̅̅̅: Tín hiệu điều khiển
- WR CS
RD
ghi, tín hiệu tích cực cho
Hình 3.9. Cấu trúc chung của 1 IC nhớ
phép ghi dữ liệu vào ô nhớ.
̅̅̅̅: Tín hiệu điều khiển đọc, với ROM thường là OE (Output enable).
- RD
Tín hiệu tích cực cho phép đọc dữ liệu từ ô nhớ.
̅̅̅ : Tín hiệu chọn chip, với ROM thường là ̅̅̅̅
- CS CE (Chip Enable). Tín
hiệu tích cực cho phép vi mạch nhớ làm việc.

+ Nhóm tín hiệu địa chỉ (A0 – Am-1): Dùng để chọn ra ô nhớ cụ thể
được ghi/đọc. Các ô nhớ có độ dài khác nhau tuỳ từng loại vi mạch nhớ, từng
nhà sản xuất: 1, 4, 8,... bit. Số lượng các đường dây địa chỉ xác định dung
lượng của vi mạch nhớ.

Dung lượng = 2m (ô nhớ).

Nếu m = 10 thì dung lượng là: 210 = 1K ô nhớ.

Nếu m = 20 thì dung lượng là: 220 = 1M ô nhớ.

+ Nhóm tín hiệu dữ liệu (D0 – Dn-1): các đường tín hiệu này là đầu ra
đối với vi mạch ROM và vào/ra đối với vi mạch RAM. Số đường dữ liệu (n)
xác định độ dài của ô nhớ. Thường ghi rõ 1Kx8 hoặc 16Kx4 hoặc 1Kx1.

+ Tín hiệu chọn vi mạch: thường dùng ký hiệu CS (Chip Select) cho các
vi mạch RAM và CE (Chip Enable) cho các vi mạch ROM. Tín hiệu này dùng

97
để cho phép vi mạch nhớ nào trong bộ nhớ làm việc thì mới tiến hành ghi/đọc
ô nhớ của vi mạch đó. Tín hiệu này thường được nối với đầu ra của mạch giải
mã địa chỉ.

+ Nhóm tín hiệu điều khiển: các tín hiệu điều khiển đọc, ghi (RD, WR -
ký hiệu với RAM; OE, WE - ký hiệu đối với ROM) luôn ngược pha nhau để
cho phép dữ liệu từ bus dữ liệu được đi vào vi mạch hoặc ngược lại từ vi
mạch nhớ ra bus dữ liệu.

Một đặc trưng quan trọng của vi mạch nhớ là thời gian truy nhập tac. Có
thể định nghĩa rằng thời gian truy nhập của một vi mạch nhớ là khoảng thời
gian kể từ khi có địa chỉ trên bus địa chỉ cho đến khi dữ liệu ra ổn định trên
bus dữ liệu. Thông số này phụ thuộc vào công nghệ chế tạo vi mạch nhớ. Với
công nghệ lưỡng cực có thể sản xuất các vi mạch nhớ có tac = 10 – 30 ns; với
công nghệ MOS có thể sản xuất các vi mạch nhớ có tac lớn hơn, cỡ 150 ns
hoặc hơn nữa.

3.3.2. Giới thiệu một số IC nhớ tiêu biểu.

3.3.2.1. IC nhớ ROM

Họ EPROM thông dụng 27x, Bảng 3.4.

Bảng 3.4. Họ EPROM 27x

Số hiệu Chip Dung lượng


2708 1K*8
2716 2K*8
2732 4K*8
2764 8K*8
27128 16K*8
27256 32K*8
27512 64K*8

98
Vi mạch nhớ EPROM 2716 (Hình 3.10)

- tac = 450ns

- A0-A10: Address Inputs

- D0-D7: Data Outputs

̅̅̅̅: Chip Enable


- CE

- ̅̅̅̅
OE: Output Enable

- Vpp : Read 5V, Program 25V


Hình 3.10. Sơ đồ EPROM 2716
- Vcc: Power 5V

- GND: Ground

3.3.2.2. IC nhớ RAM.

Một số IC nhớ RAM thông dụng, Bảng 3.5.

Bảng 3.5. Một số IC nhớ RAM


Số hiệu Chip Dung lượng
HT 6116 2K*8
CY 6264 8K*8
CY 62256 32K*8
HM 62864 64K*8

Vi mạch nhớ SRAM 62256 (Hình 3.11)

- tac từ 55-70ns

- A0-A14: Address Inputs

̅̅̅̅̅: Write Enable Input


- WR

̅̅̅: Chip Select Input


- CS

- ̅̅̅̅
OE: Output Enable Input

- I⁄O1 − I⁄O8: Data Inputs/Outputs

- VCC: Power (5V), VSS: Ground Hình 3.11. Sơ đồ SRAM 62256

99
3.3.3. Nguyên tắc và các bước tổ chức bộ nhớ

3.3.3.2. Nguyên tắc tổ chức bộ nhớ

Bộ vi xử lý 8086 có bus dữ liệu ngoài 16 bit. Do vậy bộ nhớ phải được tổ


chức để thâm nhập cả 8 bit và cho cả 16 bit trên bus dữ liệu.

Bảng 3.6. Ý nghĩa sử dụng các tín hiệu A0 và BHE

A0 BHE ý nghĩa
0 0 Cả hai băng chẵn và lẻ
0 1 Băng chẵn
1 0 Băng lẻ
1 1 Không dùng

CPU 8086 sử dụng 2 tín hiệu A0 và BHE để điều khiển việc thâm nhập
bộ nhớ (hay vào ra), Bảng 3.6. Không gian bộ nhớ khi đó được chia ra làm 2
băng: băng chẵn được điều khiển bằng bit A0 và băng lẻ được điều khiển bằng
bit BHE . Sự phân băng của bộ nhớ được chỉ ra trên Hình 3.12.

FFFFFh FFFFEh FFFFFh


FFFFEh FFFFCh FFFFDh
. . .
= . + .
.
A0 -A19 A1 -A19 A1 -A19
. . .
00001h 00002h 00003h
A0 BHE
00000h 00000h 00001h

D0 – D15 D0 – D7 D8 – D15
(Băng chẵn) (Băng lẻ)
)
Hình 3.12 Sự phân băng cho BUS 16 bit

100
Để hiểu rõ hơn trên sơ đồ phân băng ta xét các trường hợp trao đổ dữ liệu
với bộ nhớ thông qua lệnh MOV

+ Trường hợp trao đổi byte.

Ví dụ: MOV AL, [BX]

- Nếu [BX] chẵn  A0=0, BHE =1 và ([BX])  AL qua D0-D7

- Nếu [BX] lẻ  A0=1, BHE =0 và ([BX])  AL qua D8-D15

+ Trường hợp trao đổi Word.

Ví dụ: MOV AX, [BX]

- Nếu [BX] chẵn  A0=0, BHE =0

• ([BX])  AL qua 8 bit thấp D0-D7 và


• ([BX]+1)  AH qua 8 bit cao D8-D15

- Nếu [BX] lẻ  CPU tốn 2 chu kỳ bus thâm nhập bộ nhớ

• Chu kỳ thứ nhất: A0=1, BHE =0, băng cao hoạt động và ([BX])
 AL qua 8 bit cao của bus dữ liệu: D8-D15

• Chu kỳ thứ hai: A0=0, BHE =1, băng thấp hoạt động và
([BX]+1)  AL qua 8 bit thấp của bus: D0-D7

Như vậy, việc tổ chức bộ nhớ cho hệ 16 bit 8086 sẽ phải phân đôi các IC
nhớ. Một nửa ghép nối với 8 bit dữ liệu thấp D0-D7 và được điều khiển bởi
bit A0 và nửa còn lại ghép với 8 bit cao D8-D15 và được điều khiển bằng bit
BHE . Tuy nhiên cũng khuyến cáo cho người lập trình là việc tổ chức dữ liệu

trong bộ nhớ để thâm nhập word phải có địa chỉ chẵn để tăng tốc độ truy cập
bộ nhớ khi trao đổi dữ liệu theo word.
3.3.3.1. Các bước tổ chức bộ nhớ

- Xác định số lượng IC cần tổ chức: các IC được chọn phải cùng loại. Ví
dụ, tổ chức bộ nhớ có dung lượng 16K*8bit, thì phải sử dụng 1 IC dung lượng
16K*8bit, hoặc 2 IC dung lượng 8K*8bit, hoặc 4 IC dung lượng 4K*8bit.

101
- Xác định số đường địa chỉ chọn ô nhớ: số lượng này tùy thuộc vào
dung lượng của IC thành phần, không phụ thuộc vào tổng dung lượng của bộ
nhớ cần tổ chức.

- Xây dựng bản đồ địa chỉ: xác định địa chỉ cho từng ô nhớ, phải đảm
bảo là mỗi ô nhớ có địa chỉ duy nhất, 2 ô nhớ kế nhau có địa chỉ hơn kém
nhau một đơn vị, bộ nhớ RAM phải bắt đầu từ địa chỉ 00000H (nếu hệ thống
sử dụng ngắt để chứa bảng vectơ ngắt), bộ nhớ ROM phải chứa địa chỉ khởi
động (FFFF0H)

- Xây dựng mạch: các đường địa chỉ chọn ô nhớ được đưa tới tất cả các
IC nhớ. Các đường địa chỉ còn lại được đưa tới mạch giải mã để đưa tới các
̅̅̅̅ hoặc ̅̅̅̅
chân 𝐶𝑆 𝐶𝐸 của IC nhớ.

3.3.4. Tổ chức bộ nhớ RAM cho 8086

Để hiểu rõ việc tổ chức bộ nhớ RAM cho 8086 ta xét ví dụ sau:

Ví dụ:

Tổ chức bộ nhớ RAM có dung lượng 32K*8bit dùng cho hệ, bắt đầu từ
địa chỉ 14000h. Sử dụng IC nhớ RAM có dung lượng 8K*8bit để thực hiện.

+ Số lượng IC nhớ phải dùng: 4 IC nhớ RAM dung lượng 8K*8bit, 2 IC


cho băng chẵn, 2 IC cho băng lẻ.

+ Số đường địa chỉ chọn ô nhớ: 13 đường từ A1-A13

+ Bản đồ địa chỉ: bộ nhớ được chia thành hai băng chẵn và lẻ tương ứng
với giá trị của A0 và BHE như trên Bảng 3.7

+ Sơ đồ tổ chức: bit địa chỉ A0 sử dụng để phân băng bộ nhớ, do đó các


bit địa chỉ từ A1-A13 được đưa trực tiếp vào các IC để chọn ô nhớ, A0 và
BHE được đưa vào bộ giải mã. Sơ đồ tổ chức bộ nhớ trong hệ vi xử lý 8086

(chế độ MIN) sử dụng các mạch logic cơ bản để giải mã, Hình 3.13; sử dụng
mạch giải mã 74LS138, Hình 3.14.

102
Bảng 3.7. Bản đồ địa chỉ tổ chức bộ nhớ RAM (32K*8), sử dụng IC RAM (8K*8)
Băng chẵn: A0=0 ( BHE =x)

A19-A16 A15-A12 A11-A8 A7-A4 A3-A0 Số HEX IC


0001 0100 0000 0000 0000 14000h
... ... ... ... ... ... RAM 2
0001 0111 1111 1111 1110 17FFEh
0001 1000 0000 0000 0000 18000h
... ... ... ... ... ... RAM 4
0001 1011 1111 1111 1110 1BFFEh
Băng lẻ A0=1 ( BHE = 0 )

A19-A16 A15-A12 A11-A8 A7-A4 A3-A0 Số HEX IC


0001 0100 0000 0000 0001 14001h
... ... ... ... ... ... RAM 1
0001 0111 1111 1111 1111 17FFFh
0001 1000 0000 0000 0001 18001h
... ... ... ... ... ... RAM 3
0001 1011 1111 1111 1111 1BFFFh

A1-A13 RAM2 D0 – D7
̅̅̅̅̅
WR WR
̅̅̅̅
RD RD D8 – D15
CS
A0
A15,A17-A19
A14 RAM4
A16
M⁄̅̅̅
IO WR
RD
CS
A0
A14,A17-A19
A15 RAM1
A16
WR
M⁄̅̅̅
IO
RD
̅̅̅̅̅̅
BHE CS
A15,A17-A19
A14 RAM3
A16
M⁄IO̅̅̅ WR
RD
̅̅̅̅̅̅
BHE CS
A14,A17-A19
A15
A16
M⁄IO ̅̅̅

Hình 3.13. Tổ chức bộ nhớ RAM sử dụng mạch logic để giải mã

103
A1-A13
RAM2 D0 – D7
WR
RD D8 – D15
A0 CS
A14 A 𝑌̅0
A15 B RAM4
𝑌̅1
A16 C WR
𝑌̅2
RD
𝑌̅3 CS
A17 𝑌̅4
G2A
A18 – A19 𝑌̅5
G2B
RAM1
𝑌̅6 WR
M⁄̅̅̅
IO G1 𝑌̅7 RD
CS
74LS138
̅̅̅̅̅̅
BHE
RAM3
WR WR
RD RD
CS

Hình 3.14. Tổ chức bộ nhớ RAM sử dụng mạch 74LS138 để giải mã

- Trong chế độ MAX, việc tổ chức bộ nhớ cũng tương tự như chế độ
MIN. Chỉ khác là các tín hiệu ̅̅̅̅̅̅̅̅ ̅̅̅̅̅̅̅̅̅ được đưa vào thay thế cho
MRDC và MWTC
RD WR, đồng thời cũng thay thế việc xác nhận thâm nhập bộ nhớ M⁄̅̅̅
̅̅̅̅ và ̅̅̅̅̅ IO. Sơ
đồ tổ chức bộ nhớ RAM cho 8086 (làm việc ở chế độ MAX) trên Hình 3.15.

- Ta có thể suy rộng ra cách tổ chức cho các hệ 32 bit (80386). Trong các
hệ 32 bit của Intel đều cho phép thâm nhập byte, word, dword ở địa chỉ bất
kỳ. Do đó, miền bộ nhớ của nó được chia thành 4 băng và để quản lý được
các băng các bộ vi xử lý 32 bit của Intel sử dụng các tín hiệu BE0, BE1, BE2,
BE3 tương ứng giống A0 và ̅̅̅̅̅̅
BHE trong 8086. Các bit địa chỉ lúc này được
thiết kế trong mạch tương ứng từ A2-A31, còn A0, A1 sẽ không được sử
dụng

104
- Với hệ 16 bit khác như ZILOG hay MOTOROLA, điều này có khác vì
khi thâm nhập word, họ này được thiết kế chỉ cho phép với địa chỉ chẵn.

A1-A13
RAM2 D0 – D7
WR
RD D8 – D15
A0 CS
A14 A 𝑌̅0
A15 B RAM4
𝑌̅1
A16 C WR
𝑌̅2
RD
𝑌̅3 CS
A17 𝑌̅4
G2A
A18 – A19 𝑌̅5
G2B
RAM1
𝑌̅6 WR
G1 𝑌̅7 RD
CS
74LS138
̅̅̅̅̅̅
BHE
RAM3
̅̅̅̅̅̅̅̅̅
MWTC WR
̅̅̅̅̅̅̅̅
MRDC RD
CS

Hình 3.15. Tổ chức bộ nhớ RAM cho 8086 (làm việc ở chế độ MAX)

3.3.5. Tổ chức bộ nhớ ROM cho 8086

Việc tổ chức bộ nhớ ROM cho 8086 được thực hiện tương tự như việc tổ
chức bộ nhớ RAM. Tuy nhiên, bộ nhớ ROM phải chứa địa chỉ khởi động
FFFF0h. 8086 có khả năng quản lý tối đa không gian nhớ 1MB với địa chỉ
cuối cùng là FFFFFh. Từ địa chỉ khởi động đến địa chỉ cuối cùng là 16B, trên
thực tế không có IC nhớ nào có dung lượng  16B. Do vậy, khi tổ chức bộ
nhớ ROM có địa chỉ cuối là FFFFFh sẽ thỏa mãn điều kiện chứa địa chỉ khởi
động. Để hiểu rõ hơn ta xét ví dụ sau:

105
Ví dụ: Tổ chức bộ nhớ ROM có dung lượng 64K*8bit dùng cho hệ
8086. Sử dụng IC nhớ ROM có dung lượng 16K*8bit

+ Số lượng IC nhớ phải dùng: 4 IC nhớ ROM dung lượng 16K*8bit, 2


IC cho băng chẵn, 2 IC cho băng lẻ.

+ Số đường địa chỉ chọn ô nhớ: 14 đường từ A1-A14

+ Bản đồ địa chỉ: được thực hiện trên Bảng 3.8

+ Sơ đồ tổ chức: Sơ đồ tổ chức cho 8086 làm việc ở chế độ MIN, Hình


3.16; ở chế độ MAX, Hình 3.17.

Bảng 3.8. Bản đồ địa chỉ tổ chức bộ nhớ ROM (64K*8), sử dụng IC ROM
(16K*8)
Băng chẵn: A0=0 ( BHE =x)

A19-A16 A15-A12 A11-A8 A7-A4 A3-A0 Số HEX IC


1111 1111 1111 1111 1110 FFFFEh
... ... ... ... ... ... ROM 2
1111 1000 0000 0000 0000 F8000h
1111 0111 1111 1111 1110 F7FFEh
... ... ... ... ... ... ROM 4
1111 0000 0000 0000 0000 F0000h
Băng lẻ A0=1 ( BHE = 0 )

A19-A16 A15-A12 A11-A8 A7-A4 A3-A0 Số HEX IC


1111 1111 1111 1111 1111 FFFFFh
... ... ... ... ... ... ROM 1
1111 1000 0000 0000 0001 F8001h
1111 0111 1111 1111 1111 F7FFEh
... ... ... ... ... ... ROM 3
1111 0000 0000 0000 0001 F0001h

106
A1-A14
ROM4 D0 – D7
WR
D8 – D15
A0 CE
A15 A 𝑌̅0
A16 B ROM2
𝑌̅1
A17 WR
C 𝑌̅2
𝑌̅3 CE
𝑌̅4
A18 G2A
A19 𝑌̅5 ROM3
G2B
𝑌̅6 WR
̅̅̅
M⁄IO 𝑌̅7
G1
CE
74LS138
̅̅̅̅̅̅
BHE
ROM1
WR WR

CE

Hình 3.16. Tổ chức bộ nhớ ROM cho 8086 làm việc ở chế độ MIN

A1-A14
ROM4 D0 – D7
WR
D8 – D15
A0 CE
A15 A 𝑌̅0
A16 B ROM2
𝑌̅1
A17 WR
C 𝑌̅2
𝑌̅3 CE
𝑌̅4
A18 G2A
𝑌̅5 ROM3
A19 G2B
𝑌̅6 WR
̅̅̅̅̅̅̅̅
MRDC 𝑌̅7
G1
CE
74LS138
̅̅̅̅̅̅
BHE
ROM1
WR

CE

Hình 3.17. Tổ chức bộ nhớ ROM cho 8086 làm việc ở chế độ MAX

107
3.4. Ghép nối bộ vi xử lý 8086 với cổng vào/ra

3.4.1. Nguyên tắc ghép nối

Đối với họ 80x86 nói chung có 2 cách phối ghép CPU với các cổng vào ra:
Cổng vào ra có không gian địa chỉ tách biệt với bộ nhớ; cổng vào ra có địa chỉ
chung với bộ nhớ

00000H

1MB 00000H 00000H


64KB 64KB
FFFFFH FFFFFH FFFFFH

Bộ nhớ Cổng vào Cổng ra


Lệnh: MOV IN OUT
Tín hiệu điều khiển: M⁄̅̅̅
IO = 1 M⁄̅̅̅
IO = 0 M⁄̅̅̅
IO = 0

a. Không gian riêng biệt cho bộ nhớ và cổng vào ra

00000H Kiểu lệnh và tín hiệu điều khiển


chung cho cả hai:
Vào/ra Bộ nhớ
MOV
M⁄̅̅̅
IO = 0
FFFFFH

b. Không gian chung cho bộ nhớ và cổng vào/ra

Hình 3.18. Phân vùng địa chỉ cho bộ nhớ và cổng vào ra

❖ Cổng vào/ra có không gian địa chỉ tách biệt

Trong cách phối ghép này, bộ nhớ được độc quyền dùng không gian nhớ
1MB mà CPU dành cho nó. Các cổng vào/ra sẽ được dành riêng một không
gian 64KB cho mỗi loại cổng vào hoặc cổng ra. Khi đó phải dùng tín hiệu
M⁄̅̅̅
IO và các lệnh thích hợp, Hình 3.18.a

108
❖ Cổng vào/ra và bộ nhớ có chung không gian địa chỉ

Trong cách phối ghép này, bộ nhớ và cổng vào/ra cùng chia nhau không
gian địa chỉ 1MB mà CUP 8086 có khả năng địa chỉ hoá. Các cổng vào/ra
chiếm một vùng nào đó trong không gian 1MB, phần còn lại là của bộ nhớ.
Trong trường hợp này dùng chung tín hiệu M⁄̅̅̅
IO = 0 và lệnh trao đổi dữ liệu
kiểu MOV cho cả bộ nhớ và cổng vào/ra, Hình 3.18.b
❖ Giải mã địa chỉ cho cổng vào/ra

Việc giải mã địa chỉ cho cổng vào/ra cũng gần giống như việc giải mã
địa chỉ cho mạch nhớ. Thông thường các cổng có địa chỉ 8 bit tại A0-A7,
trong một số hệ vi xử lý khác (như máy IBM PC) các cổng có địa chỉ 16 bit
tại A0-A15. Tuỳ theo độ dài của toán hạng trong lệnh là 8 bit hay 16 bit ta sẽ
có 1 cổng 8 bit hay 2 cổng 8 bit có địa chỉ liền nhau để tạo nên từ với độ dài
tương ứng. Trong thực tế ít có hệ sử dụng hết 256 cổng vào/ra khác nhau nên
ta chỉ xét ở đây các bộ giải mã địa chỉ 8 bit A0-A7 và mạch giải mã thông
dụng có sẵn (như 74LS138) để tạo các xung chọn thiết bị.

+ Các mạch giải mã đơn giản có thể tạo được từ mạch logic như Hình 3.19

Địa chỉ cổng vào Địa chỉ cổng ra

M⁄̅̅̅
IO M⁄̅̅̅
IO
̅̅̅̅
RD ISP ̅̅̅̅̅
WR OSP

(Xung chọn cổng vào) (Xung chọn cổng ra)

Hình 3.19 Mạch giải mã địa chỉ đơn giản cho cổng vào ra

Trong trường hợp cần nhiều xung chọn ở đầu ra cho các cổng vào/ra có
thể dùng các mạch giải mã có sẵn 74LS138. Ví dụ trên Hình 3.20 trình bày 2
mạch tương tự nhau dùng 74LS138 để giải mã địa chỉ cho 8 cổng vào và 8
cổng ra. Trên cơ sở mạch này ta cũng có thể phối hợp với cả 2 tín hiệu đọc và

109
ghi để tạo ra tín hiệu chọn việc đọc/ghi từng cổng vào/ra cụ thể. Bộ giải mã
như vây được minh hoạ trên Hình 3.21.

A0 ̅̅̅̅̅̅
BHE
̅̅̅̅̅̅
ISP0 ̅̅̅̅̅̅̅
OSP0
A1 A y0 A1 A y0
A2 B y1 A2 B y1
A3 A3 C y2
C y2 . .
. .
y3 y3
A4-A7 . A4-A7 .
G2B y4 G2B y4
y5 y5
RD G2A y6 ̅̅̅̅̅̅ WR G2A y6 ̅̅̅̅̅̅̅
OSP7
ISP7
̅̅̅
M⁄IO G1 y7 ̅̅̅
M⁄IO G1 y7

a) Giải mã cổng có địa chỉ chẵn b) Giải mã cổng có địa chỉ lẻ


từ F0H-FEH từ F1H-FFH

Hình 3.20. Các bộ giải mã cổng vào ra: a) 8 cổng vào; b) 8 cổng ra
̅̅̅̅̅̅
BHE
̅̅̅̅ (78H)
ISP
A1 A y0
A2 B y1
...
RD C y2
̅̅̅̅
ISP (7EH)
y3
M⁄̅̅̅
IO G2B y4 ̅̅̅̅̅
OSP (79H)
A3-A6
y5
...
G2A y6
WR ̅̅̅̅̅ (7FH)
G1 y7 OSP
A7
A0

Hình 3.21. Một bộ giải mã cho cổng vào địa chỉ chẵn: 78H- 7EH, cổng ra
địa chỉ lẻ: 79H-7FH

3.4.2. Ghép nối với cổng vào/ra đơn giản

Trong thực tế có rất nhiều vi mạch tổ hợp cỡ vừa có thể được dùng làm
cổng phối ghép với bộ vi xử lý để vào/ra dữ liệu. Các mạch này thường được
cấu tạo nên từ các mạch chốt 8 bit có đầu ra 3 trạng thái (74LS373: kích theo

110
mức, 74LS374: kích theo sườn), các mạch khuếch đại đệm 8 bit một chiều
đầu ra 3 trạng thái (74LS240, 74LS244 đầu ra đảo hoặc không đảo) hoặc các
mạch khuếch đại đệm 2 chiều 8 bit đầu ra 3 trạng thái (74LS245). Chúng
được dùng trong các phối ghép đơn giản để làm cho CPU và thiết bị ngoại vi
hoạt động tương thích với nhau, ví dụ: để đệm bus hoặc làm các mạch cổng
để tạo các tín hiệu móc nối....

Trên Hình 3.22. sử dụng mạch 74LS373 làm cổng ra, để đưa dữ liệu ra
cổng thực hiện lệnh OUT 79H, AL.

D0 D Q Q0
. .
Bus dữ liệu . Thiết bị ra
. Clk
của CPU .
.
D7 Q7

̅̅̅̅̅
OSP 79H G ̅̅̅̅
OC

Hình 3.22. Một mạch phối ghép ra đơn giản dùng 74LS373

Trên Hình 3.23. Sử dụng mạch 74LS244 làm cổng vào, để đọc tín hiệu từ
thiết bị ngoại vi thực hiện lệnh IN AL,78H

D0 Q0
. .
. Tới Bus dữ liệu
Từ thiết bị vào . .
.
của CPU
. .
.
D7 Q7
‘244

̅̅̅̅̅ 78H
OSP OC1 OC2

Hình 3.23. Một mạch phối ghép ra đơn giản dùng 74LS244

111
3.4.3. Ghép nối với cổng vào/ra song song dùng 8255A

3.4.3.1. Sơ đồ cấu trúc

Mạch 8255A thường được gọi là mạch phối ghép vào/ra song song lập
trình được (PPI). Do khả năng mềm dẻo trong các ứng dụng thực tế, 8255A là
mạch phối ghép được dùng rất phổ biến cho các hệ vi xử lý 8-16-32 bit. Sơ đồ
khối chức năng bên trong của PPI 8255A được thể hiện trên Hình 3.24.

PA0-PA7
Nhóm A
Cổng A

Điều
khiển PC4-PC7
Nhóm A Nhóm A
Cổng C
Nửa cao

D0-D7 Đệm
số liệu

PC0-PC3
Nhóm B
Cổng C
Nửa thấp
RD
Điều
WR khiển
Logic Nhóm B PB0-PB7
A0 điều
Nhóm B
A1 khiển
Cổng B
Reset đọc/ghi

CS

Hình 3.24. Sơ đồ khối chức năng của 8255A

. + PA, PB, PC: là 3 cổng vào/ra, chúng là những thanh ghi 8 bit để
đọc/ghi dữ liệu. Trong đó các cổng PA, PB là loại 8 bit 2 chiều. Cổng PC có
thể làm cổng vào/ra độc lập hay được chia thành 2 nửa làm tín hiệu bắt tay cho
các cổng PA, PB tuỳ theo mode làm việc.

112
+ Thanh ghi từ điều khiển (CWR): để ghi từ điều khiển quá trình làm việc
của 8255A

+ Khối đệm bus: để ghép nối với bus hệ thống.

+ Khối logic điều khiển: nhận các tín hiệu từ hệ vi xử lý, tạo tín hiệu để
điều khiển hoạt động của các khối. Việc lựa chọn các thanh ghi cổng và thanh
ghi từ điều khiển CWR được thực hiện bằng các bit địa chỉ A1 và A0 như
Bảng 3.9

Bảng 3.9. Các bit thâm nhập thanh ghi


CS A1 A0 Chọn ra
1 x x Không chọn
0 0 0 PA
0 0 1 PB
0 1 0 PC
0 1 1 CWR

3.4.3.2. Sơ đồ chân tín hiệu:

Sơ đồ chân tín hiệu của 8255A trên Hình 3.25.

Hình 3.25. Tổ chức chân tín hiệu của 8255A

113
+ Các chân PA0-PA7, PB0-PB7 và PC0-PC7: các chân tín hiệu vào/ra,
tương ứng với các thanh ghi cổng PA, PB và PC. Các chân tín hiệu này được
nối tới các đường dữ liệu hay với các tín hiệu điều khiển ngoại vi.

+ Các chân D0-D7: các chân tín hiệu vào/ra 3 trạng thái, được nối với 8
bit dữ liệu của bus hệ thống. Chúng được sử dụng để trao đối dữ liệu giữa
CPU với cổng hay để đưa lệnh từ CPU ra 8255A hoặc đọc byte trạng thái về
CPU.

+ Chân A1, A0: các chân tín hiệu vào để chọn các cổng vào/ra của 8255A
như trong Bảng 3.9. Các chân này được nối với 2 bit địa chỉ trong bus địa chỉ
của hệ vi xử lý

+ Chân CS: chọn chip, có mức tích cực âm. CS=0 cho phép 8255A làm
việc, tức là khi đó CPU mới có thể thực hiện đọc hay ghi tới các thanh ghi bên
trong của 8255A. Chân CSnày được nối tới đầu ra của bộ giải mã chọn cổng.
Đầu vào bộ giải mã này có các tín hiệu địa chỉ của bus hệ thống để thâm nhập
cổng, trừ 2 bit địa chỉ đã nối vào các chân A0, A1 ở trên.

+ Các chân RD, WR : các chân tín hiệu vào mức tích cực âm, nó được nối
trực tiếp với các chân điều khiển quá trình đọc hay ghi của CPU với các thanh
ghi trong 8255A.

+ Chân Reset: phải được nối với tín hiệu Reset chung của toàn hệ (khi
Reset thì các cổng được định nghĩa là cổng vào để không gây ra sự cố cho các
mạch điều khiển).

3.4.3.3. Từ điều khiển của 8255A

8255A có hai từ điều khiển, chúng có cùng một địa chỉ và được phân biệt
bằng bit D7.

+ Từ điều khiển định nghĩa cấu hình cho các cổng PA, PB, PC.

+ Từ điều khiển lập/xoá từng bit ở đầu ra của PC

114
Tùy theo từ lệnh được ghi vào thanh ghi điều kiển khi khởi động của vi
mạch mà ta có các cổng PA, PB, PC sẽ hoạt động ở chế độ nào và là cổng ra
hay cổng vào

❖ Từ điều khiển định nghĩa cấu hình cho các cổng

Dạng thức từ điều khiển định nghĩa cấu hình cho 8255A trên Hình 3.26

D7 D6 D5 D4 D3 D2 D1 D0
1 MA1 MA0 A CA MB B CB
NHÓM B
NHÓM A
PCL (thấp)
Chọn chế độ
1: Vào
00: Mode 0 0: Ra
01: Mode 1
1x: Mode2
PB
PA 1: Vào
0: Ra
1: Vào
0: Ra
Chọn chế độ
PCH (cao) 0: Mode 0
1: Mode 1
1: Vào
0: Ra

Hình 3.26. Từ điều khiển định nghĩa cấu hình của 8255A

❖ Từ điều khiển lập/xoá bit ra PCi:

Dạng thức của từ điều khiển lập/xoá PCi trên Hình 3.27

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 S/R
1: Lập bit
Mã hoá PCi 0: Xóa bit
000: PC0
...
111: PC7

Hình 3.27. Từ điều khiển lập/xoá PCi của 8255A

115
3.4.3.4. Các chế độ làm việc của 8255A

Các chế độ (Mode) làm việc của 8255A có thể được định nghĩa bằng từ
điều khiển CWR, và có 4 chế độ làm việc:

❖ Chế độ 0: Vào/ra cơ sở

Trong chế độ này các cổng PA, PB, PCH, PCL đều có thể được định nghĩa
là các cổng ra hay vào độc lập và làm việc theo phương thức trao đổi dữ liệu
không điều kiện. Trong chế độ này các cổng ra được chốt còn các cổng vào
không được chốt. Đồ thị thời gian trên Hình 3.28.

RD
tRR
tIR tWR

INPUT
tAR tRA
CS, A1, A 0
tRD tDR
D7-D0

a. Vào cơ sở

WR tWW
Wt D tWD
W
D0-D7
tAW tWA
CS, A1, A 0
tWO

INPUT

b. Ra cơ sở

Hình 3.28. Đồ thị thời gian Mode 0 (vào/ra cơ sở)

̅̅̅ phải được ổn định trước khi


Khi là cổng vào, các tín hiệu địa chỉ và CS
̅̅̅̅ xuất hiện một khoảng thời gian tAR. Dữ liệu được đọc vào 8255A
có xung RD
cũng phải ổn định trước một khoảng thời gian t IR ở cổng vào. Sau sườn trước
xung khoảng thời gian t RD, dữ liệu được đọc ra bus. Bus địa chỉ được thả nổi

116
̅̅̅̅ một khoảng thời gian t RA. Quá trình ghi cũng tương
sau khi kết thúc xung RD
tự

❖ Chế độ 1: Vào/ra có xung cho phép

Cổng PA, PB được định nghĩa có thể là cổng ra hoặc cổng vào, khi đó
PC là các tín hiệu đối thoại cho 2 cổng PA, PB

Sơ đồ ghép nối, và các thanh ghi trạng thái của 8255A ở Mode 1 được
thể hiện trên Hình 3.29.

PA PA
INTEA INTEA
PC4
PC7 OBFA STBA
PC6 ACKA PC5 IBFA

D0-D7 INTRA
D0-D7 PC3 INTRA PC3

INTEB INTEB
PC2
PC1 OBFB STBB
PC2 ACK B PC1 IBFB

WR RD

PC0 PC0 INTRB


INTRB
PB PB
PC4,5
PC4,5 I/O I/O

a. Ra b. Vào
D7 D6 D5 D4 D3 D2 D1 D0

OBFA INTEA I/O I/O INTRA INTEB OBFB INTRB

c. Tín hiệu trạng thái ra

D7 D6 D5 D4 D3 D2 D1 D0

I/O I/O IBFA INTEA INTRA INTEB IBFB INTRB

d. Tín hiệu trạng thái vào

Hình 3.29. Mạch 8255A ở chế độ 1 và các tín hiệu trạng thái

117
Hoạt động của 8255A khi nhập/xuất thông tin ra cho ngoại vi ở Mode 1
được mô tả bằng đồ thị thời gian trên Hình 3.30.
tST
STB

tSIB
IBF
tSIT tRIS

INTR tRIT

RD
tPS tPH

INPUT

a. Vào chốt
tW
WR
W

tAOB
OBF
tWDB
INTR tAK
tWIT

ACK
t

OUTPUT

b. Ra chốt
Hình 3.30. Biểu đồ thời gian các tín hiệu của 8255A ở mode 1

+ Quá trình ghi dữ liệu:

- ̅̅̅̅̅̅
OBF (Ouput buffer full ): Tín hiệu ra, khi tín hiệu có mức logic 0 báo
cho ngoại vi biết CPU đã đưa dữ liệu ra cổng PA hoặc PB.

̅̅̅̅̅̅ (Acknowledge): Tín hiệu trả lời của thiết bị ngoại vi tới 8255A.
- ACK
Tín hiệu có mức logic 0 thiết bị ngoại vi đã nhận được dữ liệu.

- INTR (Interruptt): Dùng để phản ánh yêu cầu ngắt tới CPU. Nó chịu tác
động bởi các tín hiệu khác của 8255A trong quá trình đối thoại với thiết bị
̅̅̅̅̅̅ = 1, ̅̅̅̅̅̅
ngoại vi. INTR được thiết lập bởi ACK OBF = 1 và INTE=1. INTR bị
xoá bởi sườn sau của xung ̅̅̅̅̅
WR.

118
- INTE là tín hiệu của một mạch lật bên trong 8255A để cho phép hoặc
cấm yêu cầu ngắt INTR. Tín hiệu INTE được kiểm soát bởi việc lập/xóa của
bit PC6(đối với cổng PA), PC2(đối với cổng PB)

 Khi ghi dữ liệu ra cổng chương trình phải thực hiện các công việc sau:

- Trước tiên đọc byte trạng thái (đọc cổng PC) và kiểm tra cờ OBF . Nếu
̅̅̅̅̅̅ ̅̅̅̅̅ ghi dữ
OBF = 1 (cổng ra rỗng) thực hiện việc đưa dữ liệu ra cổng. Xung WR
̅̅̅̅̅̅ = 0 báo cho ngoại vi nhận dữ liệu.
liệu vào cổng đồng thời đặt cờ OBF

- Khi nhận xong dữ liệu ngoại vi gửi xung ACK tới 8255A, xung này xoá
cờ ̅̅̅̅̅̅
OBF = 1, cổng lại ở trạng sẵn sàng nhận dữ liệu.

Nếu sử dụng ngắt để điều khiển vào/ra dữ liệu, khi đó bit cờ INTR được
nối với chân INTR của CPU qua mạch điều khiển ngắt để chuyển tín hiệu ngắt
tới CPU (vấn đề này được trình bày ở chương 4).

+ Quá trình đọc dữ liệu:

- ̅̅̅̅̅
STB (Strobe input): Tín hiệu từ ngoại vi đưa tới, tín hiệu xuống mức “0”
sẽ nạp dữ liệu vào bộ đệm chốt dữ liệu của cổng PA hoặc PB.

- IBF (Input buffer full): Tín hiệu báo cho ngoại vi biết dữ liệu đã được
nạp ở cổng PA hoặc PB. IBF được thiết lập “1” bởi mức thấp của ̅̅̅̅̅
STB, và xoá
về “0” bởi sườn trước của xung RD

- INTR (Interupt) : Tín hiệu ra yêu cầu ngắt cho CPU. INTR được set bởi
STB=1, IBF=1 và INTE=1, INTR bị xoá về 0 bởi sườn trước của xung RD

- INTE được kiểm soát bởi việc lập/xóa bit PC4(đối với cổng PA), PC2
(đối với cổng PB)

Khi đọc dữ liệu từ cổng chương trình phải thực hiện các công việc sau:

- Đọc byte trạng thái (cổng PC) và kiểm tra cờ IBF. Nếu IBF=1 (dữ liệu
đã có ở cổng PA hoặc PB) thì nhận dữ liệu từ cổng, IBF bị xóa về “0” bởi
sườn sau của xung đọc RD .

119
̅̅̅̅ = 0
Trong biểu đồ thời gian, Hình 3.30. Trường hợp đọc, khi xung RD
cho phép đọc dữ liệu từ cổng, đồng thời đưa tín hiệu INTR về 0. Sườn sau của
̅̅̅̅ sẽ xoá IBF về 0. Trường hợp ghi, khi xung WR
RD ̅̅̅̅̅ = 0 cho phép ghi dữ liệu

ra cổng, đồng thời xoá tín hiệu INTR và OBF về 0 để báo cho ngoại vi biết bộ
đệm ra đã có dữ liệu.

❖ Chế độ 2: bus 2 chiều

Trong chế độ này chỉ riêng cổng PA được định nghĩa để làm việc như một
cổng 2 chiều có các tín hiệu móc nối do một số bit của PC đảm nhiệm. Còn PB
thì có thể làm việc ở chế độ 1 hoặc 0 tuỳ theo các bit điều khiển trong CWR.
Các chân tín hiệu còn lại của PC có thể được định nghĩa để làm việc như các
chân vào hoặc ra, hoặc phục vụ cho cổng PB, được thể hiện trên Hình 3.31.

D0-D7 PA D0-D7 PA
INTRA
PC3 INTRA PC3

PC7 OBFA PC7 OBFA


PC6 ACKA PC6 ACKA
INTE1 INTE1

PC5 IBFA PC5 IBFA

PC4 STBA PC4 STBA


INTE2 INTE2
PB
PB PC1
PC1
WR WR OBFB
PC2
PC2 ACKB
RD PC0-PC2 I/O RD
PC0
PC0 INTRB

a) PA: chế độ 2 b) PA: chế độ 2


PB: chế độ 0, vào PB: chế độ 1, ra
PC0-PC2: I/O tuỳ ý theo
từ điều khiển

Hình 3.31. Sơ đồ 8255A làm việc ở mode 2

120
+ INTRA: yêu cầu ngắt cho dữ liệu 2 chiều vào/ra

+ INTE1, INTE2: là 2 tín hiệu của 2 mạch lật bên trong 8255A để cho
phép hoặc cấm yêu cầu ngắt của PA, các bit này được lập/xoá bởi PC6 và PC4
của PC.

Khi làm việc ở chế độ truyền thông tin 2 chiều (mode2), thanh ghi trạng
thái của 8255A cung cấp các thông tin phản ánh trạng thái hiện hành của
mình. Nếu hệ vi xử lý cần những thông tin này thì chỉ cần vào để thẩm định.
Nội dung thanh ghi trạng thái được thể hiện trên Hình 3.32.

D7 D6 D5 D4 D3 D2 D1 D0

OBFA INTE1 IBFA INTE2 INTRA I/O I/O I/O

Hình 3.32. Tín hiệu trạng thái ở mode 2

Biểu đồ thời gian các tín hiệu của 8255A ở mode 2 được biểu diễn trên
Hình 3.33.

tST
WR

tAOB
OBFA
tWOB

INTRA

ACK A tAK
STBA tST

tSIB
IBF
tPS tAD tRD
BUS dl
Của I/O
tPH
RD

Hình 3.33. Biểu đồ thời gian các tín hiệu của 8255A ở mode 2

121
Theo biểu đồ thời gian thì khi xuất dữ liệu, bit OBF tích cực khi tác động
của sườn lên xung WR để ghi dữ liệu ra 8255A đồng thời bit ACK phải đang ở
mức 1, và khi ACK xuống mức 0 sẽ đưa dữ liệu ra ngoại vi đồng thời xoá cờ
OBF. Khi nhập dữ liệu mức 0 của STBchốt dữ liệu vào cổng đồng thời đặt cờ

IBF lên 1. Sườn lên của xung RD đọc dữ liệu vào CPU đồng thời xoá cờ IBF.

❖ Một số ví dụ về ghép nối 8086 với 8255A

Ví dụ 1: sử dụng 8255A thiết kế một cổng vào trao đổi dữ liệu 16 bit
(mode 1), 1 cổng ra trao đổi dữ liệu 8 bit (mode 1), 1 cổng vào trao đổi dữ
liệu 8 bit (mode 0). Viết đoạn chương trình thực hiện nhận 1 byte dữ liệu từ
cổng vào 8 bit và gửi ra cổng ra 8 bit.

Giải

+ Xác định địa chỉ các cổng và nội dung của các CWR:

- Sơ đồ ghép nối được thực hiện trên Hình 3.34.

- Sử dụng 2 cổng PB làm cổng vào trao đổi dữ liệu 16 bit mode 1, địa
chỉ 62h

- Sử dụng PA (8255A-1) làm cổng ra trao đổi dữ liệu 8 bit mode 1, địa
chỉ 60h

- Sử dụng PA (8255A-2) làm cổng vào trao đổi dữ liệu 8 bit mode 0,
địa chỉ 61h

- Địa chỉ PC (8255A-1): 64h

- Địa chỉ PC (8255A-2): 65h

- Địa chỉ CWR (8255A-1): 0110 0110=66h

- Địa chỉ CWR (8255A-2): 0110 0111=67h

- Nội dung CWR (8255A-1): 1010 0110=0A6h

- Nội dung CWR (8255A-2): 1001 0110=96h

122
D0-D7
D0-D7
PA
RD RD PC7 OBFA
WR WR PC6 ACKA
A2 A1
A1 A0
PB
A0 PC2
CS
A3 A y0 8255A -1
A5 B y1 D8-D15
A7 C y2 D0-D7
PA
y3
̅̅̅̅̅ y4 RD
A4 G 2A

M / IO ̅̅̅̅̅
G y5 WR
2B
y6 A1
y7 A0 D0-D15
A6 G1 PB
PC1 IBFB
74LS138 PC2 STBB
BHE CS
8255A-2

Hình 3.34. Sử dụng 8255A thiết kế 1 cổng vào 16 bit mode 1; 1 cổng ra
8 bit mode1; 1 cổng vào 8 bit mode 0 cho hệ vi xử lý 8086

+ Chương trình

MOV AL, 0B6h ; Thiết lập cấu hình cho 8255A-1

OUT 64h, AL ; theo yêu cầu đầu bài

MOV AL, 96h ; Thiết lập cấu hình cho 8255A-2

OUT 65h, AL ; theo yêu cầu đầu bài

IN AL, 61h ; Nhận dữ liệu từ cổng PA của 8255A-1.

MOV BL, AL ; Cất byte dữ liệu nhận được

dlpc:

IN AL, 64h ; Đọc cổng PC (8255A-1)

123
AND AL, 80h ; để kiểm tra tín hiệu ̅̅̅̅̅̅
OBF

CMP AL, 80h ; tức chân PC7 của 8255A-1

JNZ dlpc ̅̅̅̅̅̅ = 0, đọc và kiểm


; Đọc và kiểm tra lại nếu OBF
tra lại.

MOV AL, BL ̅̅̅̅̅̅ = 0, gửi byte dữ liện nhận được


; Nếu OBF

OUT 60h, AL ; ra cổng PA của 8255A-2

Ví dụ 2: Sơ đồ ghép nối 8255A với 8086 trên Hình 3.35. Lập trình để bit
PC3 của 8255A tạo ra 256 xung với chu kỳ T = 50 ms. Giả thiết có sẵn
chương trình con làm nhiệm vụ trễ 25 ms có tên là Delay25ms.

D0-D7 D0-D7
A3 A1
A2 PC3
A0
̅̅̅̅
RD RD
̅̅̅̅̅
WR WR
A4 A
y0
A5 B
A6 y1
C
y2 CS
y3
A0 ̅̅̅̅̅
G 8255A
2A y4
A1 ̅̅̅̅̅
G2B y5
y6
A7
̅ G1 y7
IO/M
74LS138

Hình 3.35. Sơ đồ ghép nối 8086 với 8255A


Giải:

- Địa chỉ của CWR: 8Ch


- Nội dung CWR lập bit PC3: 07h
- Nội dung CWR xóa bit PC3: 06h

Chương trình

MOV CX, 256

124
tt:

MOV AL, 07h

OUT 8Ch ,AL

CALL Delay25ms

MOV AL, 06h

OUT 8Ch ,AL

CALL Delay25ms

LOOP tt

3.4.4. Truyền thông nối tiếp dùng 8250A, 8251A

3.4.4.1. Yêu cầu truyền thông tin nối tiếp.

Bus dữ liệu của hệ vi xử lý được thiết kế để trao đổi dữ liệu song song
giữa các thành phần gần nhau trong hệ vi xử lý. Tuy nhiên trong nhiều trường
hợp khi cần truyền thông tin giữa các thiết bị ở cách xa nhau không thể sử
dụng cả tập các đường dây như trên mà phải có cách truyền khác để đảm bảo
chất lượng tín hiệu cũng như tiết kiệm được số đường dây dẫn cần thiết. Từ
yêu cầu trên ra đời phương pháp truyền thông tin nối tiếp. Trao đổi thông tin
theo phương thức truyền nối tiếp là truyền liên tiếp từng bit một trên một
đường truyền. Ở đầu thu, tín hiệu nối tiếp sẽ được biến đổi ngược lại để tái
tạo tín hiệu dạng song song hay thích hợp cho việc xử lý tiếp theo. Trên thực
tế có hai phương pháp truyền số liệu nối tiếp là truyền không đồng bộ và
truyền đồng bộ.

❖ Phương pháp truyền không đồng bộ.

Trong phương pháp truyền tín hiệu không đồng bộ (Asynchoronuos


Communication), dữ liệu được truyền đi theo từng ký tự. Ký tự cần truyền đi
được bắt đầu và kết thúc bằng các bit đặc biệt (bit Start, bit Stop) với mục
đích tạo đồng bộ giữ bên thu và bên phát. Vì mỗi ký tự được nhận dạng riêng

125
biệt nên nó có thể được truyền đi vào thời điểm bất kỳ. Bit Start luôn luôn
phải là 0, bit Stop có thể là 1 bit, 1+1/2 bit hoặc 2 bit với giá trị luôn luôn phải
là 1. Bit Parity có thể được cài vào để thực hiện phát hiện sai sơ bộ cho bên
thu. Tuỳ theo loại mã sử dụng mà số lượng bit trong khung tin có thế là 5, là
6, là 7 hay là 8. dạng thức của dữ liệu truyền đi theo phương pháp không đồng
bộ được thể hiện trên Hình 3.36.

Chiều của dòng dữ liệu


Luôn ở mức thấp Luôn ở mức cao

Start D0 D1 D2 D3 D4 D5 D6 Parity Stop Stop

Mã ký tự cần truyền

Hình 3.36. Khung cho một ký tự theo mã ASCII để truyền không đồng bộ

Ưu điểm của phương pháp này là yêu cầu đồng bộ giữa bên thu và pháp
không đòi hỏi chặt chẽ nhờ có bit Start và bit Stop xác định thời điểm đầu vào
và cuối của nhóm bit cho nên sự sai pha tích luỹ chỉ diễn ra trong thời gian
thu nhóm bit đó. Chính điều đó dẫn tới ưu điểm là thiết bị trong hệ thống khá
đơn giản, giá thành hệ thống thấp.

Nhược điểm của phương pháp truyền không đồng bộ là hiệu quả sử dụng
kênh thấp do phải truyền nhiều bit Start và bit Stop là những bit không mang
tin. Mặt khác, tốc độ truyền tin cũng bị hạn chế. Các modem có tốc độ không
lớn hơn 1200 bit/s thường được sử dụng phương pháp này.

❖ Phương pháp truyền đồng bộ.

Phương pháp truyền tín hiệu đồng bộ (Synchronuos Commmunication)


khắc phục được các nhược điểm của phương pháp không đồng bộ. Bản chất
của phương pháp này là dữ liệu được truyền theo từng mảng (khối) với một
tốc độ xác định. Mảng dữ liệu trước khi được truyền đi sẽ được gắn thêm ở
đầu mảng và ở cuối mảng các byte (hoặc một nhóm bit) đánh dấu đặc biệt.

126
Hình 3.37. biểu diễn khuôn dạng một bản tin để truyền đồng bộ theo giao
thức BISYNC (giao thức truyền thông tin hệ 2 đồng bộ). Đây thực chất là
giao thức điều khiển theo byte, vì các byte (ký tự) đặc biệt dược dùng để đánh
dấu các phần khác nhau trong bản tin.
Chiều của dòng dữ liệu

SYN SYN SOH HERDER STX TEXT EXT hay EBT BCC

Hình 3.37. Khuôn dạng của bản tin truyền đồng bộ theo giao thức
BISYNC

- SYN: ký tự đồng bộ. Sau khi phát hiện hai ký tự đặc biệt dùng làm tín
hiệu đồng bộ đã biết trước, thiêt bị thu bắt đầu ghi nhận ký tự SOH.

- SOH: byte mở đầu, xác định kích thước và các đặc tính của trường
HEADER.

- HEADER: Trường này có độ dài thay đổi, có thể dùng để chứa địa chỉ
nơi nhận tin.

- STX: chỉ ra rằng ngay sau byte này là phần bắt đầu của văn bản.

- TEXT:chứa mã ASCII của ký tự hoặc EBCDIC (là nội dung tin tức cần
truyền).

- EXT: ký tự kết thúc văn bản

- ETB: ký tự kết thúc khối văn bản

- BCC: kiểm tra phát hiện lỗi.

3.4.4.2. Mạch thu phát dị bộ vạn năng UART 8250A

UART 8250A (Universal Asynchronous Receiver/Transmitter) là mạch


phối ghép vào ra không đồng bộ, lập trình được dùng để chuyển thông tin
song song (từ máy tính) thành nối tiếp (ra đường truyền) và ngược lại. Nó là
chip IC chuyên dụng loại LSI 40 chân.

❖ Các chân tín hiệu của 8250A

Sơ đồ chân tín hiệu của 8250A như trên Hình 3.38.

127
D0 1 40 VDD
D1 2 39 RI
D2 3 38 DCD
D3 4 37 DSR
D4 5 36 CTS
D5 6 35 RESET
D6 7 34 OUT1
D7 8 33 DTR
RCLK 9 UART 32 RST
SIN 10 8250A 31 OUT2
SOUT 11 30 INTR
CS0 12 29 NC
CS1 13 28 A0
CS2 14 27 A1
BAUDOUT 15 26 A2
XTAL1 16 25 ADS
XTAL2 17 24 CSOUT
DOUTS 18 23 DDIS
DOUTS 19 22 DINS
GND 20 21 DINS

Hình 3.38. Sơ đồ chân tín hiệu UART 8250A

- D0-D7: được sử dụng để truyền dữ liệu với hệ vi xử lý.

- RCLK (Receiver clock) [I]: tín hiệu vào dao động có tần số gấp 16 lần
chu kỳ baud thu.

- SIN (Serial in) [I]: đầu vào dữ liệu nối tiếp.

- SOUT (Serial out)[O]: đầu ra dữ liệu nối tiếp.

- CS0, CS1, CS2 : các chân tín hiệu chọn chip.

- BAUDOUT (Baud out) [O]: chân ra xung nhịp 16 lần chu kỳ baud phát.
Nếu chân này nối với chân RCLK thì thu phát cùng nhịp.

- XTAL1, XTAL2 [I]: các lối vào của phần tử dao động thạch anh.

- DOUTS(hay WR, DOSTR), DOUTS (hay WR, DOSTR) [I]: Khi


DOUTS có mức thấp hay DOUTS có mức cao thì CPU viết dữ liệu hay các từ
điều khiển vào các thanh ghi của 8250A.

128
- DINS (hay RD, DISTR), DINS hay (RD, DISTR) [I]: Khi DINS có mức
thấp hay DINS có mức cao thì CPU thực hiện đọc dữ liệu hay các từ trạng
thái của 8250A.

- DDIS [O]: Nếu CPU thực hiện đọc dữ liệu từ 8250A, thì chân tín hiệu
này có mức thấp.

- CSOUT (Chip select out) [O]: tín hiệu chỉ ra CPU đang thâm nhập vào
8250A.

- ADS (Address Strobe) [I]: tín hiệu vào thông báo tín hiệu địa chỉ và các
tín hiệu chọn chip đã ổn định.

- A2 –A0 [I]: các tín hiệu địa chỉ để địa chỉ hoá các thanh ghi bên trong.

- INTR [O]: tín hiệu ra yêu cầu ngắt của 8250A

- OUT2, OUT1: dành cho người sử dụng trong các ứng dụng không phải
chuẩn RS232. Trong PC OUT2 được sử dụng để cho phép ngắt của mạch 3
trạng thái.

- DCD (Data carrier detect) [I]: tín hiệu vào mức tích cực thấp để phát
hiện sóng mang.

- RST(Request to send): yêu cầu phát

- DTR (Data terminal ready): thiết bị đầu cuối sẵn sàng

- CTS(clear to send): sẵn sàng nhận

- DSR(Data set ready): thiết bị truyền thông sẵn sàng

- RI (Ring indicator): Chỉ thị chuông.

❖ Sơ đồ chức năng

UART 8250A được sử dụng rộng rãi trong máy tính PC và các hệ vi xử
lý chuyên dụng để thu phát tín hiệu nối tiếp không đồng bộ theo chuẩn RS-

129
232C. Các vi mạch sau này của hãng như 16450, 16550 hay 16750 được kế
thừa từ 8250A. Sơ đồ chức năng - Hình 3.39

Thanh ghi đệm Thanh ghi SIN


thu dịch thu

Thanh ghi định Đ/khiển


Đ/khiển
Đệm Bus phần thu
RCLK
D0-D7 dạng dữ liệu phần thu
dữ liệu
Thanh ghi chốt
bộ chia (LSB) Bộ dao
động Baud Baudout
Thanh ghi chốt
bộ chia (MSB) RTS
CTS
CS0
CS1 Thanh ghi điều Logic DTR
CS2 khiển Modem đ/khiển DSR
Logic điều
Modem
DOSTR khiển và DCD
DOSTR giải mã Thanh ghi trạng
DISTR địa chỉ thái Modem RI
DISTR thanh ghi OUT1
DDIS 8250A Thanh ghi cho OUT2
CSOUT
phép ngắt
AS Logic điều INTRPT
A0 khiển IRQ
A1 Thanh ghi nhận
A2 dạng ngắt

Thanh ghi
Reset nháp

Thanh ghi trạng Đ/khiển


thái đường phần phát
truyền

Thanh ghi giữ Thanh ghi SOUT


phát dịch phát

Hình 3.39. Sơ đồ chức năng 8250A

+ Khối đệm bus dữ liệu: có các mạch 3 trạng thái để ghép với bus của hệ
vi xử lý.

+ Khối logic điều khiển và giải mã địa chỉ: để tạo các tín hiệu điều khiển
và xác định các thanh ghi khi CPU cần thâm nhập. 8250A có 3 tín hiệu chọn
chip CS và hoạt động khi đồng thời cả 3 tín hiệu có mức tích cực. 8250A sử
dụng 3 bit địa chỉ A2, A1, A0 để địa chỉ hoá cho các thanh ghi. Các tín hiệu
DOUTS Và DINS để thâm nhập (đọc/ghi) vào 8250A.

130
+ Khối Logic điều khiển Modem: để chuyển đổi mức tín hiệu giao tiếp
theo chuẩn RS-232 với mức tín hiệu logic.

+ 8250A có 10 thanh ghi được địa chỉ hoá bởi 3 bit địa chỉ (Bảng 3.10)
để phân biệt khi nhâm nhập các thanh ghi đệm thu và phát hay các thanh ghi
chốt số chia, người ta dùng thêm bit DLAB (Division Latch Access Bit – bit
thâm nhập thanh ghi chốt chia) trong thanh ghi định dạng dữ liệu.

Bảng 3.10. Các thanh ghi của 8250A và địa chỉ thâm nhập
DLAB A2 A1 A0 Thanh ghi
0 0 0 0 Thanh ghi đệm thu (RBR), thanh ghi giữ phát (THR)
0 0 0 1 Thanh ghi cho phép ngắt (IER)
 0 1 0 Thanh ghi nhận dạng ngắt (IIR)
 0 1 1 Thanh ghi điều khiển ngắt đường truyền (CLR)
 1 0 0 Thanh ghi điều khiển Modem (MCR)
 1 0 1 Thanh ghi trạng thái đường truyền (LSR)
 1 1 0 Thanh ghi trạng thái Modem (SMR)
 1 1 1 Thanh ghi nháp (SPR)
1 0 0 0 Thanh ghi chốt bộ chia byte thấp (LSB)
1 0 0 1 Thanh ghi chốt bộ chia byte cao (MSB)

- Thanh ghi giữ phát (Transmitter Holding Register-THR): Ký tự cần


phát đi phải được lấy từ CPU ghi vào thanh ghi này với bit DLAB=0, sau đó
UART 8250A tạo khung tin cho nó như đã định dạng và đưa từng bit ra chân
tín hiệu Sout.
- Thanh ghi đệm thu (Receiver Buffer Register-RBR):Khi 8250A nhận
được một ký tự qua chân tín hiệu SIN, nó tháo bỏ khung cho ký tự và lưu ký
tự lại thanh ghi đệm thu để CPU đọc. CPU đọc được ký tự trong thanh ghi
này khi bit DLAB=0.

131
- Thanh ghi cho phép ngắt (Interrupt Enable Register - IER): Thanh ghi
này dùng để cho phép hay cấm các nguyên nhân gây ngắt khác nhau. Trong
khi 8250A hoạt động, có thể tác động tới CPU qua chân INTRPT của UART
để tạo ra 4 loại ngắt. Mỗi bit trong số D3, D2, D1, D0 ở mức cao sẽ cho phép
các hiện tượng tương ứng với bit đó được đưa ra yêu cầu ngắt đối với CPU.
Dạng thức của IER trên Hình 3.40.

D7 D6 D5 D4 D3 D2 D1 D0

0 0 0 0 MODEM RLINE TxEMTY RxRDY

Hình 3.40. Dạng thức của thanh ghi IER


- Bốn bit cao (D7, D6, D5, D4) luôn bằng 0

- D0=1: cho phép gây gắt khi đệm thu đầy (RxD đầy)

- D1=1: cho phép gây ngắt khi đệm phát rỗng (TxD rỗng).

- D2=1: cho phép các tín hiệu trạng thái đường dây thu gây ngắt

- D3=1: cho phép ngắt từ MODEM

ví dụ: Cho phép yêu cầu ngắt khi thanh ghi đệm phát rỗng hay nếu byte
dữ liệu đã sẵn sàng trên thanh ghi đệm thu

MOV DX, 3F9h ; địa chỉ thanh ghi cho phép ngắt

IN AL, DX

OR AL, 03h ; đặt các bit D1 và D0 bằng 1

OUT DX, AL ; và gửi ra thanh ghi cho phép ngắt

- Thanh ghi nhận dạng ngắt (Interrupt Indentification Register – IIR):


Thanh ghi này được đọc mỗi khi có yêu cầu ngắt từ 8250A. CPU đọc bit D0
của thanh ghi này để biết có yêu cầu ngắt và kiểm tra bit D2D1 để xác định
nguồn gốc của yêu cầu ngắt.

Khi UART bị Reset, chỉ có ngắt ưu tiên 1 được phục vụ, tuy nhiên có thể
thay đổi điều này bằng cách dùng mặt nạ che đi các yêu cầu ngắt nào đó bằng

132
cách ghi vào thanh ghi IER các bit thích hợp. Dạng thức của thanh ghi IIR
trên Hình 3.41.

D7 D6 D5 D4 D3 D2 D1 D0

0 0 0 0 0 ID1 ID0 PND

Hình 3.41. Dạng thức của thanh ghi IER

D0: xác định có yêu cầu ngắt hay không. Nếu D0=1 không có yêu cầu
ngắt, còn nếu D0=0 có yêu cầu ngắt và nguồn ngắt được xác định bởi 2 bit D2
và D1

D2D1: mã hoá yêu cầu ngắt có mức ưu tiên cao nhất đang chờ được phục
vụ, nếu:

D2D1=00: nguồn ngắt là do sự thay đổi của tín hiệu đầu vào RS-232,
ngắt có mức ưu tiên 3 ( mức thấp nhất).

D2D1=01: nguồn ngắt là do thanh ghi giữ phát rỗng, mức ưu tiên 2.

D2D1=10: nguồn ngắt là do thanh ghi đệm thu đầy, mức ưu tiên 1.

D2D1=11: nguồn ngắt là do lỗi thu đè, lỗi Parity,..., mức ưu tiên 0
(mức cao nhất).

- Thanh ghi điều khiển đường truyền ( Line Control Register –LCR):
Thanh ghi này còn có tên là thanh ghi định khuôn dạng dữ liệu vì nó quyết
định khuôn dạng của dữ liệu truyền trên đường dây. Dạng thức của thanh ghi
LCR được biểu diễn trên Hình 3.42.
D7 D6 D5 D4 D3 D2 D1 D0

DLAB SBCB SP EPS PEN STB WLS1 WLS2

Hình 3.42. Dạng thức của thanh ghi LCR

D1D0: chọn số lượng bit số liệu

00: 5 bit
01: 6 bit

133
10: 7 bit
11: 8 bit
D2: Số lượng bit Stop

0 : 1 bit
1 :1+1/2 bit (ứng với độ dài số liệu 5 bit)
: 2 bit (ứng với độ dài số liệu 6, 7, 8 bit)
D3: Cho phép tạo/kiểm tra parity

1: cho phép
0: cấm
D4: chọn tạo/kiểm tra parity chẵn

1: parity chẵn
0: parity lẻ
D5: Đảo parity

1: đảo parity
0: không hoạt động
D6: Bit điều khiển gián đoạn

1: Buộc đầu ra Sout =0


0: Không hoạt động
D7: Bit truy nhập bộ chia

1: Truy nhập bộ chia để tính tốc độ truyền của 8250A


0: Truy nhập IER, THR và RBR
Bit D5 cho phép làm việc với parity đảo: 8250A có thể thao tác với
parity đảo so với parity đã được định nghĩa ở bit D3, tức là khi phát/thu thì
8250A tạo/kiểm tra bit parity đã được đảo ngược đi so với giá trị mà đáng lý
ra nó phải tạo/kiểm tra.

Ví dụ: Đặt UART 8250A tốc độ là 300 baud và hệ số chia là 384

MOV DX, 3FBh ;Địa chỉ thanh ghi định dạng dữ liệu

134
IN AL, DX

OR AL, 80h ;Đặt bit D7=1


OUT DX, AL ;và gửi ra cho bit DLAB

MOV DX, 3F8h ;Địa chỉ thanh ghi chốt chia byte thấp

MOV AL, 08h ;Số chia byte thấp

OUT DX, AL ;và gửi ra thanh ghi chốt chia

INC DX ;Địa chỉ thanh ghi chốt chia byte cao

MOV AL, 01h ;Số chia byte cao

OUT DX, AL ;và gửi ra thanh ghi chốt chia

MOV DX, 3FBh ;Địa chỉ thanh ghi định dạng dữ liệu

IN AL, DX

AND AL, 7Fh ;Xoá bit D7=0

OUT DX, AL ;và gửi ra chi bit DLAB

- Thanh ghi trạng thái đường truyền (Line Status Register – LSR): Thanh
ghi trạng thái đường truyền cho biết trạng thái của việc truyền tín hiệu trên
đường dây. các tín hiệu THRE, BI, FE, PE, RxDR đều là các nguyên nhân gây
ngắt nếu các bit cho phép tương ứng trong thanh ghi IER được lập. Nó là thanh
ghi thông báo trạng thái đường truyền – phát hiện Break (dòng tin bị ngắt). Các
lỗi máy thu (tràn khung, chẵn lẻ, tràn số, số liệu sẵn sàng và trạng thái không
có số liệu truyền TxE). Dạng thức của thanh ghi LSR trên Hình 3.43

D7 D6 D5 D4 D3 D2 D1 D0

0 TSRE THRE BI FE PE OE RxDR

Hình 3.43. Dạng thức của thanh ghi LSR

D0 (RxDR - Receiver data ready – số liệu thu sẵn sàng):

1: Đã nhận được một ký tự và để nó trong thanh ghi đệm thu (RBR)


0: Khi CPU đang đọc thanh ghi RBR

135
D1 (OE – Overrun error – lỗi do thu đè):

1: Có hiện tượng thu đè (có thể do CPU bị chậm)


0: Khi CPU đọc thanh ghi LSR
D2 (PE – Parity Error – lỗi parity):

1: Có lỗi Parity
0: Khi CPU đọc LSR
D3 (FE – Framing error – lỗi khung):

1: Có lỗi khung (ví dụ: bit Stop=0)


0: Khi CPU đọc LSR
D4 (BI – Break Interrupt – có sự gián đoạn trong khi truyền)

1: Khi tín hiệu ở đầu vào phần thu ở mức thấp lâu hơn thời gian
giành cho 1 ký tự
0: Khi CPU đọc LSR
D5 (THRE –Transmitter Holding Register Empty – Thanh ghi giữ phát
rỗng)

1: Ký tự đã được chuyển từ THR sang TSR


0: Khi CPU đưa ký tự tới thanh ghi THR
D6 (TSRE – Transmitter Shift Register Empty – thanh ghi dịch phát
rỗng)

1: Khi một ký tự đã được phát đi


0: Khi có một ký tự được chuyển từ THR sang TSR
Ví dụ: Xác định khi nào byte dữ liệu đã sẵn sàng trong thanh ghi đệm
thu và đọc byte dữ liệu nếu có.

MOV DX, 3FDh ;Địa chỉ thanh ghi trạng thái đường truyền

IN AL, DX

TEST AL, 01h ; Kiểm tra bit RxDR

JZ further ;nếu bit=0 thì nhảy về further

136
MOV DX, 3F8h ; Địa chỉ thanh ghi đệm thu

IN AL, DX ;và đọc byte dữ liệu

- Thanh ghi điều khiển Modem (Modem Control Register – MCR):


Thanh ghi này điều khiển các tín hiệu ra của MODEM, nó cho phép điều
khiển các tín hiệu tại các chân DTR vµ RTS của UART. Dạng thức của MCR
trên Hình 3.44.

D7 D6 D5 D4 D3 D2 D1 D0

0 0 0 LOOP OUT2 OUT1 RTS DTR

Hình 3.44. Dạng thức của thanh ghi MCR

1 : ®-a DTR = 0
- D0 =
0 : ®- aDTR = 1

1 : ®-a RTS = 0
- D1 =
0 : ®-a RTS = 1

D3D2 điều khiển mức logic ở đầu ra tương ứng OUT2 và OUT1 của
8250A. Nếu bit =1, đầu ra có mức LOW.

D4=1: cho phép điều khiển mạch 8250A làm việc ở chế độ nối vòng cục
bộ để kiểm tra chức năng UART

• SOUT=1

• SIN: không nối với bên ngoài

• Các thanh ghi dịch của phần phát và phần thu nối vòng với nhau.

• Các chân điều khiển MODEM (DSR, CTS, RI, RLSD) không được
nối ra ngoài mà được nối ở bên trong mạch với các chân điều
khiển ra của MODEM ( (DTR, RTS, OUT1, OUT2).

137
- Thanh ghi trạng thái Modem (Modem Status Register –MSR): Thanh
ghi này còn được gọi là thanh ghi trạng thái vào của RS-232C, nó cho biết
trạng thái hiện thời của các tín hiệu điều khiển MODEM từ đường dây. Dạng
thức của MSR trên Hình 3.45.
D7 D6 D5 D4 D3 D2 D1 D0
DCD RI DSR CTS DDCD DRI DDSR DCTS
Hình 3.45. Dạng thức của thanh ghi MSR

Các bit của thanh ghi trạng thái Modem tương ứng với các tín hiệu đầu
vào điều khiển từ Modem là DCD, RI, DSR và CTS. Nửa byte cao gồm các
bit DCD, RI, DSR và CTS cung cấp thông tin của mức tín hiệu hiện tại của
các đầu vào DCD, RI, DSR và CTS. Nếu bit=1, thì các đầu vào có mức logic
thấp. Nửa thấp là các bit DDCD, DRI, DDSR và DCTS (D – Delta) cung cấp
thông tin về sự thay mức so với lần đọc thanh ghi trước.

Ví dụ: Xác định khi nào bit DCD thay đổi, và truyền bit DCD mới vào
LSB của thanh ghi

MOV DX, 3Feh ;Địa chỉ thanh ghi trạng thái Modem

IN AL, DX

TEST AL, 08h ;Kiểm tra bit DDCD

JZ further ;nếu bit=0 thì nhảy vể further

AND AL, 80h ;xoá các bit trừ bit DCD

CLC ;xoá cờ CF

RLC AL ;truyền bit DCD vào CF

RLC AL ;truyền CF vào LSB

❖ Hoạt động trên sơ đồ chức năng

Một nét đặc trưng của 8250A là phát và thu với tốc độ baud khác nhau.
Tần số xung Clk đưa từ ngoài vào hay được tạo từ mạch thạch anh trên đầu
XTAL2, XTAL1, chia cho số chia 16 bit trong thanh ghi chốt chia tạo ra tần

138
số trung gian đưa ra đầu ra Baudout, tần số này được chia cho 16 tạo ra tốc độ
Baud cho phần phát. Nếu ta nối chân ra Baudout với chân RCLK, tín hiệu tần
số trung gian cũng được chia 16 và tạo ra tốc độ Baud cho phần thu. Việc tách
thu phát khác tốc độ để thuận tiện khi sử dụng.

Tín hiệu thu được nhận vào từ chân SIN được khối điều khiển thu tách
các bit START, STOP và bit PARITY. Các bit dữ liệu còn lại được đưa tới
thanh ghi dịch thu. Khi nhận đủ số bit của 1 ký tự trên thanh ghi dịch, khối
điều khiển thu điều khiển để chuyển đồng thời các bit sang thanh ghi đệm thu.
Chương trình đọc byte dữ liệu từ thanh ghi đệm thu vào CPU bằng lệnh IN.
Nếu số lượng bit được định nghĩa ít hơn 8 bit, các bit thừa trong các thanh ghi
sẽ là các bit cao và được đặt các giá trị ngẫu nhiên. Chương trình khi đó chỉ
xử lý với các bit thấp.

Trường hợp phát tín hiệu, CPU sẽ gửi byte dữ liệu của 1 ký tự ra thanh
ghi giữ phát bằng lệnh OUT khi thanh ghi giữ phát rỗng. Nếu thanh ghi dịch
phát rỗng, khối điều khiển phát sẽ chuyển dữ liệu sang thanh ghi dịch phát,
thêm các bit START, STOP và bit PARITY vào khung tín hiệu truyền và điều
khiển phát nối tiếp ra đầu ra SOUT. Nếu không có dữ liệu sẵn có để truyền
đến thanh ghi dịch phát, khối điều khiển phát đặt đầu ra SOUT về trạng thái
dấu (mark mode).

8250A có thể làm việc trong mode kiểm tra khi bit kiểm tra vòng cục bộ
LOOP trong thanh ghi điều khiển modem có giá trị bằng 1. Trong trường hợp
này, các tín hiệu đầu ra điều khiển modem phải được nối trực tiếp đến đầu
vào theo cách: RTSto CTS, DTR to DSR, OUT1 to RI vµ OUT2 to DCD . Thêm nữa,
đầu ra phát SOUT có logic 1, đầu vào SIN cắt khỏi phần còn lại của UART và
thanh ghi dịch phát nối trực tiếp tới thanh ghi dịch thu. Như vậy khi bit
LOOP=1, ta có thể kiểm tra được các chức năng điều khiển modem và tạo
ngắt trong 8250A và cũng như khả năng truyền nối tiếp cả phát và thu. Ví dụ,
nếu ta viết 1 byte dữ liệu vào thanh ghi giữ phát, nó sẽ được truyền tới thanh

139
ghi dịch thu, chuyển thành byte dữ liệu rồi đưa sang thanh ghi đệm thu, khi đó
1 ngắt báo bộ đệm thu đầy được tạo ra. So sánh byte dữ liệu phát và thu nhận
được, ta kiểm tra được sự chính xác của việc truyền.

❖ Ghép nối và truyền thông

+ Ghép nối: Việc ghép nối 8250A với hệ vi xử lý cũng tương tự như
ghép nối với các IC khác.

Ví dụ: Ghép 8250A với hệ vi xử lý 8086 có địa chỉ cơ sở là 10h


(00010000 - địa chi trực tiếp) và đưa ra đầu ra theo chuẩn RS-232C.

Sơ đồ ghép nối trên Hình 3.46.

74LS245
Đến CPU INTR DTR DTR
d0-d7 X Y D0-D7
+5V RTS
DIR ADS RTS
DISTR
G TxD
DOSTR SOUT
IOR DISTR
IOW RxD
DOSTR SIN
A0 RS232
A1 RI RI
A2

A CS1 CTS CTS


A0-A7
B +5V CS0
C CS2 DSR DSR
G2A Y4
A0 XTAL2
G2B XTAL1 RLSD
DCD
M⁄̅̅̅
IO G1 74LS138
RESET
Reset
RCLK BAUDOUT

+5V
QA B
8250A
+5V
A QD

74S90
18.432 Mz

Hình 3.46. Sơ đồ ghép nối của 8250A

140
Trong sơ đồ này, dao động được tạo ra từ bộ dao động ngoài có thạch
anh 18.432 Mz. Tần số này được chia 10 bằng IC 74S90 tạo ra xung nhịp tần
số 1.8432 Mz đưa tới 8250A. các tín hiệu địa chỉ A3, A2, A1 được đưa trực
tiếp vào 8250A để địa chỉ cho các thanh ghi, còn các địa chỉ còn lại được đến
IC giải mã 138 để xác định cho 8250A và cho mạch đệm bus 245. Các tín
hiệu đầu ra và vào nối qua các bộ chuyển mức và lấy đảo MC1488 và
MC1489 để tạo ra các mức tương ứng đưa ra đầu ra theo chuẩn RS-232C.

+ Truyền thông

Để 8250A thực hiện truyền thông nối tiếp, chương trình đầu tiên phải xác
lập các thông số cho 8250A bằng cách gửi các thông số ra các thanh ghi điều
khiển và thanh ghi chốt số chia.

Ví dụ: Đoạn chương trình để khởi đầu cho 8250A của sơ đồ trên để tốc
độ truyền là 4.800 bit/s, 7 bit mã ký tự, parity chẵn, 2 bit stop và không điều
khiển gián đoạn ở SOUT. Các thông số cần cho chương trình là:

- Địa chỉ của thanh ghi chốt chia là 10h và 12h


- Địa chỉ của thanh ghi điều khiển đường truyền là 16h
- Từ điều khiển xác định khuôn dạng khung truyền là 00011110=1Eh
- Giá trị số chia bằng 1.843.200/(4.800*16)=24

MOV AL, 80h ; Đặt bit DLAB=1 của thanh ghi LCR

OUT 16h, AL ; để thâm nhập thanh ghi chốt chia

MOV AL, 24 ; byte thấp số chia

OUT 10h, AL ; đưa ra thanh ghi chốt chia (LSB)

XOR AL, AL ; byte cao số chia bằng 0

OUT 12h, AL ; đưa ra thanh ghi chốt chia (MSB)

MOV AL, 1Eh ; từ điều khiển

OUT 16h, AL ; đưa ra thanh ghi LCR

141
Sau đó chương trình thực hiện việc truyền thông nối tiếp tuỳ theo phần
cứng được thiết kế để bắt tay bằng phần mềm hoặc phần cứng.

+ Bắt tay bằng phần mềm

Để thực hiện bắt tay bằng phần mềm, các chân điều khiển Modem và các
chân tín hiệu ở đầu ra RS-232C phải được nối như Hình 3.47.

Bình thường khi không có dữ


TxD TxD
liệu truyền, phần phát trong trạng RxD RxD
thái dấu (mark) luôn phát tín hiệu 8250A RTS RTS 8250A
và CTS CTS và
mức logic 1 ở đầu ra SOUT đến đầu
đầu ra DTR DTR đầu ra
vào SOUT của phần thu đối phương RS232C DSR DSR RS232C
(chú ý là các đầu ra và đầu vào đều GND GND

qua các bộ chuyển mức và lấy đảo,


nên đầu ra TxD của SOUT khi đó Hình 3.47. Nối ghép RS-232C bắt
tay bằng chương trình
có giá trị là -12V). Khi có 1 ký tự
được truyền đi, bit START có mức logic 0 đưa đến đầu vào thu, khối điều
khiển thu được khởi động, thu nhận ký tự vào thanh ghi đệm thu. Khi bit
RxRD trong thanh ghi trạng thái được truyền đặt lên 1 và gây ra 1 ngắt.

Chương trình được viết cho phần thu, đầu tiên phải đọc thanh ghi trạng
thái đường truyền và kiểm tra giá trị bit RxRD. Nếu bit=0 thì quay vòng kiểm
tra lại. Nếu bit=1, đọc dữ liệu từ thanh ghi đệm thu vào CPU

Chương trình viết cho phần phát là đọc thanh ghi trạng thái đường truyền
và kiểm tra bit TBE. Nếu TBE=1 có nghĩa là thanh ghi giữ phát đang rỗng.
Chương trình đưa 1 ký tự từ CPU ra thanh ghi giữ phát.

Nhược điểm của sơ đồ này là có khả năng bị thu đè, tức là ký tự trong
thanh ghi đệm thu chưa được đọc vào CPU đã có ký tự thu khác đè lên. Để
khắc phục nhược điểm này, người lập trình phải tính khoảng thời gian giữa 2
lần đọc thanh ghi đệm thu trong chương trình để chọn ra tốc độ baud cho
thích hợp.

142
+ Bắt tay bằng phần cứng

Bằng các tín hiệu điều khiển Modem làm các tín hiệu bắt tay như trong
Hình 3.48. có thể loại trừ thu đè, hoạt động như sau:

Trường hợp truyền dữ liệu 1


TxD TxD
chiều, khi đầu phát muốn phát dữ RxD RxD
liệu, chương trình đặt đường tín 8250A RTS RTS 8250A
và CTS CTS và
hiệu ra RTS lên mức cao (đầu ra
đầu ra DTR DTR đầu ra
RTS của 8250A có mức thấp) và RS232C DSR DSR RS232C
giữ nguyên cho đến khi đường tín GND GND

hiệu nhận về CTS chuyển sang Hình 3.48. Nối ghép RS-232C bắt
trạng thái tích cực (mức cao). Nếu tay bằng phần cứng
đường dẫn CTS giữ nguyên trạng thái không kích hoạt (có nghĩa là bộ nhận
dạng bận), chưa có thể nhận dữ liệu. Nếu CTS có mức tích cực, chương trình
sẽ gửi dữ liệu ra thanh ghi giữ phát, đồng thời đặt bit RTS về mức không tích
cực.

Đầu thu dữ liệu, chương trình kiểm tra thanh ghi trạng thái Modem. Nếu
bit CTS và DCTS đều có mức 1, có nghĩa đã có một yêu cầu truyền dữ liệu từ
bên phát, 8250A sẽ phát tín hiệu mức tích cực RTS đến CTS của phát. Khi
đầu tín hiệu CTS của phần thu thay đổi mức, chương trình kiểm tra bit RxRD
và đọc dữ liệu từ bộ đệm nhận vào CPU, và chuyển trạng thái cho đường dây
RTS.

Nếu việc truyền dữ liệu được diễn ra theo 2 chiều, cả thu và phát, thì ta
sử dụng thêm các đường điều khiển DSR và DTR cho quá trình cho quá trình
thu phát theo chiều ngược lại tương tự như với RST và CTS.

Việc trao đổi dữ liệu với hệ vi xử lý trong các trường hợp trên được thực
hiện theo phương pháp hỏi vòng (polling). Ta cũng có thể sử dụng điều khiển
theo phương pháp ngắt. Khi đó đầu ra INTR của 8250A được đưa tới mạch
điều khiển ngắt (8259A) và chương trình con xử lý ngắt đầu tiên phải đọc

143
thanh ghi nhận dạng ngắt IIR và xác định nguồn yêu cầu ngắt do nguyên nhân
nào gây ra thực hiện yêu cầu đó.

3.4.4.3. Mạch thu phát đồng bộ và dị bộ USART 8251A

❖ Chức năng của USART 8251A

Mạch USART 8251A có thể dùng cho cả hai kiểu truyền thông tin nối
tiếp đồng bộ và dị bộ. Sơ đồ chức năng của mạch 8251A của Intel được biểu
diễn trên Hình 3.49.
Đệm phát:
// thành TxD (Transmit data)
Đệm bus
D0-D7 nối tiếp
dữ liệu

Reset Điều TxRDY (Transmit ready)


CLK Logic điều khiển TxEMTY (Transmit Emty)
khiển phần phát TxC (Transmit clock)
CD ghi/đọc
WR
RD
Đệm thu:
nối tiếp RxD (Receive data)
CS
thành //
DSR Điều khiển
DTR MODEM Điều RxRDY (Receive ready)
CTS
khiển RxC (Receive clock)
RTS
phần thu SYNDET/BRKDET
(Syn detect/break detect)

Hình 3.49. Sơ đồ chức năng của USART 8251A

+ CLK [I]: chân nối đến xung đồng hồ của hệ thống.

+ TxRDY [O]: tín hiệu báo đệm giữ rỗng (sẵn sàng nhận ký tự mới từ
CPU).

+ RxRDY [O]: tín hiệu báo đệm thu đầy (có ký tự nằm chờ CPU đọc vào).

+ TxEMPTY [O]: tín hiệu báo cả đệm giữ và đệm phát đều rỗng. Khi
8251A không có ký tự gửi đi thì đầu ra TxE có mức cao (=1). Nó được reset
lại (=0) khi nhận 1 ký tự từ CPU gửi tới nếu phần phát được phép. TxE giữ
mức cao khi phần phát không được phép. TxE được sử dụng để báo hiệu kết
thúc mode phát để CPU biết khi quay vòng đường dây trong mode làm việc

144
hai nửa song công. Trong mode đồng bộ, mức 1 trên đầu ra này chỉ ra rằng
một ký tự không được load và ký tự đồng bộ hay các ký tự chuẩn tự động
chèn đầy vào. TxE không ở mức thấp khi đang truyền ký tự đồng bộ.

+ C D : CPU thao tác với thanh ghi lệnh/thanh ghi dữ liệu của 8251A,
khi C D =1 thì thanh ghi lệnh được chọn làm việc. Chân này thường được nối
với A0 của bus địa chỉ để cùng với các tín hiệu WR và RD chọn ra 4 thanh ghi
bên trong 8251A.

+ RxC [I] vµ TxC [ I ] : xung đồng hồ cung cấp cho các thanh ghi dịch của
phần thu và phần phát. Thường 2 chân này được nối chung để phần thu và
phần phát làm việc với cùng một tần số nhịp. Tần số của các xung đồng hồ
đưa đến chân RxC [I] vµ TxC [ I ] được chọn sao cho là bội số (cụ thể là gấp 1, 16
hoặc 64 lần) của tốc độ thu hay tốc độ phát theo yêu cầu.

+ SYNDET/BRKDET [O]: khi 8251A làm việc ở chế độ không đồng bộ,
nếu RxD=0 kéo dài hơn thời gian của 2 ký tự thì chân này có mức cao để báo
là việc truyền hoặc đường truyền bị gián đoạn. Khi 8251A làm việc ở chế độ
đồng bộ, nếu phần thu tìm thấy ký tự đồng bộ trong bản tin thu được thì chân
này có mức cao.

SYNDET: khi này chân được dùng trong Mode đồng bộ và có thể sử
dụng làm tín hiệu vào hay ra tuỳ theo định nghĩa trong từ điều khiển. Khi
Reset nó là tín hiệu ra có mức thấp.

- Khi sử dụng như đầu ra (Mode không đồng bộ trong), đầu SYNDET sẽ
có mức cao để chỉ ra rằng 8251A chứa ký tự đồng bộ trong Mode thu. Nếu
8251A được chương trình hoá để sử dụng 2 ký tự đồng bộ, khi đó SYNDET
sẽ có mức cao tại thời điểm giữa của bit cuối cùng của ký tự đồng bộ thứ hai.
SYNDET tự động Reset khi có thao tác đọc.
- Khi sử dụng làm đầu vào (Mode đồng bộ ngoài), thì một tín hiệu có cực
tính dương sẽ gây ra sự bắt đầu của một tập các ký tự dữ liệu tại sườn lên của
xung RxC tiếp sau. Một khi đã ở mode đồng bộ, thì mức cao của tín hiệu vào

145
có thể bị đảo. Khi SYNDET ngoài được chương trình hoá thì SYNDET trong
sẽ không được phép.

BREAK DETECT (Async, mode only). Đầu ra này sẽ có mức cao cho
đến khi thu xong 2 bit Stop liên tiếp. Nó có thể được sử dụng như một bit
trạng thái.

- Đệm ở phần phát của mạch 8251A là loại đệm kép, bao gồm đệm giữ
và đệm phát. Trong khi 1 ký tự đang được chuyển đi ở đệm phát thì một ký tự
khác có thể được đưa từ CPU sang đệm giữ. Các tín hiêu TxRDY và
TxEMPTY cho biết trạng thái của các đệm này khi mạch 8251A hoạt động.
- Khi đệm ở phần thu đầy thì sẽ có tín hiệu RxRDY=1. Nếu cho đến khi
phần thu nhận được ký tự mới mà CPU không kịp thời đọc được ký tự cũ thì ký
tự cũ sẽ bị mất do bị đè bởi ký tự mới nhận được, hiện tượng này gọi là thu đè.
❖ Các thanh ghi bên trong của 8251A

Như đã trình bày ở trên chân C D (giả sử được nối vào A0 của bus địa
chỉ) cùng với các tín hiệu WR vµ RD sẽ chọn ra 4 thanh ghi bên trong của ạch
USART: Thanh ghi đệm dữ liệu thu, thanh ghi đệm dữ liệu phát, thanh ghi
trạng thái và thanh ghi điều khiển, Bảng 3.11.

Bảng 3.11. Chọn các thanh ghi bên trong của 8251A

A0 RD WR Chọn ra
0 0 1 Thanh ghi đệm dữ liệu thu
0 1 0 Thanh ghi đệm dữ liệu phát
1 0 1 Thanh ghi trạng thái
1 1 0 Thanh ghi điều khiển
Với cùng một địa chỉ của thanh ghi điều khiển ta có thể thâm nhập được
2 thanh ghi khác nhau: thanh ghi chế độ và thanh ghi lệnh. Sau khi có xung
Reset, phải ghi liên tiếp từ chế độ sau đó là từ lệnh vào địa chỉ dành cho thanh
ghi điều khiển để định nghĩa các chế độ và phương thức làm việc của mạch
8251A.

146
+ Thanh ghi từ chế độ

Dạng thức của thanh ghi từ chế độ được biểu diễn trên Hình 3.50.

D7 D6 D5 D4 D3 D2 D1 D0

S2 S1 EP PEN L2 L1 B2 B1

Hình 3.50. Dạng thức của thanh ghi chế độ của 8251A

Các bit D1D0 là hệ số nhân của tốc độ. Giá trị của chúng được quy định:

00 : § ångbé
01: x1
B2B1 =
10 : x16
11: x64

Các bit D3D2 quy định độ dài từ mã

00 : 5 bit
01: 6 bit
L 2L1 =
10 : 7 bit
11: 8 bit

Bit D4=1 cho phép sử dụng parity-Parity Enable

Bit D5=1 parity chẵn-Even parity

Bit D7D6 quy định số lượng bit Stop

00 : kh«nghîp lÖ
01: 1 bit
S2S1 =
10 : 1 + 1/2 bit
11: 2 bit

Trong từ chế độ, đối với ký tự cần truyền có thể chọn số bit (kiểu mã)
của ký tự, số bit stop và tốc độ truyền. Nếu ta có sẵn tần số xung đồng hồ cho
phần thu hoặc phần phát (giả sử là Fclk) và ta muốn truyền ( thu/phát) dữ liệu
với tốc độ X baud, ta phải chọn hệ số nhân tốc độ truyền k sao cho thoả mãn
biểu thức:

Fclk = X.k, trong đó X là các tốc độ truyền tiêu chuẩn.

147
Ví dụ: Nếu ta có tần số xung đồng hồ phát là 19.200Hz và ta muốn
truyền dữ liệu với tốc độ 1.200 baud thì ta phải ghi từ chế độ với 2 bit cuối là
10 để chọn được hệ số nhân tốc độ truyền là 16, vì 1.200x16=19.200. Với
việc dùng tần số đồng hồ cho phần thu/phát cao hơn so với tốc độ truyền ta sẽ
giảm được lỗi khi truyền thông tin. Tất nhiên khi làm việc ở chế độ đồng bộ
thi ta phải có từ chế độ với 2 bit cuối là 00.

+ Thanh ghi từ lệnh

Dạng thức của thanh ghi từ lệnh được biểu diễn trên Hình 3,51

D7 D6 D5 D4 D3 D2 D1 D0

EH IR RTS ER SBRK RxE DTR TxEN

Hình 3.51. Dạng thức của thanh ghi từ lệnh của 8251A

Bit D0 (Transmit Enable)= 1 : chophÐpph¸t


0 : cÊmph¸t

Bit D1 (Data terminal ready)=1 sẽ làm chân ra DTR = 0 (tích cực)

Bit D2 (Receiver Enable)= 1 : chophÐpthu


0 : cÊmthu

1 : lµmch©n ra TxD = 0 (c¾t)


Phát ký tự báo cắt (Break)=
0 : ph¸t b ×nh th-êng

Bit D4=1: xoá các cờ báo lỗi PE, OE, FE.

Bit D5 (Request to send) yêu cầu truyền =1 làm chân RTS= 0

Bit D6=1: khởi động mềm

Bit D7=1: tìm ký tự đồng bộ

Từ lệnh phải được ghi vào 8251A ngay sau khi ghi từ chế độ. Mọi từ ghi
vào 8251A sau khi ghi từ chế độ đều được coi là từ lệnh. Mỗi bit của từ lệnh
mang một ý nghĩa riêng.

148
Bit D0 =1 cho phép phần phát làm việc, nếu lúc này ta đã có CTS=0 thì
bắt buộc chân TxRDY=1 để báo cho CPU là đệm giữ rỗng. Tín hiệu này có
thể được nối với chân INTR của CPU để lưu ý CPU đưa ký tự sang 8251A
theo cách điều khiển trao đổi dữ liệu bằng ngắt.

Bit D1=1 cho phép điều khiển tín hiệu có mức thấp tại chân DTR

Bit D2=1 cho phép phần thu làm việc, nếu lúc này ta có ký tự tại đệm thu
(sẵn sàng để CPU đọc) thì bắt buộc chân RxRDY=1, báo cho CPU là đệm thu
đầy. Tín hiệu này có thể được nối với chân INTR của CPU để lưu lý CPU đọc
ký tự từ 8251A theo cách điều khiển trao đổi dữ liệu bằng ngắt.

Bit D3=1 cho phép 8251A đưa ra ký tự gián đoạn (ký tự với tất cả các bit
bằng 0) tại chân TxD.

Bit D4=1 cho phép xoá tất cả các bit cờ trong thanh ghi từ trạng thái của
8251A gồm cờ lỗi parity (PE), cờ thu đè (OE) và cờ lỗi khung (PE) về 0.

Bit D5=1 cho phép điều khiển có mức thấp tín hiệu tại chân
(
RTS, RTS= 0 ).
Bit D6=1 cho phép xoá mạch 8251A bằng chương trình về trạng thái
nhận lệnh ban đầu. Sử dụng khả năng này để đảm bảo chắc chắn là USART
8251A bị xoá. Lúc này lại phải ghi từ chế độ và sau đó là từ lệnh cho 8251A.

Trong chế độ đồng bộ, bit D7=1 cho phép mạch 8251A bắt đầu tìm ký tự
đồng bộ trong bản tin thu được. Nếu tìm được, nó sẽ đưa thông báo ra bằng
mức cao trên chân SYNDET/BRKDET.

USART cho phép đọc được các thông tin trạng thái làm việc của mạch
8251A bằng cách đọc vào CPU nội dung các thanh ghi trạng thái của nó. Nhờ
đọc các bit trạng thái ta biết được tình trạng của việc truyền dữ liệu và ta có
thể dùng các bit này vào để viết chương trình điều khiển bằng phương pháp
thăm dò việc trao đổi dữ liệu giữa CPU và USART.

Thanh ghi trạng thái có dạng thức trên Hình 3.52.

149
D7 D6 D5 D4 D3 D2 D1 D0

DSR SYNDET FE OE PE TxEMTY RxRDY TxRDY

Hình 3.52. Dạng thức của thanh ghi trạng thái của 8251A
Bit D0=1: phần phát sẵn sàng

Bit D1=1: phần thu sẵn sàng

Bit D2=1: đệm giữ và đệm phát rỗng

Bit D3D4D5=111: lỗi parity, lỗi Overrun, lỗi Frame.

Bit D6=1: đã tìm được ký tự đồng bộ.

Bit D7=1: Modem sẵn sàng.

Ý nghĩa của các bit trạng thái đã khá rõ ràng. Cần nói thêm là lỗi khung
chỉ có ý nghĩa khi truyền không đồng bộ. Để điều khiển trao đổi dữ liệu kiểu
thăm dò ta sẽ phải liên tục đọc và kiểm tra các bit trạng thái liên quan để có
quyết định cụ thể.

❖ Mô tả hoạt động của 8251A

Tất cả các chức năng 8251A được định nghĩa bằng phần mềm hệ thống.
Tập tất cả các từ điều khiển phải được gửi tới để khởi đầu cho 8251A định
dạng thông tin. Trong Mode đồng bộ, có thể chọn ký tự đồng bộ trong hay
ngoài.

Một chương trình hoá 8251A đáp ứng được các chức năng thông tin. Đầu
ra TxRDY đưa mức cao tới CPU báo rằng 8251A sẵn sàng nhận ký tự từ
CPU, và nó tự động Reset (về 0) khi CPU gửi ký tự ra 8251A. Theo chiều
ngược lại, 8251A thu một chuỗi dữ liệu từ MODEM hay thiết bị vào/ra. Khi
nhận xong toàn bộ một ký tự thì chân RxRDY có mức 1 để báo cho CPU biết
ký tự đã sẵn sàng. Đầu ra này tự động về 0 khi CPU thực hiện chu kỳ đọc dữ
liệu. 8251A không thể bắt đầu phát cho đến khi bit TxE được đặt trong chỉ thị

150
lệnh (chưa có lệnh gửi ra) và nó nhận đầu vào CTS. Đầu ra TxD giữ ở trạng
thái marking khi reset.

Trước khi bắt đầu thực hiện thông tin nối tiếp, CPU phải gửi các từ điều
khiển tới 8251A. Tín hiệu điều khiển này định nghĩa toàn bộ chức năng khởi
đầu của 8251A và nó phải được ghi ngay sau khi Reset.

Từ điều khiển được chia thành 2 loại: chỉ thị dạng và chỉ thị lệnh. Chỉ thị
dạng (Mode instruction) để định nghĩa các đặc tính hoạt động chung của
8251A, nó được ghi ngay sau khi Reset 8251A. Còn chỉ thị lệnh (Command
instruction) để xác định từ điều khiển hoạt động thực của 8251A.

+ Mode không đồng bộ


- Phát: Khi một ký tự từ CPU gửi tới, 8251A tự động cộng thêm vào
khung một bit Start (mức 0), bit parity (chẵn hay lẻ) và 1 đến 2 bit Stop, ký tự
được dịch và phát nối tiết ra đầu ra TxD tại các sườn xuống của xung TxC với
các hệ số nhân là 1, 1/16 hay 1/64 của xung tuỳ theo từ định nghĩa Mode.

Khi không có tín hiệu phát thì đầu TxD có mức cao trừ khi được chương
trình hoá để phát ký tự BREAK (mức thấp) liên tiếp.

- Thu: Bình thường đầu vào RxD có mức cao. Khi có bit Start (mức
thấp), 8251 bắt đầu khởi động. Bit Start được kiểm tra lại tại điểm giữa của
xung Start (chỉ sử dụng trong mode x16 và x64). Nếu mức trong lần kiểm tra
là đúng mức thấp, bit Start có hiệu lực và bộ đếm bit bắt đầu đếm. Bộ đếm bit
lấy mẫu tại điểm giữa bit của các bit dữ liệu, parity và stop. Nếu sai số Parity
xảy ra, cờ sai số parity được lập. Các bit được lấy mẫu thử trên chân RxD tại
sườn lên của xung RxC. Nếu một mức thấp có mặt tại thời điểm lấy mẫu bit
Stop, thì cờ sai số Frame được lập. Chú ý rằng, việc thu chỉ yêu cầu 1 bit Stop
mà không cần biết chương trình yêu cầu bao nhiêu bit. Ký tự được đưa tới bộ
đệm song song I/O của 8251A. Khi đó chân RxRDY được đưa lên mức cao
báo cho CPU biết ký tự đã sẵn sàng. Nếu một ký tự trước đó chưa được CPU
nhận vào mà ký tự sau thay thế nó trong bộ đệm I/O thì cờ sai số OVER RUN

151
được lập. Tất cả các cờ có thể được reset (đặt lại 0) bằng bit trong chỉ thị
Command. Sự thiết lập của bất kỳ một cờ sai số nào cũng không ảnh hưởng
đến hoạt động của 8251A.

+ Mode đồng bộ

- Phát : Đầu ra TxD có mức cao cho đến khi CPU gửi ký tự đầu tiên của
nó tới 8251A và thường là một ký tự đồng bộ. Khi CTScó mức 0 (clear to
send-báo rằng Modem đã sẵn sàng) thì ký tự đầu tiên được phát nối tiếp ra
đầu ra tại thời điểm sườn xuốn của xung TxC. Dòng dữ liệu ra liên tục và có
tốc độ cùng với xung TxC

Nếu CPU chưa kịp gửi ký tự cho 8251A, các bộ đệm phát của 8251A sẽ
trống rỗng. Khi đó các ký tự đồng bộ, hay ký tự chuẩn (nếu trong mode ký tự
đồng bộ đơn) sẽ tự động chèn vào dòng dữ liệu TxD, và chân TxEMTY sẽ có
mức cao cho đến khi có ký tự đưa tới 8251A.

- Thu: Trong mode này ký tự đồng bộ có thể là trong hay ngoài. Nếu
mode đồng bộ được chương trình hoá, lệnh Enter Hunt phải được đặt trong từ
chỉ thị Command đầu tiên được viết. Dữ liệu tại chân RxD được lấy mẫu tại
sườn lên của xung RxC. Các bit ký tự đồng bộ được so sánh với mẫu chứa
trong bộ đệm Rx cho đến khi có sự phù hợp xảy ra. Nếu 8251A được chương
trình hoá để sử dụng 2 ký tự đồng bộ, thì ký tự nhận được tiếp sau cũng được
so sánh. Cả hai ký tự đồng bộ được tách ra trên các đầu cuối trong mode Hunt
và là các ký tự đồng bộ đơn. Chân SYNDET có mức cao và tự động reset khi
có tín hiệu đọc trạng thái (Status Read).

Trong mode đồng bộ ngoài, sự đồng bộ đạt được bằng cách đưa mức cao
tới đầu vào SYNDET (Synchronous detection), khi đó buộc 8251A ra khỏi
mode Hunt. Mức cao có thể bị thay đổi sau một chu kỳ RxC. Một lệnh Enter
Hunt sẽ không có hiệu lực trong mode đồng bộ.

152
Sai số Parity và sai số tràn được kiểm tra cả hai trong cùng một cách như
trong mode Rx đồng bộ. Parity được kiểm tra khi không có trong Hunt kể cả
trong trường hợp việc thu cho phép hay không.

CPU có thể ra lệnh cho việc thu chuyển sang mode Hunt nếu đồng bộ
mất. Điều này cũng đặt cho tất cả các bit đã được thu trong bộ đệm thành 1.
Như vậy sự ngăn ngừa lỗi Syndet có thể được thực hiện bằng dữ liệu trong bộ
đệm Rx tại thời điểm Enter Hunt. Chú ý rằng, Syndet FF được đặt lại bằng
chương trình tại mỗi trạng thái đọc mà không bị ảnh hưởng bởi đồng bộ trong
hay ngoài. Trong mode Sync, sự tìm kiếm đồng bộ làm một chức năng, nhưng
chỉ xảy ra như một từ đã biết tại biên, điều này không có mode Hunt. Như
vậy, nếu một trạng thái đọc xuất hiện Syndet và trạng thái thứ hai cũng là
Syndet, thì các ký tự Syndet được chương trình hoá và được thu từ việc đọc
trạng thái trước (nếu cả hai ký tự đồng bộ được chương trình hoá thì cả hai ký
tự được tiếp nhận tới cổng của một chỉ thị Syndet). Khi mode tìm kiếm ngoài
được chọn, Syndet trong không được phép và Syndet FF có thể đặt như bất kỳ
một bit biên.

+ Ví dụ lập trình cho 8251A.

Ví dụ 1: Ta giả thiết có vi mạch 8251A tại địa chỉ cơ bản FFF0h và chân
C D nối với A0 của hệ 8086 – 5MHz.

Kinh nghiệm chỉ ra rằng: muốn cho việc lập trình để khởi đầu cho 8251A
được tin cậy, thay vì tín hiệu Reset cứng ta phải xác định được trạng thái ban
đầu cho 8251A bằng các lệnh ghi số 0 vào thanh ghi điều khiển vài lần. Theo
sổ tay tra cứu của 8251A thì khi ghi liên tiếp vào mạch này, ta phải đảm bảo
không vượt quá thời gian hồi phục TRV=16xTCLK giữa 2 lần ghi, tức là ta phải
có độ trễ giữa hai lần ghi liên tiếp vào 8251A để mạch này hoạt động được tin
cậy. Chương trình khởi đầu cho mạch 8251A nói trên như sau:

MOV DX, 0FFF1h ; địa chỉ thanh ghi điều khiển

MOV AL, 0 ; đưa 0 vào AL để xóa thanh ghi điều khiển

153
MOV BX, 3 ; số lần xóa thanh ghi điều khiển

L2: OUT DX, AL

MOV CX, 2

L1: LOOP L1 ; trễ

DEC BX

LOOP L2

MOV AL, 40h ; từ lệnh để xoá mềm 8251A

OUT DX, AL

MOV CX, 2

L3: LOOP L3 ; trễ

MOV AL, 7Eh ; từ chế độ mới cho 8251A để:

OUT DX, AL ; 1 bit Stop, parity chẵn, 16x

MOV CX, 2

L4: LOOP L4 ; trễ

MOV AL, 37h ; từ lệnh mới cho 8251A

OUT DX, AL

MOV CX, 2

L5: LOOP L5 ; trễ

. . .

Đoạn chương trình với vòng lặp tại nhãn L2 để ghi 3 lần giá trị 00 (mỗi
lần có trễ dài hơn 16 Tclk) vào thanh ghi điều khiển của 8251A. Tiếp theo là
lệnh xoá mềm 8251A để chuẩn bị nạp từ chế độ mới. Sau đó mới đưa dữ liệu
vào từ chế độ và tiếp theo là từ lệnh để khởi đầu cho 8251A. Giữa các lệnh
ghi vào 8251A là các vòng lặp để tạo thời gian trễ

154
Ví dụ 2: Để thưc hiện trao đổi tin (ví dụ trao đổi với CRT), ta có các
thuât toán phát tin và nhận tin như trên Hình 3.53

Start Start

Khởi phát ghi chế độ Khởi phát ghi chế độ

Ghi lệnh (DTR và TxEN) Ghi lệnh (DTR, RTS và RxEN)

Đọc trạng thái (DSR và TxRDY) Đọc trạng thái (DSR và TxRDY)

No No
Sẵn sàng? Sẵn sàng?
Yes Yes
Ghi dữ liệu ra thanh ghi đệm Đọc dữ liệu vào từ thanh ghi đệm

Ghi lệnh phát RTS End

End

a) Cho chương trình phát b) Cho chương trình thu

Hình 3.53. Lưu đồ cho các chương trình 8251A

Từ đó ta có thể viết chương trình cho chương trình phát:

MOV AL, 03h ;Gửi DTR (d1=1) và TxEN (d0=1)

OUT DX, AL ;Gửi lệnh DTR, TxEN vào th.ghi điều


khiển

Test: IN AL, DX ;Đọc thanh ghi trạng thái

AND AL, 81h ;Che và kiểm tra các bit

CMP AL, 81h ;trạng thái d7 và d0

JNZ Test

MOV DX, 0FFF0h ;Địa chỉ của thanh ghi dữ liệu

MOV DX, data-to-send ;để gửi dữ liệu

155
OUT DX, AL

MOV DX, 0FFF1h ;Địa chỉ của thanh ghi điều khiển

MOV AL, 21h ;Gán lệnh cho RTS (d5) và TxEN (d0)

OUT DX, AL ;để phát số liệu ra/

END.

3.5. Ghép nối 8086 với một số thiết bị ngoại vi

3.5.1. Ghép nối với bàn phím

3.5.1.1. Phím ấn (công tắc)

Bàn phím là một thiết bị vào rất thông dụng trong các hệ vi xử lý. Trong
trường hợp đơn giản nhất đó có thể chỉ là 1 công tắc có gắn phím (mà ta
thường chỉ quan tâm đến ký hiệu trên mặt phím) nối vào 1 chân nào đó của bộ
vi xử lý; ở mức phức tạp hơn đó có thể là hàng chục công tắc có gắn phím
được tổ chức theo một ma trận; phức tạp hơn nữa, đó là một hệ vi xử lý
chuyên dụng quản lý cả trăm công tắc có gắn phím với nhiệm vụ nhận ra
phím được gõ và tạo mã đưa đến cho hệ vi xử lý.

Dù là đơn lẻ hay là tập hợp các phím, khi phối ghép chúng với bộ vi xử
lý ta cũng phải thoả mãn một số yêu cầu đặc biệt để đảm bảo cả hệ thống hoạt
động đúng.

Có rất nhiều loại công tắc được dùng trong phối ghép với bộ vi xử lý
nhưng có thể xếp chúng vào 2 nhóm:

+ Công tắc có tiếp xúc cơ khí ( kiểu điện trở: điện trở thay đổi khi ấn và
khi nhả phím).

+ Công tắc không có tiếp xúc cơ khí (kiểu điện dung: điện dung thay đổi
khi ấn và khi nhả phím hoặc kiểu hiệu ứng Hall: điện áp thay đổi khi ấn và
khi nhả phím). Trong các loại công tắc đó, loại công tắc kiểu điện trở dựa trên
tiếp xúc cơ khí là rất thông dụng trong thực tế. Trên Hình 3.54 là cách nối

156
công tắc vào mạch điện và đáp ứng của nó khi có lực tác động vào phím (ấn
phím).
F
+5V
1mN

Ura
F t

Ura
5V

.. ..
t
20ms 20ms

Hình 3.54. Ảnh hưởng độ rung của công tắc

Nhìn vào đáp ứng về mặt cơ-điện của công tắc trên Hình 3.55 ta nhận
thấy: vì công tắc là một hệ thống có quán tính, do đó khi ta ấn phím rồi nhả
phím, xung điện thu được ở đầu ra của nó không phải là liên tục mà bị ngắt
quãng tại các giai đoạn quá độ (lúc bắt đầu nhấn phím và lúc bắt đầu nhả
phím). Điều này xảy ra là do trong kết cấu của công tắc có các bộ phận đàn
hồi, khi bị tác động của lực bên ngoài các kết cấu động của công tắc bị giao
động là cho bề mặt tiếp xúc của công tắc bị biến đổi. Trong thực tế thì mỗi
quá trình quá độ trên kéo dài khoảng 10-20ms. Nếu trong thời kỳ quá độ ta
đọc thông tin từ công tắc thì rất dễ nhận được thông tin sai lệch về trạng thái
của công tắc, vì vậy người ta thường phải chờ cỡ 10-20ms sau khi công tắc bị
ấn hoặc nhả để đọc được trạng thái của công tắc trong giai đoạn xác lập.

Việc khử nhiễu rung có thể được thực hiện bằng phần mềm bằng cách
giữ chậm 20 ms sau (khoảng thời gian để cho công tắc ổn định) khi phát hiện
phím được ấn rồi lấy mẫu.

157
3.5.1.2. Bàn phím

Khi cần vào một số lượng lớn các ký hiệu, ta sử dụng bàn phím, tuỳ theo
từng yêu cầu của bài toán cụ thể mà bàn phím được sử dụng có thể nhiều hay
ít phím. Sơ đồ chức năng chung của một bàn phím có dạng trên Hình 3.55.

Khối bàn phím chứa các phím, được sắp xếp theo một phương thức nhất
định. Trong bàn phím, mỗi phím sẽ tương ứng với một ký hiệu, và khi ấn một
phím sẽ cho đầu ra một mã nhị phân tương ứng.

Khối điều khiển và mã hóa có 3 chức năng chính là:

- Phát hiện ra phím được ấn Các dây


dữ liệu
có quy định mức ưu tiên. Khối
điều Khối bàn
- Chống rung cho phím được Các dây khiển và phím
điều khiển mã hoá
ấn.

- Tạo ra các mã bàn phím


tương ứng với phím được ấn. Hình 3.55. Sơ đồ của mạch bàn phím

Sau đó nó đưa dữ liệu ra dưới dạng song song hay nối tiếp tuỳ theo yêu
cầu.

Việc điều khiển bàn phím có thể dùng phần cứng, phần mềm, hay kết
hợp cả cứng và mềm. Khi tổ chức bàn phím, tuỳ theo số lượng các phím được
sử dụng mà ta có thể có hai loại. Trong giáo trình này chỉ trình bày việc điều
khiển bàn phím bằng phần mềm.

Trên Hình 3.56 trình bày sơ đồ ghép nối bàn phím 16 phím được tổ chức
theo kiểu ma trận 4x4. Phần cứng của mạch điều khiển chỉ là những cổng vào
ra, phần mềm sẽ làm toàn bộ chức năng xác định phím ấn, khử rung và mã
hoá bàn phím của mạch điều khiển, thuật toán chương trình trên Hình 3.57.

158
R
+E
R
Cổng T
ra PC4
+5v

d0-d7 d0-d7 R R R R

PA3
“0” “1” “2” “3” R
PA2
“4” “5” “6” “7”
PA1 R
“8” “9” “10” “11”
PA0 “12” “13” “14” “15” R

R
d0-d7
y3 y2 y1 y0
PB7
PB6
PB5
PB4
PB3
PB2
PB1
PB0

Hình 3.56. Bàn phím điều khiển bằng chương trình

Trong thuật toán điều khiển bàn phím, đầu tiên chương trình phải xác
định có phím bị dính hay không bằng cách đưa mức 0 ra tất cả các bit của
cổng ra. Sau đó ta đọc cổng vào và kiểm tra trên các bit d0-d3. Nếu có một bit
bất kỳ có giá trị 0, thì bàn phím sẽ có một phím nào đó bị dính. Để cho chắc
chắn, ta có thể thực hiện công đoạn này vài ba lần.

Sau đó ta đưa mức 0 lần lượt ra các hàng theo một thứ tự và lần lượt đọc
cổng vào để kiểm tra. Nếu tại thời điểm nào đó, có một bit nào đó bằng 0 thì
đã có phím ấn. Chương trình phải giữ chậm 20ms, và sau đó lại lấy mẫu bằng
cách đọc vào tương tự. Nếu phím vẫn ấn, ta đưa mã ASCII vào tương ứng với
phím.

159
Bắt đầu

Đưa 0 ra mọi hàng

Bàn phím
Đọc các cột tốt hay xấu

S
Phím tốt? Đưa 0 ra từng hàng

Đ
Đọc các cột
Đọc các cột
Phát hiện Tạo mã
phím bị ấn S
S Có phím Tìm thấy?
ấn?
Đ
Đ
Tạo mã phím
Giữ chậm 20ms Chống rung

Kết thúc
Đọc các cột

S Có phím Đ
ấn?

Hình 3. 57. Lưu đồ thuật toán điều khiển bàn phím

Chương trình được viết tương ứng theo thuật toán trên với các giả thiết.

- Cổng ra là cổng PA, cổng vào PB và cổng thông báo là PC đều làm
việc ở Mode0 của IC cổng 8255A có địa chỉ cơ sở là 60h.

- Bảng mã bàn phím với phím “0” có mã 61h, “1” là 62h,..., phím “15”
có mã là 70h được chứa trong bảng nhớ có địa chỉ đầu là 0000:0100h.

Dữ liệu tương ứng với các phím là:

“0” “1” “2” “3” “4” “5” “6” “7


77h 7Bh 7Dh 7Eh B7h BBh BDh Beh

“8” “9” “10” “11” “12” “13” “14” “15”


D7h DBh DDh Deh E7h Ebh Edh Eeh

Trong phần khai báo ta có thể định nghĩa

160
PA EQU 60h

PB EQU 61h

PC EQU 62h
Chương trình chính có đoạn kiểm tra bàn phím là:

XOR AL, AL ;Xoá các bit d0-d3

OUT PA, AL ;và gửi ra cổng ra

IN AL, PB ;Đọc cổng vào

AND AL, 0Fh ;và che 4 bit cao

CMP AL, 0Fh ;rồi kiểm tra có phím dính

JNE sai ;Nếu có thông báo sai

;Đoạn chương trình chính tiếp tục ở đây

sai: MOV AL, 10h ;đặt bit d4=1

MOV PC, AL ;và gửi ra PC4 để sáng LED

Thủ tục nhập phím

RD_BRD PROC

;Thủ tục đọc và tạo mã bàn phím cho phím được ấn


;Ra: AL chứa mã bàn phím của phím được ấn

PUSHF
PUSH BX

PUSH CX

PUSH AX

XOR AL, AL ;Xoá các bit d0-d3

OUT PA, AL ;và gửi ra cổng ra


;Kiểm tra có phím ấn hay không, nếu có thì tạo trễ

k_tra: IN AL, PB ;Đọc cổng vào

161
AND AL, 0Fh ;và che 4 bit cao

CMP AL, 0Fh ;rồi kiểm tra có phím ấn?


JE k_tra ;Nếu không, chờ phím ấn

MOV CX, 5880 ;có, thì trễ 20ms chống rung

Tre: LOOP tre

;kiểm tra lại xem có phím ấn hay không

IN AL, PB

AND AL, 0Fh ;và che 4 bit cao

CMP AL, 0Fh ;có phím ấn?

JE k_tra ;Nếu không, chờ phím ấn

;Tìm phím ấn

MOV AL, 0Feh ;đưa ra cổng ra

MOV CL, AL ;cất mẫu

hgsau: OUT PA, AL ;đưa ra cổng ra

IN AL, PB

AND AL, 0Fh ;và che 4 bit cao


CMP AL, 0Fh ;Đã tìm thấy phím ấn

JNE taoma ;Nếu không, chờ phím ấn


ROL CL, 1 ;không, đổi mẫu

MOV AL, CL

JMP hgsau ;làm tiếp với hàng sau

;Tạo mã bàn phím tương ứng với phím ấn trong bảng mã địa chỉ
0200h

;Trước hết ta tìm số thứ tự của phím ấn


MOV CX, 0Fh ;Đặt số so sánh

162
Taoma: XOR BX, BX ;Đặt BX=0

IN AL, PB ;Đọc dữ liệu cổng vào tương ứng với phím ấn


Lap: CMP AL, 0100[BX];So sánh với bảng mã dữ liệu

JE thoi ;nếu trùng thì thôi

INC BX ;nếu không trùng thì so sánh cho đến hết

LOOP lap

MOV AL, 01h ;Nếu tất cả các phím đều không trung

OUT PC, AL ;thì thông báo ra đèn LED

JMP thoat ;rồi thoát

;sau đó đặt mã bàn phím tương ứng vào AL

thoi: MOV AL, BL

MOV BX, 0200h

XLAT

Thoat: POP DX

POP CX

POP BX
POPF

RET
RD_BRD END

3.5.2. Ghép nối với bộ hiển thị

3.5.2.1. Ghép nối với đèn 7 thanh.

Người ta dùng các bộ giải mã BCD ra mã 7 thanh để cấp cho các đèn
hiển thị 7 thanh. (Hình 3.58).

163
A a a A a a
B b f b B b f b
g g
C ... C ...
g c D g g c
D g
7447 d 7449 d

a. Cực tính âm b. Cực tính dương


Hình 3.58. Mạch nối trực tiếp LED 7 đoạn
Trong trường hợp dòng ra của bộ giải mã không tương ứng với dòng vào
của đèn 7 thanh, cũng tương tự ta phải dùng các bộ khuyếch đại dòng để phối
hợp. Mạch giải mã 7447, 7449 được nối với cổng ra và lệnh OUT sẽ làm sáng
đèn với số tương ứng.

Phương pháp hiển thị trực tiếp này có nhiều nhược điểm: tốn linh kiện
(mỗi đèn là 1 bộ giải mã, 1 cổng) khi tăng số đèn LED, tổn hao công suất và
tuổi thọ của đèn giảm do đèn phải làm việc liên tục. Do đó ta sử dụng mạch
phối ghép hiển thị động, làm việc theo nguyên tắc dồn kênh.

Một dạng của mạch phối ghép hiển thị động được thực hiện trên Hình 3.59.

+ Nguyên lý hoạt động:

- Giá trị số cần hiển thị được gửi đến cổng ra từ CPU dưới dạng mã BCD
được mạch SN7447 giải mã và tạo ra các tín hiệu điều khiển thích hợp đến
các chân a, b, c,..., g của các LED. Giá trị của số được hiển thị phục thuộc vào
tín hiệu này.

- Tuy nhiên đèn nào được sáng phụ thuộc vào mạch đưa nguồn cấp cho
đèn bằng cách đưa tín hiệu mở thông các tranzitor tương ứng.

Như vậy để sáng các đèn, chương trình phần mềm phải cho hiển thị và
quét lần lượt từ đèn đầu cho đến đèn cuối, rồi lại lặp lại. Nếu cứ 2 ms ta phải
đưa dữ liệu ra cổng để hiển thị cho một đèn, như vậy với 8 đèn phải mất 16ms

164
cho một chu kỳ lặp (hay tần số lặp là 60 lần trong 1 s) làm cho ta có cảm giác
sáng liên tục.

+5V
PA7 C
PA6 B ̅̅
𝑦7̅̅
D0-D7 R R R
PA5 A ...
̅̅̅̅̅̅
G2A ̅̅̅̅
𝑦1
̅̅̅̅̅̅
G2B ̅̅̅̅
𝑦0
PA4 G1
PA3
74LS138
PA2
PA1
Từ g/mã PA0
...
địa chỉ 8255A

+5V

a b c d e f g LT
7447 RBI
D C B A BI

Hình 3.59. Phối ghép hiển thị động

Ví dụ: Hiển thị các số 1, 2, 3, 4, 5, 6, 7, 8 trên các đèn (theo thứ tự từ trái
qua phải). Giả thiết địa chỉ cổng PA và CWR của 8255A là 00h, 03h.

Giải:

Để sáng các số ở các đèn phải gửi các giá trị tương ứng ra cổng PA của
8255A:

Số 1: 11h Số 2: 32h

Số 3: 53h Số 4: 74h

Số 5: 95h Số 6: 0B6h

Số 7: 0D7h Số 8: 0E8h

165
Chương trình:

MOV AL, 80h ; Cấu hình để

OUT 03h, AL ;PA là cổng ra, mode0

vòng_tiep:

MOV AL, 11h ; Hiển thị

OUT 00h, AL ; số 1

MOV CX,7 ; Hiển thị 7 số còn lại

so_tiep:

ADD AL, 21h ; Cộng nội dung AL với 21h

OUT 00h, AL ; để hiển thị số tiếp theo.

LOOP so_tiep

JMP vong_tiep

3.5.2.2. Ghép nối với LCD

+ Sơ đồ Text LCD HD44780 trên Hình 3.60, với các tham số cơ bản:

- Kích thước hiển thị: 16 ký tự x 2 dòng.

- Màu hiển thị: đen/trắng

- Chế độ giao tiếp: 8 bit hoặc 4


bit
VDD
WSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E

- Cỡ chữ hiển thị: 5x7 hoặc


5x10 Hình 3.60. Sơ đồ Text LCD 44780

+ Chức năng của LCD HD 44780 trên Bảng 3.12.

166
Bảng 3.12. Chức năng của LCD HD 44780
Chân Ký hiệu Mức logic I/O Chức năng
số
1 VSS - - GND
2 VDD - - +5v
3 VEE - I Điện áp điều chỉnh tương phản

4 RS 0/1 I Lựa chọn thanh ghi


0: thanh ghi lệnh
1: thanh ghi dữ liệu
5 RW 0/1 I 0: ghi vào LCD
1: đọc từ LCD
6 E 1,10 I Tín hiệu cho phép
7-14 D0-D7 0/1 I/O Data
15 Vcc - -
16 GND - -
+ Mã lệnh điều khiển LCD HD 44780 trên Bảng 3.13.

Bảng 3.13. Mã lệnh điều khiển LCD HD 44780


Mã lệnh (HEX) Chức năng
1 Xóa màn hình hiển thị
2 Trở về đầu dòng
4 Giảm con trỏ (dịch con trỏ sang trái)
6 Tăng con trỏ (dịch con trỏ sang phải)
5 Dịch hiển thị sang phải
7 Dịch hiển thị sang trái
8 Tắt con trỏ, tắt hiển thị
A Tắt hiển thị, bật con trỏ
C Bật hiển thị, tắt con trỏ
E Bật hiển thị, nhấp nháy con trỏ
F Tắt con trỏ, nhấp nháy con trỏ
10 Dịch vị trí con trỏ sang trái
14 Dịch vị trí con trỏ sang phải
18 Dịch toàn bộ hiển thị sang trái
1C Dịch toàn bộ hiển thị sang phải
80 ép con trỏ về đầu dòng thứ nhất
C0 ép con trỏ về đầu dòng thứ hai
38 Khởi tạo LCD 2 dòng, ma trận 5x7

167
+ Sơ đồ ghép nối: được thực hiện trên Hình 3.61

LCD 44780

VDD
WSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
R=10K

E
PC0
D0-D7 PC1
PC2

PA0
PA1
PA2
PA3
PA4
̅̅̅
CS PA5
Từ giải PA6
mã địa PA7
chỉ

Hình 3.61. Ghép nối với LCD 44780

- Chân VDD của LCD nối với nguồn +5v.

- Chân VSS của LCD nối đất.

- Chân VEE của LCD nối tới một biến trở để điều chỉnh độ tương phản
của LCD

- Chân RS (chọn thanh ghi) của LCD nối với PC0 của PPI 8255A

- Chân RW (đọc/ghi) của LCD nối với PC1 của PPI 8255A

- Chân E (cho phép) của LCD nối với PC2 của PPI 8255A

- 8 chân dữ liệu D0-D7 của LCD được nối với PA0-PA7 của PPI 8255A

Giả thiết rằng địa chỉ các cổng PA, PB, PC, CWR lần lượt có địa chỉ: 0h,
01h, 02h, 03h. Ta có chương trình hiển thị hai dòng trên LCD như sau:

168
PA equ 00h
PB equ 01h
PC equ 02h
CWR equ 03h
nd_CWR equ 80h
lap_PC0 equ 01h
xoa_PC0 equ 00h
lap_PC1 equ 03h
xoa_PC1 equ 02h
lap_PC2 equ 05h
xoa_PC2 equ 04h
line1: db " CHAO CAC BAN ",0
line2: db " CHUC HOC TOT! ",0
MAIN PROC
call int_8255A
call int_lcd
call datawrt
MAIN ENDP
;------------------hởi tạo PPI 8255A------------------------------------
int_8255A proc
mov AL, 80h
out CWR, AL
ret
;--------------Chương trình con khởi tạo LCD ------------------------
int_lcd proc
mov AL, 1h ; xóa màn hình
call comnwrt ;cho phép ghi lệnh vào LCD
mov AL,38h ; khởi tạo LCD (hai dòng 5x7)
call comnwrt ; ghi lệnh vào LCD

169
mov AL, 0Ch ; hiển thị màn hình, tắt con trỏ
call comnwrt ; lệnh vào LCD
ret
; ------------- Chương trình con ghi lệnh-------------------------------
comnwrt proc
out PA,AL ; gửi nội dung thanh ghi AL đến PA
mov AL,xoa_PC0 ; đặt RS=0 để gửi lệnh
out CWR,AL
mov AL,xoa_PC1 ; đặt RW=0 để ghi dữ liệu
out CWR,AL
mov AL,lap_PC2 ; đặt EN=1, cho xung cao
out CWR,AL
nop
nop
mov AL,xoa_PC2 ; đặt EN=0, cho xung cao xuống thấp để thực hiện
lệnh
out CWR,AL
call delay ; tạo trễ
ret
;------------- Chương trình con ghi dữ liệu -----------------------
datawrt proc
; hiển thị dòng 1
LAP:
mov Al,80h ; đưa con trỏ về đầu dòng 1
call comnwrt ; cho phép ghi lệnh vào LCD
lea BX,line1 ; nạp địa chỉ offset của line1 vào BX
call out_line ; hiển thị line1 lên LCD
; hiển thị dòng 2
Mov Al,0C0h ; đưa con trỏ về đầu dòng 2

170
Call comnwrt ; ghi lệnh vào LCD
lea BX, line2 ; nạp địa chỉ offset của line2 vào BX
call out_line ; hiển thị line 2 lên LCD
; tắt LCD và quay về hiển thị lại
mov Al,01h ; tắt LCD
call comnwrt ; ghi lệnh vào LCD
jmp LAP ; quay về nhãn "LAP" để hiển thị lại line1, line2
ret
;-------------------Chương trình con hiển thị một ký tự------------
out_char proc
out PA, AL ; gửi mã ASCII của ký tự cần hiển thị đến LCD
mov AL, lap_PC0 ; đặt RS=1 để ghi dữ liệu
out PA, AL
mov AL, xoa_PC1 ; đặt RW=0 cho phép ghi
out CWR, AL
mov AL, lap_PC2 ; dat EN=1, cho xung cao
out CWR, AL
nop
nop
mov AL, xoa_PC2 ; đặt EN=0, để ghi d.liệu lên LCD
out CWR, AL
call delay ; tạo trễ
ret
; ---------- Chương trình con hiển thị một dòng kết thúc bởi số 0------------
out_line proc
LAP1:
mov AL,[BX] ; chuyển mã ASCII của k.tự cần hiển thị vào AL
cmp AL,0 ; kiểm tra xem đã hết dòng chưa?
jz skip ; nhảy tới nhãn "skip" nếu AL=0 (hết dòng)

171
call out_char ; nếu AL<>0, gọi hàm hiển thị ký tự lên LCD
inc BX ; trỏ tới ký tự cần hiển thị tiếp theo
jmp LAP1 ; quay về nhãn "LAP1" để hiển thị ký tự.
skip:
ret
;-----------------------------------Tạo trễ -----------------------------------------------
delay proc
mov CX,2
del:
nop
loop del
ret
;-------------------------------------------------------------------------------------------
END MAIN

3.5.3. Ghép nối với bộ chuyển đổi AD, DA

Kỹ thuật số ngày càng được ứng dụng rộng rãi với những ưu điểm không
thể phủ nhận được đó là tính chống nhiễu, tính an toàn và bảo mật và tính
kinh tế. Tuy nhiên trong thực tế hầu hết các tín hiệu là tín hiệu tương tự, cho
nên việc phối phép hệ vi xử lý với ngoại vi tương tự phải được thực hiện
thông qua các bộ biến đổi tương tự - số (ADC) và số – tương tự (DAC). Sơ đồ
Hình 3.62 mô tả mạch phối ghép để thực hiện xử lý tín hiệu số.

Các tín
Ra
hiệu từ ADC Cổng Hệ Cổng DAC thế giới
thế giới vào Vi xử lý ra
tương tự
tương tự

Hình 3.62. Mô tả phối ghép trong thế giới tương tự

Theo nguyên lý chung này, tín hiệu tương tự được chuyển thành tín hiệu
số rồi được xử lý trong hệ theo chương trình đã định sẵn và được đưa ra mạch
chuyển thành tín hiệu tương tự.

172
3.5.3.1. Bộ biến đổi tương tự -số

Các mạch biến đổi tương tự- số (ADC) thực hiện biến đổi tín hiệu tương
tự thành tín hiệu số dựa trên định lý Sharnon. Các mạch ADC được tạo ra dựa
trên các nguyên tắc trực tiếp như ADC đếm, ADC xấp xỉ liên tiếp hay gián
tiếp như ADC chuyển đổi điện áp tần số, chuyển đổi theo độ rộng xung.... khi
thiết kế mạch, việc chọn IC nào phụ thuộc vào dải tần của tín hiệu tương tự,
yêu cầu của tốc độ xử lý và sự tương thích với hệ vi xử lý. Các IC chuyển đổi
tương tự số là các loại 8 bit như ADC 0808, ADC 0809, hay 12 bit như ADC
1210, ADC 1211.

Ta xét bộ biến đổi ADC 0809 là ADC thông dụng được sử dụng rất rộng
rãi có 8 đầu vào tương tự và đầu ra 8 bit số, chuyển đổi theo phương pháp xấp
xỉ liên tiếp. Các đặc trưng cơ bản của ADC 0809 là:

- Đầu ra có bộ đệm ba trạng thái để ghép trực tiếp vào kênh dữ liệu của
hệ vi xử lý
- Giả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ách giải pháp kỹ thuật cho từng mạch cụ thể.
- Không đòi hỏi điều chỉnh “0”
- Thời gian biến đổi 100 μs.
- Sai số tổng cộng  1/2 LSB
- Sử dụng nguồn nuôi đơn + 5V, hiệu suất cao.
- đảm bảo sai số tuyến tính trong dải nhiệt độ từ –40 đến +850

Sơ đồ chức năng của bộ chuyển đổi ADC 0809 trên Hình 3.63.

173
Start Clock
EOC
Đ.khiển và Th.gian
MUX
8 kênh Tương
tương tự tự 8 SAR
kênh
Đệm
chốt ra 8 bit
3 trạng dliệu
thái ra

3 bit Cây chuyển mạch


Chốt
địa chỉ
và giải
mã địa
Chốt
chỉ
địa chỉ Mạch 256 điện trở
Cho phép ra

Ref (+) Ref (-)

Hình 3.63. Sơ đồ chức năng bộ chuyển đổi ADC 0809

❖ Ghép tín hiệu vào ADC 0809

Trong chu trình chuyển đổi dòng đầu vào, tín hiệu giữ nhịp 500 KHz
dùng cho bộ ADC 0809 được tạo ra ở bên ngoài và được đưa đến chân Clock
(bộ chuyển đổi ADC 0809 sử dụng tần số clock có thể trong dải 200 KHz –
1MHz).

+ ghép tín hiệu đơn cực đến đầu vào của ADC 0809.

Khi tín hiệu đầu vào bộ chuyển đổi ADC là đơn cực (một cực tính), sơ
đồ nguyên lý khi đó được mắc như Hình 3.64. Trong trường hợp này thang đo
tương ứng 5V cho các đầu vào (tức là các đại lượng cần đo qua các bộ cảm
biến phải đưa về dải từ 0V đến 5V). Tương ứng với mức 0V ở đầu vào là tổ
hợp nhị phân 0000 0000 ở đầu ra. Còn tương ứng với mức 5V có tổ hợp 1111
1111 ở đầu ra.

174
DB0 I0
DB1 I1
DB2 I2
DB3 I3
DB4 I4
DB5 I5
DB6 I6
DB7 I7

A
B Vref(+) 5V
C
START
ALE EOC
OE
CLK vref(-)
GND

Hình 3.64. Hoạt động của ADC 0809 khi đầu vào là đơn cực

+ Ghép tín hiệu lưỡng cực đến đầu vào của ADC 0809

Trong thực tế khảo sát các đại lượng cần biến đổi thường là các tín hiệu
xoay chiều (tín hiệu vào có hai cực tính). Với trường hợp này cần mở rộng
thang đo thích hợp với tín hiệu. Sơ đồ nguyên lý của mạch thể hiện dạng này
trên Hình 3.65.
DB0 I0
DB1 I1
DB2 I2
DB3 I3
DB4 I4
DB5 I5
DB6 I6
DB7 I7

A Ec
B Vref(+)
C
START
ALE EOC
OE
CLK vref(-)
GND

Hình 3.65. Hoạt động của ADC 0809 khi đầu vào là lưỡng cực

175
Để mở rộng thang đo, điện áp so sánh được đưa qua tầng lặp lại điện áp
để đưa đến chân 12 (chân Ref(+)) của ADC 0809. Các kênh lối vào tương tự
được dẫn đến các chân I0 đến I7.

Nếu chọn VRef(+)=+2,5V thì từ đầu ra của các bộ cảm biến phải đưa về
dải 0 đến 2,5V (cho phép đo trong dải  2,5V). Khi đó cận trên của thang đo
(+2,49V) tương ứng với tổ hợp mã nhị phân ở đầu ra là 1111 1111. Cận dưới
thang đó (-2,49V) ứng với tổ hợp mã nhị phân ở đầu ra là 0000 0000, mức
“0” của thang đo ứng với tổ hợp: 0111 1111.

+ Đồ thị thời gian của ADC 0809

Các bit địa chỉ ở lối vào A, B, C từ bộ giải mã địa chỉ sẽ chốt và xác định
kênh đầu vào nào được lựa chọn. Tương ứng với kênh đầu vào xác định ở trên
khi có một xung dương đặt vào chân số 6 (Start) với độ rộng tối thiểu
(tWS=200ns), sau thời gian tEOC (tính từ sườn trước của xung Start) bộ chuyển
đổi bắt đầu thực hiện việc chuyển đổi và trong suốt thời gian này chân tín
hiệu ra EOC luôn ở mức thấp. Đồng thời đầu ra 3 trạng thái của ADC 0809 bị
thả nổi (ở trạng thái trở kháng cao). Sau thời gian tC=100 μ s, ADC 0809 thực
hiện chuyển đổi xong, dữ liệu đầu vào được đưa tới bộ đệm đầu ra ba trạng
thái, đồng thời chân tín hiệu EOC chuyển lên mức cao báo hiệu cho hệ vi xử
lý biết để đọc kết quả vào. Hoạt động của mạch được thể hiện trên Hình 3.66.

Start
ALE
tWS
Addr

Analog
input
OE

EOC tC
tEOC
Output

Hình 3.66. Đồ thị thời gian của ADC 0809

176
❖ Ghép ADC 0809 với hệ vi xử lý

Ghép ADC 0809 với hệ vi xử lý được thể hiện trên Hình 3.67. Các kênh
vào Analog được nối với các đầu vào tương ứng của ADC (có 8 kênh như
vậy). Mỗi kênh có địa chỉ riêng do tổ hợp 3 bit địa chỉ A, B, C quy định. Các
dây địa chỉ này có thể sử dụng trực tiếp các dây địa chỉ của kênh địa chỉ hệ vi
xử lý. Thường A, B, C của ADC 0809 được nối với A0, A1, A2 của hệ vi xử
lý. Các dây địa chỉ cao của hệ vi xử lý được dùng để tạo tín hiệu chọn chip
CScho ADC 0809. Tín hiệu CSđược đưa tới đầu vào của của mạch OR để

khởi động ADC (Start) khi có tín hiệu IOWR đồng thời chốt địa chỉ (ALE)
của kênh hiện hành có giá trị là giá trị ba bit ABC. Tín hiệu CScũng được đưa
tới đầu vào của mạch OR thứ hai để tạo tín hiệu OE cùng với IORD nhằm
chốt dữ liệu đã biến đổi xong ở đầu ra.

CS 0809 có địa chỉ xác định


từ bộ giải mã địa chỉ

Báo cho hệ vi
EOC xử lý biết đã
IORD biến đổi xong
OE
DB0-DB7
IOWR START
ALE Kênh dữ liệu
hệ thống
8 kênh vào I0-I7
A B C

3 bit địa chỉ kênh vào

Hình 3.67. Ghép ADC 0809 với hệ vi xử lý

Khi biến đổi xong. ADC 0809 dùng tín hiệu EOC để báo cho hệ vi xử lý
biết mã nhị phân tương ứng với mức tín hiệu đầu vào đã được tạo ra. EOC
thường được nối với đầu vào ngắt của CPU hay của PIC 8259. Trong một số
trường hợp người ra dùng trễ thời gian để khẳng định quá trình biến đổi đã
hoàn tất thì không cần sử dụng tín hiệu EOC.

177
8 bit dữ liệu thường được ghép trực tiếp với kênh dữ liệu hệ thống vì bản
thân bộ đệm ra cũng là bộ đệm 3 trạng thái..

Chương trình minh hoạ cho sơ đồ ghép nối Hình 3.68. sẽ sử dụng
phương pháp tạo trễ để khẳng định quá trình biến đổi ADC bằng thủ tục
Delay_100_Microsec. Chương trình con Read_ADC khi được gọi sẽ điều
khiển 8 kênh vào analog theo phương pháp quét vòng và thực hiện lấy 256
mẫu cho mỗi kênh. Dữ liệu này được lưu trữ trong vùng đệm BUF_ADC có
dung lượng 8x256 byte. Địa chỉ cơ sở của kênh là 300h (ứng với kênh đầu
tiên). Chương trình nguồn Assembly có dạng như sau:

chot EQU 300H ; cổng ra chốt kênh và cổng vào dữ liệu

SIZE_OF_BUFi EQU 256 ; kích thước bộ đệm cho từng kênh =256B

BUF_ADC DB 8*256 DUP(?) ; dung lượng 8 bộ đệm kênh

;--------------------------------------------------------------

MAIN PROC

CALL READ_ADC;

; các lệnh khác của thủ tục chính

MAIN ENDP

;---------------------------------------------------------------

READ_ADC PROC

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH DI

MOV DI, 00H ; khởi đầu giá trị cho ngăn nhớ vùng đệm

178
LEA BX, BUF_ADC ; địa chỉ bộ đệm kênh

LOOP1:

ADD BX, DI ; BX trỏ tới ngăn nhó này

MOV DX, Chot ; lấy địa chỉ chốt của kênh đầu tiên

MOV CX, 08H ; lặp cho 8 kênh

LOOP2:

OUT DX, AL ; khởi động kênh hiện hành

CALL DELAY_100MicroSec ; chờ ADC biến đổi xong

IN AL, DX ; đọc nội dung kênh hiện hành vào hệ vi xử lý

MOV [BX], AL ; chuyển vào bộ đệm tương ứng

ADD BX, SIZE_OF_BUFi ; Nhảy tới bộ đệm tiếp theo

INC DX ; Tăng địa chỉ kênh 1 đơn vị

LOOP LOOP2 ; lặp lại 8 kênh

INC DI ; Trỏ tới byte tiếp theo

CMP DI, 256

JNZ LOOP1

POP DI

POP DX

POP CX

POP BX

POP AX

RET

READ_ADC ENDP

;-----------------------------------------------

179
DELAY_100MicroSeg PROC

;chương trình tạo trễ thời gian

DELAY_100MicroSeg ENDP

;-----------------------------------------------

END MAIN

3.5.3.2. Bộ biến đổi DAC

Mạch DAC có quá trình biến đổi ngược lại của ADC. Cũng tương tự như
ADC, các mạch DAC được chế tạo tích hợp thành các IC như các DAC 8 bit
là DAC 0807, DAC 0808 hay 12 bit như DAC 1208, DAC 1210...

Ví dụ một mạch DAC 0808 có dạng như trên Hình 3.68.

Mạch bao gồm một bộ


Đ/khiển
tạo điện áp chuẩn để đưa băng Mạng công tắc hiện tại i0
lên mạng điện trở R-2R.
Mạng điện trở R-2R Đ/khiển
GND
Các bit dữ liệu được đưa
Vref(+)
vào 8 đầu vào A1-A8 của Vcc

mạng công tắc hiện tại. Vref(-) Bù

Nguyên lý của DAC Vee

0808 là nguyên lý tạo tín Hình 3.68. Mạch DAC 0808


hiệu tương tự theo kiểm
mạch điện trở R-2R. khi có tín hiệu dữ liệu đưa tới đầu vào của mạng công
tắc và tín hiệu điều khiển đưa đến đầu “Đ/khiển băng”, mạng công tắc được
thay đổi tương ứng với các giá trị của các bit dữ liệu. Như vậy, dòng ra i và
điện áp ra sẽ tỉ lệ với giá trị của các bit dữ liệu đầu vào, tạo ra tín hiệu tuyến
tính ở đầu ra.

Mạch phối ghép của DAC 0808 với hệ vi xử lý phải được ghép nối thông
qua cổng ra ( cổng PA của 8255A như trên Hình 3.69.). Trong đó tín hiệu

180
điều khiển OBF được đưa vào chân RC (Range control) để ghi giá trị tín hiệu
dữ liệu vào DAC.

Bus dliệu
d0-d7 PA T/hiệu
PA0-PA7 d0-d7 I0
analog
OBF
PC7 RC

WR 8255A DAC
WR 0808

Hình 3.69. Phối ghép của DAC


0808
Một số tham số của DAC 0808 là:

- Sai số tương đối: cực đại là  10%


- Thời gian thiết lập ngắn nhất: 15ns
- Có thể ghép trực tiếp với các đầu vào của TTL hay CMOS.
- Dải nguồn cấp từ  4,5V đến  18V.
- Công suất tiêu thụ là 32mW ở mức nguồn  5V

181
Chương 4: CÁC PHƯƠNG PHÁP VÀO/RA DỮ LIỆU

Ở chương 3 đã trình bày về các mạch thường dùng cho việc phối ghép
CPU với thiết bị ngoại vi, ở chương này sẽ tiến hành nghiên cứu các phương
thức điều khiển việc trao đổi dữ liệu. Các mạch phối ghép vào/ra đã trình bày
trước đây có thể được ứng dụng để phục vụ cho mục đích này.

Nói chung người ta phân biệt ra 3 phương pháp điều khiển vào/ra dữ
liệu:

+ Vào/ra dữ liệu điều khiển bằng cách thăm dò trạng thái sẵn sàng của
thiết bị ngoại vi.

+ Vào/ra dữ liệu điều khiển bằng cách ngắt bộ bi xử lý.

Vào/ra dữ liệu điều khiển bằng phần cứng phụ để thâm nhập trực tiếp
vào bộ nhớ.

Mỗi phương pháp điều khiển vào/ra dữ liệu nói trên có những đặc điểm
khác nhau và sẽ được ứng dụng trong các hoàn cảnh khác nhau.
4.1.Vào/ra bằng phương pháp thăm dò

4.1.1. Nguyên lý vào/ra bằng phương pháp thăm dò

+ Là phương pháp điều khiển vào/ra đơn giản bằng phần mềm

+ Các thiết bị ngoại vi phải đưa ra các bit cờ trạng thái sẵn sàng của thiết
bị

+ Phần mềm thực hiện kểm tra (thăm dò) có chu kỳ các bit trạng thái sẵn
sàng của tất cả các thiết bị có trong hệ thống vi xử lý bằng các vòng lặp. Thiết
bị nào có trạng thái sẵn sàng CPU sẽ tiến hành trao đổi dữ liệu. Sau khi kết
thúc trao đổi dữ liệu CPU tiếp tục quét các thiết bị khác.

+ Với phương pháp này CPU là bên chủ động trong quá trình trao đổi
dữ liệu.

182
+ Thăm dò không theo ưu tiên (thăm dò tùy ý), trong một vòng tất cả
các thiết bị trong hệ thống đều được thăm dò, Hình 4.1.

Sự thăm dò của chương trình được bắt đầu xem thiết bị A có nhu cầu
được phục vụ hay không. Nếu có (Yes) thì chuyển đến chương trình phục vụ
vào/ra dữ liệu cho thiết bị A, nếu không (No) chuyển qua thăm dò thiết bị
B.Quá trình tương tự với các thiết bị còn lại. Khi thăm dò hết các thiết bị thì
quay về với vòng thăm dò mới. Phụ thuộc vào đặc điểm của thiết bị ngoại vi
mà số vòng thăm dò nhiều hay ít. Ví dụ với con chuột thì số lần thăm dò trong
1 giây ít hơn nhiều so với thiết bị đĩa mềm (FDD) và đĩa cứng (HDD).
Phương pháp thăm dò này phù hợp trong các hệ thống vi xử lý nhỏ chỉ có một
số rất ít thiết bị ngoại vi và thường chúng tương tự nhau về các đặc điểm
vào/ra dữ liệu như song song hay nối tiếp, tốc độ vào/ra, …

Bắt đầu

A có nhu cầu Yes


Chương trình
phục vụ? phục vụ A

No

B có nhu cầu Yes


Chương trình
phục vụ? phục vụ B

No

C có nhu cầu Yes


Chương trình
phục vụ? phục vụ C

No

Hình 4.1. Điều khiển vào/ra bằng thăm dò không theo ưu tiên

183
+ Thăm dò theo ưu tiên phục vụ, thiết bị có mức ưu tiên cao nhất được
thăm dò trước, thiết bị có mức ưu tiên thấp hơn chỉ được thăm dò nếu thiết bị
có mức ưu tiên cao hơn không sẵn sàng, Hình 4.2.

Khi các thiết bị được gắn mức ưu tiên phục vụ (giả sử A cao nhất, C thấp
nhất). Trước tiên thiết bị A được thăm dò trước. Nếu thiết bị A sẵn sàng cần
được phục vụ (Yes) thì chuyển đến thực hiện chương trình phục vụ thiết bị A,
nếu không thì chuyển thăm dò thiết bị B. Nếu B không sẵn sàng thì chuyển
tới thăm dò thiết bị C. Một thiết bị vừa được phục vụ xong (không phân biệt
thiết bị có mức ưu tiên cao hay thấp) sẽ quay trở lại từ đầu để thăm dò lại.

+ Vào/ra bằng phương pháp thăm dò thường được sử dụng khi hệ thống
khởi động, khi đó CPU thăm dò hầu hết các thiết bị để xác định cấu hình.

Bắt đầu

A có nhu cầu Yes


Chương trình
phục vụ? phục vụ A

No

B có nhu cầu Yes


Chương trình
phục vụ? phục vụ B

No

C có nhu cầu Yes


Chương trình
phục vụ? phục vụ C

No

Hình 4.2. Điều khiển vào/ra bằng thăm dò theo ưu tiên

184
4.1.2. Ưu, nhược điểm
❖ Ưu điểm:

- Thực hiện đơn giản, dễ cài đặt, không phải lắp đặt thêm phần cứng.

- Dễ dàng thực hiện các sơ đồ ưu tiên (priority schemes) phục vụ các


thiết bị.
❖ Nhược điểm:

- Thời gian của CPU bị chiếm nhiều để thực hiện chương trình lặp thăm
dò, vì CPU phải đảm nhiệm toàn bộ việc điều khiển vào/ra dữ liệu với thiết bị
ngoại vi.

- Khả năng đáp ứng tức thì khi thiết bị ngoại vi có tín hiệu sẵn sàng
không cao.

- Khi có nhiều thiết bị sử dụng phương pháp thăm dò sẽ làm cho tốc độ
xử lý của hệ thống bị suy giảm lớn và do đó giảm hiệu xuất của hệ thống.

4.2. Vào/ra bằng phương pháp ngắt ngắt bộ vi xử lý

4.2.1. Ý nghĩa vào/ra bằng phương pháp ngắt

Trong cách tổ chức trao đổi dữ liệu thông qua việc thăm dò trạng thái
sẵn sàng của thiết bị ngoại vi như đã trình bày ở mục 4.1, trước khi tiến hành
bất kỳ một cuộc trao đổi dữ liệu nào CPU phải để toàn bộ thời gian vào việc
xác định trạng thái sẵn sàng làm việc của thiết bị ngoại vi. Trong hệ thống vi
xử lý với cách làm việc như vậy, thông thường CPU được thiết kế chủ yếu chỉ
là để phục vụ cho việc vào/ra dữ liệu và thực hiện các xử lý liên quan.

Trong thực tế người ta rất muốn tận dụng khả năng của CPU để làm thêm
được nhiều công việc khác nữa, chỉ khi nào có yêu cầu trao đổi dữ liệu thì mới
yêu cầu CPU tạm dừng công việc hiện tại để phục vụ việc trao đổi dữ liệu. Sau
khi hoàn thành việc trao đổi dữ liệu thì CPU lại phải quay về để làm tiếp công
việc hiện đang bị gián đoạn. Cách làm việc theo kiểu này gọi là ngắt CPU
(gián đoạn hoạt động của CPU) để trao đổi dữ liệu. Một hệ thống với cách

185
hoạt động theo kiểu này có thể đáp ứng rất nhanh với các yêu cầu trao đổi dữ
liệu trong khi vẫn có thể làm được các công việc khác. Muốn đạt được điều
này ta phải có cách tổ chức hệ thống sao cho có thể tận dụng được khả năng
thực hiện các chương trình phục vụ ngắt tại các địa chỉ xác định. Khi nghiên
cứu các tín hiệu của CPU 8086, chúng ta đã thấy vi mạch này các các chân tín
hiệu cho các yêu cầu ngắt che được INTR và không che được NMI, chính các
chân này sẽ được sử dụng vào việc đưa các yêu cầu ngắt từ bên ngoài đến
CPU.

4.2.2. Hệ thống ngắt của 8086

Trong hệ vi xử lý 8086 có thể xếp các nguyên nhân gây ra ngắt CPU vào
3 nhóm sau:

+ Nhóm ngắt cứng: đó là các yêu cầu ngắt CPU do các tín hiệu đến từ
các chân INTR và NMI

- Ngắt cứng NMI là yêu cầu ngắt không che được tương đương với ngắt
mềm INT 2. Các lệnh CLI và STI không có ảnh hưởng đến việc nhận biết tín
hiệu yêu cầu ngắt NMI.

- Ngắt cứng INTR là yêu cầu ngắt che được. Các lệnh CLI và STI có ảnh
hưởng trực tiếp tới trạng thái của cờ IF trong bộ vi xử lý, tức là ảnh hưởng tới
việc CPU có nhận biết yêu cầu ngắt tại chân này hay không.

+ Nhóm ngắt mềm: khi CPU thực hiện các lệnh ngắt dạng INT N, trong
đó N là số hiệu ngắt nằm trong khoảng 00h-FFh (0-255).

+ Nhóm các hiện tượng ngoại lệ: đó là các ngắt do các lỗi nảy sinh trong
quá trình hoạt động của CPU như phép chia cho 0, xảy ra khi tràn tính toán...

Trình tự xử lý ngắt được thực hiện trên Hình 4.3.

186
Kết thúc lệnh hiện thời

Yes
Ngắt ngoại lệ?

No
Yes
Ngắt NMI?

No
Yes Yes
Ngắt INTR? IF=1? Thực hiện chu kỳ
máy ngắt, nhận N
No
No
Thực hiện lệnh tiếp
SP  SP-2, {SP}  FR

IF  0, TF  0

SP  SP-2, {SP}  CS

SP  SP-2, {SP}  IP

IP  {N*4}, CS  {N*4+2}

+ Thực hiện CTCXLN


+ Khi gặp lệnh IRET:
IP  {SP}, SP  SP+2
CS  {SP}, SP  SP+2
FR  {SP}, SP  SP+2

Hình 4.3. Trình tự xử lý ngắt của 8086


4.2.3. Nguyên lý vào/ra bằng phương pháp ngắt

Ngắt được tổ chức để thực hiện vào/ra dữ liệu xét trong phần này là ngắt
cứng INTR. Sơ đồ cấu trúc chung của mạch trao đổi theo cơ chế ngắt trên
Hình 4.4.

187
IR
INTR Mạch
INTA điều
khiển
Bus dữ liệu
D0-D7 ngắt

CPU
T/h đọc/ghi Cổng Ngoại
RD, WR
vào/ra vi
Từ giải
mã địa chỉ

Hình 4.4. Sơ đồ nguyên lý chung hoạt động theo cơ chế ngắt

❖ Nguyên lý hoạt động:

Khi một ngoại vi cần trao đổi dữ liệu theo cơ chế ngắt với CPU, sẽ có tín
hiệu yêu cầu ngắt IR (Interrupt request signal) tới bộ điều khiển ngắt. Bộ điều
khiển ngắt chấp nhận sẽ gửi tín hiệu INTR tới CPU
CPU kiểm tra cờ IF. Nếu IF=1 thì nó sẽ gửi tín hiệu xung INTA thứ nhất
để báo cho bộ điều khiển ngắt. Sau đó CPU thực hiện xong lệnh đang thực
hiện, gửi các thanh ghi vào ngăn xếp và gửi xung INTA thứ 2. Bộ điều khiển
ngắt khi nhận được xung INTA thứ 2 sẽ gửi số hiệu ngắt qua bus dữ liệu về
CPU.
CPU dùng số hiệu ngắt để lấy địa chỉ của CTCXLN trong bảng vectơ
ngắt nạp vào CS và IP. CTCXLN được thực hiện.
Mạch điều khiển ngắt thực hiện các chức năng sau:
Ghi nhận các yêu cầu ngắt từ các thiết bị ngoại vi
Xác định mức ưu tiên của các đầu vào ngắt
Tạo ra số hiệu ngắt

4.2.4. Mạch điều khiển ngắt ưu tiên 8259A

Khi hệ vi xử lý có nhiều ngoại vi được ghép nối và làm việc theo cơ chế
ngắt thì phải mở rộng các đầu ngắt để đáp ứng về số lượng ngắt. Khi số lượng
ngắt tăng lên thì vấn đề quy định mức ưu tiên phải được đặt ra vì bộ vi xử lý
tại một thời điểm chỉ có thể phục vụ cho một đầu ngắt mà thôi.

188
Trong trường hợp như vậy, giải pháp đúng đắn hơn cả là sử dụng chip IC
chuyên dụng cho phép mở rộng bảng vectơ ngắt cứng lên số lượng cần thiết.
Chip 8259A được gọi là mạch điều khiển ngắt ưu tiên (priority interupt
controller-PIC). Đó là vi mạch cỡ lớn lập trình được. Nó có thể xử lý được 8
yêu cầu ngắt với mức ưu tiên khác nhau để tạo ra một yêu cầu ngắt đưa đến
đầu vào chung là INTR (yêu cầu ngắt che được) của bộ vi xử lý. Nếu nối tầng
một mạch 8255A chủ với 8 mạch 8259A thợ ta có thể nâng tổng số các yêu
cầu ngắt với các mức ưu tiên khác nhau lên thành 64 đầu vào ngắt độc lập.

4.2.4.1. Cấu trúc của 8259A

❖ Sơ đồ cấu trúc: Sơ đồ cấu trúc của PIC – 8259A được thể hiện trên
Hình 4.5

INTA INT

Đệm Logic điều khiển


d0-d7 BUS
dữ liệu

RD
WR Logic IR1
A0 đ/khiển ...
RD/WR ISR PR IRR
CS IR7

Cas0
Cas1 Đệm và IMR
Cas2 so sánh
SP/ EN

Hình 4.5. Sơ đồ cấu trúc của PIC 8259A


Các khối chức năng của 8259A bao gồm một số thanh ghi và các khối
điều khiển:

+ IRR (Interrupt Request Register): là thanh ghi 8 bit được dùng để nhớ
các yêu cầu ngắt IRi từ ngoại vi. Khi có một yêu cầu ngắt của một ngoại vi,

189
chân IRi tương ứng và bit thứ i trong IRR sẽ có giá trị 1. Khi bắt đầu cấp
nguồn hay khi Reset, các bit trong IRR bị xóa.

+ ISR (In Service Register): là thanh ghi 8 bit được dùng để nhớ yêu cầu
ngắt đang được phục vụ. Nếu yêu cầu ngắt thứ i được phục vụ thì bit ISi tương
ứng trong thanh ghi sẽ được lập (=1).

+ IMR (Interupt Mask Register): là thanh ghi 8 bit được dùng để nhớ mặt
nạ ngắt đối với các yêu cầu ngắt IRi. Nếu bit IMi được đặt bằng 1, yêu cầu
ngắt ở đầu vào IRi sẽ không được PIC 8259A chấp nhận. Khi Reset, các bit
trong IMR bị xóa và nó có thể được đặt bằng chương trình khi đang làm việc.

+ PR (Priority Resolver): để nhớ các mức ưu tiên cho các đầu vào ngắt
và giải quyết việc phục vụ cho yêu cầu ngắt nào căn cứ vào mức ưu tiên đó.
Khi Reset, mức ưu tiên của các đầu vào ngắt là cố định, trong đó IR0 có mức
ưu tiên cao nhất và giảm dần cho tới IR7. Mức ưu tiên ngắt có thể thay đổi
được bằng chương trình.

+ Khối logic điều khiển: Có nhiệm vụ gửi yêu cầu ngắt tới chân INTR và
nhận tín hiệu trả lời INTA để điều khiển đưa ra bus dữ liệu số hiệu ngắt

+ Đệm bus dữ liệu: để phối ghép 8259A với bus dữ liệu của hệ vi xử lý

+ Logic điều khiển đọc/ghi: để ghi các từ điều khiển và đọc các từ trạng
thái của 8259A

+ Khối đệm nối tầng và so sánh: để ghi nhớ và so sánh số hiệu của các
mạch có trong hệ vi xử lý.

❖ Các tín hiệu của 8259A


Sơ đồ chân tín hiệu của 8259A trên Hình 4.6. Trong đó:

+ Các chân nguồn cấp Vcc và GND nối với nguồn +5V

+ IR0 - IR7: là các tín hiệu vào được nối với các chân yêu cầu ngắt
INTR của các thiết bị ngoại vi hay với chân INT của PIC 8259A thợ.

190
+ D0 – D7: là các chân tín hiệu vào/ra 3 trạng thái, được nối với 8 bit
thấp d0-d7 của bus dữ liệu hệ thống. Nó được sử dụng để CPU đưa các từ lệnh
ra 8259A hoặc đọc các giá trị một số thanh ghi trong 8259A về CPU. Đồng
thời, nó cũng được sử dụng để PIC CS Vcc
1 28
8259 đưa số hiệu ngắt tương ứng với WR 2 27 A0
RD 3 26 INTA
yêu cầu ngắt về CPU. D7 4 25 IR7
D6 5 24 IR6
+ A0: là chân tín hiệu vào để D5 6 23 IR5
đưa bit địa chỉ xác định thanh ghi từ D4 7 22 IR4
D3 8 8259A 21 IR3
điều khiển và các thanh ghi khác mà D2 9 20 IR2
D1 10 19 IR1
CPU cần thâm nhập. Chân này được D0 IR0
11 18
nối với một bit địa chỉ trong bus địa CAS0 12 17 INT
CAS1 13 16 SP/ EN
chỉ của hệ thống. CAS2 14 15 CAS2
+ CS: là chân tín hiệu vào có Hình 4.6. Sơ đồ chân của PIC 8259A
mức tích cực âm. Khi CS=0, 8259A
mới được làm việc. Tức là khi đó CPU với có thể thực hiện đọc hay ghi tới
các thanh ghi bên trong của 8255A. Chân này được nối tới đầu ra của bộ giải
mã chọn cổng. Đầu vào của bộ giải mã này là các tín hiệu địa chỉ của BUS hệ
thống trừ bit địa chỉ đã được nối với A0 của 8259A.

+ Các chân RD, WR là các chân tín hiệu vào mức tích cực âm, nó được
nối trực tiếp với các chân RD, WR của hệ để điều khiển quá trình đọc, ghi của
CPU với các thanh ghi trong 6259A

+ Cas0 – Cas2: (Cascade Lines): được sử dụng khi nối tầng. Nó là các tín
hiệu vào khi là mạch thợ, và là ra khi là mạch chủ.

+ SP/ EN (Slave Program/Enable Buffer): Khi 8259A làm việc không có


đệm thì là tín hiệu vào dùng lập trình để biến mạch 8259A thành mạch thợ
(SP=0) và chủ (SP=1). Khi làm việc có đệm, nó là tín hiệu ra EN mở đệm
BUS dữ liệu. Lúc này việc định nghĩa mạch chủ và thợ thông qua từ điều
khiển ICW4.

191
4.2.4.2. Hoạt động của 8259A

Để mạch PIC 8259A có thể hoạt động được theo yêu cầu. Sau khi bật
nguồn cấp điện, PIC cần phải được lập trình bằng cách ghi vào thanh ghi
(tương đương với các cổng IO) bên trong nó các từ điều khiển khởi đầu (ICW)
và tiếp sau đó là các từ điều khển hoạt động (OCW).

Các từ điều khiển ICW dùng để tạo nên các Mode làm việc cơ bản cho
PIC còn các từ điều khiển OCW sẽ quyết định cách thức làm việc cụ thể của
PIC. Từ điều khiển OCW sẽ được ghi khi ta muốn thay đổi hoạt động của PIC

❖ Các từ điều khiển khởi đầu ICW (Initial Cotrol Word):

+ ICW1:

Xác định cách thức làm việc cơ bản đầu tiên của 8259A, và còn quy
định cả sự tồn tại của các từ điều khiển sau và được phân biệt bằng bit A0. Tổ
chức của ICW1 trên Hình 4.7.

A0 D7 D6 D5 D4 D3 D2 D1
0 x x x 1 LTIM ADI SNGL IC4

1: cần ICW4
Không dùng tới với hệ 16-32bit 0: bỏ ICW4
1: chỉ có 1 PIC
Cách tác động của xung y/c ngắt 0: có nhiều PIC
1: theo mức dương
0: theo sườn dương Khoảng cách giữa các vectơ ngắt
1: cách 4 byte (80x86/88)
0: cách 8 byte (8080/8085)
Hình 4.7. Tổ chức của ICW1

- Bit D0(IC4): quyết định 8259A sẽ được nối với họ vi xử lý nào. Để làm
việc với hệ 16-32 bit (8088 hoặc 80x86) thì ICW1 nhất thiết phải có IC4=1
(tức là ta luôn cần ICW4), còn đối với hệ 8 bit như họ 8080/85 thì phải có
IC4=0 (và như vậy các bit của ICW4 buộc bị xoá về 0).

- Bit D1(SNGL): quyết định 8259A làm việc ở chế độ đơn lẻ hay nối
tầng.

192
- Bit D2(ADI): Xác định PIC 8259A được dùng cho hệ 16 bit (khoảng
cách của vectơ ngắt là 4 byte) hay cho hệ 8 bit (8085-khoảng cách giữa các
vectơ ngắt là 8 byte). Khi đó PIC sẽ tạo ra các số hiệu ngắt tương ứng cho hệ.

- Bit D4=1 được dùng để phân biệt từ ICW1 với các từ điều khiển hoạt
động OCW2 và OCW3

- Bit D3 (LTIM): quy định cách ghi nhận tác động của xung yêu cầu ngắt
IRi

- Các bit có dấu x không sử dụng và được ghi 0 khi lập trình

+ ICW2:

Cho phép chọn kiểu ngắt (số hiệu ngắt) ứng cho các đầu vào yêu cầu
ngắt. Tổ chức của từ mã khởi đầu ICW2 có dạng trên Hình 4.8.

A0 D7 D6 D5 D4 D3 D2 D1 D0
1 Off7 Off6 Off5 Off4 Off3 T2 T1 T0

Chọn số hiệu ngắt (kiểu ngắt) cho ứng với các y/c ngăt
mạch 8259A IR0 – IR7

Hình 4.8. Tổ chức của ICW2

- Các bit D3 - D7 (Off3-Off7): Xác định số hiệu ngắt.


- Các bít D0 – D2 (T0-T2): Xác định đầu vào ngắt có số hiệu ngắt tương
ứng với các bit cao.

Ví dụ: nếu ta gửi ra từ ICW2 có giá trị là 53h=01010011, thì khi đó ngắt
ứng với đầu IRQ3 sẽ có số hiệu ngắt là 50h, tương ứng IRQ4 sẽ là 51h...

Trong chế độ nối tầng, ở 8259A chủ: những chân IR nào được nối với
các IC thợ thì sẽ không được tính. Chỉ số ngắt cho IC thợ được xác định bằng
ICW2 của nó.

+ ICW3:

193
Được sử dụng trong chế độ nối tầng. Có hai loại từ: một cho mạch chủ,
một cho mạch thợ. Tổ chức của ICW3 trên Hình 4.9.

A0 D7 D6 D5 D4 D3 D2 D1 D0

1 S7 S6 S5 S4 S3 S2 S1 S0

1: Đầu vào IRi nối với mạch 8259A thợ


0: Đầu vào IRi không nối với mạch thợ

a) ICW3 của 8259A chủ


A0 D7 D6 D5 D4 D3 D2 D1 D0

1 0 0 0 0 0 ID2 ID1 ID0

Mã hóa số hiệu của mạch thợ 0-7 nối với IR0 – IR7

b) ICW3 của 8259A thợ

Hình 4.9. Tổ chức của ICW3

- ICW3 của mạch chủ: Dùng để chỉ ra đầu vào yêu cầu ngắt IRi nào của
nó có tín hiệu INT của mạch thợ nối vào.

- ICW3 của mạch thợ: Dùng làm phương tiện để các mạch này được nhận
biết, vì vậy từ điều khiển khởi đầu này phải chứa mã số i ứng với đầu vào IRi
của mạch chủ mà mạch thợ đã nối vào. Mạch thợ sẽ so sánh mã số này với mã
số nhận được ở Cas2-Cas0. Nếu bằng nhau thì số hiệu ngắt sẽ được đưa ra bus
khi có INTA

+ ICW4:

Từ điều khiển này chỉ dùng đến khi trong từ điều khiển ICW1 có IC4=1
(cần thêm ICW4). Tổ chức của ICW4 trên Hình 4.10.

- Bit D0 (PM): xác định loại vi xử lý làm việc với 8259A. Bit PM=1
cho phép các bộ vi xử lý từ 8086/88 hoặc cao hơn làm việc với 8259A.

194
- Bit D1 (AEOI): cho phép chọn cách kết thúc yêu cầu ngắt tự động. Khi
AEOI=1 thì 8259A tự động xoá ISRi=0 khi xung INTA cuối cùng chuyển lên
mức cao mà không làm thay đổi thứ tự ưu tiên. Ngược lại, khi ta chọn cách kết
thúc yêu cầu ngắt thường (AEOI=0) thì chương trình con phục vụ ngắt phải có
thêm lệnh EOI đặt trước lệnh IRET để kết thúc cho 8259A.

A0 D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 SFNM BUF M/S AEOI PM
T0
1: cho họ 80x86/88

1: chế độ ưu tiên cố định đặc biệt 1: EOI tự động


0: không phải chế độ ưu tiên cố định đặc biệt. 0: EOI thường

0x: 8259A ở chế độ không đệm


10: mạch 8259A thợ ở chế độ đệm
11: mạch 8259A chủ ở chế độ đệm

Hình 4.10. Tổ chức của ICW4

- Bit BUF cho phép định nghĩa mạch 8259A để làm việc với CPU trong
trường hợp có đệm hoặc không có đệm nối với bus hệ thống. Khi làm việc ở
chế độ có đệm (BUF=1), bit M/S=1/0 cho phép ta chọn mạch 8259A để làm
việc ở chế độ chủ/thợ, SP EN trở thành đầu ra cho phép mở đệm để PIC và
CPU thông với bus hệ thống.

- Bit SFNM=1 cho phép chọn chế độ ưu tiên cố định đặc biệt. Trong chế
độ này yêu cầu ngắt với mức ưu tiên cao nhất hiện thời từ một mạch thợ làm
việc theo kiểu nối tầng sẽ được mạch chủ nhận biết ngay cả khi mạch chủ còn
đang phải phục vụ một yêu cầu ngắt ở mạch thợ khác nhưng với mức ưu tiên
thấp hơn. sau khi các yêu cầu ngắt được phục vụ xong thì chương trình phục
vụ ngắt phải có lệnh kết thúc yêu cầu ngắt (EOI) đặt trước lệnh trở về (IRET)
đưa đến cho mạch 8259A chủ.

195
- Khi bit SFNM=0 thì chế độ ưu tiên cố định được chọn (IR0: mức ưu
tiên cao nhất, IR7: mức ưu tiên thấp nhất). Thực ra đối với mạch 8259A không
dùng đến ICW4 thì chế độ này đã được chọn như là ngầm định. Trong chế độ
ưu tiên cố định tại một thời điểm chỉ có một yêu cầu ngắt i được phục vụ (bit
ISRi=1), lúc này tất cả các yêu cầu khác với mức ưu tiên thấp hơn đều bị cấm,
tất cả các yêu cầu khác với mức ưu tiên cao hơn có thể ngắt các yêu cầu khác
với mức ưu tiên thấp hơn

Các từ điều khiển khởi đầu ICW quan hệ chặt chẽ với phần cứng của hệ
và được ghi đầu tiên ngay sau quá trình khởi động mạch. Quá trình nạp các từ
điều khiển khởi đầu theo lưu đồ Hình 4.11.

Nếu trong mạch nhiều IC 8259A thì mỗi IC sẽ có một tập các từ điều
khiển khởi đầu. Các từ điều khiển khởi đầu này sẽ được nạp liên tiếp nhau khi
khởi động hệ và nó không thay đổi trong quá trình làm việc.

ICW1

ICW2

No
ICW1(D1)=0?

Yes

ICW3

No
ICW1(D0)=1?

Yes

ICW4

Sẵn sàng nhận


yêu cầu ngắt

Hình 4.11. Thứ tự và điều kiện ghi các từ điều khiển ICW

196
❖ Các từ điều khiển hoạt động OCW

Các từ điều khiển hoạt động OCW sẽ quyết định mạch 8259A hoạt động
như thế nào sau khi nó đã được khởi đầu bằng các từ điều khiển ICW. Tất cả
các từ điều khiển hoạt động sẽ được ghi vào các thanh ghi trong PIC khi
A0=0, trừ OCW1 được ghi khi A0=1. Dạng thức của các từ điều khiển OCW
được trình bày trên Hình 4.12
a) OCW1

A0 D7 D6 D5 D4 D3 D2 D1 D0
1 M7 M6 M5 M4 M3 M2 M1 M0

Mặt nạ ngắt tại các yêu cầu ngắt


1: có mặt nạ
0: không có mặt nạ

b) OCW2

A0 D7 D6 D5 D4 D3 D2 D1 D0
0 R SL EOI 0 0 L2 L1 L0

Kết thúc ngắt 0 0 1 Lệnh EOI thường Mã hóa mức


bằng lệnh EOI 0 1 1 Lệnh EOI chỉ đích danh (*) ưu tiên ngắt
1 0 1 Đổi mức ưu tiên khi có EOI thường bị tác động
Đổi mức ưu
1 0 0 Lập chế độ quay khi có EOI tự động
tiên tự động
0 0 0 Xoá chế độ quay khi có EOI tự động 000: mức 0
Đổi mức ưu tiên 1 1 1 Đổi mức ưu tiên khi có EOI đích danh (*) ...
chỉ đích danh 1 1 0 Lệnh lập mức ưu tiên(*) 111: mức 7
0 1 0 Không làm gì
c) OCW3

A0 D7 D6 D5 D4 D3 D2 D1 D0
0 0 ESMM SMM 0 1 P ERIS RIS

Chế độ mặt nạ đặc biệt 10: đọc IRR ở lần đọc sau
10: xoá chế độ mặt nạ đặc biệt 11: đọc ISR ở lần đọc sau
11: lập chế độ mặt nạ đặc biệt
Thăm dò hiện trạng của yêu cầu ngăt
1: đọc mã mức ưu tiên cao nhất ở lần đọc sau

Hình 4.12. Dạng thức của các từ điều khiển hoạt động OCW

197
+ OCW1: dùng để ghi giá trị của các bit mặt nạ vào thanh ghi mặt nạ
ngắt IMR. Khi một bit mặt nạ nào đó của IMR được lập thì yêu cầu ngắt tương
ứng với mặt nạ đó sẽ không được 8259A nhận biết nữa (bị che). Từ điều khiển
này phải được đưa đến 8259A ngay sau khi ghi các ICW vào 8259A.

Ta cũng có thể đọc lại IMR để xác định tình trạng mặt nạ ngắt hiện tại để
kiểm tra xem trong thời điểm hiện tại yêu cầu ngắt nào bị che.

+ OCW2: Các bit R, SL và EOI phối hợp với nhau cho phép chọn ra các
cách thức kết thúc yêu cầu ngắt khác nhau. Một vài cách kết thúc yêu cầu ngắt
còn tác động tới các yêu cầu ngắt được chỉ đích danh với mức ưu tiên được mã
hoá bởi 3 bit L2L1L0.

Trước khi nói về các cách kết thúc yêu cầu ngắt cho các chế độ ta cần xét
các chế độ làm việc của 8259A.

- Chế độ ưu tiên cố định: Đây là chế độ làm việc ngầm định của 8259A
sau khi nó đã được nạp các từ điều khiển khởi đầu.

Trong chế độ này, các đầu vào IR7-IR0 được gán cho các mức ưu tiên cố
định: IR0 được gán cho mức ưu tiên cao nhất, còn IR7 mức ưu tiên thấp nhất.
Mức ưu tiên này được giữ không cho thay đổi cho đến khi ghi mạch 8259A bị
lập trình khác đi do OCW2.

Trong chế độ ưu tiên cố định tại một thời điểm chỉ có một yêu cầu ngắt i
được phục vụ (bit ISRi=1), lúc này tất cả các yêu cầu khác với mức ưu tiên
thấp hơn đều bị cấm, tất cả các yêu cầu khác với mức ưu tiên cao hơn có thể
ngắt yêu cầu khác với mức ưu tiên thấp hơn.

- Chế độ quay mức ưu tiên tự động: Ở chế độ này sau khi một yêu cầu
ngắt được phục vụ xong, 8259A sẽ xoá bit tương ứng của nó trong thanh ghi
ISR và gán cho đầu vào của nó mức ưu tiên thấp nhất để tạo điều kiện cho các
yêu cầu ngắt khác có thời cơ được phục vụ.

198
- Chế độ quay mức ưu tiên chỉ đích danh: Ở chế độ này cần chỉ đích danh
đầu vào IRi nào, với i=L2L1L0 được gán mức ưu tiên thấp nhất, đầu vào
IRi+1 sẽ được tự động gán mức ưu tiên cao nhất.

Trở lại các vấn đề liên quan đến OCW2. Các bit R, SL và EOI phối hợp
với nhau như để tạo ra các lệnh quy định các cách thức kết thúc yêu cầu ngắt
cho các chế độ làm việc khác nhau như đã vừa trình bày.

Kết thúc yêu cầu ngắt thường: chương trình con phục vụ ngắt phải có
lệnh EOI đặt trước lệnh trở về IRET cho 8259A. Mạch 8259A sẽ xác định yêu
cầu IRi vừa được phục vụ và xoá bit ISRi tương ứng của nó để tạo điều kiện
cho chính yêu cầu ngắt này hoặc các yêu cầu ngắt khác có mức ưu tiên thấp
hơn có thể được tác động.

Kết thúc yêu cầu ngắt chỉ đích danh: chương trình con phục vụ ngắt phải
có lệnh EOI chỉ đích danh đặt trước lệnh trở về IRET cho 8259A. Mạch
8259A xoá đích danh bit ISRi, với i=L2L1L0, để tạo điều kiện cho chính yêu
cầu ngắt này hoặc các ngắt khác có mức ưu tiên thấp hơn có thể được tác
động.

Quay mức ưu tiên khi kết thúc yêu cầu ngắt thường: chương trình con
phục vụ ngắt phải có lệnh EOI đặt trước lệnh trở về IRET cho 8259A. Mạch
8259A sẽ xác định yêu cầu ngắt thứ i vừa được phục vụ, xoá bit ISRi tương ứng
và gán luôn mức ưu tiên thấp nhất cho đầu vào IRi này, còn đầu vào IRi+1 sẽ
được gán mức ưu tiên cao nhất.

Quay mức ưu tiên trong chế độ kết thúc yêu cầu ngắt tự động: chỉ cần
một lần đưa lệnh chọn chế độ đổi mức ưu tiên khi kết thúc yêu cầu ngắt tự
động. Có thể chọn chế độ này bằng lệnh lập “chế độ quay khi có EOI tự động”.
Từ đó trở đi 8259A sẽ đổi mức ưu tiên mỗi khi kết thúc ngắt tự động theo cách
tương tự như ở mục 3. Muốn bỏ chế độ này ta có thể dùng lệnh xoá “chế độ
quay khi có EOI tự động”.

199
Quay mức ưu tiên khi kết thúc yêu cầu ngắt chỉ đích danh: chương trình
con phục vụ ngắt phải có lệnh EOI đích danh cho 8259A đặt trước lệnh trở về
IRET. Mạch 8259A sẽ xoá bit ISRi của yêu cầu ngắt tương ứng và gắn luôn
mức ưu tiên thấp nhất cho đầu vào IRi, với i= L2L1L0.

Lập mức ưu tiên: chế độ này cho phép thay đổi mức ưu tiên cố định hoặc
mức ưu tiên gán trước đó bằng cách gán mức ưu tiên thấp nhất cho yêu cầu
ngắt IRi chỉ đích danh ứng với tổ hợp mã i= L2L1L0. Yêu cầu ngắt IRi+1 sẽ
được gán mức ưu tiên cao nhất.

+ OCW3:

Từ điều khiển hoạt động OCW3 sau khi được ghi vào 8259A cho phép :

- Chọn ra các thanh ghi để đọc.

- Thăm dò trạng thái yêu cầu ngắt bằng cách đọc trạng thái của đầu vào
yêu cầu ngắt IRi với mức ưu tiên cào nhất.

- Thao tác với mặt nạ đặc biệt.

D7 D6 D5 D4 D3 D2 D1 D0

IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0

IRi=0: Đầu vào i không có yêu cầu ngắt


IRi=1: Đầu vào i có yêu cầu ngắt

a) IRR

D7 D6 D5 D4 D3 D2 D1 D0

IS7 IS6 IS5 IS4 IS3 IS2 IS1 IS0

ISi=0: Yêu cầu ngắt i không được phục vụ


ISi=1: Yêu cầu ngắt i đang được phục vụ

b) ISR

Hình 4.13. Dạng thức của thanh ghi yêu cầu ngắt và thanh ghi phục vụ

200
Các thanh ghi IRR và ISR có thể đọc được sau khi nạp vào 8259A từ
điều khiển OCW3 với tổ hợp bit ERIS RIS=10 sẽ cho phép đọc IRR còn tổ
hợp bit ERIS RIS=11 sẽ cho phép đọc IRS. Tổ chức của các thanh ghi này
được biểu diễn trên Hình 4.13

Bằng việc đưa vào PIC 8259A từ điều khiển OCW3 với bit P=1 ta có thể
đọc được trên kênh dữ liệu ở lần đọc tiếp ngay sau đó từ mã thăm dò, trong đó
có các thông tin về yêu cầu ngắt với mức ưu tiên cao nhất đang hoạt động và từ
mã tương ứng với yêu cầu ngắt đấy, dạng thức được biểu diễn trên Hình 4.14

D7 D6 D5 D4 D3 D2 D1

1 x x x x W2 W1 W0

1: đang có yêu cầu ngắt


Mã hoá số của yêu cầu ngắt
0: không có yêu cầu ngắt

Hình 4.14 Dạng thức của từ thăm dò trạng thái yêu cầu ngắt

Có thể gọi đây là chế độ thăm dò yêu cầu ngắt và chế độ thường được
ứng dụng trong trường hợp có nhiều chương trình phục vụ ngắt giống nhau
cho một yêu cầu ngắt và việc chọn chương trình nào để sử dụng là trách
nhiệm của người lập trình.

Tóm lại, muốn dùng chế độ thăm dò của 8259A để xác định yêu cầu ngắt
hiện tại ta cần làm các thao tác sau.

- Cấm các yêu ngắt bằng lệnh CLI

- Ghi từ lệnh OCW3 với bit P=1

- Đọc từ thăm dò trạng thái yêu cầu ngắt trên bus dữ liệu

Bit ESMM=1 cho phép 8259 thao tác với chế độ mặt nạ đặc biệt. Bit
SMM=1 cho phép lập chế độ mặt nạ đặc biệt được dùng để thay đổi thứ tự ưu
tiên ngay trong chương trình con phục vụ ngắt. Ví dụ, trong trường hợp có

201
một yêu cầu ngắt bị cấm (bị che bởi chương trình phục vụ ngắt với từ lệnh
OCW1) mà ta lại muốn cho phép các yêu cầu ngắt với mức ưu tiên thấp hơn
so với yêu cầu ngắt bị cấm đó được tác động thì ta sẽ dùng chế độ mặt nạ đặc
biệt. Một khi đã được lập, chế độ mặt nạ đặc biệt sẽ tồn tại cho tới khi bị xoá
bằng cách ghi vào 8259A một từ lệnh OCW3 khác với bit SMM=0. Mặt nạ
đặc biệt không ảnh hưởng tới các yêu cầu ngắt với mức ưu tiên cao hơn.

❖ Nguyên lý làm việc

Giả sử có một mạch điều khiển ngắt được nối CPU như trên Hình 4.15.
Trong đó, các đầu vào IR của PIC chủ 8259A có thể được nối với PIC thợ hay
với các ngoại vi có yêu cầu ngắt. Nguyên lý làm việc như sau:

+ Trong quá trình khởi động


INTR INT IR1
ta phải ghi các từ điều khiển khởi INTA INTA IR2

đầu cho mạch, và ban đầu các 8259A .


CPU
thanh ghi trong 8259A là IRR, D0-D7 .
D0-D7
IMR đều bị xoá. RD RD
.
IR7
WR WR
+ Khi một chân IR nào đó CaS0-CaS2
của PIC chủ có mức tích cực, sẽ
Nối với các 8259A tớ
đặt bit tương ứng trong thanh ghi
IRR lên mức cao, báo hiệu có yêu Hình 4.15. Nguyên lý ghép nối với 8259A

cầu ngắt, PIC chủ xét mức ưu tiên và mặt nạ ngắt của yêu cầu ngắt đó. Nếu
cho phép ngắt, PIC chủ sẽ tạo tín hiệu INT mức cao đưa đến chân INTR của
CPU.

+ Nếu CPU chấp nhận, CPU gửi xung INTA thứ nhất. Khi đó PIC chủ sẽ
so sánh chân yêu cầu ngắt IR với bit tương ứng trong ICW3:

- Nếu bit tương ứng trong ICW3 bằng 0, thì đầu ngắt là của ngoại vi được
nối vào mạch, quá trình ngắt được tiến hành như trường hợp chỉ có một
8259A. Khi đó PIC chủ sẽ chuẩn bị để đưa số hiệu ngắt tương ứng khi có
xung INTA thứ 2.

202
- Nếu bit tương ứng trong ICW3 bằng 1 thì ngắt là từ mạch thợ gửi về.
Trong trường hợp này PIC chủ sẽ đưa ra trên các đầu ra CaS0-CaS2 một mã
tương ứng với yêu cầu ngắt đến các PIC thợ. Các PIC thợ sẽ so sánh với mã
trong từ ICW3 của mình, nếu PIC nào có giá trị trùng nhau thì PIC đó chuẩn
bị đưa số hiệu ngắt cho đầu ngắt tương ứng để đưa ra bus khi có xung INTA

+ CPU sẽ sử dụng chỉ số ngắt để tính địa chỉ của vectơ ngắt tương ứng và
lấy địa chỉ của chương trình con xử lý ngắt từ vectơ ngắt này. Chương trình
con xử lý ngắt được thực hiện.

+ Khi kết thúc ngắt (lệnh IRET), CPU sẽ gửi xung INTA ra 8259A báo
kết thúc quá trình ngắt. Tuy nhiên, phần lớn các trường hợp, CPU phải gửi
EOI để kết thúc yêu cầu ngắt cho 8259A để 8259A có phương thức xử lý ưu
tiên trong quá trình ngắt tiếp theo.

❖ Một số ví dụ ghép nối dùng 8259A

Ví dụ 1: Giả sử có một hệ điều khiển ngắt dùng 3IC 8259A: 1 chủ và 2


thợ dùng cho hệ 8086 và có thêm một số quy định sau:

- Tác động của xung yêu cầu theo mức dương.

- Chỉ số ngắt của mạch chủ là từ 50h, còn của mạch thợ là 60h và 70h.

- Mạch ở chế độ không đệm và chế độ ưu tiên cố định thường (EOI


thường).

- Địa chỉ cơ sở của IC chủ và thợ là 00h, 04h và 08h.

Vẽ sơ đồ phối ghép và viết đoạn chương trình khởi động cho các 8259A.

Giải

+ Sơ đồ phối ghép trên Hình 4.16

203
‘0’
BUS dliệu
A0 SP EN IR0
D0-D7
D0-D7 IR2
CS
A1 ‘1’
CaS0-CaS2
A2 A0 SP EN IR0 Đ/khiển
A y0
A3 D0-D7 8259A
B y1
BUS A4 CS IR3 INT IR7
đ/chỉ C y2
CaS0-CaS2
A0 74LS138 Đ/khiển IR5
G2A 8259A
A5-A7 G2B INT IR7 ‘0’
G1 A0 SP EN IR0
M⁄̅̅̅
IO
y7
D0-D7 IR2
INTR CS
CaS0-CaS2
Điều khiển ( RD, WR, INTA )
Đ/khiển
8259A
INT IR7

Hình 4.16. Sơ đồ ghép nối tầng 8259A trong hệ vi xử lý 8086

Trong sơ đồ ghép nối, ta ghép các chân INT của 2 IC 8259A thợ vào các
chân IRQ3 và IRQ5 của 8259A chủ. Việc nối ghép này sẽ xác định cho các từ
điều khiển ICW3. Bit địa chỉ A0 được đưa vào các bit địa chỉ của 8259A, các
bit địa chỉ còn lại được đưa tới bộ giải mã địa chỉ 74LS138 để chọn IC.

Khi đó các từ điều khiển khởi đầu như sau:

- ICW1:00011101 (cần ICW4, có nhiều PIC, dùng cho hệ 16 bit, dùng


mức dương), sử dụng cho cả 3 PIC.

- ICW2 (PIC chủ): 01010000; ICW2 (PIC thợ 1): 01100000; ICW2 (PIC
thợ 2): 01110000.

- ICW3 (PIC chủ): 00101000; ICW3 (PIC thợ 1): 00000011; ICW3 (PIC
thợ 2): 00000101.

- ICW4: 00000001, sử dụng cho cả 3 PIC

204
+ Đoạn chương trình

;Gửi từ điều khiển thứ nhất ICW1

MOV AL, 1Dh

OUT 00h, AL ;Gửi cho PIC chủ

OUT 04h, AL ;Gửi cho PIC tớ 1

OUT 08h, AL ;Gửi cho PIC tớ 2

;Gửi các từ điều khiển thứ hai ICW2

MOV AL, 50h

OUT 02h, AL ;Gửi cho PIC chủ

MOV AL, 60h

OUT 06h, AL ;Gửi cho PIC tớ 1

MOV AL, 70h

OUT 0Ah, AL ;Gửi cho PIC tớ 2

;Gửi các từ điều khiển thứ ba ICW3

MOV AL, 28h

OUT 02h, AL ;Gửi cho PIC chủ

MOV AL, 03h

OUT 06h, AL ;Gửi cho PIC tớ 1

MOV AL, 05h

OUT 0Ah, AL ;Gửi cho PIC tớ 2

;Gửi từ điều khiển thứ tư ICW4

MOV AL, 01h

OUT 02h, AL ;Gửi cho PIC chủ

OUT 06h, AL ;Gửi cho PIC tớ 1

205
OUT 0Ah, AL ;Gửi cho PIC tớ 2

Ví dụ 2: Phối ghép một ngoại vi vào để nhập để nhập dữ liệu (theo byte),
điều khiển theo cơ chế ngắt, với các nội dung là:

- Cổng vào nhập dữ liệu là PA của 8255A địa chỉ 60h-63h.

- Mạch điều khiển ngắt dùng 8259A, đầu vào ngắt từ ngoại vi đưa vào
đầu vào IR4 có số hiệu ngắt là 14h, chế độ ưu tiên cố định, không đệm. Địa
chỉ của 8259A là 64h và 65h.

- Chương trình con ngắt sẽ nhập 1 byte dữ liệu từ ngoại vi nào một vùng
nhớ địa chỉ đầu là MEM1.

Giải

+ Sơ đồ tổ chức phần cứng có dạng trên Hình 4.17

Trong sơ đồ này, khi ngoại vi gửi dữ liệu và có xung chốt STB tới 8255A
thì PC3 đặt lên 1 để báo cho 8259A có yêu cầu ngắt. CPU chấp nhận, nó sẽ
chuyển sang thực hiện chương trình con xử lý ngắt để đọc byte dữ liệu về
CPU.

INTR INT
INTA
A1 INTA
Bus dữ liệu A0
D0-D7 D0-D7
IR4
8259A
A0-A7 Từ giải
mã địa CS
CPU chỉ (64h)

A1 D0-D7
A2 A0 PA
A1 PC3 STB TBV
PC4
8255A
RD RD
PB
WR WR
Từ giải TBR
CS
mã địa
chỉ (60h)

Hình 4.17. Sơ đồ tổ chức cho ngoại vi yêu cầu ngắt

206
+ chương trình thực hiện.

; Đoạn chương trình khởi đầu PIC và PPI

; Khởi đầu cho 8259A

; Từ ICW1=000111111, có sử dụng ICW4

; ICW2=00010000=10h cho IRQ0

; ICW4=00000001=01h

MOV AL, 1Eh

OUT 64h, AL

MOV AL, 10h

OUT 66h, AL

MOV AL, 01h

OUT 66h, AL

; Khởi đầu cho 8255A

; CW=10111101 với PA cổng vào, PB cổng ra mode1; PC cổng vào

MOV AL, 0BDh

OUT 68h, AL

; Chương trình con xử lý ngắt nhập 1 byte dữ liệu, kết thúc bằng mã 0dh

; Vào: Địa chỉ của vùng nhớ dữ liệu hiện tại được chứa trong ô nhớ
0100h, còn địa chỉ đầu MEM1 được đặt cất vào [0100h] ở chương trình chính.
Số byte dữ liệu được chứa trong ô nhớ 0102

; Ra: Dữ liệu được cất vào vùng nhớ có địa chỉ đầu là MEM1

nhap_ngat PROC

CLI ;xoá cờ ngắt, cấm ngắt

PUSH AX

207
PUSH BX

PUSH CX

;Lấy địa chỉ và số đếm

MOV BX, word PTR[0100h]

MOV CX, word PTR[0102h]

;Đọc byte dữ liệu vào và cất vào vùng nhớ

IN AL, 60h

MOV [BX], AL

;Tăng địa chỉ và số đếm cho lần nhập tiếp và cất vào bộ nhớ

INC BX

INC CX

MOV word PTR[0100h], BX

MOV word PTR[0102h], CX

POP CX

POP BX

POP AX

RET

Nhap_ngat ENDP

4.3. Vào/ra bằng phương pháp truy nhập trực tiếp bộ nhớ

4.3.1. Ý nghĩa và nguyên tắc truy nhập trực tiếp bộ nhớ

4.3.1.1. Ý nghĩa:

Trong các cách điều khiển việc trao đổi dữ liệu giữa thiết bị ngoại vi và
hệ vi xử ly bằng cách thăm dò trạng thái sẵn sàng của thiết bị ngoại vi hay
bằng cách ngắt bộ vi xử lý đã nói đến ở phần trước, dữ liệu thường được

208
chuyển từ bộ nhớ qua bộ vi xử lý để rồi từ đó ghi vào thiết bị ngoại vi hoặc
ngược lại, từ thiết bị ngoại vi nó được đọc vào bộ vi xử lý để rồi từ đó được
chuyển đến bộ nhớ. Vì thế tốc độ trao đổi dữ liệu phụ thuộc rất nhiều vào tốc
độ thực hiện của các lệnh MOV, IN và OUT của bộ vi xử lý và do đó việc trao
đổi dữ liệu không thể tiến hành nhanh được.

Trong thực tế có những khi ta cần trao đổi dữ liệu thật nhanh với thiết bị
ngoại vi như: khi cần đưa dữ liệu hiển thị ra màn hình hoặc trao đổi dữ liệu
với bộ điều khiển đĩa. Trong các trường hợp đó ta cần có được khả năng
đọc/ghi dữ liệu trực tiếp với bộ nhớ (direct memory access, DMA – thâm nhập
vào bộ nhớ trực tiếp không thông qua CPU) thì mới đáp ứng được yêu cầu về
tốc độ trao đổi dữ liệu. Để làm được điều này các hệ vi xử lý nói chung đều
phải dùng thêm mạch chuyên dụng để điều khiển việc thâm nhập trực tiếp vào
bộ nhớ (direct memory access controller, DMAC).

Có thể lấy 1 ví dụ cụ thể để minh hoạ điều này. Trong khi một mạch
DMAC như 8237A-5 của Intel có thể điều khiển việc chuyển 1 byte trong
mảng dữ liệu từ bộ nhớ ra thiết bị ngoại vi chỉ hết 4 chu kỳ xung đồng hồ thì
bộ vi xử lý 8086 phải làm hết tới 39 chu kỳ:

; Số chu kỳ xung đồng hồ

LAP: MOV AL, [SI] ; 10

OUT PORT, AL ; 10

INC SI ; 2

LOOP LAP ; 17

; cộng 39 chu kỳ

4.3.1.2. Nguyên tắc

Để hỗ trợ cho việc trao đổi dữ liệu với thiết bị ngoại vi bằng cách thâm
nhập trực tiếp vào bộ nhớ, tại mỗi vi mạch CPU thường tồn tại chân yêu cầu
treo HOLD để thiết bị ngoại vi mỗi khi có yêu cầu dùng bus cho việc trao đổi

209
dữ liệu với bộ nhớ thì thông qua chân này mà báo cho CPU biết. Đến lượt
CPU, khi nhận được yêu cầu treo thì nó tự treo lên (tự tách ra khỏi hệ thống
bằng cách đưa các bus vào trạng thái trở kháng cao) và đưa xung HLDA ra
ngoài để thông báo CPU cho phép sử dụng bus.

Sơ đồ khối của một hệ vi xử lý có khả năng trao đổi dữ liệu theo kiểu
DMA được thể hiện trên Hình 4.18.
Bus địa chỉ
CPU Bus dữ liệu

DMAC I/O MEM


HOLD HRQ DRQ DRQ

HLDA HACK DACK DACK

Bus điều khiển (các tín hiệu quan trọng: IOR, IOW, MEMR , MEMW )

Hình 4.18. Hệ vi xử lý với DMAC

Ta nhận thấy trong hệ thống này, khi CPU tự tách ra khỏi hệ thống bằng
việc tự treo (ứng với vị trí hiện thời của các công tắc chuyển mạch) để trao đổi
quyền sử dụng bus cho DMAC thì DMAC phải chịu trách nhiệm điều khiển
toàn bộ hoạt động trao đổi dữ liệu của hệ thống. Để làm được điều đó DMAC
phải có khả năng tạo ra được các tín hiệu điều khiển cần thiết giống như các
tín hiệu của CPU và bản thân nó phải là một thiết bị lập trình được (để CPU
“dặn dò” nó bằng cách đưa vào các từ điều khiển trước khi nó có thể hoạt
động độc lập).

Quá trình hoạt động của hệ thống trên có thể được tóm tắt như sau:

Khi thiết bị ngoại vi có yêu cầu trao đổi dữ liệu kiểu DMA với bộ nhớ, nó
đưa yêu cầu DRQ=1 đến DMAC, DMAC sẽ đưa yêu cầu treo HRQ=1 đến
chân HOLD của CPU. Nhận được yêu cầu treo, CPU sẽ treo các bus của mình
và trả lời chấp nhận treo qua tín hiệu HLDA=1 đến chân HACK của DMAC.
DMAC sẽ thông báo cho thiết bị ngoại vi thông qua tín hiệu DACK=1 là nó

210
cho phép thiết bị ngoại vi trao đổi dữ liệu kiểu DMA. Khi quá trình DMA kết
thúc thì DMAC đưa ra tín hiệu HRQ=0.

Trong thực tế tồn tại 3 kiểu trao đổi dữ liệu bằng cách thâm nhập trực tiếp
vào bộ nhớ như sau:

- Treo CPU một khoảng thời gian để trao đổi cả mảng dữ liệu.
- Treo CPU để trao đổi từng byte
- Tận dụng thời gian không dùng bus của CPU để trao đổi dữ liệu

+ Trao đổi cả một mảng dữ liệu

Trong chế độ này CPU sẽ bị treo trong suốt quá trình trao đổi mảng dữ
liệu. Chế độ này được dùng khi ta có nhu cầu trao đổi dữ liệu với ổ đĩa hoặc
đưa dữ liệu ra hiển thị. Các bước thao tác để chuyển một mảng dữ liệu từ bộ
nhớ ra thiết bị ngoại vi là:

- CPU phải ghi từ điều khiển và từ chế độ làm việc vào DMAC để quy
định cách thức làm việc, địa chỉ đầu của mảng nhớ, độ dài của mảng nhớ...

- Khi thiết bị ngoại vi có yêu cầu trao đổi dữ liệu, nó đưa DRQ=1 đến
DMAC.

- DMAC đưa ra tín hiệu HRQ đến chân HOLD của CPU để yêu cầu treo
CPU. Tín hiệu HOLD phải ở mức cao cho đến hết quá trình trao đổi dữ liệu.

- Nhận được yêu cầu treo, CPU kết thúc chu kỳ bus hiện tại, sau đó nó
treo các bus của mình và đưa ra tín hiệu HLDA báo cho DMAC được toàn
quyền sử dụng bus.

- DMAC đưa ra xung DACK để báo cho thiết bị ngoại vi biết là có thể
bắt đầu trao đổi dữ liệu.

- DMAC bắt đầu chuyển dữ liệu từ bộ nhớ ra thiết bị ngoại vi bằng cách
đưa địa chỉ của byte đầu ra bus địa chỉ và đưa ra tín hiệu MEMR =0 để đọc 1
byte từ bộ nhớ ra bus dữ liệu. Tiếp đó DMAC đưa ra tín hiệu IOW =0 để ghi
dữ liệu ra thiết bị ngoại vi. DMAC sau đó giảm bộ đếm số byte còn phải

211
chuyển, cập nhật địa chỉ của byte cần đọc tiếp, và lặp lại các động tác trên cho
tới khi hết số đếm (TC).

- Khi quá trình DMA kết thúc, DMAC cho ra tín hiệu HRQ=0 để báo cho
CPU biết để CPU dành lại quyền điều khiển hệ thống.

+ Treo CPU để trao đổi từng byte.

Trong cách trao đổi dữ liệu này CPU không bị treo lâu dài trong một lần
nhưng thỉnh thoảng lại bị treo trong một khoảng thời gian rất ngắn đủ để trao
đổi một byte dữ liệu (CPU bị lấy mất một số chu kỳ đồng hồ). Do bị lấy đi
một số chu kỳ đồng hồ như vậy nên tốc độ thực hiện một công việc nào đó của
CPU chỉ bị suy giảm chứ không bị dừng lại. Cách hoạt động cũng tương tự
như phần trước, chỉ có điều mỗi lần DMAC yêu cầu treo CPU thì chỉ có 1 byte
được trao đổi.

+ Tận dụng thời gian CPU không dùng bus để trao đổi dữ liệu

Trong cách trao đổi dữ liệu này, ta phải có các logic phụ bên ngoài cần
thiết để phát hiện ra các chu kỳ xử lý nội bộ của CPU (không dùng đến bus
ngoài) và tận dụng các chu kỳ đó vào việc trao đổi dữ liệu giữa thiết bị ngoại
vi với bộ nhớ. Trong cách làm này thì DMAC và CPU luân phiên nhau sử
dụng bus và việc thâm nhập trực tiếp bộ nhớ kiểu này không ảnh hưởng gì tới
hoạt động bình thường của CPU.

4.3.2. Bộ điều khiển truy nhập trực tiếp bộ nhớ Intel 8237A

DMAC 8237A thường được dùng để điều khiển việc truyền dữ liệu giữa
bộ nhớ và thiết bị ngoại vi. Mạch 8237A có thể điều khiển truyền dữ liệu theo
3 kiểu.

- Chế độ truyền kiểu đọc: dữ liệu được đọc từ bộ nhớ rồi đưa ra thiết bị
ngoại vi.
- Chế độ truyền kiểu ghi:dữ liệu được đọc từ thiết bị ngoại vi rồi đưa vào
bộ nhớ.

212
- Chế độ kiểm tra: tùy địa chỉ được đưa đến bộ nhớ nhưng DMAC không
tạo ra các xung điều khiển để tiến hành các thao tác ghi/đọc bộ nhớ hay thiết bị
ngoại vi.

Ngoài ra mạch 8237A còn hỗ trợ việc trao đổi dữ liệu giữa các vùng khác
nhau trong bộ nhớ và cũng chỉ riêng trong chế độ làm việc này, dữ liệu cần
trao đổi mới phải đi qua DMAC nhưng với tốc độ cao hơn khi đi qua CPU
(trong trường hợp này ta có thể đọc được dữ liệu đó trong thanh ghi tạm)

Sơ đồ cấu trúc bên trong của 8237A được thể hiện trên Hình 4.19.

Mạch DMAC 8237A chứa 4 kênh trao đổi dữ liệu DMA với mức ưu tiên
lập trình được. DMAC 8237A có tốc độ truyền 1 MB/s cho mỗi kênh, một
kênh có thể truyền một mảng có tốc độ dài 64KB.
A0-A3
EOP Bộ giảm Bộ tăng Đệm I/O
RESET
Thanh ghi tạm Thanh ghi tạm
CS Khối bộ đếm số từ cho địa chỉ
READY A4-A7
tạo nhịp Đệm ra
CLK và
AEN điều khiển
ADSTB lệnh Đệm đọc Đệm ghi/đọc
MEMW Địa chỉ Số từ Địa chỉ Số từ
MEMR cơ sở cơ sở hiện tại hiện tại
IOR A8-A15
IOW
Đệm ghi Đệm đọc

DB0-DB7
Tg lệnh Đệm I/O
HLDA Bộ mã hoá
HRQ mức ưu tiên
DRQ0- và logic tạo Tg mặt nạ Tghi Tghi
Tghi
DRQ3 ưu tiên luân tr.thái
chế độ tạm
DACK0- phiên
Tg yêu cầu
DACK3

Hình 4.19. Sơ đồ khối cấu trúc của DMAC 8237A

4.3.2.1. Giới thiệu các chân tín hiệu của 8237A

+ CLK [I]: nhận tín hiệu CLK từ hệ thống.

213
+ CS[I]: tín hiệu chọn chip, thường được nối với đầu ra của bộ giải mã
địa chỉ. Bộ giải mã địa chỉ này không cần dùng đến đầu vào IO M vì bản thân
DMAC đã được cung cấp các xung điều khiển mới của hệ thống.

+ RESET[I]: tín hiệu nối với tín hiệu khởi động hệ thống. Khi mạch
8237A được khởi động riêng thanh ghi mặt nạ được lập còn các bộ phận sau
bị xoá:

- Thanh ghi lệnh

- Thanh ghi trạng thái

- Thanh ghi yêu cầu DMA

- Thanh ghi tạm thời

- Mạch lật byte đầu/byte cuối (first/last)

+READY[I]: tín hiệu sẵn sàng, nối với READY của hệ thống để gây ra
các chu kỳ đợi đối với các thiết bị ngoại vi hoặc bộ nhớ chậm.

+ HLDA[I]: tín hiệu báo chấp nhận yêu cầu treo từ CPU.

+ DRQ0-DRQ3[I]: các tín hiệu yêu cầu treo từ thiết bị ngoại vi. Cực tính
của các tín hiệu này có thể lập trình được. Sau khi khởi động các tín hiệu này
được định nghĩa là các tín hiệu kích hoạt mức cao). Tín hiệu DRQ phải được
duy trì cho tới khi có tín hiệu DACK.

+ DB0-DB7[I,O]: tín hiệu 2 chiều nối đến bus địa chỉ và bus dữ liệu của
hệ thống, các tín hiệu này được dùng khi lập trình cho DMAC và khi DMAC
hoạt động. Khi DMAC hoạt động các chân này chứa 8 bit địa chỉ cao A8-A15
của mảng nhớ dữ liệu cần chuyển. Trong chế độ chuyển dữ liệu giữa các vùng
của bộ nhớ tại các chân này có các dữ liệu được chuyển.

+ IORI , O vµ IOW[ I , O] : là các chân tín hiệu 2 chiều dùng trong khi lập
trình cho DMAC và trong các chu kỳ đọc và ghi.

214
+ EOPI , O : là tín hiệu 2 chiều. Khi là đầu vào nó được dùng để bắt buộc
DMAC kết thúc quá trình DMA. Khi là đầu ra nó được dùng để báo cho bên
ngoài biết một kênh nào đó đã chuyển xong số byte theo yêu cầu (Terminal
count, TC), lúc này nó thường được dùng như một yêu cầu ngắt để CPU xử lý
việc kết thúc quá trình DMA.

+ A0-A3[I,O]: là các tín hiệu 2 chiều dùng để chọn các thanh ghi trong
8237A khi lập trình và khi đọc (đầu vào), hoặc để chứa 4 bit địa chỉ thấp nhất
của địa chỉ mảng nhớ cần chuyển (đầu ra).

+ A4-A7[O]: các chân để chưa 4 bit địa chỉ phần cao trong byte địa chỉ
thấp của địa chỉ mảng nhớ cần chuyển.

+ HRQ[O]: tín hiệu yêu cầu treo đến CPU. Tín hiệu này thường được
đồng bộ với tín hiệu CLK của hệ thống rồi được đưa đến chân HOLD của
8086.

+ DACK0-DACK3[O]: là tín hiệu trả lời các yêu cầu DMA cho các
kênh. Các tín hiệu này có thể được lập trình để hoạt động theo mức thấp hoặc
mức cao. Sau khi khởi động, các tín hiệu này được định nghĩa là các xung tích
cực thấp.

+ AEN[O]: tín hiệu cho phép mạch chốt nối vào DB0-DB7 chốt lấy địa
chỉ của vùng nhớ cần trao đổi theo kiểu DMA. Tín hiệu này cũng cho phép
cấm các mạch đệm bus địa chỉ và dữ liệu hoặc mạch tạo tín hiệu điều khiển
của CPU nối vào các bus tương ứng khi DMAC hoạt động.

+ ADSTB[O]: xung cho phép chốt các bit địa chỉ phần cao A8-A15.

+ MEMR Vµ MEMW O : Là các chân tín hiệu do DMAC tạo ra và dùng khi
đọc/ghi bộ nhớ trong khi hoạt động.

4.3.2.2. Các thanh ghi bên trong của DMAC 8237A

Các thanh ghi bên trong DMAC 8237A được chọn để làm việc nhờ các
bit địa chỉ thấp A0-A3. Bảng 4.1. chỉ ra cách thức chọn ra các thanh ghi đó.

215
Bảng 4.1. Địa chỉ các thanh ghi bên trong của 8237A
Bit địa chỉ Địa chỉ Chọn chức năng R/W?
A3 A2 A1 A0 Hex
0 0 0 0 x0 Thanh ghi địa chỉ bộ nhớ kênh C0 R/W
0 0 0 1 x1 Thanh ghi đếm số từ kênh C0 R/W
0 0 1 0 x2 Thanh ghi địa chỉ bộ nhớ kênh C1 R/W
0 0 1 1 x3 Thanh ghi đếm số từ kênh C1 R/W
0 1 0 0 x4 Thanh ghi địa chỉ bộ nhớ kênh C2 R/W
0 1 0 1 x5 Thanh ghi đếm số từ kênh C2 R/W
0 1 1 0 x6 Thanh ghi địa chỉ bộ nhớ kênh C3 R/W
0 1 1 1 x7 Thanh ghi đếm số từ kênh C3 R/W
1 0 0 0 x8 Thanh ghi trạng thái /lệnh R/W
1 0 0 1 x9 Thanh ghi yêu cầu DMA W
1 0 1 0 xA Thanh ghi mặt nạ cho 1 kênh W
1 0 1 1 xB Thanh ghi chế độ W
1 1 0 0 xC Xoá mạch lật First/Last W
1 1 0 1 xD Xoá toàn bộ các thanh ghi /đọc thanh ghi tạm W/R
1 1 1 0 xE Xoá thanh ghi mặt nạ cho 4 kênh W
1 1 1 1 xF Thanh ghi mặt nạ cho 4 kênh W
Ghi chú: x do CS quyết định
Bảng 4.2. Địa chỉ các thanh ghi trong để ghi/đọc địa chỉ và số từ cần chuyển

Kênh CS IOR IOW A3 A2 A1 A0 Thanh ghi R/W?


0 1 0 0 0 0 0 Địa chỉ cơ sở và địa chỉ hiện tại W
0 0 1 0 0 0 0 Địa chỉ hiện tại R
C0
0 1 0 0 0 0 1 Bộ đếm cơ sở và bộ đếm hiện tại W
0 0 1 0 0 0 1 Bộ đếm hiện tại R
0 1 0 0 0 1 0 Địa chỉ cơ sở và địa chỉ hiện tại W
0 0 1 0 0 1 0 Địa chỉ hiện tại R
C1
0 1 0 0 0 1 1 Bộ đếm cơ sở và bộ đếm hiện tại W
0 0 1 0 0 1 1 Bộ đếm hiện tại R
0 1 0 0 1 0 0 Địa chỉ cơ sở và địa chỉ hiện tại W
0 0 1 0 1 0 0 Địa chỉ hiện tại R
C2
0 1 0 0 1 0 1 Bộ đếm cơ sở và bộ đếm hiện tại W
0 0 1 0 1 0 1 Bộ đếm hiện tại R
0 1 0 0 1 1 0 Địa chỉ cơ sở và địa chỉ hiện tại W
0 0 1 0 1 1 0 Địa chỉ hiện tại R
C3
0 1 0 0 1 1 1 Bộ đếm cơ sở và bộ đếm hiện tại W
0 0 1 0 1 1 1 Bộ đếm hiện tại R

216
Bảng 4.3. Địa chỉ các thanh ghi cho điều khiển và trạng thái

A3 A2 A1 A0 IOR IOW Thao tác


1 0 0 0 0 1 Đọc thanh ghi trạng thái
1 0 0 0 1 0 Ghi thanh ghi lệnh
1 0 0 1 0 1 Không hợp lệ
1 0 0 1 1 0 Ghi thanh ghi yêu cầu DMA
1 0 1 0 0 1 Không hợp lệ
1 0 1 0 1 0 Ghi thanh ghi mặt nạ cho 1 kênh
1 0 1 1 0 1 Không hợp lệ
1 0 1 1 1 0 Ghi thanh ghi chế độ
1 1 0 0 0 1 Không hợp lệ
1 1 0 0 1 0 Xóa mạch lật First/Last
1 1 0 1 0 1 Đọc thanh ghi tạm
1 1 0 1 1 0 Xoá toàn bộ các thanh ghi bên trong
1 1 1 0 0 1 Không hợp lệ
1 1 1 0 1 0 Xoá thanh ghi mặt nạ của 4 kênh
1 1 1 1 0 1 Không hợp lệ
1 1 1 1 1 0 Ghi thanh ghi mặt nạ cho 4 kênh

Các thanh ghi trong Bảng 4.3 có thể được ghi, đọc hoặc chỉ ghi và chúng
chứa các thông tin khác nhau liên quan đến cách thức làm việc và các thông số
của mỗi kênh DMA.

Trong Bảng 4.2 và 4.3 liệt kê các thanh ghi trên theo các quan điểm ứng
dụng khác nhau để tra cứu địa chỉ cho chúng khi lập trình với DMAC 8237A.

+ Thanh ghi địa chỉ hiện thời: Đây là thanh ghi 16 bit dùng để chứa địa
chỉ của vùng nhớ phải chuyển. Mỗi kênh có riêng thanh ghi này để chứa địa
chỉ. Khi 1 byte được truyền đi, các thanh ghi này tự động tăng hay giảm tuỳ
theo trước đó nó được lập trình như thế nào.

+ Thanh ghi số đếm hiện thời: Thanh ghi 16 bit này dùng để chứa số byte
mà kênh phải truyền (nhiều nhất là 64KB). Mỗi kênh có thanh ghi số byte của
mình. Các thanh ghi này được ghi bằng số đếm nhỏ hơn 1 so với số byte thực
chuyển.

217
+ Thanh ghi địa chỉ cơ sở và thanh ghi số đếm cơ sở: Các thanh ghi này
được dùng để chứa địa chỉ và số đếm cho mỗi kênh khi chế độ tự khởi đầu
được sử dụng. Trong chế độ này khi một quá trình DMA kết thúc thì các thanh
ghi địa chỉ hiện thời và số đếm hiện thời được nạp lại giá trị cũ lấy từ thanh
ghi địa chỉ cơ sở. Khi các thanh ghi địa chỉ hiện thời và số đếm hiện thời được
lập trình thì các thanh ghi địa chỉ cơ sở và thanh ghi số đếm cơ sở cũng được
lập trình bất kể chế độ tự khởi đầu có được sử dụng hay không.

+ Thanh ghi lệnh: Thanh ghi này dùng để lập trình cho DMAC. Nó bị
xóa khi khởi động hoặc khi ta sử dụng lệnh xoá toàn bộ các thanh ghi.

Dạng thức của thanh ghi lệnh được biểu diễn trên Hình 4.20.

Các bit của thanh ghi này quyết định các phương thức làm việc khác
nhau của 8237A. Ta sẽ giải thích sau đây ý nghĩa của các bit.

- Bit D0: cho phép DMAC dùng kênh 0 và kênh 1 để truyền dữ liệu giữa
2 vùng nhớ. Địa chỉ của byte dữ liệu ở vùng gốc được chứa trong thanh ghi
địa chỉ của kênh 0, còn địa chỉ của byte dữ liệu ở vùng đích được chứa trong
thanh ghi địa chỉ của kênh1. Số byte cần chuyển được để trong thanh ghi đếm
của kênh 1. byte cần chuyển lúc đầu được đọc từ vùng gốc vào thanh ghi tạm
để rồi từ đó được gửi đến vùng đích trong bước tiếp theo (hoạt động như lệnh
MOVSB nhưng với tốc độ cao).

- Bit D1 dùng để cho phép kênh 0 giữ nguyên địa chỉ trong chế độ truyền
dữ liệu giữa 2 vùng nhớ. Điều này khiến cho toàn bộ các ô nhớ vùng đích
được nạp cùng một byte dữ liệu.

- Bit D2 cho phép DMAC hoạt động hay không

- Bit D3 quyết định byte cần chuyển được truyền với 4 hay 2 chu kỳ đồng
hồ.

- Bit D4 cho phép chọn chế độ ưu tiên cố định (kênh 0 có mức ưu tiên
cao nhất, kênh 3 có mức ưu tiên thấp nhất) hoặc chế độ ưu tiên luân phiên

218
(kênh 0 lúc đầu có mức ưu tiên cao nhất, sau khi kênh này được chọn để
chuyển dữ liệu thì nó được nhận mức ưu tiên thấp nhất...).

- Bit D5 cho phép chọn thời gian ghi bình thường hay kéo dài cho thiết bị
ngoại vi châm.

- Các bit D6 và D7 cho phép chọn cực tính tích cực của các xung DRQ0-
DRQ4 và DACK0-DAKC4.

D7 D6 D5 D4 D3 D2 D1 D0

1: Truyền bộ nhớ → bộ nhớ


1: DACK 0: Cấm truyền bộ nhớ → bộ nhớ
0: DACK
1: Kênh 0 được giữ nguyên địa chỉ
0: Cấm kênh 0 giữ nguyên địa chỉ
1: DRQ dạng
x: Nếu bit D0=0
0: DRQ dạng
1: DMAC được phép hoạt động
1: Ghi bình thường 0: DMAC bị cấm hoạt động
0: Ghi kéo dài
x: Nếu bit D3=1 1: Nhịp rút ngắn
0: Nhịp bình thường
1: Mức ưu tiên đặt sẵn x: Nếu bit D0=1
0: Mức ưu tiên luân phiên

Hình 4.20. Dạng thức của thanh ghi lệnh

+ Thanh ghi chế độ: Dùng đặt chế độ làm việc cho các kênh của DMAC.
Mỗi kênh của DMAC có một thanh ghi chế độ riêng. Dạng thức của thanh ghi
chế độ được biểu diễn trên Hình 4.21.

Trong chế độ DMA theo yêu cầu, DMAC tiến hành chuyển dữ liệu cho
đến khi có tín hiệu EOP từ bên ngoài hoặc cho đến khi không còn yêu cầu
DMA nữa (DRQ trở nên không tích cực).

Trong chế độ DMA chuyển từng byte, khi nào vẫn còn yêu cầu DMA
(DRQ vẫn tích cực) thì DMAC đưa ra HRQ=0 trong thời gian 1 chu kỳ bus
sau mỗi lần chuyển xong một byte, sau đó nó lại đưa ra HRQ=1. Cứ như vậy,
DMAC và CPU luân phiên nhau sử dụng bus cho đến khi đếm hết (TC).

219
Trong chế độ chuyển cả mảng, cả một mảng gồm một số byte bằng nội
dung bộ đếm được chuyển liền một lúc. Chân yêu cầu chuyển dữ liệu DRQ
không cần phải giữ ở mức tích cực suốt trong quá trình chuyển.

Chế độ nối tầng được dùng khi có nhiều bộ DMAC được dùng trong hệ
thống để mở rộng số kênh có thể yêu cầu DMA.
D7 D6 D5 D4 D3 D2 D1 D0

00: DMA theo yêu cầu


01: Chế độ chuyển byte
10: Chế độ chuyển mảng 00: Chọn kênh 0
11: Chế độ nối tầng 01: Chọn kênh 1
10: Chọn kênh 2
11: Chọn kênh 3
1: Địa chỉ giảm
0: Địa chỉ tăng 00: Chế độ kiểm tra
01: Chế độ ghi
10: Chế độ đọc
11: Không hợp lệ
1: Cho phép tự khởi đầu
xx: Khi D7D6=11
0: Cấm tự khởi đầu

Hình 4.21. Dạng thức của thanh ghi chế độ

+Thanh ghi yêu cầu: Yêu cầu DMA có thể được thiết lập/xoá theo ý
muốn bằng chương trình. Điều này rất có lợi khi ta muốn chuyển dữ liệu giữa
các vùng khác nhau của bộ nhớ. Lúc này các kênh liên quan phải được lập
trình ở chế độ chuyển cả mảng. Dạng thức của thanh ghi yêu cầu được biểu
diễn trên Hình 4.22.

D7 D6 D5 D4 D3 D2 D1 D0
x x x x x

00: Chọn kênh 0


1: Thiết lập yêu cầu 01: Chọn kênh 1
0: Xoá yêu cầu 10: Chọn kênh 2
11: Chọn kênh 3

Hình 4.22. Dạng thức của thanh ghi yêu cầu

220
+ Thanh ghi mặt nạ riêng cho từng kênh: Bằng thanh ghi này ta có thể
lập trình để cấm (cho bit mặt nạ tương ứng bằng 1) hay cho phép hoạt động
(cho bit mặt nạ tương ứng bằng 0) đối với từng kênh một. Dạng thức của
thanh ghi mặ nạ riêng rẽ cho từng kênh được biểu diễn trên Hình 4.23.
D7 D6 D5 D4 D3 D2 D1 D0
x x x x x

00: Chọn kênh 0


1: Thiết lập mặt nạ 01: Chọn kênh 1
0: Xoá mặt nạ 10: Chọn kênh 2
11: Chọn kênh 3

Hình 4.23. Dạng thức của thanh ghi mặt nạ riêng cho mỗi kênh

+ Thanh ghi mặt nạ tổng hợp: Với thanh ghi này ta có thể lập trình để
cấm (cho bit mặt nạ tương ứng bằng 1) hay cho phép hoạt động (cho bit mặt
nạ tương ứng bằng 0) đối với từng kênh chỉ bằng một lệnh.

Dạng thức của thanh ghi mặt nạ tổng hợp được biểu diễn trên Hình 4.24.

D7 D6 D5 D4 D3 D2 D1 D0
x x x x

1: Lập mặt nạ cho kênh 3 1: Lập mặt nạ cho kênh 0


0: Xoá mặt nạ cho kênh 3 0: Xoá mặt nạ cho kênh 0

1: Lập mặt nạ cho kênh 2 1: Lập mặt nạ cho kênh 1


0: Xoá mặt nạ cho kênh 2 0: Xoá mặt nạ cho kênh 1

Hình 4.24. Dạng thức của thanh ghi mặt nạ tổng hợp

+ Thanh ghi trạng thái: Thanh ghi này cho phép xác định trạng thái của
các kênh trong DMAC: kênh nào đã truyền xong (đạt số đếm - TC), kênh nào
đang có yêu cầu DMA để trao đổi dữ liệu. Khi một kênh nào đó đạt TC, kênh
đó sẽ tự động bị cấm. Dạng thức của thanh ghi trạng thái được biểu diễn trên
Hình 4.25.

221
D7 D6 D5 D4 D3 D2 D1 D0

1: Kênh 0 có yêu cầu 1: Kênh 0 đạt số đếm

1: Kênh 1 có yêu cầu 1: Kênh 1 đạt số đếm

1: Kênh 2 có yêu cầu 1: Kênh 2 đạt số đếm

1: Kênh 3 có yêu cầu 1: Kênh 3 đạt số đếm

Hình 4.25. Dạng thức của thanh ghi trạng thái

4.3.2.3. Các lệnh đặc biệt cho DMAC 8237A

Có 3 lệnh đặc biệt để điều khiển hoạt động của DMAC 8237A. Các lệnh
này thực hiện chỉ bằng các lệnh OUT với các địa chỉ cổng xác định tuỳ theo
các thanh ghi mà không cần đến giá trị cụ thể của thanh ghi AL.

+ Lệnh xoá mạch lật byte đầu / byte cuối (First/last, F/L): F/L là một
mạch lật bên trong DMAC để chỉ ra byte nào trong các thanh ghi 16 bit (thanh
ghi địa chỉ hoặc thanh ghi số đếm được chọn làm việc. Nếu F/L=1 thì đó là
MSB, còn nếu F/L=0 thì đó là LSB. Mạch lật F/L tự động thay đổi trạng thái
khi ta ghi/đọc các thanh ghi đó. Khi khởi động xong thì F/L=0.

+ Lệnh xoá toàn bộ các thanh ghi: lệnh này có tác động như thao tác
khởi động. Tất cả các thanh ghi đều bị xoá riêng thanh ghi mặt nạ tổng hợp thì
được lập để cấm các yêu cầu trao đổi dữ liệu.

+Lệnh xoá thanh ghi mặt nạ tổng hợp: lệnh này cho phép các kênh của
DMAC bắt đầu yêu cầu trao đổi dữ liệu.

4.3.2.4. Lập trình cho các thanh ghi địa chỉ và thanh ghi số đếm

Việc lập trình cho các thanh ghi địa chỉ và thanh ghi số đếm được thực
hiện riêng cho mỗi kênh. Cần phải định trước giá trị logic của F/L để thao tác
chính xác được với LSB và MSB của các thanh ghi trên. Ngoài ra còn phải
cấm các yêu cầu DMA của các kênh trong khi lập trình cho chúng.

222
Có thể tuân theo các bước sau đây để lập trình cho DMAC 8237A

- Xoá mạch lật F/L

- Cấm các yêu cầu của các kênh

- Ghi LSB rồi MSB của thanh ghi địa chỉ

- Ghi LSB rồi MSB của thanh ghi số đếm

223
Chương 5: MỘT SỐ BỘ VI XỬ LÝ THÔNG DỤNG

5.1. Một số bộ vi xử lý tiên tiến của Intel

5.1.1. Giới thiệu chung

Các bộ vi xử lý thế hệ sau của hãng Intel như 80186, 80286, 80386,
80486, Pentium với các phương thức xử lý tiên tiến. Trước khi đi vào giới
thiệu một số vấn đề cụ thể của họ 80x86, ta tóm lược các điểm nổi bật của các
bộ vi xử lý trong họ này.

Bộ vi xử lý 16 bit 80186 được chế tạo cho các ứng dụng cụ thể nên nó có
thêm một số các mạch chức năng phụ được đặt ngay trong IC như: mạch tạo
xung đồng hồ, mạch xử lý ngắt ưu tiên, bộ định thời lập trình được,... Về
nguyên lý, bộ xử lý 80186 giống như 8086.

Các bộ vi xử lý 80286, 80386,...được chế tạo sử dụng cho các thế hệ


máy tính cho nên việc tăng tốc độ xử lý và quản lý tài nguyên được đặt lên
hàng đầu. Vì thế việc chế tạo các bộ vi xử lý này có các tính năng tiên tiến
cũng dựa theo hướng đó.

Bộ vi xử lý 80286 là một bộ vi xử lý 16 bit hoàn chỉnh với 16 bit dữ liệu


và 24 bit địa chỉ. Bắt đầu từ 80286, các bộ vi xử lý được cấu trúc để có thể
trực tiếp thao tác với bộ đồng xử lý và với các bộ vi xử lý khác (tương tự như
chế độ MAX của 8086). Để hỗ trợ cho việc quản lý bộ nhớ ảo, 80286 có thêm
khối quản lý bộ nhớ (MMU), các thanh ghi quản lý bộ nhớ và thanh ghi từ
trạng thái máy (MSW). Cấu trúc của các thanh ghi quản lý bộ nhớ và các
thanh ghi mảng CS, DS, ES, SS cũng được thay đổi. Nó gồm 2 phần: phần hở
(được gọi là bộ chọn) có thể can thiệp được bằng chương trình và phần kín
được MMU tự động sao từ bộ nhớ sang mỗi khi bộ chọn của nó thay đổi giá
trị. Hệ lệnh của 80286 có thêm các lệnh đặc quyền cho phép hỗ trợ việc quản
lý bộ nhớ ảo.

Vi xử lý 80386 là bộ vi xử lý 32 bit đầu tiên của Intel, với các trường


thanh ghi 32 bit, bus trong 32 bit, các lệnh xử lý 32 bit. Bộ vi xử lý có bus dữ

224
liệu ngoài là 16 bit (đối với 80386SX) hay 32 bit (với 80386DX) sẽ cho phép
quản lý một miền bộ nhớ rộng lớn. Trong 80386, ngoài khả năng quản lý bộ
nhớ ảo, còn có khả năng phân trang. Để hỗ trợ cho điều này, trong MMU của
80386 còn có đơn vị trang để quản lý theo trang và các thanh ghi điều khiển
có các bit chuyển chế độ.

Bộ vi xử lý 80486 được xây dựng trên cơ sở của 80386. Ngoài các tính
năng tiên tiến của 80386, 80486 còn có thêm bộ nhớ 8 Kbyte bên trong (cache
nội bộ) để nhớ đệm lệnh và dữ liệu trong quá trình hoạt động. Bộ vi xử lý
80486DX còn được tích hợp luôn bộ đồng xử lý bên trong.

Về cấu trúc, bộ vi xử lý Pentium đẩy nhanh tốc độ xử lý bằng cách gia


tăng thêm 8Kbyte cache so với 80486, như vậy bên trong Pentium sẽ có
8Kbyte cache cho lệnh cho 8Kbyte cache cho dữ liệu. Pentium cũng gia tăng
thêm mộ bộ ALU, hai bộ ALU này có thể làm việc song song.

Có nhiều vấn đề trong việc tăng tốc độ xử lý và quản lý tài nguyên (bạn
đọc có thể xem thêm trong các tài liệu khác).

5.1.2. Các tính năng tiên tiến

5.1.2.1. Cơ chế quản lý bộ nhớ ảo

Các bộ vi xử lý Intel, tuỳ từng loại mà có khả năng quản lý bộ nhớ theo
chế độ địa chỉ thực hay ảo, theo mảng hay phân trang. Bộ vi xử lý 80286 có
thể quản lý bộ nhớ theo chế độ địa chỉ thực và chế độ địa chỉ ảo.

+ Trong chế độ thực: bộ vi xử lý 80286 cũng chỉ quản lý tối đa không


gian nhớ 1Mbyte (thông qua 20 đường địa chỉ A0-A19) giống như bộ vi xử lý
8086. Đó là 1 Mbyte trong miền địa chỉ thứ nhất của không gian nhớ vật lý
(khi đó các bit địa chỉ cao đều bằng 0).

+ Trong chế độ ảo: không gian bộ nhớ trong chế độ địa chỉ ảo có dung
lượng lớn hơn dung lượng bộ nhớ thực rất nhiều. Để thực hiện chức năng

225
quản lý ảo CPU sử dụng các cơ cấu đặt biệt là phần ẩn của các thanh ghi quản
lý.

Khối quản lý bộ nhớ của 80286 thực hiện việc chuyển các giá trị địa chỉ
ảo (địa chỉ logic) thành các địa chỉ thực cho bộ nhớ vật lý. Nguyên tắc cơ bản
của chế độ địa chỉ ảo là phương thức tạo ra các mảng nhớ, mỗi mảng nhớ bao
gồm các ô nhớ liên tiếp nhau có dung lượng không vượt quá 64KB và mảng
nhớ này có thể trao đổi thông tin giữa bộ nhớ trung tâm và bộ nhớ ngoài.

Mỗi mảng nhớ được xác định bằng 3 tham số:

- Địa chỉ cơ sở.


- Kích thước (dung lượng)mảng nhớ.
- Quyền thâm nhập mảng nhớ.

Không gian nhớ luôn gắn với nhiệm vụ, các không gian nhớ dành riêng
cho một nhiệm vụ được gọi là không gian nhớ cục bộ. Không gian nhớ mà tất
cả các nhiệm vụ đều có thể thâm nhập được gọi là không gian nhớ toàn cục.

Một địa chỉ trong chương trình chạy trên vi xử lý 80286 gồm có 2 thành
phần: Bộ chọn mảng 16 bit và Offset (độ dời) 16 bit. 32 bit địa chỉ này có ý
nghĩa khác nhau khi 80286 làm việc ở chế độ thực và chế độ bảo vệ.

Trong chế độ thực, bộ chọn mảng chứa địa chỉ cơ sở của mảng nhớ. Do
đó việc xác định địa chỉ vật lý tương tự như 8086:

Địa chỉ vật lý=địa chỉ cơ sơ*16+offset

Trong chế độ bảo vệ, bộ chọn mảng có có ý nghĩa như sau: hai bit thấp
dùng để thể hiện mức đặc quyền của các yêu cầu (RPL-Request Privelege
level); bit TI (Table Indecator) được sử dụng để xác định không gian nhớ.
Nếu TI=0 - không gian nhớ là không gian toàn cục, TI=1 – không gian nhớ là
không gian cục bộ. 13 bit cao của bộ chọn mảng dành cho chỉ số nên nó xác
định được 213=8192 mảng nhớ trong không gian nhớ toàn cục và 8192 mảng

226
nhớ trong không gian nhớ cục bộ. Như vậy bộ chọn mảng địa chỉ hóa được
16384 mảng nhớ khác nhau.

Dung lượng lớn nhất của một mảng nhớ là 64KB nên không gian nhớ ảo
dành cho một nhiệm vụ có dung lượng cực đại là 2 14*216=1GB (trong khi đó
dung lượng bộ nhớ ở chế độ thực chỉ là 1MB).

Bộ vi xử lý quản lý hai loại bảng các bộ mô tả là:

- Bảng các bộ mô tả không gian nhớ toàn cục (GDT).


- Bảng các bộ mô tả không gian nhớ cụ bộ (LDT).

Trong các GDT hay LDT chứa các bộ mô tả dữ liệu được sử dụng để
quy chiếu tới mảng dữ liệu và mảng STACK (Hình 5.1). Tám byte của bộ mô
tả chứa các thông tin về mảng: địa chỉ cơ sở, dung lượng của mảng, một byte
đặc quyền thâm nhập vào mảng. Lưu ý rằng hai byte đầu dành cho các bộ vi
xử lý cấp cao của hãng Intel (80386, 80486, 80586,…), khi khởi động phải
nạp giá trị 0 vào chúng.

Dành cho các bộ vi xử lý cao cấp (phải nạp 0 khi khởi động)
P DPL 1 0 ED W A Địa chỉ cơ sở A23-A16
Địa chỉ cơ sở A15-A0
Giới hạn L15-L0

Hình 5.1. Bộ mô tả mảng số liệu của 80286

Trong đó các byte có chức năng là:

- Giới hạn mảng nhớ 16 bit

- Địa chỉ cơ sở mảng nhớ 24 bit

- Quyền thâm nhập 8 bit, trong đó:

227
P (Present) =1 nếu mảng dữ liệu mà bộ mô tả quy chiếu tới đã được nạp
trong bộ nhớ, còn nếu chưa thì P = 0. Khi chương trình thâm nhập vào mảng
dữ liệu chưa có trong bộ nhớ sẽ gây ra ngắt ngoại lệ.

DPL (Descriptor Privilege Level) -2 bit: chỉ mức đặc quyền của mảng
mà bộ mô tả quy chiếu tới.

ED (Expansion): Chiều tiến triển nếu =1  mảng ngăn xếp; =0  số


liệu.

W(Writable): nếu W=1 thì mảng dữ liệu có thể đọc và ghi; còn =0 thì
chỉ ghi

A(Accessed): A=1 thì mảng dữ liệu đang được sử dụng

Cách tính địa chỉ vật lý từ địa chỉ logic

Địa chỉ logic có 32 bit gồm bộ chọn 16 bit và offset (16 bit với hệ 286 bit
và 32 bit với hệ 386 trở lên).

Bộ chọn có 3 thành phần: chỉ số, TI và RPL. TI cho biết bộ mô tả thuộc


GDT hay LDT. Vì mỗi bộ mô tả mảng có 8 byte nên địa chỉ của bộ mô tả
trong bảng sẽ là địa chỉ cơ sở cộng với chỉ số nhân 8 lần. 80286 sẽ tìm thấy
trong bộ mô tả địa chỉ cơ sở của mảng nhớ thực và giới hạn của nó. Cộng 24
bit địa chỉ cơ sở với 16 bit offset trong địa chỉ ảo sẽ cho 24 bit địa chỉ thực
của mảng nhớ.

Từ bộ chọn, MMU của bộ vi xử lý sẽ xác định được bộ mô tả trong bảng


các bộ mô tả của mảng. Từ bộ mô tả mảng, MMU xác định được mảng nhớ
(gồm địa chỉ cơ sở và giới hạn) cần thâm nhập, và nó lấy địa chỉ cơ sở cộng
với offset, ta tìm được địa chỉ vật lý của byte nhớ.

❖ Cơ chế bảo vệ

Bảo vệ bộ nhớ có các chức năng sau: cách ly chương trình hệ thống và
chương trình ứng dụng, cách ly giữa các nhiệm vụ và kiểm tra thời điểm thâm
nhập vào đối tượng.

228
Trong chế độ quản lý bộ nhớ ảo có thể phân cấp mức đặc quyền thâm
nhập. Để mô tả mức đặc quyền vùng các bộ vi xử lý Intel dùng 2 bit tương
ứng với 4 mức đặc quyền trong chế độ quản lý theo mảng.

Với mức đặc quyền của mảng nhớ được định nghĩa trong bộ mô tả mảng
là DPL (Discription Privilege Level) và mức đặc quyền của bộ chọn khi thâm
nhập vào mảng nhớ là RPL (Request Privilege Level) thì cơ chế bảo vệ chung
là: Muốn thâm nhập vào một mảng nhớ thì mức đặc quyền của bộ chọn RPL
sẽ phải lớn hơn mức đặc quyền mô tả mảng nhớ đó.

❖ Cơ chế thay đổi nhiệm vụ

Mỗi một nhiệm vụ trong chế độ bộ nhớ ảo đều được xây dựng một
segment trạng thái nhiệm vụ tương ứng trong bộ nhớ (TSS-task state
segment). Mỗi một TSS cho một nhiệm vụ chứa các trạng thái của nhiệm vụ
đó như trạng thái hiện tại của các thanh ghi trong CPU, các thông tin của
vùng dữ liệu, vùng địa chỉ của nhiệm vụ phải trở về... Quá trình thay đổi
nhiệm vụ được thực hiện tự động theo từng bước như sau:

- Bước 1: cất giữ tất cả trạng thái thanh ghi của nhiệm vụ đang chạy
vào TSS của nhiệm vụ đó.
- Bước 2: nạp vào thanh ghi TSS giá trị của bộ chọn cho phép thâm
nhập vào bộ mô tả TSS của nhiệm vụ cũ.
- Bước 3: nạp các thanh ghi của 80286 từ các giá trị TSS mới. Nhiệm
vụ bắt đầu từ chỗ trước đây nó bị dừng.

Cơ chế thay đổi nhiệm vụ được thực hiện thông qua các cổng giao dịch.
Tuy nhiên, từng loại mà quá trình thay đổi nhiệm vụ diễn ra khác nhau.

5.1.2.2. Cơ chế quản lý bộ nhớ phân trang

Cơ chế phân trang bộ nhớ của hệ vi xử lý Intel được bắt đầu từ 80386.
Các bộ vi xử lý này có thể quản lý bộ nhớ theo cả chế độ thực, ảo và phân
trang. Ở chế độ thực, nó cũng giống như 80286, chế độ ảo việc chuyển hoá
địa chỉ được thực hiện theo sơ đồ Hình 5.2.

229
Chỉ số
Cơ sở offset
D.chuyển Bộ nhớ
vật lý
Đơn vị Đơn vị
32 bit đ/c quản lý 32 bit đ/c
quản lý
tuyến tính theo trang vật lý
Bộ chọn theo mảng

Hình 5.2. Cơ chế quản lý địa chỉ của 80386

Trong chế độ địa chỉ ảo, đơn vị quản lý địa chỉ theo mảng sẽ chuyển địa
chỉ logic thành 32 bit địa chỉ tuyến tính. Nếu đơn vị trang không làm việc thì
được đưa ra làm 32 bit địa chỉ vật lý để thâm nhập bộ nhớ.

Nếu đơn vị quản lý địa chỉ theo trang làm việc, nó sẽ chuyển 32 bit địa
chỉ tuyến tính thành 32 bit địa chỉ vật lý.

❖ Cơ chế quản lý bộ nhớ theo mảng.

Cơ chế quản lý bộ nhớ theo mảng của MP 80386 cũng tương tự như
80286 theo sơ đồ Hình 5.3.

32 bit đ/c vật lý


Bộ chọn Bộ mô tả mảng Địa chỉ cơ sở +

Offset

Hình 5.3. Cơ chế quản lý theo mảng của 80386

Các bộ mô tả cũng tương tự như 80286, chỉ khác là người ta ghép các bộ
mô tả mảng hệ thống và của giao dịch bằng 1 bảng chung và phân biệt bằng 4
bit kiểu

❖ Cơ chế phân trang


- Cơ chế phân trang chỉ có trong chế độ bảo vệ
- Cơ chế phân trang, bộ nhớ được chia thành các trang có độ dài thống
nhất. Như vậy, một modul chương trình hay dữ liệu có thể chứa nhiều trang
và tại một thời điểm thì chỉ có một số trang tồn tại trong bộ nhớ.

230
- Cơ chế tổ chức bộ nhớ theo trang của MP 80x86 gồm 3 thành phần là
thư mục trang, bảng các trang và trang. Cơ chế xác định địa chỉ vật lý theo
trang từ địa chỉ tuyến tính như Hình 5.4.

Địa chỉ tuyến tính 32 bit được chia làm 3 phần như trên Hình 5.5. Thanh
ghi CR3 32 bit trong CPU chứa địa chỉ cơ sở cho bảng thư mục trang, nó
được cộng không dấu với 10 bit cao của địa chỉ tuyến tính để xác định được
bảng các trang hiện tại đang làm việc. Tương tự, ta xác định được trang và địa
chỉ vật lý của trang cần thâm nhập.
31 22 21 12 11 0

Địa chỉ tuyến tính

+
+
+ Bộ nhớ vật lý
Bảng các trang
CR3
Thư mục trang

Hình 5.4. Cơ chế quản lý theo trang của 80386

Như vậy, thư mục trang, bảng các trang và mỗi trang đều có một độ dài
xác định. Đối với các bộ vi xử lý của Intel, chúng đều có độ dài 4 KB.

5.1.2.3. Xử lý song song và bộ nhớ đệm

Trong các bộ vi xử lý tiên tiến của Intel có 2 công nghệ xử lý song song
là: kiến trúc đường ống (Pipeline) và kiến trúc siêu vô hướng (Superscalar).

Kiến trúc đường ống là loại xử lý mà để thực hiện một việc, người ta
chia nó thành các công đoạn, mỗi công đoạn được thực hiện ở mỗi tầng
(Stages). Các tầng này được hoạt động độc lập và được điều khiển đồng bộ
chung của ống. Trong bộ vi xử lý Pentium của Intel có 2 quá trình thực hiện
xử lý đường ống là quá trình thực hiện pipeline lệnh nguyên và thực hiện dấu
phẩy động.

231
Quá trình thực hiện pipeline lệnh nguyên được thực hiện trên 5 tầng là :
nhận lệnh (PF-Prefetch); giải mã lần thứ nhất (D1-first decode); giải mã lần
thứ hai (D2-Second decode); thực hiện (E-Excution) và viết trở về (WB-Write
back).

Quá trình thực hiện pipeline lệnh dấu phẩy động được thực hiện trên 8
tầng là: nhận lệnh (PF-Prefetch); giải mã lần thứ nhất (D1-first decode); giải
mã lần thứ hai (D2-Second decode); nhận toán hạng (E-Operand fetch); thực
hiện bước thứ nhất (X1-first excute); thực hiện bước thứ hai (X2-second
excute); ghi (WF-Write float) và báo sai số (ER-error reporting).

Pentium cho phép xử lý siêu vô hướng trên hai đường ống thực hiện là
U-pipeline và V-pipeline, mỗi ống thực hiện một số dạng lệnh. Thông thường,
các lệnh phức tạp hơn (như dịch, quay, dấu phẩy động...) được thực hiện trên
đường ống U.

Để tăng khả năng thực hiện của xử lý song song, người ta thiết kế các bộ
nhớ đệm (bộ nhớ cache) bên trong các bộ vi xử lý. Pentium có 2 bộ nhớ đệm
là 8 Kbyte cho lệnh và 8 Kbyte cho dữ liệu.

5.2. Bộ vi điều khiển

5.2.1. Khái niệm vi điều khiển

Vi điều khiển (microcontroller) là một hệ thống vi xử lý đầy đủ tích hợp


trong một chip vi mạch, chủ yếu sử dụng để thực hiện các chức năng điều
khiển. Các bộ vi điều khiển được phát triển để thỏa mãn nhu cầu thiết kế các
hệ thống dùng vi xử lý với chi phí thấp. Bởi vì, nếu xây dựng một hệ thống có
tính ứng dụng hẹp mà phải dùng tới các chip vi xử lý công suất lớn, thì sẽ là
một sự lãng phí về thiết kế và đầu tư. Một hệ thống vi xử lý đầy đủ, phải có
tối thiểu các đơn vị kết nối với nhau, đó là: đơn vị xử lý, RAM, ROM, các
cổng vào/ra song song, vào/ra tuần tự, các mạch đếm thời gian (timers) và
nhịp đồng hồ. Như vậy để tích hợp hệ vi xử lý đầy đủ bên trong một chip đơn
cần phải có một công nghệ tích hợp cao, và công nghệ CMOS thường được sử

232
dụng. Các vi điều khiển có kiến trúc Havard cho phép xử lý thông tin nhanh.
Để nghiên cứu vi điều khiển chúng ta khảo sát họ vi điều khiển 8051của Intel.

5.2.2. Họ vi điều khiển 8051

Năm 1981, Intel cho ra mắt một bộ vi điều khiển đầu tiên được gọi là
8051. Đây là bộ vi điều khiển có đầy đủ tính năng của một hệ vi xử lý 8 bit,
được tích hợp trong một chip 40 chân với đặc tính cơ bản là:

- Tần số xung đồng hồ 12MHz

- 4KB EPROM, 128B RAM

- 4 cổng xuất nhật (I/O port) 8-bit

- 2 bộ định thời 16-bit

- Mạch giao tiếp nối tiếp có khả năng hoạt động song công, đồng bộ
(UART)

- Dung lượng của bộ nhớ chương trình (ROM) ngoài có thể lên đến
64KB

- Dung lượng của bộ nhớ dữ liệu (RAM) ngoài có thể lên đến 64 KB

- Bộ xử lý bit (thao tác trên các bit riêng rẽ)

- Hệ lệnh khá mạnh (112 lệnh)

8051 đã trở nên phổ biến sau khi Intel cho phép các nhà sản xuất khác
sản xuất và bán bất kỳ dạng biến thể nào của 8051 mà họ muốn với điều kiện
họ phải để mã chương trình tương thích với 8051. Từ đó dẫn đến sự ra đời
nhiều phiên bản của 8051 với các tốc độ khác nhau và dung lượng ROM trên
chip khác nhau. Điều quan trọng là mặc dù có nhiều biến thể của 8051, như
khác nhau về tốc độ và dung lượng nhớ ROM trên chip, nhưng tất cả các lệnh
đều tương thích với 8051 ban đầu. Điều này có nghĩa là, nếu chương trình
được viết cho một phiên bản 8051 nào đó thì cũng sẽ chạy được với mọi
phiên bản khác không phụ thuộc vào hãng sản xuất. Đến nay họ vi điểu khiển

233
8051 có khá nhiều thành viên như: 8031, 8051, 8052, 8952,... với một vài đặc
tính khác nhau.

Sơ đồ chân tín hiệu của 8051 được trình bày trên Hình 5.5. Chi tiết về
chức năng chân tín hiệu; cấu trúc và các thành phần bên trong; tổ chức không
gian nhớ; tổ chức cổng vào/ra và nguyên lý thực hiện lệnh của 8051 bạn đọc
có thể tìm hiểu ở các tài liệu khác.

Vcc GND
XTL2
P1.0 Vcc
P1.1 P0.0 (AD0)
P1.2 P0.1 (AD1) XTL1
P1.3 P0.2 (AD2) P0.x AD.x
P1.4 P0.3 (AD3) RxD
P1.5 P0.4 (AD4) TxD
P1.6 P0.5 (AD5) INT 0
P1.7 P0.6 (AD6) INT1 P3.x
(RxD) P3.0 P0.7 (AD7) T0
(TxD) P3.1 EA Vpp T1

ADDRESS
WR
( INT 0 ) P3.2 8051 8051
ALE PROG RD P1.x
( INT 0 ) P3.3
PSEN
(T0) P3.4 P2.7 (A15)
(T1) P3.5 P2.6 (A14)
( WR ) P3.6 P2.5 (A13)
(RD) P3.7 P2.4 (A12)
P2.3 (A11)
P1.x SPEN
RST
XTAL2 ALE-( PRO)
P2.2 (A10)
XTAL1 EA -Vpp
P2.1 (A9)
GND
P2.0 (A8)

Hình 5.5 Sơ đồ chân tính hiệu của ON-CHIP 8051

5.2.3. Một số ví dụ về ghép nối và lập trình cho 8051

Ví dụ 1: Ghép nối vi điều khiên AT89C51 với Text LCD và hiển thị 02
dòng ký tự lên LCD

+ Sơ đồ ghép nối trên Hình 5.6

- Chọn Text LCD HD 44780.

- Chân VDD của LCD nối với nguồn +5v.

- Chân VSS của LCD nối đất.

234
- Chân VEE của LCD nối tới một biến trở để điều chỉnh độ tương phản
của LCD

- Chân RS (chọn thanh ghi) của LCD nối với P2.0 của AT89C51

- Chân RW (đọc/ghi) của LCD nối với P2.1 của AT89C51

- Chân E (cho phép) của LCD nối với P2.2 của AT89C51

- 8 chân dữ liệu D0-D7 của LCD được nối với P1.0-P1.7 của AT89C51
C1

33pFF

X1 U1
CRYSTAL
19 39
XTAL1 P0.0/AD0
38
C2 P0.1/AD1
C3 P0.2/AD2
37
1uF 18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
33pF 34
P0.5/AD5
33
P0.6/AD6
9 32
RST P0.7/AD7
21
P2.0/A8
R2 P2.1/A9
22
8.2k 23
P2.2/A10
29 24
PSEN P2.3/A11
30 25
ALE P2.4/A12
31 26
EA P2.5/A13
27
P2.6/A14
28
P2.7/A15
1 10
P1.0 P3.0/RXD
2 11
P1.1 P3.1/TXD
3 12
P1.2 P3.2/INT0
4 13
P1.3 P3.3/INT1
R1 5
P1.4 P3.4/T0
14
10k 6 15
P1.5 P3.5/T1
7 16
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E

AT89C51
1
2
3

4
5
6

7
8
9
10
11
12
13
14

Hình 5.6. Sơ đồ nguyên lý ghép nối AT89C51 với LCD HD 44780

+ Chương trình:
LCD equ P1
RS bit P2.0
RW bit P2.1
EN bit P2.2
ORG 0000h
acall int_lcd

235
acall datawrt
;--------------chuong trinh con khoi tao lcd ------------------------
int_lcd:
mov A, #1h ; xoa man hinh
acall comnwrt ; goi chuong trinh con cho phep ghi lenh vao LCD
mov A, #38h ; khoi tao LCD hai dong 5x7
acall comnwrt ; goi chuong trinh con cho phep ghi lenh vao LCD
mov A, #0Ch ; hien thi man hinh, tat con tro
acall comnwrt ; goi chuong trinh con cho phep ghi lenh vao LCD
ret
; ------------- chuong trinh con ghi lenh----------------------------
comnwrt:
mov LCD,A ; sao chep thanh ghi A den P1
clr RS ; dat RS=0 de gui lenh
clr RW ; dat RW=0 de ghi du lieu
setb EN ; dat EN=1, cho xung cao
nop
nop
clr EN ; dat EN=0, cho xung cao xuong thap de thuc hien lenh
acall delay ; tao tre
ret
;------------- chuong trinh con ghi du lieu -----------------------
datawrt:
; hien thi dong 1
LAP:
mov A,#80h ; dua con tro ve dau dong 1
acall comnwrt ; goi chuong trinh con cho phep ghi lenh vao LCD
mov DPTR,#line1 ; nap đia chi ky tu dau tien cua line1 vao DPTR
acall out_line ; hien thi line1lên LCE
; hien thi dong 2
mov A,#0C0h ; dua con tro ve dau dong 2
acall comnwrt ; goi chuong trinh con cho phep ghi lenh vao LCD
mov DPTR,#line2 ; nap d/c ky tu dau tien cua line2 vao DPTR
acall out_line ; hien thi line2 len LCD

236
; ------------------tat LCD và quay ve hien thi lai-----------------------
mov A,#01h ; tat LCD
acall comnwrt ; goi chuong trinh con cho phep ghi lenh vao LCD
ljmp LAP ; quay ve nhan “LAP” thuc hien lai viec hien thi line1, line2
ret
;------------------- chuong trinh con hien thi mot ky tu------------
out_char:
mov LCD, A ; chuyen nd cua A (ma ASCII cua ky tu can hien thi) den LCD
setb RS ; dat RS=1, de gi du lieu
clr EN ; dat RW=0 de ghi
setb EN ; dat EN=1, cho xung cao
nop
nop
clr EN ; dat EN=0, cho xung cao xuong thap de ghi du lieu len LCD
acall delay ; tao tre
ret
; ---------- chuong trinh con hien thi mot dong ket thuc boi so 0------------
out_line:
LAP1:
clr A ; xoa noi dung thanh ghi A
movc A,@A+DPTR ; chuyen nd o nho (ma ASCII cua ky tu can hien thi) vao A
JZ skip ; nhay toi nhan “skip” neu A=0 (het dong)
acall out_char ; neu A<>0, goi ham hien thi ky tu len LCD
inc DPTR ; tang DPTR them 1 de tro toi ky tu can hien thi tiep theo
sjmp LAP1 ; quay ve nhan “LAP1” de hien thi ky tu.
skip:
ret
;-----------------------------------tao tre -----------------------------------------------
delay:
mov 30,#255
del:
mov 31,#255
djnz 31,$
djnz 30,del

237
ret
;-------------------------------------------------------------------------------------------
line1: db " CHAO CAC BAN ",0
line2: db " CHUC HOC TOT! ",0
end

Ví dụ 2: Ghép nối vi điều khiên AT89C51 với Text LCD HD44780 và


bàn phím (16 phím) để thực hiện nhiệm vụ ấn một phím trên bàn phím sẽ hiển
thị ký tự tương ứng của phím đó lên LCD.

+ Sơ đồ ghép nối Hình 5.7.

R11 R14 R8 R9
10k 10k 10k 10k

C4

33pFF

X2 U2
CRYSTAL
19 39
XTAL1 P0.0/AD0
38
C5 P0.1/AD1
C6 P0.2/AD2
37
1uF 18 36
XTAL2 P0.3/AD3
35
P0.4/AD4
33pF 34
P0.5/AD5
33
P0.6/AD6
9 32
RST P0.7/AD7
21
P2.0/A8
R10 P2.1/A9
22
8.2k 23
P2.2/A10
29 24
PSEN P2.3/A11
30 25
ALE P2.4/A12
31 26
EA P2.5/A13 LS2
27 R12
P2.6/A14
28
P2.7/A15
220k
1 10
P1.0 P3.0/RXD
2 11
P1.1 P3.1/TXD
3 12 SPEAKER
P1.2 P3.2/INT0
4 13
P1.3 P3.3/INT1
R13 5
P1.4 P3.4/T0
14
10k 6 15
P1.5 P3.5/T1
7 16
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E

AT89C51
1
2
3

4
5
6

7
8
9
10
11
12
13
14

Hình 5.7. Sơ đồ ghép nối AT89C51 với Text LCD HD44780 và bàn phím

+ Chương trình:
LCD equ P1
RS bit P2.0
RW bit P2.1
EN bit P2.2
ORG 0000H

238
main:
acall int_lcd
acall line1_wrt
mov A,#0C0h
acall comnwrt
acall keypad_test
ret
;-----------------kiem tra ban phim--------------------------------
keypad_test:
mov R0,#5
mov P0,#00001111B ;dua 0 ra cac cot
K1:
mov A, P0 ;doc cac hang
anl A, #00001111B ;che cac bit khong dung
xrl A, #00001111B ;xor A voi 0Fh
jz K2
djnz R0, K1
acall line2_wrt
ajmp $
;-------------------xac dinh co phim nhan------------------------------
K2:
mov P0,#00001111B ;dua 0 ra cac cot
mov A, P0 ;doc cac hang
anl A, #00001111B ;che cac bit khong dung
cjne A, #00001111B, OVER ;neu co phim nhan, nhay toi OVER de
;xac dinh hang
sjmp K2 ;neu khong, kiem tra lai
;------------------tim phim nhan -------------------------------------
OVER:
mov r3,#50
back1:
mov P0,#11101111B ;dat cot 1 xuong 0
mov A, P0 ;doc tat ca cac hang
anl A,#00001111B ;che cac bit khong dung

239
djnz r3,back1
cjne A,#00001111B, row_1 ;cot 1 co phim nhan, tim hang
mov r3,#50
back2:
mov P0,#11011111B ;dat cot 2 xuong 0
mov A, P0 ;doc tat ca cac hang
anl A,#00001111B ;che cac bit khong dung
djnz r3,back2
cjne A,#00001111B, row_2 ;cot 2 co phim nhan, tim hang
mov r3,#50
back3:
mov P0,#10111111B ;dat cot 1 xuong 0
mov A, P0 ;doc tat ca cac hang
anl A,#00001111B ;che cac bit khong dung
djnz r3,back3
cjne A,#00001111B, row_3 ;cot 3 co phim nhan, tim hang
mov r3,#50
back4:
mov P0,#01111111B ;dat cot 2 xuong 0
mov A, P0 ;doc tat ca cac hang
anl A,#00001111B ;che cac bit khong dung
djnz r3,back4
cjne A,#00001111B, row_4 ;cot 4 co phim nhan, tim hang
row_1:
mov DPTR, #CODE1 ;dat DPTR=khoi dong tu cot 1
sjmp find_key ;tim phim nhan
row_2:
mov DPTR, #CODE2 ;dat DPTR=khoi dong tu cot 2
sjmp find_key ;tim phim nhan
row_3:
mov DPTR, #CODE3 ;dat DPTR=khoi dong tu cot 3
sjmp find_key ;tim phim nhan
row_4:
mov DPTR, #CODE4 ;dat DPTR=khoi dong tu cot 3

240
sjmp find_key ;tim phim nhan
find_key:
rrc A ;kiem tra co CF=0?
jnc ma_ASCII ;neu CF=0, lay ma ASCII
inc DPTR ;tro den hang tiep theo
sjmp find_key ;tiep tuc tim
ma_ASCII:
mov r3,#50
K3:
mov A, P0
anl A,#0fh
cjne A,#0fh,K3
djnz r3,k3
clr A
movc A,@A+DPTR ;Xac dinh ma ASCII tu bang
acall out_char ;in ky tu ra LCD
ljmp K2
ret
;-------------------------------------------------------
int_lcd:
mov A, #1h
acall comnwrt
mov A, #1h
acall comnwrt
mov A, #38h ;khoi tao LCD hai dong
acall comnwrt ;goi chuong trinh con ghi lenh
mov A, #0Ch ;Hien thi man hinh, tat con tro
acall comnwrt
ret
; -------------ghi lenh----------------------------
comnwrt:
mov LCD,A ;sao chep thanh ghi A den P1
clr RS ;dat RS=0 de gui lenh
clr RW ;dat RW=0 de ghi du lieu

241
setb EN ;dat EN=1, cho xung cao
nop
nop
clr EN ;dat EN=0, cho xung cao xuong thap
acall delay
ret
line1_wrt:
mov A,#80h ;dua con tro ve dau dong 1
acall comnwrt
mov DPTR,#line2
acall out_line
ret
line2_wrt:
mov A,#0C0h ;dua con tro ve dau dong 2
acall comnwrt
mov DPTR,#line1
acall out_line
sjmp $
ret
;-------------------hien thi ky tu------------
out_char:
mov LCD,A ;Sao chep thanh ghi A den P1
setb RS ;dat RS=1, de gi du lieu
clr EN ;dat RW=0 de ghi
setb EN ;dat EN=1
nop
nop
clr EN
acall delay
ret
; ------------------hien thi dong------------
out_line:
LAP:
clr A

242
movc A,@A+DPTR
JZ skip
acall out_char
inc DPTR
sjmp LAP
skip:
ret
;-----------tre ---------------------------
delay:
mov 30,#255
del:
mov 31,#255
djnz 31,$
djnz 30,del
ret
;------------------------------------------
delay1:
mov 50,#255
djnz 50,$
ret
;---------------------------------------------
ORG 300H
line1: db "KEYPAD ERROR",0
line2: db "KHOA DTVT-HVKTMM",0
CODE1: db "1","4","7","*" ; col 1
CODE2: db "2","5","8","0" ; col 2
CODE3: db "3","6","9","#" ; col 3
CODE4: db "A","B","C","D" ; col 4
end

243
TÀI LIỆU THAM KHẢO

[1]. PGS. TS Nguyễn Duy Bảo, Ths Lê Xuân Bằng (2002). Kỹ thuật vi
xử lý (phần cơ sở).
[2]. Văn Thế Minh (1999). Kỹ thuật vi xử lý. NXB Giáo dục.
[3]. TS. Hồ Khánh Lâm (2010). Giáo trình Kỹ thuật vi xử lý (tập 1,2).
NXB Thông tin và truyền thông
[4]. Tống Văn On (2005). Họ vi điều khiển 8051. NXB Khoa học và kỹ
thuật.
[5]. Đỗ Xuân Tiến (2009). Kỹ thuật vi xử lý và lập trình Assembly cho
hệ vi xử lý. NXB Khoa học và kỹ thuật.
[6]. M.T.Savaliya (1995). 8086 Programing and Advance Processor
Architecture. Wiley Precise textbook.
[7]. N Senthil Kumar, M Saravanan, S Jeevananthan (2011).
Microprocessors and Microcontrollers. Oxford University Press USA.

244

You might also like