Bối cảnh và vấn đề nghiên cứu

Trong lĩnh vực kỹ thuật điều khiển và tự động hóa, vi điều khiển đóng vai trò trung tâm trong việc thiết kế các hệ thống nhúng, đo lường và xử lý tín hiệu. Trước đây, việc lập trình cho các dòng vi điều khiển truyền thống thường sử dụng hợp ngữ (Assembly) – một ngôn ngữ cấp thấp đòi hỏi người phát triển phải nắm rõ từng chi tiết cấu trúc phần cứng, các thanh ghi nội bộ và tập lệnh phức tạp, khiến mã nguồn dài và tốn nhiều thời gian phát triển. Xuất phát từ thực tiễn đó, việc ứng dụng các ngôn ngữ lập trình bậc cao, tiêu biểu là ngôn ngữ C cùng các môi trường biên dịch chuyên dụng như Keil C, CCS C và CodeVisionAVR, giúp tối ưu hóa quy trình thiết kế phần mềm nhúng, đơn giản hóa cú pháp và nâng cao khả năng tái sử dụng mã nguồn.

Khóa luận/đồ án tốt nghiệp của tác giả Nguyễn Văn Biên, dưới sự hướng dẫn của thầy Nguyễn Văn Nga (hoàn thành ngày 20/11/2009 tại Khoa Điện - Điện tử, Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh), tập trung giải quyết các nhiệm vụ nghiên cứu sau:

  1. Nghiên cứu tổng quan kiến trúc phần cứng, sơ đồ chân, chức năng các cổng vào/ra và cấu trúc bộ nhớ của vi điều khiển họ MSC-51 (đại diện là AT89C51/89C52), dòng vi điều khiển PIC (PIC 16F877A) và vi điều khiển AVR.
  2. Hệ thống hóa các kiến thức trọng tâm về thanh ghi chức năng đặc biệt (SFR), hệ thống ngắt, bộ định thời/bộ đếm (Timer/Counter) và giao tiếp truyền thông nối tiếp trên vi điều khiển.
  3. Phân tích cú pháp, cấu trúc chương trình, các kiểu dữ liệu mở rộng cho phần cứng và các hàm xử lý ngắt của ngôn ngữ C trên các trình biên dịch Keil C, CCS C và CodeVisionAVR.
  4. Xây dựng tài liệu hướng dẫn quy trình thao tác trên phần mềm Keil C từ bước khởi tạo dự án (Project), thiết lập thông số phần cứng, cấu hình tạo tệp tin mã máy (.HEX) đến phương pháp biên dịch và gỡ lỗi mô phỏng (Debug).
  5. Thiết kế mạch nguyên lý và lập trình hoàn chỉnh 05 mô-đun ứng dụng thực tế trên vi điều khiển 89C51 gồm: điều khiển ma trận LED đơn hình trái tim, đồng hồ số hiển thị LED 7 đoạn có phím bấm điều chỉnh, bảng LED ma trận chạy chữ quảng cáo quét cột, hiển thị thông tin và dịch ký tự trên màn hình LCD, giao tiếp bộ biến đổi tương tự - số (ADC) với cảm biến nhiệt độ LM35 hiển thị trên LCD.

Đối tượng nghiên cứu của đề tài là các dòng vi điều khiển 8-bit phổ biến (89C51, PIC 16F877A, AVR) và các trình biên dịch ngôn ngữ C tương ứng. Phạm vi nghiên cứu giới hạn ở việc phân tích cấu trúc kỹ thuật, xây dựng thuật toán điều khiển, lập trình mã nguồn và chạy kiểm thử mô phỏng mạch điện tử phục vụ công tác đào tạo thực tập vi xử lý.


Cơ sở lý thuyết và phương pháp

Khung lý thuyết và mô hình kỹ thuật

