BÁO CÁO THÍ NGHIỆM MÔN: VI XỬ LÝ TP.HCM , THÁNG ...... NĂM 201... 1 Để tạo sự trực quan và dễ hiểu cho người đọc, một số chương trình có số câu lệnh nhiều sẽ được chia làm nhiều cột, được đọc từ trái sang phải. BÀI 1: LẬP TRÌNH GIAO TIẾP LED ĐƠN VÀ PHÍM ĐƠN 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 LOOP: SETB P1.0 MOV C, P1.0 MOV P3.0,C SJMP LOOP END - LED nối vào P1.0 và P3.0 đều bị tác động. LED tại P1.0 bị tác động do phần cứng, khi nhấn phím, mức điện áp trên P1.0 bằng 0, đầu còn lại của LED được nối với điện trở và nối lên VCC nên đèn tại P1.0 sáng. Tương tự, tại P3.0, 1 đầu LED được nối vào điện trở và nối đến VCC, đầu còn lại nối đến P3.0. Khi nhấn nút, P1.0 có mức điện áp thấp, phần mềm sẽ đọc mức điện áp và đặt cho P3.0 mức điện áp thấp nên đèn sáng. - Tất cả các chân trên P1 và P3 đều có thể sử dụng do tất cả các chân đều có thể dùng làm chân IO. THÍ NGHIỆM 2: Biên dịch và thử nghiệm chương trình cho sẵn sau: ORG 2000H MAIN: CPL P3.0 JMP MAIN END - Theo lý thuyết, với thạch anh 11.0592MHz, chương trình trên sẽ tạo ra sóng vuông trên P3.0 với chu kì 6.5us - Vẽ dạng sóng: - Tần số tối đa một xung tuần hoàn có chu kỳ nhiệm vụ 50% có thể đạt được là 153600Hz với đoạn code như trên
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA ĐIỆN – ĐIỆN TỬ BỘ MƠN ĐIỆN TỬ BÁO CÁO THÍ NGHIỆM MƠN: VI XỬ LÝ TP.HCM , THÁNG NĂM 201 Để tạo trực quan dễ hiểu cho người đọc, số chương trình có số câu lệnh nhiều chia làm nhiều cột, đọc từ trái sang phải BÀI 1: LẬP TRÌNH GIAO TIẾP LED ĐƠN VÀ PHÍM ĐƠN 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 LOOP: SETB P1.0 MOV C, P1.0 MOV P3.0,C SJMP LOOP END - LED nối vào P1.0 P3.0 bị tác động LED P1.0 bị tác động phần cứng, nhấn phím, mức điện áp P1.0 0, đầu lại LED nối với điện trở nối lên VCC nên đèn P1.0 sáng Tương tự, P3.0, đầu LED nối vào điện trở nối đến VCC, đầu lại nối đến P3.0 Khi nhấn nút, P1.0 có mức điện áp thấp, phần mềm đọc mức điện áp đặt cho P3.0 mức điện áp thấp nên đèn sáng - Tất chân P1 P3 sử dụng tất chân dùng làm chân IO THÍ NGHIỆM 2: Biên dịch thử nghiệm chương trình cho sẵn sau: ORG 2000H CPL P3.0 JMP MAIN MAIN: END - Theo lý thuyết, với thạch anh 11.0592MHz, chương trình tạo sóng vng P3.0 với chu kì 6.5us - Vẽ dạng sóng: - Tần số tối đa xung tuần hồn có chu kỳ nhiệm vụ 50% đạt 153600Hz với đoạn code 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 CONT: CPL P3.0 ACALL DELAY05MS SJMP CONT DELAY05MS: MOV R7,#230 LOOP: DJNZ R7,LOOP RET END - Vòng trễ tạo với thời gian trễ 0.5ms Mỗi vịng lặp DJNZ có thời gian thực thi chu kì máy, chu kì máy có thời gian 12 chu kì thạch anh Gọi n số lần lặp: 0.5(10^-3)=2n.Tmáy=2n.12Txtal=24n.(1/11059200) => n=230.4 => chọn n=230 - Vẽ lại dạng sóng: - Sai số nhỏ đạt được: (230.4-230)/230.4=0.17% 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 LOOP2: LOOP: MOV R5,#250 CPL P1.0 LOOP3: ACALL DELAY1SINS DJNZ R5,LOOP3 SJMP LOOP DJNZ R6,LOOP2 DELAY1SINS: DJNZ R7,LOOP1 MOV R7,#7 RET LOOP1: END MOV R6,#250 - Tính thời gian delay 1s: 1=2n.Tmáy=2n.12Txtal=24n.( ) => n=460800 => chọn n1=250; n2=250; n3=7 11059200 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 LOOP1: MOV DPTR,#SIGNAL MOV R6,#250 LOOP: LOOP2: MOV R7,#8 MOV R5,#250 LOOP1: LOOP3: MOV A,R7 DJNZ R5,LOOP3 MOVC P1,@A+DPTR DJNZ R6,LOOP2 ACALL DELAY1SINS DJNZ R7,LOOP1 DJNZ R7,LOOP1 RET MOV P1,#0FFH SIGNAL: SJMP LOOP DB 00H,01H,03H,07H,0FH,1FH,3FH,7FH DELAY1SINS: END MOV R7,#7 - LED bên trái nối với MSB P1 BÀI 2: LẬP TRÌNH 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ế độ - Có dùng timer mod kết hợp vòng lặp ORG 2000H MOV TL0,#LOW(-461) LOOP: SETB TR0 CPL P1.0 JNB TF0,$ ACALL DELAY05MS CLR TF0 SJMP LOOP CLR TR0 DELAY05MS: RET MOV TMOD,#01H END MOV TH0,#HIGH(-461) - Dạng sóng bị sai số, để hạn chế sai số, ta nên tính tốn giá trị nạp vào TH0 TL0 tần số xtal mạch THÍ NGHIỆM 2: Viết chương trình tạo sóng vuông 10 KHz chân P1.0 sử dụng timer chế độ ORG 2000H MOV TMOD,#02H MOV TH0,#-46 SETB TR0 LOOP: JNB TF0,$ CLR TF0 CPL P1.0 SJMP LOOP END - Ở chế độ 2, độ trễ gây câu lệnh đảo giá trị bit gây sai số cho dạng sóng ngõ Tuy nhiên sai số khơng lớn 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 ORG 2000H MOV R7, #128 ; Giá trị ví dụ CALL BI2BCD AGAIN: ; HIEN THI HANG DON VI MOV A, 21H MOV DPTR, #DONVI MOVC A, @A+DPTR MOV DPTR, #0000H MOVX @DPTR, A LCALL DELAY ; HIEN THI HANG CHUC MOV A, 22H MOV DPTR, #CHUC MOVC A, @A+DPTR MOV DPTR, #0000H MOVX @DPTR, A LCALL DELAY ; HIEN THI HANG TRAM MOV A, 23H MOV DPTR, #TRAM MOVC A, @A+DPTR MOV DPTR, #0000H MOVX @DPTR, A LCALL DELAY SJMP EXIT DELAY: MOV TH0, #HIGH(-1000) MOV TL0, #LOW(-1000) SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 RET RET BI2BCD: MOV A, R7 MOV B, #10 DIV AB MOV 21H, B ; LUU HANG DON VI MOV B, #10 DIV AB MOV 22H, B ; LUU HANG CHUC MOV 23H, A ; LUU HANG TRAM RET DONVI: DB 0E0H, 0E1H, 0E2H, 0E3H, 0E4H, 0E5H, 0E6H, 0E7H, 0E8H, 0E9H CHUC: DB 0D0H, 0D1H, 0D2H, 0D3H, 0D4H, 0D5H, 0D6H, 0D7H, 0D8H, 0D9H TRAM: DB 0B0H, 0B1H, 0B2H, 0B3H, 0B4H, 0B5H, 0B6H, 0B7H, 0B8H, 0B9H EXIT: NOP 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 R0,#0 LOOP: ACALL DISPLAYLED0 INC R0 ACALL DELAY1S CJNE R0,#10,LOOP MOV R0,#0 SJMP LOOP DISPLAYLED0: MOV A,R0 ADD A,#0E0H MOV DPTR,#0000H MOVX @DPTR,A RET DELAY1S: MOV R7,#18 TIMELOOP: MOV TMOD, #01H MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 DJNZ R7,TIMELOOP RET END BÀI 3: 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 DONE MOV R0,#1 ANONUM2: MOV R1,#3 CJNE A,#2,ANONUM3 ACALL DISPLAYLED MOV A,#0B0H SJMP FINISH ADD A,R0 DISPLAYLED: SJMP DONE MOV A,R1 ANONUM3: CJNE A,#0,ANONUM1 MOV A,#70H MOV A,#0E0H ADD A,R0 ADD A,R0 DONE: SJMP DONE MOV DPTR,#0000H ANONUM1: MOVX @DPTR,A CJNE A,#1,ANONUM2 RET MOV A,#0D0H FINISH: NOP ADD A,R0 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 Giảm thời gian trễ xuống 100 ms Quan sát tượng Tính tốn thời gian trễ cho khơng cịn thấy LED nhấp nháy áp dụng vào chương trình Giảm thời gian trễ xuống (không sử dụng hàm delay) Quan sát tượng ORG 2000H LOOP: MOV R7,#4 MOV R0,#1 MOV R1,#0 LOOP1: ACALL DISPLAYLED ACALL DELAY1S INC R0 INC R1 DJNZ R7, LOOP1 SJMP LOOP DISPLAYLED: MOV A,R1 CJNE A,#0,ANONUM1 MOV A,#0E0H ADD A,R0 SJMP DONE ANONUM1: CJNE A,#1,ANONUM2 MOV A,#0D0H ADD A,R0 SJMP DONE ANONUM2: CJNE A,#2,ANONUM3 MOV A,#0B0H ADD A,R0 SJMP DONE ANONUM3: MOV A,#70H ADD A,R0 DONE: MOV DPTR,#0000H MOVX @DPTR,A RET DELAY1S: MOV R7,#18 TIMELOOP: MOV TMOD, #01H MOV TH0,#HIGH(50000) MOV TL0,#LOW(-50000) SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 DJNZ R7,TIMELOOP RET END - Khi giảm thời gian delay 100ms, LED đoạn chớp tắt nhanh - Khi loại bỏ hàm delay, LED đoạn dường hiển thị số lúc - Mắt người có tượng lưu ảnh, hình ảnh chuyển động với tốc độ 24 khung hình giây khiến mắt ta phân biệt nhấp nháy ảnh Vậy LED cần có thời gian sáng chu kì qt là: 1/(4.25)=10ms THÍ NGHIỆM 3: Download chương trình mẫu LCD.A51 trang web mơn điện tử Biên dịch chạy thử chương trình Sửa chương trình để hiển thị tên sinh viên lên hàng đầu - Tại cuối chương trình, sau nhãn MESSAGE, sửa kí tự dấu “” thành tên sinh viên 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 GOTOXY: ROW1: MOV A,R0 ADD A,R1 CJNE A,#0,ROW1 ADD A,#40H ADD A,R1 ADD A,#80H ADD A,#80H GOTOXYDONE: SJMP GOTOXYDONE RET Sửa chương trình thí nghiệm để hiển thị thêm số nhóm hàng thứ LCD_E BIT P3.4 SJMP $ LCD_RS BIT P3.5 INIT_LCD: LCDADDR MOV A, #38H EQU 6000H ORG 0000H ACALL WRITECOM MAIN: MOV A, #0EH MOV @R0, 30H ACALL WRITECOM MOV DPTR, #LCDADDR MOV A, #06H ACALL CLEAR ACALL WRITECOM ACALL INIT_LCD RET ACALL DISPLAYSTRING CLEAR: MOV R0,#1 MOV A, #01H MOV R1,#0 ACALL WRITECOM ACALL GOTOXY ACALL DISPLAYSTRING1 RET GOTOXY: MOV A,R0 MOVC A,@A+DPTR CJNE A,#0,ROW1 JZ ADD A,R1 ACALL WRITETEXT ADD A,#80H MOV A,R0 SJMP GOTOXYDONE INC ROW1: DJNZ B,LOOP EXIT A ADD A,R1 EXIT: ADD A,#40H RET ADD A,#80H DISPLAYSTRING1: GOTOXYDONE: MOV A,#0 RET LOOP1: WRITECOM: MOV DPTR, #MESSAGE1 MOV DPTR, #LCDADDR MOV SETB LCD_E MOVC A,@A+DPTR CLR JZ EXIT MOVX @DPTR, A ACALL WRITETEXT CLR MOV A,R0 ACALL WAIT_LCD INC A RET DJNZ B,LOOP LCD_RS LCD_E WRITETEXT: WAIT_LCD: MOV DPTR, #LCDADDR SETB LCD_E R0,A MOV R6,#10 DL1: SETB LCD_RS MOV R7, #250 MOVX @DPTR, A DJNZ R7, $ CLR DJNZ R6,DL1 LCD_E ACALL WAIT_LCD RET DISPLAYSTRING: MOV A,#0 LOOP: MOV DPTR, #MESSAGE RET MESSAGE: DB "HELLO WORLD!",0 MESSAGE1: DB "NHOM 4",0 END MOV R0,A 10 BÀI 4: LẬP TRINH 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) LCD_E BIT P3.4 MOV A,#0EH LCD_RS BIT P3.5 ACALL WRITECOM LCDADDR 6000H MOV ORG EQU A,#06H ACALL WRITECOM 0000H RET MAIN: CLEAR: MOV MOV @R0, 30H MOV DPTR, A,#01H ACALL WRITECOM #LCDADDR RET ACALL CLEAR ACALL INIT_LCD MOV P1,#0FFH MOV R0,#0 WRITECOM: MOV DPTR,#LCDADDR LOOP: SETB LCD_E ACALL CLEAR CLR ACALL DISPLAYSTRING LCD_RS MOVX @DPTR, A CLR ACALL DISPNUM ACALL WAIT_LCD MOV A,P1 CJNE A,#0FEH, LOOP INC R0 SJMP LOOP LCD_E RET WRITETEXT: MOV DPTR,#LCDADDR SETB LCD_E DISPNUM: SETB LCD_RS MOV A,R0 MOVX @DPTR, A DIV AB CLR ADD A,#30H ACALL WAIT_LCD ACALL WRITETEXT MOV A,B LCD_E RET DISPLAYSTRING: ADD A,#30H MOV ACALL WRITETEXT RET A,#0 LOOPDISPSTRING: INIT_LCD: MOV A,#38H ACALL WRITECOM MOV DPTR, MOV R0,A #MESSAGE 11 MOVC A,@A+DPTR MOV R6,#10 ACALL WRITETEXT MOV R7, #250 MOV A,R0 DJNZ R7, $ INC A DJNZ R6,DL1 JZ EXIT DL1: DJNZ B,LOOPDISPSTRING RET EXIT: MESSAGE: RET WAIT_LCD: DB "PUSH NUMBER = ",0 END 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, có chống rung phím LCD_E BIT P3.4 MOV A,#0EH LCD_RS BIT P3.5 ACALL WRITECOM LCDADDR EQU 6000H MOV A,#06H ORG 0000H ACALL WRITECOM MAIN: RET CLEAR: MOV A,#01H MOV DPTR, #LCDADDR ACALL WRITECOM ACALL CLEAR RET ACALL INIT_LCD MOV P1,#0FFH MOV R0,#0 WRITECOM: LOOP: MOV DPTR,#LCDADDR ACALL CLEAR SETB LCD_E ACALL DISPLAYSTRING CLR LCD_RS ACALL DISPNUM MOVX @DPTR, A MOV A,P1 CLR LCD_E ACALL DELAYBUTTON ACALL WAIT_LCD CJNE A,#0FEH, LOOP RET INC R0 WRITETEXT: SJMP LOOP MOV DPTR,#LCDADDR DISPNUM: SETB LCD_E MOV A,R0 SETB LCD_RS MOV B,#10 MOVX @DPTR, A DIV AB CLR LCD_E ADD A,#30H ACALL WAIT_LCD ACALL WRITETEXT RET MOV A,B DISPLAYSTRING: ADD A,#30H MOV A,#0 ACALL WRITETEXT LOOPDISPSTRING: RET MOV DPTR, #MESSAGE INIT_LCD: MOV R0,A MOV A,#38H MOVC A,@A+DPTR ACALL WRITECOM JZ EXIT 12 ACALL WRITETEXT RET MOV A,R0 DELAYBUTTON: INC A MOV R6,#40 DJNZ B,LOOPDISPSTRING DL2: EXIT: MOV R7, #250 RET DJNZ R7, $ WAIT_LCD: DJNZ R6,DL2 MOV R6,#10 RET DL1: MESSAGE: MOV R7, #250 DB "PUSH NUMBER = ",0 DJNZ R7, $ END DJNZ R6,DL1 THÍ NGHIỆM 3:Viết chương trình SCANKEY qt bàn phím ma trận 4x4 board thí nghiệm Các giá trị trả 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 ANOBUT3: MAIN: CJNE A,#0E7H,ANOBUT4 MOV SCON,#52H MOV R0,#'C' MOV TMOD,#20H SJMP DONE MOV TH1,#-3 ANOBUT4: SETB TR1 MOV P1,#0DFH ACALL SCANKEY ACALL DELAYBUTTON MOV A,R0 MOV A,P1 CJNE A,#225,SENDCHAR CJNE A,#0DEH,ANOBUT5 SJMP MAIN MOV R0,#'1' SENDCHAR: SJMP DONE ACALL SEND ANOBUT5: SJMP MAIN CJNE A,#0DDH,ANOBUT6 SEND: MOV R0,#'5' JNB TI,$ SJMP DONE CLR TI ANOBUT6: MOV SBUF,A CJNE A,#0DBH,ANOBUT7 RET MOV R0,#'9' SCANKEY: SJMP DONE MOV P1,#0EFH ANOBUT7: ACALL DELAYBUTTON CJNE A,#0D7H,ANOBUT8 MOV A,P1 MOV R0,#'D' CJNE A,#0EEH,ANOBUT1 SJMP DONE MOV R0,#'0' ANOBUT8: LJMP DONE MOV P1,#0BFH ANOBUT1: ACALL DELAYBUTTON CJNE A,#0EDH,ANOBUT2 MOV A,P1 MOV R0,#'4' CJNE A,#0BEH,ANOBUT9 SJMP DONE MOV R0,#'2' ANOBUT2: SJMP DONE CJNE A,#0EBH,ANOBUT3 ANOBUT9: MOV R0,#'8' CJNE A,#0BDH,ANOBUT10 SJMP DONE MOV R0,#'6' 13 SJMP DONE ANOBUT10: CJNE A,#0BBH,ANOBUT11 MOV R0,#'A' SJMP DONE ANOBUT11: CJNE A,#0B7H,ANOBUT12 MOV R0,#'E' SJMP DONE ANOBUT12: MOV P1,#07FH ACALL DELAYBUTTON MOV A,P1 CJNE A,#07EH,ANOBUT13 MOV R0,#'3' SJMP DONE ANOBUT13: CJNE A,#07DH,ANOBUT14 MOV R0,#'7' SJMP DONE ANOBUT14: CJNE A,#07BH,ANOBUT15 MOV R0,#'B' SJMP DONE ANOBUT15: CJNE A,#077H,ANOBUT16 MOV R0,#'F' SJMP DONE ANOBUT16: MOV R0,#255 DONE: RET DELAYBUTTON: MOV R6,#40 DL2: MOV R7, #250 DJNZ R7, $ DJNZ R6,DL2 RET END 14 BÀI 5: 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ắn vào P1.0) nhấn ORG 2000H INC R0 MOV SCON,#52H DJNZ R7, LOOP MOV TMOD,#20H SJMP DONE MOV TH1,#-3 SEND: SETB TR1 JNB TI,$ MOV R7,#11 CLR TI MOV R0,#0 MOV SBUF, A MOV DPTR,#MESSAGE RET LOOP: MESSAGE: MOV A,R0 DB “HELLO WORLD” MOVC A,@A+DPTR DONE: ACALL SEND END 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 ORG 2000H IN_CHAR: JNB RI, IN_CHAR EN BIT P3.3 CLR RI MOV A, SBUF RS BIT P3.5 RET MOV SCON,#52H LCD_INIT: MOV TMOD,#20H MOV A, #38H MOV TH1,#-3 ACALL WRITE_COMMAND SETB TR1 MOV A,#0EH MOV A,#01H ACALL WRITE_COMMAND ACALL WRITE_COMMAND MOV A,#06H ACALL WRITE_COMMAND RET MOV DPTR, #6000H ACALL LCD_INIT MAIN: ACALL IN_CHAR ACALL WRITE_TEXT SJMP MAIN WAIT_LCD: MOV R7,#100 WAITLCDLOOP: MOV R6,#250 DJNZ R6,$ DJNZ R7,WAITLCDLOOP RET 15 WRITE_TEXT: MOV DPTR,#6000H ACALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET MOV DPTR,#6000H ACALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET END WRITE_COMMAND: 16 BÀI 6: LẬP TRÌNH NGẮT THÍ NGHIỆM 1: Viết chương trình làm song song cơng việc 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 A,P1 LJMP MAIN CJNE A,#0FEH,LOOP ORG 2023H MOV A,#0FDH LJMP SERIALINT SJMP LOOP ORG 2030H SERIALINT: MAIN: JNB RI,SKIP MOV SCON,#52H CLR RI MOV TMOD,#20H MOV A,SBUF MOV TH1,#-3 MOV SBUF,A SETB TR1 SKIP: SETB ES CLR TI SETB EA RETI LOOP: END MOV P1,#0FFH 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 CONT: LJMP MAIN MOV A,R1 ORG 200BH ADD A,#20H LJMP TIMER0INT MOV R0,A ORG 2030H MOV A,@R0 MAIN: MOV R0,A MOV R1,#0 ACALL DISPLAYLED SETB ET0 RETI SETB EA DISPLAYLED: MOV TMOD,#01H MOV A,R1 MOV TH0,#HIGH(-10000) CJNE A,#0,ANONUM1 MOV TL0,#LOW(-10000) MOV A,#0E0H SETB TR0 ADD A,R0 SJMP $ SJMP DONE TIMER0INT: ANONUM1: CJNE R1,#4,CONT CJNE A,#1,ANONUM2 MOV R1,#0 MOV A,#0D0H 17 ADD A,R0 ANONUM3: SJMP DONE MOV A,#70H ANONUM2: ADD A,R0 CJNE A,#2,ANONUM3 DONE: MOV DPTR,#0000H MOVX @DPTR,A MOV A,#0B0H ADD A,R0 RET SJMP DONE 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 A,P1 MOV @R0,A LJMP MAIN ACALL DELAYBUTTON COUNTDONE: ORG 200BH CJNE A,#7FH,COUNTDONE RET LJMP TIMER0INT ORG 2030H MAIN: MOV R0,#20H MOV @R0,#0 INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 MOV R1,#0 SETB ET0 SETB EA MOV TMOD,#01H MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0 CONTCOUNT: ACALL BUTTONCOUNT SJMP CONTCOUNT BUTTONCOUNT: MOV P1,#0FFH MOV R0,#23H MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A SJMP COUNTDONE SKIP: DELAYBUTTON: MOV R6,#40 DL2: MOV R7, #250 DJNZ R7, $ DJNZ R6,DL2 RET TIMER0INT: CLR TR0 CJNE R1,#4,CONT MOV R1,#0 CONT: MOV A,R1 ADD A,#20H MOV R0,A MOV A,@R0 MOV R0,A ACALL DISPLAYLED MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0 RETI DISPLAYLED: INC A 18 MOV A,R1 ADD A,R0 MOV A,#70H CJNE A,#0,ANONUM1 SJMP DONE ADD A,R0 MOV A,#0E0H ANONUM2: DONE: ADD A,R0 CJNE A,#2,ANONUM3 MOV DPTR,#0000H SJMP DONE MOV A,#0B0H MOVX @DPTR,A ANONUM1: ADD A,R0 RET CJNE A,#1,ANONUM2 SJMP DONE END MOV A,#0D0H ANONUM3: THÍ NGHIỆM 4: Viết chương trình thực đồng hồ bấm giây, hiển thị lên LED đoạn Hai LED thể số giây, LED thể phần trăm giây Khi SW310 nhấn, đồng hồ reset SW 311 nhấn, đồng hồ bắt đầu chạy SW 312 nhấn, đồng hồ dừng lại ORG 2000H SETB TR0 LJMP MAIN CONTCOUNT: ORG 200BH MOV P1,#0FFH LJMP TIMER0INT MOV A,P1 ORG 2030H CJNE A,#0FEH,ANOBUTTON1 MAIN: MOV R0,#20H CLR C MOV @R0,#0 MOV R0,#20H INC R0 MOV @R0,#0 MOV @R0,#0 INC R0 INC R0 MOV @R0,#0 MOV @R0,#0 INC R0 INC R0 MOV @R0,#0 MOV @R0,#0 INC R0 CLR C MOV @R0,#0 SJMP CONTCOUNT MOV R1,#0 ANOBUTTON1: SETB ET0 CJNE A,#0FDH,ANOBUTTON2 SETB EA SETB C MOV TMOD,#01H SJMP CONTCOUNT MOV TH0,#HIGH(-10000) ANOBUTTON2: MOV TL0,#LOW(-10000) CJNE A,#0FBH,CONTCOUNT 19 CLR C ANONUM3: SJMP CONTCOUNT MOV A,#70H ADD A,R0 TIMER0INT: DONE: ACALL TIMEVALUE MOV DPTR,#0000H CLR TR0 MOVX @DPTR,A CJNE R1,#4,CONT RET MOV R1,#0 TIMEVALUE: CONT: JNC COUNTDONE MOV A,R1 MOV R0,#23H ADD A,#20H MOV A,@R0 MOV R0,A CJNE A,#9,SKIP MOV A,@R0 MOV A,#0 MOV R0,A MOV @R0,A ACALL DISPLAYLED DEC R0 MOV TH0,#HIGH(-10000) MOV A,@R0 MOV TL0,#LOW(-10000) CJNE A,#9,SKIP SETB TR0 MOV A,#0 RETI MOV @R0,A DISPLAYLED: DEC R0 MOV A,R1 MOV A,@R0 CJNE A,#0,ANONUM1 CJNE A,#9,SKIP MOV A,#0E0H MOV A,#0 ADD A,R0 MOV @R0,A SJMP DONE DEC R0 ANONUM1: MOV A,@R0 CJNE A,#1,ANONUM2 CJNE A,#9,SKIP MOV A,#0D0H MOV A,#0 ADD A,R0 MOV @R0,A SJMP DONE SJMP COUNTDONE ANONUM2: SKIP: CJNE A,#2,ANONUM3 INC A MOV A,#0B0H MOV @R0,A ADD A,R0 SJMP COUNTDONE SJMP DONE COUNTDONE: 20 RET END 21 BÀI TẬP LỚN: Viết chương trình thực đồng hồ số chỉnh Giờ, phút, giây hiển thị hình LCD LCD_E BIT P3.3 LCD_RS BIT ORG 2000H P3.5 MAIN: ACALL CLEAR ACALL INIT_LCD ACALL INITTIME ACALL DELAY1S ACALL DELAY1S ACALL INITHOUR ACALL INITMIN ACALL INITSEC LOOP: ACALL DELAY1S CJNE R0,#59,INCS MOV R0,#0 CJNE R1,#59,INCM MOV R1,#0 CJNE R2,#23,INCH MOV R2,#0 SJMP FINISH INCS: INC R0 SJMP FINISH INCM: INC R1 SJMP FINISH INCH: INC R2 FINISH: ACALL CLEAR ACALL DISPHOUR ACALL DISPMIN ACALL DISPSEC SJMP LOOP INITHOUR: ACALL CLEAR MOV A,#0 MOV R4,#9 MOV DPTR,#MESSAGE2 INITHOURLOOP: MOV R5,A MOVC A, @A+DPTR ACALL WRITETEXT MOV A,R5 INC A DJNZ R4, INITHOURLOOP ACALL DELAY1S MOV R2,#0 ACALL CLEAR ACALL DISPHOUR MOV P0,#0FFH ANOBUTHOUR3: MOV A,P0 ACALL DELAY100MS CJNE A,#10111111B,ANOBUTHOUR1 MOV A,R2 CJNE A,#23,INCHOUR MOV R2,#0 ACALL CLEAR ACALL DISPHOUR SJMP ANOBUTHOUR3 INCHOUR: INC R2 ACALL CLEAR ACALL DISPHOUR ANOBUTHOUR1: CJNE A,#01111111B,ANOBUTHOUR2 MOV A,R2 CJNE A,#0,DECHOUR MOV R2,#23 ACALL CLEAR ACALL DISPHOUR SJMP ANOBUTHOUR3 DECHOUR: DEC R2 ACALL CLEAR ACALL DISPHOUR ANOBUTHOUR2: CJNE A,#11011111B,ANOBUTHOUR3 RET INITMIN: ACALL CLEAR MOV A,#0 MOV R4,#8 MOV DPTR,#MESSAGE3 INITMINLOOP: MOV R5,A MOVC A, @A+DPTR ACALL WRITETEXT MOV A,R5 INC A DJNZ R4, INITMINLOOP ACALL DELAY1S MOV R1,#0 ACALL CLEAR 22 ACALL DISPMIN MOV P0,#0FFH ANOBUTMIN3: MOV A,P0 ACALL DELAY100MS CJNE A,#10111111B,ANOBUTMIN1 MOV A,R1 CJNE A,#59,INCMIN MOV R1,#0 ACALL CLEAR ACALL DISPMIN SJMP ANOBUTMIN3 INCMIN: INC R1 ACALL CLEAR ACALL DISPMIN ANOBUTMIN1: CJNE A,#01111111B,ANOBUTMIN2 MOV A,R1 CJNE A,#0,DECMIN MOV R1,#59 ACALL CLEAR ACALL DISPMIN SJMP ANOBUTMIN3 DECMIN: DEC R1 ACALL CLEAR ACALL DISPMIN ANOBUTMIN2: CJNE A,#11011111B,ANOBUTMIN3 RET INITSEC: ACALL CLEAR MOV A,#0 MOV R4,#8 MOV DPTR,#MESSAGE4 INITSECLOOP: MOV R5,A MOVC A, @A+DPTR ACALL WRITETEXT MOV A,R5 INC A DJNZ R4, INITSECLOOP ACALL DELAY1S MOV R0,#0 ACALL CLEAR ACALL DISPSEC MOV P0,#0FFH ANOBUTSEC3: MOV A,P0 ACALL DELAY100MS CJNE A,#10111111B,ANOBUTSEC1 MOV A,R0 CJNE A,#59,INCSEC MOV R0,#0 ACALL CLEAR ACALL DISPSEC SJMP ANOBUTSEC3 INCSEC: INC R0 ACALL CLEAR ACALL DISPSEC ANOBUTSEC1: CJNE A,#01111111B,ANOBUTSEC2 MOV A,R0 CJNE A,#0,DECSEC MOV R0,#59 ACALL CLEAR ACALL DISPSEC SJMP ANOBUTSEC3 DECSEC: DEC R0 ACALL CLEAR ACALL DISPSEC ANOBUTSEC2: CJNE A,#11011111B,ANOBUTSEC3 RET INITTIME: ACALL CLEAR MOV A,#0 MOV R4,#9 MOV DPTR,#MESSAGE1 INITTIMELOOP: MOV R5,A MOVC A, @A+DPTR ACALL WRITETEXT MOV A,R5 INC A DJNZ R4, INITTIMELOOP RET INIT_LCD: MOV ACALL MOV ACALL MOV ACALL RET A, #38H WRITECOM A, #0EH WRITECOM A, #06H WRITECOM DISPSEC: MOV B,#10 MOV A,R0 DIV AB ADD A,#30H ACALL WRITETEXT MOV A,B ADD A,#30H ACALL WRITETEXT RET 23 RET DISPMIN: MOV B,#10 MOV A,R1 DIV AB ADD A,#30H ACALL WRITETEXT MOV A,B ADD A,#30H ACALL WRITETEXT MOV A,#'.' ACALL WRITETEXT RET DISPHOUR: MOV B,#10 MOV A,R2 DIV AB ADD A,#30H ACALL WRITETEXT MOV A,B ADD A,#30H ACALL WRITETEXT MOV A,#'.' ACALL WRITETEXT RET CLEAR: MOV A, #01H ACALL WRITECOM RET WRITECOM: MOV DPTR,#6000H SETB LCD_E CLR LCD_RS MOVX @DPTR, A CLR LCD_E ACALL WAIT_LCD RET DELAY1S: MOV R7,#20 RECOUNT: MOV TMOD, #01H MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 WAIT: JNB TF0, WAIT CLR TF0 CLR TR0 DJNZ R7,RECOUNT RET DELAY100MS: MOV R7,#2 RECOUNT1: MOV TMOD, #01H MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 WAIT1: JNB TF0, WAIT1 CLR TF0 CLR TR0 DJNZ R7,RECOUNT1 RET MESSAGE1: DB 'I','N','I','T',' ','T','I','M','E' MESSAGE2: DB 'I','N','I','T',' ','H','O','U','R' MESSAGE3: DB 'I','N','I','T',' ','M','I','N' MESSAGE4: DB 'I','N','I','T',' ','S','E','C' END WRITETEXT: MOV DPTR,#6000H SETB LCD_E SETB LCD_RS MOVX @DPTR, A CLR LCD_E ACALL WAIT_LCD RET WAIT_LCD: MOV DL1: MOV DJNZ DJNZ R6,#10 R7, #250 R7, $ R6,DL1 24 ... DELAY100MS CJNE A, #10 111 111 B,ANOBUTSEC1 MOV A,R0 CJNE A,#59,INCSEC MOV R0,#0 ACALL CLEAR ACALL DISPSEC SJMP ANOBUTSEC3 INCSEC: INC R0 ACALL CLEAR ACALL DISPSEC ANOBUTSEC1: CJNE A,# 011 111 11B,ANOBUTSEC2... ANOBUTHOUR1: CJNE A,# 011 111 11B,ANOBUTHOUR2 MOV A,R2 CJNE A,#0,DECHOUR MOV R2,#23 ACALL CLEAR ACALL DISPHOUR SJMP ANOBUTHOUR3 DECHOUR: DEC R2 ACALL CLEAR ACALL DISPHOUR ANOBUTHOUR2: CJNE A, #11 011 111 B,ANOBUTHOUR3... INITMINLOOP ACALL DELAY1S MOV R1,#0 ACALL CLEAR 22 ACALL DISPMIN MOV P0,#0FFH ANOBUTMIN3: MOV A,P0 ACALL DELAY100MS CJNE A, #10 111 111 B,ANOBUTMIN1 MOV A,R1 CJNE A,#59,INCMIN MOV R1,#0 ACALL CLEAR ACALL