Lập trình hợp ngữ họ MCS-51_chương 3

22 569 5
Lập trình hợp ngữ họ MCS-51_chương 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 CHƯƠNG 3: LẬP TRÌNH HP NGỮ HỌ MCS-51 Tại phần trước cấu trúc 3-bus chung cho tất họ vi xử lý Với cấu trúc này, tất họ vi xử lý khác thực công việc mà ta thấy sống, từ điều khiển trình phức tạp, truyền thông, trò chơi điện tử… Một câu hỏi đặt là: đặc trưng cho vi xử lý để thực chức riêng biệt vi xử lý Đó phần mềm (software), hay chương trình I CÁC KHÁI NIỆM CƠ BẢN VỀ LẬP TRÌNH CHO VI XỬ LÝ VÀ VI ĐIỀU KHIỂN Chương trình - Chương trình (program) chuỗi câu lệnh hay phát biểu viết dạng đặc thù (ngôn ngữ lập trình) Các lệnh thực vi xử lý thực thao tác định với kết đoán trước - Có nhiều loại ngôn ngữ lập trình: + Ngôn ngữ máy (machine language) Mã nhị phân Mã bát phân thập lục phân + Hợp ngữ (assembly language) [cần có assembler – trình dịch hợp ngữ] Mã kí hiệu + Ngôn ngữ cấp cao [cần có compiler – trình biên dịch] Pascal, Fortran, Basic, C, C++, … Lưu đồ chương trình - Bước việc lập trình xác định rõ ràng mục đích chương trình trình tự cần thiết để đạt mục đích Một công cụ quan trọng việc phát triển chương trình lưu đồ chương trình - Lưu đồ chương trình biểu diễn hình ảnh thứ tự thao tác cần làm để giải vấn để cụ thể Lưu đồ chương trình không phụ thuộc ngôn ngữ lập trình loại vi xử lý cụ thể Lưu đồ chương trình phụ thuộc vào công việc mà người lập trình muốn hoàn thành - Các khối dùng lưu đồ chương trình: Khối bắt đầu kết thúc Khối thực Gọi chương trình Khối nhập/xuất Khối định (khối rẽ nhánh có điều kiện) Đầu nối (khi qua trang mới) Chỗ nối chung Rất nhiều người lập trình bắt đầu với việc lập trình thường không thích sử dụng lưu đồ chương trình nghó việc vẽ lưu đồ tốn thời gian Điều với chương trình ngắn đơn giản, trường hợp chương trình dài lưu đồ dễ bị rối rắm Lưu đồ chương trình giúp xếp ý tưởng lời giải vấn đề riêng biệt Sau hoàn thành lưu đồ, ta trao đổi với người khác ý tưởng http://www.ebook.edu.vn Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 Có lưu đồ chương trình dù sau thời gian dài ta quay lại với chương trình cách dễ dàng mà không bị “lạc” dòng lệnh vốn chi tiết chương trình hợp ngữ Khuôn dạng chương trình hợp ngữ Một chương trình hợp ngữ bao gồm: - Các lệnh (instruction) vi xử lý/vi điều khiển - Các dẫn (directive) trình dịch hợp ngữ - Các điều khiển (control) trình dịch hợp ngữ - Các thích (comment) Các lệnh mã gợi nhớ quen thuộc dịch mã máy tương ứng với vi xử lý/vi điều khiển Các dẫn trình dịch hợp ngữ lệnh trình dịch hợp ngữ dùng để định nghóa cấu trúc chương trình, ký hiệu, liệu, số… Các điều khiển trình dịch hợp ngữ thiết lập chế độ trình dịch hợp ngữ luồng hợp dịch trực tiếp Các thích giúp cho chương trình dễ đọc cách đưa giải thích mục đích hoạt động chuỗi lệnh Các dòng chứa lệnh dẫn phải viết theo qui luật mà trình dịch hợp ngữ hiểu Mỗi dòng chia thành trường cách biệt khoảng trắng hay khoảng tab Khuôn dạng tổng quát dòng sau: Tên (Nhãn) Mã gợi nhớ Các toán hạng Chú thích có trường mã gợi nhớ bắt buộc Với trình dịch hợp ngữ ASM51, trường mã gợi nhớ không cần dòng với trường nhãn Tuy nhiên, trường toán hạng phải dòng với trường mã gợi nhớ Có thể viết dòng chữ hoa hay chữ thường chúng coi tương đương trình dịch hợp ngữ không phân biệt kiểu chữ a Trường tên Trường chứa nhãn, tên biến, hay tên chương trình (thủ tục) Các tên nhãn trình dịch hợp ngữ gán địa cụ thể lệnh (hoặc liệu) theo sau Tên nhãn có độ dài từ đến 31 ký tự, không chứa khoảng trắng, phải bắt đầu ký tự chữ, dấu ‘?’ hay dấu ‘_’ phải ký tự chữ, ký số, dấu ‘?’ hay dấu ‘_’ Các tên nhãn không trùng với từ khóa (các mã gợi nhớ, dẫn, toán tử hay ký hiệu định nghóa trước) Nói chung, ta đặt tên bình thường có ý nghóa bị lỗi Một nhãn kết thúc dấu ‘:’ b Trường mã gợi nhớ Trường chứa mã gợi nhớ (mnemonic) cho biết chức lệnh (ví dụ ADD, MOV, DIV, MUL, INC…) hay dẫn trình dịch hợp ngữ (ví dụ ORG, END, EQU, DB…) Các dẫn không dịch mã máy c Trường toán hạng (operand) Trường chứa địa hay liệu mà lệnh sử dụng Tùy theo loại lệnh mà có 0, 1, hay toán hạng Các toán hạng cách dấu phẩy d Trường thích (comment) Các thích để làm rõ chương trình đặt trường thích cuối dòng lệnh Điều giúp cho người đọc chương trình dễ hiểu thao tác chương trình Các thích cần phải bắt đầu dấu ‘;’ Các thích chiếm nhiều dòng riêng phải bắt đầu dấu chấm ‘;’ http://www.ebook.edu.vn Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 Khi ta viết chương trình kí tự bảng chữ cái, ta gọi dạng mnemonic (mã gợi nhớ) Vi xử lý/vi điều khiển không hiểu chữ Chúng đòi hỏi lệnh phải viết dạng đặc biệt gọi object code (mã đối tượng, mã lệnh) Mnemonic dùng chương trình gốc dạng source code (mã nguồn) người lập trình viết hợp ngữ (ngôn ngữ lập trình khác) Còn object code ngôn ngữ bao gồm số 0, ngôn ngữ mà vi xử lý/vi điều khiển làm việc Vi xử lý/vi điều khiển đọc object code từ nhớ dạng byte biên dịch liệu thành lệnh cần thực thi Một số dẫn trình dịch hợp ngữ thường dùng: • ORG Dạng: ORG bieuthuc Chỉ dẫn ORG thay đổi nội dung đếm chương trình theo giá trị bieuthuc để thiết lập nơi bắt đầu chương trình cho phát biểu theo sau • END Dạng: END END phát biểu cuối chương trình nguồn Nhãn không sử dụng dòng • EQU Dạng: kyhieu EQU bieuthuc Chỉ dẫn EQU gán giá trị bieuthuc cho kyhieu Kyhieu phải tên hợp lệ • DB Dạng: nhan: DB bieuthuc{, bieuthuc][…] Chỉ dẫn DB thường dùng để định nghóa giá trị byte tương ứng với bieuthuc nhớ chương trình địa tương ứng với nhan Biên dịch chương trình - Chương trình phải chuyển sang thành dạng object code trước vi xử lý/vi điều khiển thực chương trình Quá trình chuyển từ chương trình dạng source code sang object code gọi biên dịch/hợp dịch (assembling) - Sau ta nạp object code vào nhớ vi xử lý/vi điều khiển vi xử lý/vi điều khiển chạy chương trình Việc chuyển đổi mnemonic sang object code thường thực máy tính Trước hết ta dùng chương trình gọi editor để viết lưu mã nguồn vào nhớ Ta sử dụng editor quen thuộc Window Notepad môi trường DOS ta sử dụng lệnh edit Norton Commandor Sau ta cho chạy chương trình biên dịch gọi assembler, chương trình lấy mã lệnh nhớ biên dịch sang tập tin dạng object code Cuối cùng, ta dùng chương khác để nạp object code từ nhớ máy tính vào nhớ vi xử lý/vi điều khiển Nạp chương trình vào nhớ Khi vi xử lý/vi điều khiển cấp nguồn điện lần đầu hay khởi động lại cách kích hoạt vào chân RST vi xử lý/vi điều khiển thực số lệnh bên Một lệnh xuất địa đặc biệt lên bus địa đọc opcode địa Đối với Z80, 8080, 8085 họ MCS-51 địa 0000H Do đó, opcode chương trình cần thực phải đặt vị trí 0000H nhớ chương trình viết chương trình nên sử dụng dẫn ORG 0000H dòng chương trình để báo cho trình dịch hợp ngữ biết chương trình bắt đầu địa 0000H Chương trình nạp vào nhớ thực chất số nhị phân hay hex Trong số này, có số opcode, có số liệu sử dụng lệnh Việc nhầm lẫn thứ tự http://www.ebook.edu.vn Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 lệnh dẫn đến kết không lường trước Phương pháp để phân biệt opcode liệu cần phải biết địa xác opcode tring chương trình nạp chương trình vị trí theo thứ tự II CÁC KIỂU ĐỊNH ĐỊA CHỈ Các kiểu định địa phần cần thiết cho toàn tập lệnh vi xử lý hay vi điều khiển Các kiểu định địa cho phép xác định rõ nguồn đích liệu theo nhiều cách khác mà vi xử lý hay vi điều khiển sử dụng trình thực thi lệnh Có kiểu định địa 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) Định địa ghi - Trong lệnh truy xuất đến ghi R0 ÷ R7 bank ghi tích cực Các lệnh mã hóa dài byte, dùng bit thấp để ghi truy xuất Opcode n2 n1 n0 - Ngoài ra, lệnh truy xuất đến ghi đặc biệt như: ghi tích lũy (ký hiệu A), trỏ liệu (ký hiệu DPTR), đếm chương trình (ký hiệu PC), cờ nhớ (ký hiệu C) cặp ghi AB (ký hiệu AB) Các lệnh không cần bit địa chỉ, thân opcode lệnh ghi dùng Ví dụ: INC R1 ; tăng nội dung ghi R1 lên INC A ; tăng nội dung ghi A lên INC DPTR ; tăng nội dung ghi DPTR lên Định địa trực tiếp - Dùng để truy xuất ô nhớ RAM nội (địa từ 00H ÷ 7FH) hay ghi chức đặc biệt (địa từ 80H ÷ FFH) Một byte thêm vào opcode để xác định địa - Trình dịch hợp ngữ cho phép sử dụng tên ghi chức đặc biệt (thay cho địa chỉ) Opcode Địa trực tiếp Ví dụ: 06H … http://www.ebook.edu.vn … INC ACC ; tăng nội dung ghi A lên Lệnh chức với lệnh INC A khác kiểu định địa → byte mã lệnh khác MOV P0,A ; chuyển nội dung ghi A vaøo Port (≡ MOV 80H,A) INC 30H ; tăng nội dung ô nhớ 30H lên Nội dung 30H ban đầu 06H, sau lệnh (30H) = 07H 30H Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 Định địa gián tiếp - Trong lệnh dùng ghi R0 R1 làm trỏ để địa ô nhớ RAM nội mà lệnh tác động đến Bit thấp mã lệnh xác định ghi dùng Opcode i - Quy ước: dùng dấu @ trước R0 R1 cho kiểu định địa Ví dụ: (R1) = 30H, (30H) = 52H INC @R1 ; tăng nội dung ô nhớ trỏ R1 → (R1) = 30H, (30H) = 53H … … 52H 30H 30H R1 → 53H 30H 30H R1 … … - Kiểu định địa thường dùng truy xuất tới vùng nhớ liên tiếp Ví dụ: Các bước sau thực để xóa 50 ô nhớ RAM nội địa 30H: (R0) = 30H - (@R0) = - Taêng R0 N Đủ 50 byte ? Y Tiếp tục Định địa tức thời - Các liệu tức thời dùng trực tiếp lệnh số, ký số, biểu thức toán học… Trình dịch hợp ngữ tự động tính toán thay liệu tức thời vào mã lệnh Opcode Dữ liệu tức thời - Quy ước: dùng dấu # trước toán hạng tức thời Ví dụ: MOV A,#7 ; nạp giá trị vào ghi A, (A) = 7H MOV A,#7+8 ; nạp giá trị 15 vào ghi A, (A) = 0FH MOV A,#‘B’ ; naïp giá trị 66 (mã ASCII ký tự B) vào ghi A, (A) = 42H Định địa tương đối - Được dùng lệnh nhảy ngắn http://www.ebook.edu.vn Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 - Một địa tương đối (hay gọi offset) giá trị bit có dấu (từ –128 đến +127) cho biết độ lệch từ vị trí lệnh theo sau lệnh nhảy đến đích Giá trị cộng thêm vào ghi đếm chương trình (PC) để tạo địa lệnh cần thực thi Opcode Địa tương đối Ví dụ: Tính offset cho kiểu định địa tương đối hai trường hợp nhảy tới nhảy lùi 010A 0109 0108 0107 0106 0105 0104 0103 0102 0101 0100 00FF Offset tương đối từ địa 0102H “5” 05 80 2043 2042 2041 2040 203F 203E 203D 203C 203B 203A 2039 2038 SJMP 0107H Code memory (a) Nhảy ngắn tới F6 80 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 SJMP 2038H Offset tương đối từ địa 2042H “-10” Code memory (b) Nhảy ngắn lùi Hình 3.1 - Thông thường đích nhảy xác định nhãn trình dịch hợp ngữ xác định offset tương đối tương ứng Ví dụ: Nếu nhãn THERE đặt địa 1040H lệnh: SJMP THERE nhớ chương trình địa 1000H 1001H → địa lệnh 1000H + 02H = 1002H, nên offset tương đối là: offset = 1040H – 1002H = 3EH Trình dịch hợp ngữ gán offset tương đối 3EH cho byte lệnh SJMP THERE - Có ưu điểm không phụ thuộc vào vị trí bị giới hạn tầm nhảy Định địa tuyệt đối - Chỉ dùng lệnh AJMP ACALL - Cho phép rẽ nhánh chương trình trang 2K hành nhớ chương trình (tức tầm nhảy lệnh trang 2K hành nhớ chương trình) - 11 bit thấp địa đích, bit cao (A8 ÷ A10) đưa vào với opcode tạo thành byte thứ lệnh bit thấp (A0 ÷ A7) tạo thành byte thứ lệnh bit cao địa đích bit cao hành đếm chương trình (PC) → lệnh theo sau lệnh rẽ nhánh đích đến phải trang 2K A10 A9 A8 Opcode A7 A0 - Kiểu định địa có tầm nhảy bị hạn chế cung cấp mã phụ thuộc vị trí http://www.ebook.edu.vn Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 FFFF 2K trang 31 F800 ……… Trong trang 2K bất kỳ, có 11 bit thấp thay đổi 1800 17FF 1000 0FFF 0800 07FF 32 x 2K = 64K 2K trang A15 2K trang A10 bit xác định trang 2K 2K trang 0000 A0 11 bit xaùc định địa trang 2K (b) Bên trang 2K (a) Bộ nhớ chia thành nhiều trang 2K Hình 3.2 Ví dụ: Nếu nhãn THERE đặt địa 0F46H lệnh: AJMP THERE nhớ địa 0900H 0901H → lệnh theo sau lệnh nhảy bắt đầu địa 0902H có bit cao địa trùng với địa nhãn THERE 00001 (trang 1) → Mã hoá lệnh: 1 0 0 1 0 1 Định địa dài - Chỉ dùng lệnh LCALL LJMP - Đây lệnh rẽ nhánh byte, với byte sau (byte byte 3) địa đích lệnh (16 bit) Opcode Địa A15 ÷ A8 Địa A7 ÷ A0 …… - Ưu điểm sử dụng toàn vùng nhớ chương trình 64K, lệnh lại dài đến byte phụ thuộc vào vị trí Định địa chỉ số - Dùng địa (chứa ghi PC hay DPTR) offset (chứa ghi A) để tạo địa tác động cho lệnh JMP MOVC (Địa tác động) = (PC) (DPTR) + (A) - Thường dùng truy xuất liệu bảng liệu định nghóa trước Khi đó, ghi PC hay DPTR giữ địa đầu bảng ghi A giữ địa offset liệu cần truy xuất bảng Ví dụ: Bảng giá trị bình phương số nguyên Nếu DPTR chứa địa đầu bảng (tương ứng nhãn TABLE) 10H (A) = 3, sau thực lệnh: 09H MOVC A, @A+DPTR 04H → (A) = 09H 01H TABLE 00H http://www.ebook.edu.vn Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 III TẬP LỆNH (tham khảo thêm “Tóm tắt tập lệnh” “Mô tả lệnh”) Tập lệnh 8051 chia làm nhóm: - Nhóm lệnh số học - Nhóm lệnh logic - Nhóm lệnh chuyển liệu - Nhóm lệnh rẽ nhánh (chuyển điều khiển) - Nhóm lệnh xử lý bit IV CÁC KỸ THUẬT LẬP TRÌNH Lập trình cấu trúc (structured programming) kỹ thuật tổ chức mã hóa chương trình nhằm giảm phức tạp, dễ dàng gỡ rối hiệu chỉnh chương trình Lập trình cấu trúc nhấn mạnh đến nhiệm vụ lập trình Người lập trình phân tích nhiệm vụ lớn thành nhiều công việc nhỏ hơn, sau chi tiết, cụ thể hóa để vấn đề đơn giản Qua đó, tìm cách giải vấn đề dạng thuật giải cụ thể rõ ràng, để minh họa ngôn ngữ giải thuật Trong lập trình cấu trúc, thuật giải gọi chương trình Cách thức phân tích thiết kế ta gọi nguyên lý lập trình từ xuống (topdown), để thể trình suy diễn từ chung cụ thể Tất vấn đề lập trình giải dựa cấu trúc: * Các phát biểu * Các vòng lặp * Các lựa chọn Các phát biểu - Các phát biểu cách thức để thực công việc - Các phát biểu bao gồm việc gán giá trị cho biến gọi chương trình Cấu trúc vòng lặp - Được sử dụng để thực công việc lặp lặp lại nhiều lần - Có hai dạng vòng lặp bản: a.WHILE/DO + Cú pháp: WHILE [điều kiện] DO [các phát biểu] + Lưu đồ: Enter Condition true? Yes No Exit Statement Ví dụ: Viết chương trình SUM tính tổng chuỗi số Các thông số truyền vào chương trình chiều dài chuỗi số (được chứa ghi R7) địa bắt đầu chuỗi số RAM nội (được chứa ghi R0) Kết trả chứa ghi A http://www.ebook.edu.vn Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 Pseudo-code: [sum = 0] WHILE [length > 0] DO Begin [sum = sum + @pointer] [taêng pointer] [giảm length] End Lưu đồ: Giải Enter Sum = Length > ? No Yes Cộng giá trị với sum Exit Tăng pointer Giảm length Mã 8051: SUM: LOOP: STATEMENT: Hoaëc: EXIT: SUM: MORE: SKIP: CLR CJNE JMP ADD INC DEC JMP RET A R7, #0, STATEMENT EXIT A, @R0 R0 R7 LOOP CLR INC DJNZ RET ADD INC SJMP A R7 R7, SKIP A, @R0 R0 MORE b REPEAT…UNTIL Cú pháp: REPEAT [các phát biểu] UNTIL [điều kiện] http://www.ebook.edu.vn Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 Lưu đồ: Enter Statement No Condition true? Yes Exit Ví dụ 1: Viết chương trình để tìm chuỗi kết thúc ký tự Null trỏ ghi R0 xác định xem chuỗi có ký tự Z hay không Kết trả ACC = Z có ký tự Z chuỗi, không ACC = Giải: Pseudo-code: REPEAT [ACC = @pointer] [tăng pointer] Until [ACC == ‘Z’ or ACC == 0] Lưu đồ: Enter Nhận ký tự Tăng pointer Ký tự = “Z” ? No Ký tự = ? No Yes Yes Exit Maõ 8051: STATEMENT: EXIT: http://www.ebook.edu.vn MOV INC JZ CJNE RET A, @R0 R0 EXIT A, #’Z’, STATEMENT 10 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 Ví dụ 2: Viết chương trình lấy 10 byte RAM nội, địa bắt đầu 30H ghi RAM địa bắt đầu 2000H Giải: Cách 1: Dùng vòng lặp CJNE ORG 0000H MOV R0,#30H ; R0 trỏ tới địa 30H RAM nội MOV DPTR,#2000H ; DPTR trỏ tới địa 2000H LOOP:MOV A,@R0 ; ghi nội dung ô nhớ trỏ R0 vào A MOVX @DPTR, A ; ghi nội dung A địa trỏ DPTR INC R0 ; tăng số địa R0 INC DPTR ; tăng số địa DPTR CJNE R0,#3AH,LOOP ; đủ 10 byte chưa? END Cách 2: Dùng vòng lặp DJNZ ORG 0000H MOV R0,#30H ; R0 trỏ tới địa 30H RAM nội MOV DPTR,#2000H ; DPTR trỏ tới địa 2000H MOV R7,#10 ; R7 chứa số lần lặp 10 LOOP:MOV A,@R0 ; ghi nội dung ô nhớ trỏ R0 vào A MOVX @DPTR, A ; ghi nội dung A địa trỏ DPTR INC R0 ; tăng số địa R0 INC DPTR ; tăng số địa DPTR DJNZ R7,LOOP ; đủ 10 byte chưa? END Ví dụ 3: Viết chương trình cộng chuỗi số BCD không nén (unpacked – BCD) cất RAM nội ô nhớ 31H Chiều dài chuỗi chứa ô nhớ 30H Kết (giả sử byte) cất vào ô nhớ 2FH Giải: ORG 0000H MOV R0,#31H ; R0 trỏ tới địa 31H RAM nội CLR A ; ban đầu cho (A) = LOOP:ADD A,@R0 ; cộng nội dung ô nhớ trỏ R0 vào A INC R0 ; tăng số địa R0 DJNZ 30H,LOOP ; hết chuỗi chưa? MOV 2FH,A ; cất kết sau cộng vào ô nhớ 2FH END Ví dụ 4: Viết chương trình đổi ký tự chữ thường ô nhớ từ 30H → 39H RAM nội sang chữ hoa Biết: Ký tự Mã ASCII (Hex) Chữ hoa (‘A’ ÷ ‘Z’) 41H ÷ 5AH Chữ thường (‘a’ ÷ ‘z’) 61H ÷ 7AH Giải: Nhận xét: Để đổi chữ hoa sang chữ thường ta đặt bit (hay cộng thêm 32) mã ASCII chữ hoa Ngược lại, để đổi chữ thường sang chữ hoa ta xóa bit (hay trừ 32) mã ASCII chữ thường http://www.ebook.edu.vn 11 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 ORG 0000H MOV R0,#30H ; R0 trỏ tới địa 30H RAM nội LOOP:XCH A,@R0 ; hoán đổi nội dung A ô nhớ trỏ R0 ANL A,#11011111B ; xóa bit mã ASCII, bit khác giữ nguyên XCH A,@R0 ; cất kết trở lại ô nhớ trỏ R0 INC R0 ; tăng số địa R0 CJNE R0,#3AH,LOOP ; xử lý xong ô nhớ 39H chưa? END Cấu trúc lựa chọn a IF…THEN…ELSE Cú pháp: IF [điều kiện] THEN [phát biểu 1] ELSE [phát biểu 2] Lưu đồ: Enter Yes Condition true? Statement No Statement Exit Ví dụ 1: viết đoạn chương trình nhập ký tự từ RAM có địa 2000H kiểm tra ký tự Nếu ký tự nhận loại mã ASCII hiển thị (có giá trị khoảng 20H → 7EH) xuất lại nó, không xuất lại ký tự ‘.’ RAM địa 2001H Lưu đồ: Enter Nhập ký tự từ RAM 2000H Yes Ký tự hiển thị ? Xuất lại ký tự RAM 2001H Xuất ký tự ‘.’ RAM 2001H Exit http://www.ebook.edu.vn No 12 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 Pseudo-code: [nhập ký tự] IF [ký tự == graphic] THEN [xuất lại ký tự] ELSE [xuất ký tự ‘.’] Mã 8051: ENTER: ACALL INCH ACALL ISGRPH JNC STMENT2 STMENT1: ACALL OUTCH JMP EXIT STMENT2: MOV A, #’.’ ACALL OUTCH EXIT: (tiếp tục) Hay ACALL INCH ACALL ISGRPH JC SKIP MOV A, #’.’ SKIP: ACALL OUTCH (tiếp tục) Ví dụ 2: Viết chương trình kiểm tra khối liệu RAM có chiều dài 100 byte địa 1000H xem có giá trị chẵn lẻ Số giá trị chẵn lẻ lưu tương ứng ô nhớ 30H 31H Giải: Cách 1: ORG 0000H MOV DPTR,#1000H ; DPTR trỏ tới địa 1000H MOV R7,#100 ; R7 chứa số lần lặp 100 LOOP: MOVX A,@DPTR ; đọc ô nhớ trỏ DPTR vào A để kiểm tra JB ACC.0,ODD ; (ACC.0) = → số lẻ INC 30H ; (ACC.0) = → số chẳn SJMP CONT ; xét byte ODD: INC 31H CONT: INC DPTR ; tăng số địa DPTR DJNZ R7,LOOP ; đủ 100 byte chưa? END Cách 2: Có thể thay dòng lệnh JB ACC.0, ODD bằng: ANL A,#01H JNZ ODD Ví dụ 3: Viết chương trình tên COMPARE_8 so sánh số nhị phân bit ghi A với giá trị chuẩn ô nhớ RAM nội có địa 30H Kết trả về: + Nếu (A) > (30H) xóa P1.0 + Nếu (A) = (30H) xóa P1.1 + Nếu (A) < (30H) xóa P1.2 Giải: http://www.ebook.edu.vn 13 Bài giảng VI XỬ LÝ Hướng dẫn: Chương 3: Lập trình hợp ngữ họ MCS-51 Sử dụng lệnh so sánh CJNE: CJNE arg1, arg2, arg3 Nếu arg1 ≥ arg2 C = Nếu arg1 < arg2 C = Giải thuật: COMPARE_8 (A) = (30H) N Y N (C) = Y Xóa P1.1 Xóa P1.0 Xóa P1.2 RET Chương trình: COMPARE_8: CJNE A,30H,NOT_EQUAL CLR P1.1 SJMP EXIT NOT_EQUAL: JNC GREATER CLR P1.2 SJMP EXIT GREATER: CLR P1.0 EXIT: RET b CASE Cú pháp: CASE [biểu thức] OF 0: [phát biểu 0] 1: [phát biểu 1] 2: [phát biểu 2] n: [phát biểu n] [phát biểu mặc định] END_CASE Lưu đồ: http://www.ebook.edu.vn 14 ; (A) # (30H) ; (A) = (30H) ; (C) = → (A) > (30H) ; (C) = → (A) < (30H) Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 Enter Biểu thức ? No Biểu thức ? No Biểu thức ? No Biểu thức n ? Yes Yes Yes Yes Phát biểu Phát biểu Phát biểu No Phát biểu n Phát biểu mặc định Exit Ví dụ: Một chương trình yêu cầu đáp ứng 0, 1, 2, user để chọn bốn hành động Viết đoạn chương trình nhập ký tự từ bàn phím nhảy đến ACT0, ACT1, ACT2 ACT3, phụ thuộc vào đáp ứng user Bỏ qua việc kiểm tra lỗi Pseudo-code: [nhập ký tự] CASE [ký tự] OF ‘0’: [hành động 0] ‘1’: [hành động 1] ‘2’: [hành động 2] ‘3’: [hành động 3] END_CASE Lưu đồ: Enter Nhập ký tự Ký tự = ‘0’ ? No Ký tự = ‘1’ ? Ký tự = ‘2’ ? No No Ký tự = ‘3’ ? Yes Yes Yes Yes Hành động Hành động Hành động Hành động Exit Maõ 8051 ACT0: SKIP1: CALL INCH CJNE A, #’0’, SKIP1 CJNE A, #’1’, SKIP2 http://www.ebook.edu.vn 15 No Bài giảng VI XỬ LÝ ACT1: SKIP2: ACT2: SKIP3: ACT2: EXIT: Hay Chương 3: Lập trình hợp ngữ hoï MCS-51 CJNE A, #’2’, SKIP3 CJNE A, #’3’, EXIT (tieáp tuïc) CALL INCH ANL A, #3 RL A MOV DPTR, #TABLE JMP @A+DPTR TABLE: AJMP ACT0 AJMP ACT1 AJMP ACT2 ACT3: JMP EXIT ACT0: JMP EXIT ACT1: JMP EXIT ACT2: EXIT: (tiếp tục) Kỹ thuật tạo trễ Ví dụ 1: Viết chương trình tên DELAY_100 để tạo trễ (trì hoãn) 100 μs Giả sử dùng thạch anh 12 MHz (fOSC = 12 MHz) Giải: Hướng dẫn: Dùng thời gian thực thi lệnh để tính thời gian tạo trễ cần thiết fOSC = 12 MHz → fM = fOSC / 12 = MHz → TM = μs Cách 1: Dùng lệnh NOP DELAY_100: ; dùng 98 lệnh NOP → 98 μs http://www.ebook.edu.vn 16 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ hoï MCS-51 NOP NOP … NOP RET ; μs → 98 + = 100 μs Cách 2: Dùng vòng lặp để chương trình ngắn gọn DELAY_100: MOV R7,#49 ; μs LOOP: DJNZ R7,LOOP ; μs / leänh → x 49 = 98 μs RET ; μs Tổng quát: DELAY_T: MOV R7,#N ; TM, N ≤ 255 LOOP: DJNZ R7,LOOP ; TM / leänh → (2 x N) TM RET ; TM → tổng thời gian tạo trễ: T = [(1 + x N + 2)TM] ≅ [(2 x N) TM] μs Chú ý: Lệnh LOOP: DJNZ R7, LOOP tương đương với lệnh DJNZ R7,$ Dấu $ ký hiệu đặc biệt trình dịch hợp ngữ ASM51 để tham chiếu vị trí lệnh hành Ví dụ 2: Viết chương trình tên DELAY_10ms để tạo trễ 10 ms Giả sử dùng thạch anh 12 MHz (fOSC = 12 MHz) Giải: Thời gian cần tạo treã: T = 10 ms = 10000 μs = 10000 TM Nếu dùng vòng lặp ví dụ thời gian tạo trễ tối đa khoảng ≅ x 255 = 510μs < 10000μs Như cần dùng vòng lặp lồng Chương trình: DELAY_10ms: MOV R7,#20 ; μs LOOP: MOV R6,#250 ; μs DJNZ R6,$ ; μs / leänh DJNZ R7,LOOP ; μs / lệnh RET ; μs → tổng thời gian tạo trễ: T = + 20(1 + x 250 + 2) + = 10063 μs ≅ 10000 μs Tổng quát: DELAY_T: MOV R7,#M ; TM LOOP: MOV R6,#N ; TM DJNZ R6,$ ; TM / leänh DJNZ R7,LOOP ; TM / lệnh RET ; TM → tổng thời gian tạo trễ: T = [1 + M(1 + x N + 2) + 2]TM ≅ [(2 x M x N)TM] μs Ví dụ 3: Viết chương trình tạo sóng vuông tuần hoàn đối xứng chân P1.0 có tần số f= 10 KHz Giả sử fOSC = 12 MHz Giaûi: fOSC = 12 MHz → fM = fOSC / 12 = MHz → TM = μs http://www.ebook.edu.vn 17 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 f = 10 KHz → T = 0,1 ms = 100 μs Sóng vuông đối xứng → tH = tL = 50 μs = 50TM T tH tL Chương trình: LOOP: ORG 0000H CPL P1.0 MOV R7,#23 DJNZ R7,$ SJMP LOOP END http://www.ebook.edu.vn ; μs ; μs ; x 23 = 46 μs ; μs 18 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 CÂU HỎI VÀ BÀI TẬP CHƯƠNG 3.1 Hãy cho biết cách định địa lệnh sau: a.MOV R1,A b.MOV A,#12H c.MOV A,@R1 d.PUSH B e.MOV A,12H f.SJMP LOOP g.ACALL SUB1 h.LJMP 0567H 3.2 Để nạp vào R4 giá trị 56H có cần dấu ‘#’ lệnh: MOV R4,#56H không? 3.3 Sự khác biệt lệnh sau gì? INC A INC ACC 3.4 Hãy xác định offset tương đối cho lệnh: SJMP AHEAD Biết lệnh đặt địa 0400H 0401H, nhãn AHEAD đặt địa 041FH 3.5 Hãy xác định offset tương đối cho lệnh: SJMP BACK Biết lệnh đặt địa A050H A051H, nhãn BACK đặt địa 9FE0H 3.6 Giả sử lệnh: AJMP THERE nhớ chương trình địa 2FF0H 2FF1H, nhãn THERE địa 2F96H Hãy xác định byte mã máy lệnh trên? 3.7 Giả sử ghi A chứa 5AH Hãy cho biết giá trị ghi A sau thực lệnh sau: XRL A,#0FFH Hãy tìm lệnh khác tương đương với lệnh trên? 3.8 Giả sử ghi A chứa 50H ghi PSW chứa 0CH Hãy cho biết giá trị ghi A sau thực lệnh sau: RLC A 3.9 Hãy xác định nội dung ghi A sau thực chuỗi lệnh sau: a MOV A,#25 b MOV A,#7FH MOV R7,#18H MOV 50H,#29H ADD A,R7 MOV R0,#50H XCHD A,@R0 3.10 Cho biết giá trị cờ CY sau thực đoạn mã sau: a CLR C b MOV A,#54H c MOV A,#250 CPL C ADD A,#0C4H ADD A,#05 3.11 Các lệnh sau không hợp lệ: 1.MOV R7,#500 2.MOV A,50H 3.ADD A,R5 4.ADD R3,A 5.MOV R1,#50 6.MOV A,#F5H 7.ADD A,#50H 8.MOV @R1,R7 9.PUSH A 10.MOV A,@R3 11.MOV R7,#00 12.MOV R6,R7 3.12 Cho nội dung ô nhớ ghi: (30H) = 12H; (B) = 34H; (A) = 05H Hãy xác định nội dung ô nhớ 30H, ghi A B sau thực thi đoạn chương trình sau: MOV R1,#30H XCH A,B XCHD A,@R1 SWAP A XCHD A,@R1 SWAP A 3.13 Xét đoạn chương trình sau: http://www.ebook.edu.vn 19 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 MOV R0,#20H MOV R1,#30H MOV R2,#2 ; * CLR C NEXT: MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R2,NEXT a Sau thực lệnh thứ (có thích *), nội dung R0, R1 R2 bao nhiêu? b Lệnh có nhãn NEXT thực thi lần? c Sau hoàn tất chương trình nội dung R0, R1 R2 bao nhiêu? d Cho nội dung ô nhớ ban đầu là: (20H) = 23H, (21H) = 45H, (30H) = 67H, (31H) = 89H: • Cho biết nội dung ô nhớ sau thực thi xong chương trình trên? • Chức chương trình trên? 3.14 Xét chương trình sau: ORG 0000H MOV R0,#05H MOV R1,#40H MOV R2,#0 ; * MOV @R1,#0 AGAIN: MOV DPTR,#TABLE MOV A,R2 MOVC A,@A+DPTR ADD A,@R1 MOV @R1,A INC R2 DJNZ R0,AGAIN AJMP EXIT TABLE: DB 10H,11H,12H,13H,14H EXIT: NOP END a Sau thực lệnh có thích *, nội dung R0, R1 R2 bao nhiêu? b Lệnh có nhãn AGAIN thực thi lần? c Sau hoàn tất chương trình nội dung R0, R1 R2 bao nhiêu? d Nội dung ô nhớ 40H sau thực thi xong chương trình trên? e Chức chương trình trên? f Nếu kết chương trình cất vào ô nhớ 50H lệnh cần sửa đổi? 3.15 Viết đoạn chương trình xóa 20 byte ô nhớ RAM nội địa 30H 3.16 Viết đoạn chương trình xóa 100 byte ô nhớ RAM địa 1000H 3.17 Viết đoạn chương trình đọc 20 byte ô nhớ RAM địa 2000H ghi vào RAM nội địa 30H 3.18 Viết chương trình TINHTB_3SO tính giá trị trung bình số nguyên dương chứa ô nhớ 30H, 31H 32H Kết (phần nguyên) chứa ghi R7 Giả sử tổng số không lớn 255 http://www.ebook.edu.vn 20 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 3.19 Viết chương trình cộng số 16 bit không dấu, số hạng cất R7_A (R7: byte cao, A: byte thấp), số hạng cất ô nhớ 31H_30H (31H: byte cao, 30H: byte thấp) Kết trả cất R7_A 3.20 Viết chương trình trừ số 16 bit không dấu, số bị trừ cất R7_A (R7: byte cao, A: byte thấp), số trừ cất ô nhớ 31H_30H (31H: byte cao, 30H: byte thấp) Kết trả cất R7_A 3.21 * Viết chương trình nhân số 16 bit cất R7_A (R7: byte cao, A: byte thấp) với số bit cất B Kết trả 24 bit cất R7_B_A 3.22 * Viết chương trình chia số 16 bit cất R7_A (R7: byte cao, A: byte thấp) cho số bit cất B Kết quả: thương số cất R7_A, dư số cất B 3.23 Viết chương trình lấy bù số 16 bit cất R7_A (R7: byte cao, A: byte thấp) Kết trả cất R7_A 3.24 Viết chương trình BINTOBCD chuyển số nhị phân A sang số BCD digit (ký số) cất ô nhớ 32H, 31H 30H (32H: trăm, 31H: chục, 30H: đơn vị) 3.25 Viết chương trình BCDTOBIN chuyển số BCD không nén (2 ký số) A sang số nhị phân cất ô nhớ 30H 3.26 * Viết chương trình BCDTOBIN16 chuyển số nhị phân 16 bit R7_A (R7: byte cao, A: byte thấp) sang số BCD digit cất ô nhớ theo thứ tự từ chục ngàn đến đơn vị là: 34H_33H_32H_31H_30H 3.27 Viết chương trình đổi ký tự chữ hoa ô nhớ 30H → 3FH RAM nội sang chữ thường 3.28 Viết chương trình đổi ký tự chữ hoa ô nhớ 30H → 3FH RAM nội sang chữ thường ngược lại 3.29 Viết chương trình SOSANH16 so sánh số 16 bit không dấu cất R7_A (R7: byte cao, A: byte thấp) với số 16 bit không dấu làm giá trị chuẩn cất ô nhớ 31H_30H (31H: byte cao, 30H: byte thấp) Kết trả về: - (C) = neáu (R7_A) < (31H_30H) - (C) = (R7_A) ≥ (31H_30H) Lưu ý: phải bảo toàn nội dung ghi ô nhớ 3.30 Viết chương trình kiểm tra khối liệu RAM có chiều dài 200 byte địa 1000H xem có byte có giá trị Kết (số byte có giá trị 0) lưu vào ô nhớ có địa 0FFFH RAM 3.31 Viết chương trình kiểm tra khối liệu RAM có chiều dài 50 byte địa 2000H xem có byte có giá trị 0, dương âm Kết lưu vào ô nhớ RAM nội sau: - Ô nhớ 30H: chứa số byte - Ô nhớ 31H: chứa số byte dương - Ô nhớ 32H: chứa số byte âm 3.32 Viết chương trình tên DELAY_500 tạo trễ 500μs, biết fOSC = 12 MHz 3.33 Viết chương trình tên DELAY_20ms tạo trễ 20ms, biết fOSC = 12 MHz 3.34 Viết chương trình tên DELAY_1s tạo trễ 1s, biết fOSC = 12 MHz 3.35 Viết chương trình xuất chuỗi xung vuông đối xứng có tần số f = 1KHz chân P1.0 3.36 Viết chương trình xuất chuỗi xung vuông chân P1.0 với tần số f = 10KHz, duty cycle = 30% (thời gian mức cao = 30% thời gian chu kì xung) http://www.ebook.edu.vn 21 Bài giảng VI XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 3.37 Viết chương trình điều khiển đèn giao thông ngã tư đường (đèn xanh sáng 4s, đèn vàng sáng 1s, đèn đỏ sáng 5s) Dùng port để điều khiển đèn với quy định xuất mức logic đèn sáng: Chân Đèn đường Chân Đèn đường P1.0 Xanh P1.3 Xanh P1.1 Vàng P1.4 Vàng P1.2 Đỏ P1.5 Đỏ 3.38 Cho mạch kết nối sau: +5V D1 13 14 17 18 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 +5V 11 D1 D2 D3 D4 D5 D6 D7 D8 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 12 15 16 19 LE OE D2 D3 D4 D5 D6 330 x D7 74HC373 D8 8051 a Haõy viết chương trình để sáng LED theo chiều D1 → D8 lặp lại, thời gian sáng LED 0,2s b Tương tự câu a theo chiều D8 → D1 c Kết hợp câu a b: sáng theo chiều D1 → D8 D8 → D1 lặp lại d Hãy viết chương trình để LED sáng lan tỏa theo chiều D1 → D8 tắt dần theo chiều D1 → D8 lặp lại, thời gian cách LED 0,2s e Tương tự câu d theo chiều từ D8 → D1 +5V P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 13 14 17 18 +5V 11 D1 D2 D3 D4 D5 D6 D7 D8 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 a b c d e f g 12 15 16 19 330x8 LE OE 74HC373 8051 3.39 Cho mạch kết nối sau: Hãy viết chương trình để xuất giá trị BCD ô nhớ 30H LED đoạn http://www.ebook.edu.vn 22 ... Các dẫn trình dịch hợp ngữ lệnh trình dịch hợp ngữ dùng để định nghóa cấu trúc chương trình, ký hiệu, liệu, số… Các điều khiển trình dịch hợp ngữ thiết lập chế độ trình dịch hợp ngữ luồng hợp dịch... chương trình hợp ngữ Một chương trình hợp ngữ bao gồm: - Các lệnh (instruction) vi xử lý/vi điều khiển - Các dẫn (directive) trình dịch hợp ngữ - Các điều khiển (control) trình dịch hợp ngữ -... XỬ LÝ Chương 3: Lập trình hợp ngữ họ MCS-51 3. 19 Viết chương trình cộng số 16 bit không dấu, số hạng cất R7_A (R7: byte cao, A: byte thấp), số hạng cất ô nhớ 31 H _30 H (31 H: byte cao, 30 H: byte thấp)

Ngày đăng: 25/10/2013, 04:15

Hình ảnh liên quan

- Lưu đồ chương trình là biểu diễn bằng hình ảnh thứ tự các thao tác cần làm để giải quyết một vấn để cụ thể - Lập trình hợp ngữ họ MCS-51_chương 3

u.

đồ chương trình là biểu diễn bằng hình ảnh thứ tự các thao tác cần làm để giải quyết một vấn để cụ thể Xem tại trang 1 của tài liệu.
Hình 3.1 - Lập trình hợp ngữ họ MCS-51_chương 3

Hình 3.1.

Xem tại trang 6 của tài liệu.
- Thường dùng khi truy xuất dữ liệu trong một bảng dữ liệu đã được định nghĩa trước. Khi đó, thanh ghi PC hay DPTR sẽ giữ địa chỉ đầu bảng và thanh ghi A  - Lập trình hợp ngữ họ MCS-51_chương 3

h.

ường dùng khi truy xuất dữ liệu trong một bảng dữ liệu đã được định nghĩa trước. Khi đó, thanh ghi PC hay DPTR sẽ giữ địa chỉ đầu bảng và thanh ghi A Xem tại trang 7 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan