You are on page 1of 15

ĐẠI HỌC BÁCH KHOA

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH




BÁO CÁO THÍ NGHIỆM VI XỬ LÍ LAB1, LAB2.1

Sinh viên: Hồ Xuân Tuấn


MSSV: 1915760
GV hướng dẫn: Nguyễn Phan Hải Phú
BÀI THÍ NGHIỆM 1:
LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED ĐƠN

THÍ NGHIỆM 1
Mục tiêu: Nắm được cách thức điều khiển trực tiếp ngoại vi thông qua
các port I/O của 8051.
Yêu cầu: 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 P1.4.

Code chương trình:

ORG 0000H
LOOP:
MOV C,P1.0
JC KN
CLR P1.4
JMP LOOP
KN:
SETB P1.4
JMP LOOP
END
Kiểm tra:

 Biên dịch và thực thi chương trình để kiểm tra kết quả thực hiện.

Không nhấn nút:

Nhấn nút
 Thử giải thích tại sao có đến 2 led cùng bị tác động khi nhấn hoặc
thả nút?
+ Khi chưa nhấn nút chân p1.0 đang ở mức 1, và ta setb p1.4 cũng lên
mức 1, ngược lại khi nhất nút chân p1.0 và p14 cùng xuống mức 0, mà
con led sẽ phát sáng khi tác động mức 0 ngược lại led sẽ tắt, vì thế có
đến 2 led bị tác động khi nhấn và thả nút.

THÍ NGHIỆM 2

Mục tiêu: Nắm được cách tạo trễ dùng vòng lặp lệnh.
Yêu cầu: Viết chương trình tạo xung vuông 1 Hz, chu kỳ nhiệm vụ
50% trên chân P1.0.

Code chương trình:

ORG 0000H
LOOP:
SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP LOOP
DELAY:
MOV R4,#5
LAP1:MOV R5,#200
LAP2:MOV R6,#250
DJNZ R6,$
DJNZ R5,LAP2
DJNZ R4,LAP1
RET
END
Kiểm tra:
 Biên dịch, thực thi và kiểm tra chương trình bằng cách sử dụng
oscilloscope để kiểm tra.




Để tạo xung 1HZ, các vòng trễ tạo ra như thế nào. Tính toán chính
xác dựa trên chương trình đã viết.
+ Ta có tần số thạch anh XTAl=12 MHZ ⇒ T=1/12 us
⇒1MC=12*T=1 us
Xung với f=1HZ ⇒Tclk=1 s=1000000 MC
Chu kỳ nhiệm vụ 50% trên chân P1.0.
⇒TH=500000 MC=2*250*200*50MC ( vì lệnh DJNZ thực hiện 2
chu kì máy, và các thanh ghi có 8 bit, nên chứa tối đa 250)
⇒TL=500000 MC=2*250*200*5 MC
⇒ Tạo 1 vòng trễ delay gần đúng thực hiện 250000 (vì lệnh DJNZ
thực hiện 2MC)
 Sai số nhỏ nhất có thể đạt được so với yêu cầu là bao nhiêu?
+ Cách tính ở trên là gần đúng, thực tế chính xác được tính như sau:
DELAY:
MOV R4,#5 ⇒ 1MC*1
LAP1:MOV R5,#200 ⇒ 1MC*1
LAP2:MOV R6,#250 ⇒ 1MC*1 ⇒501MC
DJNZ R6,$ ⇒ 2MC*250
DJNZ R5,LAP2 ⇒ 2MC*200 ⇒100200MC
DJNZ R4,LAP1 ⇒ 2MC*5 ⇒501005MC
RET ⇒ 2MC ⇒1+1+500+400+10+2+501005

⇒501919MC
⇒ Sai số nhỏ nhất đạt được yêu cầu là: 1919/500000=0.3838%

THÍ NGHIỆM 3

Mục tiêu: Nắm được cách viết chương trình con để tạo trễ.

Yêu cầu: Viết chương trình con Delay1sIns và dùng chương trình con
này để chớp/tắt LED đơn gắn vào P1.0 sau mỗi khoảng thời gian 1s.

Code chương trình:

ORG 0000H MOV R4,#10


LOOP: LAP1:MOV R5,#200
SETB P1.0 LAP2:MOV R6,#250
ACALL DELAY1sIns DJNZ R6,$
CLR P1.0 DJNZ R5,LAP2
ACALL DELAY1sIns DJNZ R4,LAP1
SJMP LOOP RET
DELAY1sIns: END
Kiểm tra:
 Biên dịch, thực thi và kiểm tra chương trình bằng cách quan sát LED
đơn.
+Ta quan sát được khi chân p1.0 ở mức 0 thì đèn sáng được một giây
rồi tắt, ngược lại chân p1.0 ở mức 1 thì đèn tắt được một giây rồi sáng,
thời gian đèn sáng tắt bằng nhau quá trình xảy ra tuần hoàn.
 Thời gian 1s được tạo ra như thế nào?
+Thời giây được tạo gần đúng như sau:
1s=1000000 MC=2*500000 MC (vì lệnh DJNZ tốn 2 MC)
Cần tạo ra vòng trễ DELAY 500000 MC=R6*R5*R4=250*200*10
MC (Vì thanh ghi chứa giá trị tối đa 250)
 Bây giờ nếu một bạn sinh viên muốn viết chương trình con tạo trễ 2s
thì phải sửa lại chương trình con đã viết như thế nào?
+ Cần sửa lại bên trong hàm DELAY: dòng lệnh MOV R4,#10 thành
MOV R4,#20
+Vì 2s=2000000 MC=2*1000000 MC
+ Cần tạo ra vòng trễ DELAY 1000000
MC=R6*R5*R4=250*200*20 MC (Vì thanh ghi chứa giá trị tối đa
250)

THÍ NGHIỆM 4

Mục tiêu: Nắm được cách sử dụng chương trình con để tạo xung.

Yêu cầu: Viết chương trình tạo xung vuông 2Hz chu kỳ nhiệm vụ
70% tại chân P1.0.

Code chương trình:

ORG 0000H DELAY1:


LOOP: MOV R4,#7
SETB P1.0 LAP1:MOV R5,#100
ACALL DELAY1 LAP2:MOV R6,#250
CLR P1.0 DJNZ R6,$
ACALL DELAY2 DJNZ R5,LAP2
SJMP LOOP DJNZ R4,LAP1
RET DJNZ R6,$
DELAY2: DJNZ R5,LAP4
MOV R4,#3 DJNZ R4,LAP3
LAP3:MOV R5,#100 RET
LAP4:MOV R6,#250 END

Kiểm tra:
 Biên dịch, thực thi và kiểm tra chương trình bằng cách quan sát LED
đơn.
+Ta quan sát được khi chân p1.0 ở mức 0 thì đèn sáng, ngược lại chân
p1.0 ở mức 1 thì đèn tắt, nhưng thời gian đèn tắt lâu hơn đèn sáng.

 Thời gian mức cao và mức thấp của xung lần lượt là bao nhiêu chu
kỳ máy? (Lấy tần số của thạch anh xấp xỉ 12MHz). Giá trị nạp vào các
thanh ghi là bao nhiêu?
+ Ta có tần số thạch anh XTAl=12 MHZ ⇒ T=1/12 us
⇒1MC=12*T=1 us
Xung với f=2HZ ⇒Tclk=0.5 s=500000 MC
Chu kỳ nhiệm vụ 70% trên chân P1.0.
⇒TH=500000*70% MC= 2*R6*R5*R4=2*250*100*7 MC
⇒TL=500000*30% MC=2* R6*R5*R4=2*250*100*3 MC

 Viết lại chương trình tạo xung vuông 2Hz với chu kỳ nhiệm vụ bây
giờ là 80%?
ORG 0000H SJMP LOOP
LOOP: DELAY1:
SETB P1.0 MOV R4,#8
ACALL DELAY1 LAP1:MOV R5,#100
CLR P1.0 LAP2:MOV R6,#250
ACALL DELAY2 DJNZ R6,$
DJNZ R5,LAP2 DJNZ R6,$
DJNZ R4,LAP1 DJNZ R5,LAP4
RET DJNZ R4,LAP3
DELAY2: RET
MOV R4,#2 END
LAP3:MOV R5,#100
LAP4:MOV R6,#250

