F Kỹ Thuật Quét Led ~ ĐIỆN TỬ BẮC KẠN

Thứ Bảy, 26 tháng 4, 2014

Kỹ Thuật Quét Led

// KỸ THUẬT QUÉT LED 7 ĐOẠN.
Nói có sách , mách có hình ảnh
Đầu tiên đây sẽ là hình của led 7 đoạn Anode và Ktode chung mà anh em đã biết :

Về cấu tạo :
Như các bạn đã thấy trên hình vẽ ,Led 7 thanh được cấu tạo từ 7 diode ghép theo dạng thanh(nôm na là thế đã ).
-Nếu nối các cực Anode vói nhau gọi là Anode chung
và với Ktot cũng tương tự.

//----------------sử dụng như thế nào -------------------------
Cái này thì các bạn hầu như ai cũng biết mình sẽ nói qua thôi.
Nếu là Anode chung , có nghĩa là chân Anode nối lên nguồn (mức 1) thì dữ liệu đưa vào 7 chân dữ liệu A B C D E F G sẽ là mức thấp (0) thì led 7 đoạn sẽ tích cực (sẽ sáng) tùy vào dữ liệu các bạn đưa vào.
Với led 7 thanh ktot chung cũng ngược lại , dữ liệu vào các chân A B C D E F G LÀ Mức cao (mức 1) mới tích cực.
// --------------Cách dùng trong ngôn ngữ C---------------------
Sau đây là bảng mã led dùng :

Và đây nữa cho Ktot:


Như vậy là đã rõ chúng ta dùng ngôn ngữ C và dùng mã led như trên
Nếu các bạn muốn hiện một chữ hay một số khác trên led 7 thanh dễ thôi, các bạn chỉ cần nhìn vào led 7 thanh , cho giá trị A B C D E F G phù hợp là được (lưu ý : anode mức 0 tích cực , Ktot mức 1 tích cực)

// Để rõ ràng Đây là ví dụ 
// Hiển thị một số và một chữ 
Hiển thị một số thôi

// dientubackan.blogspot.com
#include<reg51.h> // thu vien dung cho 8051
#include<stdio.h> // thu vien dung cho cac cau truc dieu khien
#include<intrins.h> // chua cac ham dung cho tung bit
// luu ý do thói quen mình khai bao c? 3 thu vien mac du co the ko dung den
// cac ban neu hieu roi thi co the ko khai bao nhung theo minh nen khai bao ca 3
// cung ko ton bo nho nhieu
void main(void)
   {
 
     P2=0xF9;// so 1

   }

hình ảnh :



Tương tự với một chữ khác // chữ P
ok chỉ cần thay P2=0x8C // mã của chữ P


// Bây giờ là quét
Mình sẽ quét một led 7 đoạn các bạn để ý nhé !
// Hiển thị số từ 0-9
 

// dientubackan.blogspot.com
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
// khai bao ma led 7 doan    ktot chung
unsigned char mang[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
// chuong trinhd delay
void delay(unsigned char ms)
   {
   int i,j;
   for(i=0;i<ms;i++)
     {
    for(j=0;j<125;j++);
    }
   }
// chuong trinh chinh
void main(void)
    {
   // xuat du lieu ra cong P2
   int a;
   while(1)
   {
   for(a=0;a<10;a++)
       {
      P2=mang[a];
      delay(1000);
      }
      }
   }

Hình ảnh đây:


Lưu ý với các bạn : chỉ một số bài phức tạp một chút mình mới đưa file mô phỏng và keil C lên . Còn những bài đơn giản đã có code rồi các bạn vẽ mô phỏng cho hiểu bản chất.
// quét nhiều hơn 1 led
Chúng ta đã rõ nếu mà dùng nhiều led 7 đoạn thì có nhiều cách dùng lắm như dữ liệu của 1 led 7 đoạn nối vào một cổng.
nếu ta dùng cách trên chỉ với 4 led 7 đoạn ta đã hết chân 8051.
Như vậy thật là lãng phí.
--------------------------------------------------------------------
Để đơn giản và tiết kiệm chân cho vđk ta sẽ nối hết các chân dữ liệu của lè 7 đoạn với nhau và nối tới 1 cổng của VĐK , khi đó ta sẽ quét những chân 
chung của nó ,tại một thời điểm chỉ có một chân chung được tích cực.
Nhưng do thời gian quét nhanh(mắt người chỉ phản ứng đc với dưới 24 hình ảnh trong 1 giây) do đó ta cảm tưởng như các led sáng đồng thời.
Như vậy là tiết kiệm rồi phải ko?
Ta có thể dùng thỏa mái led 7 đoạn , nếu nhiều quá mình sẽ dùng kỹ thuật khác là ic 74ls138 (sẽ nói trong cac Seri sau).

--------------------------------------------------------------------
Chúng ta có bao giờ hỏi xem thời gian bao nhiêu là đủ và tính toán thời gian quét trong C như thế nào ko ?
Tôi tin chắc rằng rất nhiều bạn đang băn khoăn . Nhưng ko sao " Nhóm Hand in Hand sẽ đồng hành cùng với các ban.
Tôi khuyên các bạn nên dùng Timer trong 8051 , khi đó thời gian sẽ chính xác mà ko cần băn khoăn có trễ.
Nguyên lý quét như sau :
Tại một thời điểm chỉ có 1 led được tích cực (sáng).
Sơ đồ quét :
led sáng -> xuất dữ liệu -> trễ ->led tắt -> xóa dữ liệu.
Chỉ đơn giản vậy thôi ?
 
Nhưng còn một cái quan trọng lắm đấy
Đó là dùng timer và tính thời gian quét

Cụ thể nhé !
[b]Bạn muốn quét 4 led 7 đoạn phải ko ?
Đấy nè :
Thông thường nếu là 1 led 7 đoạn ta thường quét ở tần số 25hz tương ứng là 40ms.
Do đó nếu là n led thí thời gian quét mỗi led là 40:n (ms)
Do đó 4 led sẽ là 40:4 = 10ms(đã xong rồi nhé)
Cách tính giá trị thanh ghi Tmod ứng với 10ms như sau:
Bạn có 10ms , thạch anh 12Mhz ta dùng cho VĐK do đó chu kí máy là 1us
----------> khoảng giá trị trễ là :
Công thức : khoanggiatritre*1us = thoigian;
suy ra : khoảng giá trị trễ là : 10ms/1us =1000;
khi đó giá trị bắt đầu là 65536 -1000 = 64536;
Từ 64536 -65536 đúng là 1000 rồi .
ok
Ta dùng Calculator trong máy tính đổi được giá trị hexa = FC18
của 64536 đây chính là giá trị cần nạp cho timer( Thông thường ta dùng Tmer0 ,timer1 do tôi quen) còn thì dùng cái nào cũng được.
[/b]
---------------------------------------------------------------------
Cách viết chương trình timer trễ trong C
Tôi không nhầm thì có vài cách viết thì phải.
Nhưng ở đây mình chỉ giới thiệu 2 cách viết dễ hiểu và thông dụng nhất :
//cách gián tiếp đổi ra hêxa rồi nạp vào như sau :

// dientubackan.blogspot.com
void tre_timer(void)
    {
    TMOD=0x01 ; chon timer 0 che do 1 16 bit
    TH0=0xFC ; // chinh la gia tri o 2byte cao ban vua doi o tren FC18
     TL0=0x18;
    TR0=1;// khoi tao cho timer 0 chay
   while(!TF0) ; // ko lam gi cho den khi co TF0 bat len la bo dem bi tran
  TF0=0;// xoa co timer 0
  TR0=0; // xoa timer 0
    }
Cách trực tiếp bạn ko cần đổi hexa làm gì mất công

// hand in hand group
// dtvt k7a
// truong DH CNTT - TT Thai Nguyen
void tre_timer(void)
    {
    TMOD=0x01 ; chon timer 0 che do 1 16 bit
    TH0=64536/256; // doi ra hexa van la FC
     TL0=64536%256 ; // doi ra van la 18 thoi
    TR0=1;// khoi tao cho timer 0 chay
   while(!TF0) ; // ko lam gi cho den khi co TF0 bat len la bo dem bi tran
  TF0=0;// xoa co timer 0
  TR0=0; // xoa timer 0
    }
Các bạn đã rõ chưa ?
Đây là một ví dụ ứng dụng cụ thể nhé :
Xuất đồng thời ra 4 số 1234 ra 4 led :


// dientubackan.blogspot.com
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
// khai bao cac led de quet
sbit led1 = P3^0;
sbit led2 = P3^1;
sbit led3 = P3^2;
sbit led4  = P3^3;
// khai bao ma led 7 doan    ktot chung
unsigned char mang[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
// chuong trinhd delay
void delay(void)
    {
   TMOD=0x01;
   TH0=0xFC;
   TL0=0x18;
   TR0=1;
   while(!TF0);
   TF0=0;
   TR0=0;
   }
// chuong trinh xuat dong thoi ra 4 led cac so 1.2.3.4
void main(void)
    {
   while(1)
      {
      led1=0;
      P2=0x06;// so1
      delay();
      led1=1;
      P2=0x00;
      led2=0;
      P2=0x5B;    //so 2
      delay();
      led2=1;
      P2=0x00;
      led3=0;
      P2=0x4F;   // so3
      delay();
      led3=1;
      P2=0x00;
      led4=0;
      P2=0x66;   // so4
      delay();
      led4=1;
      P2=0x00;



      }
   }
hình ảnh :

Enlarge this image

file mô phỏng :
handinhand
// Nguyên lý này cũng áp dụng cho bai đếm sản phẩm :

// dientubackan.blogspot.com
#include<reg52.h>
#include<stdio.h>
#include<math.h>
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
unsigned char M[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
unsigned char donvi,chuc,tram,nghin ;
long num,j;
void tre(void)
   {
   TMOD=0x10;
   TH1=0xD8;
   TL1=0xEF;
   TR1=1;
   while(!TF1) ;
   TF1=0;
   TR1=0;
   }
void hienthi(void)
     {
    nghin=num/1000;
    tram=(num%1000)/100;
    chuc=((num%1000)%100)/10;
    donvi=((num%1000)%100)%10;
      led1=1;
      P2=M[donvi];
      tre();
      led1=0;
      P2=0xFF;
      led2=1;
      P2=M[chuc];
      tre();
      led2=0;
      P2=0xFF;
      led3=1;
      P2=M[tram];
      tre();
      led3=0;
      P2=0xFF;
      led4=1;
      P2=M[nghin];
      tre();
      led4=0;
      P2=0xFF;

     
    }
void main(void)
    {
   IE=0x84;
   IT1=1;// ngat theo suon am
   num=0;
   while(1)
     {
     hienthi();

     }
   }
void ngatngoai_1(void) interrupt 2
   {
   ++num;
   }
file mô phỏng:


dientubackan.blogspot.com
// Một trong những kỹ thuật quét khác cũng hay được dùng đó là sử dụng IC giải mã 74LS47
Xem datasheet của nó như sau:


Do đó dựa vào bảng chân lý của nó ta có thể vẽ hình như sau dùng Ktot chung:

Enlarge this image Click to see fullsize



#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
unsigned char mang[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
void delay(int t)
    { int i;
   for(i=0;i<t;i++);
   }
void main(void)
    {
   int i;
   for(i=0;i<10;i++)
      {
      P2=mang[i];
      delay(30000);
      }
   }


Phù
                   
Xong rồi

0 nhận xét:

Đăng nhận xét

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Design Blog, Make Online Money