Tài liệu này dành cho sinh viên, giáo viên khối ngành công nghệ thông tin tham khảo và có những bài học bổ ích hơn, bổ trợ cho việc tìm kiếm tài liệu, giáo án, giáo trình, bài giảng các môn học khối ngành công nghệ thông tin
Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-1 BÀI 2: KHẢO SÁT MỘT SỐ LỆNH TIÊU BIỂU MSC-51 I. Mục ñích bài thí nghiệm Bài thực hành nhắm giúp học viên: - Khảo sát một số lệnh cơ bản của MSC-51. - Nắm ñược cấu trúc của chương trình viết cho MSC-51. - Thực thi một số chương trình ñơn giản của MSC-51. II. Cơ sở lý thuyết 1. Lập trình có cấu trúc Lập trình có cấu trúc thường thấy rõ ràng nhất trong các ngôn ngữ C, Pascal, VB … Trong hợp ngữ thì khó hình dung ñối với các bạn mới làm quen với chúng. ðể ñơn giản hoá, một số lệnh có cấu trúc tương ñương ñược trình bài bên dưới giúp cho các bạn sinh viên hình dung về lập trình có cấu trúc trong hợp ngữ. - Cấu trúc “repeat… until” Repeat <action> Until <condition> Ngôn ngữ Assembly LOOP: <action> JUMP_if_not_<condition>,LOOP Ví dụ:: Cấu trúc “repeat… until” Repeat Until A = 0 Ngôn ngữ Assembly LOOP: JNZ LOOP - Cấu trúc “while… do” while <condition> do <action> Ngôn ngữ Assembly LOOP: JUMP_if_not_<condition>,DO SJMP STOP DO: <action> SJMP LOOP STOP: Ví dụ: Cấu trúc “while… do” R7 = 0 while R7 <> 10 do { R7 = R7 + 1 } Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-2 Ngôn ngữ Assembly MOV R7,#0 LOOP: CJNE R7,#10,DO SJMP STOP DO: INC R7 SJMP LOOP STOP: - Cấu trúc “if… then… else” if <condition> then <action 1> else <action 2> Ngôn ngữ Assembly JUMP_if_not_<condition>,ELSE <action 1> SJMP DONE ELSE: <action 2> DONE: Ví dụ: Cấu trúc “if… then… else” if P0.1 = 0 then R7 = R7 + 1 else R7 = 0 Ngôn ngữ Assembly JB P0.1,ELSE INC R7 SJMP DONE ELSE: MOV R7,#0 DONE: Ví dụ: Cấu trúc “case… of…” case P1 of #11111110b: P2.0 = 1 #11111101b: P2.1 = 1 #11111011b: P2.2 = 1 else P2 = 0 end Ngôn ngữ Assembly CJNE P1,#11111110b, SKIP1 SETB P2.0 SJMP EXIT SKIP1: CJNE P1,#11111101b,SKIP2 SETB P2.1 SJMP EXIT SKIP2: CJNE P1,#11111011b,SKIP3 SETB P2.2 SJMP EXIT SKIP3: MOV P2,#0 EXIT: Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-3 2. Cơ sở lý thuyết Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-4 Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-5 Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-6 III. Phần thực hành 1. Thiết bị thực hành. Board thực hành ET-LAB3A PC, module SCAN-7SEGMENT&LED. Một máy tính ñể soạn chương trình, biên dịch và nạp chương trình xuống board thí nghiệm. Dây kết nối với máy tính. 2. Thực hành các lệnh cơ bản a. Nhóm lệnh di chuyển dữ liệu và chuyển ñiều khiển không ñiều kiện Bài 1: Dùng Keil soạn thảo ñoạn chương trình mẫu ñiều khiển module SCAN- 7SEGMENT&LED theo chu trình sau: 4 bit thấp trên PORT1 sáng 4 bit cao trên PORT1 tắt 4 bit thấp trên PORT1 tắt 4 bit cao trên PORT1 sáng và lặp lại quá trình trên. ORG 0000H LJMP MAIN MAIN: MOV P1,#0F0H ; 4 bit thap cua PORT1 sang, 4 bit cao tat CALL DELAY_xS MOV P1,#0FH ; 4 bit thap cua PORT1 tat, 4 bit cao sang CALL DELAY_xS LJMP MAIN DELAY_xS: MOV R1, #20 L1: MOV R2, #200 L2: MOV R3, #255 DJNZ R3, $ DJNZ R2, L2 DJNZ R1, L1 RET END • Sinh viên hãy thực hiện các yêu cầu sau: - Hãy biên dịch và nạp chương trình trên cho Vi ñiều khiển. Kết nối PORT1 của Vi ñiều khiển với Moduke LED và sau ñó ấn nút Reset ñể thực thi chương trình. Quan sát kết quả trên 8 LED ñơn. Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-7 - Giải thích ý nghĩa của lệnh DJNZ R3, $ ñược sử dụng trong chương trình con Delay. Lệnh này lặp lai bao nhiêu lần trong chương trình con. Lệnh này có thể viết lại khác ñược không ? Nếu ñược hãy viết lại nó. Biên dịch cho cho thực thi chương trình ñể kiểm chứng. - Nếu bỏ lệnh LJMP MAIN, thì chương trình trên sẽ hoạt ñộng như thế nào ? Giải thích tại sao ?. Hãy kiểm chứng bằng cách biên dịch và cho chạy lại chương trình - Lệnh MOV P1,#0F0H và MOV P1,0F0H có khác nhau không ? - Sửa lại chương trình sao cho 4 bit on/off chỉ hoạt ñộng chỉ 10 lần trong chương trình - Sửa lại chương trình cho 8 LED sáng tắt xen kẽ nhau luân phiên nhau, quá trình này ñược lặp lại liên tục. Bài 2: Viết chương trình xuất dữ liệu ra PORT1 theo qui luật như bảng bên dưới, và lặp lại khi chạy hết chu kỳ: P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 ðoạn code mẫu cấu trúc cơ bản của chương trình hợp ngữ cho AT89C51. Làm quen với lệnh MOV ORG 0000H LJMP MAIN MAIN: MOV A, #81H MOV P1, A CALL DELAY MOV A, #42H CALL DELAY MOV A, #24H MOV P1, A CALL DELAY MOV A, #18H CALL DELAY Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang 8 MOV A, #18H MOV P1, A CALL DELAY MOV A, #24H CALL DELAY MOV A, #42H MOV P1, A CALL DELAY MOV A, #81H CALL DELAY LJPM MAIN DELAY: MOV R0, #50 LAP1: MOV R1, #100 DJNZ R1, $ DJNZ R0, LAP1 RET END • Sinh viên hãy thực hiện các yêu cầu sau: - Soạn thảo và kiểm tra lỗi, biên dịch ñoạn chương trình trên sau ñó load xuống vi ñiều khiển. - Chạy chương trình và quan sát kết quả xem có ñúng như bảng mô tả hoạt ñộng của PORT1 không ? - Thử thay thế các giá trị nạp vào R0 và R1 sao cho kết quả dễ quan sát nhất. Cho biết khoảng giá trị nhỏ nhất và giá trị lớn nhất có thể nạp cho R0 và R1 sao cho kết quả dễ quan sát nhất. Từ ñó hãy cho biết thời gian Delay tương ứng với giá trị của R0 và R1 - Nếu cho thanh ghi R0 =0, thì lệnh DJNZ R1, $ lặp lại bao nhiêu lần ?. - Hãy viết lại chương trình trên bằng phương pháp khác sao cho có thể ñiều khiển PORT1 hoạt ñộng như bảng trên. (Gợi ý: Dùng lệnh MOVC A, @A+DPTR và bảng dữ liệu TABLE … chứa các giá trị cần xuất ra PORT1) b. Nhóm lệnh rẽ nhánh có ñiều kiện Bài 1: Dùng Keil soạn thảo ñoạn chương trình mẫu ñiều khiển module SCAN- 7SEGMENT&LED theo chu trình sau: xuất ra PORT0 của vi ñiều khiển các giá trị từ 0 ñến 9. ORG 0000H LJMP MAIN MAIN: MOV P0,#0FFH;8 bit cua PORT0 sáng CALL DELAY_XS MOV P0,#00H; 8 bit cua PORT0 tắt CALL DELAY_XS MOV A, #0 LAP: MOV P0, A CALL DELAY_XS INC A CJNE A, #10, LAP JMP $ DELAY_XS: MOV R1, #20 L1: MOV R2, #200 Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-9 L2: MOV R3, #255 DJNZ R3, $ DJNZ R2, L2 DJNZ R1, L1 RET END • Sinh viên hãy thực hiện các yêu cầu sau: - Hãy biên dịch và nạp chương trình trên cho Vi ñiều khiển. Kết nối PORT0 của Vi ñiều khiển với Moduke LED và sau ñó ấn nút Reset ñể thực thi chương trình. Quan sát kết quả trên 8 LED ñơn. Mô tả hoạt ñộng của chương trình và vẽ lưu ñồ thực chương trình. - Nếu muốn cho chương trình thực thi vô hạn thì chúng ta phải làm sao ?. Biên dịch và nạp chương trình cho vi ñiều khiển ñể kiểm chứng. Bài 2: Viết chương trình kiểm tra nội dung của thanh ghi A. Nếu nội dung thanh ghi A nhỏ hơn 10 thì xuất nội dung của thanh ghi A ra PORT1, nếu nội dung thanh ghi A lớn hơn hoặc bằng 10 thì xuất giá trị 10 ra PORT1. ðoạn chương trình mẫu bên dưới ORG 0000H LJMP MAIN MAIN: MOV A, #11 CJNE A,#10,KHACNHAU ; So sanh A voi 10 JMP XUAT10 ; neu bang A thi xuat gia tri 10 KHACNHAU: JC XUATA ; Neu CF=1, vi lay A-10 neu A<10 thi phai muon ; -> CF =1 XUAT10: ; Xuat noi dung trong A ra P1 MOV P1,#10 SJMP EXIT XUATA: MOV P1,A EXIT: END • Sinh viên hãy thực hiện các yêu cầu sau: - Soạn thảo và biên dịch ñoạn chương trình mẫu trên. Sau ñó nạp chương trình xuống vi ñiều khiển ñể kiểm chứng. - Hãy thử thay ñổi các giá trị trong thanh ghi A sao cho 10 <=A<= 0 ñể kiểm chứng. Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51 Trang II-10 - Sửa chương trình ñể so sánh 2 số X và Y. Nếu X=>Y thì xuất ra PORT0 giá trị 0F0H, ngược lại nếu X<Y thì xuất ra giá trị 0FH ra PORT0. - Sửa chương trình ñể so sánh 2 số X và Y. Nếu X=>Y thì xuất ra PORT0 giá trị 0F0H on/off 3 lần, ngược lại nếu X<Y thì xuất ra giá trị 0FH ra PORT0 on/off 3 lần. c. Nhóm lệnh thao tác trên bit Bài 1: Viết chương trình cho LED nhấp nháy. Dùng Keil ñể soạn thảo và biên dịch ñoạn chương trình bên dưới. ORG 0000H LJMP MAIN MAIN: SETB P2.0 ACALL DELAY CLR P2.0 ACALL DELAY SJMP MAIN DELAY: MOV R6, #0FFH L1: MOV R7, #0FFH DJNZ R7, $ DJNZ R6, L1 RET END • Sinh viên hãy thực hiện các yêu cầu sau: - Nhìn vào ñoạn Code trên, sinh viên hãy tự kết nối PORTx ñiều khiển với module diều khiển LED 7 ñoạn và LED. - Biên dịch và nạp chương trình cho vi ñiều khiển. Quan sát kết quả chương trình. - Sửa lại chương trình trên sao cho khi ấn SW1 (tác ñộng cạnh xuống) LED sáng một lúc rồi tắt. Giả sử sử dụng Px.2 (hoặc Px.3) làm SW1 (ngõ vào tác ñộng cạnh xuống) và P2.0 là ngõ ra dùng ñiều khiển LED ñơn. Các bạn có thể sử dụng gợi ý như sau: khi P3.0 dùng làm ngõ vào thì phải SETB Px.2; JNB Px.2, $; JB Px.2, $; Biên dịch và cho thực thi chương trình ñể kiểm chứng. Sau ñó sửa lại chương trình Delay ñể cho LED sáng/tắt với thời gian lâu hơn. Bài 2: Viết chương trình xuất dữ liệu ra PORT1 theo qui luật như bảng bên dưới, và lặp lại khi chạy hết chu kỳ: P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1 0 0 0 0 0 0 0 [...]... i, biên d ch ño n chương trình trên sau ñó load xu ng vi ñi u khi n Trang II-11 Bài 2: Kh o sát m t s t p l nh cơ b n c a MSC- 51 - Ch y chương trình và quan sát k t qu xem có ñúng như b ng mô t ho t ñ ng c a PORT1 không ? Hãy s a l i th i gian trì hoãn trong chương trình con DELAY_xS sao cho led hi n th d quan sát nh t Ki m ch ng l i s thay ñ i này ? - L nh DJNZcó th thay th b ng l nh CJNE hay không...Bài 2: Kh o sát m t s t p l nh cơ b n c a MSC- 51 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 ORG 0000H LJMP CLR P1.2 MAIN CALL DELAY_XS MAIN: SETB P1.2 MOV P1,#0FFH... 0F0h ra PORT0, ngư c l i xu t 0Fh ra PORT0 sau khi ñã xu t k t qu c a phép toán c ng ra PORT0 Chú ý ph i vi t thêm chương trình con Delay trì hoãn ñ xem k t qu Trang II-13 Bài 2: Kh o sát m t s t p l nh cơ b n c a MSC- 51 - S a l i ño n chương trình trên sao cho có th c ng ñư c 2 con s 4 byte, l n lư t xu t t ng byte k t qu ra PORT0 Chú ý ph i có Delay trì hoãn ñ xem k t qu G i ý dùng l nh ADDC cho... P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 Trang II-14 Bài 2: Kh o sát m t s t p l nh cơ b n c a MSC- 51 ORG 0000H DJNZ R7, LAP LJMP MAIN DELAY_XS: MAIN: MOV R1, #20 CLR C L1: MOV R2, #200 MOV R7, #8 ; s l n quay ph i L2: MOV R3, #255 MOV A, #7FH L3: DJNZ R3, L3 LAP: DJNZ R2, L2 MOV... P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Trang II-14 Bài 2: Kh o sát m t s t p l nh cơ b n c a MSC- 51 - S a l i chương trình sao cho nó ho t ñ ng như b ng bên dư i và l p l i chu trình này Cho chay chương trình và ki m tra k t qu P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1 0 0 0 0 0 . 2: Khảo sát một số tập lệnh cơ bản của MSC- 51 Trang II-3 2. Cơ sở lý thuyết Bài 2: Khảo sát một số tập lệnh cơ bản của MSC- 51 Trang II-4 Bài 2: Khảo sát một số tập lệnh cơ bản của. Khảo sát một số tập lệnh cơ bản của MSC- 51 Trang II-1 BÀI 2: KHẢO SÁT MỘT SỐ LỆNH TIÊU BIỂU MSC- 51 I. Mục ñích bài thí nghiệm Bài thực hành nhắm giúp học viên: - Khảo sát một. học viên: - Khảo sát một số lệnh cơ bản của MSC- 51. - Nắm ñược cấu trúc của chương trình viết cho MSC- 51. - Thực thi một số chương trình ñơn giản của MSC- 51. II. Cơ sở lý thuyết 1. Lập trình