MÔN HỌC: THÍ NGHIỆM VI XỬ LÝ BÁO CÁO THÍ NGHIỆM GVHD: Nguyễn Khắc Phương Tuấn LỚP: L05 Nhóm: 6 Phạm Trọng Sang 1712943 Phạm Trần Minh Quân 1712828 Trương Thanh Sang 1712945 1 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 SETB P3.0 // Tắt led P3.0 JNB P1.0, LOOP // Kiểm tra nút P1.0 CLR P3.0 // Bật led P3.0 SJMP $ 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
TRƯỜNG ĐẠI HỌC BÁCH KHOA TP HỒ CHÍ MINH MƠN HỌC: THÍ NGHIỆM VI XỬ LÝ BÁO CÁO THÍ NGHIỆM GVHD: Nguyễn Khắc Phương Tuấn LỚP: L05 Nhóm: Phạm Trọng Sang 1712943 Phạm Trần Minh Quân 1712828 Trương Thanh Sang 1712945 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 SETB P3.0 // Tắt led P3.0 JNB P1.0, LOOP // Kiểm tra nút P1.0 CLR P3.0 // Bật led P3.0 SJMP $ 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 MAIN: CPL P3.0 JMP MAIN // Đảo bit P3.0 làm nháy led 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 - 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 // Đảo bit P3.0 ACALL DELAY5 // Gọi chương trình SJMP CONT DELAY5: // Delay 500MC 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 - Tính thời gian delay 1s: 1=2n.Tmáy=2n.12Txtal=24n.( 11059200 ) => n=460800 => chọn n1=250; n2=250; n3=7 ORG 2000H LOOP: CPL 1.0 // Đảo bit, chớp tắt led ACALL DELAY1S // Gọi chương trình SJMP LOOP DELAY1S: // Delay 1s MOV R7,#8 LAP1: MOV R6,#250 LAP2: MOV R5,#250 LAP3: DJNZ R5,LAP3 DJNZ R6,LAP2 DJNZ R7,LAP1 RET 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 MOV DPTR,#SIGNAL // Gán địa bảng tạo cho DPTR LOOP: MOV R7,#8 LAP: MOV A,R7 MOVC P1,@A+DPTR // Gán giá trị bảng cho P1 ACALL DELAY1S // Gọi chương trình delay 1s DJNZ R7,LAP MOV P1,#0FFH // Vòng lập để chạy led // Tắt BARLED sau quay đủ led SJMP LOOP DELAY1S: // Lặp lại chương trình // Delay 1s MOV R7,#8 LAP1: MOV R6,#250 LAP2: MOV R5,#250 LAP3: DJNZ R5,LAP3 DJNZ R6,LAP2 DJNZ R7,LAP1 RET TABLE: // Bảng chứa giá trị led sáng DB 00H,01H,03H,07H,0FH,1FH,3FH,7FH END - LED bên trái nối với MSB P1 BÀI 2: HIỂN THỊ LED ĐOẠN THÍ NGHIỆM 1: Viết chương trình DisplayLed0 hiển thị lên LED đoạn số giá trị chứa ghi R0 DISPLAYLED0: MOV R0,#0 MOV A,R0 // Đặt giá trị hiển thị ADD A,#0E0H // Chọn thứ tự led hiển thị MOV DPTR,#0000H // Định vị địa led7 đoạn MOVX @DPTR,A // Xuất giá trị led RET 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 // Gán giá trị muốn hiển thị cho R0 ACALL DISPLAYLED0 // Gọi chương trình hiển thị led SJMP DONE DISPLAYLED0: MOV A,R0 // Đặt giá trị hiển thị led ADD A,#0E0H // Chọn led đoạn số MOV DPTR,#0000H // Định vị địa led7 đoạn MOVX @DPTR,A // Xuất giá trị led RET DONE: NOP END THÍ NGHIỆM 2: 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 // Gán giá trị đầu LOOP: ACALL DISPLAYLED0 // Gọi chương trình hiển thị led INC R0 ACALL DELAY1S CJNE R0,#10,LOOP MOV R0,#0 // Gọi chương trình delay 1s // Kiểm tra giá trị xuất để tạo vòng lặp // Gán lại giá trị đầu SJMP LOOP DISPLAYLED0: MOV A,R0 // Đặt giá trị hiển thị led ADD A,#0E0H // Chọn led đoạn số MOV DPTR,#0000H // Định vị địa led7 đoạn MOVX @DPTR,A // Xuất giá trị led RET DELAY1S: MOV R7,#-20 TIMELOOP: MOV TMOD, #01H // Set mode cho timer0 MOV TH0,#HIGH(-50000) // Đặt giá trị bit cao cho ghi TH0 MOV TL0,#LOW(-50000) // Đặt giá trị bit thấp cho ghi TL0 SETB TR0 // Cho timer0 chạy JNB TF0,$ // Kiểm tra cờ tràn timer0 CLR TF0 // Xóa cờ tràn CLR TR0 // Dừng timer0 DJNZ R7,TIMELOOP RET END THÍ NGHIỆM 3: 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 MOV R0,#1 // Gán giá trị hiển thị cho R0 MOV R1,#3 // Gán giá trị thứ tự led cho R1 ACALL DISPLAYLED ACALL DELAY1S // Gọi chương trình hiển thị led // Gọi chương trình delay 1s SJMP FINISH DISPLAYLED: MOV A,R1 // Gán số thứ tự led cho A CJNE A,#0,ANONUM1 // Kiểm tra thứ tự led MOV A,#0E0H // Chọn led đoạn số ADD A,R0 // Gán giá trị số thứ tự led cho A SJMP DONE ANONUM1: CJNE A,#1,ANONUM2 // Kiểm tra thứ tự led MOV A,#0D0H // Chọn led đoạn số ADD A,R0 // Gán giá trị số thứ tự led cho A SJMP DONE ANONUM2: CJNE A,#2,ANONUM3 // Kiểm tra thứ tự led MOV A,#0B0H // Chọn led đoạn số ADD A,R0 // Gán giá trị số thứ tự led cho A SJMP DONE ANONUM3: MOV A,#70H // Chọn led đoạn số ADD A,R0 // Gán giá trị số thứ tự led cho A DONE: MOV DPTR,#0000H // Định vị địa led7 đoạn MOVX @DPTR,A // Xuất giá trị led RET DELAY1S: MOV R7,#-20 TIMELOOP: MOV TMOD, #01H // Set mode cho timer0 MOV TH0,#HIGH(-50000) // Đặt giá trị bit cao cho ghi TH0 MOV TL0,#LOW(-50000) // Đặt giá trị bit thấp cho ghi TL0 SETB TR0 // Cho timer0 chạy JNB TF0,$ // Kiểm tra cờ tràn timer0 CLR TF0 // Xóa cờ tràn CLR TR0 // Dừng timer0 DJNZ R7,TIMELOOP RET FINISH: END THÍ NGHIỆM 4: 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 cịn 100 ms Quan sát tượng 10 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 EN BIT P3.3 RS BIT P3.5 ORG 2000H MOV SCON,#52H MOV TMOD,#20H // Set mode cho serial port // Set mode cho timer MOV TH1,#-3 // Đặt giá trị cho timer SETB TR1 // Cho timer chạy MOV A,#01H ACALL WRITE_COMMAND // Gọi chương trình nhập lệnh cho LCD MOV DPTR, #6000H // Gán địa LCD cho DPTR ACALL INIT_LCD // Gọi chương trình đặt trạng thái đầu cho LCD MAIN: ACALL IN_CHAR // Gọi chương trình kiểm tra cờ RI gán giá trị nhận SBUF cho A ACALL WRITE_TEXT // Gọi chương trình xuất kí tự LCD SJMP MAIN IN_CHAR: JNB RI, IN_CHAR CLR RI // Kiểm tra cờ RI // Xóa cờ RI MOV A, SBUF RET INIT_LCD: MOV A, #38H ACALL WRITECOM LCD // Lệnh chọn font ký tự 5×8 // Gọi chương trình nhập lệnh lên 28 MOV A, #0EH ACALL WRITECOM LCD MOV A, #06H ACALL WRITECOM LCD // Lệnh bật LCD tắt trỏ ký tự // Gọi chương trình nhập lệnh lên // Lệnh cho trỏ tự động dịch phải // Gọi chương trình nhập lệnh lên RET WAIT_LCD: MOV R7,#100 WAITLCDLOOP: MOV R6,#250 DJNZ R6,$ DJNZ R7,WAITLCDLOOP RET WRITE_TEXT: MOV DPTR,#6000H ACALL WAIT_LCD // Gán địa LCD cho DPTR // Gọi chương trình delay SETB EN // Set cờ cho phép SETB RS // Dữ liệu hiểu liệu MOVX @DPTR,A // Xuất LCD CLR EN // Clear cờ cho phép RET WRITE_COMMAND: MOV DPTR,#6000H ACALL WAIT_LCD // Gán địa LCD cho DPTR // Gọi chương trình delay SETB EN // Set cờ cho phép CLR RS // Dữ liệu hiểu lệnh MOVX @DPTR,A // Nhập lệnh cho LCD CLR EN // Clear cờ cho phép RET END 29 BÀI 5: 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 LJMP MAIN ORG 2023H LJMP SERIALINT ORG 2030H MAIN: MOV SCON,#52H MOV TMOD,#20H // Set mode cho serial port // Set mode cho timer MOV TH1,#-3 // Đặt giá trị cho timer SETB TR1 // Cho timer1 chạy SETB EA // Cho phép ngắt cục SETB ES // Cho phép ngắt LOOP: // Kiểm tra nút nhấn SW317 bật LED MOV P1,#0FFH MOV A,P1 CJNE A,#0FEH,LOOP MOV A,#0FDH SJMP LOOP SERIALINT: // Chương trình thực ngắt JNB RI,SKIP // Kiểm tra cờ RI CLR RI // Xóa cờ RI MOV SBUF,A SKIP: CLR TI RETI END 30 31 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 LJMP MAIN ORG 200BH LJMP TIMER0INT ORG 2030H MAIN: MOV R1,#0 SETB EA // Cho phép ngắt toàn cục SETB ET0 // Cho phép ngắt timer0 MOV TMOD,#01H // Set mode cho timer0 MOV TH0,#HIGH(-10000) // Gán bit cao cho TH0 MOV TL0,#LOW(-10000) // Gán bit thấp cho TL0 SETB TR0 // Cho timer0 chạy SJMP $ // Chờ ngắt TIMER0INT: // Chương trình thực ngắt CJNE R1,#4,CONT // Kiểm tra R1 MOV R1,#0 CONT: MOV A,R1 ADD A,#20H MOV R0,A MOV A,@R0 MOV R0,A ACALL DISPLAYLED đoạn // Gọi chương trình xuất LED RETI 32 DISPLAYLED: MOV A,R1 CJNE A,#0,LED1 // Kiểm tra thứ tự LED MOV A,#0E0H // Chọn Led ADD A,R0 // Xuất giá trị led SJMP DONE LED1: CJNE A,#1,LED2 // Kiểm tra thứ tự LED MOV A,#0D0H // Chọn Led ADD A,R0 // Xuất giá trị led SJMP DONE LED2: CJNE A,#2,LED3 // Kiểm tra thứ tự LED MOV A,#0B0H // Chọn Led ADD A,R0 // Xuất giá trị led SJMP DONE LED3: MOV A,#70H // Chọn Led ADD A,R0 // Xuất giá trị led DONE: MOV DPTR,#0000H MOVX @DPTR,A RET 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 33 ORG 2000H LJMP MAIN ORG 200BH LJMP TIMER0INT ORG 2030H MAIN: // LUU GIA TRI CHO 20H -> 23H VE MOV R0,#20H MOV @R0,#0 INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 MOV R1,#0 // SE TCHẾ ĐỘ CHO INTERRUPT SETB EA SETB ET0 MOV TMOD,#01H MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0 COUNT: ACALL BUTTONCOUNT nhấn // Gọi chương trình đếm số lần SJMP COUNT 34 BUTTONCOUNT: MOV P1,#0FFH MOV A,P1 CJNE A,#0FEH,COUNTDONE // Kiểm tra nút nhấn ACALL DELAYBUTTON // Gọi chương trình delay MOV R0,#23H MOV A,@R0 cho A CJNE A,#9,SKIP // Gán giá trị ghi 23H // Kiểm tra giá trị MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 cho A CJNE A,#9,SKIP // Gán giá trị ghi 22H // Kiểm tra giá trị MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 cho A CJNE A,#9,SKIP // Gán giá trị ghi 21H // Kiểm tra giá trị MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 cho A CJNE A,#9,SKIP // Gán giá trị ghi 20H // Kiểm tra giá trị MOV A,#0 MOV @R0,A SJMP COUNTDONE SKIP: 35 INC A MOV @R0,A COUNTDONE: RET DELAYBUTTON: // Chống rung phím MOV R6,#40 DL2: MOV R7, #250 DJNZ R7, $ DJNZ R6,DL2 RET TIMER0INT: CJNE R1,#4,CONT // Kiểm tra R1 MOV R1,#0 CONT: MOV A,R1 ADD A,#20H MOV R0,A MOV A,@R0 MOV R0,A ACALL DISPLAYLED đoạn // Gọi chương trình xuất LED MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0 RETI DISPLAYLED: MOV A,R1 CJNE A,#0,LED1 // Kiểm tra thứ tự LED 36 MOV A,#0E0H // Chọn Led ADD A,R0 // Xuất giá trị led SJMP DONE LED1: CJNE A,#1,LED2 // Kiểm tra thứ tự LED MOV A,#0D0H // Chọn Led ADD A,R0 // Xuất giá trị led SJMP DONE LED2: CJNE A,#2,LED3 // Kiểm tra thứ tự LED MOV A,#0B0H // Chọn Led ADD A,R0 // Xuất giá trị led SJMP DONE LED3: MOV A,#70H // Chọn Led ADD A,R0 // Xuất giá trị led DONE: MOV DPTR,#0000H MOVX @DPTR,A RET END 37 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 LJMP MAIN ORG 200BH LJMP TIMER0INT ORG 2030H MAIN: CLR C // SET CÁC GIÁ TRỊ TRONG CÁC THANH GHI 20H, 21H, 22H, 23H VỀ 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 // Cho phép ngắt timer0 SETB EA // Cho phép ngắt toàn cục MOV TMOD,#01H // Set mode cho timer0 MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0 // Cho timer chạy 38 CONTCOUNT: MOV P1,#0FFH MOV A,P1 CJNE A,#0FEH,ANOBUTTON1 SW310 // Kiểm tra nút nhấn MOV R0,#20H MOV @R0,#0 INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 CLR C SJMP CONTCOUNT ANOBUTTON1: CJNE A,#0FDH,ANOBUTTON2 SW311 // Kiểm tra nút nhấn SETB C SJMP CONTCOUNT ANOBUTTON2: CJNE A,#0FBH,CONTCOUNT // Kiểm tra nút nhấn SW312 CLR C SJMP CONTCOUNT TIMER0INT: timer0 // Chương trình chạy ngắt ACALL TIMEVALUE // Gọi chương trình set giá trị hiển thị CLR TR0 // Xóa cờ tràn TR0 CJNE R1,#4,CONT 39 MOV R1,#0 CONT: MOV A,R1 ADD A,#20H MOV R0,A MOV A,@R0 MOV R0,A ACALL DISPLAYLED // Gọi chương trình hiển thị led MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0 RETI DISPLAYLED: ĐOẠN // CHƯƠNG TRÌNH HIỂN THỊ RA LED 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 40 ADD A,R0 DONE: MOV DPTR,#0000H MOVX @DPTR,A RET TIMEVALUE: JNC COUNTDONE // Kiểm tra bit cờ C MOV R0,#23H MOV A,@R0 cho A CJNE A,#9,SKIP // Gán giá trị ghi 23H // Kiểm tra giá trị MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 cho A CJNE A,#9,SKIP // Gán giá trị ghi 22H // Kiểm tra giá trị MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 cho A CJNE A,#9,SKIP // Gán giá trị ghi 21H // Kiểm tra giá trị MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 cho A CJNE A,#9,SKIP // Gán giá trị ghi 20H // Kiểm tra giá trị MOV A,#0 MOV @R0,A 41 SJMP COUNTDONE SKIP: INC A MOV @R0,A COUNTDONE: RET 42 ... RET TEXT: DB "TRONG SANG",0 END 15 THÍ NGHIỆM 2: - Vi? ??t chương trình CLEARSCREEN để xóa hình LCD CLRSCREEN: PUSH ACC MOV A, #01H CALL WRITECOM POP ACC RET - Vi? ??t thêm chương trình GOTOXY để... 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 MAIN: CPL P3.0 JMP MAIN // Đảo bit P3.0 làm nháy led END - Theo lý thuyết, với thạch anh 11.0592MHz,... P3.0 với chu kì 6.5us - Tần số tối đa xung tuần hồn có chu kỳ nhiệm vụ 50% đạt 153 600Hz 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: