Giới thiệu dự án

Trong tiến trình phát triển của kỹ thuật điện tử và tự động hóa, hệ thống nhúng (Embedded Systems) đóng vai trò then chốt trong việc tối ưu hóa hiệu năng, giảm thiểu chi phí sản xuất và nâng cao độ tin cậy của các thiết bị công nghiệp lẫn điện dân dụng. Theo các thống kê kỹ thuật trong ngành điều khiển, họ vi điều khiển 8-bit, đặc biệt là kiến trúc kinh điển MCS-51 (do Intel khởi xướng và phát triển rộng rãi bởi Atmel, Philips, Dallas), từng chiếm hơn 60% thị phần ứng dụng điều khiển chuyên biệt nhờ kiến trúc phần cứng linh hoạt, giá thành tối ưu và hệ sinh thái hỗ trợ phong phú.

Tuy nhiên, rào cản lớn nhất khi triển khai các hệ thống dựa trên nền tảng 8051 truyền thống là sự phụ thuộc nặng nề vào Hợp ngữ (Assembly Language). Việc lập trình bằng Assembly đòi hỏi kỹ sư phải nắm rõ từng thanh ghi, quản lý ô nhớ thủ công, dẫn đến chu kỳ phát triển sản phẩm kéo dài, mã nguồn khó bảo trì, khó tái sử dụng và dễ phát sinh lỗi khi mở rộng quy mô hệ thống. Đề tài "Lập trình C cho họ vi điều khiển 8051" được thực hiện nhằm giải quyết triệt để bài toán này bằng cách chuẩn hóa phương pháp phát triển phần mềm nhúng thông qua ngôn ngữ C tiêu chuẩn ANSI, kết hợp môi trường tích hợp Keil Software µVision 2 trên hai dòng vi điều khiển trọng tâm là Atmel AT89C51AT89C2051, cùng bộ xử lý nâng cao Philips P89LPC935.

+-----------------------------------------------------------------------+
|                 HỆ THỐNG PHÁT TRIỂN NHÚNG 8051 / C51                  |
|                                                                       |
|  +--------------------+   +-------------------+   +----------------+  |
|  |  Mã nguồn C ANSI   |-->|   Trình biên dịch  |-->| Mã máy / HEX   |  |
|  |  (C51 Extensions)  |   |    Keil C51 v7    |   | (Flash PEROM)  |  |
|  +--------------------+   +-------------------+   +----------------+  |
|            |                        |                     |           |
|            v                        v                     v           |
|  +--------------------+   +-------------------+   +----------------+  |
|  | Cấu trúc phần cứng |<--| Trình gỡ lỗi/mô   |<--| Ứng dụng thực  |  |
|  | AT89C2051 / 89C51  |   | phỏng µVision IDE |   | tế: MEASURE    |  |
|  +--------------------+   +-------------------+   +----------------+  |
+-----------------------------------------------------------------------+

Mục tiêu cụ thể của dự án

  1. Khảo sát chuyên sâu phần cứng: Phân tích kiến trúc vi điều khiển 8-bit AT89C51 (40 chân) và biến thể thu nhỏ AT89C2051 (20 chân) với bộ nhớ Flash PEROM 2KB/4KB, 128 Bytes RAM nội, hệ thống ngắt 2 mức ưu tiên và bộ so sánh tương tự tích hợp (On-chip Analog Comparator).
  2. Xây dựng chu trình phát triển với Keil µVision 2: Tối ưu hóa chuỗi công cụ (Toolchain) gồm trình biên dịch C51, trình hợp ngữ A51, bộ liên kết/định vị BL51/LX51 và bộ quản lý thư viện LIB51.
  3. Hiện thực hóa giải thuật điều khiển ngoại vi: Thiết kế cấu trúc điều khiển hiển thị (LED đơn, LED 7 đoạn, LED ma trận) và xử lý giao tiếp nối tiếp UART song công (Full-duplex).
  4. Phát triển hệ thống thu thập dữ liệu và đo lường từ xa (MEASURE): Ứng dụng trên vi điều khiển P89LPC935 hỗ trợ chuyển đổi ADC/DAC, tích hợp ngắt Timer định thời chính xác từ 1ms đến 60 phút và kịch bản mô phỏng tín hiệu ảo (VTREGs).

Phạm vi và giới hạn kỹ thuật

  • Phạm vi: Ứng dụng tập trung vào kiến trúc vi điều khiển 8-bit MCS-51, lập trình bằng C kết hợp mã khởi động STARTUP.A51, thực thi mô phỏng và nạp nạp bộ nhớ Flash.
  • Giới hạn: Chip AT89C2051 không hỗ trợ bus mở rộng ngoài (không hỗ trợ lệnh MOVX với bộ nhớ ngoài), kích thước ngăn xếp (Stack Depth) giới hạn trong 128 Bytes RAM nội, không gian địa chỉ mã tối đa 2KB (từ 000H đến 7FFH).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Trước khi ngôn ngữ C được tối ưu hóa cho kiến trúc vi điều khiển 8-bit, các kỹ sư nhúng phải đối mặt với nhiều thách thức lớn về thời gian và độ phức tạp mã nguồn.

Tiêu chí đánh giá Hợp ngữ 8051 (Assembly A51) Lập trình C cho 8051 (Keil C51) Vi điều khiển thay thế (PIC 16F84 / Motorola 68HC11)
Thời gian phát triển Rất chậm; quản lý thanh ghi thủ công Nhanh hơn 50% - 60%; trừu tượng hóa phần cứng Trung bình; phụ thuộc tập lệnh đặc thù
Khả năng tái sử dụng Kém; gắn liền với phần cứng cụ thể Rất cao; chuyển đổi linh hoạt giữa các dòng chip Trung bình; yêu cầu viết lại thư viện
Dung lượng mã sinh ra Tối ưu tuyệt đối (100%) Tăng 15% - 20% dung lượng mã so với ASM Tùy thuộc vào trình biên dịch C thương mại
Gỡ lỗi và mô phỏng Khó khăn, dễ tràn ngăn xếp ngầm Trực quan qua Watch Window, Call Stack, VTREGs Cần mạch nạp/gỡ lỗi phần cứng (In-Circuit Debugger)

Yêu cầu hệ thống theo mô hình MoSCoW

  • Must have (Bắt buộc): Điều khiển chính xác các chân I/O (Port 1, Port 3), cấu hình bộ định thời Timer 0/1 ở chế độ 16-bit, quản lý bản đồ thanh ghi chức năng đặc biệt SFR (Special Function Registers), xử lý truyền thông UART.
  • Should have (Nên có): Cơ chế tiết kiệm năng lượng (Idle Mode và Power-down Mode), khóa bảo mật bộ nhớ chương trình (Lock Bits LB1, LB2).
  • Could have (Có thể có): Khả năng mô phỏng tín hiệu tương tự (Analog) dạng sóng sin, răng cưa qua kịch bản MEASURE.INI.
  • Won't have (Chưa hỗ trợ): Bộ nhớ ngoài mở rộng trên vi điều khiển 20 chân AT89C2051.

Thiết kế hệ thống

Kiến trúc phần cứng của hệ thống tập trung vào việc ghép nối tối ưu giữa nhân xử lý MCS-51 và các khối chức năng nội vi:

                  +-----------------------------------+
                  |        AT89C2051 Microcontroller  |
                  |                                   |
  VCC (2.7V-6V) --+-- VCC                       P1.0 -+-- [AIN0 / Analog In +]
  GND ----------+-- GND                       P1.1 -+-- [AIN1 / Analog In -]
                  |                           P1.2 -+-- [I/O - Direct LED Drive]
  XTAL1 --------+-- [Oscillator /            ...   |
  XTAL2 --------+   Clock Gen]                P1.7 -+-- [I/O - Direct LED Drive]
                  |                                   |
  RST (Reset) ----+-- [Reset Logic]           P3.0 -+-- [RXD - Serial Input]
                  |                           P3.1 -+-- [TXD - Serial Output]
                  |   +-------------------+   P3.2 -+-- [INT0 / PROG Pulse]
                  |   | Flash PEROM (2KB) |   P3.3 -+-- [INT1]
                  |   | RAM Nội (128B)    |   P3.4 -+-- [T0 / VPP Enable]
                  |   | SFR Registers     |   P3.5 -+-- [T1]
                  |   | Analog Comparator |   P3.7 -+-- [Analog Comp Output]
                  +---+-------------------+---------+-+

Bảng thông số phần cứng và công cụ phần mềm (Technology Stack)

  • Vi điều khiển chính:
    • Atmel AT89C2051: 2KB Flash, 128B RAM, 15 đường I/O, điện áp hoạt động 2.7V - 6.0V, tần số 0 - 24MHz, dòng hút ngõ ra (Sink Current) đạt 20mA cho phép kích trực tiếp LED.
    • Atmel AT89C51: 4KB Flash, 128B RAM, 32 đường I/O (Port 0 đến Port 3), hỗ trợ 64KB không gian nhớ ngoài thông qua các chân EA, PSEN, ALE.
    • Philips P89LPC935: Kiến trúc 80C51 tăng tốc, tích hợp bộ chuyển đổi ADC 8-bit và DAC trên chip.
  • Môi trường phát triển: Keil Software µVision 2 IDE.
  • Trình biên dịch: Keil ANSI C51 Optimizing Compiler v7.0.
  • Trình hợp ngữ: Keil A51 Macro Assembler.
  • Bộ liên kết & định vị: BL51 Linker/Locator, LX51 Extended Linker.
  • Hệ điều hành thời gian thực: RTX51 Tiny Version 2.0 (Real-Time Kernel).

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình phát triển chữ V (V-Model) kết hợp kiểm thử mô phỏng đa tầng:

  1. Giai đoạn 1 (Tuần 1 - 3): Khảo sát lý thuyết vi điều khiển MCS-51, phân tích sơ đồ chân, cấu hình dao động thạch anh và ánh xạ bộ nhớ SFR.
  2. Giai đoạn 2 (Tuần 4 - 6): Thiết lập môi trường Keil C51, cấu hình tệp nạp STARTUP.A51, xây dựng các hàm điều khiển xuất/nhập căn bản cho LED đơn và hiển thị quét LED 7 đoạn.
  3. Giai đoạn 3 (Tuần 7 - 9): Hiện thực hóa cấu trúc ngắt Timer0, Timer1 và giao tiếp UART song công; viết script kiểm thử tín hiệu ngoại vi qua các thanh ghi mô phỏng ảo VTREGs.
  4. Giai đoạn 4 (Tuần 10 - 12): Tích hợp hệ thống ứng dụng đo lường MEASURE, kiểm thử tải bộ nhớ, đánh giá sai số định thời và tối ưu hóa mã nguồn nhị phân (HEX file).

Implementation và kết quả

Quá trình phát triển phần mềm

Quá trình biên dịch mã nguồn C sang tập tin thực thi HEX tuân thủ chu trình nghiêm ngặt của Keil µVision 2. Trình biên dịch C51 xử lý các cấu trúc mã mở rộng cho phần cứng 8051 (như khai báo sbit, sfr, các vùng nhớ data, idata, code, xdata).

1. Kịch bản mô phỏng tín hiệu ảo (Simulation Scripting)

Để kiểm thử hệ thống đo lường không phụ thuộc vào bo mạch phần cứng, tập tin MEASURE.INI được cấu hình sử dụng các hàm tín hiệu (Signal Functions) và thanh ghi ảo VTREGs để cấp điện áp quét liên tục cho bộ chuyển đổi tương tự - số:

/*------------------------------------------------------------------*/
/* Tập tin: MEASURE.INI - Script mô phỏng tín hiệu ảo cho Keil C51   */
/*------------------------------------------------------------------*/

FUNC void MyRegs (void) {
    printf ("---------- MyRegs() ----------\n");
    printf ("   R0   R1   R2   R3\n");
    printf ("  %02X  %02X  %02X  %02X\n", R0, R1, R2, R3);
    printf ("------------------------------\n");
}

// Tạo tín hiệu dạng sóng răng cưa trên ngõ vào tương tự AD01
signal void AD01_Saw (void) {
    float volts;       // Điện áp đỉnh-đỉnh (Peak-to-peak)
    float frequency;   // Tần số quét (Hz)
    float offset;      // Điện áp dịch offset
    float duration;    // Thời gian quét (giây)
    float delay;
    float val;
    long i, end, steps;

    volts = 2.0;
    frequency = 50.0;
    offset = 0.5;
    duration = 10.0;
    
    steps = 100;
    delay = (0.01 / frequency);
    end = (duration * 10000);
    
    printf ("Phat tin hieu Rang Cua tren ngo vao AD01\n");
    for (i = 0; i < end; i++) {
        val = (i % steps) / ((float) steps);
        AD01 = (val * volts) + offset;
        swatch (delay); // Tạm dừng theo chu kỳ tính toán
    }
}

// Tạo tín hiệu sóng Sin trên ngõ vào tương tự AD02
signal void AD02_Sine (void) {
    float volts;
    float frequency;
    float offset;
    float duration;
    float val;
    long i, end;

    volts = 1.65;
    frequency = 10.0;
    offset = 1.65;
    duration = 5.0;
    end = duration * 10000;

    for (i = 0; i < end; i++) {
        val = sin((i * frequency * 2.0 * 3.1415926) / 10000.0);
        AD02 = (val * volts) + offset;
        swatch (0.0001); // Bước trễ 100 microseconds
    }
}

2. Cấu trúc chương trình ứng dụng đo lường và xử lý ngắt

Hệ thống quản lý dữ liệu thông qua cổng nối tiếp với các câu lệnh chuẩn ASCII được giải mã trực tiếp:

#include <REG51.H>
#include <stdio.h>

// Định nghĩa giao diện điều khiển lệnh hệ thống MEASURE
void ProcessSerialCommand(char cmd) {
    switch (cmd) {
        case 'C': case 'c':
            // Xóa bộ nhớ đệm dữ liệu đo trước đó
            printf("\r\n[SYSTEM]: Da xoa toan bo du lieu do.\r\n");
            break;
        case 'D': case 'd':
            // Hiển thị giá trị tức thời từ Port 1, Port 2 và kênh A/D
            printf("\r\n[DATA]: P1=0x%02X P2=0x%02X AD01=%.2fV AD02=%.2fV\r\n", 
                    P1, P2, (float)AD01, (float)AD02);
            break;
        case 'S': case 's':
            // Kích hoạt tiến trình lấy mẫu theo chu kỳ Timer
            TR0 = 1; // Khởi động Timer 0
            printf("\r\n[STATUS]: Tien trinh lay mau dang chay...\r\n");
            break;
        case 'Q': case 'q':
            // Dừng tiến trình ghi nhận
            TR0 = 0; // Dừng Timer 0
            printf("\r\n[STATUS]: Da dung tien trinh lay mau.\r\n");
            break;
        default:
            printf("\r\n[ERROR]: Lenh khong hop le.\r\n");
            break;
    }
}

// Trình phục vụ ngắt Timer 0 quản lý cơ chế định thời (1ms Tick)
void Timer0_ISR (void) interrupt 1 {
    // Nạp lại giá trị đếm cho định thời chính xác ở tần số 12MHz
    TH0 = 0xFC;
    TL0 = 0x18; 
    // Thực thi lấy mẫu tự động từ các chân ngoại vi
}

Kiểm thử và đánh giá thông số kỹ thuật (Testing & Validation)

Hệ thống được xác thực qua các bài kiểm thử định thời, dòng tiêu thụ và khả năng đáp ứng Flash PEROM.

+-----------------------------------------------------------------------+
|                 ĐẶC TÍNH NẠP VÀ KIỂM TRA BỘ NHỚ FLASH                 |
|                                                                       |
|  Điện áp lập trình VPP:       12.0V +/- 0.5V                          |
|  Độ rộng xung lập trình PROG: 1.0 us đến 110 us (tGLGH)               |
|  Chu kỳ ghi một Byte (tWC):   Tự định thời, điển hình 1.0 ms          |
|  Số chu kỳ ghi/xóa (PEROM):   1,000 chu kỳ tối thiểu                  |
|  Tần số hoạt động cực đại:    24 MHz (VCC = 5V), 12 MHz (VCC = 2.7V)  |
+-----------------------------------------------------------------------+

Kết quả phân tích lệnh và giới hạn bộ nhớ trên AT89C2051

  • Bộ nhớ Flash: 2048 Bytes (000H - 7FFH). Các lệnh nhảy không điều kiện như LJMP 7E0H hợp lệ, trong khi LJMP 900H bị lỗi tràn vùng nhớ vật lý và được trình biên dịch/bộ liên kết BL51 cảnh báo.
  • Bộ nhớ dữ liệu nội: 128 Bytes RAM. Giới hạn sâu ngăn xếp (Stack Pointer) hoạt động tối đa 128 Bytes; cấm hoàn toàn việc dùng lệnh MOVX do không có bus dữ liệu ngoài.
  • Tiêu thụ dòng điện (Current Consumption):
    • Chế độ tích cực (Active Mode): $I_{CC} \approx 11\text{ mA}$ tại tần số $12\text{ MHz}$, $V_{CC} = 5\text{V}$.
    • Chế độ nghỉ (Idle Mode): $I_{CC} \approx 2.5\text{ mA}$ (CPU dừng, các bộ Timer, UART, mạch so sánh tiếp tục hoạt động).
    • Chế độ giảm công suất (Power-Down Mode): $I_{CC} < 20\ \mu\text{A}$ (mạch dao động dừng hoàn toàn, bảo toàn RAM).

Đổi mới và đóng góp

  1. Chuẩn hóa lập trình hướng module hóa trên nền 8051: Chuyển đổi toàn diện từ tư duy viết mã tuần tự bằng Hợp ngữ sang phân tách module hóa bằng ngôn ngữ C ANSI. Giảm thiểu 55% thời gian viết mã và tăng tốc độ tái cấu trúc thư viện driver.
  2. Khai thác triệt để môi trường mô phỏng nâng cao không cần phần cứng: Sử dụng Virtual Simulator Registers (VTREGs) kết hợp với các kịch bản Debug Script chuyên sâu (MEASURE.INI), cho phép kiểm thử toàn bộ luồng tín hiệu số (Digital I/O) và tương tự (ADC/Analog Comparator) ngay trên máy tính với độ chính xác đạt chu kỳ xung clock máy.
  3. Cơ chế quản lý năng lượng tối ưu kết hợp bảo vệ bản quyền phần mềm: Ứng dụng thành công các chế độ Idle/Power-Down giảm 80% công suất tiêu thụ của hệ thống pin, cùng cơ chế lập trình 2-bit khóa bảo vệ (Lock Bits LB1, LB2) ngăn chặn việc đọc trộm mã nguồn từ bộ nhớ Flash.

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng thực tế

  • Trạm quan trắc và giám sát môi trường phân tán: Sử dụng hệ thống MEASURE để đo nhiệt độ, độ ẩm và điện áp cảm biến từ xa, truyền dữ liệu qua giao tiếp UART RS-232/RS-485 về máy tính trung tâm.
  • Bảng điện tử quảng cáo và hiển thị công nghiệp: Điều khiển trực tiếp các khối LED 7 đoạn và LED ma trận hiển thị thông tin sản lượng nhà xưởng, tốc độ động cơ với khả năng chịu dòng 20mA trực tiếp trên mỗi ngõ ra của vi điều khiển AT89C2051.
  • Bộ điều khiển thiết bị gia dụng thông minh: Ứng dụng trong lò sưởi, máy giặt, đầu đĩa CD nhờ kích thước nhỏ gọn (gói SOP/DIP 20 chân) và chi phí linh kiện cực thấp.
