BÀI 04: LẬP TRÌNH LED 7 ĐOẠN VỚI 8051

tháng 4 15, 2018
BÀI 04: LẬP TRÌNH LED 7 ĐOẠN VỚI 8051


I. Cơ bản về LED 7 đoạn
Trong các thiết bị, để báo trạng thái hoạt động của thiết bị đó cho người sử dụng với thông số chỉ là các dãy số đơn thuần, thường người ta sử dụng "LED 7 đoạn". Chẳng hạn khi muốn hiển thị nhiệt độ phòng, hiển thị số lượng sản phẩm được kiểm tra sau một công đoạn nào đó...

1. Cấu tạo
LED 7 đoạn có cấu tạo bao gồm 7 led đơn có dạng thanh xếp theo hình dạng số 8 và có thêm một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở góc dưới. 8 led đơn trên LED 7 đoạn có Anode(cực +) hoặc Cathode(cực -) được nối chung với nhau vào một điểm. Nếu LED 7 đoạn có Anode(cực +) chung, điểm chung này được nối với VCC, led chỉ sáng khi tín hiệu điều khiển ở các chân điều khiển trạng thái sáng tắt của các led đơn ở mức 0. Nếu LED 7 đoạn có Cathode(cực -) chung, điểm chung này được nối với Ground (hay Mass), led chỉ sáng khi tín hiệu điều khiển ở các chân điều khiển trạng thái sáng tắt của các led đơn ở mức 1.
Vì LED 7 đoạn chứa bên trong các led đơn, do đó khi kết nối cần đảm bảo dòng qua mỗi led đơn trong khoảng 10mA-20mA để bảo vệ led. Nếu kết nối với nguồn 5V có thể hạn dòng bằng điện trở 330 Ohm trước các chân nhận tín hiệu điều khiển. Sơ đồ vị trí các led được trình bày như hình dưới:


2. Kết nối với vi điều khiển
Ngõ nhận tín hiệu của led 7 đoạn có 8 đường, vì vậy có thể dùng 1 Port nào đó của vi điều khiển để điều khiển để điều khiển led 7 đoạn . Như vậy led 7 đoạn nhạn một dữ liệu 8 bit từ vi điều khiển để điều khiển hoạt động của từng led đơn trong nó, dữ liệu được xuất ra điều khiển led 7 đoạn được gọi là "mã hiển thị led 7 đoạn". Có hai kiểu mã hiển thị led 7 đoạn: mã dành cho led 7 đoạn Anode chung và mã dành cho led 7 đoạn Cathode chung. Chẳng hạn, để hiển thị số 1 cần làm cho các led ở vị trí b và c sáng, nếu sử dụng led 7 đoạn có Anode chung thì phải  đặt vào hai chân b và  c điện áp 0V (mưc 0), các chân còn lại phải đặt lên mức 5V(mức 1), nếu sử dụng led 7 đoạn Cathode chung thì hoàn toàn ngược lại.
Nếu kết nối mỗi một Port của Vi điều khiển với 1 led 7 đoạn thì tối đa kết nối được 4 led 7 đoạn. Mặt khác nếu kết nối như trên sẽ hạn chế khả năng thực hiện các công việc khác của Vi điều khiển. Cho nên cần phải kết nối, điều khiển nhiều led 7 đoạn với số lượng chân điều khiển từ vi điều khiển càng ít càng tốt. Có hai giải pháp: một là sử dụng các IC chuyên dụng cho việc hiển thị led 7 đoạn, hai là kết nối nhiều led 7 đoạn vào cùng một đường xuất tín hiệu hiển thị.

3. Bảng mã hiện thị LED 7 đoạn
Để thuận tiện, phần cứng được kết nối với 1 Port bất kì của vi điều khiển theo thứ tự sau: Px.0 nối chân a, Px.1 nối chân b, lần lượt cho đến chân Px.7 nối chân h.
Dữ liệu xuất ra có dạng nhị phân sau: hgfedcba

Bảng mã hiển thị led 7 đoạn Anode chung

                        Số hiển thị                 Mã  nhị phân          Mã thập lục phân                 
                          dp  g  f   e   d  c  b  a                      
                         0                              1  1  0  0  0  0  0  0                                     C0
                         1                              1  1  1  1  1  0  0  1                                     F9
                         2                              1  0  1  0  0  1  0  0                                     A4
                         3                              1  0  1  1  0  0  0  0                                     B0
                         4                              1  0  0  1  1  0  0  1                                     99
                         5                              1  0  0  1  0  0  1  0                                     92
                         6                              1  1  0  0  0  0  1  0                                     82
                         7                              1  1  1  1  1  0  0  0                                     F8
                         8                              1  0  0  0  0  0  0  0                                     80
                         9                              1  0  0  1  0  0  0  0                                     90






Bảng mã hiển thị led 7 đoạn Cathode chung

                       Số hiển thị                 Mã nhị phân            Mã thập lục phân                 
                         dp  g  f   e   d  c  b  a                     
                         0                              0  0  1  1  1  1  1  1                                     3F
                         1                              0  0  0  0  0  1  1  0                                     06
                         2                              0  1  0  1  1  0  1  1                                     5B
                         3                              0  1  0  0  1  1  1  1                                     4F
                         4                              0  1  1  0  0  1  1  0                                     66
                         5                              0  1  1  0  1  1  0  1                                     6D
                         6                              0  1  1  1  1  1  0  1                                     7D
                         7                              0  0  0  0  0  1  1  1                                     07
                         8                              0  1  1  1  1  1  1  1                                     7F
                         9                              0  1  1  0  1  1  1  1                                     6F


II. Điều khiển LED 7 thanh
1. Điều khiển 1 LED 7 thanh
  Hãy vẽ mạch mô phỏng như hình(ở đây dùng LED 7 thanh Anode chung).



 Dưới đây là chương chình điều khiển led hiển thị từ 0 đến 9 và ngược lại.



#include <regx52.h>
#define LED_PORT P2
             /* 0   1   2   3   4   5   6   7   8   9  */
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
void Delay(int time);
void tangdan();
void giamdan();

void main()
{
 while(1)
 {
  tangdan();
  giamdan();
 }
}

void Delay(int time)
{
 int i,j;
  for(i=0; i<time; i++)
  for(j=0; j<125; j++); 
}

void tangdan(unsigned int i)
{
 for (i=0; i<10; i++)
 {
  LED_PORT = Code7Seg[i];
  Delay(1000);
 }
}

void giamdan(unsigned int i)
{
 for (i=9; i>=0; i--)
 {
  LED_PORT = Code7Seg[i];
  Delay(1000);
 }
}
2. Điều khiển 2 LED 7 thanh đếm 00 -> 99


Ở bài toán điều khiển LED 7 thanh chúng ta có thể áp dụng theo bài toán bước 1 nối mỗi con LED 7 thanh vào 8 chân data độc lập. Tuy nhiên việc này sẽ gây lãng phí số chân điều khiển LED và limit số LED có thể điều khiển (4 chiếc). Với số LED tăng lên đủ lớn số chân cần cũng tăng lên rất nhiều. Để giải quyết bài này có một kỹ thuật nêu ra là kỹ thuật “Quét LED”.  
Kỹ thuật Quét LED thực hiện theo nguyên tắc một thời điểm chỉ bật một LED 7 thanh với dữ liệu nó cần hiển thị, các LED còn lại được tắt. Việc quét LED thực hiện luôn phiên sáng các LED với yêu cầu trên. Có một hiện tượng hay xảy ra với những người mới thực hiện lập trình quét LED là hiện tượng “bóng ma” đó là hiện tượng xuất hiện các bóng mờ LED không mong muốn do quá trình điều khiển. Quá trình quét LED chuẩn được thực hiện theo các bước sau:
1.     Xuất ra mã hiển thị.
2. Cấp nguồn cho LED muốn hiển thị.
3. Trễ 1 khoảng thời gian để duy trì sáng.
4. Cắt nguồn LED vừa hiển thị.
Mạch mô phỏng như sau:


