Báo cáo Thí nghiệm Vi xử lý Trường ĐH BK ĐHQG TP.HCMBài thí nghiệm 1: Lập trình giao tiếp phím đơn và LEDBài thí nghiệm 2: Lập trình hiển thị LED 7 đoạn và giao tiếp LED ma trậnBài thí nghiệm 3: Thí nghiệm giao tiếp LCD và ADCBài thí nghiệm 4: Thí nghiệm giao tiếp Timer cà Serial PortBài thí nghiệm 5: Thí nghiệm lập trình ngắt
Trang 1BÁO CÁO THÍ NGHIỆM
Trang 2 Nắm được cách sử dụng kit thí nghiệm, phần mềm lập trình
Nắm được cách lập trình giao tiếp IO port
Nắm được cách lập trình tạo thời gian trễ dùng các lệnh
CHUẨN BỊ
Đọc chương 1 và chương 2 của tài liệu hướng dẫn
Viết chương trình và mô phỏng trên Proteus các bài thí nghiệm dựa trên bài thí nghiệm 0
Trang 3Mụ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 P3.0 (bit thứ 0 của led thanh BL202)
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
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?
Tổng kết xem các bit nào của 2 port có thể được dùng trong thí nghiệm trên và giải thích tại sao?
Trang 4 Channel A: chân P1.0
Channel B: chân P3.0
b Trả lời câu hỏi
1) 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?
Vì chân P1.0 cũng được nối đến một led trên led thanh BL204 nên ngoài led được nối với chân P3.0 bị tác động khi nhấn/thả nút nhấn thì led nối chân P1.0 cũng bị tác động
2) Tổng kết xem các bit nào của 2 port có thể được dùng trong thí nghiệm trên và giải thích tại sao?
Về nút nhấn: tất cả 8 nút nhấn kết nối với 8 bit trên Port 1 đều có thể sử dụng
Về led hiển thị: trừ 2 led nối với chân P3.6 và chân P3.7 đều có thể sử dụng để làm led hiển thị (Khi sử dụng Port 1 và Port 3 vì chương trình được download xuống RAM ngoài, do đó khi chạy chương trình vi xử lý làm việc ở chế độ giao tiếp bộ nhớ ngoài
Để giao tiếp bộ nhớ ngoài thì 2 tín hiện RD (P3.7) và WR (P3.6) được sử dụng vì vậy chương trình không thể sử dụng 2 chân P3.6 và P3.7 như là chân I/O port)
Trang 5Mụ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
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
Sai số nhỏ nhất có thể đạt được so với yêu cầu là bao nhiêu?
HD: Tính sai số dựa vào tần số thạch anh là 11.0592 Mhz
Trang 62 Kết quả thí nghiệm
a Kết quả mô phỏng: (Time/div = 0.25s, V/div = 1V cho Channel A)
Channel A: chân P1.0
b Trả lời câu hỏi
1) Để 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
Trang 7Công thức tính chính xác thời gian delay với chương trình tạo trễ 3 vòng lặp:
2) Sai số nhỏ nhất có thể đạt được so với yêu cầu là bao nhiêu?
Sai số so với yêu cầu là , để sai số nhỏ nhất thì phải đạt giá trị nhỏ nhất (với ) thì (tương ứng với giá trị nạp vào R5 là 0), khi đó ta có Thông qua biến đổi, ta có đạt giá trị nhỏ nhất tại
và
Trang 8
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
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
Thời gian 1s được tạo ra như thế nào?
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?
Trang 9a Kết quả mô phỏng: (Time/div = 0.5s, V/div = 1V cho Channel A)
Channel A: chân P1.0
b Trả lời câu hỏi
1) Thời gian 1s được tạo ra như thế nào?
Thời gian 1s được tạo ra bằng cách sử dụng chương trình con tạo trễ 3 vòng lặp (sử dụng ở thí nghiệm 2) với các giá trị nạp vào R7, R6, R5 lần lượt là 8, 240, 240 ( )
2) 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?
Muốn viết chương trình con tạo trễ 2s thì sửa lại giá trị nạp vào R7 thành 16 ( )
Trang 10Mụ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
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?
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%?
Trang 11b Trả lời câu hỏi
1) 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?
Với tần số 2Hz thì chu kỳ của xung là 0.5s và với chu kì nhiệm vụ 70% thì thời gian mức cao và mức thấp lần lượt là 0.35s và 0.15s
Lấy tần số thạch anh xấp xỉ 12MHz, suy ra Từ đó ta có thời gian mức cao
và thời gian mức thấp lần lượt là 350,000MC và 150,000MC
Trang 12nên chọn giá trị nạp vào thanh ghi R6 và R5 lần lượt là 100 và 250
2) 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%?
Trang 13Mụ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
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
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?
Trang 14b Trả lời câu hỏi
1) 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?
Giản đồ xung: Hình ảnh mô phỏng ở phần a
Chương trình con viết với thời gian tạo trễ là 0.5s
2) 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?
Tại mỗi thời gian tạo trễ, chân P1.1 đảo trạng thái tín hiệu xuất ra 1 lần
Tại mỗi 2 lần thời gian tạo trễ, chân P1.0 đảo trạng thái tín hiệu xuất ra 1 lần
Trang 15Mụ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
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
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?
Trang 162 Kết quả thí nghiệm
a Kết quả mô phỏng
Trang 17b Trả lời câu hỏi
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 (most significant bit) của port 1
Trang 18MỤC TIÊU
Nắm được cách giao tiếp ngoại vi ở dạng ánh xạ bộ nhớ.
Nắm được cách giao tiếp LED 7 và quét LED 7 đoạn.
Nắm được cách giao tiếp LED ma trận.
CHUẨN BỊ
Đọc chương 4 và chương 12 của tài liệu hướng dẫn.
Viết chương trình và mô phỏng các bài thí nghiệm trên Proteus dựa trên bài thí nghiệm 0.
Trang 19THÍ 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.
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?
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?
BÁO CÁO:
1 Chương trình:
ORG 2000H ACALL DisplayLED SJMP $
DisplayLED:
MOV A, #11101001B MOV DPTR, #0000H MOVX @DPTR, A RET
END
Trang 202 Kết quả thí nghiệm
a Kết quả mô phỏng:
b Trả lời câu hỏi
1) Để 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?
Để giao tiếp với LED 7 đoạn, ta phải ghi vào vùng nhớ có giá trị 0000H- 1FFFH
2) 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?
Byte ghi ra với 4 bit cao là tín hiệu chọn LED, theo thứ tự từ phải sang trái là LED 0 đến LED thứ 3, để cho phép 1 LED sáng thì ta cho giá trị tương ứng là 0, 4 bit sau là giá trị số BCD cần biểu diễn
Trang 21THÍ 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
Trang 22 Giải thích ý nghĩa các lệnh của đoạn chương trình trong hướng dẫn.
Viết lại chương trình DisplayLED sử dụng phương pháp tra bảng.
DisplayLED:
MOV B, R1 INC B MOV A, #11110111B SHIFTLOOP:
RL A DJNZ B, SHIFTLOOP ANL A, #0F0H
PUSH ACC MOV A, R0 ANL A, #0FH MOV R0, A POP ACC ORL A, R0 MOV DPTR, #0
Trang 23MOVX @DPTR, A RET
END
2 Kết quả thí nghiệm
a Kết quả mô phỏng:
b Trả lời câu hỏi
1) Giải thích ý nghĩa các lệnh của đoạn chương trình trong hướng dẫn.
MOV B, R1 ; chuyển vị trí LED cần hiển thị vào B
INC B ; (bổ sung) tăng B lên 1 để tạo số lần dịch
chuyển bit 0
MOV A, #11110111B ; tạo khung của 4 bit chọn LED
SHIFTLOOP:
RL A ; Thực hiện chuyển bit 0 sang trái 1 vị trí
DJNZ B, SHIFTLOOP ; Dời bit 0 sang trái n+1 vị trí (n là vị trí LED cần
Trang 24ANL A, #0FH ; Giữ lại 4 bit thấp (mã BCD xuất lên LED) và xóa
4 bit cao
MOV R0, A ; Chuyển A vào R0
POP ACC ; Lấy 4 bit chọn LED từ stack
ORL A, R0 ; Thực hiện OR logic 4 bit cao (bit chọn LED) và
4 bit thấp (mã BCD xuất lên LED )
2) Viết lại chương trình DisplayLED sử dụng phương pháp tra bảng.
ORG 2000H
ACALL DisplayLED SJMP $
DisplayLED:
MOV DPTR, #TAB MOV A, R1
MOVC A, @A + DPTR ORL A, R0
MOV DPTR, #0 MOVX @DPTR, A RET
TAB: DB 0E0H, 0D0H, 0B0H, 70H
END
Trang 25THÍ 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
HD: Viết chương trình Delay1sIns tạo trễ 1s như ở bài thí nghiệm 1 Trong chương trình chính,
đầu tiên cho thanh ghi R0 bằng 0, sau đó vào vòng lặp gọi chương trình con DisplayLED đã viết
ở phần trước, tạo trễ 1s, tăng R0 lên 1 và lặp lại quá trình Nếu R0 lớn hơn 9 thì cho R0 bằng 0 trở lại
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?
BÁO CÁO:
1 Chương trình:
MOV R1, #0 MAIN: MOV R0, #0
LOOP: ACALL DisplayLED
ACALL Delay1sIns INC R0
CJNE R0, #10, LOOP SJMP MAIN
DisplayLED:
MOV DPTR, #TAB MOV A, R1
Trang 26MOVC A, @A + DPTR ORL A, R0
MOV DPTR, #0 MOVX @DPTR, A RET
Trang 28b Trả lời câu hỏi
Để 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 cần sử dụng lệch CJNE R0, #10, LOOP
Vòng lặp nhảy theo thứ tự:
- Nếu R0 sau khi tăng 1 nhỏ hơn hoặc bằng 9, nhảy đến vị trí LOOP: gọi chương trình con xuất giá trị chứa trong R0 lên LED 0
- Nếu R0 sau khi tăng bằng 10 (lớn hơn 9), nhảy để vị trí MAIN: thực hiện xóa R0 về
0 và sau đó tiếp tục vòng lặp ở trên
Trang 29trình này lặp đi lặp lại Việc hiển thị này sử dụng chương trình con DisplayLED đã viết ở trên
Giảm thời gian trễ xuống còn 100 ms Quan sát hiện tượng
Tính toán thời gian trễ sao cho không còn thấy LED nhấp nháy và áp dụng vào chương trình
Giảm thời gian trễ xuống bằng 0 (không sử dụng hàm delay) Quan sát hiện tượng
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình
Thời gian trễ để không còn thấy LED nhấp nháy là bao nhiêu theo lý thuyết? Giải thích cách tính
Khi giảm rất nhỏ thời gian trễ, hiện tượng xảy ra là gì? Giải thích
ACALL Delay1sIns INC R0
Trang 30INC R1 CJNE R1, #4, LOOP SJMP MAIN
DisplayLED:
MOV DPTR, #TAB MOV A, R1
MOVC A, @A + DPTR ORL A, R0
MOV DPTR, #0 MOVX @DPTR, A RET
Trang 31 Thời gian trễ: 100ms
Trang 32 Thời gian trễ: 0.005s
Thời gian trễ: 0s
b Trả lời câu hỏi
1) Thời gian trễ để không còn thấy LED nhấp nháy là bao nhiêu theo lý thuyết? Giải thích
cách tính
Số khung hình mắt người có thể thấy trong 1 giây là 24 thời gian trễ giữa các khung
Trang 33hình là
hay trong là trong
bốn số phải hiển thị trên LED Thời gian trễ giữa mỗi lần hiển thị là
Thời gian trễ để không còn thấy LED nhấp nháy là bao nhiêu theo lý thuyết là 0.0104s
2) Khi giảm rất nhỏ thời gian trễ, hiện tượng xảy ra là gì? Giải thích
Khi giảm rất nhỏ thời gian trễ, LED không còn sáng nữa Vì thời gian giữa mỗi lần hiển thị số lên LED rất nhỏ làm cho LED không đủ thời gian để làm sáng đèn nên ta không thấy LED sáng nữa
Trang 34THÍ NGHIỆM 5
Mục tiêu: Nắm được phương pháp giao tiếp LED ma trận
Yêu cầu: Viết chương trình làm sáng các LED ở vị trí bất kỳ của hàng y trên LED ma trận Giá trị
y được chứa trong thanh ghi
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình
Để chốt hàng và chốt cột của LED ma trận, ta lần lượt phải ghi ra ngoại vi ở vùng nhớ (giá trị nạp vào thanh ghi DPTR) bao nhiêu?
Để làm sáng LED ở vị trí bất kỳ thì dữ liệu xuất trên cột và hàng phải là mức cao hay thấp ?
Trang 36b Trả lời câu hỏi
1) Để chốt hàng và chốt cột của LED ma trận, ta lần lượt phải ghi ra ngoại vi ở vùng nhớ (giá trị nạp vào thanh ghi DPTR) bao nhiêu?
Để chốt hàng và chốt cột của LED ma trận, ta lần lượt phải ghi ra ngoại vi ở vùng nhớ 8000h-9FFFh (DPTR = 8000H) và A000h-BFFFh (DPTR = A000H)
2) Để làm sáng LED ở vị trí bất kỳ thì dữ liệu xuất trên cột và hàng phải là mức cao hay thấp?
Để làm sáng LED ở vị trí bất kì thì dữ liệu xuất trên hàng phải là mức thấp và dữ liệu xuất trên cột là mức cao
Trang 37THÍ NGHIỆM 6
Mục tiêu: Nắm được phương pháp quét LED ma trận
Yêu cầu: Viết chương trình làm hiển thị chữ B lên LED ma trận
HD:
- Viết các mã xuất theo 8 hàng của từng cột của chữ B cần hiển thị
- Viết chương trình tạo delay 1ms có tên Delay1ms
- Quy trình quét LED ma trận, đầu tiên hiển thị 8 hàng của cột 1, sau đó delay 1ms rồi hiển thị 8 hàng của cột 2, sau đó delay 1ms rồi hiển thị 8 hàng của cột 3, … tương tự như vậy đến khi hiển thị xong 8 hàng của cột 8 thì quay lại hiển thị cột 1
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình
Khi tăng hoặc giảm thời gian delay, hiển thị trên LED ma trận sẽ thay đổi như thế nào?
Trang 38MOVC A, @A + DPTR MOV DPTR, #0A000H MOVX @DPTR, A POP ACC
INC R1 LCALL DL1ms CJNE R1, #8, LOOP SJMP MAIN
DL1ms: MOV R6, #4 ; f = 11.0592 MHz
DJNZ R5, $ DJNZ R6, DL RET
CHAR_B: DB 0FFH, 0FFH, 0FFH, 93H, 6DH, 6DH, 6DH, 01H
END
2 Kết quả thí nghiệm
a Kết quả mô phỏng:
Trang 39b Trả lời câu hỏi
Khi tăng hoặc giảm thời gian delay, hiển thị trên LED ma trận sẽ thay đổi như thế nào?
Khi tăng hoặc giảm thời gian delay, hiển thị trên LED ma trận sẽ giảm hoặc tăng độ sáng tương ứng với thời gian delay nhỏ hơn 5ms
Trang 40 Nắm được cách điều khiển LCD
Nắm được cách giao tiếp với ADC
Nắm được cách phối hợp lấy dữ liệu từ ADC và hiển thị lên LCD
CHUẨN BỊ
Đọc chương 1, chương 5 và chương 9 của tài liệu hướng dẫn
Viết chương trình và mô phỏng các bài thí nghiệm trên Proteus dựa trên bài thí nghiệm 0