




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第1章緒論C語言是使用最廣泛的一種程序設(shè)計語言,是測量﹑控制﹑通訊領(lǐng)域中最常見的程序設(shè)計語言。常用的C語言版本有:TurboC2.0,BorlandeC++,VisalC++6.0,win-tc1.實時測量系統(tǒng)程序設(shè)計。2.實時通訊系統(tǒng)程序設(shè)計。3.實時控制系統(tǒng)程序設(shè)計。C語言在控制領(lǐng)域的應(yīng)用:1.1C語言的特點2.模塊化能力強3.數(shù)據(jù)類型豐富4.運算符豐富5.可移植性好6.提供豐富的庫函數(shù)7.執(zhí)行速度快8.控制硬件處理中斷的能力強9.繪圖能力強10.可與其它語言混合編程1.語言表達(dá)能力強1.2工業(yè)PC工業(yè)PC特點1.采用無源底板總線插槽系統(tǒng)2.采用小板結(jié)構(gòu),抗震動沖擊好全長CPU板半長CPU板PC104系列模塊3.全鋼結(jié)構(gòu)封閉機箱4.采用工業(yè)級電源5.可配時間監(jiān)視器,程序跑飛時自動重啟6.可配實時多任務(wù)操作系統(tǒng)7.配有豐富的工業(yè)控制組態(tài)軟件8.硬件配置靈活,擴展升級方便9.機箱有各種不同形式10.冗余性好,后備設(shè)施齊全實時測控系統(tǒng)實例之一實時測控系統(tǒng)實例之二第2章端口、內(nèi)存I/O與位運算2.1端口輸入/輸出函數(shù)
計算機的CPU要與外設(shè)間傳遞信息,必須通過硬件的接口電路來進行。接口電路通常包含一些寄存器,如數(shù)據(jù)寄存器、狀態(tài)寄存器、控制寄存器等。一般稱這些寄存器為I/O(輸入/輸出)端口。
PC系列微機用10條地址線對端口尋址尋址范圍為0x00~0x3ffC語言為了控制端口的輸入/輸出擴展了一些非標(biāo)準(zhǔn)的系統(tǒng)函數(shù)8位端口輸入函數(shù)inportb()函數(shù)原型:unsignedcharinportb(intportid);功能:從地址為portid的8位端口輸入一個字節(jié)(8位),
所讀的值是該函數(shù)的返回值,由頭文件dos.h說明。用法:#include<dos.h>unsignedcharb;
… b=inportb(端口地址);8位端口輸出函數(shù)outportb()函數(shù)原型:voidoutportb(intportid,unsignedcharvalue);功能:向地址為portid的8位端口輸出一個字節(jié)(8位),其值為value,由頭文件dos.h說明。用法:#include<dos.h>
… outportb(端口地址,無符號字符型數(shù)據(jù)或變量);16位端口輸入函數(shù)inport()函數(shù)原型:intinport(intportid);功能:從地址為portid的16位端口輸入一個字(16位),
所讀的值是該函數(shù)的返回值,由頭文件dos.h說明。用法:#include<dos.h> intw; … w=inport(端口地址);16位端口輸出函數(shù)outport()函數(shù)原型:voidoutport(intportid,intvalue);功能:向地址為portid的16位端口輸出一個字(16位),其值為value,由頭文件dos.h說明。用法:#include<dos.h>
… outport(端口地址,整型數(shù)據(jù)或變量);2.2位運算
位運算是直接對操作數(shù)的二進制位(bit)進行操作。按二進制位的邏輯運算對控制計算機硬件非常有用。C語言的位運算符有:按位與&,按位或|,按位異或^,按位取反~,左移<<,右移>>。位運算符只能用于有符號或無符號的字符型、整型、長整型數(shù)據(jù)的運算,不能用于浮點數(shù)和雙精度數(shù)據(jù)的運算。(1)按位與運算符&運算規(guī)則: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)規(guī)律:跟1相與不變,跟0相與清零用途:按位的與運算可使某些位清0,
其它位不變.
(2)按位或運算符|運算規(guī)則: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)規(guī)律:跟1相或置1,跟0相或不變用途:按位的或運算可使某些位置1,
其它位不變.
(3)按位異或運算符^運算規(guī)則: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)規(guī)律:跟1相異或取反,跟0相異或不變用途:按位異或運算可使某些位取反,其它位不變(4)按位非運算符~
按位非運算也叫按位反運算,他將操作數(shù)的每個二進制位都取反,即0變成1,1變成0。若a=0x55對應(yīng)的二進制數(shù)為01010101則~a=0xaa對應(yīng)的二進制數(shù)為10101010(5)按位左移運算符
按位左移運算符<<用于將變量的每一位向左移動左移運算的一般表達(dá)式為:
被移位變量名<<左移的位數(shù)左移后右端的空位補0
01011001左移一位結(jié)果為:10110010左移一位相當(dāng)乘2,左移運算常用于快速的乘法(6)位右移運算符>>按位左移運算符>>用于將變量的每一位向右移動右移運算的一般表達(dá)式為:
被移位變量名>>右移的位數(shù)無符號數(shù)右移后左端的空位補0。有符號數(shù)左端最高位(MSB)是符號位,右移后補充符號位,以保持符號不變。右移一位相當(dāng)除2,右移運算常用于快速的除法2.4內(nèi)存單元讀/寫函數(shù)C語言可直接訪問內(nèi)存單元的物理地址。86系列CPU微機的內(nèi)存地址是分段表示的,包括一個16位的段地址和一個16位的段內(nèi)偏移地址。地址通常用16進制數(shù)表示。(1)peekb()函數(shù)函數(shù)的格式為:charpeekb(int
segment,unsignedoffset);
該函數(shù)返回由segment(段地址)和offset(偏移地址)指定地址的一個內(nèi)存單元中的值(8位),由dos.h說明。程序舉例:
#include<dos.h> main() { char b;
b=peekb(0xf000,0xfffe); printf(“%x\n”,(unsignedchar)b);}(2)peek()函數(shù)函數(shù)的格式為:intpeek(int
segment,unsignedoffset);
該函數(shù)返回由segment(段地址)和offset
(偏移地址)指定首地址的兩個相鄰內(nèi)存單元中的值(16位),由dos.h說明。(3)pokeb()函數(shù)函數(shù)的格式為:
voidpokeb(int
segment,unsignedoffset,charvalue);
該函將一個字節(jié)的值value,存到由segment(段地址)和offset
(偏移地址)所指定的內(nèi)存單元中,由dos.h說明。程序舉例:
#include<dos.h> main() { pokeb(0x0040,0x0017,1); }(4)poke()函數(shù)
該函將一個字的值value,存到由segment(段地址)和offset
(偏移地址)所指定首地址的兩個連續(xù)內(nèi)存單元中,由dos.h說明。函數(shù)的格式為:
voidpoke(int
segment,unsignedoffset,intvalue);第3章硬件中斷程序設(shè)計3.1實模式下的中斷系統(tǒng)
中斷(interrupt)是指計算機“中斷”了正在執(zhí)行的程序,轉(zhuǎn)去處理一個突發(fā)的緊急事件的過程。處理這個緊急事件,計算機要執(zhí)行一個相應(yīng)的中斷服務(wù)子程序。處理完畢之后,計算機又要接著執(zhí)行剛才被中斷了的程序。引起中斷的事件稱為中斷源。86系列CPU的中斷源
86系列CPU可處理256個型號的中斷,中斷類型號為0x000xff。
不可屏蔽中斷NMI
可屏蔽中斷INTR
外部中斷內(nèi)部中斷
微處理器產(chǎn)生的中斷中斷指令產(chǎn)生的軟件中斷中斷源外部中斷
外部中斷通過CPU的管腳NMI和INTR申請中斷,也稱硬件中斷。 中斷允許標(biāo)志IF可屏蔽INTR中斷。0:禁止CPU響應(yīng)INTR中斷
1:允許CPU響應(yīng)INTR中斷IF=內(nèi)部中斷
內(nèi)部中斷包括微處理器產(chǎn)生的中斷和軟件中斷指令產(chǎn)生的軟件中斷。
微處理器產(chǎn)生的中斷如單步中斷,除法出錯中斷,溢出中斷。
軟件中斷是由中斷指令產(chǎn)生的中斷,主要包括DOS中斷和BIOS中斷。DOS中斷和BIOS中斷位用戶提供了很多有用的功能,C語言也可以使用這些中斷。中斷向量表
內(nèi)存中最低地址開始的1024個字節(jié)作為中斷向量表,存放中斷服務(wù)子程序的地址,每個型號的中斷占4個字節(jié)。
CPU響應(yīng)中斷請求后,根據(jù)中斷類型號到中斷向量表中找出該型號中斷服務(wù)程序的地址,執(zhí)行相應(yīng)的中斷服務(wù)程序。3.2有關(guān)硬件中斷的幾個函數(shù)
硬件中斷程序設(shè)計包括兩個部分: 1)寫一個中斷服務(wù)子程序,要寫成中斷函數(shù)的形式。
2)設(shè)置中斷向量,即把中斷服務(wù)子程序的地址放到中斷向量表中去。(1)中斷服務(wù)函數(shù)
中斷服務(wù)子程序要寫成函數(shù)形式,用關(guān)鍵詞 interrupt說明。
void interruptmyint(void){
函數(shù)體}
自定義函數(shù)在使用前要說明,格式如下:
void interruptmyint(void);(2)設(shè)置中斷向量函數(shù)setvect()
函數(shù)格式如下,由dos.h說明:
voidsetvect(intnum,voidinterrupt(*isr)());num---中斷類型號,isr---指向中斷服務(wù)函數(shù)的函數(shù)指針
若中斷類型號為0x08,中斷服務(wù)函數(shù)名為myint,程序如下:
#include<dos.h> … setvect(0x08,myint); (3)獲取中斷向量函數(shù)getvect()voidinterrupt(*getvect(intintr_num))();從中斷向量表中取出指定中斷類型號的中斷服務(wù)函數(shù)的地址,賦給一個函數(shù)指針,由dos.h說明。
函數(shù)用法舉例:
#include<dos.h> voidinterrupt(*oldint)();
… oldint=getvect(中斷類型號);(4)屏蔽中斷函數(shù)disable()將IF清0,禁止CPU響應(yīng)INTR中斷,由dos.h說明。函數(shù)原形:voiddisable(void);用法:
#include<dos.h>
… disable();(5)開放中斷函數(shù)enable()將IF置1,允許CPU響應(yīng)INTR中斷,由dos.h說明。函數(shù)原形:voiddisable(void);用法:
#include<dos.h>
… enable();3.38259A中斷控制器8259A為CPU管理硬件中斷,一片8259A可管理8個硬件中斷源,級聯(lián)使用可管理更多的硬件中斷.PC系列微機中相當(dāng)有兩片8259A級聯(lián),管理15個硬件中斷源.8259A的結(jié)構(gòu)中斷請求寄存器控制邏輯IRR
中斷屏蔽寄存器IMR
內(nèi)部總線優(yōu)先權(quán)處理器中斷服務(wù)寄存器ISR數(shù)據(jù)總線緩沖器讀/寫邏輯級聯(lián)緩沖比較器WRA0CSRDD0~D7
SP/EN
INTA
INTIR0
IR1
IR2IR3
IR4IR5
IR6IR7
CAS0CAS1CAS2IRR,IMR
1.中斷請求寄存器IRRIRi(i=07)上有中斷請求時,IRR相應(yīng)位置1。
2.中斷屏蔽寄存器IMRIMR第i位置1,屏蔽IRi上的中斷請求。
優(yōu)先權(quán)處理器,ISR
3.優(yōu)先權(quán)處理器根據(jù)中斷屏蔽情況及優(yōu)先級順序,決定將那個中斷請求送往CPU。
4.中斷服務(wù)寄存器ISR
若某個中斷請求被CPU響應(yīng),則相應(yīng)位置1。8259A的編程
8259A接受來自CPU的兩類命令字:初始化命令字ICW和操作命令字OCW。 初始化命令字有4個:ICW1,ICW2,ICW3,ICW4。 操作命令字有3個:OCW1,OCW2,OCW3。 命令字都是8位的。初始化命令字ICW1D7D6D5D4D3D2D1D0XXX1LTIMXSNGLIC4A00
A0=0,D4=1是ICW1的標(biāo)志。
LTIM=1:中斷請求是電平觸發(fā)。
LTIM=0:中斷請求是邊沿觸發(fā)。
SING=1:單片8259A工作。
SING=0:多片8259A級聯(lián)。
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的標(biāo)志。SFNM=1:特殊全嵌套方式;SFNM=0:普通全嵌套方式。BUF=1:緩沖方式;BUF=0:非緩沖方式。M/S=1:主片(BUF=1時有效);M/S=0:從片(BUF=1時有效)AEOI=1自動中斷結(jié)束方式AEOI=0:非自動中斷結(jié)束(EOI)μPM=1:86系列CPU;μPM=0:非86系列CPU。普通全嵌套方式
普通全嵌套方式也叫固定優(yōu)先權(quán)方式。 優(yōu)先權(quán)從IR0到IR7依次遞降。 級別高的中斷請求可以中斷級別低的中斷服務(wù)子程序。 一中斷被響應(yīng)的過程中,自動屏蔽同級和更低級別的中斷。操作命令字OCW1A01D7D6D5D4D3D2D1D0M7M6M5M4M3M2M1M0OCW1是中斷屏蔽命令字Mi=1:屏蔽IRi的中斷請求。Mi=0:允許IRi的中斷請求。操作命令字OCW2A00D7D6D5D4D3D2D1D0RSLEOI00L2L1L0A0=0,D4=0,D3=0是OCW2的特征。R=1:循環(huán)優(yōu)先權(quán);R=0:固定優(yōu)先權(quán)。SL=1:操作在L2~L0指定的級別上進行。SL=0:L2~L0無效。EOI=1:中斷結(jié)束命令。清除ISR中優(yōu)先權(quán)最高的置1位。EOI=0:不起作用。循環(huán)優(yōu)先級方式
循環(huán)優(yōu)先級方式由OCW2的R=1設(shè)定,分優(yōu)先級自動循環(huán)方式和優(yōu)先級指定循環(huán)方式兩種。
優(yōu)先級自動循環(huán)方式:初始時,優(yōu)先級從IR0到IR7依次遞降。剛執(zhí)行完的中斷,級別輪為最低。
優(yōu)先級指定循環(huán)方式:可由軟件指定最低優(yōu)先級。
R=1,SL=1,EOI=0,L2~L0編碼指定中斷源IRi。 例如:OCW2=11000011B=0xc3表示設(shè)置IR3為最低優(yōu)先級。
IR4IR5IR6IR7IR0IR1IR2IR3
高低操作命令字OCW3A00D7D6D5D4D3D2D1D0XESMMSMM01PRRRISA0=0,D4=0,D3=1是OCW3的特征。
ESMM=1,SMM=0:設(shè)置特殊屏蔽ESMM=1,SMM=1:清除特殊屏蔽
P=1:發(fā)查詢命令;P=0:不發(fā)查詢命令RR=1,RIS=0:讀IRR寄存器RR=1,RIS=1:讀ISR寄存器8259A在PC機中的I/O端口地址PC機中相當(dāng)有兩片8259A級聯(lián),一個主片,一個從片。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邊沿觸發(fā)級聯(lián)初始化編程包括ICW4ICW4=01H=00000001BD7D6D5D4D3D2D1D000000001不用一般全嵌套方式非緩沖非自動中斷結(jié)束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級聯(lián)?要ICW4?NYNY一條地址線,只有兩個地址,靠地址,順序和特征區(qū)分七個命令字。思想方法可以借鑒!中斷源IR0 日時鐘(8254通道0)IR1 鍵盤
IR8 實時鐘
IR9 軟件重新指向INT0AH IR10 保留IR2 IR11 保留
IR12 保留
IR13 協(xié)處理器
IR14 硬盤
IR15 保留IR3 串口2IR4 串口1IR5 并口2IR6 軟盤IR7 并口1(打印機口)
中斷類型號主片中斷源:從片中斷源:IR7IR6IR6IR4IR3IR2IR1IR00x0f0x0e0x0d0x0c0x0b0x0a0x090x08IR15IR14IR13IR12IR11IR10IR09IR080x770x760x750x740x730x720x710x70屏蔽中斷源
中斷屏蔽命令字OCW1可屏蔽中斷源的中斷請求。 例如,欲屏蔽鍵盤和串口1,不改變其它中斷源的屏蔽情況。
charb;
……
b=inportb(0x21); b=b|0x12; outportb(0x21,b);EOI命令
PC機中8259A初始化規(guī)定為普通(非自動)中斷結(jié)束方式。在中斷服務(wù)子程序結(jié)束前,要由用戶用OCW2寫一個中斷結(jié)束(EOI)命令,撤銷ISR中級別最高的置1位。
若中斷源在主片,EOI命令為:
outportb(0x20,0x20);
若中斷源在從片,要先寫一個從片的中斷結(jié)束命令,再寫一個主片的中斷結(jié)束命令。
outportb(0xa0,0x20); outportb(0x20,0x20);思考題與習(xí)題1.若要屏蔽串口1和并口1的中斷請求,開放其它主8259A管理的中斷源試寫出相關(guān)程序。2.若要屏蔽串口1和并口1的中斷請求,而不改變其它中斷源的屏蔽情況,試寫出相關(guān)程序。3.若要屏蔽串口1和并口1的中斷請求,開放串口2和并口2的中斷請求而不改變其它中斷源的屏蔽情況,試寫出相關(guān)程序。4.要求屏蔽串口2和并口2的中斷請求,允許串口1和硬盤的中斷請求,而又不改變其它中斷源的中斷屏蔽情況,寫出相應(yīng)的程序語句。3.48254定時/計數(shù)器
8254是可編程的定時/計數(shù)器,兼容8253,有3個可獨立編程的16位定時/計數(shù)器。數(shù)據(jù)總線緩沖器讀/寫邏輯控制字寄存器0#1#2#D7~D0RDWRA0A1CSCLK0GATE0OUT0CLK1GATE1OUT1CLK2GATE2OUT2內(nèi)部總線8254的編程
通過寫控制字可確定每個通道的工作方式。方式0:計數(shù)結(jié)束輸出正躍變信號方式1:單脈沖發(fā)生器方式2:分頻器方式3:方波發(fā)生器(分頻器方式)方式4:軟件觸發(fā)的單脈沖發(fā)生器方式5:硬件觸發(fā)的單脈沖發(fā)生器控制字寄存器D7D6D5D4D3D2D1D0SC1SC0RL1RL0M2M1M0BCD通道選擇讀寫方式選擇工作方式選擇數(shù)制選擇SC1SC0選通道,表明對那個通道進行操作。
00通道001通道110通道211無效讀寫方式RL1RL0確定讀寫計數(shù)值的方法和順序
00鎖定當(dāng)前計數(shù)值,供CPU讀
01只讀/寫低8位
10只讀/寫高8位
11先讀/寫低8位,再讀/寫高8位
確定工作方式M2M1M0確定通道的工作方式
000 方式0001 方式1X10 方式2X11 方式3100 方式4101 方式5BCD=1:BCD碼計數(shù)BCD=0:二進制計數(shù)0~99990~655358254在PC機中的應(yīng)用8254有兩條地址線,占4個連續(xù)的I/O端口地址。通道通道0通道1通道2控制字寄存器I/O地址0x400x410x420x43
通道0用于電子鐘定時基準(zhǔn),OUT0接到8259A的IR0作為中斷源,中斷類型號08H.。
通道1用于動態(tài)RAM刷新。通道2產(chǎn)生音頻信號,供喇叭發(fā)聲。通道0的工作方式
通道0初始化為方式3—方波頻率發(fā)生器,OUT0端產(chǎn)生方波,方波的頻率等于CLK0端輸入脈沖頻率除以計數(shù)初值。T
CLK0輸入脈沖頻率為1.193MHz
周期為 1/1.193MHz≈838ns
通道0
作為計數(shù)器,每838nS計數(shù)值減1,減到0時又自動恢復(fù)計數(shù)初值。這時OUT0輸出的方波完成一個周期,方波的上升沿觸發(fā)一次中斷。通道0的初始化MOV AL,36HOUT 43H,ALMOV AL,0OUT 40H,ALOUT 40H,AL控制字36H=00110110BD7D6D5D4D3D2D1D000110110選0通道先寫低8位再寫高8位方式3二進制計數(shù)
0000000000000000-)1
11111111111111110-1=65535!0經(jīng)65536次減1后又減到0方波完成一個周期,0相當(dāng)最大的計數(shù)初值65536。通道0的中斷周期
通道0的計數(shù)初值相當(dāng)于65536
方波的頻率 1.193MHz/65536≈18.2Hz
方波的周期 838nS*6553655ms
通道0每55ms申請一次中斷,每秒18.2次通道0的中斷服務(wù)子程序TIMER-INT固化在BIOS中,有三個功能:1.進行年、月、日、時、分、秒的計時。2.軟盤I/O時,確定軟驅(qū)電機停止轉(zhuǎn)動的時間。3.發(fā)出一個1CH類軟中斷,可以調(diào)用一個用戶程序。思考題1.若希望10ms中斷一次,計數(shù)初值是多少?2.若CLK0輸入脈沖頻率為2MHz,采用二進制計數(shù)和BCD碼計數(shù)時最大的中斷周期是多少?3.若CLK0輸入脈沖頻率為4MHz,希望中斷周期為10ms,寫出初始化程序。3.5INTR中斷響應(yīng)的大致過程響應(yīng)中斷讀中斷類型號nIF=1?不響應(yīng)NYFLAGS內(nèi)容入棧,IF,TF清0CS,IP內(nèi)容入棧IP
(4n),(4n+1)CS
(4n+2),(4n+3)中斷服務(wù)子程序IP,CS,FLAGS內(nèi)容出棧從中斷返回INTR保存標(biāo)志位,以便中斷結(jié)束后恢復(fù)。IF=0,禁止INTR中斷TF=0,禁止單步中斷保護斷點地址若允許中斷嵌套,用開中斷函數(shù)將IF置1EOI命令。清除ISR中相應(yīng)置1位3.6中斷程序舉例
利用8254的通道0作為時鐘定時,每10ms中斷一次。編寫第8類中斷的中斷服務(wù)程序,每中斷一次在CRT上顯示一個8字。
根據(jù)新的中斷周期對8254通道0初始化寫中斷服務(wù)子程序設(shè)置中斷向量計數(shù)初值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命令返回子程序設(shè)中斷向量關(guān)中斷開中斷循環(huán)等待主程序初始化0#實驗要求12ms中斷一次,每中斷一次在CRT上顯示一個字符,400次之后恢復(fù)系統(tǒng)原有功能。
可能涉及以下一些工作:定義一個指向中斷服務(wù)函數(shù)的函數(shù)指針。取出通道0原中斷向量,保存在函數(shù)指針中。8254通道0初始化成12ms中斷一次。編寫中斷服務(wù)函數(shù),顯示字符并計數(shù)。設(shè)新的中斷向量。400次之后,恢復(fù)原計數(shù)初值。恢復(fù)原中斷向量。3.7中斷程序的另一種結(jié)構(gòu)初始化0#關(guān)中斷開中斷f1=1?主程序初始化0#f1置1EOI命令返回子程序N干活f1清0Yf1干活標(biāo)志f1=1干活f1=0不干活設(shè)中斷向量思考題1.中斷服務(wù)函數(shù)的數(shù)據(jù)類型是什么?中斷服務(wù)函數(shù)有沒有參數(shù)?中斷服務(wù)函數(shù)有無返回值?中斷服務(wù)函數(shù)與主函數(shù)間傳遞數(shù)據(jù)可采用什么方法?2.屏蔽中斷函數(shù)disable()與8259A的中斷屏蔽寄存器IMR的作用有什么不同?3.8實時鐘硬件中斷的開發(fā)PC系列微機主板上有一個RT/CMOSRAM電路,即實時時鐘及CMOS存儲單元電路,如Motorala公司的MC146818集成電路芯片。RT/CMOSRAM電路有64~128個存儲單元,存放系統(tǒng)BIOS設(shè)置、時間、密碼等信息。計算機關(guān)機時主板上的電池對其供電。
實時時鐘可發(fā)出報警中斷和周期中斷,中斷申請信號接到從8259A的IR8,中斷類型號為0x70。實時鐘的結(jié)構(gòu)22級分頻器內(nèi)部時鐘控制電路秒分小時…日月年…世紀(jì)…1024次加160秒加160分加124小時加130/31日加112月加1100年加11.024k至從8259A的IR827pF20M
實時鐘I/OAD7~AD032.768kHzOSC1CMOSRAMRTCMOS–RAM單元芯片內(nèi)地址功能芯片內(nèi)地址功能0秒7日1報警秒8月2分9年3報警分0AH狀態(tài)寄存器A4時0BH狀態(tài)寄存器B5報警時0CH狀態(tài)寄存器C6星期幾0DH狀態(tài)寄存器D32H日期世紀(jì)芯片內(nèi)單元讀寫RT/CMOSRAM電路占兩個I/O端口地址:0x70和0x71。其中0x70稱為地址口,0x71稱為數(shù)據(jù)口。對芯片內(nèi)單元讀/寫時,先向地址口0x70寫入單元地址,再通過數(shù)據(jù)口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();}例:讀日、月并顯示狀態(tài)寄存器BTEPIEAIEUIESQWEDMM24DSED7D6D5D4D3D2D1D0PIE:周期中斷允許位。PIE=0禁止周期中斷;PIE=1允許周期中斷。AIE:報警中斷允許位。AIE=0禁止報警中斷;AIE=1允許報警中斷。TE:計時允許UIE:計時更新結(jié)束中斷允許SQWE:方波輸出允許DM:計時信息格式選擇M24:模選擇DSE:夏時制允許報警中斷AIE=1,允許報警中斷,報警時見到芯片輸出中斷請求信號到從8259A的IR8,CPU響應(yīng)后最終轉(zhuǎn)向?qū)崟r鐘報警中斷INT4AH。編寫報警中斷程序:1.預(yù)置報警時間,可用BIOS軟中斷INT1AH。2.將狀態(tài)寄存器D5位(AIE)置1,使之允許報警中斷。3.編寫4AH類軟中斷的中斷服務(wù)函數(shù)(報警處理),并設(shè)置中斷向量。BIOS時鐘中斷INT1AHAH=2讀實時鐘時間出口參數(shù):CH=時0~23的BCD碼CL=分0~59的BCD碼DH=秒0~59的BCD碼AH=6置實時鐘報警時間入口參數(shù):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.設(shè)置一用戶等待標(biāo)志(1個字節(jié))。2.設(shè)置等待時間,用INT15H的83H號功能入口參數(shù): AH←83H AL←0 ES:BX←用戶等待標(biāo)志單元地址
CX:DX←事件等待時間,單位S出口參數(shù):CF=1設(shè)置失敗;CF=0設(shè)置成功3.將狀態(tài)寄存器D6位(PIE)置1,使之允許周期中斷。直接利用70H類中斷定時
實時鐘的輸出接到從8259A的中斷申請線IR8,中斷類型號是0x70??删帉?x70類中斷的中斷服務(wù)函數(shù),并設(shè)置第0x70類中斷的中斷向量,實現(xiàn)中斷服務(wù)。
應(yīng)注意的是實時鐘作為中斷源接到從8259A,中斷結(jié)束命令要寫兩個,一個從片的,一個主片的。周期中斷程序舉例#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);}狀態(tài)寄存器AUIPDV2DV1DV0RS3RS2RS1RS0D7D6D5D4D3D2D1D0狀態(tài)寄存器A主要用于確定22級分頻器輸入輸出信號頻率。選擇輸入信號頻率選擇輸出信號頻率時鐘更新000:4.194304MHz001:1.048576MHz010:32.768KHz0110:1.024KHz調(diào)整狀態(tài)寄存器A的設(shè)置可以控制中斷周期。輸出信號頻率(輸入32.748kHz)RS3RS2RS1RS0周期中斷速率方波輸出頻率00013.90625ms256Hz00107.8125ms128Hz0011122.070μs8.192kHz0100244.141μs4.096kHz0101488.281μs2.048kHz0110976.562μs1.024kHz01111.953125ms512Hz10003.90625ms256Hz輸出信號頻率續(xù)(輸入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時)輸出信號頻率(續(xù))RS3RS2RS1RS0周期中斷速率方波輸出頻率10017.8125ms128Hz101015.625ms64Hz101131.25ms32Hz110062.5ms16Hz1101125ms8Hz1110250ms4Hz1111500ms2Hz(輸入為4.194304或1.048576MHz時)
第四章數(shù)據(jù)采集計算機內(nèi)是數(shù)字信號,傳感器輸出多數(shù)是模擬電壓或電流。模擬信號:是一種連續(xù)時間信號,在t>0的時間區(qū)間內(nèi),除若干個第一類間斷點外,都可以給出確定的函數(shù)值,幅值的取值也可以是連續(xù)的。函數(shù)定義在連續(xù)的時間區(qū)間上,即自變量是連續(xù)的,函數(shù)的值域也是連續(xù)的。數(shù)字信號:是一種離散時間信號,只在時間的一些離散點上(如采樣時刻)由定義。幅值的取值也是離散的,只能用一組有限字長的數(shù)碼表示。函數(shù)的定義域是離散的,值域也是離散的。4.1A/D轉(zhuǎn)換與D/A轉(zhuǎn)換A/D轉(zhuǎn)換器將模擬信號轉(zhuǎn)換成數(shù)字信號
D/A轉(zhuǎn)換器將數(shù)字信號轉(zhuǎn)換成模擬信號傳感器計算機A/DD/A非電物理量模擬電信號數(shù)字信號數(shù)字信號模擬電信號A/D轉(zhuǎn)換器
A/D轉(zhuǎn)換可看作:采樣、量化和編碼的過程。0T2TkTt....tx(t)x*(t)TT---采樣周期單位sfs=1/T采樣頻率單位Hz
s=2
fs=2/T采樣角頻率單位弧度/秒量化量化:用有限字長的一組數(shù)去逼近離散模擬信號的幅值。計算機內(nèi),任何數(shù)值都可以表示成二進制數(shù)字量最低位的整數(shù)倍。數(shù)字量最低位所代表的數(shù)值稱為量化單位或量化當(dāng)量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個有限的數(shù)值表示。編碼編碼:將量化后的數(shù)值變成按某種規(guī)律編碼的二進制數(shù),如原碼,反碼,補碼,偏移碼,BCD碼等。使用接口是要搞清其編碼規(guī)則,若接口編碼與計算所用數(shù)據(jù)類型編碼規(guī)則不同,要進行編碼的變換。A/D轉(zhuǎn)換需要時間,>1ms為低速,1ms~1s為中速,<1s為高速。字長8位低分辨率10~16位中高分辨率D/A轉(zhuǎn)換D/A轉(zhuǎn)換可看成解碼和保持的過程。解碼:根據(jù)D/A的編碼規(guī)則,將數(shù)字量折算成電壓或電流值 (僅是采樣時刻的)。0T2T3T4Tt保持:解決采樣時刻之間的插值問題,常用零階保持器,常值外推。零階保持器4.2接口的編碼與變換
計算機內(nèi)部的數(shù)都使用二進制數(shù)表示,編碼不同,一組二進制數(shù)表示的數(shù)值或含義也不同。
二進制碼 無符號數(shù) BCD碼
1101 格雷碼 原碼 有符號數(shù) 反碼 補碼 偏移碼13非法9-5-2-3+5原碼
通常,計算機內(nèi)有符號定點數(shù)的最高位(MSB)是符號位,表示正、負(fù);后面是數(shù)值位,表明絕對值的大小。0正數(shù)
1負(fù)數(shù)MSB=數(shù)值位=絕對值的無符號二進制碼00011111B=+3110011111B=-31反碼0正數(shù)
1負(fù)數(shù)MSB=數(shù)值位=正數(shù):絕對值的無符號二進制碼負(fù)數(shù):絕對值的無符號二進制碼取反00011111B=+3111100000B=-31補碼0正數(shù)
1負(fù)數(shù)MSB=數(shù)值位=正數(shù):絕對值的無符號二進制碼負(fù)數(shù):絕對值的無符號二進制碼取反,末位加100011111B=+3111100001B=-31分?jǐn)?shù)二進制碼在分?jǐn)?shù)二進制碼中,每個數(shù)值位的權(quán)用滿刻度的分?jǐn)?shù)表示,滿刻度為1。n位分?jǐn)?shù)二進制碼,從左到右第一位即最高位的權(quán)為2-1,第n位即最低位的權(quán)為2-n。
4位分?jǐn)?shù)二進制碼
MSB 第2位 第3位 LSB 權(quán) 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分?jǐn)?shù)補碼
有符號的定點小數(shù)可用分?jǐn)?shù)補碼表示。分?jǐn)?shù)補碼從左到右第一位即最高位MSB是符號位,0表示正數(shù),1表示負(fù)數(shù)。第2位的權(quán)為2-1,第n位即最低位LSB的權(quán)為2-n+1。
4位分?jǐn)?shù)補碼
MSB 第2位 第3位 LSB 權(quán)符號位 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位舍去。從分?jǐn)?shù)補碼的角度考慮,舍去的低2位只是很小的零頭。并不意味著輸出信號僅為輸入的1/4,只是相當(dāng)量化的誤差大了。A/D 1bit→5mVD/A 1bit→20mV偏移碼1正數(shù)
0負(fù)數(shù)MSB=數(shù)值位=正數(shù):絕對值的無符號二進制碼負(fù)數(shù):絕對值的無符號二進制碼取反,末位加110011111B=+3101100001B=-31格雷碼
格雷碼亦稱反射二進制碼,常用于數(shù)字測量元件,如光電碼盤,光柵。格雷碼從一個數(shù)變到相鄰的另一個數(shù),只改變一位。當(dāng)變化位產(chǎn)生錯誤時,產(chǎn)生的誤差最小。01延時01震蕩電平變化時,讀數(shù)容易出錯!格雷碼與
二進制碼
的比較十進制數(shù) 二進制碼 格雷碼
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計算機總線與功能擴展板卡及模塊
總線是連接多個數(shù)字系統(tǒng)或部件的公共信息通道,它由若干公共信號線組成。
總線是傳送信息代碼的公共途徑,由其構(gòu)成系統(tǒng)與系統(tǒng)之間,板與板之間,芯片與芯片之間標(biāo)準(zhǔn)的信息通道。
片內(nèi)總線是微處理器芯片或其它接口器件集成電路內(nèi)的信息通道。
片間總線也稱元件級總線或片總線,是由集成電路內(nèi)部引出的總線。通常是在一塊印刷電路板內(nèi),實現(xiàn)電路板內(nèi)各元件相互連接的信號線。元件級總線通常包括地址線、數(shù)據(jù)線和控制線。
內(nèi)總線也稱為系統(tǒng)總線、板級總線,也就是通常所說的計算機總線,用于計算機系統(tǒng)內(nèi)主板與各插件板相互連接。內(nèi)總線通常采用并行總線的方式,總線通常都有幾十條或上百條線。常見的系統(tǒng)總線有XT總線、ISA(AT)總線、EISA總線、STD總線、多總線(MULTIBUS)、MCA總線、VME總線等。
外總線也稱通訊總線,它是各計算機之間,計算機與其它系統(tǒng)(如儀器、儀表、控制裝置)之間信息的傳輸通道。如RS—232C、RS—485總線,IEEE—488總線,USB總線。
局部總線在CPU與高速外設(shè)之間又開辟了一條高速數(shù)據(jù)通道,與系統(tǒng)總線配合使用。常見的局部總線標(biāo)準(zhǔn)有VESA局部總線和PCI局部總線。
標(biāo)準(zhǔn)工業(yè)結(jié)構(gòu)總線ISAISA總線是在62引腳的PC/XT總線基礎(chǔ)上擴展了36個引腳形成的,共98個引腳分布在雙面印刷板上。ISA總線分成兩部分,左面一部分可接觸62個引腳(A1~A31,B1~B31),與62引腳的PC/XT總線基本兼容;右面一部分可接觸36個引腳(C1~C18,D1~D18),是ISA總線擴展的部分。
ISA總線的數(shù)據(jù)線共16條,地址線共24條,接到總線上的中斷申請線共11條,DMA通道擴展為8個,時鐘頻率8MHz。ISA總線數(shù)據(jù)采集卡62+36=98線數(shù)據(jù)線16條62線數(shù)據(jù)線8條PCI局部總線PCI總線支持33MHz,66MHz的時鐘頻率和32位、64位數(shù)據(jù)寬度,即工作頻率高,數(shù)據(jù)通道寬,傳遞數(shù)據(jù)快??膳cISA、EISA、MCA等計算機總線配合工作。有5V和3.3V兩種信號環(huán)境。目前有多個版本,發(fā)展前景良好。PCI總線數(shù)據(jù)采集卡帶ISA和PCI槽的主板ISA插槽聯(lián)想工控機無源底板上的ISA和PCI總線插槽USB總線數(shù)據(jù)采集模塊4.4HY-1232A/D、D/A板A/D 12位 32通道(0~31)輸入電壓 ±5V輸入阻抗 >100M
A/D轉(zhuǎn)換時間 10μsD/A 12位 1路輸出電壓 ±5V、0~5V、0~10V建立時間 <25μs輸出電流 10mA(最大值)工作溫度 0~+60℃存儲溫度 -25℃~+85℃計算機總線 ISA總線(標(biāo)準(zhǔn)工業(yè)結(jié)構(gòu)總線)板上有6位地址開關(guān),可設(shè)基地址。1232占用8的連續(xù)的I/O端口地址,出廠基地址設(shè)為280H,則地址為280H~287H?;刂返脑O(shè)定ON12345
6地址:
A8A7A6A5A4A3十進制:2561286432168十六進制:1008040201008基地址計算公式:基地址=512(0x200)+所有有效位之和
(ON為1)ON12345
6出廠設(shè)置基地址設(shè)置開關(guān)基地址=0x200+0x80=0x280板內(nèi)寄存器描述(1)基地址+0:寫輸入通道選擇寄存器,且觸發(fā)A/D轉(zhuǎn)換。
D7D6D5D4D3D2D1D0XXXC4C3C2C1C0C4~C0二進制編碼選擇通道0~31基地址+1:讀A/D轉(zhuǎn)換結(jié)果低8位
D7D6D5D4D3D2D1D0AD7AD6AD5AD4AD3AD2AD1AD0
基地址+2:讀A/D轉(zhuǎn)換結(jié)果高4位
D7D6D5D4D3D2D1D0XXXXAD11AD10AD9AD8板內(nèi)寄存器描述(2)基地址+3:寫D/A低8位寄存器
D7D6D5D4D3D2D1D0DA7DA6DA5DA4DA3DA2DA1DA0
基地址+4:寫D/A高4位寄存器,且送出D/A12位數(shù)據(jù)
D7D6D5D4D3D2D1D0XXXXAD11AD10AD9AD8基地址+5:讀A/D完成位寄存器
D7D6D5D4D3D2D1D0IOIO:A/D轉(zhuǎn)換完成位IO=0:A/D轉(zhuǎn)換未完成IO=1:A/D轉(zhuǎn)換完成A/D輸入?yún)R編程序 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輸出匯編程序?qū)X中的數(shù)據(jù)從D/A輸出MOV DX,283HOUT DX,ALMOV AL,AHMOV DX,284HOUT DX,ALA/D輸入C程序從0通道輸入12位數(shù)據(jù)賦給整型變量dbyte int dbyte; …… outportb(0x280,0x00); do ; while(!(inportb(0x285)&0x80)); dbyte=inportb(0x281)|((inportb(0x282)&0x0f)<<8);D/A輸出C程序?qū)⒄妥兞縟a中的低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)二進制碼十進制數(shù)+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輸入數(shù)據(jù),并在屏幕上顯示電壓值。2.從A/D輸入數(shù)據(jù)后,從D/A輸出相同(或最接近的)電壓值。3.編寫8位格雷碼轉(zhuǎn)換成二進制碼的程序。4.HY-1232接口板A/D輸入程序中的do-wile循環(huán)是否可改用wile循環(huán)?4.5用位字段結(jié)構(gòu)處理二進制位字段數(shù)據(jù)哈爾濱工業(yè)大學(xué)航天學(xué)院《C語言在測量與控制中的應(yīng)用》系列課件位字段結(jié)構(gòu)的概念
結(jié)構(gòu)是一種復(fù)合數(shù)據(jù)類型,它可以由不同數(shù)據(jù)類型的數(shù)據(jù)組成。組成結(jié)構(gòu)的每個數(shù)據(jù)項稱為結(jié)構(gòu)的成員。
可編程接口器件有一個命令字寄存器或控制字寄存器,通過編程,確定芯片的工作方式。命令字中的一位或幾位組合起來,成為一個位字段,決定一項功能。
位字段結(jié)構(gòu)是一種特殊形式的結(jié)構(gòu),它的成員項是二進制位字段。位字段結(jié)構(gòu)中每個成員項的一般形式為:數(shù)據(jù)類型成員名:位數(shù);其中數(shù)據(jù)類型一般采用unsigned型或int型結(jié)構(gòu)的定義結(jié)構(gòu)用關(guān)鍵字struct定義,結(jié)構(gòu)定義的一般形式如下:struct結(jié)構(gòu)名{數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;…..數(shù)據(jù)類型成員名n;};例如定義一個有關(guān)學(xué)生的學(xué)號、姓名、地址,年齡、性別、成績的結(jié)構(gòu)類型。structstudent{intnum;charname[8]charaddr[20]charsex;intage;floatscore;};
結(jié)構(gòu)變量的說明
如果結(jié)構(gòu)已經(jīng)定義,則說明結(jié)構(gòu)變量的一般形式為:
struct結(jié)構(gòu)名結(jié)構(gòu)變量名表;例如結(jié)構(gòu)structstudent已經(jīng)定義,使用這個結(jié)構(gòu)數(shù)據(jù)類型的結(jié)構(gòu)變量zhang3,li4,wang5可以這樣說明:structstudentzhang3,li4,wang5;
定義結(jié)構(gòu)時說明變量
結(jié)構(gòu)變量說明的另一種形式是定義結(jié)構(gòu)數(shù)據(jù)類型的同時說明結(jié)構(gòu)變量,這時可以省略結(jié)構(gòu)名。例如:struct{ charx; inty; floatz;}m,n,k;m,n,k是使用該結(jié)構(gòu)數(shù)據(jù)類型的結(jié)構(gòu)變量結(jié)構(gòu)變量成員項的訪問C語言用句點操作符“.”訪問結(jié)構(gòu)變量成員項,一般形式如下:結(jié)構(gòu)變量名.成員名;例如 m.x=‘A’;
m.y=1999;
m.z=3.14;
結(jié)構(gòu)指針
指向結(jié)構(gòu)變量的指針稱為結(jié)構(gòu)指針。結(jié)構(gòu)指針是一個指針變量,它存放著結(jié)構(gòu)變量的存儲首地址。結(jié)構(gòu)指針指向的結(jié)構(gòu)變量稱為它的目標(biāo)結(jié)構(gòu)量。結(jié)構(gòu)指針在程序中說明的一般形式為struct結(jié)構(gòu)名*結(jié)構(gòu)指針名;其中,結(jié)構(gòu)名必須是已經(jīng)定義過的結(jié)構(gòu) 。結(jié)構(gòu)指針變量
結(jié)構(gòu)指針的說明規(guī)定了它的數(shù)據(jù)特性,但指針的內(nèi)容還沒有確定,即它的目標(biāo)指向是不定的。因此指針在使用之前要通過初始化或賦值運算把實際存在的某個結(jié)構(gòu)變量的存儲地址值賦給它。例如structdat{charc;inti;floatf;};structdatx,*p;p=&x;以上程序定義了一個結(jié)構(gòu)數(shù)據(jù)類型structdat,說明了一個結(jié)構(gòu)變量x和一個結(jié)構(gòu)指針p,并把結(jié)構(gòu)變量x的地址賦給結(jié)構(gòu)指針p。
訪問結(jié)構(gòu)指針的目標(biāo)結(jié)構(gòu)變量
訪問結(jié)構(gòu)指針的目標(biāo)結(jié)構(gòu)變量中成員項的一般形式為 結(jié)構(gòu)指針名—>成員名;或 (*結(jié)構(gòu)指針名)成員名;例如 P—>i=148;
P—>c=‘A’;
(*P)f=2.73;
位字段舉例以8254的命令字寄存器為例:BCDM0M1M2RL0RL1SC0SC1D0D1D2D3D4D5D6D7通道選擇讀寫方式選擇工作方式選擇數(shù)制選擇
有四個位字段,分別決定四項功能。若改變一項功能,只需對一個位字段進行操作??刹捎梦贿\算或位字段結(jié)構(gòu)的方式進行。位字段結(jié)構(gòu)數(shù)據(jù)類型的定義8254的命令字可定義為一個位字段結(jié)構(gòu):structbit{ unsigned bcd:1;
unsigned m:3;
unsigned re:2;
unsigned sc:2;}
在TruboC中,位字段結(jié)構(gòu)中位字段的順序是從低位到高位。位字段結(jié)構(gòu)變量在存儲時使用的內(nèi)存空間大小是以int型數(shù)據(jù)長度為單位的,即使位字段
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)計課題申報書怎么寫好
- 吉林課題立項申報書
- 前端外包開發(fā)合同范本
- 單位和職工合同范本
- 信托制物業(yè)合同范本
- 員工疾病免責(zé)合同范本
- 品牌定制家具合同范本
- 勞務(wù)合同范本約束條款規(guī)定
- 后期剪輯合同范本
- 加盟代理項目合同范本
- 2024年第四季度 國家電網(wǎng)工程設(shè)備材料信息參考價
- (一模)渭南市2025屆高三教學(xué)質(zhì)量檢測(I)語文試卷(含答案解析)
- 環(huán)保行業(yè)污水處理廠智能化管理方案
- GB/T 17145-2024廢礦物油回收與再生利用導(dǎo)則
- 普通高中生物學(xué)課程標(biāo)準(zhǔn)-(2024修訂版)
- GB/T 45006-2024風(fēng)電葉片用纖維增強復(fù)合材料拉擠板材
- 2025國家公務(wù)員政治理論應(yīng)知應(yīng)會知識考試題庫(含答案)
- 抖音矩陣規(guī)劃方案
- 2024年無錫職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 黑龍江省龍東地區(qū)中考政治真題試題(含答案)
- 《焊接檢驗員培訓(xùn)》課件
評論
0/150
提交評論