Báo cáo thí nghiệm Vi xử lý Đại học Bách Khoa Đại học Quốc Gia thành phố Hồ Chí Minh.Bài thí nghiệm 3: Thí nghiệm lập trình ngắt.Thí nghiệm 1: Mục tiêu: Nắm được cách sử dụng ngắt serial port.Yêu cầu: Viết chương trình làm song song 2 công việc sau:Nhận 1 byte từ máy tính và xuất ngược lại (echo) lên màn hình terminal.Bật LED gắn vào P1.1 khi SW 310 (gắn vào P1.0) được nhấn, và tắt LED khi phím được nhả.Hướng dẫn:Sử dụng ngắt serial port, nếu ngắt là ngắt thu (cờ RI bằng 1) thì xóa RI, đọc SBUF và ghi trở lạivào SBUF. Nếu TI bằng 1 thì xóa TI.Tác vụ đọc nút nhấn và hiển thị LED được viết trong chương trình chính.
BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT MỤC TIÊU Nắm cách lập trình ngắt cho 8051 CHUẨN BỊ Đọc chương chương tài liệu hướng dẫn Viết chương trình mơ thí nghiệm Proteus dựa thí nghiệm TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT THÍ NGHIỆM Mục tiêu: Nắm cách sử dụng ngắt serial port Yêu cầu: Viết chương trình làm song song công việc sau: Nhận byte từ máy tính xuất ngược lại (echo) lên hình terminal Bật LED gắn vào P1.1 SW 310 (gắn vào P1.0) nhấn, tắt LED phím nhả Hướng dẫn: Sử dụng ngắt serial port, ngắt ngắt thu (cờ RI 1) xóa RI, đọc SBUF ghi trở lại vào SBUF Nếu TI xóa TI Tác vụ đọc nút nhấn hiển thị LED viết chương trình Kiểm tra: Biên dịch kiểm tra hoạt động chương trình Tại phải xét xem cờ TI hay cờ RI nguồn gây ngắt? Nếu khơng sử dụng ngắt, viết chương trình thực thi đầy đủ hai nhiệm vụ khơng? BÁO CÁO Chương trình: ORG 0000H LJMP START ORG 0023H LJMP ISR_SerialPort ORG 0030H START: TN Vi xử lý MOV SCON, #50H BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT MOV PCON, #80H MOV TMOD, #21H MOV TH1, #-3 SETB EA ; Cho phép ngắn SETB ES ; Cho phép ngắt serial port SETB TR1 MAIN: MOV R2, #10 WAIT: ; Chống rung nút nhấn JB P1.0, MAIN DJNZ R2, WAIT CLR P1.1 ; Bật led P1.1 JNB P1.0, $ ; Chờ nút nhấn thả SETB P1.1 ; Tắt led P1.1 SJMP MAIN ISR_SerialPort: JNB RI, TRANSMIT RECEIVE: ; Kiểm tra ngắt thu hay ngắt phát ; Ngắt thu CLR RI ; Xóa cờ ngắt MOV A, SBUF ; Đọc byte từ máy tính MOV SBUF, A ; Gửi byte lên hình RETI TRANSMIT: ; Ngắt phát CLR TI ; Xóa cờ ngắt RETI DL10ms: TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT MOV TH0, #HIGH(-9216) MOV TL0, #LOW(-9216) SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 RET END Kết thí nghiệm a Kết mô phỏng: (Time/div = 0.5s, V/div = V cho Channel A & Channel B) Channel A: Chân P1.0 Channel B: Chân P1.1 TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT b Trả lời câu hỏi 1) Tại phải xét xem cờ TI hay cờ RI nguồn gây ngắt? Vì nguồn ngắt khác cho cơng việc khác Nếu nguồn ngắt cờ RI, tức nhận xong byte từ máy tính, ta tiến hành cho xuất ngược lại lên hình terminal qua lệnh MOV SBUF, A Nếu nguồn ngắt TI, tức xuất byte lên hình terminal xong, ta xóa cờ TI để chờ lần xuất 2) Nếu khơng sử dụng ngắt, viết chương trình thực thi đầy đủ hai nhiệm vụ không? Nếu không sử dụng ngắt, viết chương trình thực thi đầy đủ hai nhiệm vụ Vì ln phiên kiểm tra trạng thái bit P1.0 (nút nhấn), TI (cờ phát), RI (cờ thu) thực tác vụ nút nhấn nhấn mà có máy xuất xuất byte vào MCU MCU khơng thể nhận sử dụng ngắt chương trình rẽ nhánh để thực công việc nhận phát ký tự lên hình terminal TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT THÍ NGHIỆM Mục tiêu: Nắm cách sử dụng ngắt timer Yêu cầu: Viết chương trình hiển thị lên LED đoạn số có chữ số, ký số chứa nhớ 20H, 21H, 22H 23H Ơ nhớ 20H chứa số hàng nghìn Hướng dẫn: Ở LAB2 ta viết chương trình DisplayLED hiển thị giá trị chứa R0, với số thứ tự LED chứa R1 Đồng thời, ta nắm cách quét LED cách cho LED sáng sau khoảng thời gian trễ Ở thí nghiệm này, LED đoạn quét sử dụng ngắt timer Để đạt tần số quét 25 Hz, LED sáng thời gian 10 ms Các bước tiến hành: Cấu hình timer chế độ 1, thời gian tràn 10 ms Cho phép ngắt timer 0, cho timer chạy Sử dụng ghi R1 để xác định LED cần bật Ban đầu R1 0, R1 tăng lên sau lần bật LED để chuyển sang LED Khi R1 3, R3 quay lại Chương trình DisplayLED chứa giá trị hiển thị R0 Giá trị byte ô nhớ 20H, 21H, 22H 23H, tương ứng giá trị R1 (0-3) Đoạn chương trình sau cho phép lấy giá trị này: MOV A, R0 ADD A, R1 MOV R0, A MOV A, @R0 MOV R0, A TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT START Dừng timer, xóa cờ ngắt, đặt lại giá trị timer, cho phép timer chạy Dừng timer, xóa cờ ngắt, đặt lại giá trị timer, cho phép timer chạy Lấy giá trị hiển thị LED vào R0 Hiển thị LED tương ứng Cập nhật giá trị R1 END Khi timer tràn, chương trình phục vụ ngắt ta cấu hình lại timer, hiển thị giá trị led đoạn tương ứng, cập nhật giá trị R1 để đến LED Kiểm tra: Biên dịch kiểm tra hoạt động chương trình Cờ ngắt timer xóa phần mềm hay phần cứng? Trong thí nghiệm 2, chương trình làm nhiệm vụ gì? BÁO CÁO Chương trình: ORG 0000H LJMP MAIN ORG 000BH LJMP ISR_TIMER0 TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT ORG 0030H MAIN: MOV TMOD, #01H MOV 20H, #2 MOV 21H, #0 MOV 22H, #2 MOV 23H, #1 SETB EA ; Cho phép ngắt SETB TF0 ; Ép ngắt timer SETB ET0 ; Cho phép ngắt timer SJMP $ ISR_TIMER0: CLR TR0 MOV TH0, #HIGH(-9216) MOV TL0, #LOW(-9216) SETB TR0 ACALL GET_R1 ; Lấy giá trị nạp vào R1 ACALL GET_R0 ; Lấy giá trị nạp vào R0 LCALL DisplayLED ; Hiển thị LED RETI DisplayLED: MOV DPTR, #LED MOV A, R1 MOVC A, @A + DPTR ORL A, R0 MOV DPTR, #0 TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT MOVX @DPTR, A RET GET_R1: INC R1 SKIP: CJNE R1, #4, SKIP ; Nếu R1 = MOV R1, #0 ; Reset R1 RET GET_R0: MOV A, #20H ADD A, R1 ; Lấy vị trí nhớ MOV R0, A MOV A, @R0 MOV R0, A RET LED: DB 70H, 0B0H, 0D0H, 0E0H END Kết thí nghiệm a Kết mô phỏng: TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT b Trả lời câu hỏi 1) Cờ ngắt timer xóa phần mềm hay phần cứng? Cờ ngắt timer xóa phần cứng 2) Trong thí nghiệm 2, chương trình làm nhiệm vụ gì? Trong thí nghiệm 2, chương trình làm nhiệm vụ thiết lập cấu hình ban đầu cho chương trình ngắt timer TN Vi xử lý BM Điện tử Page | 10 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT THÍ NGHIỆM Mục tiêu: Nắm cách sử dụng ngắt timer phối hợp với chương trình khác Yêu cầu: Viết chương trình đếm số lần nhấn phím SW317, hiển thị lên LED đoạn Hướng dẫn: Đếm số lần nhấn phím làm LAB4 Việc đếm số lần nhấn phím thực chương trình Giá trị cập nhật vào nhớ 20H, 21H, 22H 23H Ơ nhớ 20H chứa số hàng nghìn LED đoạn quét thí nghiệm dùng ngắt timer Kiểm tra: Biên dịch kiểm tra hoạt động chương trình Trong thí nghiệm 3, chương trình làm nhiệm vụ gì? Delay tạo cho trình chống rung nút (nếu có) nên tạo cách nào? BÁO CÁO Chương trình: ORG 0000H LJMP BEGIN ORG 000BH LJMP ISR_TIMER0 ORG 0030H BEGIN: MOV TMOD, #01H SETB EA TN Vi xử lý ; Cho phép ngắt BM Điện tử Page | 11 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT SETB TF0 ; Ép ngắt timer SETB ET0 ; Cho phép ngắt timer MOV R2, #10 ; Debounce MAIN: WAIT: JB P1.7, MAIN ACALL DL10us DJNZ R2, WAIT INC 23H ACALL UPDATE JNB P1.7, $ SJMP MAIN UPDATE: ; Hàm điều chỉnh giá trị ghi MOV A, 23H ; Kiểm tra hàng đơn vị CJNE A, #10, SKIP MOV 23H, #0 INC 22H MOV A, 22H ; Kiểm tra hàng chục CJNE A, #10, SKIP MOV 22H, #0 INC 21H MOV A, 21H ; Kiểm tra hàng trăm CJNE A, #10, SKIP MOV 21H, #0 INC 20H TN Vi xử lý BM Điện tử Page | 12 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT MOV A, 20H ; Kiểm tra hàng nghìn CJNE A, #10, SKIP MOV 20H, #0 RET ISR_TIMER0: CLR TR0 MOV TH0, #HIGH(-9216) MOV TL0, #LOW(-9216) SETB TR0 ACALL GET_R1 ; Lấy giá trị nạp vào R1 ACALL GET_R0 ; Lấy giá trị nạp vào R0 LCALL DisplayLED ; Hiển thị LED RETI DisplayLED: MOV DPTR, #LED MOV A, R1 MOVC A, @A + DPTR ORL A, R0 MOV DPTR, #0 MOVX @DPTR, A RET GET_R1: INC R1 TN Vi xử lý CJNE R1, #4, SKIP ; Nếu R1 = MOV R1, #0 ; Reset R1 BM Điện tử Page | 13 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT SKIP: RET GET_R0: MOV A, #20H ADD A, R1 ; Lấy vị trí ô nhớ MOV R0, A MOV A, @R0 MOV R0, A RET DL10us: MOV R5, #4 DJNZ R5, $ RET LED: DB 70H, 0B0H, 0D0H, 0E0H END Kết thí nghiệm a Kết mơ phỏng: b Trả lời câu hỏi 1) Trong thí nghiệm 3, chương trình làm nhiệm vụ gì? Trong thí nghiệm 3, chương trình làm nhiệm vụ đếm số lần nhấn nút điều chỉnh giá trị ghi chứa số lần đếm 2) Delay tạo cho trình chống rung nút (nếu có) nên tạo cách nào? Delay cho trình chống rung nút nhấn nên tạo phần mềm cách đọc nhiều lần giá trị nút nhấn sau khoảng thời gian chờ, kết giống xác nhận nút nhấn, ngược lại TN Vi xử lý BM Điện tử Page | 14 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT THÍ NGHIỆM Mục tiêu: Nắm cách sử dụng ngắt timer phối hợp với chương trình khác Yêu cầu: Viết chương trình thực đồng hồ bấm giây, hiển thị lên LED đoạn Hai LED thể số giây, LED thể phần trăm giây Khi SW310 nhấn, đồng hồ reset SW 311 nhấn, đồng hồ bắt đầu chạy SW 312 nhấn, đồng hồ dừng lại Hướng dẫn LED đoạn quét thí nghiệm dùng ngắt timer Khi đồng hồ chạy, giá trị thời gian cập nhật dùng ngắt timer Giá trị cập nhật vào ô nhớ 20H, 21H, 22H 23H Các SW310, SW311, SW312 xử lý chương trình Kiểm tra: Biên dịch kiểm tra hoạt động chương trình Các nút nhấn SW310, SW311, SW312 xử lý nào? Trình bày cụ thể? BÁO CÁO Chương trình: ORG 0000H LJMP BEGIN ORG 000BH LJMP ISR_TIMER0 ; Hiển thị LED ORG 001BH TN Vi xử lý BM Điện tử Page | 15 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT LJMP ISR_TIMER1 ; Đếm ORG 0030H BEGIN: MOV TMOD, #11H SETB EA ; Cho phép ngắt SETB TF0 ; Ép ngắt Timer SETB TF1 ; Ép ngắt Timer SETB ET0 ; Cho phép ngắt Timer SW311: ; Play MOV R2, #10 WAIT311: JB P1.1, SW310 ; Nếu không nhấn, kiểm tra SW310 ACALL DL10us DJNZ R2, WAIT311 SETB ET1 ; Được nhấn, khởi động đếm JNB P1.1, $ ; Chờ thả nút SW310: ; Reset MOV R2, #10 WAIT310: JB P1.0, SW312 ; Nếu không nhấn, kiểm tra SW312 ACALL DL10us DJNZ R2, WAIT310 MOV 20H, #0 ; Được nhấn, reset ghi MOV 21H, #0 ; chứa nội dung đếm MOV 22H, #0 TN Vi xử lý BM Điện tử Page | 16 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT MOV 23H, #0 JNB P1.0, $ ; Chờ thả nút SW312: ; Pause MOV R2, #10 WAIT312: JB P1.2, SW311 ; Nếu không nhấn, kiểm tra SW311 ACALL DL10us DJNZ R2, WAIT312 CLR ET1 ; Được nhấn, dừng đếm JNB P1.2, $ ; Chờ thả nút SJMP SW310 ISR_TIMER1: ; Bộ đếm CLR TR1 MOV TH1, #HIGH(-9216) ; 10ms MOV TL1, #LOW(-9216) SETB TR1 INC 23H ACALL UPDATE ; Điều chỉnh giá trị ghi RETI UPDATE: ; Hàm điều chỉnh giá trị ghi MOV A, 23H CJNE A, #10, SKIP ; SKIP GET_R1 MOV 23H, #0 INC 22H MOV A, 22H TN Vi xử lý BM Điện tử Page | 17 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT CJNE A, #10, SKIP MOV 22H, #0 INC 21H MOV A, 21H CJNE A, #10, SKIP MOV 21H, #0 INC 20H MOV A, 20H CJNE A, #10, SKIP ; Nếu giới hạn phút MOV 20H, #0 ; so sánh với RET ISR_TIMER0: CLR TR0 MOV TH0, #HIGH(-9216) MOV TL0, #LOW(-9216) SETB TR0 ACALL GET_R1 ; Lấy giá trị nạp vào R1 ACALL GET_R0 ; Lấy giá trị nạp vào R0 LCALL DisplayLED ; Hiển thị lên LED RETI DisplayLED: MOV DPTR, #LED MOV A, R1 MOVC A, @A + DPTR ORL A, R0 TN Vi xử lý BM Điện tử Page | 18 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT MOV DPTR, #0 MOVX @DPTR, A RET GET_R1: INC R1 SKIP: CJNE R1, #4, SKIP ; Nếu R1 = MOV R1, #0 ; Reset R1 RET GET_R0: MOV A, #20H ADD A, R1 ; Lấy vị trí nhớ MOV R0, A MOV A, @R0 MOV R0, A RET DL10us: ; Hàm delay 10 s MOV R5, #4 DJNZ R5, $ RET LED: DB 70H, 0B0H, 0D0H, 0E0H END Kết thí nghiệm a Kết mô phỏng: b Trả lời câu hỏi TN Vi xử lý BM Điện tử Page | 19 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT Các nút nhấn SW310, SW311, SW312 xử lý nào? Trình bày cụ thể? Các nút nhấn SW310, SW311, SW312 quét liên tục theo trình tự: Kiểm tra trạng thái nút nhấn SW311: Nếu nhấn tiến hành thời gian tràn 10ms cho timer set bit ET0 phép ngắt timer0 hoạt động Sau chuyển sang kiểm tra trạng thái nút nhấn SW310 Nếu chưa nhấn chuyển sang kiểm tra trạng thái nút nhấn SW310 Kiểm tra trạng thái nút nhấn SW310: Nếu nhấn tiến hành xóa ghi có địa 20H, 21H, 22H 23H, sau khởi động lại ngắt timer0 chuyển sang kiểm tra trạng thái nút nhấn SW312 Nếu chưa nhấn chuyển sang kiểm tra trạng thái nút nhấn SW312 Kiểm tra trạng thái nút nhấn SW312: Nếu nhấn reset bit ET0 để dừng ngắt timer0 (đồng hồ ngừng đếm) Sau chuyển sang kiểm tra trạng thái nút nhấn SW311 Nếu chưa nhấn chuyển sang kiểm tra trạng thái nút nhấn SW311 TN Vi xử lý BM Điện tử Page | 20 ... dụng ngắt chương trình rẽ nhánh để thực công vi? ??c nhận phát ký tự lên hình terminal TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT THÍ NGHIỆM Mục tiêu: Nắm cách sử dụng ngắt. .. ngược lại TN Vi xử lý BM Điện tử Page | 14 BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT THÍ NGHIỆM Mục tiêu: Nắm cách sử dụng ngắt timer phối hợp với chương trình khác Yêu cầu: Vi? ??t chương trình thực...BÀI THÍ NGHIỆM THÍ NGHIỆM LẬP TRÌNH NGẮT THÍ NGHIỆM Mục tiêu: Nắm cách sử dụng ngắt serial port Yêu cầu: Vi? ??t chương trình làm song song cơng vi? ??c sau: Nhận byte từ máy