Đề tài dựa trên nền tảng lý thuyết kiến trúc máy tính và cấu trúc vi điều khiển 8-bit họ MSC-51 do Intel sản xuất và các biến thể của Atmel, kết hợp với kiến trúc RISC của dòng vi điều khiển PIC (Microchip Technology) và cấu trúc AVR. Các mô hình phần cứng chính bao gồm:

  • Kiến trúc vi điều khiển 89C51: Bộ nhớ chương trình EPROM nội 8 KB, bộ nhớ dữ liệu RAM nội 128 Byte, không gian mở rộng bộ nhớ mã ngoài và dữ liệu ngoài lên đến 64 KB, 4 cổng xuất/nhập 8-bit (P0, P1, P2, P3), hệ thống 5 nguồn ngắt với 2 mức ưu tiên, 2 bộ định thời 16-bit và cổng truyền thông nối tiếp UART.
  • Kiến trúc vi điều khiển PIC 16F877A: Kiến trúc RISC, CPU 8/16-bit, tích hợp bộ nhớ Flash, RAM, EEPROM nội (cho phép xóa/ghi 1 triệu lần), các bộ chuyển đổi ADC 10/12-bit, các khối Timer và khối điều khiển động cơ/đọc bộ mã hóa (encoder).
  • Mô hình lập trình phần mềm nhúng: Cấu trúc ngôn ngữ C mở rộng hỗ trợ định vị bit và thanh ghi phần cứng chuyên biệt thông qua các từ khóa sbit, sfr, sfr16, bit và chỉ thị hàm phục vụ ngắt interrupt.

Phương pháp nghiên cứu

Tác giả kết hợp các phương pháp nghiên cứu kỹ thuật thực nghiệm:

  • Phương pháp phân tích - tổng hợp tài liệu kỹ thuật: Khảo sát cấu trúc thanh ghi, bảng vector ngắt, nguyên lý ghép nối bus địa chỉ/dữ liệu đa hợp thông qua tín hiệu ALE và giải mã ngoại vi.
  • Phương pháp thiết kế thuật toán và cấu trúc dữ liệu: Xây dựng giải thuật quét LED ma trận, quét LED 7 đoạn theo thời gian thực, thuật toán dịch bit tạo hiệu ứng ánh sáng, thuật toán chuyển đổi mã nhị phân sang mã thập phân phân rã (HEX to BCD) và giải thuật xử lý tín hiệu số từ cảm biến nhiệt độ.
  • Phương pháp mô phỏng và kiểm thử phần mềm: Thiết lập môi trường mô phỏng trên Keil C IDE, cấu hình tần số thạch anh (12 MHz), tạo tệp tin .HEX, sử dụng công cụ gỡ lỗi (Debug Session) để theo dõi sự thay đổi trạng thái logic trên các cổng xuất nhập và thanh ghi ngoại vi (Peripherals).

Nguồn dữ liệu

Dữ liệu sử dụng trong nghiên cứu bao gồm sơ đồ chân, bảng mã lệnh, cấu hình thanh ghi chức năng từ tài liệu kỹ thuật của nhà sản xuất Atmel, Microchip; bảng mã hiển thị LED 7 đoạn (Anode/Cathode chung), bảng mã font chữ ma trận điểm và bảng tín hiệu đo lường từ cảm biến nhiệt độ tương tự LM35.


Thiết kế và triển khai hệ thống

Kiến trúc phần cứng các mô-đun ứng dụng

Hệ thống thực nghiệm được thiết kế thành 5 khối phần cứng chuyên biệt kết nối với vi điều khiển AT89C51 (sử dụng thạch anh 12 MHz, cấp nguồn 5V, mạch Reset tích cực mức cao kết hợp tụ điện và nút nhấn):

Mô-đun Tên hệ thống Thành phần phần cứng chính Giao tiếp vi điều khiển
Modul 1 LED đơn hình trái tim 32 LED đơn bố trí hình trái tim Kết nối trực tiếp 4 cổng: P0, P1, P2, P3
Modul 2 Đồng hồ số hiển thị LED 7 đoạn 8 LED 7 đoạn, IC chốt/dịch, nút nhấn chuyển chế độ và hiệu chỉnh Port 1 xuất mã 7 đoạn; P2.0 - P2.4 điều khiển quét; P3.2 (INT0), P3.3 (INT1) nhận tín hiệu nút nhấn
Modul 3 Bảng LED ma trận chạy chữ Khối LED ma trận, mảng IC ghi dịch 74HC595 Port 1 xuất dữ liệu hàng; P2.0 (SCK), P2.1 (RCK), P2.2 (D_IN), P2.3 (MR), P2.4 (OE) điều khiển dịch cột
Modul 4 Chạy chữ quảng cáo trên màn hình LCD Màn hình tinh thể lỏng LCD 16x2 Port 2 (hoặc bus dữ liệu P0/P2) truyền dữ liệu 8-bit; P1.0 (RS), P1.1 (RW), P1.2 (E) điều khiển lệnh/dữ liệu
Modul 5 Đo nhiệt độ đa kênh hiển thị LCD 02 Cảm biến nhiệt độ LM35, bộ chuyển đổi ADC 8-bit, LCD Port 1 nhận dữ liệu 8-bit từ ADC; P3.0-P3.2 điều khiển LCD; P3.3 (chọn kênh), P3.4 (ALE), P3.5 (START)

