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 giao tiếp Timer và Serial Port.Thí nghiệm 1: Mục tiêu: Nắm được cách thức tạo trễ sử dụng Timer chế độ 1.Yêu cầu: Viết chương trình tạo sóng vuông 1 Hz trên chân P1.0 sử dụng timer 0 ở chế độ 1.
BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT MỤC TIÊU Nắm cách lập trình điều khiển timer Nắm cách lập trình điều khiển serial port CHUẨN BỊ Đọc chương 1, chương 3, 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 GIAO TIẾP TIMER VÀ SERIAL PORT THÍ NGHIỆM Mục tiêu: Nắm cách thức tạo trễ sử dụng Timer chế độ Yêu cầu: Viết chương trình tạo sóng vng Hz chân P1.0 sử dụng timer chế độ Kiểm tra: Biên dịch, thực thi kiểm tra chương trình Để tạo sóng Hz, ta sử dụng timer chế độ không? Dạng sóng có bị sai số khơng? Để hạn chế sai số ta phải nạp giá trị vào timer nào? BÁO CÁO: Chương trình: ORG 2000H MOV TMOD, #01H MAIN: CPL P1.0 ACALL DL500ms SJMP MAIN DL500ms: MOV R0, #10 LOOP: MOV TH0, #HIGH(-46080) ; f = 11.0592MHz MOV TL0, #LOW(-46080) SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT DJNZ R0, LOOP RET END Kết nghiệm a Kết 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 sóng Hz, ta sử dụng timer chế độ không? Để tạo sóng 1Hz, sử dụng timer chế độ (với số vòng lặp lớn nhiều so với 10) 2) Dạng sóng có bị sai số khơng? Để hạn chế sai số ta phải nạp giá trị vào timer nào? Dạng sóng có bị sai số Để hạn chế sai số, ta phải nạp giá trị vào timer ước lớn mà timer có giá trị thời gian cần tạo trễ để hạn chế sai số vòng lặp TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT THÍ NGHIỆM Mục tiêu: Nắm cách thức tạo trễ sử dụng Timer chế độ u cầu: Viết chương trình tạo sóng vng Hz chân P1.0 sử dụng timer chế độ Hướng dẫn: Dùng biến đếm 16 bit để đếm lần timer tràn Khi đếm đủ số lần timer tràn đảo chân port Kiểm tra: Biên dịch, thực thi kiểm tra chương trình Ở chế độ 2, độ trễ gây câu lệnh đảo giá trị bit có gây sai số cho dạng sóng ngõ khơng? Vì sao? Nên sử dụng chế độ hay chế độ tạo trễ? Tại sao? BÁO CÁO: Chương trình: ORG 2000H MOV TMOD, #02H MOV TH0, #(-240) ; f = 11.0592 MHz MOV TL0, TH0 SETB TR0 MAIN: CPL P1.0 ACALL DL500ms SJMP MAIN DL500ms: MOV R1, #8 LOOP: TN Vi xử lý MOV R0, #240 BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT WAIT: JNB TF0, $ CLR TF0 DJNZ R0, WAIT DJNZ R1, LOOP RET END Kết nghiệm a Kết 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) Ở chế độ 2, độ trễ gây câu lệnh đảo giá trị bit có gây sai số cho dạng sóng ngõ khơng? Vì sao? TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT Ở chế độ 2, độ trễ gây câu lệnh đảo giá trị bit không gây sai số cho dạng sóng ngõ ra, thực câu lênh đảo bit Timer tiếp tục chạy, khơng phải dừng lại để thực thi câu lệnh đảo bit Timer chế độ 2) Nên sử dụng chế độ hay chế độ tạo trễ? Tại sao? Nên sử dụng chế độ để tạo trễ chế độ 2, timer chạy liên tục mà không bị ngắt cờ báo tràn bật để thực hiên câu lệnh khác, giảm thiểu sai số gây TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT THÍ NGHIỆM Mục tiêu: Hiểu cách chống rung (debounce) nút nhấn cách dùng phần mềm Yêu cầu: Viết chương trình làm nhiệm vụ, nhấn SW lần thứ led chân P1.1 sáng Tiếp đó, SW nhấn lần led chân P1.1 tắt Cứ tiếp tục vậy, … Kiểm tra: Biên dịch, thực thi kiểm tra chương trình Thời gian chọn để chống rung nút nhấn bao nhiêu? Số lần đọc bao nhiêu? Thử viết chương trình giảm thời gian chống rung tăng số lần đọc? BÁO CÁO: Chương trình: ORG 2000H MOV TMOD, #01H SETB P1.1 ; Tắt LED chân P1.1 MOV R2, #2 ; Đọc lần JB P1.0, MAIN ; Chờ SW310 (chân P1.0) nhấn ACALL DL50ms ; Thời gian tạo trễ 50ms DJNZ R2, WAIT ; Xác nhận SW310 nhấn MAIN: WAIT: CPL P1.1 JNB P1.0, $ ; Chờ SW310 thả SJMP MAIN DL50ms: MOV TH0, #HIGH(-46080) ; f = 11.0592 MHz TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT MOV TL0, #LOW(-46080) SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 RET END Kết nghiệm a Kết mơ phỏng: (Time/div = 0.25s, V/div = 1V cho Channel A & Channel B) Channel A: chân P1.0 Channel B: chân P1.1 Nhận thấy, sau SW310 nhấn sau khoảng thời gian ngắn (thời gian chống TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT rung nút nhấn) led nối với chân P1.1 bật/tắt b Trả lời câu hỏi 1) Thời gian chọn để chống rung nút nhấn bao nhiêu? Số lần đọc bao nhiêu? Thời gian chọn để chống rung 50ms, số lần đọc 2) Thử viết chương trình giảm thời gian chống rung tăng số lần đọc? ORG 2000H MOV TMOD, #01H SETB P1.1 MAIN: MOV R2, #10 WAIT: ; Số lần đọc tăng lên 10 JB P1.0, MAIN ACALL DL10ms ; Thời gian tạo trễ giảm xuống 10ms DJNZ R2, WAIT JNB P1.0, $ CPL P1.1 SJMP MAIN DL10ms: MOV TH0, #HIGH(-9216) ; f = 11.0592 MHz MOV TL0, #LOW(-9216) SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 RET END TN Vi xử lý BM Điện tử Page | BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT THÍ NGHIỆM Mục tiêu: Nắm cách thức điều khiển cổng nối tiếp để phát thông tin Yêu cầu: Viết chương trình phát chuỗi ký tự “Hello world!” lên máy tính thơng qua chương trình Hercules với tốc độ baud 19200 bps SW 310 (gắn vào P1.0) nhấn Kiểm tra: Biên dịch kiểm tra hoạt động chương trình Khi sử dụng serial port, timer dùng để chỉnh tốc độ baud? Để đạt tốc độ baud 19200bps, bit SMOD giá trị nạp cho timer timer mode làm việc nào? Cờ báo phát phát xong tên gì? Ở địa bao nhiêu? BÁO CÁO: Chương trình: ORG 2000H MOV SCON, #52H MOV PCON, #80H MOV TMOD, #21H MOV TH1, #-3 SETB TR1 MAIN: MOV R2, #10 WAIT: JB P1.0, MAIN ; Chống rung nút nhấn ACALL DL10ms DJNZ R2, WAIT MOV DPTR, #MESS TN Vi xử lý BM Điện tử Page | 10 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT ACALL STRING ; Thực hiển phát chuỗi ký tự JNB P1.0, $ ; Chờ nút nhấn thả SJMP MAIN TRANSMIT: ; Chương trình phát ký tự JNB TI, $ CLR TI MOV SBUF, A RET STRING: ; Chương trình phát chuỗi ký tự MOV R0, #0 LOOP: MOV A, R0 MOVC A, @A+DPTR JZ KT ACALL TRANSMIT INC R0 SJMP LOOP KT: RET DL10ms: ; Thời gian tạo trễ để chống rung MOV TH0, #HIGH(-9216) ; f = 11.0592 MHz MOV TL0, #LOW(-9216) SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 RET TN Vi xử lý BM Điện tử Page | 11 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT MESS: DB "Hello World!", END Kết nghiệm a Kết 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) Khi sử dụng serial port, timer dùng để chỉnh tốc độ baud? Để đạt tốc độ baud 19200bps, bit SMOD giá trị nạp cho timer timer mode làm việc nào? Khi sử dụng serial port, timer sử dụng để chỉnh tốc độ baud Để đạt tốc độ baud 19200bps, bit SMOD giá trị nạp cho timer –3 timer mode 2) Cờ báo phát phát xong tên gì? Ở địa bao nhiêu? Cờ báo phát xong tên TI, địa 9AH TN Vi xử lý BM Điện tử Page | 12 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT THÍ NGHIỆM Mục tiêu: Nắm cách thức điều khiển cổng nối tiếp để thu phát thông tin Yêu cầu: Viết chương trình nhận ký tự từ máy tính gửi đến EME-MC8 thơng qua Hercules (bằng cách gõ ký tự bàn phím chương trình Hercules) hiển thị lên LCD vị trí cột hàng 0, đồng thời phát trở lại lên serial port Kiểm tra: Biên dịch kiểm tra hoạt động chương trình Tại sau nhận xong byte liệu, ta phải xóa cờ RI? BÁO CÁO: Chương trình: EN EQU P3.3 RS EQU P3.5 ORG 2000H MOV SCON, #53H MOV PCON, #80H MOV TMOD, #20H MOV TH1, #-3 SETB TR1 ACALL INIT_LCD ; Khởi động LCD ACALL RECEIVE ; Nhận ký tự ACALL CLR_LCD ; Xóa LCD, đặt lại vị trí trỏ MAIN: MOV A, R5 TN Vi xử lý BM Điện tử Page | 13 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT ACALL DISP ; Xuất ký tự lên hình ACALL TRANSMIT ; Gửi ký tự lên serial port SJMP MAIN ; Bắt đầu lại chương trình TRANSMIT: ; Chương trình gửi ký tự JNB TI, $ CLR TI MOV SBUF, A RET RECEIVE: ; Chương trình nhận ký tự JNB RI, $ CLR RI MOV R5, SBUF RET INIT_LCD: MOV A, #38H ; Chương trình khởi động LCD ; bit interface + chế độ hàng ACALL COMD MOV A, #0EH ; Bật LCD ON + bật underline cursor ACALL COMD MOV A, #06H ; chế độ dịch phải cursor ACALL COMD RET CLR_LCD: MOV A, #01H ; Clear display ACALL COMD RET COMD: TN Vi xử lý ; Chương trình gửi lệnh đến LCD BM Điện tử Page | 14 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT MOV DPTR, #6000H SETB EN CLR RS MOVX @DPTR, A CLR EN ACALL WAIT_LCD RET DISP: ; Chương trình hiển thị ký tự lên LCD MOV DPTR, #6000H SETB EN SETB RS MOVX @DPTR, A CLR EN ACALL WAIT_LCD RET WAIT_LCD: MOV R7, #16 DL: ; Thời gian chờ LCD thực thi ; delay 5ms MOV R6, #144 DJNZ R6, $ DJNZ R7, DL RET END Kết 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 | 15 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT Tại sau nhận xong byte liệu, ta phải xóa cờ RI? Khi nhận xong byte, ta phải xóa cờ RI cờ RI trạng thái nhận xong liệu ngừng nhận liệu mới, nên ta phải xóa cờ RI để MCU tiếp tục nhận liệu TN Vi xử lý BM Điện tử Page | 16 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT THÍ NGHIỆM Mục tiêu: Nắm cách thức điều khiển cổng nối tiếp để thu phát thông tin u cầu: Cải thiện chương trình viết thí nghiệm thêm tính sau: Nếu ký tự nhận chữ hiển thị lên LCD; ký tự nhận Enter xuống hàng; ký tự nhận ESC xóa hình LCD; ký tự nhận Backspace xóa ký tự bên trái dấu nháy Kiểm tra: Biên dịch kiểm tra hoạt động chương trình Mã ASCII phím Enter, ESC Backspace gì? Để xóa ký tự bên trái dấu nháy, ta phải thực dịch trỏ sang trái, sau chèn khoảng trắng dịch trỏ sang trái lần nữa? Mã lệnh cần nạp cho LCD để điều khiển trỏ gì? BÁO CÁO: Chương trình: Note: Mã ASCII “ESC” (1BH) thay “!” (21H) ESC làm dừng mô EN EQU P3.3 RS EQU P3.5 ROW EQU 20H.0 ; Biến xác định hàng, 0/1: Hàng 1/ hàng ORG 2000H MOV SCON, #53H MOV PCON, #80H MOV TMOD, #20H MOV TH1, #-3 TN Vi xử lý BM Điện tử Page | 17 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT SETB TR1 MOV R1, #00H ; Biến xác định vị trí cursor hàng MOV R2, #40H ; Biến xác định vị trí cursor hàng CLR ROW ; Thiết lập ban đầu: hàng ACALL INIT_LCD ; Khởi động LCD ACALL RECEIVE ; Nhận ký tự MAIN: CHECK_ENTER: ; Kiểm tra ký tự: ENTER? CJNE R5, #0DH, CHECK_ESC ACALL ENTER ; Gọi chương trình Enter SJMP MAIN CHECK_ESC: ; Kiểm tra ký tự: ESC? CJNE R5, #21H, CHECK_BACKSPACE ACALL CLR_LCD ; Xóa LCD MOV R1, #00H ; Đặt lại vị trí hàng cột MOV R2, #40H ; Đặt lại vị trí hàng cột SJMP MAIN CHECK_BACKSPACE: ; Kiểm tra ký tự: BACKSPACE? CJNE R5, #08H, CHECK_LETTER ACALL BACKSPACE ; Gọi chương trình BACKSPACE SJMP MAIN CHECK_LETTER: ; Kiểm tra ký tự: Letter? ACALL LETTER ; Gọi chương trình kiểm tra ký tự JNB F0, MAIN ; Nếu F0 = 0, ký tự MOV A, R5 ACALL DISP TN Vi xử lý ; Hiển thị letter lên LCD BM Điện tử Page | 18 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT ACALL CURSOR ; Thực tăng vị trí cursor ACALL TRANSMIT ; Gửi letter lên serial port SJMP MAIN ; Quay lại chờ nhận ký tự ENTER: E_R1: ; Chương trình thực thi ENTER CPL ROW ; Đổi hàng ghi ký tự JB ROW, E_R2 ; Kiểm tra hàng MOV A, R1 SJMP E_S ; Enter_Skip E_R2: MOV A, R2 E_S: ADD A, #80H ; Lấy mã lệnh đặt vị trí cursor hàng ACALL COMD ; Thực đặt cursor vị trí RET BACKSPACE: B_R1: ; Chương trình thực thi BACKSPACE JB ROW, B_R2 ; Kiểm tra hàng DEC R1 ; Lùi vị trí cursor hàng MOV A, R1 B_R2: SJMP B_S ; Backspace_Skip DEC R2 ; Lùi vị trí cursor hàng MOV A, R2 B_S: ADD A, #80H ; Lấy mã lệnh đặt vị trí cursor vị trí xóa PUSH ACC ; Cất mã lệnh vào stack ACALL COMD ; Thực đặt vị trí cursor vị trí xóa MOV A, #' ' TN Vi xử lý ACALL DISP ; Chèn kí tự space vào, cursor dịch phải POP ACC ; Lấy mã lệnh từ stack ACALL COMD ; Đặt cursor lại vị trí vị trí xóa BM Điện tử Page | 19 BÀI THÍ NGHIỆM THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT RET LETTER: ; Chương trình kiểm tra Letter CJNE R5, #41H, $+3 JC NO ; (R5) < 41H CJNE R5, #5BH, $+3 ; 41H