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 Ngắt Port B, Điều khiển hiệu ứng led đơn bằng nút nhấn
Blog Ngắt Port B, Điều khiển hiệu ứng led đơn bằng nút nhấn
Đề bài ngắt Port B:
Bài giải ngắt Port B:
Phần cứng chương trình ngắt Port B:
- Đề yêu cầu sử dụng ngắt Port B vì vậy các nút nhấn được gắn lần lượt vào RB0, RB1, RB2.
- Sử dụng dao động ngoài thạch anh 4M gắn vào chân OSC1 OSC2.
- Led đơn sử dụng 8 led được gắn vào Port D đồng thời điện trở kèm theo là 330Ω, cách tính các bạn có thể tham khảo sách giáo trình Vi điều khiển thầy Nguyễn Đình Phú bài led đơn.
Phần mềm ngắt Port B:
Khai báo thư viện tiền sử lý của ngắt Port B:
- Vi điều khiển hiện tại mình đan dùng là Pic16F887
- Hiện đan dùng thạch anh ngoài và thạch anh ngoài 4M bằng lệnh #Fuses hs và #delay(clock=4M)
- Định nghĩa các chân RB0, RB1, RB2 theo tên chức năng của nút nhấn để dễ sử dụng.
- Tên khai báo biến thì cái này tùy thuộc vào chức năng sử dụng. Sử dụng cho 8 Led nên khai báo 8bit cho biến i, y và biến tt là biến trung gian của ngắt Port B cho 3 nút nhấn.
Chương trình con kiểm tra nút nhấn của ngắt Port B:
Chương trình con đầu tiên hiệu ứng sáng đuổi 8led đơn từ phải sang trái.
- Khi nghe hiệu ứng sáng đuổi thì gán giá trị led sáng đầu tiên y=0x01; hiệu ứng chạy từ phải sang trái. Sau đó xuất giá trị ra vào tạo trễ 300ms theo yêu cầu của đề bài.
- Để Led sáng dịch vào thì sử dụng lệnh dịch trái “<<1” đơn vị. Sử dụng 8led nên vòng for cần chạy là 8 lần. Mỗi lần dịch xong chỉ cần xuất giá trị ra Port D và tạo trễ 300ms.
Chương trình con thứ hai hiệu ứng sáng dần 8led đơn từ trái sang phải
- Khi nghe hiệu ứng sáng dần thì gán giá trị đầu tiên y=0x00;. Sau đó xuất giá trị ra vào tạo trễ 300ms theo yêu cầu của đề bài.
- Để Led sáng dần thì sử dụng lệnh dịch phải “>>1” đơn vị. Nhưng khi dịch xong giá trị sẽ bị trống vị trí cuối vi điều khiển tự động chèn vị trí số 0 vào, lúc này ta bắt buộc phải cho vị trí đó sáng lên. Muốn chuyển giá trị từ 0000 0000 sang 1000 0000 chỉ cần “|” với bị trí led sáng đầu tiên là 1000 0000 = 0x80. Sử dụng 8led nên vòng for cần chạy là 8 lần. Mỗi lần dịch xong sau đó OR (|) 0x80 rồi xuất giá trị ra Port D và tạo trễ 300ms.
Chương trình con thứ ba hiệu ứng sáng dần 8led đơn từ ngoài vào trong
- Cần tính mã ví dụ cho hai led 2 đầu sáng thì mã sẽ là 1000 0001 = 0x81. Tương tự cho các mã khác đến hết 4 trạng thái. Đây được xem là một cách sơ khai nhất về viết cho hiệu ứng led đơn, nếu viết bằng phương pháp này chỉ có thể sử dụng cho ít led. Số lượng led đơn lớn thì rất khó và sẽ lâu hơn, lúc đó sẽ có phương pháp khác hữu hiệu hơn.
Chương trình ngắt Port B cũng được xem là một chương trình con.
- #int_RB đầy là lệnh khai báo chương trình ngắt. Chương trình kế lệnh này được hiểu đó là chương trình con của ngắt. Câu hỏi đặt ra vậy ngắt sảy ra khi nào.? Chương trình ngắt Port B sảy ra khi có sự thay đổi tín hiệu ở các chân của Port B từ RB0…RB7.
- Void ngat_portb(); Việc đặt tên cho chương trình ngắt chỉ cần tuân thủ theo yêu cầu đặt tên chương trình con là được. Các nút nhấn khi được nhấn sẽ trả về 0, nên kiểm tra chỉ cần một trong 3 chân trả về 0 thì sẽ trả về sản phẩm tương ứng là biến “tt” quy định biến phụ thuộc vào người 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 ngắt Port B
- Bắt đầu chương trình chính phải khỏi rạ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 xuất cho led đơn tức đưa tín hiệu từ Vi điều khiển ra ngoài nên khởi tạo là 0x00.
- Khai báo enable_interrupts(global); cho phép toàn cục, tức cho phép các chương trình ngắt sảy ra.
- Khai báo enable_interrupts(int_rb); cho phép chương trình ngắt Port B sảy ra.
- Đầu tiên khi không nhấn thì tt=0 để làm tắt led. Lúc này nếu một trong ba nút nhấn được phép nhấn sẽ trả về sản phẩm tt theo giá trị đã được quy định trong chương trình ngắt Port B. Nếu tt=1 mở chương trình chạy sáng dần từ trái sang phải nhưng chỉ mở một lần sau đó cho tt=0 để quay về ban đầu chuẩn bị cho lần nhấn tiếp theo, tương tự cho hai nút nhấn còn lại và số lượng hoạt động của chương trình con chính là số lần được gọi ra trong điều kiện.
- Ở đây nếu sử dụng chương trình này thì sẽ có một nhược điểm rất lớn là khi đan chạy hiệu ứng nào thì có nhấn nút cũng không có tác dụng. Chỉ khi chương trình chạy xong mới bắt đầu cho phép nhấn lần tiếp theo và thực hiện theo điều kiện đã được lập trình.
Chúc các bạn có một kỳ thi thành công…!!!