Chương trình điều khiển 2 LED 7 thanh



#include<REGX52.H> 
sbit LED1 = P3^0;
sbit LED2 = P3^1;
#define LED_PORT P2
                                                /* 0     1    2    3    4    5    6    7    8    9  */
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
void Delay(int time);

void main (void)
{
 unsigned char i;
 unsigned int  j;
 LED1 = 0;
 LED2 = 0;
 while(1)
 {
  /* Hien thi so i chay tu 00 den 99 */
  for(i = 0; i < 100; i++)
  {
   /* Voi moi so i hien thi 200 lan */
   for (j = 0; j < 200; j++)
    {
     /* Hien thi phan chuc cua so */
     LED_PORT = Code7Seg[i/10];
     LED1 = 1;
     Delay(100);
     LED1 = 0;
     /* Hien thi phan don vi cua so */
     LED_PORT = Code7Seg[i%10];
     LED2 = 1;
     Delay(100);
     LED2 = 0;
     /* Ket thuc hien thi phan don vi */
    }
  }
 }
}

void Delay(int time)
{
 while(time--);
}

Trên đây chúng ta đã thực hiện theo quy trình 4 bước quét LED:
P2 = LED7SEG[i/10]; // Xuất dữ liệu LED
LED1 = 1;           // Bật LED hiển thị
Fn_Delay(100);      // Trễ một khoảng thời gian
LED1 = 0;           // Tắt LED đang hiển thi
Ở đây ngoài vòng for thực hiện đếm từ 00-99 chúng ta cần thêm một vòng for cho biến j chạy từ 0-200 để đảm bảo mỗi số được hiển thị trong một khoảng thời gian đủ lâu để chúng ta có thể nhìn thấy. 

3. Điều khiển 4 LED 7 thanh đếm từ 0000->9999

 Mạch mô phỏng như sau:



Chương trình điều khiển 4 LED 7 thanh.


#include<REGX52.H>
sbit LED1 = P3^0;
sbit LED2 = P3^1;
sbit LED3 = P3^2;
sbit LED4 = P3^3;
#define LED_PORT P2
                                                   /* 0     1    2    3    4    5    6    7    8    9  */
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
void Delay (unsigned int Time);

void main (void)
{
 unsigned char i;
 unsigned int  j;
 LED1 = 0;
 LED2 = 0;
 LED3 = 0;
 LED4 = 0;
 while(1)
 {
  /* Hien thi so i chay tu 0000 den 9999 */
  for(i = 0; i < 10000; i++)
  {
   /* Voi moi so i hien thi 400 lan */
   for (j = 0; j < 400; j++)
   {
    /* Hien thi phan nghin cua so */
    LED_PORT = Code7Seg[i/1000];
    LED1 = 1;
    Delay(100);
    LED1 = 0;
 
    /* Hien thi phan tram cua so */
    LED_PORT = Code7Seg[(i%1000)/100];
    LED2 = 1;
    Delay(100);
    LED2 = 0;

    /* Hien thi phan chuc cua so */
    LED_PORT = Code7Seg[(i%100)/10];
    LED3 = 1;
    Delay(100);
    LED3 = 0;
    
    /* Hien thi phan don vi cua so */
    LED_PORT = Code7Seg[i%10];
    LED4 = 1;
    Delay(100);
    LED4 = 0;
   }
  }
 }
}

void Delay (unsigned int time)
{
 while(time--);
} 
Chúc các bạn thành công!
Next Article
« Prev Post
Previous Article
Next Post »

Disqus
Tambahkan komentar Anda

Không có nhận xét nào