首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 並口數據采集實作:AD7820 A/D 轉換電路與軟體控制

     編輯:關於VC++

前言

利用電腦並口 (LPT) 配合 AD7820 晶片自製 A/D 轉換介面,具成本低、免開機箱、開發彈性大等優勢。本文完整說明並口 SPP 模式腳位、控制/狀態暖存器、AD7820 腳位功能、電路原理圖、VC++ inp/outp 控制程式碼。

並口 SPP 模式腳位定義 (DB-25 母座)

基址通常為 0x378。狀態暖存器 = Base+1,控制暖存器 = Base+2。

暖存器位元定義

控制暖存器 (Base+2 = 0x37A) - 僅低 5 位有效


Bit 0 (C0) : STROBE (Pin 1)
Bit 1 (C1) : AUTOFD (Pin 14) → 本設計用此產生 A/D 啟動脈衝
Bit 2 (C2) : INIT (Pin 16) → 本設計用此控制 74LS157 選擇高/低 4 位
Bit 3 (C3) : SLCTIN (Pin 17)
Bit 4 (C4) : IRQ Enable

狀態暖存器 (Base+1 = 0x379) - 僅高 5 位有效


Bit 7 (S7) : BUSY (Pin 11) → 接 AD7820 RDY/INT,低電平表示轉換完成
Bit 6 (S6) : ACK (Pin 10)
Bit 5 (S5) : PE (Pin 12)
Bit 4 (S4) : SLCT (Pin 13)
Bit 3 (S3) : ERROR (Pin 15) → 接 74LS157 輸出 D3-D0 (低/高 4 位資料)

AD7820 關鍵腳位與功能

腳位信號方向暖存器對應
2-9D0-D7輸出資料暖存器 (Base + 0)
10ACK輸入狀態暖存器 S6 (Base + 1)
11BUSY輸入狀態暖存器 S7 (Base + 1)
12PE輸入狀態暖存器 S5 (Base + 1)
13SLCT輸入狀態暖存器 S4 (Base + 1)
14AUTOFD輸出控制暖存器 C1 (Base + 2)
15ERROR輸入狀態暖存器 S3 (Base + 1)
16INIT輸出控制暖存器 C2 (Base + 2)
17SLCTIN輸出控制暖存器 C3 (Base + 2)
18-25GND--
腳位名稱功能
1Vin類比訊號輸入 (0~4.98V)
2-9DB0-DB7三態資料輸出
10WR/RDY寫控制/輸出就緒
11MODE模式選擇:低=讀模式,高=寫再讀模式 (本設計接地=讀模式)
12RD讀控制,低電平啟用資料輸出
13INT中斷輸出,低電平=轉換完成
14GND地
15VREF(-)參考電壓負端
16VREF(+)參考電壓正端
17CS片選,低電平啟用
18OFL溢位旗標
19NC空腳
20VDD+5V 電源

電路原理

  1. 啟動轉換:控制暖存器 C1 (Pin 14) 輸出負脈衝 → AD7820 WR/RDY → 開始轉換
  2. 等待完成:AD7820 INT (Pin 13) 接狀態暖存器 S7 (Pin 11),輪詢 S7 為低電平表示完成 (1.36μs)
  3. 讀取資料:
    • 控制暖存器 C2 (Pin 16) = 低 → 74LS157 選擇低 4 位 (DB0-DB3) → 狀態暖存器 S3-S6 讀取
    • 控制暖存器 C2 = 高 → 74LS157 選擇高 4 位 (DB4-DB7) → 狀態暖存器 S3-S6 讀取
  4. 組合 8 位元:高 4 位左移 4 位後與低 4 位 OR 合併

VC++ 控制程式碼 (conio.h inp/outp)


#include <conio.h>
#include <stdio.h>

void main()
{
    unsigned char dataLow, dataHigh, dataInput;
    int result;

    // 1. 清理並口
    outp(0x37A, 3); // C0=1, C1=1 (非啟動狀態)

    // 2. 啟動 A/D 轉換:C1 拉低產生負脈衝
    outp(0x37A, 0); // C1=0

    // 3. 等待轉換完成:輪詢 S7 (Bit 7)
    do {
        dataInput = inp(0x379) & 0x80; // 讀取 S7
    } while (dataInput != 0x80); // S7=1 表示忙碌,等待變 0

    // 4. 讀取低 4 位 (C2=0)
    dataLow = inp(0x379);        // 讀取狀態暖存器
    dataLow = dataLow & 0x78;    // 取 S3-S6 (Bit 3-6)
    dataLow = dataLow >> 3;      // 右移對齊到 Bit 0-3

    // 5. 切換讀取高 4 位 (C2=1)
    outp(0x37A, 0x04); // 設定 C2=1 (Bit 2)
    dataHigh = inp(0x379);
    dataHigh = dataHigh & 0x78;
    // dataHigh 已在 Bit 3-6,左移 1 位即為 Bit 4-7

    // 6. 結束轉換
    outp(0x37A, 3); // 恢復初始狀態

    // 7. 合併 8 位元結果
    dataHigh = dataHigh << 1;        // Bit 3-6 → Bit 4-7
    result = dataHigh | dataLow;     // 組合

    printf("A/D Result: %d (0x%02X)\n", result, result);
    // 後續可轉換電壓: Voltage = result * 5.0 / 256
}

硬體實作要點

  • 74LS157 為 4 路 2 選 1 選擇器,地址端接 C2 (Pin 16)
  • AD7820 CS (Pin 17) 接地常時啟用
  • VREF(-) 接地,VREF(+) 接 5V (或精密基準源)
  • 並口纜線長度建議 < 2m,避免干擾
  • 輸入電壓範圍 0~VREF(+),超出會產生溢位 (OFL)

應用場景與限制

優點限制
極低成本 (晶片+少量元件)即時性一般 (輪詢模式,Windows 非即時 OS)
佔用並口,不佔擴充槽解析度 8 位 (256 階),精度有限
開發簡單 (inp/outp 即可)並口漸趨淘汰,新電腦需 USB-並口轉接
適合教學/簡易監測不適合高速/高精度/工業級應用

結語

並口 A/D 轉換是「軟硬結合」經典教學案例。理解並口暖存器位元映射、AD7820 時序、74LS157 多工技巧,配合 VC++ 底層 I/O 函數,即可打造功能完整的資料采集系統。雖硬體介面演進,但暖存器控制、輪詢同步、資料組合等核心思想在嵌入式開發中依具參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved