利用電腦並口 (LPT) 配合 AD7820 晶片自製 A/D 轉換介面,具成本低、免開機箱、開發彈性大等優勢。本文完整說明並口 SPP 模式腳位、控制/狀態暖存器、AD7820 腳位功能、電路原理圖、VC++ inp/outp 控制程式碼。
| 腳位 | 信號 | 方向 | 暖存器對應 |
| 2-9 | D0-D7 | 輸出 | 資料暖存器 (Base + 0) |
| 10 | ACK | 輸入 | 狀態暖存器 S6 (Base + 1) |
| 11 | BUSY | 輸入 | 狀態暖存器 S7 (Base + 1) |
| 12 | PE | 輸入 | 狀態暖存器 S5 (Base + 1) |
| 13 | SLCT | 輸入 | 狀態暖存器 S4 (Base + 1) |
| 14 | AUTOFD | 輸出 | 控制暖存器 C1 (Base + 2) |
| 15 | ERROR | 輸入 | 狀態暖存器 S3 (Base + 1) |
| 16 | INIT | 輸出 | 控制暖存器 C2 (Base + 2) |
| 17 | SLCTIN | 輸出 | 控制暖存器 C3 (Base + 2) |
| 18-25 | GND | - | - |
基址通常為 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 關鍵腳位與功能
| 腳位 | 名稱 | 功能 |
| 1 | Vin | 類比訊號輸入 (0~4.98V) |
| 2-9 | DB0-DB7 | 三態資料輸出 |
| 10 | WR/RDY | 寫控制/輸出就緒 |
| 11 | MODE | 模式選擇:低=讀模式,高=寫再讀模式 (本設計接地=讀模式) |
| 12 | RD | 讀控制,低電平啟用資料輸出 |
| 13 | INT | 中斷輸出,低電平=轉換完成 |
| 14 | GND | 地 |
| 15 | VREF(-) | 參考電壓負端 |
| 16 | VREF(+) | 參考電壓正端 |
| 17 | CS | 片選,低電平啟用 |
| 18 | OFL | 溢位旗標 |
| 19 | NC | 空腳 |
| 20 | VDD | +5V 電源 |
電路原理
- 啟動轉換:控制暖存器 C1 (Pin 14) 輸出負脈衝 → AD7820 WR/RDY → 開始轉換
- 等待完成:AD7820 INT (Pin 13) 接狀態暖存器 S7 (Pin 11),輪詢 S7 為低電平表示完成 (1.36μs)
- 讀取資料:
- 控制暖存器 C2 (Pin 16) = 低 → 74LS157 選擇低 4 位 (DB0-DB3) → 狀態暖存器 S3-S6 讀取
- 控制暖存器 C2 = 高 → 74LS157 選擇高 4 位 (DB4-DB7) → 狀態暖存器 S3-S6 讀取
- 組合 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 函數,即可打造功能完整的資料采集系統。雖硬體介面演進,但暖存器控制、輪詢同步、資料組合等核心思想在嵌入式開發中依具參考價值。
- 上一篇文章: C++ STL multimap 完整指南:重複鍵值關聯容器實戰
- 下一篇文章: VC++ 與 MATLAB 混合程式設計:Engine 介面完整實作指南
Copyright ©
程式碼之家 All Rights Reserved