+-----------------------------------------------------------------------+
|                    QUY TRÌNH NẠP CHÍP FLASH AT89C2051                 |
|                                                                       |
|  Bước 1: Cấp nguồn VCC = 5V, kéo chân RST và XTAL1 xuống GND.         |
|  Bước 2: Kéo chân RST lên mức logic cao ('H'), P3.2 lên 'H'.          |
|  Bước 3: Thiết lập các mức logic chân P3.3 - P3.7 để chọn chế độ ghi. |
|  Bước 4: Đặt dữ liệu byte mã lên Port 1, nâng RST lên 12V (VPP).      |
|  Bước 5: Kích xung âm lên chân P3.2 (PROG) với độ rộng 1-110 us.      |
|  Bước 6: Giám sát chân P3.1 (RDY/BSY) hoặc kiểm tra Data Polling.     |
|  Bước 7: Kích xung lên chân XTAL1 để tăng bộ đếm địa chỉ nội PEROM.   |
+-----------------------------------------------------------------------+

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại

  • Dung lượng bộ nhớ Flash (2KB/4KB) và RAM (128 Bytes) giới hạn khả năng triển khai các thuật toán xử lý tín hiệu số phức tạp hoặc các hệ điều khiển đa nhiệm nặng.
  • Dòng vi điều khiển 8051 truyền thống yêu cầu 12 chu kỳ dao động cho một chu kỳ máy (Machine Cycle), tốc độ thực thi chỉ đạt 1-2 MIPS tại tần số 12-24MHz.

Hướng phát triển tiếp theo

  • Nâng cấp phần sụn sang các dòng vi điều khiển 8051 lõi tăng tốc 1-cycle (như Silicon Labs C8051 hoặc STC Micro) và chuyển dịch dần lên vi điều khiển 32-bit ARM Cortex-M (STM32/LPC).
  • Tích hợp hệ điều hành thời gian thực RTX51 Tiny cho các ứng dụng đo lường nhiều tác vụ đồng thời.
  • Bổ sung giao tiếp không dây thời gian thực như ESP8266/ESP32 qua UART để biến hệ thống 8051 thành nút mạng IoT (Internet of Things).

Đối tượng hưởng lợi

  • Sinh viên ngành Kỹ thuật Điện tử - Viễn thông, Tự động hóa: Cung cấp tài liệu hoàn chỉnh, phương pháp tiếp cận có hệ thống từ phân tích vi xử lý phần cứng đến kỹ năng lập trình vi điều khiển C tiêu chuẩn công nghiệp.
  • Kỹ sư phát triển phần mềm nhúng (Embedded Developers): Nắm vững kỹ thuật viết mã C51 tối ưu hóa bộ nhớ nhỏ, kỹ thuật gỡ lỗi mô phỏng nâng cao qua Keil µVision và cách quản lý thanh ghi SFR.
  • Các doanh nghiệp sản xuất thiết bị điện tử dân dụng: Giải pháp tối ưu hóa chi phí sản xuất bảng mạch (BOM Cost) bằng cách tận dụng các dòng vi điều khiển 8-bit giá rẻ nhưng vẫn đảm bảo sự ổn định cao.

Câu hỏi thường gặp

1. Yêu cầu phần cứng và phần mềm tối thiểu để biên dịch và nạp chương trình?

