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 phần Tổng hợp hiệu ứng led đơn
Pass giải nén: Huynhnhattung.com
===>>> Nếu bạn chưa có phần mềm giải nén:
Nguyên lý kết nối led đơn với vi điều khiển
Cách nối phần cứng
Giải thích cách nối
Đối với nguyên lý này muốn led sáng hay tắt phụ thuộc vào chân VDK Nếu VDK=1 thì hai đầu đều bằng 1 tức sảy ra hiện tượng đẳng áp nên làm led tắt. Nếu VDK=0 thì điện áp lúc này sẽ đổ nguồn qua chân A và qua chân VDK, led sáng Phần tính điện trở R32 thì đơn giản mình không bàn ở trong này nhé.Chương trình hiệu ứng led đơn tắt dần
Bắt đầu đi giải thích các phần nào.Khai báo thư viện cho led đơn sáng dần
Tiền sử lý
#include <16F877A.h> // dòng lệnh này là khai báo thư viện con Pic16F887, nếu các bạn sử dụng thử viện khác thì thay đổi tên lại nhé. Ví dụ: Pic16F877A thì khai báo #include<16F877A.h> Pic18F4550 thì khai báo #include <18F4550>Định cấu hình
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP // dòng lệnh này định cấu hình cho PicChức năng các thông số như sau:
- NOWDT: là không sử dụng bộ định thời giám sát (No watchdog timer)
- PUT: là sử dụng bộ định thời khi có nguồn để kéo dài them thời gian reset vi điều khiển để chờ nguồn điện ổn định, thời gian kéo dài thêm 72ms (Power up timer)
- HS: là sử dụng bộ dao động tần số cao từ 4MHz đến 20MHz (High Speed)
- NOPROTECT: là không sử dụng bảo vệ mã code nạp vào bộ nhớ flash bên trong
- NOLVP: là không sử dụng chế độ nạp code dùng nguồn điện áp thấp 5V mà dùng nguồn 12,5V.
- Ngoài ra thì còn nhiều thông số khác các bạn xem thêm trong thư viện Pic16F887 nhé.
Thư viện delay
#use delay (clock =20M) // nếu sử dụng thạch anh nội thì từ 37k đến 8M, còn thạch anh ngoài thì 4M đến 20M, Khi bạn sử dụng thạch anh nào thì nhớ khai báo đúng ở đây là được.Khai báo biến phục vụ cho chương trình led đơn
- Biến y dùng xuất giá trị ra cho led , vì nó 8bit nên chỉ xuất tối đa là 8 led thôi nhé
- Biến i dùng để đếm số vòng lặp for cho giá trị chỉ chạy từ 0 đến 8 hoặc 0 đến 16 nên không cần khai báo lớn nhằm tiết kiệm bộ nhớ.
- Biến h dùng lưu giá trị và xuất ra cho hai port C và D.
Các chương trình con led đơn tắt dần
Chương trình con tắt dần 4 led từ trái qua phải.Có hai hình thức viết hiệu ứng tắt dần:
Kê khai từng giá trị cụ thể.
0000 1111 = 0x0f // cho sáng 4 bóng 1000 1111 = 0x8f // tắt bóng đầu tiên 1100 1111 = 0xcf //tắt 2 bóng 1110 1111 = 0xef 1111 1111 = 0xff
Khi mình xuất số 0 thì led sáng, xuất số 1 thì led tắt. Các đổi từ số 2 sang số hex các bạn xem phần video nhé. Từ cách tính đó mình có được chương trình con như sau:Cách viết chương trình
Xuất lần lượt từng giá trị ra, mỗi lần xuất mình delay một khoảng thời gian để dễ quan sát. Phần cứng mạch thực tế các bạn xem phần video nhéViết vòng lặp For, công thức chung cho 8 led trái sang phải
Nếu cứ đi kê khai từng giá trị thế thì chương trình trở nên dài và khó khăn cho các hiệu ứng 32 led… Từ đó mình phải đi tìm công thức chung cho hiệu ứng tắt dần. Đầu tiên phải cho sáng các led trước 0000 0000 = 0x00 Sau đó bắt đầu dịch lần vô dịch lần vô là đượcToán tử dịch
Toán từ dịch trái sang phải là >>, còn dịch phải sang trái là : << ð Nếu 1111 1111 >>1 thì được giá trị như bảng dướiĐầu | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
>>1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|0x80 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
= | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Toán tử OR
từ đó phải | (OR) với 0x80 để làm cho trạng thái của led số 7 luôn lên 1. Từ đó mình đưa ra chương trình như sauCách viết chương trình
Đầu tiên mình phải cho sáng hết bằng cách cho y = 0x00, xuất ra và delay để quan sát. Sau đó vòng lặp for chạy 8 lần, mỗi lần như thế thì mình cho y >>1 sau đó minh | với 0x80 thì sẽ ra hiệu ứng mình cần dùng Như vậy là đã xong 8 led Phần cứng mạch thực tế các bạn xem phần video nhéViết vòng lặp For, công thức chung cho 16 led trái sang phải
Tương tự như 8 led nhé Các bạn lúc này phải dùng biến 16bit nhé. Vì là 16bit nên giá trị ban đầu từ trái sang phải là 0000 0000 0000 0000 = 0x0000; Mỗi port của vi điều khiển chỉ xuất cho 8led, vì thế muốn xuất được 16led phải dùng 2 port C.DVí dụ
H = 0111 1111 1111 1111 Mình sắp xếp vào cho đúng nhé: giả sử 8 ô đầu là của Port C, còn lại của Port D Khi mình Output_d(h) thì VĐK chỉ lấy giá trị từ bít thấp lên bit cao, đủ 8 bit thì ngưng1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |