Giới thiệu dự án

Trong kỷ nguyên tự động hóa công nghiệp và kỹ thuật đo lường giám sát (Supervisory Control and Data Acquisition - SCADA), việc thu thập dữ liệu nhiệt độ từ xa đóng vai trò cốt lõi trong việc đảm bảo tính ổn định và an toàn của các dây chuyền sản xuất, động cơ công nghiệp, lò nhiệt luyện và các môi trường làm việc độc hại. Việc sử dụng các thiết bị đo cơ học truyền thống (như nhiệt kế thủy ngân hay đồng hồ cơ kim) bộc lộ nhược điểm lớn: không thể ghi nhận và lưu trữ tiến trình biến thiên nhiệt độ tự động, thiếu khả năng truyền tín hiệu về trung tâm điều khiển ở khoảng cách xa, và không có khả năng kích hoạt phản hồi điều khiển vòng kín.

Đồ án tốt nghiệp "Ứng dụng Visual Basic trong lập trình card giao tiếp máy tính dùng đo nhiệt độ" (ngành Điện - Điện tử, Trường Đại học Sư phạm Kỹ thuật TP.HCM, do sinh viên Hoàng Mạnh Long thực hiện dưới sự hướng dẫn của thầy Quách Thanh Hải) tập trung giải quyết bài toán cầu nối giữa phần cứng đo lường công nghiệp và phần mềm điều khiển trực quan trên hệ điều hành Windows. Đề tài xây dựng một hệ thống hoàn chỉnh từ tầng thu thập tín hiệu cảm biến, chuyển đổi tương tự - số (Analog-to-Digital Conversion - ADC), ghép nối với máy tính qua card mở rộng sử dụng vi mạch giao tiếp khả trình Intel 8255, cho đến tầng ứng dụng hiển thị giao diện đồ họa (GUI) thời gian thực bằng Microsoft Visual Basic 6.0.

+-----------------------------------------------------------------------------------+
|                                MỤC TIÊU DỰ ÁN                                     |
+-----------------------------------------------------------------------------------+
| 1. Thiết kế phần cứng card giao tiếp ISA dựa trên IC PPI 8255 và ADC 0809.        |
| 2. Xây dựng thư viện động 8255.dll bằng Visual C++ 6.0 để truy xuất cổng I/O.    |
| 3. Phát triển GUI Visual Basic 6.0 đo nhiệt độ đa kênh và vẽ đồ thị thời gian thực.|
| 4. Triển khai thuật toán đệm kép (Double Buffering) quản lý mảng 3600 phần tử.    |
+-----------------------------------------------------------------------------------+

Phương pháp tiếp cận của dự án kết hợp lập trình bậc thấp (Win32 Dynamic Link Library - DLL bằng C++) để trực tiếp điều khiển các thanh ghi I/O của cổng phần cứng với lập trình sự kiện bậc cao (Visual Basic 6.0) nhằm tối ưu hóa trải nghiệm người dùng, trực quan hóa dữ liệu đo và giảm tải xử lý đồ họa cho CPU.

  • Chỉ số đo lường kỳ vọng:
    • Hỗ trợ tối đa 8 kênh đo ngõ vào tương tự độc lập.
    • Độ phân giải lấy mẫu ADC 8-bit: $19.6\text{ mV/bit}$ trên dải điện áp chuẩn $V_{ref} = 5.0\text{V}$.
    • Độ nhạy chuyển đổi nhiệt độ: $0.05\text{V} / ^\circ\text{C}$ (tương đương $50\text{ mV} / ^\circ\text{C}$).
    • Tần suất lấy mẫu linh hoạt từ $1\text{ giây}$ đến $60\text{ phút}$.
    • Hệ thống đệm dữ liệu liên tục 3600 điểm ghi tương ứng với một chu kỳ đo dài hạn.
  • Phạm vi và giới hạn: Hệ thống giao tiếp qua khe cắm mở rộng chuẩn ISA Bus (Industry Standard Architecture) của máy vi tính x86, định địa chỉ phần cứng cố định trong không gian I/O từ 300H đến 303H, vận hành trên nền tảng hệ điều hành Microsoft Windows 95/98/NT.

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

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

Tại thời điểm phát triển, các giải pháp thu thập dữ liệu đo lường trên máy vi tính chủ yếu dựa vào nền tảng MS-DOS hoặc các ngôn ngữ thủ tục như Turbo Pascal. Dù đáp ứng được khả năng truy xuất cổng trực tiếp, các giải pháp này bộc lộ nhiều hạn chế về mặt tương tác và quản trị đa nhiệm.

Tiêu chí kỹ thuật Đo lường thủ công / VOM Giải pháp Turbo Pascal (DOS) Giải pháp Visual Basic 6.0 + Win32 DLL
Giao diện người dùng Kim chỉ thị / Màn hình LCD đơn sắc Giao diện ký tự / Đồ họa DOS 16 màu Giao diện đồ họa Win32 đa cửa sổ (GUI)
Lưu trữ dữ liệu Ghi chép thủ công Ghi tệp nhị phân đơn giản Tự động ghi tệp văn bản qua FileSystemObject
Cấu hình chu kỳ đo Thủ công Cố định trong mã nguồn Đặt linh hoạt từ 1s đến 60 phút qua ComboBox
Truy xuất phần cứng Không có Lệnh Port[] trực tiếp Gọi hàm thư viện động 8255.dll (__stdcall)
Khả năng đa nhiệm Độc lập Chiếm toàn bộ tài nguyên CPU Chạy đồng thời với các tác vụ Windows khác

Yêu cầu người dùng (Mô hình MoSCoW):

  • Must have (Bắt buộc phải có): Khởi tạo cổng PPI 8255, chọn kênh đo từ 1 đến 8 trên ADC 0809, chuyển đổi giá trị điện áp thành nhiệt độ chuẩn ($^\circ\text{C}$), hiển thị số liệu tức thời và đồ thị điểm.
  • Should have (Nên có): Cấu hình thời gian trễ lấy mẫu (Step time), thay đổi màu sắc đồ thị hiển thị qua hộp thoại CommonDialog ShowColor, lưu trữ dữ liệu đo vào tệp tin tạm thời filetam.
  • Could have (Có thể mở rộng): Xuất dữ liệu đa kênh đồng thời trên cùng một khung trục tọa độ, kích hoạt relay điều khiển đóng cắt thiết bị ngoại vi khi vượt ngưỡng nhiệt.
  • Won't have (Chưa hỗ trợ): Giao tiếp không dây hoặc chuẩn giao tiếp mạng Ethernet công nghiệp.

Thiết kế hệ thống

Kiến trúc hệ thống được phân tầng rõ rệt từ tầng cảm biến vật lý đến tầng giao diện người dùng, đảm bảo tính toàn vẹn của tín hiệu và khả năng cách ly lỗi phần cứng:

flowchart TD
    subgraph Signal_Acquisition["Tầng Thu Thập & Chuẩn Hóa Tín Hiệu"]
        S1["Cảm biến nhiệt độ (Thermistor / Cặp nhiệt / Transistor)"] --> OpAmp["Mạch tiền khuếch đại & Dịch mức (LM741)"]
        OpAmp --> ADC["Bộ chuyển đổi ADC 0809 (8 kênh Analog In)"]
    end

    subgraph Hardware_Card["Tầng Ghép Nối ISA Card"]
        ADC <--> PPI["IC ghép nối khả trình Intel 8255 (PPI)"]
        PPI <--> Buffer["IC đệm bus 8-bit hai chiều (74LS245)"]
        AddressBus["Bus địa chỉ A0 - A15"] --> Decoder["IC giải mã địa chỉ (7427, 7420, 7404)"]
        Decoder --> PPI
    end

    subgraph Bridge_Driver["Tầng Trình Điều Khiển Trung Gian (C++)"]
        Buffer <--> DLL["Thư viện liên kết động 8255.dll\n(_inp, _outp via conio.h)"]
    end

    subgraph Software_GUI["Tầng Ứng Dụng Visual Basic 6.0"]
        DLL <--> Mod["Module Khai Báo API Win32 (Module1.bas)"]
        Mod --> FrmMain["Cửa sổ chính (frmMain - Menu Controller)"]
        Mod --> FrmCustom["Cửa sổ cài đặt tham số (frmCustom)"]
        Mod --> FrmMeasure["Cửa sổ hiển thị đồ thị & dữ liệu (frmMeasure)"]
    end

Nguyên lý phân bổ địa chỉ I/O và tính toán tham số: Hệ thống sử dụng không gian địa chỉ cổng I/O 16-bit chuẩn công nghiệp cho IC 8255:

$$\begin{aligned} \text{Port A (PA)} &\rightarrow \mathbf{300H}\ (768_{10}) : \text{Nhận dữ liệu số 8-bit từ ngõ ra ADC 0809} \ \text{Port B (PB)} &\rightarrow \mathbf{301H}\ (769_{10}) : \text{Xuất tín hiệu chọn kênh và kích xung START/ALE/OE} \ \text{Port C (PC)} &\rightarrow \mathbf{302H}\ (770_{10}) : \text{Nhận tín hiệu báo kết thúc chuyển đổi (EOC) tại chân PC4} \ \text{Control Word} &\rightarrow \mathbf{303H}\ (771_{10}) : \text{Thanh ghi từ điều khiển cấu hình chế độ hoạt động} \end{aligned}$$

Mô hình toán học chuyển đổi tín hiệu: Bộ chuyển đổi ADC 0809 có điện áp chuẩn $V_{ref} = 5\text{V}$, xuất dữ liệu 8-bit tương ứng $256$ trạng thái logic ($0 \div 255$). Độ phân giải lượng tử hóa được tính như sau:

$$\text{Resolution} = \frac{V_{ref}}{2^8 - 1} = \frac{5.0\text{ V}}{255} \approx 19.6078\text{ mV/bit}$$

Tín hiệu điện áp từ mạch khuếch đại dịch mức tương ứng với nhiệt độ đo có tỉ lệ chuẩn $0.05\text{ V} / 1^\circ\text{C} = 50\text{ mV} / ^\circ\text{C}$. Công thức giải mã nhiệt độ thực tế:

$$\text{NhietDo} = \frac{\text{GiaTri} \times \text{Resolution}}{0.05\text{ V}} = \frac{\text{GiaTri} \times 19.6}{50} = \text{GiaTri} \times 0.392$$

Methodology

Quy trình phát triển được tổ chức theo mô hình thác nước tuần tự (Waterfall) kết hợp kiểm thử tích hợp phần cứng trong thời gian 6 tuần:

  1. Tuần 1 - Khảo sát và đặc tả: Phân tích nguyên lý ghép nối ISA, tập lệnh Intel 8255, các loại cảm biến nhiệt (Pt100, Thermistor, Cặp nhiệt Seebeck/Peltier).
  2. Tuần 2 - Thiết kế và chế tạo mạch: Thi công mạch in card giao tiếp gồm khối đệm 74LS245, khối giải mã 74LS20/74LS04, ADC 0809 và mạch khuếch đại thuật toán LM741.
  3. Tuần 3 - Lập trình tầng Driver C++: Xây dựng Dynamic Link Library 8255.dll trên Microsoft Visual C++ 6.0, định nghĩa xuất hàm bằng tệp .DEF.
  4. Tuần 4 - Lập trình giao diện VB6: Thiết kế hệ thống Menu (File, Set, Help), các Form điều khiển (frmMeasure, frmCustom), cấu hình CommonDialog.
  5. Tuần 5 - Thuật toán xử lý dữ liệu và kiểm thử tích hợp: Xây dựng giải thuật đệm mảng tĩnh 3600 phần tử, cơ chế ghi tệp tin đệm FileSystemObject, kiểm tra độ trễ hiển thị đồ thị.
  6. Tuần 6 - Hiệu chuẩn và hoàn thiện tài liệu: Hiệu chuẩn sai số nhiệt độ thực nghiệm, tối ưu hóa giao diện và hoàn tất đồ án.

Implementation và kết quả

Development process

1. Xây dựng Driver I/O Win32 (8255.dll) bằng Visual C++ 6.0

Hệ điều hành Windows 32-bit (Win32) khóa các lệnh truy xuất trực tiếp cổng vào/ra phần cứng từ ứng dụng người dùng bậc cao như Visual Basic. Giải pháp là biên dịch một DLL cấp thấp bằng Visual C++ sử dụng các hàm nội tại trong thư viện <conio.h>:

Mã nguồn tệp định nghĩa module 8255.def:

LIBRARY 8255
DESCRIPTION DLL FOR 8255 CARD
EXPORTS
    Out8255 @1
    In8255  @2

Mã nguồn tệp 8255.cpp:

// FILE: 8255.cpp - Biên dịch với Microsoft Visual C++ 6.0
#include <windows.h>
#include <conio.h>

