Professional Documents
Culture Documents
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.
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.
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.
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.
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.
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.
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.
Để 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.