BÁO CÁO THÍ NGHIỆM VI XỬ LÝ Giáo viên hướng dẫn: PHẠM ĐĂNG LÂM Nhóm: L18 Sinh viên thực hiện: 1. Lương Trần Duy 1510462 2. Nguyễn Đình Trọng 1513701 3. Hồ Ngọc Uyên 1513983 4. Nguyễn Văn Trung 1513739 1 BÀI TN 1:LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED Thí nghiệm 1: Viết chương trình thực hiện việc đọc liên tục trạng thái của nút nhấn được nối đến P1.0 và hiển thị ra led được nối tại chân P3.0 (bit thứ 0 của led thanh BL202). ORG 2000H LAP: MOV C, P1.0 MOV P3.0, C SJMP LAP END Thínghiệm 3:Viết chương trình tạo xung vuông 1 Khz, chu kỳ nhiệm vụ 50% trên P3.0 ORG 2000H LOOP: MOV R2, #250 DJNZ R2, $ CPL P3.0 SJMP LOOP END Thí nghiệm 4:Viết chương trình con Delay1sIns và dùng chương trình con này để chớp tắt LED đơn gắn vào P1.0 sau mỗi khoảng thời gian 1s.
TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM BÁO CÁO THÍ NGHIỆM VI XỬ LÝ Giáo viên hướng dẫn: PHẠM ĐĂNG LÂM Nhóm: L18 Sinh viên thực hiện: Lương Trần Duy Nguyễn Đình Trọng Hồ Ngọc Uyên Nguyễn Văn Trung 1510462 1513701 1513983 1513739 BÀI TN 1:LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED Thí nghiệm 1: Viết chương trình thực việ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 P3.0 (bit thứ led BL202) ORG 2000H LAP: MOV C, P1.0 MOV P3.0, C SJMP LAP END Thínghiệm 3:Viết chương trình tạo xung vng Khz, chu kỳ nhiệm vụ 50% P3.0 ORG 2000H LOOP: MOV R2, #250 DJNZ R2, $ CPL P3.0 SJMP LOOP END Thí nghiệm 4:Viết chương trình Delay1sIns dùng chương trình để chớp tắt LED đơn gắn vào P1.0 sau khoảng thời gian 1s ORG 2000H LAP1: MOV R6, #250 MAIN: LAP: MOV R5, #250 CPL P1.0 DJNZ R5, $ ACALL Delay1sIns DJNZ R6, LAP SJMP MAIN DJNZ R7, LAP1 Delay1sIns: RET MOV R7, #8 END Thí nghiệm 5: Viết chương trình tạo hiệu ứng quay LED: LED đơn BARLED1 sáng từ trái sang phải sau thời gian 1s lặp lại Sử dụng chương trình 1s viết ORG 2000H Delay1sIns: TT: MOV A, #0FEH MOV R7, #8 LAP: MOV P1, A LAP1: MOV R6, #250 ACALL Delay1sIns LAP2: MOV R5, #250 RL A DJNZ R5, $ CJNE A, #FFH, LAP DJNZ R6, LAP2 SJMP TT DJNZ R7, LAP1 RET END BÀI TN2:LẬP TRÌNH CHO TIMER VÀ HIỂN THỊ LED ĐOẠN Thí nghiệm 1: Viết chương trình tạo sóng vng Khz chân P1.0 sử dụng timer chế độ tH = 500 µs tL = 500 µs ORG 2000H JNB TF0 MOV TMOD, #01H CLR TF0 LOOP: CPL P1.0 CLR TR0 MOV TH0, #HIGH(-500) SJMP LOOP MOV TL0,#LOW(-500) END SETB TR0 Thí nghiệm 2: Viết chương trình tạo sóng vng 10 Khz chân P1.0 sử dụng timer chế độ tH = 50 µs tL = 50 µs ORG 2000H LOOP: CPL P1.0 SETB P1.0 JNB TF0 MOV TMOD, #02H CLR TF0 MOV TH0, #-50 SJMP LOOP MOV TL0, #-50 END SETB TR0 Thínghiệm 3: - Viết chương trình DisplayLed0 hiển thị lên LED đoạn số giá trị chứa ghi R0 - Viết chương trình hiển thị số lên LED đoạn số cách cho R0 gọi chương trình DisplayLed0 ORG 2000H MOV R0, #9 ACALL DisplayLed0 DisplayLed0: MOV A, R0 ORL A, #0E0H MOV DPTR, #0000H MOVX @DPTR, A RET END Thí nghiệm 4: Viết chương trình hiển thị lên LED đoạn số số từ đến sau khoảng thời gian 1s ORG 2000H MOV TMOD, #01H LAP: MOV R0, #0 Delay1s: LOOP: LCALL DisplayLed0 MOV R7, #20 LCALL Delay1s LVONG: INC R0 MOV TH0, #HIGH(-50000) CJNE R0, #10, LOOP MOV TL0, #LOW(-50000) SJMP LAP SETB TR0 JNB TF0, $ DisplayLed0: CLR TF0 MOV A, R0 CLR TR0 ORL A, #0E0H DJNZ R7, LVONG MOV DPTR, #0000H RET MOVX @DPTR, A END RET BÀI TN3:QUÉT LED ĐOẠN VÀ GIAO TIẾP LCD Thí nghiệm 1: Viết chương trình DisplayLED xuất giá trị chứa ghi R0 lên LED đoạn có số thứ tự chứa ghi R1 R0 nằm tầm từ 0-9 R1 tầm từ 0-3 Sau dùng chương trình viết chương trình xuất giá trị lên LED đoạn số ORG 2000H SJMP $ MOV R0, #1 DisplayLED: MOV R1, #3 MOV A, R1 LCALL DisplayLED MOV DPTR, #POT MOVC A, @A +DPTR RET ORL A, R0 POT: DB 0E0H, 0D0H, 0B0H, 70H MOV DPTR, #0000H MOVX @DPTR, A END Thí nghiệm 2: Viết chương trình hiển thị số lên LED7 đoạn 0, sau 1s hiển thị số lên LED đoạn 1, sau 1s hiển thị số lên LED đoạn 2, sau 1s hiển thị số lên LED đoạn Quá trình lặp lặp lại Việc hiển thị sử dụng chương trình DisplayLED viết ORG 2000H JNB TF0, $ MOV TMOD, #01H CLR TF0 TTUC: MOV R0, #1 CLR TR0 DJNZ R7, LVONG MOV R1, #0 RET LAP: LCALL DisplayLED LCALL DELAY1s INC R0 INC R1 CJNE R0, #5, LAP SJMP TTUC DisplayLED: MOV A, R1 MOV DPTR, #POT MOVC A, @A +DPTR ORL A, R0 Delay1s: MOV R7, #20 LVONG: MOV TH0, #HIGH(-50000) MOV DPTR, #0000H MOVX @DPTR, A RET POT: DB 0E0H, 0D0H, 0B0H, 70H MOV TL0, #LOW(-50000) SETB TR0 END Thí nghiệm 3: Viết chương trình hiển thị LCD tên sinh viên hàng đầu LCD_E BIT P3.3 LCD_RS BIT P3.5 LCD_ADDR EQU 6000H ORG 2000H RET WRITETEXT: MOV TMOD, #01H MOV DPTR, #LCD_ADDR MOV DPTR, #LCD_ADDR SETB LCD_E LCALL LCD_INT SETB LCD_RS LCALL DISPLAY MOVX @DPTR, A SJMP $ CLR LCD_E LCD_INT: CALL WAIT MOV A, #38H LCALL WRITECOM RET DISPLAY: MOV A, #0EH MOV R3, #15 LCALL WRITECOM MOV A, #0 MOV A, #06H LOP: LCALL WRITECOM MOV DPTR, #TEXT MOV R0, A RET MOVC A, @A + DPTR WRITECOM: JZ EXIT MOV DPTR, #LCD_ADDR CLR LCD_RS CALL WRITETEXT LU: MOV A, R0 SETB LCD_E INC A MOVX @DPTR, A DJNZ R3, LOP CLR LCD_E MOV A, #0C0H LCALL WAIT ;tựđộngxuốnghàngthư khichuỗidàihơn 16 kítự RET LCALL WRITECOM WAIT: MOV R3, #15 MOV R6,#10 SJMP LU DL1: MOV R7,#250 DJNZ R7,$ DJNZ R6,DL1 EXIT: RET TEXT: DB "LuongTranDuy",0 END Thínghiệm 4: - Viết thêm chương trình CLRSCREEN để xóa hình LCD - Viết thêm chương trình GOTOXY để di chuyển trỏ LCD đến hàng x cột y, với x chứa R0, y chứa R1 - Sửa chương trình để hiển thị thêm số nhóm hàng thứ CLRSCREEN: GOTOXY: PUSH ACC PUSH ACC MOV A, #01H MOV A, R1;hàng x → R0 CALL WRITECOM CLR C POP ACC ;cột y → R1 SUBB A, #1 RET JZ GOTO MOV A, #40H GOTO: ADD A, #7FH ADD A, R2 LCALL WRITECOM POP ACC RET LCD_E BIT P3.3 LCD_RS BIT P3.5 SJMP $ LCD_INT: LCD_ADDR EQU 6000H MOV A, #38H ORG 2000H LCALL WRITECOM MOV R1, #2 MOV A, #0EH MOV R2, #1 LCALL WRITECOM MOV TMOD, #01H MOV A, #06H MOV DPTR, #LCD_ADDR LCALL WRITECOM LCALL LCD_INT LCALL CLRSCREEN LCALL DISPLAY RET WRITECOM: MOV DPTR, #LCD_ADDR CLR LCD_RS LU: MOV A, R0 SETB LCD_E INC A MOVX @DPTR, A DJNZ R3, LOP CLR LCD_E EXIT: LCALL GOTOXY LCALL WAIT RET MOV A, #0 LOP1: MOV DPTR, #TEXT1 WAIT: MOV R0, A MOV R6,#10 MOVC A, @A + DPTR DL1: MOV R7,#250 JZ EXIT1 DJNZ R7,$ LCALL WRITETEXT DJNZ R6,DL1 MOV A, R0 RET INC A WRITETEXT: MOV DPTR, #LCD_ADDR SJMP LOP1 EXIT1: RET SETB LCD_E TEXT: DB "LuongTranDuy",0 SETB LCD_RS TEXT1: DB “Nhom 1” ,0 MOVX @DPTR, A RET CLR LCD_E LCALL WAIT RET PUSH ACC DISPLAY: LOP: GOTOXY: MOV A, R1 MOV R3, #15 CLR C MOV A, #0 SUBB A, #1 MOV DPTR, #TEXT JZ GOTO MOV R0, A MOV A, #40H MOVC A, @A + DPTR GOTO: ADD A, #7FH JZ EXIT ADD A, R2 LCALL WRITETEXT LCALL WRITECOM POP ACC RET CALL WRITECOM POP ACC RET CLRSCREEN: PUSH ACC END MOV A, #01H BÀI TH4:LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ BÀN PHÍM SỐ HEX Thínghiệm 1: Viết chương trình đếm số lần nhấn SW310 (phím đơn kết nối vào P1.0), hiển thịl ên LCD theo cấu trúc: Push Number = xx (xx số lần nhấn) (khơng có chống rung phím) LCD_E BIT P3.4 LCD_RS BIT P3.5 MOV R0, #48 LCD_ADDR EQU 6000H MOV A, #48 TT: LCALL CLEAR ORG 2000H MOV R2, #2 MOV R1, #1 LCALL GOTOXY MOV R2, #1 PUSH ACC MOV TMOD, #01H MOV A, R0 MOV DPTR, #LCD_ADDR LCALL WRITETEXT LCALL LCD_INT POP ACC 10 MOV A, #48 DL1: MOV R7,#250 INC R0 DJNZ R7,$ CJNE R0,#58, TT DJNZ R6,DL1 MOV R0, #48 POP 07H SJMP TT POP 06H RET LCD_INT: MOV A, #38H WRITETEXT: LCALL WRITECOM MOV DPTR, #LCD_ADDR MOV A, #0EH SETB LCD_E LCALL WRITECOM SETB LCD_RS MOV A, #06H MOVX @DPTR, A LCALL WRITECOM CLR LCD_E RET LCALL WAIT RET WRITECOM: MOV DPTR, #LCD_ADDR CLEAR: CLR LCD_RS PUSH ACC SETB LCD_E MOV A, #01H MOVX @DPTR, A CALL WRITECOM CLR LCD_E LCALL WAIT POP ACC RET RET GOTOXY: WAIT: PUSH ACC PUSH 06H MOV A, R1 PUSH 07H CLR C MOV R6,#10 SUBB A, #1 13 JZ GOTO DELAY1ms: MOV A, #40H MOV TH0, #HIGH(-1000) GOTO: ADD A, #7FH MOV TL0, #LOW(-1000) ADD A, R2 SETB TR0 LCALL WRITECOM JNB TF0, $ POP ACC CLR TR0 RET CLR TF0 RET END Thí nghiệm 3: Viết chương trình SCANKEY quét bàn phím ma trận 4x4 board thí nghiệm Các giá trị trả vềt 0-15 có phím nhấn 255 khơng có phím nhấn Kết chứa R0 Sử dụng chương trình viết chương trình gửi lên máy tính ký tự từ '0' 'F' ứng với phím nhấn bàn phím, baudrate 19200 ORG 2000H MAIN: MOV P1, #0EFH MOV SCON, #52H CALL WAIT MOV TMOD, #20H MOV A, P1 MOV TH1, #-3 CJNE A, #0EEH, BUT01 MOV A, PCON MOV A, “0” SETB ACC.7 MOV PCON, A CALL SCANKEY CJNE A, #255, TT SJMP MAIN TT: LCALL PHAT SJMP MAIN JMP DONE BUT01: CJNE A, #0EDH, BUT02 MOV A, “4” JMP DONE BUT02: CJNE A, #0EBH, BUT03 MOV A, “8” JMP DONE BUT03: CJNE A, #0E7H, OW SCANKEY: MOV A, “C” 14 JMP DONE MOV A, “D” JMP DONE OW: MOV P1, #0DFH OW2: LCALL WAIT MOV P1, #07FH MOV A, P1 LCALL WAIT CJNE A, #0DEH, BUT11 MOV A, P1 MOV A, “1” CJNE A, #07EH, BUT31 JMP DONE MOV A, “3” BUT11: CJNE A, #0DDH, BUT12 JMP DONE MOV A, “5” BUT31: CJNE A, #07DH, BUT32 JMP DONE MOV A, “7” BUT12: CJNE A, #0DBH, BUT13 JMP DONE MOV A, “9” BUT32: CJNE A, #07BH, BUT33 JMP DONE MOV A, “B” BUT13: CJNE A, #0D7H, OW1 JMP DONE MOV A, “D” BUT33: CJNE A, #077H, OW3 JMP DONE MOV A, “F” OW1: JMP DONE MOV P1, #0BFH CALL WAIT OW3: MOV A, #255 MOV A, P1 DONE: NOP CJNE A, #0BEH, BUT21 RET MOV A, “2” JMP DONE WAIT: BUT21: CJNE A, #0BDH, BUT22 MOV A, “6” MOV R7, #40; LAP: JMP DONE DJNZ R6, $ BUT22: CJNE A, #0BBH, BUT13 MOV A, “A” MOV R6, #250; DJNZ R7, LAP RET JMP DONE BUT23: CJNE A, #0B7H, OW2 15 PHAT: MOV SBUF, A JNB TI, $ RET CLR TI END BÀI TH5:LẬP TRÌNH GIAO TIẾP SERIAL PORT VÀ ADC Thí nghiệm 1: Viết chương trình phát chuỗi ký tự “Hello, world” lên máy tính thơng qua HyperTerminal với tốc độ baud 19200 pbs SW 310 (gắnvào P1.0) đượcnhấn ORG 2000H MOV TMOD ,#20h MOVC A, @A+DPTR MOV TH1,#-3 MOV SBUF, A MOV SCON,#52H MOV A, R0 MOV A, PCON INC A SETB ACC.7 CLR TI MOV PCON, A SJMP LOOP MOV DPTR, #TEXT TEXT: DB "Hello, world" MOV A , #0 DELAY1ms: SETB TR1 LOOP: MOV R1, #20 SS1: PUSH 01h PUSH 02h JNB P1.0, $ LCALL DELAY1ms SS2: MOV R0,A MOV R1, #2 LL: MOV R2, #250 DJNZ R1, SS1 DJNZ R2, $ MOV R1, #20 DJNZ R1, LL JB P1.0, $ POP 02h LCALL DELAY1ms POP 01h DJNZ R1, SS2 JNB TI, $ RET END 16 Thí nghiệm 2: Viết chương trình nhận ký tự từ máy tính gửi đến EME-MC8 thơng qua HyperTerminal (bằng cách gõ ký tự bàn phím chương trình HyperTerminal) hiển thị lên LCD sau: Nếu ký tự chữ hiển thị lên LCD; Enter xuống hàng; ESC xóa hình LCD; Backspace xóa ký tự bên trái dấu nháy LCD_E BIT P3.3 LCALL WRITECOM LCD_RS BIT P3.5 MOV A, #0 LCD_ADDR EQU 6000H LCALL WRITETEXT ORG 2000H CLR RI ;R1hàng, 1-2 SJMP LAP ;R2cột 1-16 TT: CJNE A, #10, TT1 MOV R1, #1 ;ENTER MOV R2, #1 PUSH 01H MOV TMOD, #01H PUSH 02H MOV DPTR, #LCD_ADDR MOV R1,#2 LCALL LCD_INT MOV R2,#1 MOV TMOD, #20H LCALL GOTOXY MOV TH1, #-3 POP 02H MOV SCON , #50H POP 01H MOV A, PCON CLR RI SETB ACC.7 SJMP LAP MOV PCON, A TT1: SETB TR1 LAP: CJNE A, #27, TT2 ;XOA MAN HINH JNB RI, $ LCALL CLEAR MOV A, SBUF CLR RI CJNE A, #8, TT SJMP LAP ;XOA KT MOV A, #10H; TT2: CJNE A, #65,$+3 JC LAP 17 CJNE A, #91, $+3 CLR LCD_E JNC TT3 LCALL WAIT LCALL WRITETEXT RET CLR RI SJMP LAP TT3: WAIT: CJNE A, #97, $+3 MOV R6,#10 JC LAP DL1: MOV R7,#250 CJNE A, #123, $+3 DJNZ R7,$ JNC LAP DJNZ R6,DL1 LCALL WRITETEXT RET CLR RI SJMP LAP WRITETEXT: MOV DPTR, #LCD_ADDR SETB LCD_E LCD_INT: SETB LCD_RS MOV A, #38H MOVX @DPTR, A LCALL WRITECOM CLR LCD_E MOV A, #0EH CALL WAIT LCALL WRITECOM RET MOV A, #06H LCALL WRITECOM CLEAR: RET MOV A, #01H CALL WRITECOM WRITECOM: RET MOV DPTR, #LCD_ADDR CLR LCD_RS GOTOXY: SETB LCD_E MOV A, R1 MOVX @DPTR, A CLR C 18 SUBB A, #1 ADD A, R2 JZ GOTO LCALL WRITECOM MOV A, #40H RET GOTO: ADD A, #7FH END Thí nghiệm 3: Viết chương trình READADC thực đọc giá trị kênh trả giá trị R0 Viết chương trình hiển thị giá trị kênh ADC lên LCD dùng chương trình READADC viết LCD_E BIT P3.3 ACALL WRITETEXT LCD_RS BIT P3.5 SJMP LAP LCD_ADDR EQU 6000H ORG 2000H READADC: MOV A, #0 MOV R2, #1 MOV R7,#100 MOV TMOD, #01H MOV DPTR, #4000H MOVX @DPTR, A ACALL LCD_INT DJNZ R7,$ ACALL LCD_CLR MOVX A, @DPTR LAP: MOV R0, A MOV R1,#1 RET ACALL GOTOXY ACALL READADC LCD_INT: MOV B, #100 MOV A, #38H DIV AB LCALL WRITECOM ADD A, #48 MOV A, #0EH ACALL WRITETEXT LCALL WRITECOM MOV A, B MOV A, #06H MOV B, #10 LCALL WRITECOM DIV AB RET ADD A, #48 ACALL WRITETEXT WRITECOM: MOV A, B MOV DPTR, #LCD_ADDR ADD A, #48 CLR LCD_RS 19 SETB LCD_E GOTOXY: MOVX @DPTR, A PUSH ACC CLR LCD_E MOV A, R2 LCALL WAIT CLR C RET SUBB A, #1 JZ GOTO WAIT: MOV A, #40H MOV R6,#10 GOTO: DL1: MOV R7,#250 ADD A, R1 DJNZ R7,$ LCALL WRITECOM DJNZ R6,DL1 POP ACC RET ADD A, #7FH RET WRITETEXT: MOV DPTR, #LCD_ADDR LCD_CLR: SETB LCD_E PUSH ACC SETB LCD_RS MOV A, #01H MOVX @DPTR, A ACALL WRITECOM CLR LCD_E POP ACC CALL WAIT RET RET END Thí nghiệm 4: Viết chương trình CALADC tính toán giá trị điện áp thực tế đặt vào kênh ADC từ giá trị đo ADC Chương trình có giá trị vào chứa R0 (là kết chương trình READADC) Giá trị trả chứa R0 R1, R0 chứa giá trị nguyên R1 chứa giá trị thập phân LCD_E BIT P3.3 LCD_ADDR EQU 6000H LCD_RS BIT P3.5 ORG 2000H 20 MOV A, #0 MOV R2, #1 MOV R7,#100 MOV TMOD, #01H MOV DPTR, #4000H MOV DPTR, #LCD_ADDR MOVX @DPTR, A LCALL LCD_INT DJNZ R7,$ ACALL LCD_CLR MOVX A, @DPTR MOV R0, A LAP: RET MOV R3, #1 ACALL GOTOXY ACALL READADC LCD_INT: ACALL CALADC MOV A, #38H MOV A,R0 LCALL WRITECOM ACALL WRITETEXT MOV A, #0EH MOV A, #2EH LCALL WRITECOM ACALL WRITETEXT MOV A, #06H MOV A, R1 LCALL WRITECOM ACALL WRITETEXT SJMP LAP RET WRITECOM: CALADC: MOV DPTR, #LCD_ADDR MOV B, #50 CLR LCD_RS DIV AB SETB LCD_E ADD A, #48 MOVX @DPTR, A MOV R0, A CLR LCD_E MOV A, B LCALL WAIT MOV B, #5 DIV AB RET WAIT: ADD A, #48 MOV R6,#10 MOV R1, A DL1: MOV R7,#250 RET DJNZ R7,$ DJNZ R6,DL1 READADC: RET 21 WRITETEXT: MOV A, #40H MOV DPTR, #LCD_ADDR GOTO: ADD A, #7FH SETB LCD_E ADD A, R3 SETB LCD_RS LCALL WRITECOM MOVX @DPTR, A CLR LCD_E POP ACC RET CALL WAIT RET LCD_CLR: PUSH ACC GOTOXY: MOV A, #01H PUSH ACC ACALL WRITECOM MOV A, R2 POP ACC CLR C RET SUBB A, #1 JZ GOTO END BÀI TH 6: LẬP TRÌNH NGẮT Thí nghiệm 1:Viết chương trình làm song song công việ sau: Nhận byte từ máy tính xuất ngược lại (echo) lên hình terminal Bật LED gắn vào P1.1 SW 317 (gắn vào P1.0) nhấn, tắt LED phím nhả ORG 2000H MOV SCON , #52H JMP MAIN MOV A, PCON ORG 2023H SETB ACC.7 JMP ISRPORT MOV PCON, A MAIN: SETB TR1 MOV TMOD, #20H MOV IE, #10010000B MOV TH1, #-3 LOOP: MOV R1, #20 22 SS1: JNB P1.0, $ MOV A, SBUF LCALL DELAY1ms MOV SBUF, A DJNZ R1, SS1 SS2: JMP DONE MOV R1, #20 SKIP: CLR TI SETB P1.1 DONE: RETI JB P1.0, $ DELAY1ms: LCALL DELAY1ms DJNZ R1, SS2 MOV R7, #2 VONG: MOV R6, #250 CLR P1.1 DJNZ R6, $ JMP LOOP DJNZ R7, VONG ISRPORT: RET JNB RI, SKIP END CLR RI Thí nghiệm 2: Viết chương trình hiển thị lên LED đoạn số có chữ số, ký số chứa ô nhớ 20H, 21H, 22H 23H Ơ nhớ 20H chứa số hàng nghìn ORG 2000H MOV TH0, #HIGH(-1000) JMP MAIN SETB TR0 ORG 200BH MOV IE, #10000010B JMP ISRT0 MOV R3, #20H MAIN: MOV R1, #3 MOV 20H, #1 SJMP $ MOV 21H, #3 ISRT0: CLR TR0 MOV 22H, #1 MOV TL0, #LOW(-1000) MOV 23H, #8 MOV TH0, #HIGH(-1000) MOV TMOD, #01H MOV A, R3 MOV TL0, #LOW(-1000) ADD A, R1 23 MOV R0, A MOV R2, A LCALL DISPLAYLED MOV A, @R0 DEC R1 SKIP: CJNE R1, #0FFH, SKIP ORL A, R2 MOV R1, #3 MOV DPTR, #0000H SETB TR0 MOVX @DPTR, A RETI RET DISPLAYLED: MOV A, R1 POT: DB 070H, 0B0H, 0D0H, 0E0H MOV DPTR, #POT MOVC A, @A+DPTR END Thí nghiệm 3: Viết chương trình đếm số lần nhấn phím SW317, hiển thị lên LED đoạn ORG 2000H MOV TMOD, #01H JMP MAIN MOV TH0, #HIGH(-10000) ORG 200BH MOV TL0, #LOW(-10000) JMP IRST0 MOV IE, #82H ORG 2030H SETB TR0 MAIN: MOV R3, #23H SKIP: MOV R7, #20 MOV R1, #0 T: JNB P1.7, $ LCALL DELAY1MS MOV 20H, #0 DJNZ R7, T MOV 21H, #0 MOV R7, #20 MOV 22H, #0 LOP: JB P1.7, $ MOV 23H, #0 LCALL DELAY1MS 24 DJNZ R7, LOP MOV R0, A LCALL FORLED INC 23H INC R1 MOV A, 23H CJNE R1, #4, CONTI CJNE A, #10, SKIP MOV R1, #0 MOV 23H, #0 CONTI: INC 22H RETI MOV A, 22H FORLED: CJNE A, #10, SKIP MOV A, R1 MOV 22H, #0 MOV DPTR, #POT INC 21H MOVC A, @A + DPTR MOV A, 21H MOV R6,A CJNE A, #10, SKIP MOV A, @R0 MOV 21H, #0 ORL A, R6 INC 20H MOV DPTR, #0000H MOV A, 20H MOVX @DPTR, A CJNE A, #10, SKIP RET MOV 20H, #0 POT: DB 0E0H, 0D0H, 0B0H, 070H SJMP SKIP DELAY1MS: MOV R4, #2 IRST0:MOV TH0, #HIGH(-10000) MOV TL0, #LOW(-10000) LAP: MOV R5, #250 DJNZ R5, $ DJNZ R4, LAP MOV A, R3 RET CLR C END SUBB A, R1 Thí nghiệm 4:Viết chương trình thực đồng hồ bấmgiây, hiển thị lên LED đoạn Hai LED thể số giây, LED thể phần tram giây Khi SW310 nhấn, đồnghồ reset SW 311 nhấn, đồng hồ bắt đầu chạy 25 SW 312 nhấn, đồng hồ dừng lại ORG 2000H TT1: JB P1.2, TT2; kiểmtradừng JMP MAIN ORG 200BH JMP IRST0 ORG 2030H CLR TR0 MOV IE, #0 TA2: JNB P1.0, TT2 LCALL FORLED MAIN: JB P1.1, TA2 MOV R3, #20H JMP T2 MOV R1, #0 MOV TMOD, #01H IRST0: MOV TH0, #HIGH(-10000) MOV TH0, #HIGH(-10000) MOV TL0, #LOW(-10000) MOV TL0, #LOW(-10000) LCALL FORLED LL1: MOV 20H, #0 MOV 21H, #0 INC 20H MOV 22H, #0 MOV A, 20H MOV 23H, #0 CJNE A, #10, SKIP LL: LCALL FORLED T2: MOV A, 20H MOV 20H, #0 JB P1.1, LL INC 21H SETB TR0 MOV A, 21H MOV IE, #10000010B CJNE A, #10, SKIP TT2: JB P1.0, TT1 MOV 21H, #0 T: INC 22H CLR TR0 MOV IE, #0 JMP LL1 MOV A, 22H CJNE A, #10, SKIP 26 MOV 22H, #0 MOV R1, #0 INC 23H DONE: RET MOV A, 23H CJNE A, #07, SKIP DISPLAY: MOV 23H, #0 MOV A, R1 SKIP: RETI MOV DPTR, #POT MOVC A, @A +DPTR MOV R2, A MOV A, @R0 FORLED: ORL A, R2 MOV A, R3 MOV DPTR, #0000H ADD A, R1 MOVX @DPTR, A MOV R0, A RET LCALL DISPLAY POT: DB 0E0H,0D0H,0B0H,070H INC R1 CJNE R1, #4, DONE END 27 ... #0 DELAY1ms: SETB TR1 LOOP: MOV R1, #20 SS1: PUSH 01h PUSH 02h JNB P1.0, $ LCALL DELAY1ms SS2: MOV R0,A MOV R1, #2 LL: MOV R2, #250 DJNZ R1, SS1 DJNZ R2, $ MOV R1, #20 DJNZ R1, LL JB P1.0, $ POP... 2000H CLR RI ;R1hàng, 1- 2 SJMP LAP ;R2cột 1- 16 TT: CJNE A, #10 , TT1 MOV R1, #1 ;ENTER MOV R2, #1 PUSH 01H MOV TMOD, #01H PUSH 02H MOV DPTR, #LCD_ADDR MOV R1,#2 LCALL LCD_INT MOV R2, #1 MOV TMOD,... TH1, #-3 LOOP: MOV R1, #20 22 SS1: JNB P1.0, $ MOV A, SBUF LCALL DELAY1ms MOV SBUF, A DJNZ R1, SS1 SS2: JMP DONE MOV R1, #20 SKIP: CLR TI SETB P1 .1 DONE: RETI JB P1.0, $ DELAY1ms: LCALL DELAY1ms