// Hàm xuất dữ liệu ra cổng I/O
short _stdcall Out8255(int PortAddress, int PortData) {
    short Dummy;
    // Ép kiểu đảm bảo trả về số nguyên 16-bit tương thích Visual Basic Integer
    Dummy = (short)(_outp(PortAddress, PortData));
    return (Dummy);
}

// Hàm nhập dữ liệu từ cổng I/O
short _stdcall In8255(int PortAddress) {
    short PortData;
    PortData = (short)(_inp(PortAddress));
    return (PortData);
}

2. Khai báo API và Cấu trúc dữ liệu trong Visual Basic 6.0 (Module1.bas)

Trong Visual Basic 6.0, các hàm DLL được liên kết tĩnh thông qua từ khóa Declare:

Option Explicit

' Khai báo hàm API từ 8255.dll
Public Declare Function Out8255 Lib "8255.dll" (ByVal PortAddress As Integer, ByVal PortData As Integer) As Integer
Public Declare Function In8255 Lib "8255.dll" (ByVal PortAddress As Integer) As Integer

' Cấu trúc dữ liệu tọa độ điểm đo
Public Type thu
    x As Integer
    y As Integer
End Type

' Mảng dữ liệu cố định 3600 phần tử kết hợp đệm kép
Public mang(3600) As thu
Public FlagMeasure As Boolean
Public FlagCustom As Boolean
Public Flagtime As Boolean
Public Flagmang As Boolean
Public daudo As Integer
Public thoigian As Integer
Public Dummy As Integer

3. Thuật toán kích hoạt một chu kỳ đo tại frmCustom

Thuật toán giao tiếp tuần tự với phần cứng được thực thi khi nhận lệnh đo:

Private Sub cmdSet_Click()
    Dim EOC As Integer
    Dim Giatri As Integer
    Dim Nhietdo As Double
    
    Flagcustom = True
    Flagtime = True
    
    If (Flagcustom = True) Then
        ' 1. Chọn đầu đo (kênh ADC) và kích xung START thông qua Port B (769)
        Dummy = Out8255(769, daudo)
        
        ' 2. Thăm dò tín hiệu EOC (End of Conversion) tại Port C (770)
        EOC = In8255(770)
        If (EOC = 1) Then
            ' 3. Kích chân OE (Output Enable) để ADC đưa dữ liệu ra bus
            Dummy = Out8255(769, 32)
            
            ' 4. Đọc dữ liệu số 8-bit từ Port A (768)
            Giatri = In8255(768)
            
            ' 5. Quy đổi điện áp sang nhiệt độ chuẩn (độ C) và làm tròn
            Nhietdo = Giatri * 0.392
            Nhietdo = Round(Nhietdo)
        End If
        Flagcustom = False
    End If
End Sub

4. Giải thuật Đệm kép và Quản lý Mảng Dữ liệu liên tục

Để khắc phục hạn chế tràn mảng và tránh tình trạng vẽ dữ liệu rác khi card chưa cập nhật, hệ thống sử dụng thuật toán quản lý mảng với các ký tự lính canh:

  • Mảng 3600 phần tử được chia đôi: Nửa 1 ($0 \div 1799$), Nửa 2 ($1800 \div 3599$).
  • Điểm chốt chuyển đổi được gắn cờ EOF1 (tại chỉ số 1799) và EOF2 (tại chỉ số 3599).
  • Khi luồng vẽ (frmMeasure) chạm cờ EOF1, toàn bộ 1800 phần tử của nửa đầu lập tức được đổ (flush) vào tệp văn bản filetam (textfile.txt) thông qua Scripting.FileSystemObject, sau đó mảng được đặt lại giá trị "#". Quá trình tiếp diễn với nửa mảng thứ hai mà không làm gián đoạn luồng hiển thị.
' Trích đoạn vẽ đồ thị và xử lý mảng trong frmMeasure
Private Sub cmdStart_Click()
    Dim i As Integer
    i = 0
    Flagmang = True
    
    Do While (Flagmang = True)
        ' Kiểm tra giá trị hợp lệ trước khi vẽ
        If IsNumeric(mang(i).y) Then
            frmMeasure.Circle (Line1.X1 + i * 2, Line2.Y2 - mang(i).y * 10), 30, vbRed
        ElseIf mang(i).y = "EOF1" Then
            ' Đổ nửa mảng đầu vào tệp đệm và tiếp tục
            i = i + 1
        ElseIf mang(i).y = "EOF2" Then
            ' Đổ nửa mảng sau vào tệp đệm và quay vòng
            i = 0
        End If
        i = i + 1
        DoEvents ' Trả quyền điều khiển cho hệ điều hành tránh đơ giao diện
    Loop
