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.
Trang 1BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT
MỤC TIÊU
Nắm được cách lập trình điều khiển timer
Nắm được cách lập trình điều khiển serial port
CHUẨN BỊ
Đọc chương 1, chương 3, chương 6 và chương 8 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 2 Biên dịch, thực thi và kiểm tra chương trình
Để tạo sóng 1 Hz, ta có thể sử dụng timer ở chế độ 2 được không?
Dạng sóng có bị sai số không? Để hạn chế sai số ta phải nạp các giá trị vào timer như thế nào?
Trang 3b Trả lời câu hỏi
1) Để tạo sóng 1 Hz, ta có thể sử dụng timer ở chế độ 2 được không?
Để tạo sóng 1Hz, có thể sử dụng timer ở chế độ 2 (với số vòng lặp lớn hơ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 các giá trị vào timer như thế nào?
Dạng sóng có bị sai số
Để hạn chế sai số, ta phải nạp các giá trị vào timer là ước lớn nhất mà timer có thể có của giá trị thời gian cần tạo trễ để hạn chế sai số trong mỗi vòng lặp.
Trang 4BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT
THÍ NGHIỆM 2
Mục tiêu: Nắm được cách thức tạo trễ sử dụng Timer chế độ 2
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ế độ 2
Hướng dẫn: Dùng một biến đếm 16 bit để đếm mỗi lần timer tràn Khi đếm đủ số lần timer tràn thì
đảo chân port
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình
Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit có gây sai số cho dạng sóng ngõ ra không? Vì sao?
Nên sử dụng chế độ 1 hay chế độ 2 khi tạo trễ? Tại sao?
Trang 5b Trả lời câu hỏi
1) Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit có gây sai số cho dạng sóng ngõ
ra không? Vì sao?
Trang 6BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT
Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit không gây ra sai số cho dạng sóng ngõ ra, vì trong khi thực hiện các câu lênh đảo bit thì Timer vẫn tiếp tục chạy, không phải dừng lại để thực thi câu lệnh đảo bit như Timer ở chế độ 1
2) Nên sử dụng chế độ 1 hay chế độ 2 khi tạo trễ? Tại sao?
Nên sử dụng chế độ 2 để tạo trễ vì ở chế độ 2, timer chạy liên tục mà không bị ngắt khi
cờ báo tràn bật để thực hiên các câu lệnh khác, do đó nó giảm thiểu được sai số gây ra
Trang 7BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT
THÍ NGHIỆM 3
Mục tiêu: Hiểu được cách chống rung (debounce) nút nhấn bằng cách dùng phần mềm
Yêu cầu: Viết chương trình làm nhiệm vụ, khi nhấn SW lần thứ nhất led ở chân P1.1 sáng Tiếp đó,
SW nhấn lần 2 thì led ở chân P1.1 tắt Cứ tiếp tục như vậy, …
Kiểm tra:
Biên dịch, thực thi và kiểm tra chương trình
Thời gian được chọn để chống rung nút nhấn là bao nhiêu? Số lần đọc là bao nhiêu?
Thử viết chương trình giảm thời gian chống rung và tăng số lần đọc?
WAIT: JB P1.0, MAIN ; Chờ SW310 (chân P1.0) được nhấn
ACALL DL50ms ; Thời gian tạo trễ 50ms
Trang 9BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT rung nút nhấn) thì led nối với chân P1.1 mới bật/tắt
b Trả lời câu hỏi
1) Thời gian được chọn để chống rung nút nhấn là bao nhiêu? Số lần đọc là bao nhiêu?
Thời gian được chọn để chống rung là 50ms, số lần đọc là 2.
2) Thử viết chương trình giảm thời gian chống rung và tăng số lần đọc?
Trang 10 Biên dịch và kiểm tra hoạt động của chương trình
Khi sử dụng serial port, timer nào có thể được dùng để chỉnh tốc độ baud? Để đạt được tốc độ baud là 19200bps, bit SMOD bằng mấy và giá trị nạp cho timer là bao nhiêu và timer ở mode làm việc nào?
Cờ báo bộ phát đã phát xong tên là gì? Ở địa chỉ bao nhiêu?
Trang 12BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT
MESS: DB "Hello World!", 0
2 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) Khi sử dụng serial port, timer nào có thể được dùng để chỉnh tốc độ baud? Để đạt được
tốc độ baud là 19200bps, bit SMOD bằng mấy và giá trị nạp cho timer là bao nhiêu và timer ở mode làm việc nào?
Khi sử dụng serial port, timer 1 được sử dụng để chỉnh tốc độ baud Để đạt được tốc độ baud là 19200bps, bit SMOD bằng 1 và giá trị nạp cho timer 1 là –3 và timer ở mode 2
2) Cờ báo bộ phát đã phát xong tên là gì? Ở địa chỉ bao nhiêu?
Cờ báo đã phát xong tên là TI, ở địa chỉ 9AH
Trang 13Viết chương trình nhận các ký tự từ máy tính gửi đến EME-MC8 thông qua Hercules (bằng cách
gõ các ký tự trên bàn phím khi đang ở trong chương trình Hercules) và hiển thị lên LCD tại vị trí cột 0 hàng 0, đồng thời phát trở lại lên serial port
Kiểm tra:
Biên dịch và kiểm tra hoạt động của chương trình
Tại sao sau khi nhận xong 1 byte dữ liệu, ta phải xóa cờ RI?
Trang 14BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT ACALL DISP ; Xuất ký tự lên mà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ự
INIT_LCD: ; Chương trình khởi động LCD
MOV A, #38H ; 8 bit interface + chế độ 2 hàng
Trang 16BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT
Tại sao sau khi nhận xong 1 byte dữ liệu, ta phải xóa cờ RI?
Khi nhận xong 1 byte, ta phải xóa cờ RI vì khi cờ RI bằng 1 là trạng thái đã nhận xong
dữ liệu và ngừng nhận dữ liệu mới, nên ta phải xóa cờ RI để MCU có thể tiếp tục nhận dữ liệu mới
Trang 17Cải thiện chương trình viết trong thí nghiệm 5 thêm các tính năng sau:
Nếu ký tự nhận được là chữ thì hiển thị lên LCD; nếu ký tự nhận được là Enter thì xuống hàng; nếu ký tự nhận được là ESC thì xóa màn hình LCD; nếu ký tự nhận được là Backspace thì xóa ký
tự bên trái dấu nháy
Kiểm tra:
Biên dịch và kiểm tra hoạt động của chương trình
Mã ASCII của phím Enter, ESC và Backspace là gì?
Để xóa ký tự bên trái dấu nháy, ta phải thực hiện dịch con trỏ sang trái, sau đó chèn khoảng trắng và dịch con trỏ sang trái một lần nữa? Mã lệnh cần nạp cho LCD để điều khiển con trỏ là gì?
Trang 18ACALL INIT_LCD ; Khởi động LCD
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, không phải ký tự
ACALL DISP ; Hiển thị letter lên LCD
Trang 19BÀI THÍ NGHIỆM 4
THÍ NGHIỆM GIAO TIẾP TIMER VÀ SERIAL PORT
ACALL CURSOR ; Thực hiện tăng vị trí cursor
ACALL TRANSMIT ; Gửi letter lên serial port SJMP MAIN ; Quay lại chờ nhận ký tự tiếp theo
JB ROW, E_R2 ; Kiểm tra đang ở hàng nào
BACKSPACE: ; Chương trình thực thi BACKSPACE
JB ROW, B_R2 ; Kiểm tra đang ở hàng nào B_R1: DEC R1 ; Lùi vị trí cursor hàng 1 đi 1
MOV A, R1
B_R2: DEC R2 ; Lùi vị trí cursor hàng 2 đi 1
MOV A, R2 B_S: ADD A, #80H ; Lấy mã lệnh đặt vị trí cursor tại vị trí xóa
PUSH ACC ; Cất mã lệnh vào stack ACALL COMD ; Thực hiện đặt vị trí cursor ở vị trí xóa MOV A, #' '
ACALL DISP ; Chèn kí tự space vào, cursor dịch phải 1 POP ACC ; Lấy mã lệnh từ stack
ACALL COMD ; Đặt cursor lại vị trí tại vị trí xóa
Trang 20CURSOR: ; Tăng vị trí cursor sau mỗi lần nhập ký tự
JB ROW, C_R2 ; Kiểm tra đang ở hàng nào
C_R1: INC R1
RET C_R2: INC R2
RET TRANSMIT:
Trang 22b Trả lời câu hỏi
1) Mã ASCII của phím Enter, ESC và Backspace là gì?
Mã ASCII của Enter, ESC, Backspace lần lượt là 0DH, 1BH, 08H.
2) Để xóa ký tự bên trái dấu nháy, ta phải thực hiện dịch con trỏ sang trái, sau đó chèn
khoảng trắng và dịch con trỏ sang trái một lần nữa? Mã lệnh cần nạp cho LCD để điều khiển con trỏ là gì?
Mã lệnh cần nạp cho LCD để điều khiển con trỏ là 80H + xxH với xxH là vị trí DDRAM cần đặt con trỏ