?? sy1201.htm
字號:
<html>
<HEAD>
<TITLE>Visual C++與計算機接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312">
</HEAD>
<body>
<font color="#0000FF">計算機與外設的通信方式</font>
<p>
(一)實驗目的:<BR>
了解計算機與外設的通信方式<BR><BR>
(二)基礎知識<BR><BR>
1、設備寄存器<BR>
CPU為了能夠控制外部設備或與外部設備進行數據交換,需要通過讀寫與設備相關聯的寄存器同外圍設備進行通信。這些設備寄存器可分為:<BR>
·命令寄存器,這些寄存器中的位以某種方式控制設備——可以是啟動或放棄數據傳輸或者設備配置。<BR>
·狀態寄存器,這些寄存器通常供CPU讀取,反映設備的當前狀態。<BR>
·數據寄存器,這些寄存器用來在設備和計算機間傳輸數據。<BR>
簡單的設備(如并口)只有幾個相關的寄存器,而復雜的硬件(如顯卡)有許多寄存器。寄存器的數量和用途完全由硬件設計者定義,使用時可查閱設備的說明書。<BR><BR>
2、訪問設備寄存器<BR>
通常,設備寄存器位于連續的地址空間上。因此,第一個寄存器的地址是訪問其他寄存器必須的線索。<BR>
CPU對外部設備的設備寄存器的訪問方式有兩種:I/O端口地址訪問和存儲器映像訪問。<BR><BR>
(1) 存儲器映像訪問方式<BR>
有些設備的設備寄存器可以直接映射到CPU的內存空間上,也就是說,我們可以直接讀寫物理內存中的某一段地址,來完成對某個設備的控制或讀取設備的數據,當然,這段地址是由設備本身規定的。<BR>
例如,在DOS下編程時,可以使屏幕進入圖象模式,例如640*480*16色或320*200*256色,此時,從0xA000開始的內存地址,就被顯卡占用,以存放在屏幕上顯示的各像素顏色值。我們可以直接修改這段內存的內容,以實現在屏幕上的繪圖。<BR><BR>
(2) I/O端口地址訪問方式<BR>
在許多種類的CPU中,會準備一塊單獨的總線和地址空間,這些地址稱為端口地址或I/O地址,它們與內存地址完全隔離,需要用特別的I/O指令來訪問。<BR>
在Intel的CPU中,I/O端口地址是64K,即0x0000至0xFFFF,其中0x0000-0x00FF間的地址只用于主板上的設備,0x0100-0x03FF間的地址用于插入式板卡。<BR><BR>
在現在的計算機系統中,已經基本上都是即插即用的設備,對它們的訪問,通常都要經過驅動程序。<BR><BR>
3、驅動程序<BR>
現在,通常,每個與計算機相連接的外部設備都會帶有驅動程序。<BR>
設備驅動程序提供連接到計算機的硬件的軟件接口,應用程序或計算機系統可以通過驅動程序以一種規范的方式訪問硬件,而不必考慮控制硬件的細節。<BR>
驅動程序是一個軟件,在裝入后成為操作系統內核的一部分。它使一個或多個設備可被使用,每個設備代表一個物理的或邏輯的硬件。<BR>
在Windows中,驅動程序總是使設備看起來像是一個文件,可以打開設備的一個句柄,然后應用程序可以在設備句柄關閉之前向驅動程序發出讀寫請求。<BR><BR>
(三)數據采集設備訪問實例<BR><BR>
1、存儲器映像訪問方式<BR><BR>
IMP是英國一家公司生產的一種數據采集器,主要用于采集溫度信號或一些緩變的動態信號,每個IMP由10或20個通道。<BR>
IMP的通過插入計算機內的IMP4A卡和特定網線,可將最多32臺IMP串聯成一個網絡,由一臺計算機進行控制和采集數據。<BR>
IMP4A卡與計算機的通信是采用內存映像方式,它將自己的設備寄存器映射到從0xCA00或0xD000起的512個字節中。應用程序可以訪問或修改這些地址,以控制IMP設備或讀取采集到的數據。<BR><BR>
SelPage(CONFIG_PAGE); //選擇控制頁<BR>
for(i=0x100-1;i>=0;i--) *(pImp4A+i)=0x0; //初始化<BR>
*(pImp4A+0x0100)=0x0C0; //啟動IMP<BR>
<BR>
SelPage(TX_PAGE); //選擇命令頁<BR>
for(i=0;i < len;i++) *(pImp4A+i)=*(sCommand+i); //將命令字符串放入映像內存<BR>
SelPage(CONFIG_PAGE); //選擇控制頁<BR>
*(pImp4A+0x0E8)=0x80; //傳輸命令<BR>
<BR>
do{<BR>
bl=(*bImpAdd-1)*4;<BR>
al=*(pImp4A+bl);<BR>
}while((al & 0x80) == 0); //等待命令執行<BR>
<BR>
SelPage(bImpAdd+1); //選擇相應的IMP數據頁<BR>
BYTE a=*(pImp4A+bImpChannel*2+0);<BR>
BYTE b=*(pImp4A+bImpChannel*2+1);<BR>
WORD wValue=a+b*256; //得到相應IMP相應通道的數據<BR><BR>
2、I/O端口地址訪問方式<BR><BR>
PCLD818數據采集卡是臺灣研華生產的一種數據采集卡,它有16路AD通道和16路DI通道,每路AD通道還可以由PCLD788卡擴展接到16路信號上。
PCLD818卡可以設置采樣頻率和輸入范圍,可以用于采集振動數據和其它動態信號。<BR>
PCLD818卡的控制方式是通過I/O端口地址訪問方式插入計算機內的IMP4A卡和特定網線,可將最多32臺IMP串聯成一個網絡,由一臺計算機進行控制和采集數據。<BR>
PCLD818卡與計算機的通信是采用I/O端口地址訪問方式,計算機通過從它的基地址開始的32字節的I/O端口對它進行控制和讀取采集到的數據。<BR>
PCLD818卡中設有FIFO的緩存,通常在數據半滿時開始讀取數據。<BR><BR>
_outp(w818Add+1,8); //設置輸入范圍為+/-10伏<BR>
_outp(w818Add+2,2); //設置采集通道<BR>
_outp(w818Add+13,11); <BR>
_outp(w818Add+14,71); //通過13號和14號寄存器設置采樣頻率為5K<BR>
_outp(w818Add+25,FIFOEMPTY); //清空FIFO標志<BR>
do <BR>
{<BR>
state=_inp(w818Add+25); //檢測FIFO標志<BR>
if((state & RG_HALFFULL)==RG_HALFFULL) //if it is half full<BR>
{<BR>
bADLow=_inp(w818Add+23); //讀低位<BR>
bADHigh=_inp(w818Add+24); //讀高位<BR>
bChannelID=bADLow&0x0f; //計算當前數據屬于哪一個818通道<BR>
data[n]=(bADLow&0xf0)/16+bADHigh*16;<BR>
n++;<BR>
}<BR>
}while(n < len); //緩沖區裝滿數據則返回<BR><BR>
3、通過驅動程序的訪問方式<BR><BR>
通過外部設備的驅動程序,也可以對外部設備進行訪問。<BR>
對于標準設備,可以通過調用Windows API進行編程,這些Windows API會調用相應的驅動程序與硬件通訊,例如前面實驗的聲卡編程和視卡編程。<BR>
對于其他設備,則一般來說,需要設備制造者提供開發包SDK,它通常是一個或多個DLL。開發者通過調用DLL里的函數,間接的調用驅動程序與硬件通訊。例如前面實驗的視卡SDK編程<BR><BR>
</p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -