THÍ NGHIỆM VI XƯ LÝ EME – MC8 BÀI 1: THÍ NGHIỆM VỚI NÚT NHẤN VÀ LED ĐƠN Thí nghiệm 1: Viết chương trình thực đọc liện tục trạng thái nút nhấn nối đến P1.0 hiển thò Led nối chân P1.1 ( bit thứ port 1) ORG 2000H MAIN: MOV C,P1.0 MOV P1.1,C SJMP MAIN END a Khi nhấn có đèn sáng lúc: nhấn P1.0 ( đèn sáng) liệu từ P1.0 chuyển qua P1.1 thông qua cờ C, thời gian chuyển nhanh ( thời gian thực lệnh vài micro giây) => ta nhìn thấy đèn sáng/tắt lúc b Các bit port sử dụng nghiệm trên: Vì EME-MC8 thiết kế hoat động chế độ bus, nên port 0: bus liệu, port 2: bus đòa chỉ, P3.0, P3.1, P3.6, P3.7 dùng làm bus điều khiển Các chân lại port dùng thí nghiệm Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz nối đến chân P1.0 với tần số dao động dùng hệ thống 11.059MHz a Duty cycle: 50% - Hz ORG 2000H LAP: CPL P1.0 ACALL DL SJMP LAP DL: MOV R5,#10 L2: MOV R6,#100 L1: MOV DJNZ DJNZ DJNZ RET END R7,#250 R7,$ R6,L1 R5,L2 Dùng vòng lặp để tạo trễ 0.5s, với giá trò nạp cho R5, R6, R7 tính theo công thức gần t=2*m*n*p Với giá trò nạp: R5 = 10, R6 = 200, R7 = 250 để giảm sai số b Duty cycle: 30% - tầân số 0.5Hz ORG 2000H LAP: MOV R1,#3 MOV R2,#7 CLR P1.0 LAP1: ACALL DL DJNZ R1,LAP1 SETB P1.0 LAP2: ACALL DL DJNZ R2,LAP2 SJMP LAP DL: L2: L1: MOV MOV MOV DJNZ DJNZ DJNZ RET END R5,#4 R6,#200 R7,#250 R7,$ R6,L1 R5,L2 Thí nghiệm 3: a Viết chương trình tạo xung vuông 1Hz dùng timer ORG 2000H MAIN: CPL P1.0 ACALL DL500 SJMP MAIN DL500: MOV TMOD,#01H MOV R7,#10 LOOP: MOV TH0,#HIGH(-50000) ; giá trò nạp 50000*10 = 500000us = 0.5s MOV TL0,#LOW(-50000) SETB TR0 JNB CLR CLR DJNZ RET END b TF0,$ TF0 TR0 R7,LOOP ; đợi cờ TF0 tràn xóa cờ tràn Dùng ngắt Timer 0: ORG LJMP ORG LJMP 2000H MAIN 200BH ISRT0 MOV SETB MOV MOV SJMP TMOD,#01H TF0 IE,#82H R7,#11 $ DJNZ CPL MOV SJMP R7,NAP P1.0 R7,#10 KT CLR MOV MOV SETB RETI END TR0 TH0,#HIGH(-50000) TL0,#LOW(-50000) TR0 MAIN: ISRT0: NAP: KT: Thí nghiệm 4: Viết chương trình làm cho led nối đến chân P1.0 chớp tắt với tần số tăng giảm cách nhấn nút nối đến chân P1.1 P1.2 Chu kì chớp tắt trung bình 1s ORG 2000H MAIN: CPL MOV JNB DEC P1.0 A,#10 P1.1,KT_GIAM A ;Khi nhấn P1.1 f tăng => Chu kỳ giảm => giảm R7 MOV R7,A SJMP LAP ; lần giảm 1*25000us = 0.025s KT_GIAM: JNB P1.2,LAP INC A MOV R7,A LAP: ACALL DL500 DJNZ R7,LAP SJMP MAIN DL500: MOV TMOD,#01H MOV TH0,#HIGH(-25000) ; giá trò 50000*R7 (R7TB = 10) = 500000us = 0.5s MOV TL0,#LOW(-25000) SETB TR0 JNB TF0,$ ; đợi cờ TF0 tràn xóa cờ tràn CLR TF0 CLR TR0 RET END BÀI TẬP: Viết chương trình thực cổng logic: XOR ngõ vào ORG 2000H MAIN: CLR MOV MOV MOV MOV MOV XRL MOV MOV SJMP END A C,P1.0 ACC.0,C R0,A C,P1.1 ACC.0,C A,R0 C,ACC.0 P1.5,C MAIN Viết chương trình thực mạch đèn chạy: STTTTTT-SSTTTTTT-SSSTTTTTSSSSTTTT…….-SSSSSSSS-TTTTTTT Thời gian thực chương trình 4.5s (với S: đèn sáng, T: đèn tắt) ORG 2000H MAIN: CLR A MOV DPTR,#TABLE MOV R7,#8 LAP: MOVC A,@A+DPTR ACALL DL500 INC A DJNZ R7,LAP SJMP MAIN DL500: MOV TMOD,#01H MOV R6,#10 LOOP: MOV TH0,#HIGH(-50000) ; giá trò nạp 50000*10 = 500000us = 0.5s MOV TL0,#LOW(-50000) SETB TR0 JNB TF0,$ ; đợi cờ TF0 tràn xóa cờ tràn CLR TF0 CLR TR0 DJNZ R6,LOOP RET TABLE: DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H,0FFH END Viết chương trình thực phép logic: P1.5 = (P1.0 XOR P1.1) AND P1.2) ORG 2000H MAIN: CLR MOV MOV MOV MOV MOV XRL MOV MOV MOV ANL MOV MOV SJMP END A C,P1.0 ACC.0,C R0,A C,P1.1 ACC.0,C A,R0 R0,A C,P1.2 ACC.0,C A,R0 C,ACC.0 P1.5,C MAIN ; R0 = P1.0 XOR P1.1 BÀI 2: THÍ NGHIỆM HIỂN THỊ DÙNG LED ĐOẠN Thí nghiệm 1:Viết chương trính thực đếm từ 0->9 hiển thò led đoạn, lần cách 2s ORG 2000H MAIN: MOV R7,#10 MOV R5,#0 LOOP: MOV DPTR,#TABLE MOV A,R5 MOVC A,@A+DPTR ACALL DL2S MOV DPTR,#0000H MOVX @DPTR,A INC R5 DJNZ R7,LOOP SJMP MAIN DL2S: MOV R6,#40 MOV TMOD,#01H LAP: MOV MOV SETB JNB CLR CLR DJNZ RET TABLE: DB END TH0,#HIGH(-50000) TL0,#LOW(-50000) TR0 TF0,$ TF0 TR0 R6,LAP 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H Thí nghiệm 2: a Viết chương trình hiển thò giá trò 1234 lên led đoạn ORG 2000H MAIN: MOV R7,#4 MOV R5,#0 LOOP: MOV DPTR,#TABLE MOV A,R5 MOVC A,@A+DPTR ACALL DL2MS MOV DPTR,#0000H MOVX @DPTR,A INC R5 DJNZ R7,LOOP SJMP MAIN DL2MS: MOV TMOD,#01H MOV TH0,#HIGH(-2000) MOV TL0,#LOW(-2000) SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 RET TABLE: DB 71H,0B2H,0D3H,0E4H ;tương ứng với giá trò 1234 hiển thò lên Led END b Thay đổi chương trình để giá trò 1234 hiển thò thông qua mã BCD nén chứa cặp ghi R7 & R6,Biết R7 MSB ORG 2000H MAIN: MOV R7,#12H MOV R6,#34H MOV A,R7 ANL A,#0F0H SWAP A ADD A,#70H MOV R1,A ; R1 chưa gía trò 71H tương ứng với giá trò đươc xuất led MOV A,R7 ANL A,#0FH ADD A,#0B0H MOV R2,A ; R2 chưa giá trò 0B2H tương ứng với giá trò xuất led MOV A,R6 ANL A,#0F0H SWAP A ADD A,#0D0H MOV R3,A ; R3 chưa giá trò 0D3H tương ứng với giá trò xuất led MOV A,R6 ANL A,#0FH ADD A,#0E0H MOV R4,A ; R4 chưa giá trò 0E4H trương ứng với giá trò đươc xuất led LAP: MOV DPTR,#0 MOV A,R1 MOVX @DPTR,A ACALL DL2MS MOV A,R2 MOVX @DPTR,A ACALL DL2MS MOV A,R3 MOVX @DPTR,A ACALL DL2MS MOV A,R4 MOVX @DPTR,A ACALL DL2MS SJMP LAP DL2MS: MOV TMOD,#01H MOV TH0,#HIGH(-2000) MOV TL0,#LOW(-2000) SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 RET END Thí nghiệm 3: Viết chương trình hiển thò giá trò nhò phân ghi R7 lên led đoạn ORG 2000H MAIN: MOV MOV MOV DIV MOV MOV R7,#254 B,#10 A,R7 AB R4,B B,#10 ; nạp tùy ý giá trò R7 để kiểm tra ; R4 chứa giá trò hàng đơn vò DIV AB MOV R3,B MOV R2,A ; R3 chứa giá trò hàng chục ; R2 chưa giá trò hàng trăm LAP: MOV DPTR,#0 MOV A,R2 ADD A,#0B0H MOVX @DPTR,A ACALL DL2MS MOV A,R3 ADD A,#0D0H MOVX @DPTR,A ACALL DL2MS MOV A,R4 ADD A,#0E0H MOVX @DPTR,A ACALL DL2MS SJMP LAP DL2MS: MOV TMOD,#01H MOV TH0,#HIGH(-2000) MOV TL0,#LOW(-2000) SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 RET END BÀI TẬP: Đếm số từ 0-99 (giả sử