Mua linh kiện điện tử tại Điện tử Nhật Tùng
Khóa học Vi điều khiển có phí Hình thức học: Video hoặc Kèm trực tiếp ===>>>> Kích vào hình để được biết thêm chi tiếtTable of Contents
Tải File bài giải
Pass giải nén: Huynhnhattung.com
===>>> Nếu bạn chưa có phần mềm giải nén:
Video Lập trình Timer0, Tạo chu kỳ điều khiển led đơn nhấp nháy
Blog Lập trình Timer0, Tạo chu kỳ điều khiển led đơn nhấp nháy
Đề bài lập trình Timer0:
Bài giải lập trình Timer0:
Phần cứng chương trình lập trình Timer0:
- Yêu cầu đề bài đưa ra tính timer0 để tạo ra chu kỳ nhấp nháy led đơn.
- Sử dụng dao động ngoài thạch anh 20M gắn vào chân OSC1 OSC2. Đây là mô phỏng nên mình lười không gắn vào.
- Sử dụng 8 Led đơn được điều khiển sáng tắt. Tính trở 330 tham khảo tại giáo trình thầy Nguyễn Đình Phú.
- Các linh kiện chính cần sử dụng tham khảo tại.
Thông số kỹ thuật | Mua Linh kiện |
Pic16F887 | Pic16F877 |
Led đơn | Led đơn |
Điện trở | Điện trở |
Nút nhấn | Nút nhấn |
Thạch anh | Thạch anh |
Phần mềm lập trình Timer0:
Khai báo thư viện tiền sử lý của lập trình Nút nhấn:
- Vi điều khiển hiện tại mình đan dùng là Pic16F887
- Hiện dùng thạch anh ngoài và thạch anh ngoài khai báo 20M bằng lệnh #Fuses HS và #delay(clock=20M).
- Địa chỉ biến cờ tràn của timer0 là 0x0b.2 tức là địa chỉ 0x0b và vị trí 2. Tên thanh ghi TMR0IF vì vậy việc định nghĩa đúng tên làm rõ được chức năng của biến đan dùng, nếu các bạn không nhớ tên có thể định nghĩa bất cứ tên mà bạn mong muốn chỉ cần tuân thủ các điều kiện đặt tên.
- Tên khai báo biến phụ thuộc vào chức năng để khai báo cho phù hợp.
- Khi các biến không biết được giá trị cuối thì nên khai báo signed int32 tức khai báo biến có dấu 32bit, lúc này giá trị rất rộng không sợ bị thiếu. Khi chương trình có trạng thái đối lập nhau thì nên khai báo biến 1bit để dễ lập trình.
Chương trình chính thực hiện toàn bộ hoạt động của vi điều khiển dùng lập trình nút nhấn
- Bắt đầu chương trình chính phải khởi tạo ngõ vào ra cho vi điều khiển. Một chân của vi điều khiển thì làm nhiệm vụ I/O vì thế phải khỏi tạo. Port C xuất dữ liệu cho led đơn vì vậy xuất khởi tạo là 0x00.
- Sử dụng timer0 để đếm thời gian 10s nên khai báo t0_internal và sử dụng bộ chia timer0 là 4. từ đó suy ra cách tính: 20M/4=5M sử dụng bộ chia 4 là chia của phần cứng do nhà sản xuất quy định. 5M/2=1.25M sử dụng bộ chia 2 của timer0, từ đó suy ra f = 1.25M => T = 0.8uS. Timer0 đếm 8bit => 2^8 = 256 xung => t0 max = 0.8uS x 256 = 0.2048ms . Nên sử dụng số 0.2048ms để tính đừng quy đổi ra xấp xỉ sẽ dẫn đến sai số. Chọn thời gian tràn timer0 là 0.2ms => bắt đầu đếm từ 6.
- Kiểm tra nếu TMR0IF=1 timer0 đã đếm tràn tức timer0 đã đếm tới ngưỡng 255 thì tiến hành xóa cờ tràn tức cho TMR0IF=0, sau đó khởi tạo lại Timer0 về 6 để chu kỳ sau được 0.2ms.
- MSSV của mình là 417. Vì vậy timer tràn 2085 lần được 417ms. 1/3 = 139ms tức tràn 695 lần. Cách sắp xếp của led không giống nhau vì vậy muốn led sáng xuất 0xab. Led tắt xuất 0x54.
Chúc các bạn có một kỳ thi thành công…!!!