Báo cáo bài tập lớn môn Vi xử lý (Mới)
Các phím chức năng của chương trình CÂN ĐIỆN TỬ:
P1.0: Tăng giá sản phẩm
P1.1: Giảm giá sản phẩm
P1.4: chuyển chế độ hiển thị
P1.7: quay lại chế độ hiển thị ban đầu
JNB 66H, TTUC_2 SETB ACC.0 MOVX @DPTR, A JB 67H, LAP_6 TTUC_2: CLR ACC.0 MOVX @DPTR, A JB 67H, LAP_6 DJNZ R5, LAP_5 SETB 67H MOV R6, #200 SETB TF0 LAP_7: CLR ACC.0 CLR ACC.1 MOVX @DPTR, A JB 67H, LAP_7 MOV IE, #0 MOV TMOD, #20H MOV TL1, #-3 MOV TH1, #-3 Sau khi việc vắt hoàn thành , chương trình sẽ xuất dòng chữ ‘ GIAT XONG’ Lên màn hình LCD và màn hình máy tính Và cho LED tại chân P1.3 nhấp nháy tđẻ báo hiệu việc giặt hoàn tất MOV SCON, #52H SETB TR1 MOV A, #0CH ACALL SEND MOV DPTR, #8000H ACALL LCD MOV DPTR, #TABLE7 MOV R0, DPH MOV R4, DPL LAP_8: MOV DPH, R0 MOV DPL, R4 CLR A MOVC A,@A+DPTR CJNE A, #'0', TTUC_3 SJMP TTUC_4 TTUC_3: ACALL SEND INC DPTR MOV R0, DPH MOV R4, DPL ACALL WRITE_TEXT SJMP LAP_8 TTUC_4: MOV IE, #0 MOV TMOD, #21H MOV R3, #200 SETB P1.3 LAP_9: MOV TH0, #HIGH (-50000) MOV TL0, #LOW (-50000) SETB TR0 JNB TF0, $ CLR TF0 CLR TR0 CPL P1.3 DJNZ R3, LAP_9 MOV A, #0CH ACALL SEND MOV DPTR, #8000H ACALL LCD MOV DPTR, #TABLE8 MOV R0, DPH MOV R4, DPL LAP_10: Chương trình sẽ xuất dòng chữ ‘ QUAY LAI ‘ lên màn hình LCD và màn hình máy tính Nhấn nút P1.5 nếu có yêu cầu quay về để giặt MOV DPH, R0 MOV DPL, R4 CLR A MOVC A,@A+DPTR CJNE A, #'0', TTUC_5 SJMP TTUC_6 TTUC_5: ACALL SEND INC DPTR MOV R0, DPH MOV R4, DPL ACALL WRITE_TEXT SJMP LAP_10 TTUC_6: JB P1.5, $ LJMP MAIN ISR_T0: SETB 66H CLR TR0 MOV TL0, #LOW (-20000) MOV TH0, #HIGH (-20000) SETB TR0 DJNZ R6, TT CLR 67H RETI TT: CJNE R1, #1, DT_90 CLR TR1 MOV TL1, #LOW (-18000) MOV TH1, #HIGH (-18000) SETB TR1 SJMP EXIT DT_90: CJNE R1, #2, DT_50 CLR TR1 MOV TL1, #LOW (-10000) MOV TH1, #HIGH (-10000) SETB TR1 SJMP EXIT DT_50: CJNE R1, #3, EXIT CLR TR1 MOV TL1, #LOW (-4000) MOV TH1, #HIGH (-4000) SETB TR1 SJMP EXIT EXIT: SETB ET1 RETI ISR_T1: CLR 66H CLR TR1 CLR ET1 RETI SEND: JNB TI, SEND MOV SBUF, A CLR TI RET LCD: MOV A, #38H CALL INIT_LCD MOV A, #0CH CALL INIT_LCD MOV A, #06H CALL INIT_LCD MOV A, #01H CALL INIT_LCD MOV A, #80H CALL INIT_LCD RET WAIT_LCD: MOV R7, #4 BB: MOV R6, #250 DJNZ R6, $ DJNZ R7, BB RET INIT_LCD: MOV DPTR, #8000H LCALL WAIT_LCD CLR RS MOVX @DPTR, A SETB EN CLR EN RET WRITE_TEXT: MOV DPTR, #8000H LCALL WAIT_LCD SETB RS MOVX @DPTR, A SETB EN CLR EN RET TABLE: DB 'CHON CHE DO 0' TABLE1: DB 'CHE DO 0' TABLE2: DB 'GIAT? 0' TABLE3: DB 'DANG DO NUOC 0' TABLE4: DB 'DANG GIAT 0' TABLE5: DB 'DANG XA NUOC 0' TABLE6: DB 'DANG VAT 0' TABLE7: DB 'GIAT XONG 0' TABLE8: DB 'QUAY LAI 0' END Các phím chức năng của chương trình ĐỒNG HỒ: P1.0: Cài đặt báo thức P1.1: Reset thời gian P1.2: Tăng giờ, phút, giây P1.3: Giảm giờ, phút, giây P1.4: Lựa chọn cài đặt giờ, phút, giây ORG 0000H Địa chỉ bắt đầu chương trình , đại chỉ vecto ngắt Timer 0 LJMP MAIN ORG 000BH LJMP ISR_T0 MAIN: MOV TMOD, #11H Cấu hình cho các thanh ghi để thực hiện chế độ cài đặt MOV P1, #0FFH RS BIT P3.5 EN BIT P3.4 MOV R1, #0 MOV R2, #0 MOV R3, #0 MAIN1: MOV 5AH, R1 MOV 5BH, R2 MOV 5CH, R3 Hiển thị lên màn hình LCD chế độ cài đặt CAI DAT 00:00:00 CLR ET0 MOV DPTR, #8000H CALL START MOV R0, #7 MOV A, #0 PUSH ACC LOOP3: CALL TRABANG1 CALL WRITE_TEXT POP ACC INC A PUSH ACC DJNZ R0, LOOP3 POP ACC ACALL HIENTHI1 Gọi chương trình CAI_DAT để cài đặt thời gian ACALL CAI_DAT MOV R1,5AH MOV R2,5BH Thực hiện các thao tác để cho chương trình chạy dừng ngắt Timer 0 Có sửu dụng ép ngắt để khởi động chương trình chạy theo thời gian đã cài đặt MOV R3,5CH MOV DPTR,#8000H ACALL START MOV R4,#21 SETB TF0 MOV IE ,#82H LAP4: MOV DPTR,#8000H CALL START MOV R0,#1 LAP: Việc cho chương trình chạy theo ngắt Timer 0 được kết hợp với bit kiểm tra (74h) trong vùng RAM nội Nhấn P1.0 để cài đặt báo thức Nhấn P1.1 để muốn cài đặt lại thời gian Gọi chương trình HIEN_THI để hiển thị thời gian thực lên LCD Thời gian báo thức sẽ được lưu trong các ô nhớ vùng RAM nội (5Dh),(5Eh),(5Fh) Thời gian thực sẽ được lưu vào các thanh ghi R1,R2, R3 Chương trình sẽ liên tục kiểm tra thời gian thực và thời gian báo thức bằng cách kiểm tra các thanh ghi và ô nhớ nêu trên Nếu thời gian thực đúng bằng thời gian báo thức thì LED ở chân P1.6 sẽ nhấp nháy trong khoảng 10s Nhấn P1.5 để xóa báo thức JNB 74H,NHAY JNB P1.0,NHAY10 JB P1.1,KK LJMP MAIN1 KK: JB P1.5,LAP MOV 5DH,#255 SJMP LAP NHAY: MOV A,#80H CALL INIT_LCD MOV A,R3 ACALL HIEN_THI MOV A,#':' ACALL WRITE_TEXT MOV A,R2 ACALL HIEN_THI MOV A,#':' ACALL WRITE_TEXT MOV A,R1 ACALL HIEN_THI DJNZ R0,LAP7 MOV R0,#1 MOV A,R1 CJNE A,5DH,LAP MOV A,R2 CJNE A,5EH,LAP MOV A,R3 CJNE A,5FH,LAP SETB P1.6 MOV R0,#10 LAP7: CLR P1.6 LJMP LAP Nếu nhấn P1.0 thì chương trình sẽ nhảy đến đoạn để cài bao thức Việc cài đặt thời gian báo thức diễn ra tương tự như cài đặt thời gian thực Các biến sau khi cài đặt thời gian báo thức sẽ được lưu vào các ô nhớ vùng RAM nội (5Dh),(5Eh),(5Fh) NHAY10: JNB P1.0,$ MOV A,#80H ACALL INIT_LCD MOV R0,#16 MOV A,#0 PUSH ACC LOOP3A: CALL TRABANG2 CALL WRITE_TEXT POP ACC INC A PUSH ACC DJNZ R0,LOOP3A POP ACC ACALL HIENTHI1 MOV 5AH,R1 MOV 5BH,R2 MOV 5CH,R3 ACALL CAI_DAT MOV 5DH,5AH MOV 5EH,5BH MOV 5FH,5CH LJMP LAP4 CAI_DAT: TTUC1: JB P1.2,NHAY3 JNB P1.2,$ INC 5AH MOV A,5AH CJNE A,#60,NHAY4B MOV 5AH,#0 SJMP NHAY4B NHAY3: JB P1.3,NHAY4 JNB P1.3,$ DEC 5AH MOV A,5AH CJNE A,#255,NHAY4B MOV 5AH,#59 NHAY4B: ACALL HIENTHI2 NHAY4: JB P1.0,TTT1 JNB P1.0,$ RET TTT1: JB P1.4,TTUC1 JNB P1.4,$ TTUC2: JB P1.2,NHAY5 JNB P1.2,$ INC 5BH MOV A,5BH CJNE A,#60,NHAY6B MOV 5BH,#0 SJMP NHAY6B NHAY5: JB P1.3,NHAY6 JNB P1.3,$ DEC 5BH MOV A,5BH CJNE A,#255,NHAY6B MOV 5BH,#59 NHAY6B: ACALL HIENTHI2 NHAY6: JB P1.0,TTT2 JNB P1.0,$ RET TTT2: JB P1.4,TTUC2 JNB P1.4,$ TTUC3: JB P1.2,NHAY7 JNB P1.2,$ INC 5CH MOV A,5CH CJNE A,#12,NHAY8B MOV 5CH,#0 SJMP NHAY8B NHAY7: JB P1.3,NHAY8 JNB P1.3,$ DEC 5CH MOV A,5CH CJNE A,#255,NHAY8B MOV 5CH,#11 NHAY8B: ACALL HIENTHI2 NHAY8: JB P1.0,TTT3 JNB P1.0,$ RET TTT3: JB P1.4,TTUC3 JNB P1.4,$ LJMP TTUC1 ISR_T0: SETB 74H DJNZ R4,TT CLR 74H MOV R4,#20 INC R1 Khi ngắt Timer0 xảy ra , chương trình sẽ giảm thanh ghi R4 đi 1 đơn vị và kiểm tra xem R4 có bằng 0 hay không Nếu như R4 bằng 0 thì tức thời gian thực đã tăng lên 1s so vói một mốc qui định Khi đó chương trình chính sẽ đảo ngược bit kiểm tra (74h) để khi trở lại chương trình chính sẽ hiển thị thời gian mới , đồng thời tăng thanh ghi R1(giây) lên 1 đồng thời kiểm ta giá trị trong thanh ghi R1 để điều chỉnh cho thanh ghi R2( phút) , R3 (giờ) CJNE R1,#60,TT1 MOV R1,#0 INC R2 TT1: CJNE R2,#60,TT2 MOV R2,#0 INC R3 TT2: CJNE R3,#60,TT MOV R3,#0 TT: CLR TR0 MOV TH0,#HIGH(-400000) MOV TL0,#LOW(-40000) SETB TR0 RETI TRABANG1: MOV DPTR,#TABLE1 MOVC A,@A+DPTR RET TRABANG2: MOV DPTR,#TABLE2 MOVC A,@A+DPTR RET SEND: JNB TI,SEND MOV SBUF,A CLR TI RET HIEN_THI: MOV B,#10 DIV AB ORL A,#30H ACALL WRITE_TEXT MOV A,B ORL A,#30H ACALL WRITE_TEXT RET HIENTHI1: MOV A,#0C0H CALL INIT_LCD MOV A,R3 ACALL HIEN_THI MOV A,#':' ACALL WRITE_TEXT MOV A,R2 ACALL HIEN_THI MOV A,#':' ACALL WRITE_TEXT MOV A,R1 ACALL HIEN_THI RET HIENTHI2: MOV A,#0C0H CALL INIT_LCD MOV A,5CH ACALL HIEN_THI MOV A,#':' ACALL WRITE_TEXT MOV A,5BH ACALL HIEN_THI MOV A,#':' ACALL WRITE_TEXT MOV A,5AH ACALL HIEN_THI RET START: MOV A,#38H CALL INIT_LCD MOV A,#0CH CALL INIT_LCD MOV A,#06H CALL INIT_LCD MOV A,#01H CALL INIT_LCD MOV A,#80H CALL INIT_LCD RET WAIT_LCD: MOV R7,#4 BB: MOV R6,#250 DJNZ R6,$ DJNZ R7,BB RET INIT_LCD: MOV DPTR,#8000H LCALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET WRITE_TEXT: MOV DPTR,#8000H LCALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET TABLE1: DB'CAI DAT' TABLE2: DB'CAI DAT BAO THUC' END Câu hỏi : Cách dịch chữ khi nhấn nút: Chương trình sẽ được chạy dựa theo phương pháp quét hàng và cột. Do đó khi muốn hiển thị ngược lại thì ta cũng quét hàng và cột theo chiều ngược lại. Để quét cột ta dần cho lấy dữ liệu trong trong vùng ROM nội của 8051, quét hàng dữ liệu trong thanh ghi A được dịch 1 bit. Khi nhấn nút yêu cầu đảo ngược chiều dịch chữ thì ta đợi chương trình quét xong một lượt 8 hàng 8 cột, sau đó thay đổi con trỏ vị trí ( DPTR) 7 đơn vị để quét kí tự kí tiếp theo chiều ngược lại. Cách xuất ký tự lên màn hình PC thông qua cổng nối tiếp : Chờ cờ TI đặt lên mức 1 ( phát xong kí tự trước đó ), sau đó đưa mã ASCII của kí tự vào thanh ghi SBUF, và bắt đầu chờ cờ TI lên 1, khi cờ TI được bật lên 1 tức việc truyền kí tự hoàn thành. Việc phát kí tự phải được cấu hình trong thanh ghi SCON, lựa chọn tốc độ Baud phù hợp. Giải thuật nhân 2 số 8 bit để xuất ra tiền sản phẩm : TINH: MOV R0,#36H MOV R1,#5 LLLL: MOV @R0,#0 INC R0 DJNZ R1,LLLL MOV A,R2 MOV B,#10 DIV AB MOV 30H,B MOV B,#10 DIV AB MOV 31H,B MOV 32H,A MOV A,2CH MOV B,#10 DIV AB MOV 33H,B MOV B,#10 DIV AB MOV 34H,B MOV 35H,A MOV R3,#3 MOV R4,#3 MOV R5,#36H MOV R6,#30H MOV R7,#33H LAP11: MOV R0,07H MOV A,@R0 MOV R0,06H MOV B,@R0 MOV R0,05H ACALL TINH1 INC R5 INC R6 DJNZ R4,LAP11 MOV R4,#3 MOV R6,#30H DEC R5 DEC R5 INC R7 DJNZ R3,LAP11 RET TINH1: MUL AB MOV B,#10 DIV AB MOV R1,A MOV A,B ADD A,@R0 CJNE A,#10,TT TT: JC NHAYUU INC R1 CLR C SUBB A,#10 NHAYUU: MOV @R0,A INC R0 MOV A,@R0 ADD A,R1 MOV @R0,A INC R0 MOV A,@R0 ADDC A,#0 MOV @R0,A RET
File đính kèm:
- bao_cao_bai_tap_lon_mon_vi_xu_ly_moi.docx