Lập Trình Nháy LED Đơn với 8051

Ở bài viết này, chúng ta sẽ hướng dẫn cách lập trình điều khiển Output cơ bản để nháy LED đơn. Bạn sẽ thực hành vẽ mạch sau đây trong Proteus:

LED Circuit

I. Lập Trình Điều Khiển Từng Pin của Vi Điều Khiển

Vi điều khiển 8051 cho phép chúng ta tác động lên từng chân IO của nó. Để sử dụng tính năng này, chúng ta có thể sử dụng khai báo sbit để định nghĩa tên cho chân chúng ta muốn sử dụng. Cú pháp khai báo sbit như sau:

sbit LED = P1^0;

Ở đây, chân P1.0 được định nghĩa có tên là LED. Khi bạn gán giá trị 0 cho chân đó, đầu ra sẽ ở mức 0V. Khi bạn gán giá trị 1 cho chân đó, đầu ra sẽ có mức điện áp là 5V.

Ví dụ, trong chương trình sau, chúng ta sử dụng định nghĩa sbit để điều khiển chân P1.0 của vi điều khiển 8051, thực hiện chức năng nhấp nháy một con LED:

#include 
sbit LED = P1^0;

void Fn_Delay (unsigned int vrui_Time);

int main(){
    while(1) {
        LED = 0;
        Fn_Delay(50000);
        LED = 1;
        Fn_Delay(50000);
    }
    return 0;
}

void Fn_Delay (unsigned int vrui_Time){
    while(vrui_Time -);
}

II. Lập Trình Điều Khiển Theo Port của Vi Điều Khiển

Ngoài điều khiển từng chân, chúng ta cũng có thể xuất dữ liệu output cho cả Port trên vi điều khiển 8051. Vi điều khiển 8051 là một vi điều khiển 8 bit và một Port được hình thành từ các chân IO đó. Để can thiệp vào một Port, bạn chỉ cần gán dữ liệu mong muốn cho tên Port đó. Ví dụ như sau:

P2 = 0x55;

Với câu lệnh trên, chúng ta đã xuất dữ liệu trên Port 2 như sau: 0-1-0-1-0-1-0-1, tương ứng với các chân từ P2.7 đến P2.0.

Giới thiệu về toán tử |&:

  • Toán tử | là toán tử OR bit.
  • Toán tử & là toán tử AND bit.

Dưới đây là bảng giá trị của các phép tính OR và AND:

0 | 0 = 0
0 | 1 = 1
1 | 1 = 1
0 & 0 = 0
0 & 1 = 0
1 & 1 = 1

Đây là hai toán tử rất hữu ích khi bạn muốn thao tác trên một vài bit trong một Port mà bạn muốn xuất dữ liệu.

Còn hai toán tử <<>> được sử dụng để dịch bit. Dưới đây là hai ví dụ để hiểu rõ hơn về hai toán tử này:

0x01 << 1 = 0x02; //00000001 -> 00000010
0x10 >> 1 = 0x08; //00010000 -> 00001000

Sau đây là một ví dụ để tạo hiệu ứng LED chạy từ trên xuống và lặp lại:

int main(){
    unsigned char i;
    while(1){
        for (i = 0; i < 8; i++){
            P1 = 0x01 << i;
            Fn_Delay(5000);
        }
    }
    return 0;
}

Và một ví dụ khác để tạo hiệu ứng LED chạy từ dưới lên và lặp lại:

int main(){
    unsigned char i;
    while(1){
        for (i = 0; i < 8; i++){
            P1 = 0x80 >> i;
            Fn_Delay(5000);
        }
    }
    return 0;
}

Sử dụng hàm con:

Dưới đây là một hàm con để làm sáng dần 8 LED, sử dụng mảng:

void nhayDanPhai(){
    int i;
    char sangDan[]={0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC,0xFE, 0xFF};
    for(i = 0; i<8; i++){
        P1 = sangDan[i];
        Fn_Delay(100000);
    }
    P1 = 0x00;
}

Hàm con sau đây làm sáng dần 8 LED, sử dụng vòng lặp:

void nhayDanTrai(){
    int i;
    P1 = 0x01;
    for(i = 0; i<8; i++){
        P1= P1|(0x01<

Hàm con tiếp theo làm sáng nhỏ giọt cho 8 LED:

void sangNhoGiot(){
    int i,j, K = 0x00;
    for(i = 7; i>=0; i--) {
        for(j =0; j<=i ; j++ ) {
            P1 = (0x01 <

Cảm ơn bạn đã đọc bài viết của mình. Nhớ like và đăng ký kênh Youtube của mình để xem nhiều video hướng dẫn bổ ích!

FEATURED TOPIC

hihi