C语言在测量与控制中应用课件_第1页
C语言在测量与控制中应用课件_第2页
C语言在测量与控制中应用课件_第3页
C语言在测量与控制中应用课件_第4页
C语言在测量与控制中应用课件_第5页
已阅读5页,还剩303页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章緒論C語言是使用最廣泛的一種程式設計語言,是測量﹑控制﹑通訊領域中最常見的程式設計語言。常用的C語言版本有:TurboC2.0,BorlandeC++,VisalC++6.0,win-tc1.即時測量系統程式設計。2.即時通訊系統程式設計。3.即時控制系統程式設計。C語言在控制領域的應用:1.1C語言的特點2.模組化能力強3.數據類型豐富4.運算符豐富5.可移植性好6.提供豐富的庫函數7.執行速度快8.控制硬體處理中斷的能力強9.繪圖能力強10.可與其它語言混合編程1.語言表達能力強1.2工業PC工業PC特點1.採用無源底板匯流排插槽系統2.採用小板結構,抗震動衝擊好全長CPU板半長CPU板PC104系列模組3.全鋼結構封閉機箱4.採用工業級電源5.可配時間監視器,程式跑飛時自動重啟6.可配即時多任務操作系統7.配有豐富的工業控制組態軟體8.硬體配置靈活,擴展升級方便9.機箱有各種不同形式10.冗餘性好,後備設施齊全即時測控系統實例之一即時測控系統實例之二第2章端口、記憶體I/O與位運算2.1端口輸入/輸出函數

電腦的CPU要與外設間傳遞資訊,必須通過硬體的介面電路來進行。介面電路通常包含一些寄存器,如數據寄存器、狀態寄存器、控制寄存器等。一般稱這些寄存器為I/O(輸入/輸出)端口。

PC系列微機用10條地址線對端口尋址尋址範圍為0x00~0x3ffC語言為了控制端口的輸入/輸出擴展了一些非標準的系統函數8位端口輸入函數inportb()函數原型:unsignedcharinportb(intportid);功能:從地址為portid的8位端口輸入一個位元組(8位),

所讀的值是該函數的返回值,由頭檔dos.h說明。用法:#include<dos.h>unsignedcharb;

… b=inportb(端口地址);8位端口輸出函數outportb()函數原型:voidoutportb(intportid,unsignedcharvalue);功能:向地址為portid的8位端口輸出一個位元組(8位),其值為value,由頭檔dos.h說明。用法:#include<dos.h>

… outportb(端口地址,無符號字元型數據或變數);16位端口輸入函數inport()函數原型:intinport(intportid);功能:從地址為portid的16位端口輸入一個字(16位),

所讀的值是該函數的返回值,由頭檔dos.h說明。用法:#include<dos.h> intw; … w=inport(端口地址);16位端口輸出函數outport()函數原型:voidoutport(intportid,intvalue);功能:向地址為portid的16位端口輸出一個字(16位),其值為value,由頭檔dos.h說明。用法:#include<dos.h>

… outport(端口地址,整型數據或變數);2.2位運算

位運算是直接對運算元的二進位位(bit)進行操作。按二進位位的邏輯運算對控制電腦硬體非常有用。C語言的位運算符有:按位與&,按位或|,按位異或^,按位取反~,左移<<,右移>>。位運算符只能用於有符號或無符號的字元型、整型、長整型數據的運算,不能用於浮點數和雙精度數據的運算。(1)按位與運算符&運算規則:0&0=0,0&1=0,1&0=0,1&1=1若a=0x55,b=0xf0a&b=?

01010101(a=0x55)&)11110000(b=0xf0)01010000(c=0x50)規律:跟1相與不變,跟0相與清零用途:按位的與運算可使某些位清0,

其他位不變.

(2)按位或運算符|運算規則:0|0=0,0|1=1,1|0=1,1|1=1若a=0x55,b=0xf0c=a|b=?

01010101(a=0x55)|)11110000(b=0xf0)11110101(c=0xf5)規律:跟1相或置1,跟0相或不變用途:按位的或運算可使某些位置1,

其他位不變.

(3)按位異或運算符^運算規則:0^0=0,0^1=1,1^0=1,1^1=0相同為0,不同為1若a=0x55,b=0xf0,c=a^b=?01010101 (a=0x55)^)11110000 (b=0xf0)10100101 (c=0xa5)規律:跟1相異或取反,跟0相異或不變用途:按位異或運算可使某些位取反,其他位不變(4)按位非運算符~

按位非運算也叫按位反運算,他將運算元的每個二進位位都取反,即0變成1,1變成0。若a=0x55對應的二進位數為01010101則~a=0xaa對應的二進位數為10101010(5)按位左移運算符

按位左移運算符<<用於將變數的每一位向左移動左移運算的一般運算式為:

被移位變數名<<左移的位數左移後右端的空位補0

01011001左移一位結果為:10110010左移一位相當乘2,左移運算常用於快速的乘法(6)位右移運算符>>按位左移運算符>>用於將變數的每一位向右移動右移運算的一般運算式為:

被移位變數名>>右移的位數無符號數右移後左端的空位補0。有符號數左端最高位(MSB)是符號位,右移後補充符號位,以保持符號不變。右移一位相當除2,右移運算常用於快速的除法2.4記憶體單元讀/寫函數C語言可直接訪問記憶體單元的物理地址。86系列CPU微機的記憶體地址是分段表示的,包括一個16位的段地址和一個16位的段內偏移地址。地址通常用16進制數表示。(1)peekb()函數函數的格式為:charpeekb(int

segment,unsignedoffset);

該函數返回由segment(段地址)和offset(偏移地址)指定地址的一個記憶體單元中的值(8位),由dos.h說明。程式舉例:

#include<dos.h> main() { char b;

b=peekb(0xf000,0xfffe); printf(“%x\n”,(unsignedchar)b);}(2)peek()函數函數的格式為:intpeek(int

segment,unsignedoffset);

該函數返回由segment(段地址)和offset

(偏移地址)指定首地址的兩個相鄰記憶體單元中的值(16位),由dos.h說明。(3)pokeb()函數函數的格式為:

voidpokeb(int

segment,unsignedoffset,charvalue);

該函將一個位元組的值value,存到由segment(段地址)和offset

(偏移地址)所指定的記憶體單元中,由dos.h說明。程式舉例:

#include<dos.h> main() { pokeb(0x0040,0x0017,1); }(4)poke()函數

該函將一個字的值value,存到由segment(段地址)和offset

(偏移地址)所指定首地址的兩個連續記憶體單元中,由dos.h說明。函數的格式為:

voidpoke(int

segment,unsignedoffset,intvalue);第3章硬體中斷程式設計3.1實模式下的中斷系統

中斷(interrupt)是指電腦“中斷”了正在執行的程式,轉去處理一個突發的緊急事件的過程。處理這個緊急事件,電腦要執行一個相應的中斷服務副程式。處理完畢之後,電腦又要接著執行剛才被中斷了的程式。引起中斷的事件稱為中斷源。86系列CPU的中斷源

86系列CPU可處理256個型號的中斷,中斷類型號為0x000xff。

不可遮罩中斷NMI

可遮罩中斷INTR

外部中斷內部中斷

微處理器產生的中斷中斷指令產生的軟體中斷中斷源外部中斷

外部中斷通過CPU的管腳NMI和INTR申請中斷,也稱硬體中斷。 中斷允許標誌IF可遮罩INTR中斷。0:禁止CPU回應INTR中斷

1:允許CPU回應INTR中斷IF=內部中斷

內部中斷包括微處理器產生的中斷和軟體中斷指令產生的軟體中斷。

微處理器產生的中斷如單步中斷,除法出錯中斷,溢出中斷。

軟體中斷是由中斷指令產生的中斷,主要包括DOS中斷和BIOS中斷。DOS中斷和BIOS中斷位用戶提供了很多有用的功能,C語言也可以使用這些中斷。中斷向量表

記憶體中最低地址開始的1024個位元組作為中斷向量表,存放中斷服務副程式的地址,每個型號的中斷占4個位元組。

CPU回應中斷請求後,根據中斷類型號到中斷向量表中找出該型號中斷服務程式的地址,執行相應的中斷服務程式。3.2有關硬體中斷的幾個函數

硬體中斷程式設計包括兩個部分: 1)寫一個中斷服務副程式,要寫成中斷函數的形式。

2)設置中斷向量,即把中斷服務副程式的地址放到中斷向量表中去。(1)中斷服務函數

中斷服務副程式要寫成函數形式,用關鍵字 interrupt說明。

void interruptmyint(void){

函數體}

自定義函數在使用前要說明,格式如下:

void interruptmyint(void);(2)設置中斷向量函數setvect()

函數格式如下,由dos.h說明:

voidsetvect(intnum,voidinterrupt(*isr)());num---中斷類型號,isr---指向中斷服務函數的函數指針

若中斷類型號為0x08,中斷服務函數名為myint,程式如下:

#include<dos.h> … setvect(0x08,myint); (3)獲取中斷向量函數getvect()voidinterrupt(*getvect(intintr_num))();從中斷向量表中取出指定中斷類型號的中斷服務函數的地址,賦給一個函數指針,由dos.h說明。

函數用法舉例:

#include<dos.h> voidinterrupt(*oldint)();

… oldint=getvect(中斷類型號);(4)遮罩中斷函數disable()將IF清0,禁止CPU回應INTR中斷,由dos.h說明。函數原形:voiddisable(void);用法:

#include<dos.h>

… disable();(5)開放中斷函數enable()將IF置1,允許CPU回應INTR中斷,由dos.h說明。函數原形:voiddisable(void);用法:

#include<dos.h>

… enable();3.38259A中斷控制器8259A為CPU管理硬體中斷,一片8259A可管理8個硬體中斷源,級聯使用可管理更多的硬體中斷.PC系列微機中相當有兩片8259A級聯,管理15個硬體中斷源.8259A的結構中斷請求寄存器控制邏輯IRR

中斷遮罩寄存器IMR

內部匯流排優先權處理器中斷服務寄存器ISR數據匯流排緩衝器讀/寫邏輯級聯緩衝比較器WRA0CSRDD0~D7

SP/EN

INTA

INTIR0

IR1

IR2IR3

IR4IR5

IR6IR7

CAS0CAS1CAS2IRR,IMR

1.中斷請求寄存器IRRIRi(i=07)上有中斷請求時,IRR相應位置1。

2.中斷遮罩寄存器IMRIMR第i位置1,遮罩IRi上的中斷請求。

優先權處理器,ISR

3.優先權處理器根據中斷遮罩情況及優先順序順序,決定將那個中斷請求送往CPU。

4.中斷服務寄存器ISR

若某個中斷請求被CPU回應,則相應位置1。8259A的編程

8259A接受來自CPU的兩類命令字:初始化命令字ICW和操作命令字OCW。 初始化命令字有4個:ICW1,ICW2,ICW3,ICW4。 操作命令字有3個:OCW1,OCW2,OCW3。 命令字都是8位的。初始化命令字ICW1D7D6D5D4D3D2D1D0XXX1LTIMXSNGLIC4A00

A0=0,D4=1是ICW1的標誌。

LTIM=1:中斷請求是電平觸發。

LTIM=0:中斷請求是邊沿觸發。

SING=1:單片8259A工作。

SING=0:多片8259A級聯。

IC4=1:初始化包括ICW4。

IC4=0:初始化不包括ICW4。初始化命令字ICW2A01D7D6D5D4D3D2D1D0T7T6T5T4T3

每片8259A可管理8個硬體中斷源,每個中斷源都要分配一個中斷類型號。T7~T3確定中斷類型號的高5位,低3位由IRi(i=0~7)的序號決定。初始化命令字ICW3

表明主從連接的方式,但主片與從片的格式不同。 主片格式:D7D6D5D4D3D2D1D0S7S6S5S4S3S2S1S0A01Si=1:IRi接了從片;Si=0:IRi未接從片。從片格式:D7D6D5D4D3D2D1D0ID2ID1ID0A01若該從片接到主片IRi上,ID2~ID0的編碼為i。初始化命令字ICW4A01D7D6D5D4D3D2D1D0000SFNMBUFM/SAEOIµPMA0=1,D7~D5=0,是ICW4的標誌。SFNM=1:特殊全嵌套方式;SFNM=0:普通全嵌套方式。BUF=1:緩衝方式;BUF=0:非緩衝方式。M/S=1:主片(BUF=1時有效);M/S=0:從片(BUF=1時有效)AEOI=1自動中斷結束方式AEOI=0:非自動中斷結束(EOI)µPM=1:86系列CPU;µPM=0:非86系列CPU。普通全嵌套方式

普通全嵌套方式也叫固定優先權方式。 優先權從IR0到IR7依次遞降。 級別高的中斷請求可以中斷級別低的中斷服務副程式。 一中斷被回應的過程中,自動遮罩同級和更低級別的中斷。操作命令字OCW1A01D7D6D5D4D3D2D1D0M7M6M5M4M3M2M1M0OCW1是中斷遮罩命令字Mi=1:遮罩IRi的中斷請求。Mi=0:允許IRi的中斷請求。操作命令字OCW2A00D7D6D5D4D3D2D1D0RSLEOI00L2L1L0A0=0,D4=0,D3=0是OCW2的特徵。R=1:迴圈優先權;R=0:固定優先權。SL=1:操作在L2~L0指定的級別上進行。SL=0:L2~L0無效。EOI=1:中斷結束命令。清除ISR中優先權最高的置1位。EOI=0:不起作用。迴圈優先順序方式

迴圈優先順序方式由OCW2的R=1設定,分優先順序自動迴圈方式和優先順序指定迴圈方式兩種。

優先順序自動迴圈方式:初始時,優先順序從IR0到IR7依次遞降。剛執行完的中斷,級別輪為最低。

優先順序指定迴圈方式:可由軟體指定最低優先順序。

R=1,SL=1,EOI=0,L2~L0編碼指定中斷源IRi。 例如:OCW2=11000011B=0xc3表示設置IR3為最低優先順序。

IR4IR5IR6IR7IR0IR1IR2IR3

高低操作命令字OCW3A00D7D6D5D4D3D2D1D0XESMMSMM01PRRRISA0=0,D4=0,D3=1是OCW3的特徵。

ESMM=1,SMM=0:設置特殊遮罩ESMM=1,SMM=1:清除特殊遮罩

P=1:發查詢命令;P=0:不發查詢命令RR=1,RIS=0:讀IRR寄存器RR=1,RIS=1:讀ISR寄存器8259A在PC機中的I/O端口地址PC機中相當有兩片8259A級聯,一個主片,一個從片。ICW1ICW2ICW3ICW4OCW1OCW2OCW3主片0x200x210x210x210x210x200x20從片0xa00xa10xa10xa10xa10xa00xa0主片初始化程式 MOV AL,11H;ICW1 OUT 20H,AL JMP SHORT$+2 MOV AL,08H;ICW2 OUT 21H,AL JMP SHORT$+2 MOV AL,04H;ICW3 OUT 21H,AL JMP SHORT$+2 MOV AL,01H;ICW4 OUT 21H,AL00010001B中斷類型號從8開始00000100BIR2接從片00000001BICW1=11H=00010001BD7D6D5D4D3D2D1D000010001邊沿觸發級聯初始化編程包括ICW4ICW4=01H=00000001BD7D6D5D4D3D2D1D000000001不用一般全嵌套方式非緩衝非自動中斷結束86系列CPU從片初始化程式MOV AL,11H;ICW1OUT 0A0H,ALJMP SHORT$+2MOV AL,70H;ICW2OUT 0A1H,ALJMP SHORT$+2MOV AL,02H;ICW3OUT 0A1H,ALJMP SHORT$+2MOV AL,01H;ICW4OUT 0A1H,AL初始化的順序ICW2ICW3ICW4ICW1級聯?要ICW4?NYNY一條地址線,只有兩個地址,靠地址,順序和特徵區分七個命令字。思想方法可以借鑒!中斷源IR0 日時鐘(8254通道0)IR1 鍵盤

IR8 即時鐘

IR9 軟體重新指向INT0AH IR10 保留IR2 IR11 保留

IR12 保留

IR13 協處理器

IR14 硬碟

IR15 保留IR3 串口2IR4 串口1IR5 並口2IR6 軟碟IR7 並口1(印表機口)

中斷類型號主片中斷源:從片中斷源:IR7IR6IR6IR4IR3IR2IR1IR00x0f0x0e0x0d0x0c0x0b0x0a0x090x08IR15IR14IR13IR12IR11IR10IR09IR080x770x760x750x740x730x720x710x70遮罩中斷源

中斷遮罩命令字OCW1可遮罩中斷源的中斷請求。 例如,欲遮罩鍵盤和串口1,不改變其他中斷源的遮罩情況。

