Đèn led – Vi điều khiển – Lập trình Pic16F877A hiệu ứng tắt đuổi – Bài 7

nhan-do-an-vi-dieu-khien
Đèn led sẽ có rất nhiều hiệu ứng đẹp dùng để các bạn có thể chạy led trái tim, hình ngôi sao, dùng trang trí làm bảng hiệu, bằng các hiệu ứng sáng đuổi,sáng dần… ngoài ra còn nhiều hiệu ứng khác nữa. Hi vọng bài này sẽ đem đến cho các bạn thật nhiều kiến thức bổ ich.  

Các bạn tải link giáo trình:

Giáo trình : Vi điều khiển – Lý thuyết – Nguyễn Đình Phú

Giáo trình : Vi điều khiển – Thực hành – Nguyễn Đình Phú

Bài giảng: Vi điều khiển – Lý thuyết – Thực hành – Trương Ngọc Anh

Pass giải nén : Nhattungnt93

Nguyên lý kết nối đèn led vi điều khiển

Cách nối phần cứng

Cách kết nối led đơn

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 đèn led tắt đuổi

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

Khai báo thư viện và tiền xử lý
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 Pic Chứ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

khai-bao-bien-sang-dan
  • 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.
Lưu ý: Nếu chương trình nhỏ các bạn không kiểm soát biến tốt thì nên dùng biến có dấu 32bit.

Các chương trình con đèn led chạy tắt đuổi

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ể.

Hiệu ứng sáng đuổi 0000 1111 = 0x0f   // cho sáng 4 led 1000 1111 = 0x8f   // tắt led đầu tiên 0100 1111 = 0x4f   // tắt led thứ hai 0010 1111 = 0x2f 0001 1111 = 0x1f 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
chương trình chạy tắt đuổi kê khai
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 đèn led tsp 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 sáng dần. Đầu tiên phải cho tắt một led ở vị trí đầu 1000 0000 = 0x80 Sau đó bắt đầu dịch lần vô dịch lần vô là được
Toá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 1000 0000 >>1 thì được giá trị như bảng dưới
10000000
1000000
01000000
Theo như trên chổ dịch 1 thì các bạn thấy vị trí số 0 sẽ bị mất và vị trí số 7 bị trống và vi điều khiển sẽ lấp đầy bằng giá trị số 0 nên giá trị là : 0100 0000 Từ đó mình đưa ra chương trình như sau
Cách viết chương trình
chương trình chạy tắt đuổi bằng for
Đầu tiên mình phải cho led sáng 1 điểm 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 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 đèn led trái sang phải  Tương tự như 8 led nhé
chương trình chạy tắt đuổi 16 led
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à 1000 0000 0000 0000 = 0x8000; 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.D
Ví 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ưng
11111111
Khi đã lấy giá trị cho 8bit của PortD thì còn lại 8 bit cao phải xuất cho Port C là : 0111 1111 Vì chỉ lấy giá trị từ thấp đến cao nên không thể xuất trực tiếp cho Port C được Mà phải tiến hành dịch 8 lần để 8bit cao xuống 8bit thấp khi dịch h>>8 = 0000 0000 0111 1111 Sau đó Output_C(h>>8) thì vi điều khiển sẽ lấy được 8bit cao sắp vào cho Port C
0111111111111111
Như vậy là đã lấy đủ 16bit cho hai port mà không bị chồng dữ liệu. Tương tự cho chương trình con ở trên thôi nhé.

Chương trình chính đèn led tắt đuổi

chương trình chính chạy tắt đuổi
Vi điều khiển chạy khi có chương trình chính Vì tín hiệu đều được ra ngoài led đơn nên khỏi tạo giá trị đều đi ra. Đầu tiên phải tắt các led khi chạy. Vòng lặp tuần hoàn chỉ cần gọi chương trình con ra là xong.

Các bạn xem đầy đủ chi tiết phần Video

https://www.youtube.com/watch?v=DU4wp4hjsng&t=221s

Bài giảng hôm nay dừng ở đây nhé hôm sau sẽ học:

==> Bài 8 – Chương trình đếm lên xuống hiển thị led 7 đoạn

Toàn bộ khóa học Vi điều khiển

facebook trang cá nhân

youtube trang cá nhân

Chúc các bạn thành công.!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *