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 nút nhấn, Điều khiển led đơn sáng 10s bằng Timer0
Blog Lập trình nút nhấn, Điều khiển led đơn sáng 10s bằng Timer0
Đề bài lập trình Nút nhấn:
Bài giải lập trình Nút nhấn:
Phần cứng chương trình lập trình Nút nhấn:
- Yêu cầu đề bài đưa ra chỉ cần đọc tín hiệu từ nút nhấn sau đó xuất ra cho Led đơn sáng 10s theo thời gian định thời từ Timer0.
- Sử dụng dao động ngoài thạch anh 12M 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 4 Led đơn được điều khiển độc lập phụ thuộc vào nút nhấn. 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 Nút nhấn:
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 12M bằng lệnh #Fuses HS và #delay(clock=12M).
- Đị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.
- Định nghĩa chân: tùy theo chức năng của chân mà tên định nghĩa được bám sát vào nội dung đan thực hiệ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 con lập trình nút nhấn:
Chương trình kiểm tra nút nhấn
- Chương trình kiểm tra nút nhấn đơn giản khi nhấn nút thì nút nhấn trả về 0 theo phần cứng kết nối, thì trả về tt0=1 để cho phép sáng đèn, dem=0 bắt đầu đếm thời gian quy định là 10s.
- Tương tự cho các nút nhấn còn lại nhưng khi trả về là tt1 và dem1,….
Chương trình đếm thời gian 10s sáng đèn
- Kiểm tra nếu tt0=1 tức có nhấn nút thì chương trình đếm bắt đầu đếm. Cứ sau 0.1ms thì giá trị dem0 tăng lên một đơn vị xem phần tính toán bên dưới chương trình chính. Khi giá trị nhỏ hơn 100000 tức chưa đủ 10s thì luôn bật led vị trí RC0 sáng, khi đạt ngưỡng 100000 tức đủ 10s thì cho tt0=0 và tắt led vị trí RC0, ngược lại tt0=0 luôn gán giá trị dem0=0 và tắt led chân RC0.
- Tương tự cho các chương trình đếm thời gian còn lại,….
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. Port B kết nối với nút nhấn để đưa tín hiệu vào cho Vi điều khiển nên khởi tạo là 0xff.
- Sử dụng timer0 để đếm thời gian 10s nên khai báo t0_internal và sử dụng bộ chia timer0 là 2. từ đó suy ra cách tính: 12M/4=3M sử dụng bộ chia 4 là chia của phần cứng do nhà sản xuất quy định. 3M/2=1.5M sử dụng bộ chia 2 của timer0, từ đó suy ra f = 1.5M => T = 2/3uS. Timer0 đếm 8bit => 2^8 = 256 xung => t0 max = 2/3uS x 256 = 512/3ms ≈ 0.1706ms. Nên sử dụng số 512/3ms để 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.1ms => bắt đầu đếm từ 106.
- Kiểm tra nút nhấn có được nhấn không nếu có sẽ trả về kết quả tt và dem tương ứng.
- 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ề 106 để chu kỳ sau được 0.1ms.
- Cuối cùng gọi các chương trình đếm thời gian thực hiện, cứ sau 0.1ms thì sẽ tăng lên một giá trị theo điều kiện đã được lập trình trong chương trình con.
Chúc các bạn có một kỳ thi thành công…!!!