charb;

……

b=inportb(0x21); b=b|0x12; outportb(0x21,b);EOI命令

PC機中8259A初始化規定為普通(非自動)中斷結束方式。在中斷服務副程式結束前,要由用戶用OCW2寫一個中斷結束(EOI)命令,撤銷ISR中級別最高的置1位。

若中斷源在主片,EOI命令為:

outportb(0x20,0x20);

若中斷源在從片,要先寫一個從片的中斷結束命令,再寫一個主片的中斷結束命令。

outportb(0xa0,0x20); outportb(0x20,0x20);思考題與習題1.若要遮罩串口1和並口1的中斷請求,開放其他主8259A管理的中斷源試寫出相關程式。2.若要遮罩串口1和並口1的中斷請求,而不改變其他中斷源的遮罩情況,試寫出相關程式。3.若要遮罩串口1和並口1的中斷請求,開放串口2和並口2的中斷請求而不改變其他中斷源的遮罩情況,試寫出相關程式。4.要求遮罩串口2和並口2的中斷請求,允許串口1和硬碟的中斷請求,而又不改變其他中斷源的中斷遮罩情況,寫出相應的程式語句。3.48254定時/計數器

8254是可編程的定時/計數器,相容8253,有3個可獨立編程的16位定時/計數器。數據匯流排緩衝器讀/寫邏輯控制字寄存器0#1#2#D7~D0RDWRA0A1CSCLK0GATE0OUT0CLK1GATE1OUT1CLK2GATE2OUT2內部匯流排8254的編程

通過寫控制字可確定每個通道的工作方式。方式0:計數結束輸出正躍變信號方式1:單脈衝發生器方式2:分頻器方式3:方波發生器(分頻器方式)方式4:軟體觸發的單脈衝發生器方式5:硬體觸發的單脈衝發生器控制字寄存器D7D6D5D4D3D2D1D0SC1SC0RL1RL0M2M1M0BCD通道選擇讀寫方式選擇工作方式選擇數制選擇SC1SC0選通道,表明對那個通道進行操作。

00通道001通道110通道211無效讀寫方式RL1RL0確定讀寫計數值的方法和順序

00鎖定當前計數值,供CPU讀

01只讀/寫低8位

10只讀/寫高8位

11先讀/寫低8位,再讀/寫高8位

確定工作方式M2M1M0確定通道的工作方式

000 方式0001 方式1X10 方式2X11 方式3100 方式4101 方式5BCD=1:BCD碼計數BCD=0:二進位計數0~99990~655358254在PC機中的應用8254有兩條地址線,占4個連續的I/O端口地址。通道通道0通道1通道2控制字寄存器I/O地址0x400x410x420x43

通道0用於電子鐘定時基準,OUT0接到8259A的IR0作為中斷源,中斷類型號08H.。

通道1用於動態RAM刷新。通道2產生音頻信號,供喇叭發聲。通道0的工作方式

通道0初始化為方式3—方波頻率發生器,OUT0端產生方波,方波的頻率等於CLK0端輸入脈衝頻率除以計數初值。T

CLK0輸入脈衝頻率為1.193MHz

週期為 1/1.193MHz≈838ns

通道0

作為計數器,每838nS計數值減1,減到0時又自動恢復計數初值。這時OUT0輸出的方波完成一個週期,方波的上升沿觸發一次中斷。通道0的初始化MOV AL,36HOUT 43H,ALMOV AL,0OUT 40H,ALOUT 40H,AL控制字36H=00110110BD7D6D5D4D3D2D1D000110110選0通道先寫低8位再寫高8位方式3二進位計數

0000000000000000-)1

11111111111111110-1=65535!0經65536次減1後又減到0方波完成一個週期,0相當最大的計數初值65536。通道0的中斷週期

通道0的計數初值相當於65536

方波的頻率 1.193MHz/65536≈18.2Hz

方波的週期 838nS*6553655ms

通道0每55ms申請一次中斷,每秒18.2次通道0的中斷服務副程式TIMER-INT固化在BIOS中,有三個功能:1.進行年、月、日、時、分、秒的計時。2.軟碟I/O時,確定軟驅電機停止轉動的時間。3.發出一個1CH類軟中斷,可以調用一個用戶程式。思考題1.若希望10ms中斷一次,計數初值是多少?2.若CLK0輸入脈衝頻率為2MHz,採用二進位計數和BCD碼計數時最大的中斷週期是多少?3.若CLK0輸入脈衝頻率為4MHz,希望中斷週期為10ms,寫出初始化程式。3.5INTR中斷回應的大致過程回應中斷讀中斷類型號nIF=1?不回應NYFLAGS內容入棧,IF,TF清0CS,IP內容入棧IP

(4n),(4n+1)CS

(4n+2),(4n+3)中斷服務副程式IP,CS,FLAGS內容出棧從中斷返回INTR保存標誌位,以便中斷結束後恢復。IF=0,禁止INTR中斷TF=0,禁止單步中斷保護中斷點地址若允許中斷嵌套,用開中斷函數將IF置1EOI命令。清除ISR中相應置1位3.6中斷程式舉例

利用8254的通道0作為時鐘定時,每10ms中斷一次。編寫第8類中斷的中斷服務程式,每中斷一次在CRT上顯示一個8字。

根據新的中斷週期對8254通道0初始化寫中斷服務副程式設置中斷向量計數初值10ms/838ns11933=0x2e9d程式清單#include<dos.h>#include<stdio.h>void interruptmyint8(void);void main(void){ disable(); outportb(0x43,0x36); outportb(0x40,0x9d); outportb(0x40,0x2e); setvect(0x08,myint8); enable(); while(1);}void interruptmyint8(void){ putchar('8'); outportb(0x20,0x20);}顯示字元EOI命令返回副程式設中斷向量關中斷開中斷迴圈等待主程序初始化0#實驗要求12ms中斷一次,每中斷一次在CRT上顯示一個字元,400次之後恢復系統原有功能。

可能涉及以下一些工作:定義一個指向中斷服務函數的函數指針。取出通道0原中斷向量,保存在函數指針中。8254通道0初始化成12ms中斷一次。編寫中斷服務函數,顯示字元並計數。設新的中斷向量。400次之後,恢復原計數初值。恢復原中斷向量。3.7中斷程式的另一種結構初始化0#關中斷開中斷f1=1?主程序初始化0#f1置1EOI命令返回副程式N幹活f1清0Yf1幹活標誌f1=1幹活f1=0不幹活設中斷向量思考題1.中斷服務函數的數據類型是什麼?中斷服務函數有沒有參數?中斷服務函數有無返回值?中斷服務函數與主函數間傳遞數據可採用什麼方法?2.遮罩中斷函數disable()與8259A的中斷遮罩寄存器IMR的作用有什麼不同?3.8即時鐘硬體中斷的開發PC系列微機主板上有一個RT/CMOSRAM電路,即即時時鐘及CMOS存儲單元電路,如Motorala公司的MC146818積體電路晶片。RT/CMOSRAM電路有64~128個存儲單元,存放系統BIOS設置、時間、密碼等資訊。電腦關機時主板上的電池對其供電。

即時時鐘可發出報警中斷和週期中斷,中斷申請信號接到從8259A的IR8,中斷類型號為0x70。即時鐘的結構22級分頻器內部時鐘控制電路秒分小時…日月年…世紀…1024次加160秒加160分加124小時加130/31日加112月加1100年加11.024k至從8259A的IR827pF20M

即時鐘I/OAD7~AD032.768kHzOSC1CMOSRAMRTCMOS–RAM單元晶片內地址功能晶片內地址功能0秒7日1報警秒8月2分9年3報警分0AH狀態寄存器A4時0BH狀態寄存器B5報警時0CH狀態寄存器C6星期幾0DH狀態寄存器D32H日期世紀晶片內單元讀寫RT/CMOSRAM電路占兩個I/O端口地址:0x70和0x71。其中0x70稱為地址口,0x71稱為數據口。對晶片內單元讀/寫時,先向地址口0x70寫入單元地址,再通過數據口0x71進行讀/寫。#include<dos.h>#include<stdio.h>charc;voidmain(void){outportb(0x70,0x07);c=inportb(0x71);printf("%x/",c);outportb(0x70,0x08);c=inportb(0x71);printf("%x",c);getch();}例:讀日、月並顯示狀態寄存器BTEPIEAIEUIESQWEDMM24DSED7D6D5D4D3D2D1D0PIE:週期中斷允許位。PIE=0禁止週期中斷;PIE=1允許週期中斷。AIE:報警中斷允許位。AIE=0禁止報警中斷;AIE=1允許報警中斷。TE:計時允許UIE:計時更新結束中斷允許SQWE:方波輸出允許DM:計時資訊格式選擇M24:模選擇DSE:夏時制允許報警中斷AIE=1,允許報警中斷,報警時見到晶片輸出中斷請求信號到從8259A的IR8,CPU回應後最終轉向即時鐘報警中斷INT4AH。編寫報警中斷程式:1.預置報警時間,可用BIOS軟中斷INT1AH。2.將狀態寄存器D5位(AIE)置1,使之允許報警中斷。3.編寫4AH類軟中斷的中斷服務函數(報警處理),並設置中斷向量。BIOS時鐘中斷INT1AHAH=2讀即時鐘時間出口參數:CH=時0~23的BCD碼CL=分0~59的BCD碼DH=秒0~59的BCD碼AH=6置即時鐘報警時間入口參數:CH=時0~23的BCD碼CL=分0~59的BCD碼DH=秒0~59的BCD碼AH=7清除即時鐘報警報警中斷程式舉例#include<dos.h>#include<stdio.h>voidinterruptmyint4a(void);charc;voidmain(void){_AH=2;geninterrupt(0x1a);_DH=_DH+0x2;_AH=6;geninterrupt(0x1a);outportb(0x70,0xb);c=inportb(0x71);c=c|0x20;outportb(0x70,0xb);outportb(0x71,c);setvect(0x4a,myint4a);getch();}voidinterruptmyint4a(void){_AH=9;_AL='?';_BH=0;_BL=0xce;_CX=10;geninterrupt(0x10);}週期中斷PIE=1,允許週期中斷,晶片以每秒1024次的速率輸出中斷請求信號到從8259A的IR8,即每976S申請一次中斷。編寫週期中斷程式:1.設置一用戶等待標誌(1個位元組)。2.設置等待時間,用INT15H的83H號功能入口參數: AH←83H AL←0 ES:BX←用戶等待標誌單元地址

CX:DX←事件等待時間,單位S出口參數:CF=1設置失敗;CF=0設置成功3.將狀態寄存器D6位(PIE)置1,使之允許週期中斷。直接利用70H類中斷定時

即時鐘的輸出接到從8259A的中斷申請線IR8,中斷類型號是0x70。可編寫0x70類中斷的中斷服務函數,並設置第0x70類中斷的中斷向量,實現中斷服務。