Thuật toán và cấu trúc phần mềm

Các chương trình điều khiển được viết bằng ngôn ngữ Keil C, triển khai các kỹ thuật lập trình nhúng:

  • Xử lý ngắt thời gian thực: Sử dụng ngắt tràn Timer0 (chế độ 16-bit, nạp trước giá trị TH0 = 0x3C, TL0 = 0xB0 để tạo chu kỳ định thời 50.000 µs = 50 ms). Lặp lại 20 lần tràn Timer để tạo khoảng thời gian chuẩn xác 1 giây phục vụ cập nhật giờ - phút - giây.
  • Xử lý ngắt ngoài: Thiết lập thanh ghi TCON với IT0 = 1 và IT1 = 1 để kích hoạt ngắt ngoài theo cạnh xuống (falling edge). Ngắt INT0 (vector 0003H) dùng để chuyển đổi biến MODE (chọn chỉnh Giờ, Phút hoặc Giây); ngắt INT1 (vector 0013H) dùng để tăng giá trị tương ứng.
  • Thuật toán quét LED và dịch bit: Điều khiển thanh ghi dịch 74HC595 bằng cách tạo xung dịch trên chân SCK và xung chốt dữ liệu trên chân RCK. Sử dụng mảng hằng số MA[1000] chứa mã quét font chữ để thực hiện hiệu ứng chữ chạy từ phải sang trái.
  • Thuật toán chuyển đổi tín hiệu tương tự - số: Điều khiển quá trình chuyển đổi ADC bằng cách tạo xung trên chân ALE và START. Dữ liệu số 8-bit đọc từ Port 1 được bù trừ nhiệt độ (adc = adc - 55), sau đó phân rã thành các thành phần hàng trăm, hàng chục, hàng đơn vị và xử lý hiển thị dấu âm/dương lên màn hình LCD.

Nội dung chính theo từng phần

PHẦN A: Viết ngôn ngữ Keil C cho 89C51

