Bài 03: LẬP TRÌNH HIỆU ỨNG LED VỚI 8051
I. Sơ đồ mạch
Các bạn vẽ mạch nguyên lí như sau:
II. Viết chương trình
1. Khai báo thư viện
Đầu tiên phải thêm thư viện <regx52.h> vào project. Thư viện này chứa các cài đặt cấu hình vi điều khiển 89C52
2. Hàm main()
Đây là hàm chính của chương trình, trong hàm chính, tất cả các hàm con sẽ chạy trong vòng lặp while(1). Vòng lặp while(1) cho phép các hàm trong nó sẽ chạy mãi mãi miễn là được cấp nguồn.
2. Hàm main()
Đây là hàm chính của chương trình, trong hàm chính, tất cả các hàm con sẽ chạy trong vòng lặp while(1). Vòng lặp while(1) cho phép các hàm trong nó sẽ chạy mãi mãi miễn là được cấp nguồn.
void main()
{
while(1)
{
}
}
3. Hàm Delay()
Hàm này được dùng để tạo một độ trễ tùy ý. Nó sẽ tạm dừng việc thực thi mã chính trong một thời gian khi nó được gọi.
Vòng lặp for đầu tiên sẽ chạy với số lượng thời gian tùy thuộc vào tham số được truyền cho nó và vòng lặp thứ hai chạy 125 lần cho mỗi lần lặp của lần đầu tiên. Có một cách khác để tạo độ trễ thời gian bằng cách sử dụng bộ định thời bên trong vi điều khiển( mình sẽ giới thiệu sau).
Vòng lặp for đầu tiên sẽ chạy với số lượng thời gian tùy thuộc vào tham số được truyền cho nó và vòng lặp thứ hai chạy 125 lần cho mỗi lần lặp của lần đầu tiên. Có một cách khác để tạo độ trễ thời gian bằng cách sử dụng bộ định thời bên trong vi điều khiển( mình sẽ giới thiệu sau).
void Delay(int time)
{
int i,j;
for(i=0; i<time; i++)
for(j=0; j<125; j++);
}
4. Lập trình điều khiển theo Port của vi điều khiển
8051 là vi điều khiển 8 bit, chúng ta có thể xuất dữ liệu output theo cả Port với điều kiện các Pin cùng chung 1 Port. Các bạn chỉ cần gán dữ liệu cho Port đó, ví dụ:
P2=0x55;
0x55 là mã thập lục phân, đổi ra nhị phân dữ liệu trên Port 2 như sau: 01010101 với chiều tương ứng từ P2.7 đến P2.0.
Một số toán tử dùng để xử lí các Bit:
- Toán tử | và &
0 | 0 = 0
0 | 1 = 1
1 | 1 = 1
0 & 0 = 0
0 & 1 = 0
1 & 1 = 1
Đây là 2 toán tử hay được sử dụng để tác động đến một vài bit trong một Port. Toán tử | thường được dùng để đưa một Pin lên mức 1, toán tử & thường được dùng để đưa một Pin về mức 0. Ví dụ:
P2 = P2 | 0x01; /*Đưa pin P2.0 lên mức 1*/
P2 = P2 & 0xFE; /*Đưa pin P2.0 về mức 0*/
- Toán tử >> và <<. Đây là 2 toán tử dùng để dịch bit. Các bạn xem ví dụ sau để hiểu rõ 2 toán tử này:
0x01 << 1 = 0x02; /*00000001 --> 00000010*/
0x10 >> 1 = 0x08; /*00010000 --> 00001000*/
Sau khi nắm được các toán tử này, các bạn có thể dùng để lập trình những hiệu ứng nháy led khác nhau như: sáng dần, tắt dần, nhỏ giọt,....
5, Chương trình mẫu
#include <regx52.h>
#define LED_PORT P2
void Delay();
void Fn_Nhap_Nhay();
void Fn_Tat_dan();
void Fn_Sang_dan();
void Fn_Lan_luot();
void Fn_Nho_giot();
void main()
{
while(1)
{
Fn_Nhap_Nhay();
}
}
void Delay(int time)
{
int i,j;
for(i=0; i<time; i++)
for(j=0; j<125; j++);
}
void Fn_Nhap_Nhay()
{
LED_PORT = 0x55;
while(1)
{
LED_PORT = ~LED_PORT;
Delay(200);
}
}
void Fn_Tat_dan()
{
unsigned char i;
LED_PORT = 0xff;
for (i=0; i<8; i++)
{
LED_PORT=LED_PORT<<1;
Delay(200);
}
}
void Fn_Sang_dan()
{
unsigned char i;
LED_PORT = 0x00;
for (i=0; i<8; i++)
{
LED_PORT = (LED_PORT<<1)|1;
Delay(200);
}
}
void Fn_Lan_luot()
{
unsigned char i;
LED_PORT = 0x00;
for (i=0; i<8; i++)
{
LED_PORT = 0x01<<i;
Delay(200);
}
}
void Fn_Nho_giot()
{
unsigned char i, j, K = 0x00;
LED_PORT = 0x00;
for (i=7; i>=0; i--)
{
for (j=0; j<=i; j++)
{
LED_PORT = (0x01 <<j)|K;
Delay(200);
}
K = LED_PORT;
}
}