THÍ NGHIỆM 5
Mục tiêu: Nắm được cách tạo nhiều xung khác nhau trên 8051.
Yêu cầu: Viết chương trình tạo 2 xung vuông 0.5Hz và 1Hz với cùng
chu kỳ nhiệm vụ là 50% lần lượt trên chân P1.0 và P1.1.
Code chương trình:
ORG 0000H CLR P1.1
LOOP: SJMP LOOP
CLR P1.0 DELAY:
ACALL DELAY MOV R4#4
SETB P1.1 L3: MOV R5,#250
ACALL DELAY L4: MOV R6,#250
CLR P1.1 DJNZ R6, $
SETB P1.0 DJNZ R5, L4
ACALL DELAY DJNZ R4, L3
SETB P1.1 RET
ACALL DELAY END
Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình bằng cách quan sát trên
các LED đơn.
+Ta quan sát được khi chân p1.0 và p1.1 ở mức 0 thì đèn sáng, ngược
lại chân p1.0, p1.1 ở mức 1 thì đèn tắt, led0 có thời gian đèn tắt và sáng
như nhau và gấp 2 lần thời gian led1
 Vẽ giản đồ của 2 xung? Các chương trình con viết với thời gian trễ
là bao nhiêu?

 Tại mỗi thời gian tạo trễ, các chân P1.0 và P1.1 xuất tín hiệu như thế
nào?
+Ta quan sát được khi chân p1.0 ở mức 0 thì đèn sáng được một giây
rồi tắt, ngược lại chân p1.0 ở mức 1 thì đèn tắt được một giây rồi sáng,
thời gian đèn sáng tắt bằng nhau quá trình xảy ra tuần hoàn.
+Ta quan sát được khi chân p1.1 ở mức 0 thì đèn sáng được 0.5 giây
rồi tắt, ngược lại chân p1.1 ở mức 1 thì đèn tắt được 0.5 giây rồi sáng,
thời gian đèn sáng tắt bằng nhau quá trình xảy ra tuần hoàn.
THÍ NGHIỆM 6
Mục tiêu: Hiểu được cách hiển thị trên và tạo hiệu ứng trên bar LED.

Yêu cầu: Viết chương trình tạo hiệu ứng quay LED: các LED đơn trên
BARLED1 sáng lần lượt từ trái sang phải sau thời gian 1s và lặp lại.
Sử dụng chương trình con Delay1sIns đã viết ở trên.

Code chương trình:

ORG 0000H
MOV A, #11111110B // vì đèn sáng khi nhận được bit 0, nên đầu
tiên ta gán thanh ghi A giá trị 11111111
LAP: MOV P1, A // gán A vào Port 1
ACALL Delay1sIns // tạo trễ 1s
RL A // dịch thanh ghi A sang trái, để đổi từ chân
p1.0 sang p1.2 ……
SJMP LAP
Delay1sIns:
MOV R4,#10
L1: MOV R5,#200
L2: MOV R6,#250
DJNZ R6, $
DJNZ R5, L2
DJNZ R4,L1
RET
END

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình bằng cách quan sát hiệu
ứng trên bar led.
+ Trên bar led đèn 1 sáng 1s rồi tắt, tiếp tục đèn 2 sáng 1s rồi tắt, tương
tự đến đèn 8 rồi quay lại đèn 1.
 Led ngoài cùng bên trái kết nối đến MSB (most significant bit) hay
LSB (less significant
bit) của port 1?
+ Led ngoài cùng bên trái kết nối đến MSB
BÀI THÍ NGHIỆM 2
LẬP TRÌNH HIỂN THỊ LED 7 ĐOẠN VÀ GIAO TIẾP LED
MA TRẬN
THÍ NGHIỆM 1
Mục tiêu: Nắm được cách thức hiển thị LED 7 đoạn.
Yêu cầu:
 Viết chương trình con DisplayLED xuất giá trị 9 lên LED 7 đoạn
thứ 0.
 Sau đó, dùng chương trình con này viết chương trình xuất giá trị 9