Phần này chiếm dung lượng trọng tâm của tài liệu, phân tích toàn diện từ phần cứng, công cụ biên dịch đến các bài toán thực hành trên họ 8051.

  • I. Một vài nét chung về 89C51: Giới thiệu cấu tạo IC 89C51 gồm 40 chân với 24 chân đa chức năng. Mô tả chi tiết chức năng 4 cổng xuất nhập (Port 0 kết hợp bus địa chỉ/dữ liệu đa hợp; Port 1 là cổng I/O thuần túy; Port 2 đóng vai trò byte cao của bus địa chỉ khi mở rộng bộ nhớ; Port 3 tích hợp các chức năng đặc biệt như ngắt ngoài, timer, cổng nối tiếp). Trình bày các đường tín hiệu điều khiển quan trọng gồm: $\overline{\text{PSEN}}$ (chân 29, đọc bộ nhớ chương trình ngoài), $\text{ALE}$ (chân 30, xung chốt địa chỉ tách bus địa chỉ/dữ liệu với tốc độ bằng 1/6 tần số dao động), $\overline{\text{EA}}$ (chân 31, chọn thực thi từ ROM nội hay ROM ngoại), $\text{RST}$ (chân 9, reset hệ thống khi giữ mức cao tối thiểu 2 chu kỳ máy), cùng bộ dao động thạch anh kết nối chân X1, X2 (12 MHz).
  • II. Những vấn đề trọng tâm của 89C51: Khảo sát bản đồ vùng nhớ và các thanh ghi chức năng đặc biệt:
    • Thanh ghi B (địa chỉ F0H): Dùng cho phép toán nhân/chia với lệnh MUL AB và DIV AB.
    • Con trỏ ngăn xếp SP (địa chỉ 81H): Hoạt động theo cơ chế tăng trước khi ghi (PUSH) và giảm sau khi đọc (POP). Giá trị mặc định khi reset là 07H. Tác giả hướng dẫn khởi tạo MOV SP, #5FH để ngăn xếp bắt đầu tại 60H và có độ dài 32 byte.
    • Con trỏ dữ liệu DPTR (16-bit, gồm DPH tại 83H và DPL tại 82H): Dùng truy xuất bộ nhớ ngoài 64 KB.
    • Các thanh ghi Timer (TMOD tại 89H, TCON tại 88H, TL0/TH0, TL1/TH1), thanh ghi truyền thông nối tiếp (SBUF tại 99H, SCON tại 98H), thanh ghi điều khiển nguồn PCON (địa chỉ 87H, chứa các bit SMOD, GF1, GF0, PD, IDL) và thanh ghi cho phép ngắt IE (địa chỉ A8H).
    • Hệ thống vector ngắt của 89C51 được xác định rõ:
      • Ngắt ngoài 0 (INT0): Vector 0003H (nguồn ngắt 0).
      • Ngắt Timer 0: Vector 000BH (nguồn ngắt 1).
      • Ngắt ngoài 1 (INT1): Vector 0013H (nguồn ngắt 2).
      • Ngắt Timer 1: Vector 001BH (nguồn ngắt 3).
      • Ngắt cổng nối tiếp (RI/TI): Vector 0023H (nguồn ngắt 4).
      • Ngắt Timer 2: Vector 002BH (nguồn ngắt 5).
  • III. Ngôn ngữ Keil C cho 89C51: Phân tích ưu thế của ngôn ngữ C trong lập trình nhúng. Hệ thống hóa bảng kiểu dữ liệu trong Keil C:
    • char / unsigned char (1 byte, 8-bit: -128 đến +127 / 0 đến 255).
    • short / unsigned short và int / unsigned int (2 byte, 16-bit: -32.768 đến +32.767 / 0 đến 65.535).
    • long / unsigned long (4 byte, 32-bit: $-2^{31}$ đến $+2^{31}-1$ / 0 đến $2^{32}-1$).
    • Các kiểu dữ liệu đặc thù phần cứng: bit (1-bit: 0 hoặc 1), sbit (1-bit định vị chân I/O hoặc bit SFR), sfr (1 byte: định vị thanh ghi chức năng từ 0 đến 255), sfr16 (2 byte: định vị thanh ghi 16-bit).
    • Cú pháp khai báo hàm ngắt đặc trưng: void Ten_Ham(void) interrupt Nguon_Ngat.
    • Các cấu trúc điều khiển logic: if-else, switch-case, vòng lặp vô tận while(1), do-while và vòng lặp for.
  • IV. Hướng dẫn sử dụng Keil C lập trình cho 89C52: Hướng dẫn thao tác trên giao diện Keil C IDE gồm quy trình: Project -> New Project, chọn chip AT89C51 của hãng Atmel, tạo tệp mã nguồn .c, thêm tệp vào Source Group 1, thiết lập thông số phần cứng trong Option for Target (chọn tần số Xtal (MHz), đánh dấu chọn Create HEX file trong tab Output), tiến hành biên dịch (phím F7), kích hoạt phiên gỡ lỗi Debug (Ctrl + F5), mở các cửa sổ ngoại vi Peripherals để theo dõi mức logic chân cổng và thực thi từng bước bằng phím F11.
  • V. Mô phỏng modul ứng dụng và chương trình mẫu: Trình bày mạch nguyên lý và mã nguồn C chi tiết cho 5 mô-đun:
    1. Mô-đun 1 - LED hình trái tim: Triển khai 3 chương trình con gồm hiệu ứng LED chạy viền (ledchay), sáng dần rồi tắt dần (sangdan) và sáng dồn rồi tắt dồn (sangdon) điều khiển đồng thời trên 4 cổng P0, P1, P2, P3.
    2. Mô-đun 2 - Đồng hồ số LED 7 đoạn: Kết hợp thuật toán giải mã HEX sang BCD (hex_bcd), chuyển đổi mã BCD sang mã LED 7 đoạn (bcd_7doan), hiển thị quét 8 LED (display), xử lý định thời chính xác bằng ngắt Timer0 và hiệu chỉnh thời gian qua ngắt ngoài INT0/INT1.
    3. Mô-đun 3 - LED ma trận chạy chữ quảng cáo: Quét dòng và cột bảng LED ma trận hiển thị chuỗi ký tự "TRUONG DAI HOC SU PHAM KY THUAT TP HO CHI MINH KHOA DIEN - DIEN TU THUC TAP VI XU LY", điều khiển chuỗi xung dịch chốt trên IC 74HC595.
    4. Mô-đun 4 - Chạy chữ trên LCD: Xây dựng các hàm điều khiển LCD cơ bản gồm kiểm tra cờ bận (kiemtra kiểm tra bit BF), gửi lệnh (control), gửi ký tự (write), gửi chuỗi (writes), khởi tạo chế độ hiển thị 2 dòng ma trận 5x7 (khoitaoLCD với mã lệnh 0x38, 0x0E, 0x01) và thực hiện dịch chuyển dòng chữ sang trái qua mã lệnh 0x1C.
    5. Mô-đun 5 - Giao tiếp ADC đo nhiệt độ với cảm biến LM35: Đọc dữ liệu chuyển đổi tương tự - số từ 2 kênh cảm biến nhiệt độ LM35, xử lý dải đo và tính toán hiển thị trực tiếp giá trị nhiệt độ kênh 0 và kênh 1 lên màn hình LCD.

