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

 

docx59 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: yen2110 | Lượt xem: 491 | Lượt tải: 0download
Tóm tắt nội dung Báo cáo bài tập lớn môn Vi xử lý (Mới), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
	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:

  • docxbao_cao_bai_tap_lon_mon_vi_xu_ly_moi.docx