Thứ Sáu, 8 tháng 7, 2016

Bài 7: Giao tiếp với LED 7 thanh sử dụng 8051

Trước hết mình xin trình bày sơ qua về cấu tạo và nguyên lý hoạt động của LED 7 thanh như sau:


Led 7 đoạn được sử dụng khi các dãy số không đòi hỏi quá phức tạp, chỉ cần hiện thị số là đủ, chẳng hạn led 7 đoạn được dùng để hiển thị nhiệt độ phòng, trong các đồng hồ treo tường bằng điện tử, hiển thị số lượng sản phẩm được kiểm tra sau một công đoạn nào đó…

Cấu trúc và mã hiện thị dữ liệu của LED 7 thanh:

-Dạng form chuẩn:
-Dạng anot chung:
-Dạng cathode chung:
Điều khiển LED 7 thanh thật ra là ta điều khiển 8 led đơn cấu tạo nên nó( LED thứ 8 là dấu chấm), tạo thành các giá trị dữ liệu mà chúng ta mong muốn. Do vậy ta cần biết được mã hexa của từng kí tự để khi lập trình chúng ta được dễ dàng hơn.

Đối với dạng led anode chung, chân COM phải có mức logic là 1, vì vậy chân COM sẽ được nối lên nguồn, các LED sẽ sáng khi các chân a-f, dp ở mức logic là 0. Ta có bảng sau:

Chữ số
Mã Logic gfedcba
Mã hexa
0
1000000
0x40
1
1111001
0xF9
2
0100100
0x24
3
0110000
0x30
4
0011001
0x19
5
0010010
0x12
6
1000010
0x02
7
1111000
0xF8
8
0000000
0x00
9
0010000
0x10


Đối với dạng Cathode chung, chân COM sẽ có mức logic 0 nên được nối đất, các chân a-f, dp ở mức logic 1 thì LED sẽ sáng. Ta có bảng như sau:

   
Chữ số
Mã logic gfedcba
Mã hexa
0
0111111
0x3F
1
0000110
0x6
2
1011011
0x5B
3
1001111
0x4F
4
1100110
0x66
5
1101101
0x6D
6
1111100
0x7c
7
0000111
0x7
8
1111111
0x7F
9
1101111
0x6F



Để giao tiếp được với LED 7 thanh chúng ta cần làm những thao tác sau:

+ Tạo void delay()
+ Khai báo thư viện cho các chữ số 0-9.
+ Tạo ra một vòng lặp cho phép đưa ra một PORT nào đó giá trị của các chữ số.

Mạch nguyên lý sử dụng led 7 thanh dương chung như sau:

Code như sau:

#include <reg51.h>
#include <stdio.h> 

delay(int time) // Ham delay
{
int i,j;
  for(i=0;i<time;i++)
   for(j=0;j<1275;j++);
}

void main()
{
char num[]={0x40,0xF9,0x24,0x30,0x19,0x12,0x02,0xF8,0x00,0x10}; // Gia tri hex tuong ung cua cac chu so tu 0-9
int c;
while(1)
{
for(c=0;c<10;c++) // cho c chay tu 0 den 9.
{
P2=num[c]; 
delay(200); // delay 0.2s
}
}
}

Mạch nguyên lý sử dụng led 7 thanh âm chung như sau:
Code như sau:

#include <reg51.h>
#include <stdio.h>

delay(int time) // Ham delay()
{
int i,j;
  for(i=0;i<time;i++)
   for(j=0;j<1275;j++);
}

void main()
{
char num[]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x3D,0x7,0x7F,0x6F}; // Gia tri Hex tuong ung tu 0-9
int c;
while(1)
{
for(c=0;c<10;c++)
{
P2=num[c]; 
delay(200);
}
}
}

Như vậy chúng ta đã hình thành nên cơ sở để dụng LED 7 thanh cho nhiều mục đích khác như điều khiển LED 7 thanh bằng KEY, đồng hồ số, đo nhiệt độ.....


Bài tới mình xin hướng dẫn các bạn điều khiển LED 7 thanh bằng KEY, rất mong được các bạn theo dõi và ủng hộ!

Thứ Ba, 5 tháng 7, 2016

Bài 6. Giao tiếp với Key đơn

Như tiêu đề của bài, lần này chúng ta sẽ tương tác với Key đơn sử dụng họ vi điều khiển 8051.

Key đơn thật ra là tập hợp các nút ấn, nhưng có cách nối đặc biệt để đảm bảo giá trị khởi điểm của các chân ra ở trạng thái bình thường sẽ luôn ở mức cao, khi nút ấn đượg ấn xuống thì sẽ xuống trạng thái thấp.

Mục đích của bài này là khi ấn một nút ấn thì có một LED tương ứng sáng trong 1s rồi tắt trong khi các LED khác vẫn không sáng. Để làm được yêu cầu này trước hết ta cần khai báo tên LED, tên Key tương ứng với các chân trên vi điều khiển( Lưu ý nếu các bạn dùng P0 làm chân I/O thì cần lắp thêm điện trở kéo nhé) như sau:

sbit LED0=P3^0; // Dinh nghia cho chan p3.0 co ten la LED0
sbit LED1=P3^1;
sbit LED2=P3^2;
sbit LED3=P3^3;

sbit KEY0=P2^0; // Dinh nghia cho chan p2.0 co ten la KEY0
sbit KEY1=P2^1;
sbit KEY2=P2^2;
sbit KEY3=P2^3;

Hàm delay() được phát biểu như sau:

void delay(unsigned int time )
{
    unsigned int i;
   unsigned int j;

  for( i=0; i<time; i++ )
  for( j=0; j<1275; j++ );
}

Mình xin khái quát qua thuật toán như sau:

+ Khai báo trạng thái ban đầu là key và led đều mức cao, tức chưa ấn key và LED đều tắt.
+ Khi ấn Key0 thì LED0 sáng trong 1s rồi tắt, 3 đèn còn lại đều tắt.
+ Khi ấn Key1 thì LED1 sáng trong 1s rồi tắt, 3 đèn còn lại đều tắt.
+ Khi ấn Key2 thì LED2 sáng trong 1s rồi tắt, 3 đèn còn lại đều tắt.
+ Khi ấn Key3 thì LED3 sáng trong 1s rồi tắt, 3 đèn còn lại đều tắt.

Để làm được yêu cầu như trên, chúng ta cần sử dụng hàm if(điều kiện)...Mình xin trích qua code main như sau:

void main(void)
 {
   KEY0=KEY1=KEY2=KEY3=1;  // GIA TRI BAN DAU CUA KEY DON
   LED0=LED1=LED2=LED3=1; // TAT CA LED DEU TAT
   while (1)
   {
      if(KEY0==0) // KEY0 duoc nhan
      {
LED0=0; // LED0 sang
delay(1000); // 1s delay
LED0=1=LED1=LED2=LED3; // tat ca led cung tat
}
      if(KEY1==0)
      {
LED1=0;
delay(1000);
LED1=LED2=LED3=LED0=1;
}
      if(KEY2==0)
      {
LED2=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
      if(KEY3==0)
      {
LED3=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
}
   
 }
Mạch nguyên lý như hình sau:


Từ những dòng code trên, chúng ta có thể mở rộng ra trong nhiều trường hợp khác, ví dụ như ấn key0 thì led1 sáng hoặc cùng một lúc 3 leds sáng ... trường hợp khác là ấn cùng lúc 2 key thì sẽ như thế nào. Mình xin giới thiệu các bạn dòng code cho các yêu cầu sau:
+ ấn 1 key thì một led sáng trong 1s.
+ ấn 2 key thì 2 led sáng trong 1s.
+ ấn 3 key thì 3 led sáng trong 1s.
+ ấn 4 key thì 4 led sáng trong 1s.

#include <reg51.h>
#include <stdio.h>

sbit LED0=P3^0;
sbit LED1=P3^1;
sbit LED2=P3^2;
sbit LED3=P3^3;

sbit KEY0=P2^0;
sbit KEY1=P2^1;
sbit KEY2=P2^2;
sbit KEY3=P2^3;

void delay(unsigned int time )
{
    unsigned int i;
   unsigned int j;

  for( i=0; i<time; i++ )
  for( j=0; j<1275; j++ );
}

void main(void)
 {
   KEY0=KEY1=KEY2=KEY3=1;  // GIA TRI BAN DAU CUA KEY DON
   LED0=LED1=LED2=LED3=1; // TAT CA LED DEU TAT
   while (1)
   {
      if(KEY0==0)
      {
LED0=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
      if(KEY1==0)
      {
LED1=0;
delay(1000);
LED1=LED2=LED3=LED0=1;
}
      if(KEY2==0)
      {
LED2=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
      if(KEY3==0)
      {
LED3=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
      if(KEY0=KEY1==0)
      {
LED0=LED1=0;
delay(1000);
LED0=LED1=LED2=LED3=1;

}
      if(KEY2=KEY1==0)
      {
LED2=LED1=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
      if(KEY2=KEY3==0)
      {
LED2=LED3=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
      if(KEY0=KEY1=KEY2=0)
      {
LED0=LED1=LED2=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
      if(KEY3=KEY1=KEY2=0)
      {
LED1=LED2=LED3=0;
delay(1000);
LED0=LED1=LED2=LED3=1;
}
}
   
 }
Bài tiếp theo mình xin giới thiệu với các bạn về KEYPAD MATRIX, đây là một dạng nâng cao của KEY đơn, keypad matrix có rất nhiều ứng dụng trong thực tế, ví dụ như mạch khóa điện tử, máy tính mini, .....
Rất mong được các bạn ủng hộ!