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 Led 7 đoạn, Đếm Counter + Ngắt ngoài INT + Nháy led 3s
Blog Led 7 đoạn, Đếm Counter + Ngắt ngoài INT + Nháy led 3s
Đề bài led 7 đoạn:
Bài giải Led 7 đoạn:
Phần cứng chương trình Led 7 đoạn:
- Đầu tiên sử dụng đếm sản phầm thông qua Counter0 vì vậy bắt buộc gắn vào chân RA4/T0CKI để đếm sản phẩm. Khi làm mạch thực tế nên sử dụng cảm biến hồng ngoại hoặc quang và một vài cảm biến liên quan khác.
- Nút nhấn STOP dùng để dừng hệ thống nhấp nháy theo thời gian cố định sáng 3s, tắt 3s. Đây được xem là nút nhấn khẩn cấp khi hệ thống gặp sự cố.
- Hiển thị thời gian được quy định ra một Led 7 đoạn anot chung được nối vào Port D và Port C. Cách tính trở 330 xem trong giáo trình thầy Nguyễn Đình Phú
- Led đơn khi sử dụng cho vi điều khiển phải gắn thêm trở 330 để bảo vệ led đơn. Cách tính xem lại lý thuyết mạch điện.
- 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 | Pic16F887 |
Led 7 đoạn | Led 7 đoạn |
Biến trở | Biến trở |
Điện trở | Điện trở |
Nút nhấn | Nút nhấn |
Thạch anh | Thạch anh |
Hồng ngoại | Hồng ngoại |
Led đơn | Led đơn |
Phần mềm Led 7 đoạn:
Khai báo thư viện tiền sử lý của ngắt ngoài INT:
- Vi điều khiển hiện tại mình đan dùng là Pic16F887
- Hiện dùng thạch anh nội và thạch anh nội khai báo 8M bằng lệnh #Fuses intrc_io và #delay(clock=8M).
- Mã 7 đoạn là đoạn mã Anot: Cấu trúc lệnh cho bạn nào cần copy : ” unsigned int8 ma7doan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8.0x80,0x90,0xff} “.
- Đị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.
- Trong yêu cầu có chức năng của chạy dừng cho cho led vì vậy nên sử dụng biết int1 tức 1bit. Đây được xem là phương pháp điều khiển đơn giản nhất và có tính ứng dụng khá cao trong các trường hợp có đối lập chung.
- Hàm khai báo #int_ext là ngắt ngoài INT, chương trình con void ngat_ngoai(); sảy ra khi có sự thay đổi xung ngõ vào. Khi sảy ra gán tt=0 tức tắt led.
Chương trình Led 7 đoạn:
Chương trình sáng led 3s
- Khi thực hiện việc sáng led 3s mà sử dụng delay 3000ms hoặc sử dụng vòng lặp for thì sẽ rất khó khăn trong việc giao tiếp với các module khác.
- Vòng lặp chạy 1000 lần mỗi lần 3ms thì sẽ tạo trễ thời gian là 3000ms. Nếu tt=0 tức nút nhấn từ ngắt ngoài int ext được nhấn thì sẽ kết thúc vòng lặp, mở led đơn sáng, trong thời gian 3000ms led đơn sáng thì đồng thời phải kiểm tra xem có đếm counter0 hay không, nếu có thì đọc giá trị đếm về bằng get_timer0(); sau đó gán kết quả cho sp, nếu sp lớn hơn 24 tức đạt ngưỡng 25 thì khởi tạo giá trị ban đầu bằng 1 đồng thời kích hoạt mở thùng trong thời gian 3ms sau đó đóng chân xung, ngược lại nếu sp nhỏ hơn hoặc bằng 24 thì chỉ tạo trễ 3ms
- Đồng thời xuất giá trị ra cho hai led 7 đoạn và Port C đóng vai trò hàng chục, Port D đóng vai trò hàng đơn vị theo phần cứng đã thiết kế.
Chương trình tắt led 3s
- Khi thực hiện việc tắt led 3s mà sử dụng delay 3000ms hoặc sử dụng vòng lặp for thì sẽ rất khó khăn trong việc giao tiếp với các module khác.
- Vòng lặp chạy 1000 lần mỗi lần 3ms thì sẽ tạo trễ thời gian là 3000ms. Nếu tt=0 tức nút nhấn từ ngắt ngoài int ext được nhấn thì sẽ kết thúc vòng lặp, tắt led đơn, trong thời gian 3000ms led đơn tắt thì đồng thời phải kiểm tra xem có đếm counter0 hay không, nếu có thì đọc giá trị đếm về bằng get_timer0(); sau đó gán kết quả cho sp, nếu sp lớn hơn 24 tức đạt ngưỡng 25 thì khởi tạo giá trị ban đầu bằng 1 đồng thời kích hoạt mở thùng trong thời gian 3ms sau đó đóng chân xung, ngược lại nếu sp nhỏ hơn hoặc bằng 24 thì chỉ tạo trễ 3ms
- Đồng thời xuất giá trị ra cho hai led 7 đoạn và Port C đóng vai trò hàng chục, Port D đóng vai trò hàng đơn vị theo phần cứng đã thiết kế.
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 Led 7 đoạ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 B dùng cho nút nhấn để đưa vào Vi điều khiển vì thế khởi tạo giá trị là 0xff. Port D, Port C sử dụng cho Led 7 đoạn vì vây khởi tạo là 0x00. Port E hoàn toàn xuất tín hiệu cho led đơn nên khởi tạo 0x00.
- Port A nhận tín hiệu từ chân Counter0 RA4 nên khởi tạo 0xff.
- Việc đếm xung dùng timer0 và xung được lấy từ bên ngoài nên khai báo là T0_EXT_L_TO_H tức khi thay đổi trạng thái từ mức thấy lên mức cao sẽ đếm một xung, vì một xung nên việc chọn bộ chia cũng là bộ chia 1. Ở đây việc khai báo bộ chia 1 thật sự không cần thiết vì mặc định đã là chia 1.
- Khởi tạo chương trình ngắt gồm Global là khởi tạo ngắt toàn cục, nói đơn giản hơn là cho phép các chương trình ngắt sảy ra, INT_EXT là cho phép chương trình ngắt ngoài hoạt động, đặt biệt là lệnh báo trạng thái thay đổi của xung để ngắt ext_int_edge(L_TO_H); trong lệnh khai báo bị ngược so với thực tế khi sử dụng nút nhấn, nhưng không ảnh hưởng nhiều đến chương trình khi nhấn nút.
Các giá trị ban đầu gán bằng 0 đây là điều bắt buộc vì nếu không gán hệ thống sẽ tự Ramdom trong các biến theo giá trị khai báo.
- Kiểm tra xem nút nhấn ON có được nhấn không, nếu có thì gán tt=1;
- Khi trạng thái bằng tt=0 luôn tắt led nhấp nháy chỉ kiểm tra có sự thay đổi trạng thái từ chân counter0 không, nếu có thì đọc giá trị đếm về bằng get_timer0(); sau đó gán kết quả cho sp, nếu sp lớn hơn 24 tức đạt ngưỡng 25 thì khởi tạo giá trị ban đầu bằng 1 đồng thời kích hoạt mở thùng trong thời gian 3ms sau đó đóng chân xung.
- Đồng thời xuất giá trị ra cho hai led 7 đoạn và Port C đóng vai trò hàng chục, Port D đóng vai trò hàng đơn vị theo phần cứng đã thiết kế.
- Ngược lại nếu tt=1 chỉ cần kiểm tra hai chương trình con sáng, tắt led đơn 3s như đã phân tích ở trên.
Chúc các bạn có một kỳ thi thành công…!!!