Điện - Điện Tử - Một số kỹ thuật lập trình hợp ngữ 8051

1. Hãy trình bày các cách làm cho a) Cờ Carry bằng 1 b) Cờ Carry bằng 0 Bài giải (BG). Cách tốt nhất là cách có đánh dấu *. a) Cờ Carry bằng 1 Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC) Cách 1 (*) SETB C D3 1 Cách 2 SETB CY D2 D7 2 Cách 3 CLR C CPL C C3 B3 1 1 b) Cờ Carry bằng 0 Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC) Cách 1 (*) CLR C C3 1 Cách 2 CLR CY C2 D7 2 Cách 3 SETB C CPL C D3 B3 1 1 Chú ý: Ngoài ra các lệnh cộng/trừ/xoay bit cũng làm thay đổi giá trị của cờ Carry!

pdf6 trang | Chia sẻ: hoang10 | Lượt xem: 499 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Điện - Điện Tử - Một số kỹ thuật lập trình hợp ngữ 8051, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
ĐHBK Tp HCM – BMĐT Môn học: Vi xử lý GVPT: Hồ Trung Mỹ Một số kỹ thuật lập trình hợp ngữ 8051 1. Hãy trình bày các cách làm cho a) Cờ Carry bằng 1 b) Cờ Carry bằng 0 Bài giải (BG). Cách tốt nhất là cách có đánh dấu *. a) Cờ Carry bằng 1 Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC) Cách 1 (*) SETB C D3 1 Cách 2 SETB CY D2 D7 2 Cách 3 CLR C C3 1 CPL C B3 1 b) Cờ Carry bằng 0 Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC) Cách 1 (*) CLR C C3 1 Cách 2 CLR CY C2 D7 2 Cách 3 SETB C D3 1 CPL C B3 1 Chú ý: Ngoài ra các lệnh cộng/trừ/xoay bit cũng làm thay đổi giá trị của cờ Carry! 2. Hãy trình bày các cách xóa thanh ghi A và cho biết cách nào tốt nhất BG. Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC) Cách 1 (*) CLR A E41 Cách 2 ANL A,#0 54 00 2 Cách 3 MOV A,#0 74 00 2 Cách 4 XRL A,0E0h  XRL A,ACC 65 E0 1 Cách 5 XRL 0E0h,A  XRL ACC,A 62 E0 1 3. Hoán đổi nội dung của a) 4 bit cao với 4 bit thấp của thanh ghi A b) Thanh ghi R1 và R2 ở bank 0 c) 2 byte trong RAM nội (TD: ở 30h và 32h) BG. Cách 1 (*) Cách 2 Cách 3 a) Hai nửa byte của A SWAP A RL A RR A RL A RR A RL A RR A RL A RR A b) Thanh ghi R1và R2 XCH A,R1 PUSH 1 MOV A,R1 (ở bank 0) XCH A,R2 PUSH 2 MOV 1,2 XCH A,R1 POP 1 MOV R2,A POP 2 c) 2 byte trong RAM nội XCH A,30h PUSH 30h MOV A,30h (TD: ở 30h và 32h) XCH A,32h PUSH 32h MOV 30h,32h XCH A,30h POP 30h MOV 32h,A POP 32h 4. So sánh thanh ghi A với B và kết quả tác động đến phép gán cho thanh ghi R7 Mã giả Chương trình hợp ngữ #1 Chương trình hợp ngữ #2 if A = B then CJNE A,B, ANEB XRL A, B R7  1 MOV R7, #1 JNZ ANEB else SJMP CONT MOV R7,#1 R7  2 ANEB: MOV R7, #2 SJMP CONT: CONT: ANEB: MOV R7,#2 CONT: VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 1/6 if A > B then CJNE A, B, ANEB R7  1 ALEB: ; khi A <= B else MOV R7,#2 R7  2 SJMP CONT ANEB: ; xử lý khi A > B JC ALEB MOV R7,#1 CONT: if A < B then CJNE A, B, ANEB R7  1 AEQB: MOV R7,#2 ; khi A = B else SJMP CONT if A = B then ANEB: ; khi A B R7  2 JC ALTB else AGTB: ; xử lý khi A > B R7  3 MOV R7,#3 SJMP CONT ALTB: ; xử lý khi A < B MOV R7,#1 CONT: Chú ý: SV tự viết code cho các trường hợp còn lại 5. Áp dụng lệnh so sánh và nhảy (CJNE) để cài đặt 1 số cấu trúc chương trình Cấu trúc điều khiển trong giải thuật Chương trình hợp ngữ tương ứng Giả sử XVAL và YVAL là các địa chỉ trực tiếp MOV A, XVAL CJNE A, YVAL, L1 . . Do something . L1: .. CJNE op1. op2, label if (op1 < op2) C  1 else C  0 MOV A, XVAL CJNE A,YVAL, L1 L1: JNC L2 . . Do Something . L2: .. MOV A, XVAL CJNE A, YVAL, L1 SJMP L2 L1: JNC L3 L2: ... L3: .. VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 2/6 Chú ý: Ta có thể biến đổi điều kiện so sánh, TD như điều kiện X<=Y có thể đổi thành NOT(Y<X) như sau: 6. Thực hiện cấu trúc điều khiển thực hiện vòng lặp trong N lần ( N= 1  255) Dùng thanh ghi R7 Dùng thanh ghi R7 Mã giả làm biến Count làm biến Count Count  N LD R7,#N LD R7,#N Loop: LOOP: LOOP: . . . . . . . . . Count  Count – 1 DEC R7 if Count  0 goto Loop CJNE R7,#0,LOOP DJNZ R7,LOOP Next: NEXT: NEXT: Chú ý:  N là hằng số được định nghĩa bằng EQU  Trong vòng lặp không có thay đổi biến Count ! (trừ cuối vòng lặp)  Trường hợp đặc biệt nếu N = 0 thì với cấu trúc này nó thực hiện lặp 256 lần 7. Thực hiện cấu trúc điều khiển repeat until Condition là các cờ Condition là các cờ Mã giả hoặc tổ hợp các cờ hoặc tổ hợp các cờ repeat ; TD: condition là Carry ; TD: condition là bit Loop: CLR C ; cờ C  0 CLR bit ; bit  0 . . . LOOP: ; trong vòng lặp có LOOP:;trong vòng lặp có ; lệnh làm cờ C = 1 ;lệnh làm cờ bit = 1 until codition is true Next: . . . . . . JNC LOOP JNB bit. LOOP NEXT: NEXT: Chú ý:  Nếu nhãn LOOP quá xa thì có thể dùng AJMP hay LJMP, khi đó JNC LOOP được viết thành 2 lệnh liên tiếp JC NEXT và LJMP LOOP  bit là 1 biến Boole TD như cờ F0, địa chỉ bit 00H (là bit 0 của byte có địa chỉ 20H), ACC.0, TF0, 8. Hỏi vòng kiểm tra mức của 1 chân nhập (TD: P1.0) để thực hiện công việc cho mức 0 hay 1. Mã giả Chương trình hợp ngữ while (1) SETB P1.0 ; đặt cấu hình nhập { LOOP: JB Task_1 if P1.0 = 0 then Task_0: . . . ; các lệnh thực hiện task0 do task0 SJMP LOOP else Task_1: . . . ; các lệnh thực hiện task1 do task1 SJMP LOOP } VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 3/6 TD: Áp dụng cho mạch xử lý LED sáng chạy sang trái hoặc phải tùy theo mức logic ở chân nhập Với mạch trên chú ý là các công tắc tại cổng 0 cần có điện trở kéo lên. Hoạt động của mạch như sau:  Nếu P1.1 = 0 thì 8 LED sẽ sáng từ phải sang trái, mỗi LED sáng trong 25ms.  Nếu P1.1 = 1 thì 8 LED sẽ sáng từ trái sang phải, mỗi LED sáng trong 25ms.  Đèn DS1 thể hiện trạng thái của phím S1, nếu có nhấn S1 thì đèn DS1 sáng.  Đèn DB1 và DB2 thể hiện trạng thái của phím B1 và B2, nếu có nhấn phím B1 và B2 thì đèn DB1 và DB2 tương ứng sẽ sáng. Chương trình hợp ngữ cho mạch trên: Pattern EQU 0FEh ORG 0 DELAY_25MS: MOV P0,#03H ; Đặt cấu hình nhập cho P0.1 và P0.0 ; Chương trình này đúng với XTAL = 12 MHz MOV P3,#80H ; Đặt cấu hình nhập cho P3.7 MOV R1, #250 MOV P1,#Pattern L1: MOV R0,#50 Loop: DJNZ R0, $ ; Lấy trạng thái của các công tắc B1,S1 cất vào ACC DJNZ R1, L1 MOV A,P0 RET ANL A,#00000011B ; chỉ lấy P0.1 và P0.0 END ORL A,# 10000000B ; Đặt cấu hình nhập cho P3.7 ; Sao chép bit P3.7 vào bit P3.2 MOV C, P3.7 MOV ACC.2, C MOV P3, A ; Xử lý cho LED chạy MOV A, P1 JB P0.1, RoR ; Xoay trái P1 RL A SJMP Next RoR: ; Xoay phải P1 RR A Next: MOV P1, A ; Làm trễ 25ms ACALL DELAY_25MS SJMP Loop VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 4/6 9. Hỏi vòng kiểm tra cạnh xuống của 1 chân nhập (TD: P1.0) khi có thì thực hiện công việc (task) Mã giả Chương trình hợp ngữ while (1) SETB P1.0 ; đặt cấu hình nhập { LOOP: JNB P1.0, $ ; đợi P1.0 = 1 if P1.0 =  then JB P1.0, $ ; đợi P1.0 = 0 do task Task: . . . ; các lệnh thực hiện task } SJMP LOOP TD: Mạch sau mô phỏng bộ đếm lên nhị phân modulo 10 (đếm từ 0 đến 9 và lặp lại) với hiển thị LED 7 đoạn được gắn ở cổng P0 và xung nhịp CK được nối vào chân P3.7 Mạch Chương trình X1 CK EQU P3.7 ORG 0 CRST CX1 12MHz CX2 MOV P3,#80H ; Đặt cấu hình nhập cho P3.7 10n 33p 33p MOV R0,#0 ; Số đếm ban đầu là 0 MOV P0,#0C0H; Đầu tiên hiển thị 0 U1 R7 19 39 RRST XTAL1 P0.0/AD0 R6 LOOP: 38 P0.1/AD1 R5 10k 37 270R P0.2/AD2 R4 18 36 270R JNB CK,$ ; Đợi CK o muc 1 XTAL2 P0.3/AD3 R3 35 270R P0.4/AD4 R2 34 270R JB CK,$ ; Đợi CK o muc 0 P0.5/AD5 R1 33 270R P0.6/AD6 9 32 270R RST P0.7/AD7 270R INC R0 21 P2.0/A8 22 CJNE R0,#10,NEXT ; kiểm tra tràn thì về 0 P2.1/A9 23 P2.2/A10 29 24 PSEN P2.3/A11 MOV R0,#0 30 25 ALE P2.4/A12 31 26 EA P2.5/A13 NEXT: 27 P2.6/A14 28 P2.7/A15 MOV A,R0 1 10 P1.0 P3.0/RXD 2 11 P1.1 P3.1/TXD ACALL BCD2LED 3 12 P1.2 P3.2/INT0 4 13 P1.3 P3.3/INT1 SJMP LOOP 5 14 P1.4 P3.4/T0 6 15 P1.5 P3.5/T1 7 16 BCD2LED: P1.6 P3.6/WR 8 17 P1.7 P3.7/RD MOV DPTR,#LED_DATA 80C51 MOVC A,@A+DPTR MOV P0,A RET LED_DATA: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H DB 0F8H, 80H, 90H RET END 10. Viết các chương trình con cài đặt các cổng logic AND, OR, và XOR 8 ngõ vào (8 bit trong thanh ghi A và ngõ ra là cờ C) AND 8 ngõ vào OR 8 ngõ vào XOR 8 ngõ vào AND8: OR8: XOR8: CJNE A,#0FFH, AN_0 CJNE A,#0, OR_1 MOV C,P SETB C CLR C RET RET RET Chú ý: AN_0: OR_1: Cờ P luôn luôn bằng XOR của 8 bit CLR C SETB C trong thanh ghi A RET RET 11. Cài 1 hệ tuần tự đồng bộ không ngõ vào. TD: Viết chương trình tạo dạng sóng sau (giả có sẵn chương trình làm trễ 1 giây DELAY_1S) Bài giải. VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 5/6 Cách tổng quát để giải loại bài toán này là tìm biểu diễn tương đương máy trạng thái của nó. Với TD trên ta thấy có thể phân tích thành máy trạng thái với chu kỳ của 1 trạng thái là 1s như sau: Như vậy ta có máy trạng thái với 6 trạng thái và ở trạng thái S0 thì P[2:0]=100, ở S1 thì P[2:0]=101, .., ở S5 thì P[2:0] = 001. Tận dụng lệnh tra bảng thì ta có thể dễ dàng cài đặt máy trạng thái trên như sau: ORG 0 MOV DPTR,#STATE_TBL MOV R0,#0 ; Chỉ thị đang ở trạng thái mấy LOOP: MOV A, R0 MOVC A,@A+DPTR MOV P2,A INC R0 CJNE R0,#6,LOOP MOV R0,#0 SJMP LOOP STATE_TBL: DB 4, 5, 3, 4, 5, 1 END 12. So sánh 2 số không dấu và có dấu (với biểu diễn bù 2) với CJNE. Vì khi so sánh CJNE thì 8051 luôn luôn hiểu là so sánh với 2 số nhị phân không dấu! Do đó khi so sánh có dấu thì ta phải biến đổi trị số của 2 số cần so sánh rồi mới áp dụng CJNE được. Để dễ theo dõi, ta lấy TD với 2 số 3 bit (n=3) Nhị phân Số không dấu Số có dấu (bù 2) Số có dấu + 4 Nhị phân 000 0 0 4 100 001 1 +1 5 101 010 2 +2 6 110 011 3 +3 7 111 100 4 –4 0 000 101 5 –3 1 001 110 6 –2 2 010 111 7 –1 3 011 Trị số mới ở cột có in tiêu đề đậm (Số có dấu + 4) (với 4 = 22 =2n-1) hoặc nếu so sánh 2 cột nhị phân đầu và cuối thì ta có cách biến đổi khác là đảo giá trị của MSB. TD: Nếu R2 > R1 thì R0 = 2 còn ngược lại thì R0 = 1 cho cả 2 trường hợp không dấu và có dấu. Biểu diễn số trong R2 và R1 là số không dấu Biểu diễn số trong R2 và R1 là số có dấu MOV A,R2 CJNE R1, 02H, NEXT XRL A,#80H ; đảo trị MSB NEXT: JNC R1GER2 MOV B, A MOV R0, #2 MOV A, R1 SJMP CONT XRL A,#80H ; đảo trị MSB MOV R0, #1 CJNE A, B, NEXT_S CONT: NEXT_S: JNC AGEB MOV R0, #2 SJMP CONT_S MOV R0, #1 CONT_S: VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 6/6
Tài liệu liên quan