Thursday, April 17, 2014

// // 2 comments

004. LED 2: Một số ví dụ về điều khiển bật tắt 8 LED (PHẦN 2)

  Ở bài viết trước, chúng ta đã làm quen với điều khiển LED PORT qua 3 ví dụ về các hiệu ứng 8 LED bật tắt. Hôm nay chúng ta sẽ làm tiếp ví dụ cuối cùng về LED, ví dụ này sẽ kết hợp những hiệu ứng chúng ta đã viết thêm vào một nút bấm để chúng ta làm quen với điều khiển cơ bản trong vi điều khiển nhé.

 VD4: Kết hợp các hiệu ứng để làm 1 dây đèn nháy có nút bấm điều khiển (chưa dùng lệnh ngắt)

  Thực hiện:

  +Mắc mạch:

Chúng ta Pick các thiết bị (device): (các bạn chưa rõ cách pick có thể xem lại LED 1)

+AT89C52
+RED-LED
+BUTTON
+Ground
+Power

Ta đi dây (dj) như hình dưới nhé: 


    Button được nối đất: có nghĩa là vi điều khiển sẽ nhận lệnh khi mức logic tại P1.0 chuyển từ 1 sang 0 nhé.
    Thông thường chúng ta có 2 kiểu mắc mạch đó là:

   +Sources Current (Source dòng)

    Mắc kiểu Sources dòng thì LED sẽ rất tối vì công suất của chân IC rất yếu. không cấp đủ dòng cho LED sáng với chế độ định mức. Nên phương pháp này sẽ làm LED sáng tối nên không hiểu quả. Chân IC ở mức 1 thì LED sáng và mức 0 thì tắt. 
    
    +Sinks Current (Sink dòng) 

  •   Ưu điểm: 

-  Mắc kiểu này thì LED sáng hết công suất. 
-  Điều khiển LED đơn này cũng rất là đơn giản. Nó dựa vào cách ghép nối với vi xử lý đưa mức cần thiết ra chân vi xử lý thì LED sẽ sáng và tắt theo ý muốn của chúng ta. 


  • Nhược điểm: 

-  Đây là phương pháp ghép trực tiếp nhưng vi xử lý chỉ chịu được một giá trị dòng 
định qua nó. Nếu mà quá nhiều LED ghép nối thế này thì tất cả dòng sẽ qua vi xử lý 
ra quá dòng trên vi xử lý gây nên cháy chíp và chíp nóng không hoạt động được lâu. 
-  Phương pháp này chỉ nên sử dụng khi lắp ít LED và điều khiển không đồng thời.  
-  Giải pháp là gắn thêm một transitor đệm. 
-  Đối với mắc kiểu này thì mức 1 thì LED tắt và mức 0 thì LED tắt. 

Vậy nên trong ví dụ này chúng ta sẽ dùng kiểu Source dòng nhé

  +Code:


Chúng ta mở KeilC tạo Project mới, file main.c mới và add vào Source Group 1, tick vào "Creat HEX file" cứ làm trước tí đỡ phải làm nha. (các bạn chưa rõ cách pick có thể xem lại LED 1)

Trong main.c chúng ta gõ code:

////////////////////////////
//VI DU 4: LED VA NUT BAM //
////////////////////////////

//khai bao thu vien

#include<regx52.h>



//ket noi phan cung

#define LED_PORT P2

sbit key=P1^0;



//chuong trinh con tao tre (delay)

void Delay_ms(unsigned int t)
{
  unsigned int x,y;
for (x=0;x<t;x++)
{
for (y=0;y<123;y++);
}
}

//hieu ung led 1: 8 LED nhap nhay
  void ct1()
{
unsigned char i;
for(i=0;i<5;i++)
{
//chúng ta giam gia tri delay de hieu ung co ve dep hon
Delay_ms(300);
LED_PORT =~LED_PORT; 
  }
}

//hieu ung led 2: 8 LED xen ke nhap nhay
void ct2()
{
unsigned char i;
LED_PORT = 0x55;
for(i=0;i<5;i++)
{
Delay_ms(300);
LED_PORT =~LED_PORT; 
  }
}

//hieu ung led 3: 8 LED sang dan, tat dan
void ct3()
{
unsigned char i,j;
for(j=0;j<2;j++)
{
for (i=0;i<8;i++)
{
LED_PORT=LED_PORT<<1|0x01;
Delay_ms (100);
}
for (i=0;i<8;i++)
{
LED_PORT=LED_PORT>>1;
Delay_ms (100);
}
}
}
//hieu ung led 4: 8 LED xen ke nhap nhay cach 2
void ct4()
{
unsigned char i;
for(i=0;i<8;i++)
{
LED_PORT=(LED_PORT>>1)|0x55;
Delay_ms (100);
LED_PORT =~LED_PORT;
Delay_ms (100);
}


void main()
{
unsigned int ct=0;
//ban dau, tat ca 8 LED
LED_PORT = 0x00;
while (1)
{
//Neu Button duoc bam, tuc la gia tri Logic==0
if(key==0)
{
//lenh chong doi phim
Delay_ms(20);
if (key==0)
{
//moi lan bam Button gia tri cua ct tang 1 ung voi cac chuong trinh con hieu ung led
while (key==0);
ct++; 
if (ct==5){ct=1;};
Delay_ms(100);
if (key==1)
{
// chay chuong trinh 1
if(ct==1){ct1();} ;
// chay chuong trinh 2
if(ct==2){ct2();} ;
// chay chuong trinh 3
if(ct==3){ct3();} ;
// chay chuong trinh 4
if(ct==4){ct4();} ;
}
LED_PORT = 0x00;
}
}
}

  Chúng ta có thể thêm các chương trình con hiệu ứng khác ct5, ct6.... và thêm vào main(). Trong bài này chúng ta cần chú ý đến 2 câu lệnh chống dội phím:

   Delay_ms(20);
   if (key==0) {}

  Với 2 câu lệnh này chúng ta sẽ hạn chế được hiệu tượng dội phím, Lệnh sẽ chỉ được thực hiện sau khi chúng ta buông tay ra khỏi nút bấm. hạn chế trường hợp biến ct sẽ tự tăng dù chúng ta chỉ mới bấm phím 1 lần. Cấu trúc của câu lệnh chỉ gồm 1 hàm trễ khoảng 20ms đảm bảo thời gian cho logic được ổn định sau khi chuyển từ mức 1 xuống mức 0.
  Chúng ta ấn F7 để Build file HEX, sau đó nạp vào Vi điều khiển để hưởng thụ thành quả nhé~
Qua ví dụ hôm nay chúng ta đã biết cách chuyển đổi các chương trình con bằng chỉ một nút bấm, cách chống dội phím khi bấm hay giữ phím. Chúng ta sẽ dừng phần LED ở đây, trong các bài viết sau chúng ta sẽ cùng nhau tìm hiểu về LED 7 thanh (7 đoạn, LED 7 SEGMENT), giao tiếp với LCD,...
   

Hôm nay chúng ta tạm thời dừng ở đây nhé!

Thân 
Phong's 

2 comments: