Báo cáo thí nghiệm môn Vi xử lý - Bài 4
BÀI 1: Viết chương trình đọc điện áp của biến trở trên kênh 0 và hiển thị ra LED 7
đoạn.
ORG 2000H
LOOP:
MOV R1, #255
MOV DPTR, #4000H ; ghi giá trị 4000H vào con trỏ vị trí (vị trí bắt
đầu trên IC 74LS138 đối với vùng điều khiển
ADC)
MOV A, #0
MOVX @DPTR,A ; chọn ngõ vào được nối vào chân IN0 của IC
ADC0809
ACALL DELAY_100US ; tạo trễ một khoảng thời gian để cho IC đọc
và xử lí một giá trị điện áp
MOVX A,@DPTR ; gửi giá trị đọc được về thanh ghi A
LOOP1: ; vòng lặp cho quá trình xuất giá trị đọc được từ IC
ADC0809
PUSH ACC ; cất giá trị đọc được từ IC ADC0809 vào vùng
stack pointer
MOV DPTR, #0000H ; ghi giá trị 0000H vào con trỏ vị trí (vị trí bắt
đầu trên IC 74LS138 đối với LED 7 đoạn)
; quá trình thực hiện tính toán nhằm tách các số hàng trăm, chục, đơn vị của giá trị
điện áp đọc được lên 3 LED 7 đoạn khác nhau
MOV B, #10
DIV AB
MOV R7, B
MOV B, #10
DIV AB
ORL A, #0B0H
MOVX @DPTR, A ; xuất giá trị hàng trăm ra LED 7 đoạn thứ nhất
ACALL DELAY_1MS
MOV A, B
ORL A,#0D0H
MOVX @DPTR, A; xuất giá trị hàng trăm ra LED 7 đoạn thứ hai
ACALL DELAY_1MS
MOV A, R7
ORL A,#0E0H
MOVX @DPTR, A; xuất giá trị hàng trăm ra LED 7 đoạn thứ baACALL DELAY_1MS
POP ACC
DJNZ R1, LOOP1; quá trình xuất trên LED 7 đoạn được lặp lại để
mắt chúng ta có thể nhận biết
SJMP LOOP ; quay về chương trình đọc giá trị điện áp từ ADC
DELAY_100US:
MOV R6, #200
DJNZ R6, $
RET
DELAY_1MS ; đoạn chương trình tạo trễ dùng Timer cung cấp một
khoảng thời gian để mắt chúng ta nhận thấy các LED
7 đoạn hiển thị
MOV TMOD, #01H
MOV TH0, #HIGH(-1000)
MOV TL0,#LOW(-1000)
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
RET
BÀI 1: Viết chương trình đọc điện áp của biến trở trên kênh 0 và hiển thị ra LED 7 đoạn. ORG 2000H LOOP: MOV R1, #255 MOV DPTR, #4000H ; ghi giá trị 4000H vào con trỏ vị trí (vị trí bắt đầu trên IC 74LS138 đối với vùng điều khiển ADC) MOV A, #0 MOVX @DPTR,A ; chọn ngõ vào được nối vào chân IN0 của IC ADC0809 ACALL DELAY_100US ; tạo trễ một khoảng thời gian để cho IC đọc và xử lí một giá trị điện áp MOVX A,@DPTR ; gửi giá trị đọc được về thanh ghi A LOOP1: ; vòng lặp cho quá trình xuất giá trị đọc được từ IC ADC0809 PUSH ACC ; cất giá trị đọc được từ IC ADC0809 vào vùng stack pointer MOV DPTR, #0000H ; ghi giá trị 0000H vào con trỏ vị trí (vị trí bắt đầu trên IC 74LS138 đối với LED 7 đoạn) ; quá trình thực hiện tính toán nhằm tách các số hàng trăm, chục, đơn vị của giá trị điện áp đọc được lên 3 LED 7 đoạn khác nhau MOV B, #10 DIV AB MOV R7, B MOV B, #10 DIV AB ORL A, #0B0H MOVX @DPTR, A ; xuất giá trị hàng trăm ra LED 7 đoạn thứ nhất ACALL DELAY_1MS MOV A, B ORL A,#0D0H MOVX @DPTR, A; xuất giá trị hàng trăm ra LED 7 đoạn thứ hai ACALL DELAY_1MS MOV A, R7 ORL A,#0E0H MOVX @DPTR, A; xuất giá trị hàng trăm ra LED 7 đoạn thứ ba ACALL DELAY_1MS POP ACC DJNZ R1, LOOP1; quá trình xuất trên LED 7 đoạn được lặp lại để mắt chúng ta có thể nhận biết SJMP LOOP ; quay về chương trình đọc giá trị điện áp từ ADC DELAY_100US: MOV R6, #200 DJNZ R6, $ RET DELAY_1MS ; đoạn chương trình tạo trễ dùng Timer cung cấp một khoảng thời gian để mắt chúng ta nhận thấy các LED 7 đoạn hiển thị MOV TMOD, #01H MOV TH0, #HIGH(-1000) MOV TL0,#LOW(-1000) SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 RET BÀI 2 : Viết chương trình đọc điện áp của biến trở trên kênh 0 và hiển thị ra LCD Quá trình đọc giá trị điện áp từ IC ADC0809 cũng tương tự như bài 1, chỉ khác việc hiển thị giá trị điện áp đọc được là dùng LCD ORG 2000H EN BIT P3.4 ; đặt nhãn cho bit P3.4 ( ứng với chân EN trên LCD ) RS BIT P3.5 ; đặt nhãn cho bit P3.5 ( ứng với chân RS trên LCD ) MOV DPTR,#8000H ACALL LCD_INIT ; gọi chương trình để cài đặt các thông số hiển thị trên LCD ; quá trình đọc giá trị điện áp từ IC ADC0809 LOOP: MOV DPTR,#4000H MOV A,#0 MOVX @DPTR,A ACALL DELAY_100US MOVX A,@DPTR ; quá trình xuất giá trị điện áp lên LCD MOV DPTR,#8000H PUSH ACC MOV A, #80H ; đặt cấu hình cho LCD để LCD bắt đầu hiển thị kí tự ở góc trái màn hình ACALL WRITE_CMD POP ACC MOV B, #10 DIV AB MOV R0,B; giá trị hàng đơn vị của điện áp cất vào thanh ghi R0 MOV B, #10 DIV AB ; giá trị hàng trăm của điện áp cất vào thanh ghi A, hàng chục vào thanh ghi B ORL A, #30H ; tạo ra mã ASCII của kí số tương ứng ACALL WRITE_TEXT ; xuất lên LCD MOV A, B ORL A, #30H ACALL WRITE_TEXT MOV A, R0 ORL A,#30H ACALL WRITE_TEXT SJMP LOOP LCD_INIT: MOV A,#01H ; lệnh xóa màn hình ACALL WRITE_CMD; gọi chương trình để thực thi lệnh xóa màn hình MOV A,#38H ; lệnh qui định cách thức giao tiếp giữa LCD với 8051 bằng bus dữ liệu 8 bit ACALL WRITE_CMD MOV A,#0CH ; lệnh bật LCD ON , không hiển thị Cursor lên màn hình LCD ACALL WRITE_CMD MOV A,#06H ; lệnh đặt cấu hình cho LCD sao cho mỗi khi gửi đến LCD một kí tự thì Cursor tự động chuyển sang phải ACALL WRITE_CMD WAIT_LCD: ; đoạn chương trình tạo trễ MOV R6,#2 MOV TMOD,#01H LOOP1: MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 DJNZ R6, LOOP1 RET WRITE_TEXT: ; đoạn chương trình xuất kí tự từ vùng ROM nội của 8051 gửi xuống hiển thị ra LCD MOV DPTR,#8000H LCALL WAIT_LCD ; đợi cho LCD thực hiện xong những lệnh trước đó ; sau khi thực hiện xong các lệnh trên thì bắt đầu truyền gửi kí tự xuống LCD. Trước tiên ta phải để tín hiệu trên chân RS của LCD lên mức 1 và sau khi có một xung kích cạnh xuống trên chân EN thì dữ liệu trên thanh ghi A sẽ được xuất ra LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET WRITE_CMD: LCALL WAIT_LCD ; gọi chương trình đợi cho LCD thực hiện xong các lệnh trước đó ; sau khi LCD thực hiện xong các lệnh trước đó thì ta phải cấu hình cho các chân RS, EN trên LCD. Khi ta gửi một dữ liệu ra LCD thì tín hiệu trên chân RS phải ở mức thấp, đồng thời khi có một xung kích cạnh xuống trên chân EN, dữ liệu trong thanh ghi A sẽ đưa xuống LCD để thực hiện như một lệnh CLR RS MOVX @DPTR,A SETB EN CLR EN RET DELAY_100US: MOV R6,#200 DJNZ R6,$ RET END BÀI 3: Viết chương trình đọc điện áp thực của biến trở trên kênh 0 và hiển thị ra LCD Giải thuật cho vấn đề này cũng tương tự như BÀI 2, chỉ khác là quá trình này xuất điện áp thực, do vậy từ giá trị đọc được từ IC ADC0809 ta cần phải có quá trình tính toán để hiện thị điện áp thực. Với giá trị đọc được, ta qui đổi sang giá trị thực bằng cách 𝑉thực = 𝑉𝐴𝐷𝐶 51 Đoạn chương trình thực hiện việc chuyển đổi sang điện áp thực : PUSH ACC PUSH B MOV B,#51 DIV AB ; chia giá trị đọc được cho 51, lấy giá trị phần nguyên ORL A,#30H ; tạo mã ASCII của giá trị nguyên ACALL WRITE_TEXT MOV A,#0A5H ; xuất dấu chấm phẩy ACALL WRITE_TEXT ; giá trị sau dấu chấm phẩy ta nhân 10 rồi đem chia cho 51 nhưng ta chấp nhận sai số nên ta chỉ lấy giá trị sau dấu chấm phẩy chia 5 để lấy giá trị sau dấu chấm phẩy MOV A,B MOV B,#5 DIV AB ORL A,#30H ACALL WRITE_TEXT POP B POP ACC ĐOẠN CHƯƠNG TRÌNH : ORG 2000H RS BIT P3.5 EN BIT P3.4 MOV DPTR,#8000H ACALL LCD_INIT LOOP: MOV DPTR,#4000H MOV A,#0 MOVX @DPTR,A ACALL DELAY_100US MOVX A,@DPTR MOV DPTR,#8000H ACALL CHIA MOV A, #80H ACALL WRITE_CMD SJMP LOOP LCD_INIT: MOV A, #38H ACALL WRITE_CMD MOV A, #0CH ACALL WRITE_CMD MOV A, #04H ACALL WRITE_CMD MOV A, #01H ACALL WRITE_CMD RET WAIT_LCD: ; đoạn chương trình tạo trễ MOV R6,#2 MOV TMOD ,#01H LOOP1: MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 DJNZ R6, LOOP1 RET WRITE_TEXT : SETB RS MOVX @DPTR,A SETB EN CLR EN ACALL WAIT_LCD RET WRITE_CMD: CLR RS MOVX @DPTR,A SETB EN CLR EN ACALL WAIT_LCD RET DELAY_100US: MOV R6, #200 DJNZ R6, $ RET CHIA: PUSH ACC PUSH B MOV B, #51 DIV AB ORL A, #30H ACALL WRITE_TEXT MOV A, #0A5H ACALL WRITE_TEXT MOV A, B MOV B, #5 DIV AB ORL A, #30H ACALL WRITE_TEXT POP B POP ACC RET END
File đính kèm:
- bao_cao_thi_nghiem_mon_vi_xu_ly_bai_4.pdf