1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng vi xử lý chương 3 lập trình 8051

126 4 0

Đ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

Nội dung

Đại Học Giao Thông Vận Tải Tp.HCM Khoa Điện – Điện Tử Viễn Thông Học phần: Vi Xử Lý Chương 3: Lập trình 8051 Giảng viên: TS NGUYỄN HỮU CHÂN THÀNH Chương bao gồm nội dung: Các khái niệm lập trình cho VXL VĐK Các kiểu định địa Tập lệnh Các kỹ thuật lập trình I Các khái niệm lập trình cho VXL VĐK Chương trình Tất cả các họ vi xử lý khác có thể thực hiện được mọi công việc mà ta có thể thấy cuộc sống, từ điều khiển các quá trình phức tạp, truyền thông, trò chơi điện tử… Một câu hỏi đặt là: vậy thì cái gì đặc trưng cho bộ vi xử lý để nó có thể thực hiện chức riêng biệt của vi xử lý Đó chính là phần mềm (software), hay chương trình Chương trình - Chương trình (program) là chuỗi các câu lệnh hay phát biểu được viết một dạng đặc thù (ngôn ngữ lập trình) Các lệnh này được thực hiện bởi vi xử lý sẽ thực hiện những thao tác nhất định với kết quả đoán trước đượ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 hoặc 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 đầu tiên của việc lập trình là xác định rõ ràng mục đích của chương trình và trình tự cần thiết để đạt mục đích đó Một những công cụ quan trọng việc phát triển chương trình là lưu đồ chương trình - 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ưu đồ chương trình không phụ thuộc ngôn ngữ lập trình hoặc loại vi xử lý cụ thể nào Lưu đồ chương trình chỉ phụ thuộc vào công việc mà người lập trình muốn hoàn thành Lưu đồ chương trình - Các khới bản dùng lưu đờ chương trình: Lưu đồ chương trình -Rất nhiều người lập trình mới 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 vì nghĩ rằng việc vẽ lưu đồ là tốn thời gian Điều này chỉ đúng với các chương trình ngắn và đơn giản, trường hợp chương trình dài thì nếu không có lưu đồ sẽ rất dễ bị rối rắm Lưu đồ chương trình giúp sắp xếp các ý tưởng và lời giải của từng vấn đề riêng biệt Sau hoàn thành lưu đồ, ta có thể trao đổi với người khác về ý tưởng của mình Có lưu đồ chương trình thì dù sau một thời gian dài ta vẫn có thể quay lại với chương trình của mình một cách dễ dàng mà không bị “lạc” các dòng lệnh vốn rất chi tiết của 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ữ có thể bao gồm: - Các lệnh (instruction) của vi xử lý/vi điều khiển - Các chỉ dẫn (directive) của trình dịch hợp ngữ - Các điều khiển (control) của trình dịch hợp ngữ - Các chú thích (comment) Các lệnh là các mã gợi nhớ quen thuộc và sẽ được dịch mã máy tương ứng với vi xử lý/vi điều khiển Các chỉ dẫn của trình dịch hợp ngữ là các lệnh của trình dịch hợp ngữ dùng để định nghĩa cấu trúc chương trình, các ký hiệu, dữ liệu, các hằng số… Các điều khiển của trình dịch hợp ngữ thiết lập các chế độ trình dịch hợp ngữ và các luồng hợp dịch trực tiếp Các chú thích giúp cho chương trình dễ đọc bằng cách đưa các giải thích về mục đích và hoạt động của các chuỗi lệnh Khuôn dạng chương trình hợp ngữ Các dòng chứa các lệnh và các chỉ dẫn phải được viết theo các qui luật mà trình dịch hợp ngữ hiểu được Mỗi dòng được chia thành các trường cách biệt bởi khoảng trắng hay khoảng tab Khuôn dạng tổng quát của mỗi dòng sau: Tên (Nhãn) Mã gợi nhớ Các toán hạng Chú thích đó chỉ có trường mã gợi nhớ là bắt buộc Với trình dịch hợp ngữ ASM51, trường mã gợi nhớ không cần ở cùng một dòng với trường nhãn Tuy nhiên, trường toán hạng phải ở cùng một dòng với trường mã gợi nhớ Có thể viết các dòng này bằng chữ hoa hay chữ thường và chúng sẽ được coi là tương đương vì trình dịch hợp ngữ 10 không phân biệt kiểu chữ Bài tập chương 3.12 Cho nội dung của các ô nhớ và ghi: (30H) = 12H; (B) = 34H; (A) = 05H Hãy xác định nội dung của ô nhớ 30H, ghi A và 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 112 Bài tập chương 3.13 Xét đoạn chương trình sau: 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 ;* 113 Bài tập chương a Sau thực hiện lệnh thứ (có chú thích *), nội dung của R0, R1 và R2 là bao nhiêu? b Lệnh có nhãn NEXT được thực thi lần? c Sau hoàn tất chương trình thì nội dung của R0, R1 và R2 là bao nhiêu? d Cho nội dung của các ô nhớ ban đầu là: (20H) = 23H, (21H) = 45H, (30H) = 67H, (31H) = 89H: Cho biết nội dung của các ô nhớ sau thực thi xong chương trình trên? Chức của chương trình trên? 114 Bài tập chương 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 115 Bài tập chương a Sau thực hiện lệnh có chú thích *, nội dung của R0, R1 và R2 là bao nhiêu? b Lệnh có nhãn AGAIN được thực thi lần? c Sau hoàn tất chương trình thì nội dung của R0, R1 và R2 là bao nhiêu? d Nội dung của ô nhớ 40H sau thực thi xong chương trình trên? e Chức của chương trình trên? f Nếu kết quả của chương trình được cất vào ô nhớ 50H thì lệnh nào 116 cần sửa đổi? Bài tập chương 3.15 Viết đoạn chương trình xóa 20 byte ô nhớ RAM nội bắt đầu từ địa chỉ 30H 3.16 Viết đoạn chương trình xóa 100 byte ô nhớ RAM ngoài bắt đầu từ địa chỉ 1000H 3.17 Viết đoạn chương trình đọc 20 byte ô nhớ RAM ngoài bắt đầu từ địa chỉ 2000H và ghi vào RAM nội bắt đầu từ địa chỉ 30H 3.18 Viết chương trình TINHTB_3SO tính giá trị trung bình của số nguyên dương chứa ô nhớ 30H, 31H và 32H Kết quả (phần nguyên) chứa ghi R7 Giả sử tổng của số đó không lớn 117 255 Bài tập chương 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 quả trả về 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 quả trả về 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 quả trả về 24 bit cất R7_B_A 118 Bài tập chương 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ù của số 16 bit cất R7_A (R7: byte cao, A: byte thấp) Kết quả trả về 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 các ô nhớ 32H, 31H và 30H (32H: trăm, 31H: chục, 30H: đơn vị) 3.25 Viết chương trình BCDTOBIN chuyển số BCD nén (2 ký số) A sang số nhị phân cất ô nhớ 30H 119 Bài tập chương 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 các ô 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 các ký tự chữ hoa các ô nhớ 30H 3FH RAM nội sang chữ thường 3.28 Viết chương trình đổi các ký tự chữ hoa các ô nhớ 30H 3FH RAM nội sang chữ thường và ngược lại 120 Bài tập chương 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 quả trả về: - (C) = nếu (R7_A) < (31H_30H) - (C) = nếu (R7_A) (31H_30H) Lưu ý: phải bảo toàn nội dung của các ghi và ô nhớ ở 3.30 Viết chương trình kiểm tra một khối dữ liệu RAM ngoài có chiều dài 200 byte bắt đầu từ địa chỉ 1000H xem có byte có giá trị là Kết quả (số byte có giá trị là 0) được lưu vào ô nhớ có địa chỉ là 0FFFH RAM ngoài 121 Bài tập chương 3.31 Viết chương trình kiểm tra một khối dữ liệu RAM ngoài có chiều dài 50 byte bắt đầu từ địa chỉ 2000H xem có byte có giá trị là 0, dương và âm Kết quả được lưu vào các ô nhớ RAM nội sau: - Ô nhớ 30H: chứa sớ byte bằng - Ơ 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 122 Bài tập chương 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 của chu kì xung) 3.37 Viết chương trình điều khiển đèn giao thông tại 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 các đèn với quy định nếu xuất mức logic là đèn sáng: Chân P1.0 P1.1 P1.2 Đèn đường Xanh Vàng Đỏ Chân P1.3 P1.4 P1.5 Đèn đường Xanh Vàng Đỏ 123 Bài tập chương 3.38 Cho mạch kết nối sau: +5V D1 P1.0 P1.1 P1.2 P1.3 13 14 17 18 P1.4 P1.5 P1.6 P1.7 +5V 11 D1 D2 D3 D4 D5 D6 D7 D8 LE OE 74HC373 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 12 15 16 19 D2 D3 D4 D5 D6 330 x D7 D8 8051 124 Bài tập chương a Hãy viết chương trình để sáng từng LED theo chiều D1 và lặp lại, thời gian sáng của mỗi LED là 0,2s b Tương tự câu a theo chiều D8 c Kết hợp câu a và b: sáng theo chiều D1 lặp lại D8 D1 D8 rồi D8 D1 và d Hãy viết chương trình để các LED sáng lan tỏa theo chiều D1 D8 rồi tắt dần theo chiều D1 D8 và lặp lại, thời gian cách giữa LED là 0,2s e Tương tự câu d theo chiều từ D8 D1 125 Bài tập chương 3.39 Cho mạch kết nối sau: Hãy viết chương trì+5V nh để xuất giá trị BCD ô nhớ 30H LED đoạn P1.0 P1.1 P1.2 P1.3 13 14 17 18 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 a b c d e f g 12 15 16 19 330x8 LE OE 74HC373 8051 126

Ngày đăng: 15/11/2023, 12:55