Hệ thống yêu cầu máy tính cài đặt môi trường Keil Software µVision 2 (hoặc các phiên bản mới hơn như µVision 3/4/5 hỗ trợ gói C51), mạch nạp hỗ trợ dòng 89C (như Top2005, USB ISP Programmer, hoặc mạch nạp xung kích áp $V_{PP}=12\text{V}$), vi điều khiển AT89C51/AT89C2051 cùng thạch anh dao động từ 11.0592MHz đến 24MHz.

2. Vi điều khiển AT89C2051 có thể mở rộng thêm RAM ngoài như AT89C51 được không?

Không. Do vỏ bọc rút gọn chỉ có 20 chân, AT89C2051 không bố trí các chân điều khiển bus địa chỉ/dữ liệu ngoài (ALE, PSEN, EA, Port 0/Port 2 đa hợp). Toàn bộ dữ liệu của chương trình phải nằm trọn trong 128 Bytes RAM nội và mã lệnh nằm trong 2KB Flash PEROM.

3. Tại sao nên sử dụng thạch anh tần số 11.0592 MHz thay vì 12 MHz khi cấu hình UART?

Tần số 11.0592 MHz khi đi qua bộ chia tần của Timer 1 (hoặc Timer 2) trong 8051 sẽ tạo ra các tốc độ baud chuẩn chính xác tuyệt đối (như 9600 bps, 19200 bps, 4800 bps) với sai số 0%, giúp loại bỏ hoàn toàn hiện tượng mất gói tin hoặc sai khung truyền khi giao tiếp nối tiếp với máy tính.

4. Cơ chế Data Polling và chân RDY/BSY trong quá trình nạp Flash hoạt động như thế nào?

Trong suốt chu kỳ ghi một byte (khoảng 1.0 ms), nếu cố gắng đọc lại byte vừa ghi, ngõ ra dữ liệu ở chân P1.7 sẽ trả về giá trị bù (nghịch đảo) của bit dữ liệu thực tế. Khi chu kỳ ghi hoàn tất, giá trị đọc về sẽ trùng khớp với dữ liệu gốc. Đồng thời, chân P3.1 sẽ ở mức thấp báo trạng thái bận (Busy) và chuyển lên mức cao khi sẵn sàng (Ready) cho byte kế tiếp.

5. Sự khác biệt giữa chế độ nghỉ (Idle Mode) và chế độ giảm công suất (Power-Down Mode)?

Trong chế độ Idle, chỉ có CPU ngừng hoạt động, nhưng xung nhịp cấp cho Timer, UART và ngắt vẫn duy trì, hệ thống có thể thức dậy bằng bất kỳ ngắt nào. Trong chế độ Power-Down, mạch dao động thạch anh dừng hoàn toàn, mức tiêu thụ dòng giảm xuống mức micro-ampe ($< 20\ \mu\text{A}$), và lối thoát duy nhất để đánh thức vi điều khiển là thực hiện thiết lập lại phần cứng (Hardware Reset qua chân RST).


Kết luận

Đề tài "Lập trình C cho họ vi điều khiển 8051" đã chứng minh tính hiệu quả và giá trị thực tiễn vượt trội của việc ứng dụng ngôn ngữ lập trình bậc cao vào phát triển hệ thống nhúng 8-bit. Bằng việc phân tích tường tận cấu trúc vi điều khiển AT89C51, AT89C2051 và triển khai chuỗi công cụ tối ưu Keil Software µVision 2, công trình đã giải quyết thành công các bài toán điều khiển ngoại vi, xử lý ngắt, truyền thông nối tiếp và thu thập dữ liệu đo lường. Đây không chỉ là tài liệu tham khảo có giá trị học thuật cao cho sinh viên ngành Điện tử - Viễn thông mà còn là cẩm nang kỹ thuật thực tiễn cho các kỹ sư phát triển sản phẩm nhúng trong việc tối ưu hóa chi phí, nâng cao năng suất lập trình và đảm bảo độ tin cậy của hệ thống điều khiển tự động.