lên LED 7 đoạn số 0.
Code chương trình:
ORG 0000H
DisplayLED:
MOV A,#11101001B
MOV DPTR, #0011H
MOVX @DPTR, A
END
Kiểm tra:
 Biên dịch, thực thi và kiểm tra chương trình.
 Để giao tiếp với LED 7 đoạn, ta phải ghi ra ngoại vi ở vùng nhớ (giá
trị nạp vào thanh ghi DPTR) bao nhiêu?
+ 0000H đến 1FFFFH
 Byte được ghi ra phải có định dạng như thế nào? Muốn hiển thị lên
các LED còn lại, bit nào sẽ bằng 0?
+ 4 bit trọng số cao dùng để chọn led để hiện thị, 4 bit trọng số thấp để
đưa data ra ngoài.
+ Nếu chọn led 1 thì 4 bit cao là 1110, chọn số 9 thì 4 bit thấp là 1001

THÍ NGHIỆM 2
Mục tiêu: Nắm được cách thức xuất giá trị lên LED 7 đoạn.
Yêu cầu: Sửa lại chương trình con DisplayLED ở Thí nghiệm 1 (có
thể tham khảo đoạn chương trình ở dưới) để thực hiện xuất giá trị
chứa trong thanh ghi R0 lên LED 7 đoạn có số thứ tự chứa trong
thanh ghi R1. (R0 nằm trong tầm từ 0-9 và R1 trong tầm từ 0-3. Sau
đó, dùng chương trình con này viết chương trình xuất 1 giá trị bất kỳ
lên LED 7 đoạn số 3.
Đoạn chương trình tính toán để xuất ra điều khiển LED dựa vào
R0, R1.
MOV B, R1 // gán nội dung thanh ghi R1 vào thanh ghi B
MOV A, #11110111B //bit số 3 bằng 0, bốn bit cao bằng 1.
SHIFTLOOP:
RL A // Dịch trái thanh ghi A
DJNZ B, SHIFTLOOP // giảm thanh ghi B nếu không bằng 0 thì nhảy
ANL A, #0F0H // nhân thanh ghi A với giá trị F0H
PUSH ACC // đưa nội dung thanh ghi ACC lên Stack
MOV A, R0 // gán nội dung thanh ghi R0 vào A
ANL A, #0FH // Nhân A với 0FH
MOV R0, A // gán giá trị thanh ghi A vào R0
POP ACC // lấy nội dung của Stack bỏ về lại thanh ghi ACC
ORL A, R0 //
THÍ NGHIỆM 3
Mục tiêu: Kết hợp được các chương trình con để hiển thị LED 7
đoạn.
Yêu cầu: Viết chương trình hiển thị lên LED 7 đoạn số 0 các con số
từ 0 đến 9 sau các khoảng thời gian 1s.

Code chương trình:


ORG 0000H
LAP1:
MOV R0, #0H //đầu tiên gán giá trị R0=0H
LAP2:
ACALL DisplayLED
ACALL Delay1sIns
INC R0 //tăng giá trị R0 lên 1 đơn vị
CJNE R0, #10, LAP2 //so sánh giá trị R0 nhỏ hơn 10 thì nhảy
về LAP2, ngược lại sẽ thực hiện lệnh tiếp theo
SJMP LAP1
DisplayLED: // chương trình con hiển thị lên led
MOV A,#11100000B // hiển thị trên led0, nên bit 4=0, và giá trị
ban đầu hiển thị trên led là
ADD A, R0
MOV DPTR, #0011H //truy xuất địa chỉ ngoại vi (0000h⇒1FFFh)
MOVX @DPTR, A // gán nội dung thanh ghi A, vào nội dung của
thanh ghi DPTR.
Delay1sIns: //chương trình con tạo độ trễ 1s
MOV R4,#10H
L1: MOV R5,#200
L2: MOV R6,#250
DJNZ R6, $
DJNZ R5, L2
DJNZ R4,L1
RET
END
Kiểm tra:
 Biên dịch, thực thi và kiểm tra chương trình.

 Để kiểm tra R0 lớn hơn 9 cần sử dụng lệnh nào? Vòng lặp nhảy
như thế nào?
+ Để kiểm tra R0 lớn hơn 9 ta dùng lệnh CJNE R0, #10H, LAP2 nếu
như giá trị của R0 nhỏ hơn 10 thì sẽ nhảy về LAP 2, nếu giá trị R0 lớn
hơn 9 thì, sẽ nhảy về LAP1 gán giá trị R) lại về 1.

You might also like