PHẦN B: Viết ngôn ngữ CCSC cho PIC 16F877A

Phần này cung cấp kiến thức nền tảng về dòng vi điều khiển PIC:

  • I. Vài nét khái quát về PIC 16F877A: Giới thiệu họ vi điều khiển kiến trúc RISC của Microchip Technology (xuất phát từ thế hệ PIC 1650 của General Instrument).
  • Liệt kê các đặc tính kỹ thuật cơ bản: CPU 8/16-bit, bộ nhớ chương trình Flash/ROM, hệ thống cổng xuất nhập I/O, các bộ định thời Timer 8/16-bit, khối biến đổi ADC tích hợp độ phân giải 10/12-bit, hỗ trợ kết nối LCD, bộ nhớ nội EEPROM cho phép ghi/xóa 1.000.000 lần, tích hợp khối phát xung điều khiển động cơ và giải mã tín hiệu encoder.
  • II - V: Trình bày trọng tâm kiến trúc phần cứng, cú pháp ngôn ngữ CCS C, quy trình sử dụng phần mềm biên dịch CCS C và các mô-đun chương trình mẫu mô phỏng cho dòng PIC 16F877A (theo đề mục mục lục).

PHẦN C: Lập trình cho AVR bằng Code Vision

Giới thiệu cấu trúc vi điều khiển họ AVR của hãng Atmel, cấu trúc lệnh và thư viện của trình biên dịch CodeVisionAVR, quy trình khởi tạo mã tự động (CodeWizardAVR) và các mô-đun ứng dụng mô phỏng kỹ thuật trên nền tảng AVR.


Kết quả và đóng góp

Kết quả kỹ thuật đạt được

  • Xây dựng thành công tài liệu hướng dẫn kỹ thuật chi tiết về cấu trúc phần cứng 89C51 và quy trình lập trình vi điều khiển bằng ngôn ngữ C.
  • Hoàn thiện mã nguồn C chuẩn hóa, không có lỗi cú pháp, đã được biên dịch tạo tệp .HEX trên Keil C và kiểm chứng mô phỏng thành công cho 05 mô-đun ứng dụng thực tế.
  • Thiết lập các thông số định thời và tính toán phần cứng chính xác:
    • Giá trị nạp Timer0: TH0 = 0x3C, TL0 = 0xB0 (định thời chu kỳ 50.000 µs trên tần số thạch anh 12 MHz).
    • Tách và giải mã thành công giá trị nhiệt độ tương tự từ cảm biến LM35 thông qua bộ chuyển đổi ADC 8-bit với độ lệch bù trừ 55 đơn vị.
    • Xây dựng mảng hằng số font chữ quét ma trận với quy mô 1.000 phần tử mảng (MA[1000]).

Giải pháp kỹ thuật tác giả đề xuất

  • Đề xuất quy trình chuyển dịch từ lập trình hợp ngữ sang ngôn ngữ C cho vi điều khiển, giúp giảm độ phức tạp khi quản lý ngăn xếp và thanh ghi.
  • Ứng dụng giải pháp mở rộng đường I/O bằng cách kết hợp vi điều khiển với các IC ghi dịch chuyên dụng (như 74HC595), cho phép điều khiển hệ thống ma trận LED lớn chỉ với 5 chân điều khiển từ Port 2.
  • Tối ưu hóa giải thuật ngắt thời gian thực: phân tách rõ ràng giữa chương trình phục vụ ngắt (ISR) để đếm thời gian và vòng lặp chính (main) để thực hiện các tác vụ hiển thị, tránh hiện tượng trễ hoặc nhấp nháy màn hình.

Đóng góp học thuật và đào tạo

  • Cung cấp tài liệu tham khảo có tính hệ thống cao cho môn học Thực tập Vi xử lý - Vi điều khiển tại Khoa Điện - Điện tử.
  • Cầu nối kiến thức giữa ba họ vi điều khiển phổ biến trong giảng dạy và công nghiệp: họ 8051 (89C51), họ PIC (16F877A) và họ AVR trên ba môi trường biên dịch C tương ứng (Keil C, CCS C, CodeVisionAVR).

Hạn chế và hướng nghiên cứu tiếp

Hạn chế

  • Trọng tâm mã nguồn chi tiết và các mạch mô phỏng thực nghiệm trong nội dung văn bản chủ yếu tập trung sâu vào dòng vi điều khiển 89C51; các phần về PIC 16F877A và AVR mới dừng lại ở mức giới thiệu khái quát đặc tính, cấu trúc lệnh và khung lý thuyết.
  • Toàn bộ các mô-đun ứng dụng được triển khai và kiểm thử trên môi trường mô phỏng phần mềm, chưa trình bày kết quả đo đạc thực tế trên mạch in phần cứng (PCB) trong điều kiện nhiễu công nghiệp.

Hướng nghiên cứu tiếp

  • Mở rộng xây dựng đầy đủ các bài tập mẫu và mã nguồn ứng dụng chi tiết cho vi điều khiển PIC 16F877A trên trình biên dịch CCS C và vi điều khiển AVR trên CodeVisionAVR tương đương với 5 mô-đun của họ 89C51.
  • Triển khai thi công mạch phần cứng thực tế, tích hợp thêm các chuẩn giao tiếp truyền thông nối tiếp công nghiệp (RS232, RS485, I2C, SPI) và khảo sát độ ổn định của hệ thống trong thực tế.

Giá trị tham khảo

Tài liệu là nguồn tư liệu học thuật và kỹ thuật giá trị dành cho:

  • Sinh viên ngành Kỹ thuật Điện, Điện tử, Tự động hóa, Cơ điện tử và Kỹ thuật Máy tính: Sử dụng làm tài liệu học tập, thực hành đồ án môn học Vi xử lý, Hệ thống nhúng và Kỹ thuật lập trình C cho vi điều khiển.
  • Giảng viên và kỹ sư thiết kế phần cứng: Tham khảo khung bài giảng thực hành, quy trình cấu hình công cụ Keil C, CCS C, CodeVisionAVR và các thuật toán điều khiển ngoại vi chuẩn mực (LED 7 đoạn, LED ma trận, LCD, ADC, cảm biến LM35).
  • Các phần đáng tham khảo nhất trong văn bản:
    • Bảng tổng hợp các kiểu dữ liệu và cú pháp hàm ngắt trong Keil C.
    • Thuật toán định thời chính xác 1 giây sử dụng ngắt Timer0 kết hợp chuyển đổi HEX-BCD hiển thị LED 7 đoạn (Mô-đun 2).
    • Thuật toán quét và mảng dữ liệu font chữ chạy trên bảng LED ma trận (Mô-đun 3).
    • Thư viện hàm giao tiếp màn hình LCD 16x2 và thuật toán đọc tín hiệu cảm biến nhiệt độ ADC (Mô-đun 4 và Mô-đun 5).

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

1. Tại sao khi khởi động lại (Reset) 89C51, con trỏ ngăn xếp SP nhận giá trị mặc định là 07H và tác giả đề xuất khởi tạo giá trị nào?

Khi hệ thống bị reset, con trỏ ngăn xếp SP tự động mang giá trị mặc định là 07H, do đó dữ liệu đầu tiên cất vào ngăn xếp sẽ nằm ở ô nhớ 08H (thuộc Bank thanh ghi 1). Nếu chương trình không khởi tạo lại giá trị cho SP thì các Bank thanh ghi 1, 2 và 3 có thể bị ngăn xếp ghi đè. Tác giả đề xuất sử dụng lệnh MOV SP, #5FH để ngăn xếp bắt đầu tại địa chỉ 60H và có dung lượng 32 byte (từ 60H đến 7FH trong RAM nội).

2. Thuật toán định thời tạo chu kỳ 1 giây trong Mô-đun 2 (Đồng hồ số) được thiết lập như thế nào?

Tác giả cấu hình Timer0 hoạt động ở chế độ 16-bit (TMOD = 0x01), nạp giá trị ban đầu TH0 = 0x3C và TL0 = 0xB0. Giá trị này tương ứng với khoảng thời gian đếm là 50.000 µs (50 ms) cho mỗi lần tràn cờ ngắt TF0. Trong hàm phục vụ ngắt timer0_int, biến đếm DEM tăng thêm 1 đơn vị. Tại vòng lặp chính, hệ thống kiểm tra điều kiện lặp lại 20 lần (while (DEM < 20)), tạo thành khoảng thời gian chuẩn xác: $50\text{ ms} \times 20 = 1.000\text{ ms} = 1\text{ giây}$, sau đó mới tăng biến giây (GIAY++).

3. Sự khác biệt cơ bản trong cơ chế xóa cờ ngắt giữa ngắt Timer và ngắt cổng nối tiếp trên 89C51 là gì?

Đối với ngắt Timer, cờ báo tràn TFx sẽ tự động được xóa bằng phần cứng ngay khi CPU chuyển quyền điều khiển đến chương trình phục vụ ngắt (ISR). Ngược lại, đối với ngắt cổng nối tiếp (gồm 2 nguồn phát TI và nhận RI), cờ ngắt không tự động xóa bằng phần cứng mà bắt buộc người lập trình phải xác định nguồn ngắt và xóa cờ TI hoặc RI bằng phần mềm (mã lệnh) bên trong chương trình phục vụ ngắt.

4. Thuật toán xử lý dữ liệu từ cảm biến nhiệt độ LM35 qua bộ chuyển đổi ADC trong Mô-đun 5 được thực hiện như thế nào?

Tín hiệu sau khi chuyển đổi ADC được vi điều khiển đọc qua Port 1 vào biến adc và trừ đi giá trị bù lệch 55 (adc = adc - 55). Nếu giá trị $\ge 0$, chương trình tính phần dư và phần nguyên để chia ra hàng đơn vị (dvi = adc % 10), hàng chục (chuc = tam % 10) và hàng trăm (tram = tam / 10), đồng thời triệt tiêu số 0 vô nghĩa ở đầu bằng cách gán về mã khoảng trắng (vị trí 11 trong mảng ký tự). Nếu giá trị âm, chương trình lấy giá trị tuyệt đối abs(adc) và gán vị trí dấu trừ (tram = 10) trước khi hiển thị lên LCD.

5. Dòng vi điều khiển PIC 16F877A sở hữu những đặc tính phần cứng nổi bật nào theo trình bày của tác giả?

PIC 16F877A là vi điều khiển kiến trúc RISC 8/16-bit của Microchip, tích hợp bộ nhớ chương trình Flash/ROM, bộ nhớ dữ liệu EEPROM nội có độ bền lên tới 1 triệu lần ghi/xóa, các cổng xuất nhập I/O, các bộ định thời Timer 8/16-bit, các bộ biến đổi ADC tích hợp độ phân giải 10/12-bit, hỗ trợ giao tiếp màn hình LCD và tích hợp sẵn khối điều khiển động cơ cùng khối đọc tín hiệu encoder.


Kết luận

Đồ án tốt nghiệp của tác giả Nguyễn Văn Biên đã hệ thống hóa toàn diện kiến trúc kỹ thuật và phương pháp lập trình ngôn ngữ C trên ba dòng vi điều khiển tiêu biểu là 89C51, PIC 16F877A và AVR. Thông qua việc phân tích sâu các thanh ghi chức năng, cấu trúc ngắt và thiết lập thành công 05 mô-đun ứng dụng thực tế trên trình biên dịch Keil C, tài liệu đã cung cấp các giải pháp chuẩn mực về điều khiển quét hiển thị, định thời gian thực và thu thập dữ liệu cảm biến. Đây là công trình kỹ thuật có giá trị tham khảo ứng dụng cao, phục vụ hiệu quả cho công tác giảng dạy, học tập và nghiên cứu phát triển hệ thống nhúng.