(NB) Giáo trình Vi điều khiển với mục tiêu giúp các bạn có thể 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 ra hư hỏng xảy ra trong thực tế; Mời các bạn cùng tham khảo nội dung giáo trình phần 1 dưới đây.
ỦY BAN NHÂN DÂN THÀNH PHỐ HÀ NỘI TRƯỜNG CAO ĐẲNG NGHỀ VIỆT NAM - HÀN QUỐC THÀNH PHỐ HÀ NỘI TRỊNH THỊ HẠNH(Chủ biên) TẠ VĂN BẰNG – BÙI VĂN CƠNG GIÁO TRÌNH VI ĐIỀU KHIỂN Nghề: Cơ điện tử Trình độ: Cao đẳng (Lưu hành nội bộ) Hà Nội - Năm 2019 LỜI NÓI ĐẦU Để cung cấp tài liệu học tập cho học sinh - sinh viên tài liệu cho giáo viên giảng dạy, Điện tử Trường CĐN Việt Nam - Hàn Quốc thành phố Hà Nội chỉnh sửa, biên soạn giáo trình “VI ĐIỀU KHIỂN” dành riêng cho học sinh sinh viên nghề Cơ điện tử Đây mô đun chương trình đào tạo nghề Cơ điện tử trình độ Cao đẳng Nhóm biên soạn tham khảo tài liệu: “vi điều khiển ” dùng cho sinh viên Trường Cao đẳng, Đại học kỹ thuật tác giả Sổ tay linh kiện điện tử cho người thiết kế mạch Giáo trình linh kiện điện tử ứng dụng Sổ tay tra cứu tranzito Nhật Bản (Nguyễn Kim Giao, Lê Xuân Thế Kỹ thuật VXL & lập trình ASSEMBLY cho hệ VXL - Đỗ Xuân Tiến – NXB KH&KT - 200 Họ VĐK 8051 Tống Văn On & Hoàng Đức Hải - NXB LĐXH – 2001 nhiều tài liệu khác Mặc dù nhóm biên soạn có nhiều cố gắng khơng tránh thiếu sót Rất mong đồng nghiệp độc giả góp ý kiến để giáo trình hồn thiện Xin chân thành cảm ơn! Hà Nội, ngày … tháng … năm 2019 Chủ biên: Trịnh Thị Hạnh MỤC LỤC LỜI NÓI ĐẦU MỤC LỤC GIÁO TRÌNH MƠ ĐUN Bài Cấu trúc họ vi điều khiển 8051 Mục tiêu 1.1 Tổng quan 1.2 Sơ đồ chân 1.3 Cấu trúc Port I/O 1.4 Tổ chức nhớ 11 1.5 Các ghi chức đặc biệt 17 1.7 Các cải tiến 8032/8052 28 1.8 Hoạt động Reset 28 1.9 Thực hành ứng dụng 29 Bài 36 Tập lệnh 8051 36 2.1 Mở đầu 36 2.2 Các cách định địa 39 2.3 Các nhóm lệnh 45 2.4 Thực hành 74 Bài 82 Bộ định thời 82 3.1 Mở đầu 82 3.2 Thanh ghi SFR timer 84 3.3 Các chế độ làm việc 86 3.4 Nguồn cung cấp xung cho Timer 88 3.5 Khởi tạo truy xuất ghi Timer 88 3.6 Thực hành 91 Bài 97 Cổng nối tiếp 97 4.1 Thanh ghi điều khiển 97 4.2 Chế độ làm việc 98 4.3 Khởi tạo truy xuất ghi PORT nối tiếp 104 4.4 Truyền thông đa xử lý 106 4.5 Thực hành 113 TÀI LIỆU THAM KHẢO 127 GIÁO TRÌNH MƠ ĐUN Tên mơ đun: Vi điều khiển Mã số mô đun: MĐ 43 Thời gian mô đun: 60 (LT: 18 giờ; TH/TT/TN/BT/TL: 42 giờ) I Vị trí, tính chất mơ đun - Vị trí: Mơ đun Vi điều khiển mơ đun bố trí dạy sau học xong môn học mô đun: Kỹ thuật xung số điện tử bản, điện tử nâng cao, điện tử công suất, học trước môn vi mạch số lập trình - Tính chất: Là mơ đun chun môn nghề II Mục tiêu mô đun - Kiến thức: + Vận hành thiết bị dây chuyền sản xuất dùng vi điều khiển + Xác định nguyên nhân gây hư hỏng xảy thực tế - Kỹ + Kiểm tra viết chương trình điều kiển + Trình bày cấu trúc, ứng dụng vi điều khiển công nghiệp + Kiểm tra viết chương trình điều kiển +Vận hành thiết bị dây chuyền sản xuất dùng vi điều khiển + Xác định nguyên nhân gây hư hỏng xảy thực tế - Năng lực tự chủ, trách nhiệm: + Rèn luyện thái độ nghiêm túc, cẩn thận, xác học tập thực cơng việc III Nội dung mô đun Nội dung tổng quát phân bổ thời gian Thời gian Số TT Tên mô đun Cấu trúc họ vi điều khiển 8051 Tổng số Lý thuyết Thực hành Kiểm tra+ 12 6 18 12 18 12 1 Tổng quan Sơ đồ chân Cấu trúc Port I/O Tổ chức nhớ Các ghi chức đặc biệt Bộ nhớ Các cải tiến 8032/8052 Hoạt động Reset Thực hành ứng dụng Tập lệnh 8051 Mở đầu Các cách định địa Các nhóm lệnh Thực hành Kiểm tra Bộ định thời Mở đầu Thanh ghi SFR timer Các chế độ làm việc Nguồn cung cấp xung cho Timer Khởi động, dừng, điều khiển Timer Thực hành Kiểm tra Cổng nối tiếp 12 11 1 Thanh ghi điều khiển Chế độ làm việc Khởi tạo truy suất ghi PORT nối tiếp Truyền thông đa xử lý Thực hành Kiểm tra Cộng 60 18 39 Bài Cấu trúc họ vi điều khiển 8051 Mục tiêu - Mô tả cấu trúc họ vi điều khiển chuẩ công nghiệp - Thực truy xuất nhớ liệu, nhớ chương trình qui trình kỹ thuật - Thực kỹ thuật phương pháp mở rộng nhớ - Trình bày nguyên lý hoạt động mạch reset - Nghiêm túc, cẩn thận, xác học tập thực công việc 1.1 Tổng quan Khoa học kỹ thuật ngày phát triển mạnh mẽ, công nghệ thuộc lĩnh vực khác nhờ đời nhằm đáp ứng nhu cầu xã hội kỹ thuật Vi điều khiển nằm số Hiện kỹ thuật Vi xử lý giảng dạy rộng rãi trường Đại học Cao đẳng nước, nhiên lĩnh vực Vi điều khiển mẻ, ứng dụng chưa khai thác triệt để hệ thống điều khiển, đo lường điều chỉnh dây chuyền cơng nghiệp Qua q trình tham gia giảng dạy trường Đại học SPKT Hưng yên thời gian học tập nâng cao CHLB Đức, tác giả tập trung nghiên cứu biên soạn giáo trình kỹ thuật Vi điều khiển nhằm phục vụ công việc giảng dạy lĩnh vực trường Toàn nội dung giáo trình chia làm phần Phần bao gồm kiến thức phần cứng tập lệnh họ Vi điều khiển 80C51/ AT89C51 phần tác giả tập trung trình bày phần cứng họ Vi điều khiển 80C52/ AT89S8252 kỹ thuật lập trình hợp ngữ Đối tượng giáo trình sinh viên ngành Điện, Điện tử, Cơ điện tử, Công nghệ thông tin Tuy nhiên để tiếp thu tốt nội dung từ giáo trình này, người học cần có kiến thức kỹ thuật số, kỹ thuật mạch điện tử biết qua ngơn ngữ lập trình cấp cao Pascal, C… Mặc dù cố gắng trình biên soạn, trình độ thời gian cịn bị hạn chế nên chắn giáo trình khơng tránh khỏi thiếu sót, mong nhận ý kiến đóng góp, phê bình bạn đọc 1.2 Sơ đồ chân Hình 1.1 IC 80C51/AT89C51 Hình 1.1 sơ đồ chân 8051 Chức chân tín hiệu sau: - P0.0 đến P0.7 chân cổng - P1.0 đến P1.7 chân cổng - P2.0 đến P2.7 chân cổng - P3.0 đến P3.7 chân cổng - RxD: Nhận tín hiệu kiểu nối tiếp - TxD: Truyền tín hiệu kiểu nối tiếp - /INT0: Ngắt - /INT1: Ngắt - T0: Chân vào Timer/Counter - T1: Chân vào Timer/Counter - /Wr: Ghi liệu vào nhớ - /Rd: Đọc liệu từ nhớ - RST: Chân vào Reset, tích cực mức logic cao khoảng chu kỳ máy - XTAL1: Chân vào mạch khuyếch đaị dao động - XTAL2: Chân từ mạch khuyếch đaị dao động - /PSEN : Chân cho phép đọc nhớ chương trình ngồi (ROM ngồi) - ALE (/PROG): Chân tín hiệu cho phép chốt địa để truy cập nhớ ngoài, On-chip xuất byte thấp địa Tín hiệu chốt kích hoạt mức cao, tần số xung chốt = 1/6 tần số dao động VĐK Nó dùng cho Timer ngồi cho mục đích tạo xung Clock Đây chân nhận xung vào để nạp chương trình cho Flash (hoặc EEPROM) bên On-chip mức thấp - /EA/Vpp: Cho phép On-chip truy cập nhớ chương trình ngồi /EA=0, /EA=1 On-chip làm việc với nhớ chương trình nội trú Khi chân cấp nguồn điện áp 12V (Vpp) On-chip đảm nhận chức nạp chương trình cho Flash bên - Vcc: Cung cấp dương nguồn cho On-chip (+ 5V) - GND: nối mát 1.3 Cấu trúc Port I/O 1.3.1 Port - Port (P0.0 – P0.7) có số thứ tự chân từ 32 – 39 Port có hai chức năng: - Port xuất/nhập liệu (P0.0 - P0.7) cho thiết kế vi điều khiển khơng sử dụng nhớ bên ngồi - Bus địa byte thấp bus liệu đa hợp (AD0 – AD7) cho thiết kế vi điều khiển có sử dụng nhớ bên ngồi - Khi ALE = Port đóng vai trị bus liệu (D0 – D7) Sau thực thi lệnh MOV P1.3, C ta có kết sau: Cờ CY = 1, (P1) = CDH g Lệnh JB bit, rel Chức năng: Nhảy bit Mô tả: Nếu bit lệnh nhảy đến địa lệnh cịn ngược lại tiếp tục với lệnh Các cờ không bị ảnh hưởng (xem chi tiết Bảng 3.3.1), bit kiểm tra không bị thay đổi Ví dụ 1: Giả sử cho trước (A) = 56H, (P1) = CAH Sau thực thi chuỗi lệnh: JB P1.2, AAA JB ACC.2, BBB chương trình tiếp tục với lệnh nhãn BBB, (P1) = CAH (A) = 56H h Lệnh JNB bit, rel Chức năng: Nhảy bit Mô tả: Nếu bit lệnh nhảy đến địa lệnh ngược lại tiếp tục với lệnh Các cờ khơng bị ảnh hưởng Ví dụ 1: Giả sử cho trước (A) = 56H, (P1) = CAH Sau thực thi chuỗi lệnh: JNB P1.3, AAA JNB ACC.3, BBB chương trình tiếp tục với lệnh nhãn BBB, (A) = 56H (P1) = CAH 67 i Lệnh JBC bit, rel Chức năng: Nhảy bit xóa bit (làm cho bit = 0) Mơ tả: Nếu bit lệnh xóa bit rẽ nhánh đến địa cho lệnh cịn ngược lại tiếp tục với lệnh Bit khơng xóa bit Các cờ khơng bị ảnh hưởng Ví dụ 1: Giả sử cho trước (A) = 56H Sau thực thi chuỗi lệnh: JBC ACC.3, AAA JBC ACC.2, BBB chương trình tiếp tục với lệnh nhãn BBB (A) = 52H k Lệnh JC rel Chức năng: Nhảy cờ CY = Mô tả: Nếu cờ CY = nhảy đến địa cho lệnh cịn ngược lại tiếp tục với lệnh Các cờ không bị ảnh hưởng Lưu đồ: Ví dụ 1: Giả sử cho trước (A) = 7FH, cờ CY = Sau thực thi chuỗi lệnh: JC AAA ADD A,#0F7H JC BBB chương trình tiếp tục với lệnh nhãn BBB, (A) = 76H, cờ CY = j Lệnh JNC rel Chức năng: Nhảy cờ CY = 68 Mô tả: Nếu cờ CY = nhảy đến địa cho lệnh cịn ngược lại tiếp tục với lệnh Các cờ không bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Lưu đồ: Ví dụ 1: Giả sử cho trước (A) = 7FH, cờ CY = Sau thực thi chuỗi lệnh: JNC AAA ADD A,#26H JNC BBB chương trình tiếp tục với lệnh nhãn BBB, (A) = A5H, cờ CY = 2.3.5 Nhóm lệnh rẽ nhánh a Lệnh ACALL addr11 Chức năng: Gọi đến địa tuyệt đối (Absolute CALL) Mơ tả: Gọi khơng điều kiện chương trình đặt địa lệnh (xem thêm giải thích chương trình phần lệnh RET) Chú ý rằng, chương trình gọi phải bắt đầu khối 2KB nhớ chương trình với byte lệnh theo sau lệnh ACALL Các cờ khơng bị ảnh hưởng Ví dụ 1: Giả sử cho trước (SP) = 07H, lệnh ACALL vị trí 0123H nhãn AAA vị trí 0345H nhớ chương trình Lệnh lệnh ACALL vị trí 0125H Sau thực thi lệnh ACALL AAA ta có kết sau: (SP) = 09H, (PC) = 0345H ô nhớ RAM bên (08H) = 23H, (09H) = 01H 69 b Lệnh LCALL addr16 Chức năng: Gọi chương trình (Long CALL) Mơ tả: Gọi chương trình với địa bắt đầu chương trình lệnh (xem thêm giải thích chương trình phần lệnh RET) Chú ý rằng, chương trình bắt đầu nơi không gian nhớ chương trình 64KB Các cờ khơng bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Ví dụ: Giả sử cho trước (SP) = 07H, lệnh LCALL vị trí 0123H nhãn AAA vị trí 1234H nhớ chương trình Lệnh lệnh ACALL vị trí 0126H Sau thực thi lệnh LCALL AAA ta có kết sau: (SP) = 09H, (PC) = 1234H ô nhớ RAM bên (08H) = 26H, (09H) = 01H c Lệnh RET Chức năng: Trở từ chương trình (RETurn) Mơ tả: Lấy lại byte cao byte thấp ghi PC từ vùng nhớ ngăn xếp, giảm trỏ ngăn xếp đơn vị Việc thực thi chương trình tiếp tục với lệnh địa chứa ghi PC, trường hợp tổng quát lệnh nằm sau lệnh ACALL LCALL Các cờ không bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Ví dụ 1: Dựa vào Ví dụ phần 3.5.1 Giả sử cho trước (SP) = 09H; ô nhớ RAM bên (08H) = 25H (09H) = 01H Sau thực thi lệnh RET ta có kết sau: (SP) = 07H Chương trình tiếp tục với lệnh địa 0125H (vị trí lệnh lệnh ACALL) d Lệnh RETI Chức năng: Trở từ chương trình phục vụ ngắt Mơ tả: Lấy lại byte cao byte thấp ghi PC từ vùng nhớ ngăn xếp, phục hồi trạng thái logic ngắt để nhận ngắt khác có ưu tiên ngắt với ngắt vừa xử lý Con trỏ ngăn xếp giảm xuống đơn vị Khơng có ghi khác bị ảnh hưởng; PSW không tự động phục hồi trở lại trạng 70 thái trước xử lý ngắt Việc thực thi chương trình tiếp tục với lệnh địa chứa ghi PC, trường hợp tổng quát lệnh sau điểm mà yêu cầu ngắt phát Nếu có ngắt có mức ưu tiên ngắt thấp mức ưu tiên ngắt trì lệnh RETI thực thi, lệnh thực thi trước ngắt trì xử lý e Lệnh AJMP addr11 Chức năng: Nhảy đến địa tuyệt đối (Absolute JuMP) Mô tả: Chuyển việc thực thi chương trình đến địa lệnh Chú ý rằng, đích nhảy đến phải khối 2K nhớ chương trình với byte lệnh theo sau lệnh AJMP Các cờ không bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Ví dụ: Giả sử cho trước lệnh AJMP vị trí 0345H nhãn AAA vị trí 0123H nhớ chương trình Sau thực thi lệnh AJMP AAA ta có kết sau: (PC) = 0123H f Lệnh LJMP addr16 Chức năng: Nhảy dài (Long JuMP) Mô tả: Tạo rẽ nhánh không điều kiện đến địa lệnh Chú ý rằng, địa đích nơi không gian địa nhớ chương trình 64KB Các cờ khơng bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Ví dụ: Giả sử cho trước lệnh LJMP vị trí 0123H nhãn AAA vị trí 1234H nhớ chương trình Sau thực thi lệnh LJMP AAA ta có kết sau: (PC) = 1234H g Lệnh SJMP rel Chức năng: Nhảy ngắn (Short Jump) Mô tả: Điều khiển chương trình rẽ nhánh khơng điều kiện đến địa lệnh Chú ý rằng, tầm nhảy cho phép 128 byte trước lệnh (nhảy lùi) 127 byte sau lệnh (nhảy tới) Ví dụ: Giả sử cho trước lệnh SJMP nằm địa 0100H nhãn AAA nằm địa 0123H nhớ chương trình Sau thực thi lệnh SJMP AAA ta có kết sau: (PC) = 0123H 71 h Lệnh JMP @A+DPTR Chức năng: Nhảy gián tiếp Mô tả: Cộng giá trị 8-bit không dấu chứa ghi A với trỏ liệu DPTR 16-bit nạp kết tổng cho đếm chương trình PC Đây địa lệnh tìm nạp Cả hai ghi A trỏ liệu DPTR không bị thay đổi Các cờ không bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Ví dụ: Giả sử cho trước (A) có giá trị 00H, 02H, 04H, 06H Trong AAA, BBB, CCC DDD nhãn chương trình Sau thực thi chuỗi lệnh (Bảng nhảy – Jump Table): MOV DPTR, #JMP_TBL JMP @A+DPTR ……………… JMP_TBL: AJMP AAA ; Độ dài lệnh byte AJMP BBB ; Độ dài lệnh byte AJMP CCC ; Độ dài lệnh byte AJMP DDD ; Độ dài lệnh byte ta có kết sau: với (A) = 00H, chương trình tiếp tục với lệnh nhãn AAA với (A) = 02H, chương trình tiếp tục với lệnh nhãn BBB với (A) = 04H, chương trình tiếp tục với lệnh nhãn CCC với (A) = 06H, chương trình tiếp tục với lệnh nhãn DDD h Lệnh JZ rel Chức năng: Nhảy nội dung ghi A Mô tả: Nếu tất bit ghi A nhảy đến địa cho lệnh ngược lại tiếp tục với lệnh Các cờ không bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Nội dung ghi A khơng bị thay đổi Ví dụ: Giả sử cho trước (A) = 01H Sau thực thi chuỗi lệnh: 72 JZ AAA DEC A JZ BBB chương trình tiếp tục với lệnh nhãn BBB i Lệnh JNZ rel Chức năng: Nhảy nội dung ghi A khác Mơ tả: Nếu ghi A có bit nhảy đến địa cho lệnh ngược lại tiếp tục với lệnh Các cờ không bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Nội dung ghi A khơng bị thay đổi Ví dụ: Giả sử cho trước (A) = 00H Sau thực thi chuỗi lệnh: JNZ AAA INC A JNZ BBB chương trình tiếp tục với lệnh nhãn BBB k Lệnh CJNE , , rel Chức năng: So sánh nhảy không (Compare and Jump if Not Equal) Mô tả: So sánh giá trị toán hạng (src-byte) (dest-byte) rẽ nhánh đến địa lệnh giá trị toán hạng không Cờ CY = giá trị nguyên không dấu (dest-byte) nhỏ giá trị nguyên không dấu (src-byte) ngược lại CY = Khơng có tốn hạng tốn hạng bị ảnh hưởng Ví dụ 1: Giả sử cho trước (A) = 34H, (01H) = (R1) = 34H, (34H) = B9H Sau thực thi chuỗi lệnh: CJNE A, 01H, AAA CJNE @R1, #9BH, BBB chương trình tiếp tục với lệnh nhãn BBB cờ CY = 0.chỉ lệnh CJNE, tức lệnh JC/JNC) 73 l Lệnh DJNZ , Chức năng: Giảm nhảy byte khác Mô tả: Giảm byte toán hạng đầu lệnh rẽ nhánh đến địa toán hạng thứ hai lệnh kết sau giảm khác Nếu giá trị ban đầu byte 00H ta có tràn sang 0FFH Các cờ khơng bị ảnh hưởng (xem chi tiết Bảng 3.3.1) Ví dụ 1: Cho chuỗi lệnh sau: MOV A, #50 MOV R2, #8 AAA: ADD A, #1 DJNZ R2, AAA Sau thực thi chuỗi lệnh ta có kết sau: (A) = 58, (R2) = 2.4 Thực hành 2.4.1 Thực hành theo ngôn ngữ ASM Bài :Viết chương trình kiểm tra Port VĐK b, Viết chương trình chớp tắt cổng P0 v P1 xen kẽ a,Viết chương trình chớp tắt cổng P0 $include(reg51.inc) $include(reg51.inc) cseg cseg k: mov p0,#00h mov p0,#00h mov p1,#0ffh mov p0,#0ffh call dellay call dellay1s mov p0,#0ffh dellay1s: mov r0,#10 mov p1,#00h k0: mov r1,#200 call delay k1 mov r2,#229 jmp k djne r2,$ dellay: mov r0,#10 djne r1,k1 k0: mov r1,#200 djne r0,k0 k1: mov r2,#229 74 ret djne r2,$ djne r1,k1 end djne r0,k0 ret end Bài 2,Viết chương trình đếm nhị phân Port VĐK b,Viết chương trình đếm xuống nhị phân từ FFh- 00h hiển thị P1 a,viêt chương trình đếm lên nhị phân từ 00 – FFh hiển thị P1 $include(reg51.inc) $include(reg51.inc) mov a,#0ffh cseg mov p1,a cseg mov a,#00h call dellay mov p1,a k: inc a dec a mov p1,a mov p1,a call dellay cjne a,#00h,k cjne a,#0ffh,k1 dellay: mov r0,#10 mov r0,#10 k0: mov r1,#200 k2: mov r1,#200 k1: mov r2,#229 k3 : mov r2,#229 djne r2,$ djne r2,$ djne r1,k1 djne r1,k3 djne r0,k0 k1: dellay: djne r0,k2 ret ret end end Bài : Viết chương trình đếm số hiển thị Led 7thanh b, Viết chương trình đếm tiến từ 0-9 sau đếm lùi từ 9-0 a, Viết chương trình đếm tiến từ 0-9 $include(reg51.inc) $include(reg51.inc) cseg cseg mov p0,#0ffh mov p0,#0ffh mov dptr,#tien 75 call dellay k1: k: mov a,#00h mov dptr,#tien movc a,@a+dptr mov a,#00h mov p0,a movc a,@a+dptr call dellay mov p0,a Inc dptr call dellay Cjne a,#90h,k Inc dptr mov dptr,#lui Cjne a,#90h,k1 K1: K2: Movc a,@a+dptr mov a,00h mov a,00h Movc a,@a+dptr Mov p0,a Mov p0,a Call dellay Call dellay Inc dptr Inc dptr Cjne dptr,#0c0,k1 Cjne a,#0c0h,k2 dellay: dellay: mov r0,#10 k3: k3: mov r1,#200 k4: k4: mov r2,#229 djne r2,$ djne r2,$ djne r1,k4 djne r1,k4 djne r0,k3 djne r0,k3 ret ret mov r0,#10 mov r1,#200 mov r2,#229 end end tien:db 0c0 , 0f9h , 0a4h ,0b0h, 99h,92h, tien:db 0c0 , 0f9h , 0a4h ,0b0h, 99h,92h, 82h, 0f8h , 80h , 90h 82h, 0f8h , 80h , 90h lui:db 90h , 80h ,0f8h,82h ,92h, 99h ,0b0h ,0a4,0f9 , 0c0h Bài 4,Viết chương trình điểu khiển đèn sáng dần b,Viểt chương trình P0, P1 sáng dần tắt dần a,Viểt chương trình P0, P1 sáng dần tắt hết $include(reg51.inc) cseg $include(reg51.inc) mov p0,#00h cseg mov p1,#00h 76 mov p0,#00h mov a,p0 mov p1,#00h k1: k1: mov a,p0 rlc a setb c mov p0,a rlc a jnc k1 mov p0,a k2: setb c mov a,p1 jnc k1 k2: mov a,p1 rlc a setb c mov p1,a rlc a jnc k2 mov p1,a k3: jnc k2 rrc a end mov p1,a setb c clr c jc k3 mov a, p0 k4: clr c rrc a mov p0,a jc k4 end c,Viết chương trình sáng dần 16 led từ sáng tắt từ vào $include(reg51.inc) Bài 5,Viết chương trình copy nội dung từ Ram ngồi nhớ có địa 1000h-2000h sang vùng nhớ có địa bắt đầu 2000h cseg Bài làm mov p0,#00h $include(reg51.inc) k: mov p1, #00h cseg setb c mov R1,#10H mov a,p0 mov R2,#00H rrc a mov R3,#20H mov p0,a mov dph,r1 77 setb c mov dpl,r2 mov a,p1 movx a,@dptr rlc a mov dph,r3 mov p1,a mov dpl,r2 jnc k movx @dptr,a k1: clr c inc r2 mov a, p0 D: rlc a mov dph,r1 mov p0,a mov dpl,r2 clr c movx a,@dptr mov a,p1 mov dph,r3 rrc a mov dpl,r2 mov p1,a movx @dptr,a jc k1 inc r2 end cjne r2,#00H,W inc r3 W: jmp D mov p0,a end Bài 6, Viết chương trình dellay Bài làm Bài 7:Viết chương trình copy nội dung ô nhớ có địa từ 10h đến 30h sang vùng nhớ có địa từ 40h đến 60h Ram nội $include(reg51.inc) Bài làm a, Viết chương trình dellay dùng vòng lặp $include(reg51.inc) cseg cseg dellay: mov r0,#10 k0: mov r1,#200 mov r0,#10h k1 mov r2,#229 mov r1,#40h djne r2,$ k: mov a,@r0 djne r1,k1 78 djne r0,k0 mov @r1,a ret inc r0 end inc r1 b, Viết chương trình dellay 65535 dùng t0 cjne r0,#31h,k end $include(reg51.inc) cseg mov Tmod,#01 mov Th0,#0 mov Th1,#0 setb tr0 jnb tf0,$ clr tf0 clr tr0 end Bài 8:Viết chương trình chuyển số hex ghi A sang số BCD kết lưu vào ô nhớ Bài 9:Viết chương trình điều khiển led hiển thị theo yêu cầu sau: Bài làm -Nếu INT0 =1 hiển thị số $include(reg51.inc) Bài làm Cseg $include(reg51.inc) Hex_BCD Cseg -Nếu INT0 =0 hiển thị số mov a,#8fh Start: mov b,#10h Hienthiso0: div ab Jb p3.2,hienthiso1 mov 01h,b Mov p0,#0c0h mov 02h,a Jmp start end Hienthiso1: Mov p0,#0f9h Jmp satrt End 79 2.4.2 Thực hành theo ngôn ngữ Keil C Bài 1: Bật tắt LED Bài 2: Sáng (tắt) xen kẽ LED #include #include #define LED_PORT P2 #define LED_PORT P2 void Delay_ms(unsigned int t) //noi ca led voi PORT luon { void Delay_ms(unsigned int t) unsigned int x,y; //van la ham delay nhu bai truoc nhe for(x=0; x