單片機C語言應(yīng)用程序設(shè)計針對目前最通用的單片機8051和最流行的程序設(shè)計語言——C語言,以KEII。公司8051單片機開發(fā)套件講解單片機的C語言應(yīng)用程序設(shè)計。該套件的編譯器有支持經(jīng)典8051及8051派生產(chǎn)品的版本,統(tǒng)稱為Cx51。Windows集成開發(fā)環(huán)境μVision2把μVisionl用的模擬調(diào)試器dScope與集成環(huán)境無縫結(jié)合起來,使用更方便,支持的單片機品種更多。 本書的特點是取材于原文資料,總結(jié)實際教學和應(yīng)用經(jīng)驗,實例較多,實用性強。本書中C語言是針對8051特有結(jié)構(gòu)描述的,這樣,即使無編程基礎(chǔ)的人,也可通過本書學習單片機的c編程。單片機C語言應(yīng)用程序設(shè)計目錄第1章 單片機基礎(chǔ)知識 1.1 8051單片機的特點 1.2 8051的內(nèi)部知識 1.3 8051的系統(tǒng)擴展 習題一第2章 C與8051 2.1 8051的編程語言 2.2 Cx51編譯器 2.3 KEIL 8051開發(fā)工具 2.4 KEIL Cx51編程實例 2.5 Cx51程序結(jié)構(gòu) 習題二第3章 Cx51 數(shù)據(jù)與運算 3.1 數(shù)據(jù)與數(shù)據(jù)類型 3.2 常量與變量 3.3 Cx51數(shù)據(jù)存儲類型與8051存儲器結(jié)構(gòu) 3.4 8051特殊功能寄存器(SFR)及其Cx51定義 3.5 8051并行接口及其Cx51定義 3.6 位變量(BIT)及其Cx51定義 3.7 Cx51運算符、表達式及其規(guī)則 習題三第4章 Cx51 流程控制語句 4.1 C語言程序的基本結(jié)構(gòu)及其流程圖 4.2 選擇語句 4.3 循環(huán)語句 習題四第5章 Cx51 構(gòu)造數(shù)據(jù)類型 5.1 數(shù)組 5.2 指針 5.3 結(jié)構(gòu) 5.4 共用體 5.5 枚舉 習題五第6章 Cx51 函數(shù)第7章 模塊化程序設(shè)計第8章 8051內(nèi)部資源的C編輯第9章 8051擴展資源的C編輯第10章 8051輸出控制的C編程第11章 8051數(shù)據(jù)采集的C編程第12章 8051機間通信的C編程第13章 8051人機交互的C編程附錄A μVision2集成開發(fā)環(huán)境使用附錄B KEIL Cx51 上機制南
標簽: 單片機 C語言 應(yīng)用程序
上傳時間: 2013-10-21
上傳用戶:行者Xin
keil 使用筆記:在Memory窗口上輸入address_type:address才能看到正確地址的變量debug~perfermance analyzer加入要察看的模塊名稱,然后view~perfermance analyzer window 可以察看各個模塊運行時間①Display address_type:address B:Bit address C:Code Memory Bx:Code Bank D D:80H 命令可以查看特殊寄存器 data D I:0 命令可以查看內(nèi)部RAM數(shù)據(jù)iData; D X:0 命令可以查看外部RAM數(shù)據(jù)xData; ②R1 //顯示R1 register ~R1 //顯示變量R1 R1 = R7 //對寄存器Rx操作R1 = --R7 R1 = 0x20 ③main //顯示main()的開始地址d main //顯示main()的代碼④向RAM.ROM中寫數(shù)據(jù)Enter data_type address_type:address expr,expr.... data_type:int char double float long E char data:0x20 1,2,3,4 //向data區(qū)0x20開始的地址寫1,2,3,4 變量放在RAM的30H,要把定義放在main前面!另外特別注意,內(nèi)部RAM通常供C程序存放中間變量等,所以一定要看看編譯后的程序中是否存在存儲單元沖突的情況,比如如果程序中 使用了別的寄存器組的話,08-1FH單元就不能用了unsigned long data i _at_ 0x30
上傳時間: 2013-11-05
上傳用戶:dongqiangqiang
MCP定時器產(chǎn)生中心對稱PWM輸出:PWM波是一種脈寬可調(diào)的脈沖波,用于交、直流電機的電壓控制。PWM一共有兩種調(diào)整方法,一是定頻調(diào)寬、另一種是定寬調(diào)頻。其中定頻調(diào)寬是種最常見的脈寬調(diào)制方式,它使脈沖波的頻率保持不變,只調(diào)整脈沖寬度。同時定頻調(diào)寬的PWM波形也分為兩種,一種是單邊的PWM,另一種是中心對稱的雙邊PWM。中心對稱的PWM主要應(yīng)用在需要對稱PWM波形的場合,如半橋、全橋的雙極性驅(qū)動等。中心對稱的PWM的生成原理如圖1-2所示:定時計數(shù)器工作在連續(xù)增減計數(shù)方式,在計數(shù)初值設(shè)置為0且比較值小于周期值的條件下,當增計數(shù)過程中計數(shù)值和比較值匹配時置位輸出,而在周期匹配時會改計數(shù)方向為減計數(shù),當減計數(shù)過程中計數(shù)值和比較值匹配時復位輸出,當減計數(shù)到零時會改計數(shù)方向為增計數(shù),開始下一個循環(huán)。因此中心對稱的PWM的周期為設(shè)定周期的二倍,占空比為:%100))((×−TPRNTPR(N為比較匹配數(shù)據(jù),TPR為周期寄存器的值)。比較值的改變會影響PWM的兩邊的波形,并且兩邊相對高電平的中心對稱,這便是中心對稱雙邊PWM波形的特點。如果比較值為零,那么PWM將一直輸出高電平;如比較值大于等于周期值,則PWM會一直輸出低電平,占空比為0。
上傳時間: 2013-11-13
上傳用戶:sammi
MCP定時器產(chǎn)生邊沿PWM輸出:PWM波是一種脈寬可調(diào)的脈沖波,用于交、直流電機的電壓控制。PWM一共有兩種調(diào)整方法,一是定頻調(diào)寬、另一種是定寬調(diào)頻。其中定頻調(diào)寬是種最常見的脈寬調(diào)制方式,它使脈沖波的頻率保持不變,只調(diào)整脈沖寬度。同時定頻調(diào)寬的PWM波形也分為兩種,一種是單邊的PWM,另一種是中心對稱的雙邊PWM。單邊的PWM的生成原理如圖1-2:定時計數(shù)器工作在增計數(shù)方式,在計數(shù)初值設(shè)置為0且比較值小于周期值的條件下,當計數(shù)值和比較值匹配時置位輸出,而在周期匹配時復位輸出,同時清零計數(shù)器,開始下一個循環(huán)。因此單邊PWM的占空比為:%100))((×−TPRNTPR(N為比較匹配數(shù)據(jù),TPR為周期寄存器的值)。比較值的改變只影響PWM的單邊波形,這便是單邊PWM波形的特點。如果比較值為零,那么PWM將一直輸出高電平;如比較值同周期值相等,則PWM會輸出一個時鐘周期的低電平,占空比近似為0;當比較值大于周期值,那么PWM將一直輸出低電平。
上傳時間: 2013-11-07
上傳用戶:moerwang
含原理圖+電路圖+程序的波形發(fā)生器:在工作中,我們常常會用到波形發(fā)生器,它是使用頻度很高的電子儀器。現(xiàn)在的波形發(fā)生器都采用單片機來構(gòu)成。單片機波形發(fā)生器是以單片機核心,配相應(yīng)的外圍電路和功能軟件,能實現(xiàn)各種波形發(fā)生的應(yīng)用系統(tǒng),它由硬件部分和軟件部分組成,硬件是系統(tǒng)的基礎(chǔ),軟件則是在硬件的基礎(chǔ)上,對其合理的調(diào)配和使用,從而完成波形發(fā)生的任務(wù)。 波形發(fā)生器的技術(shù)指標:(1) 波形類型:方型、正弦波、三角波、鋸齒波;(2) 幅值電壓:1V、2V、3V、4V、5V;(3) 頻率值:10HZ、20HZ、50HZ、100HZ、200HZ、500HZ、1KHZ;(4) 輸出極性:雙極性操作設(shè)計1、 機器通電后,系統(tǒng)進行初始化,LED在面板上顯示6個0,表示系統(tǒng)處于初始狀態(tài),等待用戶輸入設(shè)置命令,此時,無任何波形信號輸出。2、 用戶按下“F”、“V”、“W”,可以分別進入頻率,幅值波形設(shè)置,使系統(tǒng)進入設(shè)置狀態(tài),相應(yīng)的數(shù)碼管顯示“一”,此時,按其它鍵,無效;3、 在進入某一設(shè)置狀態(tài)后,輸入0~9等數(shù)字鍵,(數(shù)字鍵僅在設(shè)置狀態(tài)時,有效)為欲輸出的波形設(shè)置相應(yīng)參數(shù),LED將參數(shù)顯示在面板上;4、 如果在設(shè)置中,要改變已設(shè)定的參數(shù),可按下“CL”鍵,清除所有已設(shè)定參數(shù),系統(tǒng)恢復初始狀態(tài),LED顯示6個0,等待重新輸入命令;5、 當必要的參數(shù)設(shè)定完畢后,所有參數(shù)顯示于LED上,用戶按下“EN”鍵,系統(tǒng)會將各波形參數(shù)傳遞到波形產(chǎn)生模塊中,以便控制波形發(fā)生,實現(xiàn)不同頻率,不同電壓幅值,不同類型波形的輸出;6、 用戶按下“EN”鍵后,波形發(fā)生器開始輸出滿足參數(shù)的波形信號,面板上相應(yīng)類型的運行指示燈閃爍,表示波形正在輸出,LED顯示波形類型編號,頻率值、電壓幅值等波形參數(shù);7、 波形發(fā)生器在輸出信號時,按下任意一個鍵,就停止波形信號輸出,等待重新設(shè)置參數(shù),設(shè)置過程如上所述,如果不改變參數(shù),可按下“EN”鍵,繼續(xù)輸出原波形信號;8、 要停止波形發(fā)生器的使用,可按下復位按鈕,將系統(tǒng)復位,然后關(guān)閉電源。硬件組成部分通過綜合比較,決定選用獲得廣泛應(yīng)用,性能價格高的常用芯片來構(gòu)成硬件電路。單片機采用MCS-51系列的89C51(一塊),74LS244和74LS373(各一塊),反相驅(qū)動器 ULN2803A(一塊),運算放大器 LM324(一塊) 波形發(fā)生器的硬件電路由單片機、鍵盤顯示器接口電路、波形轉(zhuǎn)換(D/ A)電路和電源線路等四部分構(gòu)成。1.單片機電路功能:形成掃描碼,鍵值識別,鍵功能處理,完成參數(shù)設(shè)置;形成顯示段碼,向LED顯示接口電路輸出;產(chǎn)生定時中斷;形成波形的數(shù)字編碼,并輸出到D/A接口電路;如電路原理圖所示: 89C51的P0口和P2口作為擴展I/O口,與8255、0832、74LS373相連接,可尋址片外的寄存器。單片機尋址外設(shè),采用存儲器映像方式,外部接口芯片與內(nèi)部存儲器統(tǒng)一編址,89C51提供16根地址線P0(分時復用)和P2,P2口提供高8位地址線,P0口提供低8位地址線。P0口同時還要負責與8255,0832的數(shù)據(jù)傳遞。P2.7是8255的片選信號,P2.6是0832(1)的片選,P2.5是0832(2)的片選,低電平有效,P0.0、P0.1經(jīng)過74LS373鎖存后,送到8255的A1、A2作,片內(nèi)A口,B口,C口,控制口等寄存器的字選。89C51的P1口的低4位連接4只發(fā)光三極管,作為波形類型指示燈,表示正在輸出的波形是什么類型。單片機89C51內(nèi)部有兩個定時器/計數(shù)器,在波形發(fā)生器中使用T0作為中斷源。不同的頻率值對應(yīng)不同的定時初值,定時器的溢出信號作為中斷請求。控制定時器中斷的特殊功能寄存器設(shè)置如下:定時控制寄存器TCON=(00010000)工作方式選擇寄存器(TMOD)=(00000000)中斷允許控制寄存器(IE)=(10000010)2、鍵盤顯示器接口電路功能:驅(qū)動6位數(shù)碼管動態(tài)顯示; 提供響應(yīng)界面; 掃面鍵盤; 提供輸入按鍵。由并口芯片8255,鎖存器74LS273,74LS244,反向驅(qū)動器ULN2803A,6位共陰極數(shù)碼管(LED)和4×4行列式鍵盤組成。8255的C口作為鍵盤的I/O接口,C口的低4位輸出到掃描碼,高4位作為輸入行狀態(tài),按鍵的分布如圖所示。8255的A口作為LED段碼輸出口,與74LS244相連接,B口作為LED的位選信號輸出口,與ULN2803A相連接。8255內(nèi)部的4個寄存器地址分配如下:控制口:7FFFH , A口:7FFFCH , B口:7FFDH , C口:7FFEH 3、D/A電路功能:將波形樣值的數(shù)字編碼轉(zhuǎn)換成模擬值;完成單極性向雙極性的波形輸出;構(gòu)成由兩片0832和一塊LM324運放組成。0832(1)是參考電壓提供者,單片機向0832(1)內(nèi)的鎖存器送數(shù)字編碼,不同的編碼會產(chǎn)生不同的輸出值,在本發(fā)生器中,可輸出1V、2V、3V、4V、5V等五個模擬值,這些值作為0832(2)的參考電壓,使0832(2)輸出波形信號時,其幅度是可調(diào)的。0832(2)用于產(chǎn)生各種波形信號,單片機在波形產(chǎn)生程序的控制下,生成波形樣值編碼,并送到0832(2)中的鎖存器,經(jīng)過D/A轉(zhuǎn)換,得到波形的模擬樣值點,假如N個點就構(gòu)成波形的一個周期,那么0832(2)輸出N個樣值點后,樣值點形成運動軌跡,就是波形信號的一個周期。重復輸出N個點后,由此成第二個周期,第三個周期……。這樣0832(2)就能連續(xù)的輸出周期變化的波形信號。運放A1是直流放大器,運放A2是單極性電壓放大器,運放A3是雙極性驅(qū)動放大器,使波形信號能帶得起負載。地址分配:0832(1):DFFFH ,0832(2):BFFFH4、電源電路:功能:為波形發(fā)生器提供直流能量;構(gòu)成由變壓器、整流硅堆,穩(wěn)壓塊7805組成。220V的交流電,經(jīng)過開關(guān),保險管(1.5A/250V),到變壓器降壓,由220V降為10V,通過硅堆將交流電變成直流電,對于諧波,用4700μF的電解電容給予濾除。為保證直流電壓穩(wěn)定,使用7805進行穩(wěn)壓。最后,+5V電源配送到各用電負載。
上傳時間: 2013-11-08
上傳用戶:685
介紹用PIC16F84單片機制作的電子密碼鎖。PIC16F84單片機共18個引腳,13個可用I/O接口。芯片內(nèi)有1K×14的FLASHROM程序存儲器,36×8的靜態(tài)RAM的通用寄存器,64×8的EEPROM的數(shù)據(jù)存儲器,8級深度的硬堆棧。 用PIC單片機設(shè)計的電子密碼鎖微芯公司生產(chǎn)的PIC8位COMS單片機,采用類RISC指令集和哈弗總線結(jié)構(gòu),以及先進的流水線時序,與傳統(tǒng)51單片機相比其在速度和性能方面更具優(yōu)越性和先進性。PIC單片機的另一個優(yōu)點是片上硬件資源豐富,集成常見的EPROM、DAC、PWM以及看門狗電路。這使得硬件電路的設(shè)計更加簡單,節(jié)約設(shè)計成本,提高整機性能。因此PIC單片機已成為產(chǎn)品開發(fā),尤其是產(chǎn)品設(shè)計和研制階段的首選控制器。本文介紹用PIC16F84單片機制作的電子密碼鎖。PIC16F84單片機共18個引腳,13個可用I/O接口。芯片內(nèi)有1K×14的FLASHROM程序存儲器,36×8的靜態(tài)RAM的通用寄存器,64×8的EEPROM的數(shù)據(jù)存儲器,8級深度的硬堆棧。硬件設(shè)計 電路原理見圖1。Xx8位數(shù)據(jù)線接4x4鍵盤矩陣電路,面板布局見表1,A、B、C、D為備用功能鍵。RA0、RA7輸出4組編碼二進制數(shù)據(jù),經(jīng)74LS139譯碼后輸出逐行掃描信號,送RB4-RB7列信號輸入端。余下半個139譯碼器動揚聲器。RB2接中功率三極管基極,驅(qū)動繼電器動作。有效密碼長度為4位,根據(jù)實際情況,可通過修改源程序增加密碼位數(shù)。產(chǎn)品初始密碼為3345,這是一隨機數(shù),無特殊意義,目的是為防止被套解。用戶可按*號鍵修改密碼,按#號鍵結(jié)束。輸入密碼并按#號確認之后,腳輸出RB2腳輸出高電平,繼電器閉合,執(zhí)行一次開鎖動作。 若用戶輸入的密碼正確,揚聲器發(fā)出一聲稍長的“滴”提示聲,若輸入的密碼與上次修改的不符,則發(fā)出短促的“滴”聲。連續(xù)3次輸入密碼錯誤之后,程序鎖死,揚聲器報警。直到CPU被復位或從新上電。軟件設(shè)計 軟件流程圖見圖3。CPU上電或復位之后將最近一次修改并保存到EEPROM的密碼讀出,最為參照密匙。然后等待用戶輸入開鎖密碼。若5分鐘以內(nèi)沒有接受到用戶的任何輸入,CPU自動轉(zhuǎn)入掉電模式,用戶輸入任意值可喚醒CPU。每次修改密碼之后,CPU將新的密碼存入內(nèi)部4個連續(xù)的EEPROM單元,掉電后該數(shù)據(jù)任有效。每執(zhí)行一次開鎖指令,CPU將當前輸入密碼與該值比較,看是否真確,并給出相應(yīng)的提示和控制。布 局 所有元件均使用SMD表貼封裝,縮小體積,便于產(chǎn)品安裝,60X60雙面PCB板,頂層是一體化輸入鍵盤,底層是元件層。成型后的產(chǎn)品體積小巧,能很方便的嵌入防盜鐵門、保險箱柜。
標簽: PIC 單片機設(shè)計 電子密碼鎖
上傳時間: 2013-10-31
上傳用戶:uuuuuuu
82C55A是高性能,工業(yè)標準,并行I/O的LSI外圍芯片;提供24條I/O腳線。 在三種主要的操作方式下分組進行程序設(shè)計82C88A的幾個特點:(1)與所有Intel系列微處理器兼容;(2)有較高的操作速度;(3)24條可編程I/O腳線;(4)底功耗的CHMOS;(5)與TTL兼容;(6)擁有控制字讀回功能;(7)擁有直接置位/復位功能;(8)在所有I/O輸出端口有2.5mA DC驅(qū)動能力;(9)適應(yīng)性強。方式0操作稱為簡單I/O操作,是指端口的信號線可工作在電平敏感輸入方式或鎖存輸出。所以,須將控制寄存器設(shè)計為:控制寄存器中:D7=1; D6 D5=00; D2=0。D7位為1代表一個有效的方式。通過對D4 D3 D1和D0的置位/復位來實現(xiàn)端口A及端口B是輸入或輸出。P56表2-1列出了操作方式0端口管腳功能。
上傳時間: 2013-10-26
上傳用戶:brilliantchen
15-1.實現(xiàn)定時的方法15-2.定時器/計數(shù)器的結(jié)構(gòu)和工作原理 15-3.定時器/計數(shù)器的控制15-4.定時器/計數(shù)器的工作方式 15-5.定時器/計數(shù)器應(yīng)用 軟件定時軟件延時不占用硬件資源,但占用了CPU時間,降低了CPU的利用率。例如延時程序。采用時基電路定時例如采用555電路,外接必要的元器件(電阻和電容),即可構(gòu)成硬件定時電路。但在硬件連接好以后,定時值與定時范圍不能由軟件進行控制和修改,即不可編程,且定時時間容易漂移。可編程定時器定時最方便的辦法是利用單片機內(nèi)部的定時器/計數(shù)器。結(jié)合了軟件定時精確和硬件定時電路獨立的特點。定時器/計數(shù)器的結(jié)構(gòu) 定時器/計數(shù)器的實質(zhì)是加1計數(shù)器(16位),由高8位和低8位兩個寄存器組成。TMOD是定時器/計數(shù)器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制T0、T1的啟動和停止及設(shè)置溢出標志。
上傳時間: 2014-12-28
上傳用戶:rnsfing
有兩種方式可以讓設(shè)備和應(yīng)用程序之間聯(lián)系:1. 通過為設(shè)備創(chuàng)建的一個符號鏈;2. 通過輸出到一個接口WDM驅(qū)動程序建議使用輸出到一個接口而不推薦使用創(chuàng)建符號鏈的方法。這個接口保證PDO的安全,也保證安全地創(chuàng)建一個惟一的、獨立于語言的訪問設(shè)備的方法。一個應(yīng)用程序使用Win32APIs來調(diào)用設(shè)備。在某個Win32 APIs和設(shè)備對象的分發(fā)函數(shù)之間存在一個映射關(guān)系。獲得對設(shè)備對象訪問的第一步就是打開一個設(shè)備對象的句柄。 用符號鏈打開一個設(shè)備的句柄為了打開一個設(shè)備,應(yīng)用程序需要使用CreateFile。如果該設(shè)備有一個符號鏈出口,應(yīng)用程序可以用下面這個例子的形式打開句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統(tǒng)本調(diào)用希望打開一個設(shè)備。這個設(shè)備必須有一個符號鏈,以便應(yīng)用程序能夠打開它。有關(guān)細節(jié)查看有關(guān)Kdevice和CreateLink的內(nèi)容。在上述調(diào)用中第一個參數(shù)中前綴后的部分就是這個符號鏈的名字。注意:CreatFile中的第一個參數(shù)不是Windows 98/2000中驅(qū)動程序(.sys文件)的路徑。是到設(shè)備對象的符號鏈。如果使用DriverWizard產(chǎn)生驅(qū)動程序,它通常使用類KunitizedName來構(gòu)成設(shè)備的符號鏈。這意味著符號鏈名有一個附加的數(shù)字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應(yīng)用程序需要被覆蓋的I/O,第六個參數(shù)(Flags)必須或上FILE_FLAG_OVERLAPPED。 使用一個輸出接口打開句柄用這種方式打開一個句柄會稍微麻煩一些。DriverWorks庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類封裝了一個設(shè)備信息集,該信息集包含了特殊類中的所有設(shè)備接口信息。應(yīng)用程序能有用CdeviceInterfaceClass類的一個實例來獲得一個或更多的CdeviceInterface類的實例。CdeviceInterface類是一個單一設(shè)備接口的抽象。它的成員函數(shù)DevicePath()返回一個路徑名的指針,該指針可以在CreateFile中使用來打開設(shè)備。下面用一個小例子來顯示這些類最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface( GUID* pClassGuid, DWORD instance, PDWORD pError){ CDeviceInterfaceClass DevClass(pClassGuid, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; CDeviceInterface DevInterface(&DevClass, instance, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; cout << "The device path is " << DevInterface.DevicePath() << endl; HANDLE hDev; hDev = CreateFile( DevInterface.DevicePath(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hDev == INVALID_HANDLE_VALUE) *pError = GetLastError(); return hDev;} 在設(shè)備中執(zhí)行I/O操作一旦應(yīng)用程序獲得一個有效的設(shè)備句柄,它就能使用Win32 APIs來產(chǎn)生到設(shè)備對象的IRPs。下面的表顯示了這種對應(yīng)關(guān)系。Win32 API DRIVER_FUNCTION_xxxIRP_MJ_xxx KDevice subclass member function CreateFile CREATE Create ReadFile READ Read WriteFile WRITE Write DeviceIoControl DEVICE_CONTROL DeviceControl CloseHandle CLOSECLEANUP CloseCleanUp 需要解釋一下設(shè)備類成員的Close和CleanUp:CreateFile使內(nèi)核為設(shè)備創(chuàng)建一個新的文件對象。這使得多個句柄可以映射同一個文件對象。當這個文件對象的最后一個用戶級句柄被撤銷后,I/O管理器調(diào)用CleanUp。當沒有任何用戶級和核心級的對文件對象的訪問的時候,I/O管理器調(diào)用Close。如果被打開的設(shè)備不支持指定的功能,則調(diào)用相應(yīng)的Win32將引起錯誤(無效功能)。以前為Windows95編寫的VxD的應(yīng)用程序代碼中可能會在打開設(shè)備的時候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個屬性,因為它將導致沒有特權(quán)的用戶企圖打開這個設(shè)備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數(shù)轉(zhuǎn)換成IRP域的方法依賴于設(shè)備對象的屬性。當設(shè)備設(shè)置DO_DIRECT_IO標志,I/O管理器將buff鎖住在存儲器中,并且創(chuàng)建了一個存儲在IRP中的MDL域。一個設(shè)備可以通過調(diào)用Kirp::Mdl來存取MDL。當設(shè)備設(shè)置DO_BUFFERED_IO標志,設(shè)備對象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或?qū)懖僮鳙@得buff地址。當設(shè)備不設(shè)置DO_BUFFERED_IO標志也不設(shè)置DO_DIRECT_IO,內(nèi)核設(shè)置IRP 的UserBuffer域來對應(yīng)ReadFile或WriteFile中的buff參數(shù)。然而,存儲區(qū)并沒有被鎖住而且地址只對調(diào)用進程有效。驅(qū)動程序可以使用KIrp::UserBuffer來存取IRP域。對于DeviceIoControl調(diào)用,buffer參數(shù)的轉(zhuǎn)換依賴于特殊的I/O控制代碼,它不在設(shè)備對象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構(gòu)造控制代碼。這個宏的其中一個參數(shù)指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對應(yīng)的能獲得輸入緩沖與輸出緩沖的KIrp中的成員函數(shù):Method Input Buffer Parameter Output Buffer Parameter METHOD_BUFFERED KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代碼指明METHOD_BUFFERED,系統(tǒng)分配一個單一的緩沖來作為輸入與輸出。驅(qū)動程序必須在向輸出緩沖放數(shù)據(jù)之前拷貝輸入數(shù)據(jù)。驅(qū)動程序通過調(diào)用KIrp::IoctlBuffer獲得緩沖地址。在完成時,I/O管理器從系統(tǒng)緩沖拷貝數(shù)據(jù)到提供給Ring 3級調(diào)用者使用的緩沖中。驅(qū)動程序必須在結(jié)束前存儲拷貝到IRP的Information成員中的數(shù)據(jù)個數(shù)。如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數(shù)呈現(xiàn)不同的含義。參數(shù)InputBuffer被拷貝到一個系統(tǒng)緩沖,這個緩沖驅(qū)動程序可以通過調(diào)用KIrp::IoctlBuffer。參數(shù)OutputBuffer被映射到KMemory對象,驅(qū)動程序?qū)@個對象的訪問通過調(diào)用KIrp::Mdl來實現(xiàn)。對于METHOD_OUT_DIRECT,調(diào)用者必須有對緩沖的寫訪問權(quán)限。注意,對METHOD_NEITHER,內(nèi)核只提供虛擬地址;它不會做映射來配置緩沖。虛擬地址只對調(diào)用進程有效。這里是一個用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE來定義一個IOCTL代碼:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)現(xiàn)在使用一個DeviceIoControl調(diào)用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING, NULL, // no input 注意,這里放的是包含有執(zhí)行操作命令的字符串指針 0, FirmwareRev, //這里是output串指針,存放從驅(qū)動程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize, NULL // not overlapped I/O );如果輸出緩沖足夠大,設(shè)備拷貝串到里面并將拷貝的資結(jié)束設(shè)置到FirmwareRevSize中。在驅(qū)動程序中,代碼看起來如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){ ULONG fwLength=0; switch ( I.IoctlCode() ) { case IOCTL_MYDEV_GET_FIRMWARE_REV: fwLength = strlen(FIRMWARE_REV)+1; if (I.IoctlOutputBufferSize() >= fwLength) { strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV); I.Information() = fwLength; return I.Complete(STATUS_SUCCESS); } else { } case . . . } }
標簽: 驅(qū)動程序 應(yīng)用程序 接口
上傳時間: 2013-10-17
上傳用戶:gai928943
《現(xiàn)代微機原理與接口技術(shù)》實驗指導書 TPC-H實驗臺C語言版 1.實驗臺結(jié)構(gòu)1)I / O 地址譯碼電路如上圖1所示地址空間280H~2BFH共分8條譯碼輸出線:Y0~Y7 其地址分別是280H~287H、288H~28FH、290H~297H、298H~29FH、2A0H~2A7H、2A8H~2AFH、2B0H~2B7H、2B8H~2BFH,8根譯碼輸出線在實驗臺I/O地址處分別由自鎖緊插孔引出供實驗選用(見圖2)。 2) 總線插孔采用“自鎖緊”插座在標有“總線”區(qū)引出數(shù)據(jù)總線D7~D0;地址總線A9~A0,讀、寫信號IOR、IOW;中斷請求信號IRQ ;DMA請求信號DRQ1;DMA響應(yīng)信號DACK1 及AEN信號,供學生搭試各種接口實驗電路使用。3) 時鐘電路如圖-3所示可以輸出1MHZ 2MHZ兩種信號供A/D轉(zhuǎn)換器定時器/計數(shù)器串行接口實驗使用。圖34) 邏輯電平開關(guān)電路如圖-4所示實驗臺右下方設(shè)有8個開關(guān)K7~K0,開關(guān)撥到“1”位置時開關(guān)斷開,輸出高電平。向下打到“0”位置時開關(guān)接通,輸出低電平。電路中串接了保護電阻使接口電路不直接同+5V 、GND相連,可有效地防止因誤操作誤編程損壞集成電路現(xiàn)象。圖 4 圖 55) L E D 顯示電路如圖-5所示實驗臺上設(shè)有8個發(fā)光二極管及相關(guān)驅(qū)動電路(輸入端L7~L0),當輸入信號為“1” 時發(fā)光,為“0”時滅6) 七段數(shù)碼管顯示電路如圖-6所示實驗臺上設(shè)有兩個共陰極七段數(shù)碼管及驅(qū)動電路,段碼為同相驅(qū)動器,位碼為反相驅(qū)動器。從段碼與位碼的驅(qū)動器輸入端(段碼輸入端a、b、c、d、e、f、g、dp,位碼輸入端s1、 s2)輸入不同的代碼即可顯示不同數(shù)字或符號。
上傳時間: 2013-11-22
上傳用戶:sssnaxie
蟲蟲下載站版權(quán)所有 京ICP備2021023401號-1