應注意的是即時鐘作為中斷源接到從8259A,中斷結束命令要寫兩個,一個從片的,一個主片的。週期中斷程式舉例#include<dos.h>#include<stdio.h>voidinterrupt(*oldint70)();voidinterruptmyint70();intcount=0,nmb=0;charc;voidmain(void){oldint70=getvect(0x70);outportb(0x70,0xb);c=inportb(0x71);outportb(0x71,c|0x40);setvect(0x70,myint70);while(count<800);outportb(0x70,0xb);outportb(0x71,c);setvect(0x70,oldint70);printf("OK!\n");getch();}voidinterruptmyint70(){nmb++;if(nmb==10){nmb=0;putch('.');count++;}outportb(0xa0,0x20);outportb(0x20,0x20);}狀態寄存器AUIPDV2DV1DV0RS3RS2RS1RS0D7D6D5D4D3D2D1D0狀態寄存器A主要用於確定22級分頻器輸入輸出信號頻率。選擇輸入信號頻率選擇輸出信號頻率時鐘更新000:4.194304MHz001:1.048576MHz010:32.768KHz0110:1.024KHz調整狀態寄存器A的設置可以控制中斷週期。輸出信號頻率(輸入32.748kHz)RS3RS2RS1RS0週期中斷速率方波輸出頻率00013.90625ms256Hz00107.8125ms128Hz0011122.070µs8.192kHz0100244.141µs4.096kHz0101488.281µs2.048kHz0110976.562µs1.024kHz01111.953125ms512Hz10003.90625ms256Hz輸出信號頻率續(輸入32.748kHz)RS3RS2RS1RS0週期中斷速率方波輸出頻率10017.8125ms128Hz101015.625ms64Hz101131.25ms32Hz110062.5ms16Hz1101125ms8Hz1110250ms4Hz1111500ms2Hz輸出信號頻率RS3RS2RS1RS0週期中斷速率方波輸出頻率000130.517µs32.768kHz001061.035µs16.384kHz0011122.070µs8.192kHz0100244.141µs4.096kHz0101488.281µs2.048kHz0110976.562µs1.024kHz01111.953125ms512Hz10003.90625ms256Hz(輸入為4.194304或1.048576MHz時)輸出信號頻率(續)RS3RS2RS1RS0週期中斷速率方波輸出頻率10017.8125ms128Hz101015.625ms64Hz101131.25ms32Hz110062.5ms16Hz1101125ms8Hz1110250ms4Hz1111500ms2Hz(輸入為4.194304或1.048576MHz時)

第四章數據採集電腦內是數字信號,感測器輸出多數是模擬電壓或電流。模擬信號:是一種連續時間信號,在t>0的時間區間內,除若干個第一類間斷點外,都可以給出確定的函數值,幅值的取值也可以是連續的。函數定義在連續的時間區間上,即引數是連續的,函數的值域也是連續的。數字信號:是一種離散時間信號,只在時間的一些離散點上(如採樣時刻)由定義。幅值的取值也是離散的,只能用一組有限字長的數碼表示。函數的定義域是離散的,值域也是離散的。4.1A/D轉換與D/A轉換A/D轉換器將模擬信號轉換成數字信號

D/A轉換器將數字信號轉換成模擬信號感測器電腦A/DD/A非電物理量模擬電信號數字信號數字信號模擬電信號A/D轉換器

A/D轉換可看作:採樣、量化和編碼的過程。0T2TkTt....tx(t)x*(t)TT---採樣週期單位sfs=1/T採樣頻率單位Hz

s=2

fs=2/T採樣角頻率單位弧度/秒量化量化:用有限字長的一組數去逼近離散模擬信號的幅值。電腦內,任何數值都可以表示成二進位數字量最低位的整數倍。數字量最低位所代表的數值稱為量化單位或量化當量q。若A/D的字長為N位q=1/2NN=828=256 q=1/256N=10210=1024 q=1/1024N=12 212=4096 q=1/4096N=16 216=65536 q=1/65536字長越長,解析度越高。A/D所允許模擬信號幅值變化的全部範圍,只能用2N個有限的數值表示。編碼編碼:將量化後的數值變成按某種規律編碼的二進位數,如原碼,反碼,補數,偏移碼,BCD碼等。使用介面是要搞清其編碼規則,若介面編碼與計算所用數據類型編碼規則不同,要進行編碼的變換。A/D轉換需要時間,>1ms為低速,1ms~1s為中速,<1s為高速。字長8位低解析度10~16位中高解析度D/A轉換D/A轉換可看成解碼和保持的過程。解碼:根據D/A的編碼規則,將數字量折算成電壓或電流值 (僅是採樣時刻的)。0T2T3T4Tt保持:解決採樣時刻之間的插值問題,常用零階保持器,常值外推。零階保持器4.2介面的編碼與變換

電腦內部的數都使用二進位數表示,編碼不同,一組二進位數表示的數值或含義也不同。

二進位碼 無符號數 BCD碼

1101 格雷碼 原碼 有符號數 反碼 補數 偏移碼13非法9-5-2-3+5原碼

通常,電腦內有符號定點數的最高位(MSB)是符號位,表示正、負;後面是數值位,表明絕對值的大小。0正數

1負數MSB=數值位=絕對值的無符號二進位碼00011111B=+3110011111B=-31反碼0正數

1負數MSB=數值位=正數:絕對值的無符號二進位碼負數:絕對值的無符號二進位碼取反00011111B=+3111100000B=-31補數0正數

1負數MSB=數值位=正數:絕對值的無符號二進位碼負數:絕對值的無符號二進位碼取反,末位加100011111B=+3111100001B=-31分數二進位碼在分數二進位碼中,每個數值位的權用滿刻度的分數表示,滿刻度為1。n位分數二進位碼,從左到右第一位即最高位的權為2-1,第n位即最低位的權為2-n。

4位分數二進位碼

MSB 第2位 第3位 LSB 權 1/2 1/4 1/81/16 0 0 0 1 1/16=0.0625 0 0 1 0 2/16=0.125 0 1 0 0 4/16=0.25 1 0 0 0 8/16=0.5 1 1 1 1 15/16=0.9375分數補數

有符號的定點小數可用分數補數表示。分數補數從左到右第一位即最高位MSB是符號位,0表示正數,1表示負數。第2位的權為2-1,第n位即最低位LSB的權為2-n+1。

4位分數補數

MSB 第2位 第3位 LSB 權符號位 1/2 1/4 1/8 0 1 1 1 +7/8=+0.875 0 0 0 1 +1/8=+0.125 0 0 0 0 0 1 1 1 1 -1/8=-0.125 1 0 0 0 -8/8=-1.0一個A/D、D/A介面板的例子A/D 10bit -2.560V~+2.555VD/A 8bit -2.56V~+2.54VD/A的解析度比A/D少兩位,A/D只能輸出8位,低2位舍去。從分數補數的角度考慮,舍去的低2位只是很小的零頭。並不意味著輸出信號僅為輸入的1/4,只是相當量化的誤差大了。A/D 1bit→5mVD/A 1bit→20mV偏移碼1正數

0負數MSB=數值位=正數:絕對值的無符號二進位碼負數:絕對值的無符號二進位碼取反,末位加110011111B=+3101100001B=-31格雷碼

格雷碼亦稱反射二進位碼,常用於數字測量元件,如光電碼盤,光柵。格雷碼從一個數變到相鄰的另一個數,只改變一位。當變化位產生錯誤時,產生的誤差最小。01延時01震盪電平變化時,讀數容易出錯!格雷碼與

二進位碼

的比较十進位數 二進位碼 格雷碼

0 0000 0000 1 0001 0001 2 001

0 0011 3 0011 0010 4 01

0

0 0110 5 0101 0111 6 011

0 0101 7 0111 0100 8 1

0

0

0

1100 9 1001 110110 101

0 1111二進位碼

格雷碼1011格雷碼

二進位碼11014.3電腦匯流排與功能擴展板卡及模組

匯流排是連接多個數字系統或部件的公共資訊通道,它由若干公共信號線組成。

匯流排是傳送資訊代碼的公共途徑,由其構成系統與系統之間,板與板之間,晶片與晶片之間標準的資訊通道。

片內匯流排是微處理器晶片或其他介面器件積體電路內的資訊通道。

片間匯流排也稱元件級匯流排或片匯流排,是由積體電路內部引出的匯流排。通常是在一塊印刷電路板內,實現電路板內各元件相互連接的信號線。元件級匯流排通常包括地址線、數據線和控制線。

內匯流排也稱為系統匯流排、板級匯流排,也就是通常所說的電腦匯流排,用於電腦系統內主板與各插件板相互連接。內匯流排通常採用並行匯流排的方式,匯流排通常都有幾十條或上百條線。常見的系統匯流排有XT匯流排、ISA(AT)匯流排、EISA匯流排、STD匯流排、多匯流排(MULTIBUS)、MCA匯流排、VME匯流排等。

外匯流排也稱通訊匯流排,它是各電腦之間,電腦與其它系統(如儀器、儀錶、控制裝置)之間資訊的傳輸通道。如RS—232C、RS—485匯流排,IEEE—488匯流排,USB匯流排。

局部匯流排在CPU與高速外設之間又開闢了一條高速數據通道,與系統匯流排配合使用。常見的局部匯流排標準有VESA局部匯流排和PCI局部匯流排。

標準工業結構匯流排ISAISA匯流排是在62引腳的PC/XT匯流排基礎上擴展了36個引腳形成的,共98個引腳分佈在雙面印刷板上。ISA匯流排分成兩部分,左面一部分可接觸62個引腳(A1~A31,B1~B31),與62引腳的PC/XT匯流排基本相容;右面一部分可接觸36個引腳(C1~C18,D1~D18),是ISA匯流排擴展的部分。

ISA匯流排的數據線共16條,地址線共24條,接到匯流排上的中斷申請線共11條,DMA通道擴展為8個,時鐘頻率8MHz。ISA匯流排數據採集卡62+36=98線數據線16條62線數據線8條PCI局部匯流排PCI匯流排支持33MHz,66MHz的時鐘頻率和32位、64位數據寬度,即工作頻率高,數據通道寬,傳遞數據快。可與ISA、EISA、MCA等電腦匯流排配合工作。有5V和3.3V兩種信號環境。目前有多個版本,發展前景良好。PCI匯流排數據採集卡帶ISA和PCI槽的主板ISA插槽聯想工控機無源底板上的ISA和PCI匯流排插槽USB匯流排數據採集模組4.4HY-1232A/D、D/A板A/D 12位 32通道(0~31)輸入電壓 ±5V輸入阻抗 >100M

A/D轉換時間 10µsD/A 12位 1路輸出電壓 ±5V、0~5V、0~10V建立時間 <25µs輸出電流 10mA(最大值)工作溫度 0~+60℃存儲溫度 -25℃~+85℃電腦匯流排 ISA匯流排(標準工業結構匯流排)板上有6位地址開關,可設基地址。1232佔用8的連續的I/O端口地址,出廠基地址設為280H,則地址為280H~287H。基地址的設定ON12345

6地址:

A8A7A6A5A4A3十進位:2561286432168十六進制:1008040201008基地址計算公式:基地址=512(0x200)+所有有效位之和

(ON為1)ON12345

6出廠設置基地址設置開關基地址=0x200+0x80=0x280板內寄存器描述(1)基地址+0:寫輸入通道選擇寄存器,且觸發A/D轉換。

D7D6D5D4D3D2D1D0XXXC4C3C2C1C0C4~C0二進位編碼選擇通道0~31基地址+1:讀A/D轉換結果低8位

D7D6D5D4D3D2D1D0AD7AD6AD5AD4AD3AD2AD1AD0

基地址+2:讀A/D轉換結果高4位

D7D6D5D4D3D2D1D0XXXXAD11AD10AD9AD8板內寄存器描述(2)基地址+3:寫D/A低8位寄存器

D7D6D5D4D3D2D1D0DA7DA6DA5DA4DA3DA2DA1DA0

基地址+4:寫D/A高4位寄存器,且送出D/A12位數據

D7D6D5D4D3D2D1D0XXXXAD11AD10AD9AD8基地址+5:讀A/D完成位寄存器

D7D6D5D4D3D2D1D0IOIO:A/D轉換完成位IO=0:A/D轉換未完成IO=1:A/D轉換完成A/D輸入組合語言程式 MOV AL,0 MOV DX,280H OUT DX,ALADOK?: MOV DX,285H IN AL,DX AND AL,AL JNS ADOK? MOV DX,282H IN AL,DX AND AL,0FH MOV AH,AL MOV DX,281H IN AL,DX D/A輸出組合語言程式將AX中的數據從D/A輸出MOV DX,283HOUT DX,ALMOV AL,AHMOV DX,284HOUT DX,ALA/D輸入C程式從0通道輸入12位數據賦給整型變數dbyte int dbyte; …… outportb(0x280,0x00); do ; while(!(inportb(0x285)&0x80)); dbyte=inportb(0x281)|((inportb(0x282)&0x0f)<<8);D/A輸出C程式將整型變數da中的低12位從D/A輸出outportb(0x283,(da&0x00ff));outportb(0x284,((da>>8)&0x0f));選A/D、D/A電壓範圍±5V1bit→0.00244V1232的編碼A/D(V)D/A(V)二進位碼十進位數+5.0+4.997561111111111114095+4.99756+4.995121111111111104094+0.00488+0.002441000000000012049+0.002440.010000000000020480.0-0.002440111111111112047-0.00244-0.004880111111111102046-4.99512-4.997560000000000011-4.99756-5.00000000000000思考題1.要求從A/D輸入數據,並在螢幕上顯示電壓值。2.從A/D輸入數據後,從D/A輸出相同(或最接近的)電壓值。3.編寫8位格雷碼轉換成二進位碼的程式。4.HY-1232介面板A/D輸入程式中的do-wile迴圈是否可改用wile迴圈?4.5用位字段結構處理二進位位字段數據哈爾濱工業大學航太學院《C語言在測量與控制中的應用》系列課件位字段結構的概念

結構是一種複合數據類型,它可以由不同數據類型的數據組成。組成結構的每個資料項目稱為結構的成員。

可編程介面器件有一個命令字寄存器或控制字寄存器,通過編程,確定晶片的工作方式。命令字中的一位或幾位組合起來,成為一個位字段,決定一項功能。

位字段結構是一種特殊形式的結構,它的成員項是二進位位字段。位字段結構中每個成員項的一般形式為:數據類型成員名:位數;其中數據類型一般採用unsigned型或int型結構的定義結構用關鍵字struct定義,結構定義的一般形式如下:struct結構名{數據類型成員名1;數據類型成員名2;…..數據類型成員名n;};例如定義一個有關學生的學號、姓名、地址,年齡、性別、成績的結構類型。structstudent{intnum;charname[8]charaddr[20]charsex;intage;floatscore;};

結構變數的說明

如果結構已經定義,則說明結構變數的一般形式為:

struct結構名結構變數名表;例如結構structstudent已經定義,使用這個結構數據類型的結構變數zhang3,li4,wang5可以這樣說明:structstudentzhang3,li4,wang5;

定義結構時說明變數

結構變數說明的另一種形式是定義結構數據類型的同時說明結構變數,這時可以省略結構名。例如:struct{ charx; inty; floatz;}m,n,k;m,n,k是使用該結構數據類型的結構變數結構變數成員項的訪問C語言用句點操作符“.”訪問結構變數成員項,一般形式如下:結構變數名.成員名;例如 m.x=‘A’;

m.y=1999;

m.z=3.14;

結構指針

指向結構變數的指針稱為結構指針。結構指針是一個指針變數,它存放著結構變數的存儲首地址。結構指針指向的結構變數稱為它的目標結構量。結構指針在程式中說明的一般形式為struct結構名*結構指針名;其中,結構名必須是已經定義過的結構 。結構指針變數

結構指針的說明規定了它的數據特性,但指針的內容還沒有確定,即它的目標指向是不定的。因此指針在使用之前要通過初始化或賦值運算把實際存在的某個結構變數的存儲地址值賦給它。例如structdat{charc;inti;floatf;};structdatx,*p;p=&x;以上程式定義了一個結構數據類型structdat,說明了一個結構變數x和一個結構指針p,並把結構變數x的地址賦給結構指針p。

訪問結構指針的目標結構變數

訪問結構指針的目標結構變數中成員項的一般形式為 結構指針名—>成員名;或 (*結構指針名)成員名;例如 P—>i=148;

P—>c=‘A’;

(*P)f=2.73;

位字段舉例以8254的命令字寄存器為例:BCDM0M1M2RL0RL1SC0SC1D0D1D2D3D4D5D6D7通道選擇讀寫方式選擇工作方式選擇數制選擇

有四個位字段,分別決定四項功能。若改變一項功能,只需對一個位字段進行操作。可採用位運算或位字段結構的方式進行。位字段結構數據類型的定義8254的命令字可定義為一個位字段結構:structbit{ unsigned bcd:1;

unsigned m:3;

unsigned re:2;

unsigned sc:2;}

在TruboC中,位

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论