End Sub

Testing và validation

Hệ thống đã trải qua quá trình kiểm thử toàn diện trên cấu hình máy tính Intel Pentium 133MHz, 32MB RAM, cài đặt Microsoft Windows 98 SE:

+-----------------------------------------------------------------------------------+
|                         KẾT QUẢ KIỂM THỬ ĐỘ CHÍNH XÁC                             |
+-------------------+--------------------+-------------------+----------------------+
| Nhiệt độ chuẩn    | Giá trị ADC 8-bit  | Tính toán lý thuyết| Kết quả hiển thị VB6 |
+-------------------+--------------------+-------------------+----------------------+
| 0.0 °C            | 0000 0000 (0)      | 0.00 °C           | 0 °C                 |
| 25.0 °C           | 0011 1111 (63)     | 24.70 °C          | 25 °C                |
| 50.0 °C           | 0111 1111 (127)    | 49.78 °C          | 50 °C                |
| 75.0 °C           | 1011 1111 (191)    | 74.87 °C          | 75 °C                |
| 100.0 °C          | 1111 1111 (255)    | 99.96 °C          | 100 °C               |
+-------------------+--------------------+-------------------+----------------------+
  • Tần suất lấy mẫu và độ trễ: Hệ thống hoạt động ổn định ở các bước thời gian: $1\text{s}$, $30\text{s}$, $60\text{s}$, $5\text{m}$, $10\text{m}$, $30\text{m}$, $60\text{m}$. Độ lệch thời gian lấy mẫu kiểm tra bằng hàm Timer ghi nhận $< 1.2%$.
  • Độ tin cậy giao diện: Nhờ hàm DoEvents và giải thuật chia mảng đệm kép, ứng dụng không xảy ra hiện tượng treo (Not Responding) dù chu kỳ vẽ điểm lặp lại liên tục 3600 lần.

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

  1. Phá vỡ giới hạn môi trường Win32 cho các ứng dụng đo lường Visual Basic: Visual Basic 6.0 thời kỳ đó được xem là ngôn ngữ chỉ dành cho các ứng dụng quản lý văn phòng/cơ sở dữ liệu. Bằng cách thiết kế 8255.dll viết bằng Visual C++ 6.0 đóng vai trò cầu nối, tác giả đã cung cấp một phương pháp luận chuẩn mực để VB6 giao tiếp trực tiếp với cổng I/O phần cứng với tốc độ thực thi gần như tức thời ($< 5\mu\text{s}$ cho mỗi thao tác INP/OUTP).
  2. Cải tiến cơ chế hiển thị và tùy biến trực quan: So với công trình tiền nhiệm viết trên nền Turbo Pascal, hệ thống mới nâng cấp toàn diện giao diện: cho phép người dùng tùy biến bảng màu đồ thị (Color Palette thông qua hộp thoại Windows API), tùy chọn ngõ vào đo từ 1 đến 8 chỉ bằng một thao tác click chuột trên ComboBox, và cung cấp hệ thống cảnh báo biên $0^\circ\text{C}$ và $100^\circ\text{C}$ qua các Option Button.
  3. Tối ưu hóa bộ nhớ trên phần cứng hạn chế: Phát triển thành công thuật toán "đệm mảng kép có lính canh" (Double-buffered Array with Sentinels) kết hợp tự động xả dữ liệu vào tệp đệm text. Giải pháp này giúp hệ thống hoạt động liên tục trong nhiều ngày mà dung lượng RAM chiếm dụng của tiến trình luôn ổn định ở mức $< 8\text{MB}$.

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

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

  • Giám sát lò nhiệt luyện công nghiệp: Đặt các cảm biến cặp nhiệt tại 8 vị trí khác nhau trong buồng đốt, truyền tín hiệu về card giao tiếp để theo dõi đường cong phân bố nhiệt độ theo thời gian.
  • Hệ thống tủ ấm vi sinh và nhà kính nông nghiệp: Đặt chu kỳ lấy mẫu dài ($5\text{ phút} \div 30\text{ phút}$), tự động ghi dữ liệu vào tệp tin để theo dõi điều kiện sinh trưởng của mẫu vật phẩm.
  • Giám sát trạm máy chủ / Phòng máy viễn thông: Cảnh báo tự động kích hoạt khi nhiệt độ môi trường vượt ngưỡng $50^\circ\text{C}$.

Yêu cầu triển khai hệ thống

+-----------------------------------------------------------------------------------+
|                        YÊU CẦU CẤU HÌNH HỆ THỐNG                                  |
+-----------------------------------------------------------------------------------+
| * Vi xử lý (CPU):     Intel 486DX/66MHz hoặc Intel Pentium (khuyến nghị).         |
| * Bộ nhớ RAM:         Tối thiểu 16MB cho Windows 95, 32MB cho Windows NT/98.      |
| * Ổ đĩa cứng:         Trống tối thiểu 50MB để cài đặt Runtime và lưu trữ dữ liệu. |
| * Giao tiếp phần cứng: 01 khe cắm mở rộng chuẩn ISA 8-bit hoặc 16-bit.            |
| * Hệ điều hành:       Microsoft Windows 95 / Windows 98 / Windows NT 4.0.         |
| * Tệp tin phân phối:  8255.dll (bắt buộc sao chép vào thư mục C:\Windows\System).  |
+-----------------------------------------------------------------------------------+

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

Hạn chế kỹ thuật

  • Ràng buộc chuẩn Bus ISA: Việc sử dụng khe cắm ISA khiến hệ thống khó nâng cấp lên các dòng bo mạch chủ máy tính đời mới (chỉ hỗ trợ khe PCI, PCIe).
  • Dạng biểu diễn đồ họa: Giao diện frmMeasure mới dừng lại ở dạng biểu diễn đồ thị điểm rời rạc (Point Plotting), chưa hỗ trợ nối đường cong nội suy (Spline Curve) hoặc phóng to/thu nhỏ (Zoom) vùng dữ liệu.
  • Hiển thị đơn kênh: Chưa hỗ trợ hiển thị đồng thời cả 8 kênh đo trên cùng một màn hình đồ thị trực quan (chỉ vẽ lần lượt từng kênh được chọn).

Hướng phát triển

  1. Chuyển đổi giao tiếp sang PCI / USB: Thay thế card ISA và IC 8255 bằng các vi điều khiển hiện đại (PIC, AVR, 8051) hoặc chip cầu nạp FTDI (FT232R, FT245) để kết nối qua cổng USB / Virtual COM Port.
  2. Mở rộng khả năng điều khiển vòng kín: Tận dụng 4 bit cao của Port C để xuất tín hiệu điều khiển Relay/Triac đóng cắt thiết bị gia nhiệt hoặc quạt tản nhiệt tự động theo ngưỡng cài đặt.
  3. Tự động hóa xuất báo cáo: Tích hợp tính năng tự động đẩy dữ liệu sang bảng tính Microsoft Excel thông qua cơ chế OLE/DDE Automation của Visual Basic.

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

  • Sinh viên ngành Kỹ thuật Điện tử - Tự động hóa: Nguồn tài liệu tham khảo chi tiết về kỹ thuật ghép nối máy tính, phương pháp giải mã địa chỉ cổng I/O và giải pháp gọi thư viện Win32 DLL từ ngôn ngữ bậc cao.
  • Kỹ sư phát triển hệ thống nhúng và DAQ: Tham khảo giải pháp tối ưu bộ nhớ đệm khi xử lý dữ liệu đo lường liên tục trên các hệ thống hạn chế tài nguyên.
  • Các cơ sở nghiên cứu và phòng thí nghiệm: Mô hình tham khảo để tự chế tạo các bộ thu thập dữ liệu giá thành thấp phục vụ công tác giảng dạy và thực nghiệm.

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

1. Yêu cầu kỹ thuật phần cứng và hệ điều hành để cài đặt và vận hành hệ thống là gì?

Hệ thống yêu cầu máy vi tính x86 có khe cắm mở rộng ISA, bộ vi xử lý từ 486DX 66MHz trở lên, RAM tối thiểu 16MB (Win95) hoặc 32MB (Win98/NT). Tệp thư viện 8255.dll phải được sao chép vào thư mục hệ thống C:\Windows hoặc C:\Windows\System để ứng dụng Visual Basic 6.0 có thể liên kết tự động khi khởi chạy.

2. Tại sao Visual Basic 6.0 cần thư viện 8255.dll viết bằng C++ thay vì giao tiếp trực tiếp?

Visual Basic 6.0 chạy trên môi trường Win32 Subsystem và không có các hàm cấp thấp như INP hay OUT (như trên QuickBASIC/DOS) để đọc/ghi thanh ghi I/O do cơ chế bảo vệ phần cứng của Windows. Thư viện 8255.dll viết bằng Visual C++ sử dụng các hàm nội tại _inp()_outp() từ thư viện <conio.h> với quy ước gọi hàm __stdcall, đóng vai trò cầu nối cho phép VB6 truyền tham số và nhận dữ liệu phần cứng một cách an toàn.

3. Làm thế nào hệ thống chuyển đổi giá trị nhị phân 8-bit từ ADC 0809 thành nhiệt độ thực tế (°C)?

Bộ ADC 0809 chia dải điện áp $V_{ref} = 5\text{V}$ thành 255 mức lượng tử, tương đương $19.6\text{ mV/bit}$. Tín hiệu ngõ vào đã được mạch tiền khuếch đại chuẩn hóa với độ nhạy $50\text{ mV} / ^\circ\text{C}$. Nhiệt độ được giải mã theo công thức:

$$\text{NhietDo} = \text{Round}\left(\frac{\text{GiaTri} \times 19.6\text{ mV}}{50\text{ mV}}\right) = \text{Round}(\text{GiaTri} \times 0.392)$$

Giá trị cuối cùng được làm tròn thành số nguyên bằng hàm Round() của VB6 để hiển thị.

4. Cơ chế đệm kép (Double Buffering) xử lý việc ghi mảng 3600 phần tử và vẽ đồ thị như thế nào?

Để tránh xung đột giữa luồng thu thập dữ liệu từ phần cứng và luồng vẽ đồ thị GUI, hệ thống sử dụng mảng tĩnh 3600 phần tử chia làm 2 nửa ($0 \div 1799$ và $1800 \div 3599$) kết thúc bằng cờ EOF1EOF2. Khi đồ thị vẽ tới cuối nửa mảng thứ nhất, dữ liệu của nửa này lập tức được ghi vào tệp văn bản đệm qua đối tượng FileSystemObject, đồng thời các phần tử được reset về ký tự lính canh "#". Luồng ghi tiếp tục chuyển sang nửa mảng thứ hai, đảm bảo dữ liệu không bị ghi đè và giao diện không bị giật lag.

5. Khả năng mở rộng và nâng cấp của hệ thống cho các dòng máy tính mới ra sao?

Mặc dù sử dụng card cắm khe ISA (chuẩn giao tiếp hiện đã lỗi thời trên các mainboard hiện đại), toàn bộ kiến trúc phần mềm (lớp giao diện VB6, cơ chế quản lý dữ liệu đệm kép và thuật toán chuyển đổi) hoàn toàn có thể tái sử dụng. Để nâng cấp, chỉ cần thay thế tầng driver 8255.dll bằng driver điều khiển cổng USB/Virtual Serial Port (sử dụng vi điều khiển ATmega, STM32 hoặc module FT232R) mà không cần viết lại giao diện người dùng.


Kết luận

Đồ án tốt nghiệp "Ứng dụng Visual Basic trong lập trình card giao tiếp máy tính dùng đo nhiệt độ" của tác giả Hoàng Mạnh Long đã hiện thực hóa thành công một giải pháp kỹ thuật toàn diện, giải quyết trọn vẹn chuỗi liên kết từ phần cứng thu thập tín hiệu ngoại vi đến phần mềm quản lý trực quan trên môi trường đồ họa Win32.

Thông qua việc kết hợp sáng tạo giữa thư viện C++ cấp thấp (8255.dll) và môi trường phát triển trực quan Visual Basic 6.0, đề tài không chỉ đạt được các chỉ tiêu kỹ thuật chính xác trong đo lường nhiệt độ đa kênh mà còn đặt nền móng lý thuyết và thực tiễn vững chắc cho các kỹ sư, sinh viên trong lĩnh vực phát triển hệ thống điều khiển ghép nối máy tính.