Tài liệu Giáo trình Vi điều khiển (Phần 1): GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
1
LỜI NÓI ĐẦU
Giáo trình “Vi điều khiển” trong bộ giáo trình nghề Điện tử công nghiệp,
được xây dựng và biên soạn trên cơ sở chương trình khung đào tạo nghề do Bộ
Lao động – Thương binh và Xã hội ban hành và được chi tiết hóa trong chương
trình đào tạo nghề Điện tử công nghiệp của Trường Cao đẳng nghề Yên Bái.
Đối tượng phục vụ là học sinh sinh viên trong các khoá đào tạo trình độ cao
đẳng nghề, trung cấp nghề Điện tử công nghiệp trong các cơ sở sản xuất làm tài
liệu học tập và nghiên cứu. Các nhà quản lý và người sử dụng nhân lực trong các
cơ sở sản xuất làm tài liệu tham khảo.
Giáo trình môn học “Vi điều khiển” được biên soạn theo các nguyên tắc:
Tính định hướng thị trường lao động, tính hệ thống và khoa học, tính ổn định và
linh hoạt, hướng tới liên thông, chuẩn đào tạo nghề trong nước và thế giới, tính
hiện đại và sát thực với sản xuất.
Trong quá trình thực hiện nhóm biên soạn đã tham khảo nhiều tài liệu l...
89 trang |
Chia sẻ: honghanh66 | Lượt xem: 736 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Giáo trình Vi điều khiển (Phần 1), để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
1
LỜI NÓI ĐẦU
Giáo trình “Vi điều khiển” trong bộ giáo trình nghề Điện tử công nghiệp,
được xây dựng và biên soạn trên cơ sở chương trình khung đào tạo nghề do Bộ
Lao động – Thương binh và Xã hội ban hành và được chi tiết hóa trong chương
trình đào tạo nghề Điện tử công nghiệp của Trường Cao đẳng nghề Yên Bái.
Đối tượng phục vụ là học sinh sinh viên trong các khoá đào tạo trình độ cao
đẳng nghề, trung cấp nghề Điện tử công nghiệp trong các cơ sở sản xuất làm tài
liệu học tập và nghiên cứu. Các nhà quản lý và người sử dụng nhân lực trong các
cơ sở sản xuất làm tài liệu tham khảo.
Giáo trình môn học “Vi điều khiển” được biên soạn theo các nguyên tắc:
Tính định hướng thị trường lao động, tính hệ thống và khoa học, tính ổn định và
linh hoạt, hướng tới liên thông, chuẩn đào tạo nghề trong nước và thế giới, tính
hiện đại và sát thực với sản xuất.
Trong quá trình thực hiện nhóm biên soạn đã tham khảo nhiều tài liệu liên
quan của các trường bạn, sách kỹ thuật của các chuyên gia... đồng thời tham
khảo nhiều tài liệu của các trường đào tạo, hãng sản xuất; các yêu cầu của thực
tế, các kiến thức mới cũng đã được nhóm biên soạn cố gắng cập nhật và thể hiện
trong giáo trình Ngoài ra còn có sự tham gia đóng góp ý kiến tích cực của các
cán bộ, kỹ sư kỹ thuật chuyên ngành trong và ngoài tỉnh để giáo trình được hoàn
thiện.
Giáo trình môn học “Vi điều khiển” đã được Hội đồng thẩm định Trường
Cao đẳng nghề Yên Bái nghiệm thu và nhất trí đưa vào sử dụng làm tài liệu chính
thống trong nhà trường phục vụ giảng dạy và học tập của học sinh sinh viên.
Giáo trình này được biên soạn lần đầu nên mặc dù đã hết sức cố gắng song
khó tránh khỏi những thiếu sót, chúng tôi mong nhận được các ý kiến đóng góp
của người sử dụng và các đồng nghiệp để giáo trình ngày càng được hoàn thiện
hơn.
Xin trân trọng giới thiệu!
HIỆU TRƯỞNG
Thạc sỹ: Trịnh Tiến Thanh
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
2
MỤC LỤC
GIỚI THIỆU VỀ MÔ ĐUN ............................................................................. 7
Vị trí, ý nghĩa, vai trò mô đun ................................................................ 7
Mục tiêu của môdun ............................................................................... 7
Mục tiêu thực hiện của mô đun............................................................... 7
Nội dung chính của mô đun .................................................................... 7
Bài 1: Sơ lược về lịch sử và hướng phát triển ................................................. 8
1. Lịch sử phát triển ................................................................................. 8
2. Vi điều khiển ........................................................................................ 8
2.1. Nguyên lý cấu tạo ........................................................................... 9
2.2. Các kiểu cấu trúc bộ nhớ ............................................................... 10
3. Lĩnh vực ứng dụng ............................................................................. 11
4. Hướng phát triển ................................................................................ 11
Bài 2: Cấu trúc họ vi điều khiển 8051 ........................................................... 13
1. Tổng quan .......................................................................................... 13
2. Sơ đồ chân .......................................................................................... 14
2.1. Port 0 ............................................................................................ 15
2.2. Port 1 ............................................................................................ 15
2.3. Port 2 ............................................................................................ 15
2.4. Port 3 ............................................................................................ 15
2.5. Chân cho phép bộ nhớ chương trình PSEN ................................... 16
2.6. Chân cho phép chốt địa chỉ ALE ................................................... 16
2.7. Chân truy xuất bộ ROM ngoài EA ................................................ 16
2.8. Chân RESET ................................................................................ 17
2.9. Các chân XTAL1 và XTAL2 ........................................................ 17
3. Cấu trúc PORT I/O ............................................................................. 17
4. Tổ chức bộ nhớ................................................................................... 18
4.1. Vùng RAM đa năng ...................................................................... 19
4.2. Vùng RAM địa chỉ bít................................................................... 21
4.3. Các dãy thanh ghi ......................................................................... 22
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
3
5. Các thanh ghi đặc biệt (SFR) .............................................................. 23
5.1. Từ trạng thái chương trình PSW ................................................... 23
5.2. Thanh ghi B .................................................................................. 25
5.3. Con trỏ stack ................................................................................ 26
5.4. Con trỏ dử liệu DPTR ................................................................... 26
5.6. Các thanh ghi port ........................................................................ 26
5.7. Các thanh ghi định thời ................................................................. 27
5.8. Các thanh ghi của port nối tiếp...................................................... 27
5.9. Các thanh ghi ngắt ........................................................................ 28
5.10. Thanh ghi điều khiển nguồn ........................................................ 28
6. Bộ nhớ ngoài ...................................................................................... 29
6.1. Truy xuất bộ nhớ chương trình ngoài ............................................ 30
6.2. Truy xuất bộ nhớ dử liệu ngoài ..................................................... 32
6.3. Giãi mả địa chỉ ............................................................................. 34
6.4. Các không gian nhớ chương trình và dữ liệu gối nhau ................... 34
7. Các cải tiến của 8032/8052 ................................................................. 35
8. Hoạt động RESET .............................................................................. 36
9. Bài tập ................................................................................................ 37
Bài 3: TẬP LỆNH 8051 ................................................................................. 39
1. Mở đầu ............................................................................................... 39
2. Các cách định địa chỉ .......................................................................... 39
2.1. Định địa chỉ bằng thanh ghi .......................................................... 39
2.2. Định địa chỉ trực tiếp .................................................................... 40
2.3. Định địa chỉ gián tiếp .................................................................... 41
2.4. Định địa chỉ tức thời ..................................................................... 42
2.5. Định địa chỉ tương đối .................................................................. 43
2.6. Định địa chỉ tuyệt đối ................................................................... 44
2.7. Định địa chỉ dài ............................................................................ 45
2.8. Định địa chỉ theo chỉ số ................................................................ 45
3. Các nhóm lệnh .................................................................................... 47
3.1. Nhóm lệnh số học ......................................................................... 47
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
4
3.2. Nhóm lênh logic ........................................................................... 55
3.3. Nhóm lệnh truyền dữ liệu ............................................................. 66
3.4. Nhóm lênh Boolean( Các lệnh một bit) ......................................... 68
3.5 Nhóm lệnh rẽ nhánh chương trình .................................................. 78
4. Luyện tập ........................................................................................... 88
Bài 4: BỘ ĐỊNH THỜI .................................................................................. 90
1. Mở đầu ............................................................................................... 90
2. Thanh ghi SFR của timer .................................................................... 91
2.1. Thanh ghi chế độ TMOD .............................................................. 91
2.2. Thanh ghi điều khiển TCON ......................................................... 92
3. Các chế độ làm việc ............................................................................ 93
3.1. Chế độ time 13 bit (Mode 0) ......................................................... 94
3.2. Chế độ time 16 bit (Mode 1) ......................................................... 94
3.3. Chế độ tự nạp lại 8 bit ( Mode 2) .................................................. 97
3.4. Chế độ tách biệt time ( Mode 3) .................................................... 97
4. Nguồn cung cấp xung cho time ........................................................... 98
4.1. Chức năng định thời ..................................................................... 98
4.2. Chức năng đếm sự kiện ................................................................. 98
5. Khởi động, dừng, điều khiển timer ..................................................... 99
6. Khởi tạo truy xuất thanh ghi timer .................................................... 100
6.1. Đọc thời gian đang hoạt động ..................................................... 101
6.2. Thời gian ngắn và thời gian dài ................................................... 101
7. Time 2 của 8052 ............................................................................... 102
7.1. Chế độ tự động nạp lại ................................................................ 105
7.2. Chế độ thu nhận .......................................................................... 106
8. Luyện tập ......................................................................................... 107
8.1. Phương pháp ............................................................................... 107
8.2. Bài tập ........................................................................................ 107
Bài 5: CỔNG NỐI TIẾP .............................................................................. 110
1. Mở đầu ............................................................................................. 110
1.1. Khái niệm truyền dữ liệu đơn công và song công ........................ 111
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
5
1.2. Truyền thông nối tiếp dị bộ và đóng khung dữ liệu. .................... 111
1.3. Các bít bắt đầu và dừng. ............................................................. 111
1.4. Tốc độ truyền dữ liệu .................................................................. 112
1.5. Chuẩn RS232 .............................................................................. 112
2. Thanh ghi điều khiển ........................................................................ 113
2.1. Thanh ghi SCON ........................................................................ 113
2.2. Thanh ghi SBUF ......................................................................... 115
3. Chế độ làm việc ................................................................................ 116
3.1. Thanh ghi dịch 8 bit ................................................................... 116
3.2. Chế độ UART 8 bit có tốc độ baud thay đổi ............................... 117
3.3. UART 9 bit với tốc độ baud cố định .......................................... 118
3.4. Chế độ UART với tốc độ baud cố định....................................... 118
4. Khởi tạo và truy xuất thanh ghi PORT nối tiếp ................................. 118
4.1. Cho phép nhận ............................................................................ 118
4.2. Bit dữ liệu thứ 9.......................................................................... 119
4.3. Thêm vào bit chẵn – lẻ ................................................................ 119
4.4. Các cờ ngắt ................................................................................. 120
5. Truyền thông đa xử lý ...................................................................... 120
6. Tốc độ Baud ..................................................................................... 122
6.1. Tạo tốc độ baud bằng Timer 1 ..................................................... 123
6.2. Tạo tốc độ baud bằng Timer 2 ..................................................... 125
7. Luyện tập ......................................................................................... 125
Bài 6: Ngắt (Interrupt) ................................................................................. 127
1. Mở dầu ............................................................................................. 127
2. Tổ chức ngắt của 8051 ...................................................................... 128
2.1. Cho phép và không cho phép các ngắt......................................... 128
2.2. Mức ưu tiên ................................................................................ 129
2.3. Chuỗi pooling ............................................................................. 130
3. Xử lý ngắt ........................................................................................ 130
Các vec tơ ngắt .................................................................................. 131
4. Thiết kế chương trình dùng ngắt ....................................................... 132
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
6
4.1. Chương trình phục vụ ngắt kích thước nhỏ .................................. 133
4.2. Chương trình phục vụ ngắt kích thước lớn .................................. 134
5. Ngắt cổng nối tiếp ............................................................................ 137
6. Các ngắt ngoài .................................................................................. 139
7. Đồ thị thời gian của ngắt .................................................................. 144
8. Bài tập .............................................................................................. 146
Bài 7: Phần mềm hợp ngữ ........................................................................... 147
1. Mở đầu ............................................................................................. 147
2. Hoạt động của ASSEMBLER ........................................................... 148
3. Cấu trúc chương trình dữ liệu ........................................................... 150
4. Tính biểu thức trong khi hợp dịch ..................................................... 154
4.1. Các biểu thức và toán tử ............................................................. 154
4.2. Chuỗi kí tự ( character string) ..................................................... 154
4.3. Bộ đếm vị trí ( location counter) ................................................. 155
4.4. Các toán tử số học ( arithmetic operation) ................................... 155
4.5. Các toán tử logic ......................................................................... 155
4.6. Toán tử quan hệ ( relation operator) ............................................ 156
4.7. Các toán tử khác ......................................................................... 156
4.8. Thứ tự ưu tiên toán tử ................................................................. 156
4.9. Các chỉ dẫn cho Assembler ......................................................... 157
5. Các điều khiển của ASSEMBLER .................................................... 159
6. Hoạt động liên kết ............................................................................ 160
7. MACRO ........................................................................................... 161
7.1. Truyền tham số cho macro .......................................................... 161
7.2. Macro với nhãn cục bộ................................................................ 162
7.3. Tác vụ Repeat ( lặp lại) ............................................................... 163
7.4. Các tác vụ điều khiển .................................................................. 164
8. Luyện tập ......................................................................................... 165
8.1. Phương pháp viết chương trình hợp ngữ ..................................... 165
8.2. Luyện tập.................................................................................... 165
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
7
GIỚI THIỆU VỀ MÔ ĐUN
1. Vị trí, ý nghĩa, vai trò mô đun
Đây là một mô đun chuyên ngành được học sau khi học viên đã hoàn
tất các mô đun hỗ trợ trước đó như: Linh kiện điện tử, mạch điện tử, vi
mạch tương tự, kỹ thuật số...
Điện tử công nghiệp là một trong các lĩnh vực ứng dụng của công
nghệ điện tử để điều khiển thiết bị cũng như thực hiện các yêu cầu về tự
động hóa quá trình sản xuất. Trong thực tế hiện nay việc ứng dụng các bộ vi
điều khiển cho các yêu cầu này rất là phổ biến do tính linh hoạt, độ ổn định
và khả năng giải quyết được những vấn đề phức tạp của nó. Chính vì vậy
việc nắm bắt được cấu tạo và nguyên lý hoạt động các hệ dùng vi điều khiển
là đièu rất cần thiết cho công tác vận hành cũng như sửa chữa của người
công nhân ngành sửa chữa thiết bị điện tử công nghiệp.
2. Mục tiêu của môdun
Sau khi hoàn tất mô-đun này, học viên có năng lực:
• Giải thích nguyên lý hoạt động của hệ dùng vi điều khiển.
• Thay thế các khối chức năng hư hỏng trong hệ dùng vi điều khiển.
• Viết các chương trình ứng dụng đơn giản.
3. Mục tiêu thực hiện của mô đun
• Vận hành được các thiết bị và dây chuyền sản xuất dùng vi điều khiển.
• Xác định được các nguyên nhân gây hư hỏng thường xảy ra trong thực
tế.
• Sửa chữa và thay thế linh kiện hư hỏng.
• Kiểm tra và viết được chương trình điều khiển.
4. Nội dung chính của mô đun
Mô đun vi điều khiển bao gồm 7 bài học như sau :
1.Sơ lược về lịch sử và hướng phát triển của vi điều khiển
2.Cấu trúc họ 8051
3.Tập lệnh 8051
4.Bộ định thời
5.Cổng nối tiếp
6.Ngắt
7.Phần mềm ASEMBLER
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
8
Bài 1: Sơ lược về lịch sử và hướng phát triển
1. Lịch sử phát triển
Việc phát minh ra transistor vào năm 1948 là thời điểm bắt đầu cho quá
trình phát triển của máy tính với tính năng ngày càng cao và kích thước ngày
càng nhỏ. Linh kiện hội đủ 2 ưu điểm trên chính là vi xử lý.
Máy tính điện tử đầu tiên của mỹ năm 1946 tên gọi ENIAC đã sử dụng
18.000 bóng đèn điện tử và sau đó năm 1960 được IBM thay thế bằng model
1410 với toàn bộ linh kiện là transistor. Vì chức năng phức tạp nên việc lắp ráp
hệ thống cũng rất khó khăn và tốn kém, do đó đã phát sinh ý tưởng phải tìm
cách thu nhỏ kích thước của các linh kiện rời như: Transistor, diode, điện trở...và
kết quả là sự ra đời của công nghệ vi mạch.
Theo yêu cầu của các chuyên viên về tên lửa của cơ quan NASA luôn đòi
hỏi tính ổn định và kích thước thật nhỏ nên vào năm 1958 Jack Kilby của hãng
Texas instrument đã thiết kế được vi mạch đầu tiên và năm 1963 công ty
Rockwell đã cho ra đời tên lửa Minerva II được chế tạo toàn bộ bằng vi mạch.
Trong lĩnh vực dân sự vào năm 1961 công ty Fairchild lần đầu tiên giới
thiệu một FF không dùng 2 hoặc 4 transistor rời mà được tích hợp trong một vi
mạch đơn tinh thể. Các thế hệ vi mạch đầu tiên chỉ được sản xuất theo công
nghệ lưỡng cực, trong trường hợp cần nhiều lớp khuếch tán, nhiều lỗ tiếp xúc
và đường dẫn...giá thành có thể lên đến 10 - 20 đô la một mạch. Nhờ kỹ thuật
MOS mật độ tích hợp được tăng cao hơn hẳn kỹ thuật lưỡng cực. Hướng phát
triển tiếp theo sau đó là công nghệ CMOS bao gồm 2 transistor trường bổ túc
làm giảm công suất tiêu thụ vì tại cùng một thời điểm luôn có 1 transistor bị
khóa. Với yêu cầu ngày càng phức tạp và đa dạng làm cho việc sản xuất vi
mạch với số lượng lớn cũng khó khăn, điều này dẫn đến một suy nghĩ mới về
một vi mạch có khả năng lập trình, các vi mạch này có cấu tạo giống nhau và
chức năng sẽ thay đổi sau khi lập trình bằng phương pháp làm chảy các đường
dẫn điện. Không bao lâu vào năm 1974 hãng INTEL đã sản xuất được chip vi
xử lý đầu tiên lập trình theo yêu cầu của khách hàng mở đầu cho kỹ nguyên vi
xử lý cũng còn được gọi là cuộc cách mạng công nghiệp lần thứ II.
2. Vi điều khiển
Một vi xử lý chỉ giao tiếp được với bên ngoài thông qua các khối vào - ra
và để lưu trữ dữ liệu lại phải cần đến bộ nhớ. Dữ liệu nhận vào được xử lý bởi
chương trình và sau đó kết quả cũng như các tín hiệu điều khiển sẽ được đưa
đến khối ra. Đầu tiên ba khối chức năng này được kết hợp với nhau: Đơn vị xử
lý trung tâm, khối vào-ra và bộ nhớ để tạo thành micro computer, bus hệ thống
có nhiệm vụ kết nối các khối kể trên với nhau.
Do yêu cầu giảm nhỏ kích thước và giá thành sản xuất, người ta đã tích
hợp các khối chức năng của micro computer trong cùng một linh kiện và được
đặt tên là vi điều khiển (microcontroller).
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
9
2.1. Nguyên lý cấu tạo
Điểm cần lưu ý về vi điều khiển là sơ đồ khối cấu tạo của nó. Cấu tạo
một họ microcontroller chủ yếu dựa trên một kiểu tiêu chuẩn bao gồm các tính
năng quan trọng nhất, nhiều chủng loại phù hợp với các lĩnh vực ứng dụng đặc
biệt khác nhau, có thể kết hợp thêm thiết bị ngoại vi để tăng khả năng hoặc
giảm nhỏ kích thước đến mức tối thiểu trong các ứng dụng chuyên biệt như:
Kết nối bus, kết nối video hoặc điều khiển trực tiếp các cơ cấu hiển thị
LCD...Với kiểu tiêu chuẩn cũng đủ dùng cho hầu hết các ứng dụng.
Hình 1.1 Cấu trúc máy tính
Hình 1.2 Cấu trúc vi điều khiển
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
10
Hình 1.3 Sơ đồ khối vi điều khiển
2.2. Các kiểu cấu trúc bộ nhớ
Các bộ vi xử lý và vi điều khiển hiện nay chủ yếu được chế tạo theo 2
kiểu cấu trúc khác nhau: Cấu trúc Von Neumann và Harvard.
2.2.1. Cấu trúc Von Neumann
Trong cấu trúc Von Neumann chỉ có một vùng địa chỉ tuyến tính bao gồm
tất cả dữ liệu và lệnh điều khiển, độ lớn của vùng địa chỉ phụ thuộc vào chiều
dài của bộ đếm chương trình, nếu không trang bị thêm linh kiện phụ thì việc
định địa chỉ bộ nhớ chương trình và bộ nhớ dữ liệu không độc lập với nhau.
Trong cấu trúc này chỉ tồn tại một bus dữ liệu và một bus địa chỉ để đọc-ghi dữ
liệu và đọc lệnh điều khiển chương trình và không có khả năng thực. Trình hiện
song song (truy xuất đồng thời bộ nhớ dữ liệu và bộ nhớ chương).
Hình 1.4 Cấu trúc Von Neumann
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
11
2.2.2. Cấu trúc Harvard
Gồm hai vùng địa chỉ riêng biệt cho bộ nhớ dữ liệu và bộ nhớ chương
trình nên có thể truy xuất song song dữ liệu và lệnh điều khiển, cấu trúc này đặc
biệt thích hợp với các vi điều khiển 16 và 32 bít vì làm tăng tốc độ làm việc.
Nếu chỉ có một hệ thống bus như thường thấy ở vi điều khiển 8 bít thì việc truy
xuất bộ nhớ dữ liệu hoặc bộ nhớ chương trình sẽ được thực hiện thông qua các
tín hiệu điều khiển, nếu không có yêu cầu ghi vào bộ nhớ chương trình thì cấu
trúc này còn cho phép tăng tính an toàn của chương trình.
Hình 1.5 Cấu trúc harvard
3. Lĩnh vực ứng dụng
Vi điều khiển hiện nay được ứng dụng trong nhiều lĩnh vực như: TV,
thiết bị HiFi, máy giặt, điện thoại và trong ô tô...góp phần làm đơn giản hóa quá
trình xử dụng với nhiều tính năng và độ an toàn cao hơn. Ngoài ra vi điều khiển
còn được áp dụng trong lĩnh vực khoa học kỹ thuật như: Các thiết bị phân tích
và đo lường trong công nghiệp như các dây chuyền sản xuất tự động, trong lĩnh
vực máy công cụ như CNC và điều khiển chất lượng sản phẩm.
4. Hướng phát triển
Yêu cầu đặt ra cho vi điều khiển hiện nay là tăng lĩnh vực ứng dụng với
tốc độ xử lý ngày càng nhanh và kích thước nhỏ gọn, công suất tiêu thụ thấp.
Vấn đề đặt ra là liệu với vi điều khiển 8 bít có còn phù hợp hay không ? hoặc
trong tương lai phải thay bằng các vi điều khiển 16/32 bít. Khác với vi xử lý
việc phát triển luôn kèm theo việc nâng cao khả năng tính toán bằng cách mở
rộng hệ thống bus. Đối với vi điều khiển không nhất thiết phải như thế, một vi
điều khiển 8 bít cũng đủ cho rất nhiều ứng dụng và vi điều khiển 16 bít là hoàn
toàn quá dư thừa, trong trường hợp cần giảm giá thành, kích thước và công suất
tiêu thụ thì vi điều khiển 4 bít là giải pháp tối ưu. Một vài ứng dụng cần vi điều
khiển có nhiều khối ngoại vi, có ứng dụng lại cần ngoại vi tốc độ cao, hướng
phát triển tương lai là tăng khả năng của CPU và khối ngoại vi.
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
12
Một hướng đơn giản là tăng tần số xung đồng hồ để rút ngắn thời gian
thực hiện chương trình, giảm thời gian biến đổi A/D và tăng tần số giới hạn của
timer. Tuy nhiên các linh kiện bên ngoài cũng phải có khả năng làm việc ở tần
số cao, khi tăng tần số đồng cũng làm tăng công suất tiêu thụ của vi điều khiển.
Việc tối ưu hóa cấu trúc chương trình và bộ nhớ cũng góp phần nâng cao
khả năng hệ thống. Trong các ứng dụng đa nhiệm, phương pháp phân đoạn và
phân dãy hóa có một ý nghĩa rất lớn.
Với công nghệ sản xuất mới có thể đồng thời tăng tần số làm việc và
giảm công suất tiêu thụ và cả điện áp nuôi điều này sẽ mở ra các lĩnh vực ứng
dụng mới trong đó mạch điện rất đơn giản và năng lượng tiêu thụ rất thấp, bằng
cách thay đổi cú pháp tập lệnh thích hợp cho phép biên dịch dể dàng từ các
ngôn ngữ cấp cao như “C” hoặc “C#” sang mã lệnh của vi điều khiển.
Hình 1.6 Lĩnh vực ứng dụng
Hình 1.7 Hướng phát triển vi điều khiển
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
13
Bài 2: Cấu trúc họ vi điều khiển 8051
1. Tổng quan
MCS-51 là họ vi điều khiển của Intel. Các nhà sản xuất IC khác như
Siemens, Advanced Micro Device, Fujitsu và Philips được cấp phép là các nhà
cung cấp thứ hai cho các vi mạch họ MCS-51. Vi mạch tổng quát của họ MCS-
51 là chip 8051, linh kiện đầu tiên của họ này được đưa ra thị trường. Chip
8051 có các đặc điểm được tóm tắt như sau:
- 4 Kbyte ROM nội
- 128 byte RAM nội
- 4 port I/O 8 bít
- 2 bộ định thời 16 bít (timer)
- Cổng giao tiếp nối tiếp
- Không gian chương trình ngoài 64 K
- Không gian nhớ dữ liệu ngoài 64 K
- Có khả năng xử lý bít
- 210 địa chỉ bít
- Nhân/ chia trong 4 μS
Hình 2.1 Sơ đồ khối 8051
Các thành viên khác của họ MCS-51 có dung lượng ROM (EPROM),
RAM trên chip khác nhau hoặc có thêm bộ định thời thứ ba (bảng 2.1)
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
14
BẢNG 2.1 Các chip họ MCS-51
Chip ROM nội (Kbyte) RAM nội (byte) Số timer
8031 0 128 2
8051 4 ROM 128 2
8751 4 EPROM 128 2
8032 0 256 3
8052 8 ROM 256 3
8752 8 EPROM 256 3
Thuật ngữ “8051” được dùng để chỉ chung cho các chip họ MCS-51 với
các chip cải tiến từ 8051 sẻ được đề cập đến một cách rõ ràng khi cần thiết, cấu
trúc cơ bản được trình bày trong sơ đồ khối hình 2.1.
Hình 2.2 Sơ đồ chân của 8051
2. Sơ đồ chân
Chức năng từng chân của 8051 được mô tả tóm tắt như sau:
Như trong hình 2.2 32 trong số 40 chân của 8051 có công dụng xuất/
nhập. Tuy nhiên 24 trong 32 chân này có hai chức năng (26/32 đối với 8032 và
8052). Mỗi một chân ngoài chức năng xuất nhập còn có thể hoạt động như một
đường điều khiển, đường dữ liệu hoặc đường địa chỉ 32 chân nói trên hình
thành 4 port 8 bít, với các thiết kế yêu cầu tối thiểu các thành phần bên ngoài
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
15
có thể sử dụng các port này làm nhiệm vụ xuất/ nhập 8 đường cho mỗi port có
thể được xử lý như một đơn vị giao tiếp với các thiết bị song song như máy in,
bộ biến đổi D-A.......hoặc mỗi đường có thể hoạt động độc lập giao tiếp với
một thiết bị đơn bít như chuyển mạch, LED, BJT, FET, cuộn dây, động cơ,
loa...
2.1. Port 0
Port gồm các chân từ 32 đến 39 đối với 8051 có 2 công dụng. Trong các
thiết kế cần tối thiểu hóa thành phần, port 0 được sử dụng làm nhiệm vụ
xuất/nhập. Trong các thiết kế lớn hơn có bộ nhớ ngoài, port 0 trở thành bus địa
chỉ/dữ liệu đa hợp (byte thấp địa chỉ).
2.2. Port 1
Port 1 chỉ có một công dụng là xuất/nhập (các chân 18 trên 8051). Các
chân của port 1 được ký hiệu là P1.0, P1.1...P1.7 và được dùng để giao tiếp với
thiết bị bên ngoài khi có yêu cầu. Không có chức năng nào khác nữa gán cho
các chân của port 1, nghĩa là chúng chỉ được sử dụng để giao tiếp với các thiết
bị ngoại vi ngoại lệ với 8032, 8052 có thể dùng P1.0 và P1.1 làm ngõ vào cho
mạch định thời thứ ba.
2.3. Port 2
Port 2 gồm các chân từ 2128 trên 8051 có hai công dụng hoặc làm
nhiệm vụ xuất/nhập hoặc là byte địa chỉ cao của bus địa chỉ 16 bít cho các thiết
kế có bộ nhớ chương trình ngoài hoặc các thiết kế có nhiều hơn 256 byte bộ
nhớ dữ liệu ngoài.
2.4. Port 3
Port 3 gồm các chân từ 1017 trên 8051 có hai công dụng, ngoài chức
năng xuất/nhập các chân của port 3 còn có chức năng riêng như trình bày trong
bảng 2.2.
Bảng 2.2: Chức năng các chân PORT 3 và PORT 1
Bít Tên Địa chỉ bít Chức năng
P3.0 RxD B0H Nhận dữ liệu port nối tiếp
P3.1 TxD B1H Phát dữ liệu port nối tiếp
P3.2 INT0 B2H Ngõ vào ngắt 0 ngoài
P3.3 INT1 B3H Ngõ vào ngắt 1 ngoài
P3,4 T0 B4H Ngõ vào timer 0
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
16
P3,5 T1 B5H Ngõ vào timer 1
P3.6 WR B6H Ghi RAM ngoài
P3.7 RD B7H Đọc RAM ngoài
P1.0 T2 90H Ngõ vào timer 2
P1.1 T2EX 91H Nạp/nhận timer 2
2.5. Chân cho phép bộ nhớ chương trình PSEN
8051 cung cấp 4 tín hiệu điều khiển bus. Tín hiệu cho phép bộ nhớ
chương trình PSEN (program store enable) là tín hiệu xuất trên chân 29, đây là
tín hiệu điều khiển cho phép truy xuất bộ nhớ chương trình ngoài, chân này
thường nối với chân cho phép xuất OE (output enable) của EPROM hoặc ROM
để cho phép đọc các byte mã lệnh. Tín hiệu PSEN ở logic 0 trong suốt thời gian
tìm nạp lệnh, các mã nhị phân của chương trình được đọc từ EPROM qua bus
dử liệu và được chốt vào thanh ghi lệnh IR của 8051 để được giải mã. Khi thực
hiện một chương trình chứa trong ROM nội, PSEN được duy trì ở mức logic 1.
2.6. Chân cho phép chốt địa chỉ ALE
Đây là tín hiệu ra cho phép chốt địa chỉ ALE (address latch enable) để
giãi đa hợp bus địa chỉ/dữ liệu khi port 0 được dùng làm bus đa hợp địa chỉ/dữ
liệu, chân ALE xuất tín hiệu để chốt địa chỉ (byte thấp của địa chỉ 16 bít) vào
một thanh ghi ngoài trong suốt nửa đầu của chu kỳ bộ nhớ. Sau khi thực hiện
xong các chân của port 0 sẽ xuất/nhập dữ liệu hợp lệ trong nửa thứ hai của chu
kỳ bộ nhớ. Tín hiệu ALE có tần số bằng 1/6 tần số của mạch dao động bên
trong chip 8051 và có thể được dùng làm xung đồng hồ cho phần còn lại của hệ
thống. Nếu mạch dao động có tần số 12 MHz thì tần số ALE là 2 MHz. Ngoại
lệ duy nhất là trong thời gian thực hiện lệnh MOVX, một xung ALE sẽ bị bỏ
qua (hình 2.10). Chân ALE còn được dùng để nhận xung ngõ vào lập trình cho
EPROM trên chip.
2.7. Chân truy xuất bộ ROM ngoài EA
Đây là ngõ vào (chân 31) có thể được nối với 5V (logic 1) hoặc với GND
(logic 0). Nếu chân này nối lên 5V 8051 và 8052 sẽ thực hiện chương trình chứa
trong ROM nội (chương trình nhỏ hơn 4K/8K). Nếu chân này nối với GND và
chân PSEN cũng ở logic 0 thì chương trình thực hiện được chứa ở ROM ngoài.
Đối với 8031/8032 chân EA phải ở logic 0 vì chúng không có bộ nhớ chương
trình trên chip. Nếu chân EA ở logic 0 đối với 8051/8052 ROM nội bên trong
chip được vô hiệu hóa và chương trình cần thực hiện chứa ở ROM ngoài. Các
phiên bản EPROM của 8051 còn xử dụng chân EA làm chân nhận điện áp cấp
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
17
điện 21V (VPP) cho việc lập trình EPROM nội.
2.8. Chân RESET
Ngõ vào RST (chân 9) là ngõ vào xóa của 8051 dùng để thiết lập lại trạng
thái ban đầu cho hệ thống hay thường gọi là reset hệ thống. Khi ngõ vào này
được treo ở logic 1 ít nhất 2 chu kỳ máy, các thanh ghi bên trong của 8051 được
nạp các gía trị thích hợp cho việc khởi động lại hệ thống.
2.9. Các chân XTAL1 và XTAL2
Như trên hình 2.2 mạch dao động bên trong chip 8051 được ghép với
thạch anh bên ngoài ở hai chân XTAL1 và XTAL2 (chân 18 và 19). Tần số
danh định là 12 MHz cho hầu hết các chip của họ MCS-51, trong hình 2.3 cho
thấy một nguồn xung clock TTL có thể được nối vào các chân XTAL1 và
XTAL2.
Hình 2.3. 8051 với mạch dao động bên ngoài
3. Cấu trúc PORT I/O
Sơ đồ mạch bên trong các chân của port xuất/nhập được vẽ đơn giản như
ở hình 2.4. Việc ghi đến một chân của port sẽ nạp dữ liệu vào bộ chốt của port,
ngõ ra Q của bộ chốt điều khiển một transistor trường và transistor này nối đến
chân của port. Khả năng fan-out của các port 1, 2 và 3 là 4 tải TTL loại LS còn
của port 0 là 8 tải LS.
Lưu ý là điện trở kéo lên sẽ không có ở port 0 trừ khi port này làm nhiệm
vụ bus đa hợp địa chỉ/dữ liệu vì vậy một điện trở kéo lên bên ngoài phải được
cần đến, giá trị điện trở này phụ thuộc vào đặc tính ngõ vào của thành phần
ghép nối với chân của port.
XTAL2
XTAL1
8051
7404
Dao động TTL
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
18
Hình 2.4 Sơ đồ port I/O
Cấu trúc port cho thấy có hai khả năng: Đọc bộ chốt và đọc tại chân của
port. Các lệnh yêu cầu thao tác đọc-sửa-ghi VD: CPL P1.5 sẽ đọc bộ chốt để
tránh sự hiểu lầm mức điện áp do nguyên nhân dòng tải tăng. Các lệnh nhập
một bít của port VD: MOV C,P1.5 sẻ đọc tại chân port. Trong trường hợp này
bộ chốt của port phải chứa 1 nếu không FET sẽ được kích bảo hòa và điều này
kéo ngõ ra xuống mức thấp. Việc reset hệ thống sẽ set tất cả các bộ chốt port.
Do đó các chân port có thể được dùng làm các ngõ nhập mà không cần phải set
các bộ chốt. Tuy nhiên, nếu một bộ chốt bị xóa VD: CLR P1.5 thì chân port
không thể làm nhiệm vụ tiếp theo là ngõ nhập trừ khi trước đó phải set bộ chốt
SETB P1.5 Hình 2.4 không trình bày mạch cho các chức năng khác của các port
0, 2 và 3. Khi các chức năng khác được xử dụng, các mạch kích ngõ ra được
chuyển đến một địa chỉ nội (port 2), địa chỉ/dữ liệu (port 0) hoặc tín hiệu điều
khiển (port 3) tương ứng.
4. Tổ chức bộ nhớ
Hầu hết các bộ vi xử lý đều có không gian nhớ chung cho dữ liệu và
chương trình. Điều này cũng hợp lý vì các chương trình thường được lưu trên
đĩa và được nạp vào RAM để thực hiện, vậy thì cả hai dữ liệu và chương trình
đều lưu trú trên RAM. Các chip vi điều khiển hiếm khi được xử dụng giống như
các vi xử lý trong máy tính thay vào đó chúng được dùng làm thành phần trung
tâm trong các thiết kế hướng điều khiển. Trong đó bộ nhớ có dung lượng giới
hạn không có ổ đĩa và hệ điều hành. Chương trình điều khiển phải thường trú
trong ROM. Do lý do trên 8051 có không gian bộ nhớ riêng cho chương trình
và dữ liệu. Như đã thấy trong bảng 2.1 cả 2 bộ nhớ chương trình và dữ liệu đều
đặt bên trong chip, tuy nhiên có thể mở rộng bộ nhớ chương trình và dữ liệu
bằng cách dùng thêm các chip nhớ bên ngoài với dung lượng tối đa là 64K cho
bộ nhớ chương trình và 64K cho bộ nhớ dữ liệu. Bộ nhớ nội trong chip bao gồm
ROM (chỉ có trong 8051/8052) và RAM. RAM trên chíp bao gồm vùng RAM
đa chức năng, vùng RAM địa chỉ bít, các dãy thanh ghi và các thanh ghi chức
Bus nội
Đọc chốt
Chốt port
Ghi vào
chốt
Vcc Đọc chân
Chân
port
Ngõ ra open drain đối
với port 0 ở chế độ I/O
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
19
năng đặc biệt SFR (special funtion registers) hai đặc tính đáng lưu ý là:
a. Các thanh ghi và các port xuất/nhập được định địa chỉ theo kiểu ánh xạ
bộ nhớ và được truy xuất như một vị trí nhớ trong bộ nhớ.
b. Vùng ngăn xếp thường trú trong RAM trên chíp thay vì trong RAM
ngoài như đối với các bộ vi xử lý.
Hình 2.5 tóm tắt các không gian nhớ của chíp 8031 không có ROM nội,
không trình bày chi tiết về bộ nhớ dữ liệu trên chíp.
Hình 2.6 trình bày chi tiết bộ nhớ dữ liệu trên chip, không gian nhớ nội
này được chia thành: Các dãy thanh ghi (00H..1FH) vùng RAM địa chỉ bít
(20H..2FH), vùng RAM đa năng (30H..7FH) và các thanh ghi chức năng đặc
biệt (80H..FFH).
Hình 2.5 Tổ chức bộ nhớ của 8031
4.1. Vùng RAM đa năng
Vùng nhớ Ram đa dụng gồm có 80 byte có địa chỉ từ 30H đến 7FH
vùng nhớ này không có gì đặc biệt so với hai vùng nhớ trên. Vùng nhớ bank
thanh ghi 32 byte từ 00H đến 1 FH cũng có thể dùng làm vùng nhớ ram đa
dụng mặc dù các ô nhớ này có chức năng như đã trình bầy.
Mọi địa chỉ vùng Ram đa dụng đều có thể truy xuất tự do dùng kiểu
địa chỉ trực tiếp hoặc gián tiếp.
Bộ nhớ ngăn xếp của vi điều khiển dùng bộ nhớ Ram nội nên dung
lượng của bộ nhớ ngăn xếp nhỏ trong khi đó các bộ vi xử lý dùng bộ nhớ
ngoài làm bộ nhớ ngăn xếp nên dung lượng tùy ý mở rộng.
Mặc dù hình 2.6 trình bày vùng RAM đa năng có 80 byte đặt ở địa chỉ từ
30H đến 7FH, bên dưới vùng này từ địa chỉ 00H đến 2FH là vùng nhớ có thể
Bộ nhớ
chương trình
Cho phép
bởi
Cho phép
bởi
và
Bộ nhớ
dữ liêu
FF
00
RAM nội Bộ nhớ ngoài
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
20
được xử dụng tương tự (mặc dù vùng này có công dụng khác). Bất kỳ vị trí nhớ
nào trong vùng RAM đa năng đều có thể được truy xuất tự do bằng cách xử
dụng cách định địa chỉ trực tiếp hoặc gián tiếp. Ví dụ để đọc nội dung tại 5FH
của RAM nội vào thanh ghi A có thể dùng lệnh sau
MOV A, 5FH
Lệnh trên di chuyển một byte dữ liệu bằng cách dùng kiểu định địa chỉ
trực tiếp để xác định vị trí nguồn (nghĩa là địa chỉ 5FH). Đích của dữ liệu được
xác định rõ ràng trong mã lệnh là thanh ghi A.
Vùng RAM đa năng còn có thể được truy xuất bằng cách dùng kiểu định
địa chỉ gián tiếp qua các thanh ghi R0, R1. Ví dụ hai lệnh sau thực hiện cùng
công việc như ở ví dụ trên.
MOV R0,#5FH
MOV A,@R0
Lệnh đầu tiên xử dụng kiểu định địa chỉ tức thời di chuyển giá trị 5FH
vào thanh ghi R0, lệnh tiếp theo xử dụng cách định địa chỉ gián tiếp di chuyển
dữ liệu trỏ bởi R0 vào thanh ghi A
7F
Vùng RAM đa năng
FF
F0 F7 F6 F5 F4 F3 F2 F1 F0 B
E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC
D0 D7 D6 D5 D4 D3 D2 - D0 PSW
30 B8 - - - BC BB BA B9 B8 IP
2F 7F 7E 7D 7C 7B 7A 79 78
2E 77 76 75 74 73 72 71 70 B0 B7 B6 B5 B4 B3 B2 B1 B0 P3
2D 6F 6E 6D 6C 6B 6A 69 68
2C 67 66 65 64 63 62 61 60 A8 AF - - AC AB AA A9 A8 IE
2B 5F 5E 5D 5C 5B 5A 59 58
2A 57 56 55 54 53 52 51 50 A0 A7 A6 A5 A4 A3 A2 A1 A0 P2
29 4F 4E 4D 4C 4B 4A 49 48
28 47 46 45 44 43 42 41 40 99 Địa chỉ byte SBUF
27 3F 3E 3D 3C 3B 3A 39 38 98 9F 9E 9D 9C 9B 9A 99 98 SCON
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
21
26 37 36 35 34 33 32 31 30
25 2F 2E 2D 2C 2B 2A 29 28 90 97 96 95 94 93 92 91 90 P1
24 27 26 25 24 23 22 21 20
23 1F 1E 1D 1C 1B 1A 19 18 8D Địa chỉ byte TH1
22 17 16 15 14 13 12 11 10 8C Địa chỉ byte TH0
21 0F 0E 0D 0C 0B 0A 09 08 8B Địa chỉ byte TL1
20 07 06 05 04 03 02 01 00 8A Địa chỉ byte TL0
1F
Bank 3
89 Địa chỉ byte TMOD
18 88 8F 8E 8D 8C 8B 8A 89 88 TCON
17
Bank 2
87 Địa chỉ byte PCON
10
0F
Bank 1
83 Địa chỉ byte DPH
08 82 Địa chỉ byte DPL
07
Bank 0 (mặc định) R0-R7
81 Địa chỉ byte SP
00 80 87 86 85 84 83 82 81 80 P0
Hình 2.6 Cấu trúc RAM nội của 8051
4.2. Vùng RAM địa chỉ bít
8051 chứa 210 vị trí bít được định địa chỉ trong đó 128 bít chưa trong các
byte ở địa chỉ từ 20H đến 2FH (16 byte x 8 bít = 128 bít) và phần còn lại chứa
trong các thanh ghi chức năng đặc biệt.
Ý tưởng truy xuất các bít riêng rẽ thông qua phần mềm là một đặc trưng
mạnh của hầu hết các bộ vi điều khiển. Các bít có thể được set, xóa, AND,
ORbằng một lệnh. Hầu hết các bộ vi xử lý yêu cầu một chuỗi lệnh đọc-sửa-
ghi để nhận được cùng một kết quả. Ngoài ra, 8051 còn có port xuất/nhập có
thể định địa chỉ từng bít, điều này làm đơn giản việc giao tiếp bằng phần mềm
với các thiết bị xuất/nhập đơn bít.
Như vừa đề cập ở trên, 8051 có 128 vị trí bít được định địa chỉ và có
nhiều mục đích ở các byte có địa chỉ từ 20H đến 2FH. Các địa chỉ này được
truy xuất như là các byte hay các bít tùy vào lệnh cụ thể. Ví dụ để set bít 67H
bằng 1 ta dùng lệnh sau:
SETB 67H
Theo hình 2.6 cho thấy bít ở địa chỉ 67H là bít có ý nghĩa lớn nhất của
byte ở địa chỉ 2CH. Lệnh vừa nêu trên không ảnh hưởng đến các bít khác trong
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
22
byte này. Hầu hết các bộ vi xử lý muốn thực hiện công việc như trên phải dùng
các lệnh có dạng tương tự như sau:
MOV A, 2CH ; đọc cả byte
MOV A, #10000000B ; set bít có ý nghĩa lớn
nhất
MOV 2CH, A ; ghi trở lại cả byte
128 ô nhớ bit cho phép truy xuất từng bit và cũng có thể truy xuất byte phụ
thuộc vào lệnh được dùng là lệnh xử lý bit hay lệnh xử lý byte. Chú ý địa chỉ
của ô nhớ byte và bit trùng nhau.
Người lập trình dùng vùng nhớ để lưu trữ dữ liệu phục vụ cho việc xử
lý dữ liệu byte hoặc bit. Các dữ liệu bit nên lưu vào vùng nhớ này.
Chú ý các ô nhớ nào mà chia ra làm 8 và có các con số bên trong là
các ô nhớ vừa cho truy xuất cả byte và truy xuất cả bit. Những ô nhớ còn lại
không thể truy xuất bit.
4.3. Các dãy thanh ghi
32 vị trí thấp nhất của bộ nhớ nội chứa các dãy thanh ghi. Các lệnh của
8051 hỗ trợ 8 thanh ghi từ R0 đến R7 thuộc dãy 0 (bank 0). Đây là dãy mặc
định sau khi reset hệ thống. Các thanh ghi này ở các địa chỉ từ 00H đến 07H.
Lệnh sau đây đọc nội dung tại địa chỉ 05H vào thanh ghi A :
MOV A, R5
Lệnh này là lệnh 1 byte dùng kiểu định địa chỉ thanh ghi. Dĩ nhiên thao
tác tương tự có thể thực hiện vớI một lệnh 2 byte bằng cách dùng kiểu định địa
chỉ trực tiếp:
MOV A, 05H
Các lệnh sử dụng các thanh ghi từ R0 đến R7 là các lệnh ngắn và thực
hiện nhanh hơn so với các lệnh tương đương xử dụng cách định địa chỉ trực
tiếp. Các giá trị dữ liệu thường được xử dụng nên chứa ở một trong các thanh
ghi này. Dãy thanh ghi đang được xử dụng được gọi là dãy thanh ghi tích cực.
Dãy thanh ghi tích cực có thể được thay đổi bằng cách thay đổi các bít chọn dãy
trong từ trạng thái chương trình PSW. Giả sử rằng dãy thanh ghi 3(bank 3) tích
cực, Lệnh sau đây ghi nộI dung thanh ghi A vào vị trí 18H
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
23
MOV R0, A
Ý tưởng “các dãy thanh ghi” cho phép chuyển đổi ngữ cảnh nhanh và có
hiệu quả ở những nơi mà các phần riêng rẽ của phần mềm sử dụng một tập
thanh ghi riêng, độc lập với các phần khác của phần mềm.
5. Các thanh ghi đặc biệt (SFR)
Các thanh ghi nộI của hầu hết các bộ vi xử lý đều được truy xuất rỏ ràng
bởi một tập lệnh. Việc truy xuất các thanh ghi cũng được xử dụng trên 8051 ví
dụ lệnh INC A tăng nộI dung A lên 1.
Các thanh ghi nội của 8051 được cấu hình thành một phần của RAM trên
chip, do vậy mỗi một thanh ghi cũng có một địa chỉ. Điều này hợp lý vớI 8051
vì chip này có rất nhiều thanh ghi, cũng như các thanh ghi từ R0 đến R7, trong
8051 còn có 21 thanh ghi chức năng đặc biệt (SFR) chiếm phần trên của RAM
nộI từ địa chỉ 80H đến FFH (hình 2.6)
Lưu ý là không phải tất cả địa chỉ từ 80H đến FFH đều được định nghĩa
mà chỉ có 21 địa chỉ được địng nghĩa (26 trên 8032/8052).
Thanh ghi A có thể được truy xuất rõ ràng như được minh họa trong các
ví dụ ở các phần trên. Hầu hết các thanh ghi chức năng đặc biệt được truy xuất
bằng kiểu định địa chỉ trực tiếp. Cần lưu ý trong hình 2.6 là một số thanh ghi
chức năng đặc biệt được định địa chỉ từng bít. Ví dụ lệnh sau
SETB 0E0H
Set bít 0 của thanh ghi A lên 1, các bít khác không thay đổi. Một nhận xét
là tại địa chỉ E0H có thể là địa chỉ byte cho cả thanh ghi A và địa chỉ bít của bít
có ý nghĩa thấp nhất trong A. Vì lệnh SETB thao tác trên các bít và không thao
tác trên các byte nên chỉ có bít được định địa chỉ bị ảnh hưởng. Lưu ý là các bít
được định địa chỉ trong một thanh ghi chức năng đặc biệt có 5 bít cao của địa
chỉ giống nhau cho tất cả các bít của thanh ghi này. Ví dụ port 1 có địa chỉ byte
là 90H (10010000B) và các bít trong port này có các địa chỉ từ 90H đến 97H
hay 10010xxxB. Từ trạng thái chương trình PSW (program status word) sẽ
được thảo luận chi tiết trong phần sau. Các thanh ghi chức năng đặc biệt khác
cũng được giới thiệu vắn tắt.
5.1. Từ trạng thái chương trình PSW
Bảng 2.3: Thanh ghi PSW
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
24
Bít
PSW.7
PSW.6
PSW.5
PSW.4
PSW.3
PSW.2
PSW.1
PSW.0
Ký hiệu
CY
AC
F0
RS1
RS0
OV
-
P
Mô tả
D7H
D6H
D5H
D4H
D3H
D2H
D1H
D0H
Ghi chú
Cờ nhớ
Cờ nhớ phụ
Cờ 0
Chọn dãy thanh ghi (bít 1)
Chọn dãy thanh ghi (bít 0)
00 = bank 0
01 = bank 1
10 = bank2
11 = bank 3
Cờ tràn
Dự trử
Cờ chẳn lẻ
PSW có địa chỉ là D0H chứa các bít trạng thái có chức năng được tóm tắt
trong bảng 2.3
Cờ nhớ
Cờ nhớ CY (carrier flag) có hai công dụng: Công dụng truyền thống
trong các phép toán số học là là được set bằng 1 nếu có số nhớ từ phép cộng bít
7 hoặc có số mượn mang đến bít 7. Ví dụ nếu thanh ghi A có nội dung là FFH
ADD A,#1
Sẽ làm cho A có nội dung là 00H và cờ CY trong PSW được set bằng 1.
Cờ nhớ CY còn là một bộ tích lũy logic được dùng như một thanh ghi 1 bít đối
với các lệnh logic thao tác trên các bít. VD: Lệnh sau đây sẽ AND bít 25H với
cờ CY và đặt kết quả vào cờ CY
ANL C, 25H ; AND bít ở địa chỉ 25H với cờ nhớ
Cờ nhớ phụ
Khi cộng các giá trị BCD, cờ nhớ phụ AC (auxiliary carry flag) được set
bằng 1 nếu có 1 số nhớ được tạo ra từ bít 3 chuyển sang bít 4 hoặc nếu kết quả
trong decade thấp nằm trong khoảng từ 0AH đến 0FH. Nếu các giá trị được
cộng là giá trị BCD, lệnh cộng phải được tiếp theo bởi lệnh DA A (hiệu chỉnh
thập phân thanh ghi A) để đưa các kết quả lớn hơn 9 về giá trị đúng.
Cờ 0
Đây là cờ có nhiều mục đích dành cho các ứng dụng của người lập trình
Các bít chọn dãy thanh ghi
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
25
Các bít chọn dãy thanh ghi RS0, RS1 dùng để xác định dãy thanh ghi tích
cực. Các bít này được xóa sau khi có thao tác reset hệ thống và đổi mức logic
bởi phần mềm khi cần. VD: Ba lệnh sau cho phép dãy thanh ghi 3 (bank 3) tích
cực, sau đó di chuyển nội dung của R7 (địa chỉ byte 1FH) vào thanh ghi A.
SETB RS1
SETB RS0
MOV A, R7
Khi đoạn chương trình trên được dịch, các địa chỉ bít sẽ thay thế cho các
ký hiệu RS0 và RS1, vậy thì lệnh SETB RS1 tương đương với lệnh SETB
0D4H.
Cờ tràn
Cờ tràn OV (over flag) được set bằng 1 sau phép toán cộng hoặc trừ nếu
có xuất hiện một tràn số học. Khi các số có dấu được cộng hoặc được trừ, phần
mềm có thể kiểm tra bít tràn OV để xác định xem kết quả có nằm trong phạm vi
hợp lệ hay không.
Với phép cộng các số không dấu, cờ tràn OV được bỏ qua. Kết quả lớn
hơn +128 hoặc nhỏ hơn -127 sẽ set cờ OV bằng 1, ví dụ phép cộng sau đây gây
ra một tràn và set cờ OV trong PSW
Số hex 0F Số thập phân 15
+7F +127
8E +142
8EH biểu diển số âm -116, như vậy không đúng với kết quả mong muốn
là 142 nên cờ OV được set bằng 1.
Cờ chẳn lẻ
Bít chẵn lẻ P tự động được set bằng 1 hay xóa bằng 0 ở mỗi chu kỳ máy
để thiết lập kiểm tra chẵn cho thanh ghi A. Số các bít 1 trong A cộng với bít P
luôn luôn là số chẵn. Ví dụ nếu thanh ghi A có nội dung là 10101101B, bít P sẽ
là 1 để có số bít 1 là 6. Bít chẵn lẻ được xử dụng nhiều để kết hợp với các
chương trình xuất/nhập nối tiếp trước khi truyền dữ liệu hoặc để kiểm tra chẵn
lẻ sau khi nhận dữ liệu.
5.2. Thanh ghi B
Thanh ghi B ở địa chỉ F0H được dùng chung với thanh ghi A trong các
phép toán nhân, chia. Lệnh MUL AB nhân hai số 8 bít không dấu chứa trong A
và B và chứa kết quả 16 bít vào cặp thanh ghi B:A (thanh ghi A cất byte thấp và
thanh ghi B cất byte cao)
Lệnh chia DIV AB chia A cho B, thương số cất trong A và dư số cất
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
26
trong B. Thanh ghi B còn được xử lý như một thanh ghi nháp, các bít được định
địa chỉ của thanh ghi B có địa chỉ từ F0H đến F7H.
5.3. Con trỏ stack
Con trỏ stack SP (stack pointer) là một thanh ghi 8 bít ở địa chỉ 81H. SP
chứa địa chỉ của dữ liệu hiện đang ở đỉnh của stack. Các lệnh liên quan đến
stack bao gồm lệnh cất dữ liệu vào stack và lệnh lấy dữ liệu ra khỏi stack. Việc
cất vào stack làm tăng SP trước khi ghi dữ liệu và việc lấy dữ liệu ra khỏi stack
sẻ giảm SP. Vùng stack của 8051 được giữ trong RAM nội và được giới hạn
đến các địa chỉ truy xuất được bởi kiểu định địa chỉ gián tiếp. Vùng RAM
nội có 128 byte trên 8031/8051 hoặc 256 byte trên 8032/8052, lệnh sau
khởi động SP để bắt đầu stack tại địa chỉ 60H
MOV SP,#5FH
Vùng stack được giới hạn là 32 byte trên 8031/8051 vì địa chỉ vì địa chỉ
cao nhất của RAM trên chíp là 7FH. Giá trị 5FH được dùng ở đây vì SP tăng
lên 60H trước khi thực hiện cất vào stack.
Nếu không khởi động SP, nội dung mặc định của thanh ghi này là 07H
nhằm duy trì sự tương thích với 8048, bộ vi điều khiển đời trước của 8051. Kết
quả là thao tác cất vào stack đầu tiên sẽ lưu dữ liệu vào vị trí nhớ có địa chỉ
08H. Như vậy, nếu phần mềm ứng dụng không khởi động SP, dãy thanh ghi 1
và có thể 2 và 3 không còn hợp lệ vì vùng này được sử dụng làm stack. Các
lệnh PUSH và POP sẽ cất dữ liệu vào stack và lấy dữ liệu từ stack, các lệnh gọi
chương trình con (ACALL, LCALL) và lệnh trở về RET, RETI cũng cất và
phục hồi nội dung của bộ đếm chương trình PC (program counter).
5.4. Con trỏ dữ liệu DPTR
Con trỏ dữ liệu DPTR (data pointer) được dùng để truy xuất bộ nhớ
chương trình ngoài hoặc bộ nhớ dữ liệu ngoài. DPTR là một thanh ghi 16 bít có
địa chỉ là 82H (DPL byte thấp) và 83H (DPH byte cao), 3 lệnh sau đây ghi 55H
vào RAM ngoài ở địa chỉ 1000H
MOV A,#55H
MOV DPTR,#1000H
MOV @DPTR, A
Lệnh đầu tiên xử dụng kiểu định địa chỉ tức thời để nạp hằng dữ liệu 55H
vào thanh ghi A, lệnh thứ hai cũng xử dụng kiểu định địa chỉ tức thời, lần này
nạp hằng địa chỉ 16 bít 1000H cho con trỏ dữ liệu DPTR. Lệnh thứ ba xử dụng
kiểu định địa chỉ gián tiếp di chuyển giá trị 55H chứa trong A đến RAM ngoài
tại địa chỉ chứa trong DPTR (1000H).
5.6. Các thanh ghi port
Các port xuất/nhập của 8051 bao gồm port 0 tại địa chỉ 80H, port 1 tại
90H, port 2 tại A0H và port 3 tại B0H. Các port 0, 2 và 3 không được dùng để
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
27
xuất nhập nếu dùng thêm bộ nhớ ngoài hoặc nếu có một số đặc tính đặc biệt của
8051 được xử dụng (như là ngắt, cổng nối tiếp...)Ngược lại, P1.2 đến P1.7 luôn
luôn là các đường xuất/nhập đa mục đích hợp lệ.
Tất cả các port đều được định địa chỉ từng bít nhằm cung cấp các khả
năng giao tiếp mạnh, ví dụ một động cơ nối qua một cuộn dây và một mạch
kích dùng transistor nối đến bít 7 của port 1, động cơ có thể dừng hay chạy chỉ
nhờ vào một lệnh đơn của 8051
SETB P1.7 ;Làm động cơ chạy
CLR P1.7 ;Sẽ làm dừng động cơ
Các lệnh trên xử dụng toán tử . (dot) để định địa chỉ 1 bít trong 1 byte,
cho phép định địa chỉ từng bít.
Trình dịch hợp ngữ thực hiện việc biến đổi dạng ký hiệu thành địa chỉ
thực tế, nghĩa là hai lệnh sau tương đương nhau
CLR P1.7
CLR 97H
Việc xử dụng các ký hiệu được định nghĩa trước của trình dịch hợp ngữ
sẽ được thảo luận chi tiết ở các bài sau
Ví dụ sau đây khảo sát việc giao tiếp với một thiết bị có bít trạng thái gọi
là BUSY, bít này được set bằng 1 khi thiết bị đang bận và được xóa khi thiết bị
đã sẵn sàng. Nếu BUSY được nối với bít 5 của port 1, vòng lặp sau đây được
dùng để chờ cho đến khi thiết bị sẵn sàng
WAIT: JB P1.5, WAIT
Lệnh trên có nghĩa là nếu bít P1.5 được set thì nhảy đến nhản WAIT cũng có
nghĩa là nhảy về và kiểm tra lần nữa.
5.7. Các thanh ghi định thời
8051 có hai bộ đếm/định thời (timer/cunter) 16 bít để định các khoảng
thời gian hoặc để đếm các sự kiện. Bộ định thời không có địa chỉ 8AH (TL0,
byte thấp) và 8CH (TH0, byte cao), bộ định thời 1 có địa chỉ 8BH (TL1, byte
thấp) và 8DH (TH1, byte cao).
Hoạt động của bộ định thời được được thiết lập bởi thanh ghi chế độ định
thời TMOD (timer mode register) ở địa chỉ 89H và thanh ghi điều khiển định
thời TCON (timer control register) ở địa chỉ 88H. Chỉ có TCON được định địa
chỉ từng bít.
5.8. Các thanh ghi của port nối tiếp
Bên trong 8051 có một port nối tiếp để truyền thông với các thiết bị nối tiếp
như các thiết bị đầu cuối hoặc modem, hoặc để giao tiếp với các IC khác có
mạch giao tiếp nối tiếp (như các thanh ghi dịch). Một thanh ghi được gọi là bộ
đệm dữ liệu nối tiếp SBUF (serial data buffer) ở địa chỉ 99H lưu dữ liệu truyền
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
28
đi và dữ liệu nhận về. Việc ghi lên SBUF sẽ nạp dữ liệu để truyền và việc đọc
SBUF sẽ lấy dữ liệu đã nhận được.
Các chế độ hoạt động khác nhau được lập trình thông qua thanh ghi điều
khiển port nối tiếp SCON (serial port control register) ở địa chỉ 98H, thanh ghi
này được định địa chỉ từng bít.
5.9. Các thanh ghi ngắt
8051 có một cấu trúc ngắt với hai mức ưu tiên và năm nguyên nhân ngắt,
các ngắt bị vô hiệu hóa sau khi reset hệ thống và sau đó được cho phép bằng
cách ghi vào thanh ghi cho phép ngắt IE (interupt enable register) ở địa chỉ
A8H, mức ưu tiên ngắt được thiết lập qua thanh ghi ưu tiên ngắt IP (interupt
priority register) ở địa chỉ B8H, cả hai thanh ghi này đều được định địa chỉ từng
bít.
5.10. Thanh ghi điều khiển nguồn
Thanh ghi điều khiển nguồn PCON (power control register) có địa chỉ
87H chứa các bít điều khiển được tóm tắt trong bảng 2.4
Bít SMOD tăng gấp đôi tốc độ baud của port nối tiếp khi port này hoạt
động ở các chế độ 1, 2 hoặc 3 các bít 4, 5 và 6 của PCON không được định
nghĩa, các bít 2 và 3 là các bít cờ đa mục đích dành cho các ứng dụng của người
sử dụng.
Các bít điều khiển nguồn, nguồn giảm PD và nghỉ IDL, hợp lệ trong tất
cả các chip họ MCS-51 nhưng chỉ được hiện thực trong các phiên bản CMOS
của MCS-51, PCON không được định địa chỉ bít.
Chế độ nguồn giảm
Lệnh thiết lập bít PD bằng 1 sẽ là lệnh sau cùng được thực hiện trước khi
đi vào chế độ nguồn giảm. Ở chế độ nguồn giảm:
1. Mạch dao động trên chip ngừng hoạt động
2. Mọi chức năng ngừng hoạt động
3. Nội dung của RAM trên chíp được duy trì
4. Các chân port duy trì mức logic của chúng
5. ALE và PSEN được giữ ở mức thấp chỉ ra khỏi chế độ này bằng cách
reset hệ thống.
Trong suốt thời gian ở chế độ nguồn giảm, VCC có điện áp là 2V, cần phải
giữ cho VCC không thấp hơn sau khi đạt được chế độ nguồn giảm và cần phục
hồi VCC = 5 V tối thiểu 10 chu kỳ dao động trước khi chân reset đạt mức thấp
lần nữa.
Bảng 2.4 Thanh ghi PCON
Bít Ký hiệu Mô tả
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
29
7
6
5
4
3
2
1
0
SMOD
-
-
-
Bít cờ đa mục đích 1
Bít cờ đa mục đich 2
PD IDL
Bít tăng đôi tốc độ baud ở chế độ 1, 2 và 3 của
port nối tiếp
Nguồn giảm
Chế độ nghỉ, thoát ra bằng 1 ngắt hoặc reset
Chế độ nghỉ
Lệnh thiết lập bít IDL bằng 1 sẽ là lệnh sau cùng được thực hiện
trước khi đi vào chế độ nghỉ. Ở chế độ nghỉ tín hiệu clock nội được khóa
không cho đến CPU nhưng không khóa đối với các chức năng ngắt, định
thời và port nối tiếp. Trạng thái của CPU được duy trì và nội dung của tất
cả các thanh ghi cũng được giữ không đổi.
Các chân port cũng được duy trì các mức logic của chúng. ALE và
PSEN được giữ ở mức cao.
Chế độ nghỉ kết thúc bằng cách cho phép ngắt hoặc bằng cách reset hệ
thống, cả hai cách vừa nêu trên đều xóa bít IDL.
6. Bộ nhớ ngoài
Các bộ vi điều khiển cần có khả năng mở rộng các tài nguyên trên
chip (bộ nhớ, I/O...) để tránh hiện tượng cổ chai trong thiết kế. Cấu trúc
của MCS-51 cho phép khả năng mở rộng không gian bộ nhớ chương trình
đến 64 K và không gian bộ nhớ dữ liệu đến 64 K ROM và RAM ngoài
được thêm vào khi cần.
Các IC giao tiếp ngoại vi cũng có thể được thêm vào để mở rộng
khả năng xuất/nhập. Chúng trở thành một phần của không gian bộ nhớ dữ
liệu ngoài bằng cách xử dụng cách định địa chỉ kiểu I/O ánh xạ bộ nhớ.
Khi bộ nhớ ngoài được xử dụng, port 0 không làm nhiệm vụ của port
xuất/nhập, port này trở thành bus địa chỉ (A0..A7) và bus dữ liệu (D0..D7)
đa hợp. Ngõ ra ALE chốt một byte thấp của địa chỉ ở thời điểm bắt đầu
một chu kỳ bộ nhớ ngoài. Port 2 thường (nhưng không phải luôn luôn)
được dùng làm byte cao của bus địa chỉ.
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
30
Sắp xếp không đa hợp sử dụng 16 đường địa chỉ và 8 đường dữ liệu tổng
cộng 24 đường. Sắp xếp đa hợp kết hợp 8 đường của bus dữ liệu và byte thấp
của bus địa chỉ thì chỉ cần 16 đường. Việc tiết kiệm các chân cho phép đóng gói
họ MCS-51 trong một vỏ 40 chân.
Sắp xếp đa hợp hoạt động như sau: Trong ½ chu kỳ đầu của chu kỳ bộ
nhớ, byte thấp của địa chỉ được cung cấp bởi port 0 và được chốt nhờ tín hiệu
ALE. Mạch chốt 74373 giữ cho byte thấp của địa chỉ ổn định trong cả chu kỳ
bộ nhớ. Trong ½ sau của chu kỳ bộ nhớ, port 0 được xử dụng làm bus dữ liệu
và dữ liệu sẽ được đọc hay ghi.
6.1. Truy xuất bộ nhớ chương trình ngoài
Bộ nhớ chương trình ngoài là bộ nhớ chỉ đọc, được cho phép bởi tín hiệu
PSEN .
Chu kỳ bộ nhớ
Địa chỉ
Dữ liệu
AO – A15
DO – D7
A8 – A15 Địa chỉ
Dữ liệu
Chu kỳ bộ nhớ
a) Không đa hợp (24 chân)
a) Có đa hợp (16 chân)
Hình 2.7 Bú đa hợp địa chỉ/
dữ liệu
ADO – AD7
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
31
Hình 2.8 Truy xuất ROM ngoài
Khi có một ROM ngoài được sử dụng, cả hai port 0 và port 2 đều không
còn là các port xuất/nhập. Kết nối phần cứng với bộ ngoài được trình bày ở hình
2.8
Một chu kỳ máy của 8051 có 12 chu kỳ dao động. Nếu bộ dao động trên
chíp có tần số 12 MHz thì một chu kỳ máy dài 1 μS. Trong 1 chu kỳ máy điển
hình ALE có hai xung và 2 byte của lệnh được đọc từ bộ nhớ chương trình (nếu
lệnh chỉ có 1 byte, byte thứ hai bị loại bỏ). Giản đồ thời gian của chu kỳ máy
này được gọi là chu kỳ tìm-nạp lệnh được trình bày ở hình 2.9.
Hình 2.9 Chu kỳ tìm nạp lệnh ROM ngoài
8051
Port 0
ALE
Port 2
ROM
DO-D7
AO-A7
A8-A15
Một chu kỳ máy
P1
S1 S2 S3 S4 S5 S6 S1
P2 P1 P2 P1 P2 P1 P2 P1 P2 P1 P2 P1 P2
OSC
ALE
Port
2
PCH PCH
PCL opcode PCL Byte
2
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
32
6.2. Truy xuất bộ nhớ dữ liệu ngoài
Bộ nhớ dữ liệu ngoài là bộ nhớ đọc-ghi được cho phép bởi các tín hiệu
RD và WR ở các chân P3.7 và P3.6. Lệnh dùng để truy xuất bộ nhớ dữ liệu ngoài
là MOVX, sử dụng hoặc con trỏ dữ liệu 16 bít DPTR hoặc R0, R1 làm thanh ghi
chứa địa chỉ.
RAM có thể giao tiếp với 8051 theo cùng cách như ROM ngoại trừ đường
RD nối với đường cho phép xuất OE của RAM và đường WR nối với đường W
của RAM. Các kết nối với bus dữ liệu và bus địa chỉ giống như ROM bằng cách
sử dụng port 0 và port 2 như ở phần trên dung lượng của RAM lên đến 64K.
Giản đồ thời gian của thao tác đọc dữ liệu ở bộ nhớ dữ liệu ngoài được
trình bày ở hình 2.10 cho lệnh MOVX A,@DPTR. Lưu ý là cả hai xung ALE
và PSEN được bỏ qua ở nơi mà xung RD cho phép đọc RAM, nếu lệnh MOVX
và RAM ngoài không bao giờ được dùng, các xung ALE luôn có tần số bằng 1/6
tần số của mạch dao động.
Giản đồ thời gian của chu kỳ ghi (lệnh MOVX @DPTR, A) cũng tương
tự ngoại trừ các xung WR ở mức thấp và dữ liệu được xuất ra ở port 0 ( RD vẫn
ở mức cao).
Hình 2.10 Giản đồ thời gian lệnh MOVX
S1 S2 S3 S4 S5 S6 S1 S2 S3 S4 S5 S6
Một chu kỳ máy Một chu kỳ máy
ALE
Port
2
Port
0
PCH DPH
PCL opcode DPL
Etemal
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
33
Hình 2.11 Giao tiếp với 1 K RAM
Port 2 giảm bớt được chức năng làm nhiệm vụ cung cấp byte cao của địa chỉ
trong các hệ thống tối thiểu hóa thành phần, hệ thống không dùng bộ nhớ
chương trình ngoài và chỉ có một dung lượng nhỏ bộ nhớ dữ liệu ngoài. Các địa
chỉ 8 bít có thể truy xuất bộ nhớ dữ liệu ngoài với cấu hình bộ nhớ nhỏ hướng
trang. Nếu có nhiều hơn một trang 256 byte RAM, một vài bít từ port 2 hoặc
một port khác có thể chọn một trang. VD: Với một RAM 1 KB ( 4 trang 256)
có thể được kết nối với 8051 như ở hình 2.11.
Các bít 0 và 1 của port 2 phải được khởi động để chọn một trang, sau đó
dùng lệnh MOVX để đọc hoặc ghi trên trang này. Giả sử P2.0 = P2.1 = 0, các
lệnh sau có thể dùng để đọc nội dung của RAM ngoài tại địa chỉ 0050H vào
thanh ghi A
MOV R0,#50H
MOVX A, @R0
Để đọc ở địa chỉ cuối cùng của RAM là 03FFH thì phải chọn trang 3,
nghĩa là phải set các bít P2.0 và P2.1 băng 1 như chuỗi lênh sau
SETB P2.0
SETB P2.1
MOV R0,#0FFH
MOVX A, @R0
Một đặc trưng của thiết kế này là các bít từ 2 đến 7 của port 2 không còn
cần làm bít địa chỉ nữa, các bít còn lại này có thể sử dụng cho mục đích
xuất/nhập.
8051
Port 0
ALE
P2.0
RAM(1 K)
DO-D7
AO-A7 D Q
C
P2.1
A8
A9
373
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
34
6.3. Giãi mã địa chỉ
Hình 2.12 Giãi mã địa chỉ
Nếu có nhiều ROM hoặc RAM giao tiếp với 8051 thì cần phải giải mã
địa chỉ. Việc giải mã này cũng cần cho hầu hết các bộ vi xử lý.
Ví dụ: nếu các ROM và RAM 8 KB được sử dụng, địa chỉ phải được giải mã để
chọn các IC nhớ này trên các giới hạn 8 K (0000H..1FFFH, 2000H..3FFFH....)
Một IC giải mã điển hình là 74138 được dùng với các ngõ ra được nối
với các ngõ vào chọn chíp CS của các IC nhớ như mô tả ở hình 2.12 cho một bộ
nhớ có nhiều EPROM 2764 và RAM 6264. Cần lưu ý là do các đường cho phép
riêng rẽ ( PSEN cho bộ nhớ chương trình, RD và WR cho bộ nhớ dữ liệu) 8051
có thể quản lý không gian nhớ 64 K cho bộ nhớ ROM và 64 K cho bộ nhớ
RAM.
6.4. Các không gian nhớ chương trình và dữ liệu gối nhau
Vì bộ nhớ chương trình là bộ nhớ chỉ đọc, một tình huống khó xử được
phát sinh trong quá trình phát triển phần mềm cho 8051. Làm thế nào phần
mềm được viết cho một hệ thống đích để gỡ rối nếu phần mềm chỉ có thể được
thực hiện từ không gian bộ nhớ chương trình chỉ đọc.
Giải pháp tổng quát là cho các không gian bộ nhớ chương trình và dữ liệu
D0 – D7
6264
A(13)
B(13)
C(13)
74138
D0 – D7
2764
A0 – A12
A0 – A12
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
35
ngoài gối lên nhau. Vì PSEN được dùng để đọc bộ nhớ chương trình và RD
được dùng để đọc bộ nhớ dữ liệu, một RAM có thể chiếm không gian nhớ
chương trình và dữ liệu bằng cách nối chân OE tới ngõ ra cổng AND có các ngõ
vào là PSEN và RD .Mạch trình bày ở hình 2.13 cho phép IC RAM được ghi
như là bộ nhớ dữ liệu và được đọc như là bộ nhớ chương trình hoặc dữ liệu. Vậy
thì một chương trình có thể được nạp vào RAM bằng cách ghi vào RAM như là
bộ nhớ dữ liệu và được thực hiện bằng cách truy xuất như là bộ đếm chương
trình.
7. Các cải tiến của 8032/8052
Các vi mạch 8032/8052 và các phiên bản CMOS có hai cải tiến so với
8031/8051. Một là có thêm 128 byte RAM trên chip từ địa chỉ 80H đến FFH,
điều này không xung đột với các thanh ghi chức năng đặc biệt vì 128 byte
RAM thêm vào chỉ có thể truy xuất bằng cách dùng kiểu định địa chỉ gián tiếp,
xem lệnh sau
MOV A, 0F0H
Sẽ di chuyển nội dung của thanh ghi B vào thanh ghi A đối với họ MCS-
51 còn chuỗi lệnh sau
MOV R0,#0F0H
MOV A, @R0
Ghi vào thanh ghi A nội dung tại địa chỉ 0F0H đối với 8032/8052, tổ
chức bộ nhớ nội của 8032/8052 được trình bày ở hình 2.14
R A M
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
36
Hình 2.14 RAM nội của 8032/8052
BẢNG 2.5 Các thanh ghi của timer 2
Thanh ghi Địa chỉ Địa chỉ bít Mô tả
T2CON
RCAP2L
RCAP2H
TL2
TH2
C8H
CAH
CBH
CCH
CDH
Có
Không
Không
Không
không
Điều khiển
Nhận byte thấp
Nhận byte cao
Byte thấp timer 2
Byte cao timer 2
Cải tiến thứ hai là có thêm bộ định thời 16 bít, bộ timer 2 này được lập
trình nhờ vào 5 thanh ghi chức năng đặc biệt trong bảng 2.5.
8. Hoạt động RESET
8051 được reset bằng cách giữ chân RST ở mức cao tối thiểu 2 chu kỳ
máy và sau đó chuyển về mức thấp. RST có thể được tác động bằng tay hoặc
được tác động khi cấp nguồn bằng cách dùng một mạch RC như trình bày ở
hình 2.15. Trạng thái của tất cả các thanh ghi sau khi reset hệ thống được tóm
tắt ở bảng 2.6
Quan trọng nhất trong các thanh ghi này có lẽ là thanh ghi PC (bộ đếm
chương trình) được nạp 0000H. Khi RST trở lại mức thấp, việc thực hiện
chương trình luôn luôn bắt đầu ở vị trí đầu tiên trong bộ nhớ chương trình đó
chính là địa chỉ 0000H, nội dung của RAM trên chíp không bị ảnh hưởng bởi
reset.
FFH
Định địa chỉ gián tiếp
Định địa chỉ trực tiếp
80H
7FH
Định địa chỉ gián tiếp
và trực tiếp
Thanh ghi chức năng
đặc biệt
00H
128 byte
cao
128 byte
Thấp
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
37
BẢNG 2.6 Giá trị của các thanh ghi sau khi reset hệ thống
Thanh ghi Nội dung
Bộ đếm chương
trinh Thanh ghi A
Thanh ghi B
PSW SP
DPTR
Port
0..3
IP
IE
Thanh ghi định
thời SCON
SBUF
PCON (HMOS)
PCON (CMOS)
0000H
00H
00H
00H
07H 0000H FFH
xxx00000B (8031/8051)
xx000000B (8032/8052)
0xx00000B (8031/8051)
0x000000B
(8032/8052) 00H
00H
00H
0xxxxxxxB
0xxx0000B
Hình 2.15 Sơ đồ mạch RESET
9. Bài tập
1. Viết lệnh set bit có giá trị thấp nhất tại địa chỉ byte 25H ?
2. Viết chuỗi lệnh thực hiện phép OR nội dung tai địa chỉ bít 00H với nội
dung tại 01H, kết quả đưa vào địa chỉ bít 02H.
3. Một chương trình con sử dụng các thanh ghi R0 – R7. Chương trình sẽ
chuyển sang dãy thanh ghi 3 khi bắt đầu và phục hồi trở lại dãy thanh ghi ban
đầu trước khi thoát. Hãy mô tả chương trình con này
4. Vi điều khiển 80C31BH-1 hoạt động với thạch anh 16 MHz. Tần số xung
ALE là bao nhiêu nếu không dùng lệnh MOVX ?
5. Địa chỉ của bít giá trị cao nhất tại byte RAM nội 25H trong 8051 là bao
nhiêu ?
+5V +5V
+ 100
Ω
8,2KΩ
RST
+5V
+
10F 10F
RST
b) Khi cấp
nguồn
a) Bằng tay
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
38
6. Viết lệnh set bít cao nhất trong thanh ghi A
7. Cho biết trạng thái của bít P trong thanh ghi PSW sau khi thực hiện
lênh sau MOV A,#55H
8. Viết chuỗi lệnh copy nội dung thanh ghi R7 đên địa chỉ 100H trong RAM
ngoài?
9. Giả sử lệnh đầu tiên sau khi reset hệ thống là lệnh gọi chương trình con.
Hãy cho biết nội dung của PC được lưu vào đâu trước khi chương trình con
này được thực hiện ?
10. Trình bày điểm khác nhau giữa chế độ nghỉ với chế độ giảm nguồn ?
11. Viết lệnh thực hiện chế độ giảm nguồn.
12. Trình bày sơ đồ kết nối thêm 2 RAM ngoài mỗi RAM có dung lượng là 32
KB với 8051
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
39
Bài 3: TẬP LỆNH 8051
1. Mở đầu
Các cách định địa chỉ là phần cần thiết cho toàn bộ tập lệnh của mỗi một
bộ vi xử lý hay vi điều khiển. Các kiểu định địa chỉ cho phép xác định rõ nguồn
và đích của dữ liệu theo nhiều cách khác nhau mà vi xử lý hay vi điều khiển sử
dụng trong quá trình thực thi lệnh. Có 8 kiểu định địa chỉ đối với họ MCS-51:
- Thanh ghi (register)
- Trực tiếp (direct)
- Gián tiếp (indirect)
- Tức thời (immediate)
- Tương đối (relative)
- Tuyệt đối (absolute)
- Dài (long)
- Chỉ số (index)
2. Các cách định địa chỉ
2.1. Định địa chỉ bằng thanh ghi
Chế độ đánh địa chỉ bằng thanh ghi liên quan đến việc sử dụng các thanh
ghi để dữ liệu cần được thao tác các ví dụ về đánh địa chỉ theo thanh ghi như
sau:
MOV A, RO : Sao nội dung thanh ghi RO vào thanh ghi A
MOV R2, A : Sao nội dung thanh ghi A vào thanh ghi R2
ADD A; R5 : Cộng nội dung thanh ghi R5 vào thanh ghi A
ADD A, R7 : Cộng nội dung thanh ghi R7 vào thanh ghi A
MOV R6, A : Lưu nội dung thanh ghi A vào thanh ghi R6
Cũng nên lưu ý rằng các thanh ghi nguồn và đích phải phù hợp về kích
thước. Hay nói cách khác, nếu viết “ MOV DPTR, A” sẽ cho một lỗi vì nguồn là
thanh ghi 8 bit và đích lại là thanh ghi 16 bit. Xét đoạn mã sau:
MOV DPTR, #25F5H
MOV R7, DPL
MOV R6, DPH
Để ý rằng ta có thể chuyển dữ liệu giữa thanh ghi tích luỹ A và thanh ghi
Rn (n từ 0 đến 7) nhưng việc chuyển dữ liệu giữa các thanh ghi Rn thì không
được phép. Ví dụ, lệnh “MOV R4, R7” là không hợp lệ.
Trong hai chế độ đánh địa chỉ đầu tiên, các toán hạng có thể hoặc ở bên
trong một trong các thanh ghi hoặc được gắn liền với lệnh. Trong hầu hết các
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
40
chương trình dữ liệu cần được xử lý thường ở trong một số ngăn của bộ
nhớ RAM hoặc trong không gian mà của ROM. Có rất nhiều cách để truy cập
dữ liệu này mà phần tiếp theo sẽ xét đến.
2.2. Định địa chỉ Trực tiếp
Như đã nói ở chương 2 trong 8051 có 128 byte bộ nhớ RAM. Bộ nhớ
RAM được gán các địa chỉ từ 00 đến FFH và được phân chia như sau
1. Các ngăn nhớ từ 00 đến 1FH được gán cho các băng thanh ghi và ngăn
xếp.
2. Các ngăn nhớ từ 20H đến 2FH được dành cho không gian đánh địa chỉ
theo bit để lưu các dữ liệu 1 bit.
3. Các ngăn nhớ từ 30H đến 7FH là không gian để lưu dữ liệu có kích
thước 1byte.
Mặc dù toàn bộ byte của bộ nhớ RAM có thể được truy cập bằng chế độ
đánh địa chỉ trực tiếp, nhưng chế độ này thường được sử dụng nhất để truy cập
các ngăn nhớ RAM từ 30H đến 7FH. Đây là do một thực tế là các ngăn nhớ
dành cho băng ghi được truy cập bằng thanh ghi theo các tên gọi của chúng là
R0 - R7 còn các ngăn nhớ khác của RAM thì không có tên như vậy. Trong chế
độ đánh địa chỉ trực tiếp thì dữ liệu ở trong một ngăn nhớ RAM mà địa chỉ của
nó được biết và địa chỉ này được cho như là một phần của lệnh. Khác với chế
độ đánh địa chỉ tức thì mà toán hạng tự nó được cấp với lệnh. Dấu (# 0 là sự
phân biệt giữa hai chế độ đánh địa chỉ. Xét các ví dụ dưới đây và lưu ý rằng các
lệnh không có dấu (#):
MOV R0, 40H ; Lưu nội dung của ngăn nhớ 40H của RAM vào R0
MOV 56H, A ; Lưu nội dung thanh ghi A vào ngăn nhớ 56H của
RAM
MOV R4, 7FH ; Chuyển nội dung ngăn nhớ 7FH của RAM vào R4
Như đã nói ở trước thì các ngăn nhớ trừ 0 đến 7 của RAM được cấp cho
bằng 0 của các thanh ghi R0 - R7. Các thanh ghi này có thể được truy cập theo 2
cách như sau:
MOV A, 4 ; Hai lệnh này giống nhau đều sao nội dung thanh
ghi R4 vào A
MOV A, R4
MOV A, 7 ; Hai lệnh này đều như nhau là sao nội dung R7
vào thanh ghi A
MOV A,R7
Để nhấn mạnh sự quan trọng của dấu (#) trong các lệnh của 8051. Xét các
mã cho sau đây:
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
41
MOV R2, #05 ; Gán R2=05
MOV A, 2 ; Sao nội dung thanh ghi R2 vào A
MOV B, 2 ; Sao nội dung thanh ghi R2 vào B
MOC 7,2 ; Sao nội dung thanh ghi R7 vì lệnh “MOV R7, R2” là
không hợp lệ.
Mặc dù sử dụng các tên R0 - R7 dễ hơn các địa chỉ bộ nhớ của chúng
nhưng các ngăn nhớ 30H đến 7FH của RAM không thể được truy cập theo bất
kỳ cách nào khác là theo địa chỉ của chúng vì chúng không có tên.
2.3. Định địa chỉ gián tiếp
Trong chế độ này, một thanh ghi được sử dụng như một con trỏ đến dữ
liệu. Nếu dữ liệu ở bên trong CPU thì chỉ các thanh ghi R0 và R1 được sử dụng
cho mục đích này. Hay nói cách khác các thanh ghi R2 - R7 không có thể dùng
được để giữ địa chỉ của toán hạng nằm trong RAM khi sử dụng chế độ đánh địa
chỉ này khi Ro và R1 được dùng như các con trỏ, nghĩa là khi chúng giữ các
địa chỉ của các ngăn nhớ RAM thì trước chúng phải đặt dấu (@) như chỉ ra dưới
đây.
MOV A, @ R0 ; Chuyển nội dung của ngăn nhớ RAM có địa chỉ trong
R0 và A
MOV @ R1, B ; Chuyển nội dung của B vào ngăn nhớ RAM có địa chỉ
ở R1
Lưu ý rằng R0 cũng như R1 luôn có dấu “@” đứng trước. Khi không có
dấu này thì đó là lệnh chuyển nội dung các thanh ghi R0 và R1 chứ không phải
dữ liệu ngăn nhớ mà địa chỉ có trong R0 và R1.
Ví dụ 3.1: Viết chương trình để sao chép giá trị 55H vào ngăn nhớ RAM
tại địa chỉ 40H đến 44H sử dụng:
a) Chế độ đánh địa chỉ trực tiếp
b) Chế độ đánh địa chỉ gián tiếp thanh ghi không dùng vòng lặp
c) Chế độ b có dùng vòng lặp
Lời giải:
a)
MOV A, #55H ; Nạp A giá trị 55H
MOV 40H, A ; Sao chép A vào ngăn nhớ RAM 40H
MOV 41H, A ; Sao chép A vào ngăn nhớ RAM 41H
MOV 42H, A ; Sao chép A vào ngăn nhớ RAM 42H
MOV 43H, A ; Sao chép A vào ngăn nhớ RAM 43H
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
42
MOV 44H, A ; Sao chép A vào ngăn nhớ RAM 44H
b)
MOV A, # 55H ; Nạp vào A giá trị 55H
MOV R0, #40H ; Nạp con trỏ R0 = 40 H
MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0
chỉ đến
INC R0 ; Tăng con trỏ. Bây gì R0 = 41H
MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0
chỉ
INC R0 ; Tăng con trỏ. Bây giờ R0 = 42H
MOV @R0,A ; Sao chép Avào vị trí ngăn nhớ RAM do R0 chỉ
INC R0 ; Tăng con trỏ. Bây giờ R0 = 43H
MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0
chỉ
MOV @R0, A ;Tăng con trỏ. Bây gờ R0 = 44H
MOV @R0, A
c)
MOV A, # 55H ; Nạp vào A giá trị 55H
MOV R0, #40H ; Nạp con trỏ địa chỉ ngăn nhớ RAM R0 = 40H
MOV R2, #05 ; Nạp bộ đếm R2 = 5
AGAIN:MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do Ro
chi đến
INC ; Tăng con trỏ Ro
DJNZ R2, AGAIN ; Lặp lại cho đến khi bộ đếm = 0.
2.4. Định địa chỉ tức thời
Các dữ liệu tức thời được dùng trực tiếp trong lệnh có thể là một hằng số,
một ký số, một biểu thức toán học Trình dịch hợp ngữ sẽ tự động tính toán và
thay thế dữ liệu tức thời vào mã lệnh.
- Quy ước: dùng dấu # trước các toán hạng tức thời.
Ví dụ: MOV A,#7 ; nạp giá trị 7 vào thanh ghi A, (A) = 7H
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
43
MOV A,#7+8 ; nạp giá trị 15 vào thanh ghi A, (A) =
0FH
MOV A,#‘B’ ; nạp giá trị 66 (mã ASCII của ký tự B)
vào thanh ghi A, (A) = 42H
2.5. Định địa chỉ tương đối
Được dùng trong các lệnh nhảy ngắn. Một địa chỉ tương đối (hay còn gọi
là offset) là một giá trị 8 bit có dấu (từ –128 đến +127) cho biết độ lệch từ vị trí
lệnh theo ngay sau lệnh nhảy đến đích. Giá trị này được cộng thêm vào thanh
ghi bộ đếm chương trình (PC) để tạo ra địa chỉ của lệnh tiếp theo cần được thực
thi.
Ví dụ: Tính offset cho kiểu định địa chỉ tương đối trong hai trường hợp
nhảy tới và nhảy lùi.
Thông thường các đích nhảy được xác định bằng các nhãn và trình dịch
hợp ngữ sẽ xác định offset tương đối tương ứng.
Ví dụ: Nếu nhãn THERE được đặt ở địa chỉ 1040H và lệnh:
SJMP THERE
Ở trong bộ nhớ chương trình tại địa chỉ 1000H và 1001H ? địa chỉ của
lệnh kế tiếp sẽ là 1000H + 02H = 1002H, nên offset tương đối sẽ là: offset =
1040H – 1002H = 3EH. Trình dịch hợp ngữ sẽ gán offset tương đối là 3EH cho
byte 2 của lệnh SJMP THERE.
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
44
- Có ưu điểm là không phụ thuộc vào vị trí nhưng bị giới hạn về tầm
nhảy.
2.6. Định địa chỉ tuyệt đối
Chỉ dùng trong các lệnh AJMP và ACALL.
- Cho phép rẽ nhánh chương trình trong trang 2K hiện hành của bộ nhớ
chương trình (tức tầm nhảy của lệnh là trong trang 2K hiện hành của bộ nhớ
chương trình).
- 11 bit thấp của địa chỉ đích, trong đó 3 bit cao (A8 ÷ A10) được đưa vào
cùng với opcode tạo thành byte thứ 1 của lệnh và 8 bit thấp (A0 ÷ A7) tạo thành
byte thứ 2 của lệnh. 5 bit cao của địa chỉ đích là 5 bit cao hiện hành của bộ đếm
chương trình (PC) ? lệnh theo ngay sau lệnh rẽ nhánh và đích đến phải ở trong
cùng 1 trang 2K.
- Kiểu định địa chỉ này có tầm nhảy bị hạn chế và cung cấp mã phụ thuộc
vị trí.
Ví dụ: Nếu nhãn THERE đặt tại địa chỉ 0F46H và lệnh:
AJMP THERE
ở trong bộ nhớ tại địa chỉ 0900H và 0901H ? lệnh theo ngay sau lệnh
nhảy bắt đầu ở địa chỉ 0902H sẽ có 5 bit cao địa chỉ trùng với địa chỉ nhãn
THERE là 00001.
Mã hoá lệnh:
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
45
2.7. Định địa chỉ dài
Chỉ dùng trong các lệnh LCALL và LJMP.
- Đây là các lệnh rẽ nhánh 3 byte, với 2 byte sau (byte 2 và byte 3) là địa
chỉ đích của lệnh (16 bit).
- Ưu điểm là có thể sử dụng toàn bộ vùng nhớ chương trình 64K, nhưng
lệnh lại dài đến 3 byte và phụ thuộc vào vị trí.
2.8. Định địa chỉ theo chỉ số
Chế độ đánh địa chỉ theo chỉ số được sử dụng rộng rãi trongviệc truy cập
các phân tử dữ liệu của bảng trong không gian ROM chương trình của 8051.
Lệnh được dùng cho mục đích này là “Move A, @ A + DPTR”. Thanh ghi 16
bit DPTR là thanh ghi A được dùng để tạo ra địa chỉ của phân tử dữ liệu được
lưu cất trong ROM trên chíp. Do các phân tử dữ liệu được cất trong không gian
mã (chương trình) của ROM trên chip của 8051, nó phải dùng lệnh Move thay
cho lệnh MOV (chủ C ở cuối lệnh là chỉ mà lệnh Code). Trong lệnh này thì nội
dung của A được bổ xung vào thanh ghi 16 bit DPTR để tạo ra địa chỉ 16 bit
của dữ liệu cần thiết.
Ví dụ 3.2: Giả sử từ “VSA” được lưu trong ROM có đĩa chỉ bắt đầu từ
200H và chương trình được ghi vào ROM bắt đầu từ địa chỉ 0. Hãy phân tích
cách chương trình hoạt động và hãy phát biểu xem từ “VSA” sau chương trình
này được cất vào đâu?
Lời giải:
ORG 0000H ; Bắt đầu đốt ROM tại địa chỉ 00H
MOV DPTR, #200H ; Địa chỉ bẳng trình bày DPTR = 200H
CLA A ; Xoá thanh ghi A (A = 0)
MOVC A, @A + DPTR ; Lấy ký tự từ không gian nhớ chương
trình
MOV R0, A ; Cất nó vào trong R0
INC DPTR ; DPTR = 201, chỉ đến ký tự kế tiếp
CLR A ; Xoá thanh ghi A
MOVC A, @A + DPTR ; Lấy ký tự kế tiếp
MOV R1, A ; Cất nó vào trong R1
INC DPTR ; DPTR = 202 con trỏ chỉ đến ký tự
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
46
sau đó
CLA A ; Xoá thanh ghi A
MOVC A, @A + DPTR ; Nhận ký tự kế tiếp
MOV R2, A ; Cắt nó vào R2
HERE: SJMP HERE ; Dừng lại ở đây.
; Dữ liệu được đốt trong không gian mã
lệnh tại địa chỉ 200H
ORG 200H
MYDATA: DB “VSA”
END ; Kết thúc chương trình
Ở trong chương trình nói trên thì các vị trí ngăn nhớ ROM chương trình
200H - 2002H có các nội dung sau:
200 = (‘U’); 201= (‘S’) và 202 = (‘A’).
Chúng ta bắt đầu với DPTR = 200H và A = 0.Lệnh “MOVC A, @ A +
DPTR chuyền nội dung của vị trí nhớ 200H trong ROM (200H + 0 = 200H) vào
A.
Thanh ghi A chứa giá trị 55H là giá trị mà ASC của ký tự “U”. ký tự này
được cất vào R0. Kế đó, DPTR được tăng lên tạo thành DPTR = 201H. A lại
được xoá về 0 để lấy nội dung của vị trí nhớ kế tiếp trong ROM là 201H chưa
ký tự “S”. Sau khi chương trình này chạy ta có R0 = 55H, R1 = 53H và R2 =
41H là các mã ASCII của các ký tự “U”, “S” và “A”.
Ví dụ 3.3: Giả sử không gian ROM bắt đầu từ địa chỉ 250H có chứa
“America”, hãy viết chương trình để truyền các byte vào các vị trí ngăn nhớ
RAM bắt đầu từ địa chỉ 40H.
Lời giải
(a) Phương pháp này sử dụng một bộ đếm
ORG 000
MOV DPTR, # MYDATA ; Nạp con trỏ ROM
MOV R0, #40H ; Nạp con trỏ RAM
MOV R2, #7 ; Nạp bộ đếm
BACK: CLR A ; Xoá thanh ghi A
MOVC A, @A + DPTR ;Chuyển dữ liệu từ khong gian mã
MOV R0, A ;Cất nó vào ngăn nhớ RAM
INC DPTR ; Tăng con trỏ ROM
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
47
INC R0 ; Tăng con trỏ RAM
DJNZ R2, BACK ; Lặp lại cho đếnkhi bộ đếm = 0
HERE: SJMP HERE
;------------ không gian mã của ROM trên chíp dùng để cất dữ liệu ORG 250H
MYDATA: DB “AMER1CA”
END
(b) phương pháp này sử dụng ký tự null để kết thúc chuỗi
ORG 000
MOV DPTR, #MYDATA ; Nạp con trỏ ROM
MOV R0, #40 ; Nạp con trỏ RAM
BACK: CLR A S ; Xoá thanh ghi A(A=0)
MOVC A, @A + DPTR ; Chuyển dữ liệu từ không gian mã
JZ HERE ; Thoát ra nếu có ký tự Null
MOV DPTR, #MYDATA ; Cất nó vào ngădn nhớ của RAM
INC @R0, A ; Tăng con trỏ ROM
INC R0 ; Tăng con trỏ RAM
SJM BACK ; Lặp lại
HERE: SJMP HERE
;------------- không gian mã của ROM trên chíp dùng để cất dữ liệu ORG 250H
MYADTA: DB “AMER1CA”, 0 ; Ký tự Null để kết thúc chuỗi END
Lưu ý đến cách ta sử dụng lệnh JZ để phát hiện ký tự NOLL khi kết
thúc chuỗi.
3. Các nhóm lệnh
3.1. Nhóm lệnh số học
3.1.1. Phép cộng các số không dấu.
Trong 8051 để cộng các số với nhau thì thanh ghi tổng (A) phải được
dùng đến. Dạng lệnh ADD là:
ADD A, nguồn; A = A + nguồn
Lệnh ADD được dùng để cộng hai toán hạng. Toán hạng đích luôn là
thanh ghi A trong khi đó toán hạng nguồn có thể là một thanh ghi dữ liệu trực
tiếp hoặc là ở trong bộ nhớ. Hãy nhớ rằng các phép toán số học từ bộ nhớ đến
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
48
bộ nhớ không bao giờ được phép trong hợp ngữ. Lệnh này có thể thay đổi một
trong các bit AF, CF hoặc PF của thanh ghi cờ phụ thuộc vào các toán hạng liên
quan. Tác động của lệnh ADD lên cờ tràn sẽ được trình bày ở phần sau.
Ví dụ 3.4: Hãy biểu diễn xem cá lệnh dưới đây tác động đến thanh ghi cờ
như thế nào?
MOV A, # 0F5H ; A = F5H
ADD A, # 0BH ; A = F5 + 0B = 00
Lời giải:
F5H 1111 0101
+ 0BH + 0000 1011
100h 0000 0000
Sau phép cộng, thanh ghi A (đích) chứa 00 và các cờ sẽ như sau:
CY = 1 vì có phép nhớ từ D7
PF = 1 vì số các số 1 là 0 (một số chẵn) cờ PF được đặt lên 1.
AC = 1 vì có phép nhớ từ D3 sang D4
a) Phép cộng các byte riêng rẽ.
Để tính tổng số của một số bất kỳ các toán hạng thì cờ nhớ phải được
kiểm tra sau mỗi lần cộng một toán hạng. Ví dụ 3.5 dùng R7 để tích luỹ số lần
nhớ mỗi khi các toán hạng được cộng vào A.
Ví dụ 3.5: Giả sử các ngăn nhớ 40 - 44 của RAM có giá trị sau: 40 =
(7D); 41 = (EB); 42 = (C5); 43 = (5B) và 44 = (30). Hãy viết một chương trình
tính tổng của các giá trị trên. Cuối chương trình giá trị thanh ghi A chứa byte
thấp và R7 chứa byte cao (các giá trị trên được cho ở dạng Hex).
Lời giải:
MOV R0, #40H ; Nạp con trỏ
MOV R2, #5 ; Nạp bộ đệm
CLR A ; Xoá thanh ghi A
MOV R7, A ; Xoá thanh ghi R7
AGAIN:ADD A, @R0 ; Cộng byte con trỏ chỉ đến theo R0
JNC NEXT ; Nếu CY = 0 không tích luỹ cờ nhớ
INC R7 ; Bám theo số lần nhớ
NEXT: INC R0 ; Tăng con trỏ
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
49
DJNZ R2, AGAIN ; Lặp lại cho đến khi R0 = 0
Phân tích ví dụ 3.5: Ba lần lặp lại của vòng lặp được chỉ ra dưới đây. Phần
dò theo chương trình dành cho người đọc tự thực hiện. Trong lần lặp lại đầu tiên
của vòng lặp thì 7DH được cộng vào A với CY = 0 và R7 = 00 và bộ đếm R2 =
04. Trong lần lặp lại thứ hai của vòng lặp thì EBH được cộng vào A và kết
quả trong A là 68H với CY = 1. Vì cờ nhớ xuất hiện, R7 được tăng lên. Lúc này
bộ đếm R2 = 03. Trong lần lặp lại thứ ba thì C5H được cộng vào A nên A =
2DH và cờ nhớ lại bận. Do vậy R7 lại được tăng lên và bộ đệm R2 = 02. ở phần
cuối khi vòng lặp kết thúc, tổng số được giữ bởi thanh ghi A và R7, trong đó
A giữ byte thấp và R7 chứa byte cao.
b) Phép cộng có nhớ và phép cộng các số 16 bit.
Khi cộng hai toán hạng dữ liệu 16 bit thì ta cần phải quan tâm
đến phép truyền của cờ nhớ từ byte thấp đến byte cao. Lệnh ADDC (cộng có
nhớ) được sử dụng trong những trường hợp như vậy. Ví dụ, xét phép cộng hai
số sau: 3CE7H + 3B8DH.
3C E7
+ 3B 8D
78 74
79 74
Khi byte thứ nhất được cộng (E7 + 8D = 74, CY = 1). Cờ nhớ được
truyền lên byte cao tạo ra kết quả 3C + 3B + 1 = 78. Dưới đây là chương trình
thực hiện các bước trên trong 8051.
Ví dụ 3.6: Hãy viết chương trình cộng hai số 16 bit. Các số đó là 3CE7H
và 3B8DH. Cất tổng số vào R7và R6 trong đó R6 chứa byte thấp.
Lời giải:
CLR ; Xoá cờ CY = 0
MOV A, #0E7H ; Nạp byte thấp vào AA = E7H
ADD A, #8DH ; Cộng byte thấp vàoAA = 74H và CY=1
MOV R6, A ; Lưu byte thấp của tổng vào R6
MOV A, #3CH ; Nạp byte cao vào A đ A = 3CH
ADDC A, #3BG ; Cộng byte cao có nhớ vào A đ A = 78H
MOV R7, A ; Lưu byte cao của tổng vào R7
c) Hệ thống số BCD (số thập phân mã hoá theo nhị phân).
Số BCD là số thập phân được mã hoá theo nhị phân 9 mà không dùng số
thập phân hay số thập lục (Hex). Biểu diễn nhị phân của các số từ 0 đến 9
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
50
được gọi là BCD (xem hình 3.1). Trong tài liệu máy tính ta thường gặp hai khái
niệm đối với các số BCD là: BCD được đóng gói và BCD không đóng gói.
Digit BCD Digit BCD
0 0000 5 0101
1 0001 6 0110
2 0010 7 0111
3 0011 8 1000
4 0100 9 1001
Hình 3.1: Mã BCD
- BCD không đóng gói.
Trong số BCD không đóng gói thì 4 bít thấp của số biểu diễn số BCD
còn 4 bit còn lại là số 9. Ví dụ “00001001” và “0000 0101” là những số BCD
không đóng gói của số 9 và số 5. Số BCD không đóng gói đòi hỏi một byte bộ
nhớ hay một thanh ghi 8 bit để chứa nó.
- BCD đóng gói.
Trong số BCD đóng gói thì một byte có 2 số BCD trong nó một trong
4 bit thấp và một trong 4 bit cao. Ví dụ “0101 1001” là số BCD đóng gói cho
59H. Chỉ mất 1 byte bộ nhớ để lưu các toán hạng BCD. Đây là lý do để dùng số
BCD đóng gói vì nó hiệu quả gấp đôi trong lưu giữ liệu. Có một vấn để khi cộng
các số BCD mà cần phải được khắc phục. Vấn đề đó là sau khi cộng các số
BCD đóng gói thì kết quả không còn là số BCD. Ví dụ:
MOV A, #17H
ADD A, #28H
Cộng hai số này cho kết quả là 0011 1111B (3FH) không còn là số BCD!
Một số BCD chỉ nằm trong giải 0000 đến 1001 (từ số 0 đến số 9). Hay nói
cách khác phép cộng hai số BCD phải cho kết quả là số BCD. Kết quả trên đáng
lẽ phải là 17 + 28 = 45 (0100 0101). Để giải quyết vấn đề này lập trình viên phải
cộng 6 (0110) vào số thấp 3F + 06 = 45H. Vấn đề tương tự cũng có thể xảy ra
trong số cao (ví dụ khi cộng hai số 52H + 87H = D94). Để giải quyết vấn đề này
ta lại phải cộng 6 vào số cao (D9H + 60H = 139). Vấn đề này phổ biến đến mức
mọi bộ xử lý như 8051 đều có một lệnh để sử lý vấn đề này. Trong 8051 đó là
lệnh “DA A” để giải quyết vấn đề cộng các số BCD.
d) Lệnh DA.
Lệnh DA (Decimal Adjust for addition điều chỉnh thập phân đối với
phép cộng) trong 8051 để dùng hiệu chỉnh sự sai lệch đã nói trên đây liên quan
đến phép cộng các số BCD. Lệnh giả “DA”. Lệnh DA sẽ cộng 6 vào 4 bit thấp
hoặc 4 bit cao nếu cần. Còn bình thường nó đê nguyên kết quả tìm được. Ví dụ
sau sẽ làm rõ các điểm này.
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
51
Ví dụ 3.7:
MOV A, #47H ; A = 47H là toán hạng BCD đầu tiên
MOV B, #25H ; B = 25H là toán hạng BCD thứ hai
ADD A, B ; Cộng các số hex (nhị phân) A = 6CH
DA A ; Điều chỉnh cho phép cộng BCD (A = 72H)
Sau khi chương trình được thực hiện thanh ghi A sẽ chứa 72h (47 + 25 =
72). Lệnh “DA” chỉ làm việc với thanh ghi A. Hay nói cách khác trong thanh
ghi nguồn có thể là một toán hạng của chế độ đánh địa chỉ bất kỳ thì đích phải là
thanh ghi A để DA có thể làm việc được. Cũng cần phải nhấn mạnh rằng lệnh
DA phải được sử dụng sau phép cộng các toán hạng BCD và các toán hạng
BCD không bao giờ có thể có số lớn hơn 9. Nói cách khác là không cho phép có
các số A - F. Điều quan trọng cũng phải lưu ý là DA chỉ làm việc sau phép
cộng ADD, nó sẽ không bao giờ làm việc theo lệnh tăng INC.
Tóm tắt về hoạt động của lệnh DA.
Hoạt động sau lệnh ADD hoặc ADDC.
+ Nếu 4 bi t thấp lớn hơn 9 hoặc nếu AC = 1 thì nó cộng 0110 vào 4 bít
thấp.
+ Nếu 4 bit cao lớn hơn 9 hoặc cờ CY = 1 thì nó cộng 0110 vào 4 bit cao.
Trong thực tế thì cờ AC chỉ để dùng phục vụ cho phép cộng các số BCD và
hiệu chỉnh nó. Ví dụ, cộng 29H và 18H sẽ có kết quả là 41H sai với thực tế khi
đó các số BCD và để sửa lại thì lệnh DA sẽ cộng 6 vào 4 bit thấp để có kết quả
là đúng (vì AC = 1) ở dạng BCD.
29H 0010 1001
+ 18H + 0001 1000
41H 0100 0001 AC=1
+ 6H + 0110
47H 0100 0111
Ví dụ 3.8: Giả sử 5 dữ liệu BCD được lưu trong RAM tại địa chỉ bắt đầu từ 40H
như sau: 40 = (71), 41 = (11), 42 = (65), 43 = (59) và 44 = (37). Hãy viết
chương trình tính tổng của tất cả 5 số trên và kết quả phải là dạng BCD.
Lời giải:
MOV R0, #40H ; Nạp con trỏ
MOV R2, #5 ; Nạp bộ đếm
CLR A ; Xoá thanh ghi A
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
52
MOV R7, A ; Xoá thanhg ghi R7
AGAIN: ADD A, @R0 ; Cộng byte con trỏ chỉ bởi R0
DA A ; Điều chỉnh về dạng BCD đúng
JNC NEXT ; Nếu CY = 0 không tích luỹ cờ nhớ
JNC R7 ; Tăng R7 bám theo số lần nhớ
NEXT: INC R0 ; Tăng R0 dịch con trỏ lên ô nhớ kế tiếp
DJNZ R2, AGAIN ; Lặp lại cho đến khi R2 = 0
3.1.2. Phép trừ các số không dấu.
Cú pháp: SUBB A, nguồn ; A = A - nguồn - CY.
Trong rất nhiều các bộ xử lý có hai lệnh khác nhau cho phép trừ đó là
SUB và SUBB (trừ có mượn - Sub, tract with Borrow). Trong 8051 ta chỉ có
một lệnh SUBB duy nhất. Để thực hiện SUB từ SUB do vậy có hai trường hợp
cho lệnh SUBB là: với CY = 0 và với CY = 1. Lưu ý rằng ở đây ta dùng cờ CY
để mượn.
a) Lệnh SUBB với CY = 0.
Trong phép trừ thì các bộ vi xử lý 8051 (thực tế là tất cả mọi CPU hiện
đại) đều sử dụng phương pháp bù 2. Mặc dù mỗi CPU đều có mạch cộng, nó có
thể quá cồng kềnh (và cần nhiều bóng bán dẫn) để thiết kế mạch trừ riêng biệt.
Vì ly do đó mà 8051 sử dụng mạch cộng để thực hiện lệnh trừ. Giả sử 8051 sử
dụng mạch cộng để thực hiện lệnh trừ và rằng CY - 0 trước khi thực hiện lệnh
thì ta có thể tóm tắt các bước mà phần cứng CPU thực hiện lệnh SUBB đối với
các số không dấu như sau:
1. Thực hiện lấy bù 2 của số trừ (toán hạng nguồn)
2. Cộng nó vào số bị trừ (A)
3. Đảo nhớ
Đây là 3 bước thực hiện bởi phần cứng bên trong của CPU 8051 đối với
mỗi lệnh trừ SUBB bất kể đến nguồn của các toán hạng được cấp có được hỗ trợ
chế độ đánh địa chỉ hay không? Sau ba bước này thì kết quả có được và các cờ
được bật. Ví dụ sau hoạ 3 bước trên đây:
Ví dụ 3.9: Trình bày các bước liên quan dưới đây:
CLR C ; Tạo CY = 0
MOV A, #3FH ; Nạp 3FH vào A (A = 3FH)
MOV R3, #23H ; Nạp 23H vào R3 (R3 = 23H)
SUBB A, R3 ; Trừ A cho R3 đặt kết quả vào A
Lời giải
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
53
A = 3F 0011 1111 0011 1111
- R3= 23 0010 0011 + 1101 1101 bù 2 của R3 (bước 1)
1C 1 0001 1100 - 1C (bước 2)
0 CF=0 (bước 3)
Các cờ sẽ được thiết lập như sau: CY = 0, AC = 0 và lập trình viên phải
được nhìn đến cờ nhớ để xác định xem kết quả là âm hay dương. Nếu sau khi
thực hiện SUBB mà CY = 0 thì kết quả là dương. Nếu CY = 1 thì kết quả âm và
đích có giá trị bù 2 của kết quả. Thông thường kết quả được để ở dạng bù 2
nhưng các lệnh bù CPL và tăng INC có thể được sử dụng để thay đổi nó. Lệnh
CPL thực hiện bù 1 của toán hạng sau đó toán hạng được tăng lên 1 (INC) để
trở thành dạng bù 2.
b) Lệnh SUBB khi CY = 1.
Lệnh này được dùng đối với các số nhiều byte và sẽ theo dõi việc mượn
của toán hạng thấp. Nếu CY = 1 trước khi xem thực hiện SUBB thì nó cũng trừ
1 từ kết quả.
Ví dụ 3.10: Phân tích chương trình sau:
CLR C ; CY = 0
MOV A, #62 ; A = 62H
SUBB A, #96H ; 62H - 96H = CCH with CY = 1
MOV R7, A ; Save the result
MOV A, #27H ; A = 27H
SUBB A, #12H ; 27H - 12H - 1 = 14H
MOV R6, A ; Save the result
Lời giải:
Sau khi SUBB thì A = 62H - 96H = CCH và cờ nhớ được lập báo
rằng có mượn. Vì CY = 1 nên khi SUBB được thực hiện lần thứ 2 thì a = 27H
- 12H - 1 = 14H. Do vậy, ta có 2762H - 1296H = 14CCH.
3.1.3. Nhân và chia các số không dấu.
Khi nhân và chia hai số trong 8051 cần phải sử dụng hai thanh ghi A và B
vì các lệnh nhân và chia chỉ hoạt động với những thanh ghi này.
a) Nhân hai số không dấu.
Bộ vi điều khiển chỉ hỗ trợ phép nhân byte với byte. Các byte được giả
thiết là dữ liệu không dấu. Cấu trúc lệnh như sau:
MOV AB ; Là phép nhân A * B và kết quả 16 bit được đặt trong
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
54
A và B.
Khi nhận byte với byte thì một trong các toán hạng phải trong thanh ghi A
và toán hạng thứ hai phải ở trong thanh ghi B. Sau khi nhân kết quả ở trong các
thanh ghi A và B. Phần tiếp thấp ở trong A, còn phần cao ở trong B. Ví dụ dưới
đây trình bày phép nhân 25H với 65H. Kết quả là dữ liệu 16 bit được đặt trong
A và B.
MOV A, #25H ; Nạp vào A giá trị 25H
MOV B, 65H ; Nạp vào B giá trị 65H
MUL AB ; 25H*65H = E99 với B = 0EH và A = 99H
Bảng 3.1: Tóm tắt phép nhân hai số không dấu (MULAB)
Nhân Toán hạng 1 Toán hạng 2 Kết quả
Byte*Byte A B A = byte thấp, B = byte cao
b) Chia hai số không dấu.
8051 cùng chỉ hỗ trợ phép chia hai số không dấu byte cho byte với cú
pháp:
DIV AB ; Chia A cho B
Khi chia một byte cho một byte thì tử số (số bị chia) phải ở trong thanh
ghi A và mẫu số (số chia) phải ở trong thanh ghi B. Sau khi lệnh chia DIV được
thực hiện thì thương số được đặt trong A, còn số dư được đặt trong B. Xét ví dụ
dưới đây:
MOV A, #95 ; Nạp số bị chia vào A = 95
MOV B, #10 ; Nạp số chia vào B = 10
DIV AB ; A = 09 (thương số); B = 05 (số dư)
Lưu ý các điểm sau khi thực hiện “DIV AB”
Lệnh này luôn bắt CY = 0 và OV = 0 nếu tử số không phải là số 0
Nếu tử số là số 0 (B = 0) thì OV =1 báo lỗi và CY = 0. Thực tế chuẩn
trong tất cả mọi bộ vi xử lý khi chia một số cho 0 là bằng cách nào đó báo có kết
quả không xác định. Trong 8051 thì cờ OV được thiết lập lên 1.
Bảng 3.2: Tóm tắt phép chia không dấu (DIV AB).
Phép chia Tử số Mẫu số Thương số Số dư
Byte cho Byte A B A B
c) Một ứng dụng cho các lệnh chia.
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
55
Có những thời điểm khi một bộ ADC được nối tới một cổng và
ADC biểu diễn một số dư nhiệt độ hay áp suất. Bộ ADC cấp dữ liệu 8 bit ở dạng
Hex trong dải 00 - FFH. Dữ liệu Hex này phải được chuyển đổi về dạng thập
phân. Chúng ta thực hiện chia lặp nhiều lần cho 10 và lưu số dư vào như ở ví dụ
sau.
Ví dụ 3.11:
a. Viết một chương trình để nhận dữ liệu dạng Hex trong phạm vi 00 -
FFH từ cổng 1 và chuyển đổi nó về dạng thập phân. Lưu các số vào trong các
thanh ghi R7, R6 và R5 trong đó số có nghĩa nhỏ nhất được cất trong R7.
b. Phân tích chương trình với giả thiết P1 có giá trị FDH cho dữ liệu.
Lời giải:
a. Chương trình
MOV A, #0FFH
MOV P1, A ; Tạo P1 là cổng đầu vào
MOV A, P1 ; Đọc dữ liệu từ P1
MOV B, #10 ; B = 0A Hex (10 thập phân)
DIV AB ; Chia cho 10
MOV R7, B ; Cất số thấp
MOV B, #10 ;
DIV AB ; Chia 10 lần nữa
MOV R6, B ; Cất số tiếp theo
MOV R5, A ; Cất số cuối cùng
b. Để chuyển đổi số nhị phân hay Hex về số thập phân ta thực hiện chia
lặp cho 10 liên tục cho đến khi thương số nhỏ hơn 10. Sau mỗi lần chia
số dư được lưu cất. Trong trường hợp một số nhị phân 8 bit như FDH chẳng
hạn ta có 253 số thập phân như sau (tất cả trong dạng Hex)
Thương số Số dư
FD/0A 19 3 (Số thấp - cuối)
19/0A 2 5 (Số giữa)
2 (Số đầu)
Do vậy, ta có FDH = 253. Để hiển thị dữ liệu này thì nó phải được chuyển
đổi về ASCII mà sẽ được mô tả ở chương sau.
3.2. Nhóm lênh logic
3.2.1. Lệnh Và (AND).
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
56
Cú pháp: ANL đích, nguồn; đích = đích Và nguồn (kẻ bảng).
Lệnh này sẽ thực hiện một phép Và lô-gíc trên hai toán hạng đích và
nguồn và đặt kết quả vào đích. Đích thường là thanh ghi tổng (tích luỹ).
Toán hạngnguồn có thể là thanh ghi trong bộ nhớ hoặc giá trị cho sẵn. Hãy xem
phụ lục Appendix A1 để biết thêm về các chế độ đánh địa chỉ dành cho
lệnh này. Lệnh ANL đối với toán hạng theo byte không có tác động lên các cờ.
Nó thường được dùng để che (đặt về 0) những bit nhất định của một toán hạng.
Ví dụ 3.12: Trình bày kết quả của các lệnh sau:
MOV A, #35H ; Gán A = 35H
ANL A, #0FH ; Thực hiện Và lô-gíc A và 0FH (Bây giờ A =
05)
Lời giải:
35H 0 0 1 1 0 1 0 1
0FH 0 0 0 0 1 1 1 1
05H 0 0 0 0 0 1 0 1 35H và 0FH = 05H
3.2.2. Lệnh Hoặc (OR).
Cú pháp ORL đích = đích Hoặc nguồn (kẻ bảng)
Các toán hạng đích và nguồn được Hoặc với nhau và kết quả được đặt
vào đích. Phép Hoặc có thể được dùng để thiết lập những bit nhất định của một
toán hạng 1. Đích thường là thanh ghi tổng, toán hạng nguồn có thể là một thanh
ghi trong bộ nhớ hoặc giá trị cho sẵn. Hãy tham khảo phụ lục Appendix A để
biết thêm về các chế độ đánh địa chỉ được hỗ trợ bởi lệnh này. Lệnh ORL đối
với các toán hạng đánh địa chỉ theo byte sẽ không có tác động đến bất kỳ cờ
nào.
Ví dụ 3.13: Trình bày kết quả của đoạn mã sau:
MOV A, #04 ; A = 04
MOV A, #68H ; A = 6C
Lời giải:
04H 0000 0100
68H 0110 1000
6CH 0110 1100 04 OR 68 = 6CH
3.2.3. Lệnh XOR (OR loại trừ).
Cú pháp: XRL đích, nguồn; đích = đích Hoặc loại trừ nguồn (kẻ bảng).
Lệnh này sẽ thực hiện phép XOR trên hai toán hạng và đặt kết quả vào đích.
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
57
Đích thường là thanh ghi tổng. Toán hạng nguồn có thể là một thanh ghi
trong bộ nhớ hoặc giá trị cho sẵn. Xem phụ lục Appendix A.1 để biết thêm về
chế độ đánh địa chỉ của lệnh này. Lệnh XRL đối với các toán hạng đánh địa chỉ
theo byte sẽ không có tác động đến bất kỳ cờ nào.
Ví dụ 3.14: Trình bày kết quả của đoạn mã sau:
MOV A, #54H
XRL A, #78H
Lời giải:
54H 0 1 0 1 0 1 0 0
78H 0 1 1 1 1 0 0 0
2CH 0 0 1 0 1 1 0 1 54H XOR 78H = 2CH
Ví dụ 3.15: Lệnh XRL có thể được dùng để xoá nội dung của một thanh
ghi bằng cách XOR nó với chính nó. Trình bày lệnh “XRL A, A” xoá nội dung
của A như thế nào? giả thiết AH = 45H.
Lời giải:
45H 01000101
45H 01000101
00 00000000 54H XOR 78H = 2CH
Lệnh XRL cũng có thể được dùng để xem nếu hai thanh ghi có giá trị
giống nhau không? Lệnh “XRL A, R1” sẽ hoặc loại trừ với thanh ghi R1 và đặt
kết quả vào A. Nếu cả hai thanh ghi có cùng giá trị thì trong A sẽ là 00. Sau đó
có thể dùng lệnh nhả JZ để thực hiện theo kết quả. Xét ví dụ 7.5.
Ví dụ 3.16: Đọc và kiểm tra cổng P1 xem nó có chứa giá trị 45H không?
Nếu có gửi 99H đến cổng P2, nếu không xoá nó.
Lời giải:
MOV P2, #00 ; Xóa P2
MOV P1, #0FFH ; Lấy P1 là cổng đầu vào
MOV R3, #45H ; R3 = 45H
MOV A, P1 ; Đọc P1
XRL A, R3
JNZ EXIT ; Nhảy nếu A có giá trị khác 0
MOV P2, #99H
EXIT: ...
GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái
58
Trong chương trình của ví dụ 7.5 lưu ý việc sử dụng lệnh nhảy
JNZ. Lệnh JNZ và JZ kiểm tra các nội dung chỉ của thanh ghi tổng. Hay nói
cách khác là trong 8051không có cờ 0.
Một ứng dụng rộng rãi khác của bộ xử lý là chọn các bit của một toán
hạng. Ví dụ để chọn 2 bit của thnh ghi A ta có thể sử dụng mã sau. Mã này ép
bit D2 của thanh ghi A chuyển sang giá trị nghịch đảo, còn các bit khác không
thay đổi.
XRL A, #04H ; Nghĩa hoặc loại trừ thanh ghi A với
; Giá trị 0000 0100
3.2.4. Lệnh bù thanh ghi tổng CPL A.
Lệnh này bù nội dung của thanh ghi tổng A. Phép bù là phép biến đổi các
số 0 thành các số 1 và đổi các số 1 sang số 0. Đây cũng còn được gọi là phép bù
1.
MOV A, #55H
CPL A ; Bây giờ nội dung của thanh ghi A là AAH
; Vì 0101 0101 (55H) đ 1010 1010 (AAH)
Để nhận được kết quả bù 2 thì tất cả mọi việc ta cần phải làm là cộng 1
vào kết quả bù 1. Trong 8051 thì không có lệnh bù 2 nào cả. Lưu ý rằng trong
khi bù một byte thì dữ liệu phải ở trong thanh ghi A. Lệnh CPL không hỗ trợ
một chế độ đánh địa chỉ nào cả.
Ví dụ 3.17: Tìm giá trị bù 2 của 85H.
Lời giải:
MOV A, #85H ; Nạp 85H vào A (85H = 1000 0101)
MOV A ; Lấy bù 1 của A (kết quả = 0111 1010)
ADD A, #1 ; Cổng 1 vào A thành bù 2
A = 0111 1011 (7BH)
3.2.5 Lệnh so sánh.
8051 có một lệnh cho phép so sánh.
Cú pháp: CJNE đích, nguồn, địa chỉ tương đối.
Trong 8051 thì phép so sánh và nhảy được kết hợp thành môt lệnh có
tên là CJNE (so sánh và nhảy nếu kết quả không bằng nhau). Lệnh CJNE so
sánh hai toán hạng nguồn và đích và nhảy đến địa chỉ tương đối nếu hai toán
hạng không bằng nhau. Ngoài ra nó thay đổi cờ nhớ CY để báo nếu toán hạng
đích lớn hơn hay nhỏ hơn. Điều quan trọng cần để là các toán hạng vẫn
không giữ nguyên không thay thay đổi. Ví dụ, sau khi thực hiện lệnh “CJNE A,
#67H, NEXT” thì thanh ghi A vẫn có giá trị ban đầu của nó (giá trị trước lệnh
GT: Vi điều khiển
Các file đính kèm theo tài liệu này:
- giao_trinh_vi_dieu_khien_p1_7958.pdf