版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章單片機的C語言應用程序設計7.1C語言與MCS-517.2C51數據類型及在MCS-51中的存儲方式
7.3C51數據的存儲類型與MCS-51存儲結構7.4MCS-51特殊功能寄存器(SFR)的C51定義7.5MCS-51并行接口的C51定義7.6位變量的C51定義7.7C51構造數據類型
7.8模塊化程序開發(fā)過程7.9MCS-51內部資源使用的C語言編程7.10MCS-51片外擴展的C語言編程7.11頻率量測量的C語言編程7.12MCS-51機間通信的C語言編程7.13鍵盤和數碼顯示人機交互的C語言編程7.1C語言與MCS–51用匯編程序設計MCS–51系列單片機應用程序時,必須要考慮其存儲器結構,尤其必須考慮其片內數據存儲器與特殊功能寄存器正確、合理的使用以及按實際地址處理端口數據。用C語言編寫MCS–51單片機的應用程序,雖然不像用匯編語言那樣具體地組織、分配存儲器資源和處理端口數據,但在C語言編程中,對數據類型與變量的定義,必須要與單片機的存儲結構相關聯(lián),否則編譯器不能正確地映射定位。用C語言編寫單片機應用程序與編寫標準的C語言程序的不同之處就在于根據單片機存儲結構及內部資源定義相應的C語言中的數據類型和變量,其它的語法規(guī)定、程序結構及程序設計方法都與標準的C語言程序設計相同。用C語言編寫的應用程序必須經單片機的C語言編譯器(簡稱C51),轉換生成單片機可執(zhí)行的代碼程序。支持MCS–51系列單片機的C語言編譯器有很多種。如AmericanAutomation、Auocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL/Franklin等。其中KEIL/Franklin以它的代碼緊湊和使用方便等特點優(yōu)于其它編譯器。本章是針對這種編譯器介紹MCS–51單片機C語言程序設計。7.2C51數據類型及在MCS-51中的存儲方式7.2.1C51的數據類型FranklinC51編譯器具體支持的數據類型有:位型(bit)、無符號字符(unsignedchar)、有符號字符(singedchar)、無符號整型(unsignedint)、有符號整型(signedint)、無符號長整型(unsignedlong)、有符號長整型(signedlong)、浮點型(float)和指針類型等。表7.1FranklinC51的數據類型數據類型長度(bit)長度(byte)值域bit110,1unsignedchar810~255signedchar81–128~127unsignedint1620~65535signedint162–32768~32767unsignedlong3240~4294967295signedlong324–2147483648~2147483647float324±1.176E–38~±3.40E+38(6位數字)double648±1.176E–38~±3.40E+38(10位數字)一般指針243存儲空間0~655357.2.2C51數據在MCS-51中的存儲方式位變量(bit):與MCS-51硬件特性操作有關的可以定義成位變量。位變量必須定位在MCS-51單片機片內RAM的位尋址空間中。字符變量(char):字符變量的長度為1byte即8位。這很合適MCS-51單片機,因為MCS-51單片機每次可處理8位數據。對于無符號變量(unsignedchar)的值域范圍是0~255。對于有符號字符變量(signedchar),最具有重要意義的位是最高位上的符號標志位(msb)。此位為1代表"負",為0代表"正"。有符號字符變量和無符號字符變量在表示0~127的數值時,其含義是一樣的,都是0~0x7F。負數一般用補碼表示,即用11111111表示-1,用11111110表示-2……。當進行乘除法運算時,符號問題就變得十分復雜,而C51編譯器會自動地將相應的庫函數調入程序中來解決這個問題。整型變量(int):整型變量的長度為16位。與8080和8086CPU系列不同,MCS-51系列單片機將int型變量的高位字節(jié)數存放在低地址字節(jié)中,低位字節(jié)數存放在高地址字節(jié)中。有符號整型變量(signedint)也使用msb位作符號標志位,并使用二進制補碼表示數值。可直接使用幾種專用的機器指令來完成多字節(jié)的加、減、乘、除運算。整型變量值0x1234以圖7.1所示的方式存放在內存中。圖7.1整型數的存儲結構…0x120x34…+0+1地址0x120x340x560x78….+0+1+2+3地址圖7.2長整型變量的存儲結構浮點型變量(float):浮點型變量為32位,占4個字節(jié),許多復雜的數學表達式都采用浮點變量數據類型。應用符號位表示數的符號,用階碼和尾數表示數的大小。用它們進行任何數學運算都需要使用由編譯器決定的各種不同效率等級的庫函數。FranklinC51的浮點變量數據類型的使用格式與IEEE-754標準有關,具有24位精度,尾數的高位始終為"1",因而不保存,位的分布如下:●1位符號位?!?位指數位?!?3位尾數。符號位是最高位,尾數為低23位,內存中按字節(jié)存儲順序如下:地址+0+1+2+3內容MMMMMMMMMMMMMMMMEMMMMMMMSEEEEEEE其中,S為符號位,1表示負,0表示正;E為階碼;M為23位尾數,最高位為"1"。浮點變量值-12.5的十進制為:0xC1480000,它按圖7.3所示方式存于內存中。0x000x000x480xC1….+0+1+2+3地址址圖7.3浮浮點點數數的的存存儲儲結結構構在編編程程時時,,如如果果只只強強調調運運算算速速度度而而不不進進行行負負數數運運算算時時,,最最好好采采用用無無符符號號(unsigned)格式。無符號字符類類型的使用::無論何時,,應盡可能使使用無符號字字符變量,因因為它能直接接被MCS-51所接受?;谟谕瑯拥脑蛞?,也應盡量量使用位變量量。有符號字字符變量雖然然也只占用一一個字節(jié),但但需要進行額額外的操作來來進行測試代代碼的符號位位。這無疑會會降低代碼效效率。使用簡化形式式定義數據類類型。其方法法是在源程序序開頭使用#define語句自定義簡簡化的類型標標識符。例如如:#defineucharunsignedchar#defineuintunsignedint這樣,在編程程中,就可以以用uchar代替unsignedchar,用uint代替unsignedint來定義變量。。7.3C51數據的存儲類類型與MCS-51存儲結構表7.2C51存儲類型與MCS-51存儲空間的對對應關系存儲類型與存儲空間的對應關系data直接尋址片內數據存儲區(qū),訪問速度快(128字節(jié))bdata可位尋址片內數據存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié))idata間接尋址片內數據存儲區(qū),可訪問片內全部RAM地址空間(256字節(jié))pdata分頁尋址片外數據存儲區(qū)(256字節(jié))由MOV@Ri訪問(i=0,1)xdata片外數據存儲區(qū)(64KB)由MOVX@DPTR訪問code程序存儲器64KB空間,由MOVC@DPTR訪問表7.3C51存儲類型及其其數據長度和和值域存儲類型長度(bit)長度(byte)值域范圍data810~255idata810~255pdata810~255xdata1620~65535code1620~65535帶存儲類型的的變量的定義義的一般格式式為數據類型存存儲類型變變量名帶存儲類型的的變量定義舉舉例:chardatavar1;bitbdataflags;;floatidatax,y,z;;unsignedintpdatavar2;unsignedcharvector[3][4];表7.4存存儲模式式說明存儲模式說明SMALL默認的存儲類型是data,參數及局部變量放入可直接尋址片內RAM的用戶區(qū)中(最大128字節(jié))。另外所有對象(包括堆棧),都必須嵌入片內RAM。棧長很關鍵,因為實際棧長依賴于函數嵌套調用層數COMPACT默認的存儲類型是pdata,參數及局部變量放入分頁的外部數據存儲區(qū),通過@R0或@R1間接訪問,??臻g位于片內數據存儲區(qū)中LARGE默認的存儲類型是xdata,參數及局部變量直接放入片外數據存儲區(qū),使用數據指針DPTR來進行尋址。用此數據指針進行訪問效率較低,尤其對兩個或多個字節(jié)的變量,這種數據類型的訪問機制直接影響代碼的長度7.4MCS-51特殊功能寄存存器(SFR)的C51定義MCS-51單片機中,除除了程序計數數器PC和4組工作寄寄存器組外,,其它所有的的寄存器均為為特殊功能寄寄存器(SFR),分散在片內RAM區(qū)的高128字節(jié)中,地地址范圍為80H~0FFH。SFR中有11個寄寄存器具有位位尋址能力,,它們的字節(jié)節(jié)地址都能被被8整除,即即字節(jié)地址是是以8或0為為尾數的。為了能直接訪訪問這些SFR,F(xiàn)ranklinC51提供了一種自自主形式的定定義方法,這這種定義方法法與標準C語言不兼容,,只適用于對對MCS-51系列單片機進進行C語言編程。特特殊功能寄存存器C51定義的一般語語法格式如下下:sfrsfr-name=intconstant;"sfr"是定義語句的的關鍵字,其其后必須跟一一個MSC-51單片機真實存存在的特殊功功能寄存器名名,"="后后面必須是一一個整型常數數,不允許帶帶有運算符的的表達式,是是特殊功能寄寄存器"sfr-name"的字節(jié)地址,,這個常數值值的范圍必須須在SFR地址范圍內,,位于0x80~0xFF。例如:sfrSCON=0x98;/*串口控制寄存存器地址98H*/sfrTMOD=0x89;/*定時器/計數數器方式控制制寄存器地址址89H*/MCS-51系列單片機的的特殊功能寄寄存器的數量量與類型不盡盡相同,因此此建議將所有有特殊的"sfr"定義放入一個個頭文件中,,該文件應包包括MCS-51單片機系列機機型中的SFR定義。C51編譯器的"reg51.h"頭文件就是這這樣一個文件件。在新的MCS-51系列產品中,,SFR在功能上經常常組合為16位值,當SFR的高字節(jié)地址址直接位于低低字節(jié)之后時時,對16位位SFR的值可以直接接進行訪問。。例如52子子系列的定時時器/計數器器2就是這種種情況。為了了有效地訪問問這類SFR,可使用關鍵字字"sfr16"來定義,其定定義語句的語語法格式與8位SFR相同,只是"="后面的的地址必須用用16位SFR的低字節(jié)地址址,即低字節(jié)節(jié)地址作為"sfr16"的定義地址。。例如:sfr16T2=0xCC /*定時器/計數數器2:T2低8位地址為為0CCH,T2高8位地址為為0CDH*/這種定義適用用于所有新的的16位SFR,但不能用于定定時器/計數數器0和1。。對于位尋址的的SFR中的位,C51的擴充功能支支持特殊位的的定義,像SFR一樣不與標準準C兼容,使用"sbit"來定義位尋址址單元。第一種格式::sbitbit-name=sfr-name^intconstant;"sbit"是定義語句的的關鍵字,后后跟一個尋址址位符號名(該位符號名名必須是MCS-51單片機中規(guī)定定的位名稱),"="后后的"sfr-name"必須是已定義義過的SFR的名字,"^"后的整常常數是尋址位位在特殊功能能寄存器"sfr-name"中的位號,必必須是0~7范圍中的數數。例如:sfrPSW=0xD0;/*定義PSW寄存器地址為為D0H*/sbitOV=PSW^2;/*定義OV位為PSW.2,,地址為D2H*/sbitCY=PSW^7;/*定義CY位為PSW.7,,地址為D7H*/第二種格式::sbitbit-name=intconstant^intconstant;"="后的intconstant為尋址地址位位所在的特殊殊功能寄存器器的字節(jié)地址址,"^"符符號后的intconstant為尋址位在特特殊功能寄存存器中的位號號。例如:sbitOV=0XD0^2;; /*定義OV位地址是D0H字節(jié)中中的第2位*/sbitCY=0XD0^7;; /*定義CY位地址址是D0H字節(jié)中中的的第7位*/第三種種格式式:sbitbit-name=intconstant;;"="后的intconstant為尋址址位的的絕對對位地地址。。例如如:sbitOV=0XD2;;/*定義OV位地址址為D2H*/sbitCY=0XD7;;/*定義CY位地址址為D7H*/特殊功功能位位代表表了一一個獨獨立的的定義義類,,不能能與其其它位位定義義和位位域互互換。。7.5MCS-51并行接接口的的C51定義MCS-51系列單單片機機并行行I/O接口除除了芯芯片上上的4個I/O口(P0~P3)外,還還可以以在片片外擴擴展I/O口。MCS-51單片機機I/O口與數數據存存儲器器統(tǒng)一一編址址,即即把一一個I/O口當作作數據據存儲儲器中中的一一個單單元來來看待待。使用C51進行編編程時時,MCS-51片內的的I/O口與片片外擴擴展的的I/O可以統(tǒng)統(tǒng)一在在一個個頭文文件中中定義義,也也可以以在程程序中中(一一般在在開始始的位位置)進行行定義義,其其定義義方法法如下下:對于MCS-51片內I/O口按特特殊功功能寄寄存器器方法法定義義。例例如::sfrP0=0x80;;/*定義P0口,地地址為為80H*/sfrP1=0x90;;/*定義P1口,地地址為為90H*/對于片片外擴擴展I/O口,則則根據據硬件件譯碼碼地址址,將將其視視作為為片外外數據據存儲儲器的的一個個單元元,使使用#define語句進進行定定義。。例如如#include<absacc.h>#definePORTAXBYTE[0xFFC0]absacc.h是C51中絕對對地址址訪問問函數數的頭頭文件件,將將PORTA定義為為外部部I/O口,地地址為為FFC0H,長度為為8位位。一旦在在頭文文件或或程序序中對對這些些片外外I/O口進行行定義義后,,在程程序中中就可可以自自由使使用變變量名名與其其實際際地址址的聯(lián)聯(lián)系,,以便便使程程序員員能用用軟件件模擬擬MCS-51的硬件件操作作。(1)位位變量量C51定義。使使用C51編程時,,定義了了位變量量后,就就可以用用定義了了的變量量來表示示MCS-51的位尋址址單元。。位變量的的C51定義的一一般語法法格式如如下:位類型標標識符(bit)位變量名名;例如:bitdirection_bit;;/*把direction_bit定義為位位變量*/bitlook_pointer;; /*把look_pointer定義為位位變量*/7.6位位變變量的C51定義(2)函函數可可包含類類型為"bit"的參數,,也可以以將其作作為返回回值。例例如:bitfunc(bitb0,bitb1)/*變量b0,b1作為函數數的參數數*/{return(b1);/*變量b1作為函數數的返回回值*/}注意,使使用(#pragmadisable)或包含明明確的寄寄存器組組切換(usingn)的函數不不能返回回位值,,否則編編輯器將將會給出出一個錯錯誤信息息?!?3)對對位變變量定義義的限制制。位變變量不能能定義成成一個指指針,如如不能定定義:bit*bit_pointer。。不存在位位數組,,如不能能定義::bitb_array[]。。在位定義義中,允允許定義義存儲類類型,位位變量都都被放入入一個位位段,此此段總位位于MCS-51片內的RAM區(qū)中。因因此,存存儲類型型限制為為data和idata,如果將位位變量的的存儲類類型定義義成其它它存儲類類型都將將編譯出出錯。例1先定義變變量的數數據類型型和存儲儲類型::bdataintibase;/*定義ibase為bdata整型變量量*/bdatacharbary[4];;/*bary[4]定義為bdata字符型數數組*/然后可使使用"sbit"定義可獨獨立尋址址訪問的的對象位位:sbitmybit0=ibase^0;; /*mybit0定義為ibase的第0位位*/sbitmybit15=ibase^15;; /*mybit0定義為ibase的第15位*/sbitAry07=bary[0]^7;; /*Ary07定義為abry[0]的第7位位*/sbitAry37=bary[3]^7;; /*Ary37定義為abry[3]的第7位位*/對象ibase和bary也可以字字節(jié)尋址址:ary37=0;/*bary[3]的第7位位賦值為為0*/bary[3]='a';/*字節(jié)尋址址,bary[3]賦值為'a'*/sbit定義要位位尋址對對象所在在字節(jié)基基址對象象的存儲儲類型為為"bdata",否則只有有絕對的的特殊位位定義(sbit)是合法的的。"^"操作作符后的的最大值值依賴于于指定的的基類型型,對于于char/uchar而言是0~7,,對于int/uint而言是0~15,對于于long/ulong而言是0~31。7.7C51構造數據據類型1.基于于存儲器器的指針針基于存儲儲器的指指針以存存儲器類類型為參參量,它它在編譯譯時才被被確定。。因此,,為指針針選擇存存儲器的的方法可可以省掉掉,以便便這些指指針的長長度為一一個字節(jié)節(jié)(idata*,data*,pdata*)或2個字字節(jié)(code*,,xdata*)。編譯時,,這類操操作一般般被"行行內"(inline)編碼,而而無需進進行庫調調用?;诖鎯ζ鞯闹钢羔樁x義舉例::charxdata*px;在xdata存儲器中中定義了了一個指指向字符符型(char)的指針變變量px。指針自身身在默認認存儲區(qū)區(qū)(決定定于編譯譯模式),長度度為2個個字節(jié)(值為0~0xFFFF)。charxdata*datapdx;除了明確確定義指指針位于于MCS-51內部存儲儲區(qū)(data)外,其它它與上例例相同,,它與編編譯模式式無關。。datacharxdata*pdx;structtime{charhour;charmin;;charsec;;structtimexdata*pxtime;}在結構structtime中,除了了其它結結構成員員外,還還包含有有一個具具有和structtime相同的指指針pxtime,time位于外部部數據存存儲器(xdata),指針pxtime具有兩個個字節(jié)長長度。structtimeidata*ptime;這個聲明明定義了了一個位位于默認認存儲器器中的指指針,它它指向結結構time,time位于idata存儲器中中,結構構成員可可以通過過MCS-51的@R0或@R1進行間接接訪問,,指針ptime為1個字字節(jié)長。。ptime→pxtime→hour=12;使用上面面的關于于structtime和structidata*ptime的定義,,指針"pxtime"被從結構構中間接接調用,,它指向向位于xdata存儲器中中的time結構。結結構成員員hour被賦值為為12。。2.一般指指針一般指針包包括3個字字節(jié):1個個字節(jié)存儲儲類型和2個字節(jié)偏偏移地址,,即地址+0+1+2內容存儲器類型偏移地址高位字節(jié)偏移地址低位字節(jié)其中,第一一字節(jié)代表表了指針的的存儲器類類型,存儲儲器類型編編碼如下::存儲器類型idataxdatapdatadatacode值12345例如,以xdata類型的0x1234地址為指針針可以表示示如下:地址+0+1+2內容0x020x120x34當用常數作作指針時,,必須注意意正確定義義存儲器類類型和偏移移量。例如,將常常數值0x41寫入地址為為0x8000的外部數據據存儲器。。#defineXBYTE((char*)0x20000L)XBYTE[0x8000]=0x41;;其中,XBYTE被定義為(char*)0x20000L,0x20000L為一般指針針,其存儲儲類型為2,偏移量量為0000H,這樣XBYTE成為指向xdata零地址的指指針。而XBYTE[8000]則是外部數數據存儲器器的0x8000絕對地址。。7.8模模塊化程程序開發(fā)過過程圖7.4程程序開開發(fā)過程7.8.1混合編編程1.命名規(guī)規(guī)則表7.5函函數名名的轉換說明符號名轉換規(guī)則voidfunc(void)FUNC無參數傳遞或不含寄存器參數的函數名不作改變轉入目標文件中,名字只是簡單地轉換為大寫形式voidfunc(void)_FUNC帶寄存器參數的函數名加入“_”字符前綴,表明這類函數包含寄存器的參數傳遞voidfunc(void)reentrant_?FUNC對于重入函數加上“_?”字符串前綴,表明這類函數包含棧內的參數傳遞例2用匯編語言言編寫函數數"toupper",參數傳遞發(fā)發(fā)生在寄存存器R7中。UPPERSEGMENTCODE;;程序段PUBLIC_TOUPPER;;入口地址PSEGUPPER;;程序段_TOUPPER:MOVA,R7;;從R7中取參數CJNEA,#'a',$+3JCUPPERETCJNEA,#'z'+1,$+3JNCUPPERETCLRACC,5UPPERET:MOVR7,A;;返回值放在在R7中RET;返回到C2.參數傳傳遞規(guī)則表7.6參參數傳傳遞的寄存存器選擇參數類型charintlong,float一般指針第1個參數R7R6,R7R4~R7R1,R2,R3第2個參數R5R4,R5R4~R7R1,R2,R3第3個參數R3R2,R3無R1,R2,R3func1(inta)"a"是第一個參參數,在R6,R7中傳遞。func2(intb,intc,int*d)"b"是第一個參參數,在R6,R7中傳遞;"c"是第二個參參數,在R4,R5中傳遞;"d"是第三個參參數,在R1,R2,R3中傳遞。func3(longe,longf)"e"是第一個參參數,在R4~R7中傳遞;"f"是第二個參參數,不能能在寄存器器中傳遞,,只能在參參數傳遞段段中傳遞。。func4(floatg,charh)"g"是第一個參參數,在R4~R7中傳遞;"h"是第二個參參數,必須須在參數傳傳遞段中傳傳遞。表7.7函函數返返回值的寄寄存器返回值寄存器說明bitC進位標位(unsigned)charR7
(unsigned)intR6,R7高位字節(jié)在R6,低位字節(jié)在R7(unsigned)longR4~R7高位字節(jié)在R4,低位字節(jié)在R7floatR4~R732位IEEE格式,指數和符號位在R7指針R1,R2,R3R3放存儲器類型,高位在R2,低位在R1在匯編子程程序中,當當前選擇的的寄存器組組及寄存器器ACC、B、DPTR和PSW都可能改變變。當被C調用時,必必須無條件件地假設這這些寄存器器的內容已已被破壞。。如果已在在連接/定定位程序時時選擇了覆覆蓋,那么么每個匯編編子程序包包含一個單單獨的程序序段是必要要的,因為為在覆蓋過過程中,函函數間參量量通過子程程序各自的的段參量計計算。匯編編子程序的的數據區(qū)甚甚至可包含含在覆蓋部部分中,但但應注意下下面兩點::(1)所所有段名必必須以C51類似的方法法建立。(2)每每個有局部部變量的匯匯編程序必必須指定自自己的數據據段,這個個數據段只只能為其它它函數訪問問作參數傳傳遞用。所所有參數一一個接一個個被傳遞,,由其它函函數計算的的結果保存存入棧。7.8.2覆蓋蓋和共享1.覆蓋單片機片內內存儲空間間有限,連連接器/定定位器通常常重新啟用用程序不再再用的位置置。這就是是說,若一一個程序不不再調用,,也不由其其它程序調調用(甚至至間接調用用),那么么在其它程程序執(zhí)行完完之前,這這個程序不不再運行。。這個程序序的變量可可以放在與與其它程序序完全相同同的RAM空間,很像像可重用的的寄存器。。這種技術術就是覆蓋蓋。在匯編編中直接通通過手工完完成的這些些空間分配配,C語言中可以以由連接器器自動管理理。若有幾幾個不相關關聯(lián)的程序序時,它可可以使RAM單元比手工工考慮要用用的少。2.共享1)共享享變量類型匯編語言C語言動態(tài)變量
y(){intx;}靜態(tài)變量
staticintx;公用變量PUBLICXX:ds2Intx;外部變量EXTERNDATA(X)MOVDPTR,#Xexternintx;靜態(tài)子程序/函數Y:…staticy(){…};公共子程序/函數PUBLICYY:y(){…};外部子程序/函數EXTERNCODE(Y)LCALLYy()2)共享享函數/子子程序C中函數若是是全局的(公用的),可以放放在調用的的函數之后后。若函數數是模塊專專用的,它它可以定義義為靜態(tài)函函數,這樣樣它不能被被其它模塊塊調用。C語言的ANSI標準建議所所有函數在在主函數前前要有原型型(進行說說明),然然后實際函函數可在主主函數之后后或其它模模塊中。這這符合自頂頂向下編程程的概念。。匯編語言中中,子程序序使用標號號可在給定定模塊的任任何位置。。匯編器首首先掃描得得到所有的的符號名,,然后值就就可填入LCALL或LJMP。。一個模塊或或另一模塊塊共享子程程序,一個個使用PUBLIC而另一個使使用EXTERN。當指定為EXTERN,符號類型(CODE,,DATA,XDATA,IDATA,BIT或NUMBER)必須特別加加以指定,,以便連接接器可以確確定放在一一起的正確確類型。7.8.3庫和和連接器/定位器1.庫表7.9FranklinC51的編譯庫庫說明C51S.LIBSMALL模式,無浮點運算C51FPS.LIB浮點數學運算庫(SMALL模式)C51C.LIBCOMPACT模式,無浮點運算C51FPC.LIB浮點運算庫(COMPACT模式)C51L.LIBLARGE模式,無浮點運算C51FPL.LIB浮點運算庫(LARGE模式)2.連接器器/定位器器1)組合程序模模塊將幾個不同同程序模塊塊組合為一一個模塊,,并自動從從庫中挑選選模塊嵌入入目標文件件。輸入文文件按命令令行中出現(xiàn)現(xiàn)的順序處處理。通常常的程序模模塊是由C51編譯器或A51宏匯編生成成的可重入入的目標文文件。2)組合合段將具有相同同段名的可可重定位段段組合成單單一的段。。在一個程程序模塊中中定義的一一個段成為為部分段。。一個部分分段在源文文件中以下下列形式指指定:(1)名名字每每個重定位位段有一個個名字,它它可與來自自其它模塊塊的同名的的可重定位位段組合。。絕對段沒沒有名字。。(2)類類型類類型表明段段所屬的地地址空間CODE,,XDATA,DATA或BIT。(3)定定位方式可可重定位位段的定位位方式有PAGE,,INPAGE,INBLOCK,BITADDRESSABLE或UNIT。。INPAGE表明段必須須放入一頁頁(高8位位地址相同同)中以使使用短轉移移和調用指指令。INBLOCK段應使用ACALL,必須放在2048字字節(jié)塊中。。因為沒有有連接器可可以靈活地地判知調用用和轉移是是否在塊內內??芍囟ǘㄎ坏钠渌拗剖牵海翰荒艹^256字節(jié)節(jié);BITADDRESSABLE--必須放在可可位尋址的的內部RAM空間;UNIT--允許段從任任意字節(jié)開開始(對位位變量是位位)。(4)長長度一一個段的長長度。(5)基基址段段的首址。。對于絕對對段,地址址由匯編器器賦予,對對于可重定定位段,地地址由L51決定。在處處理程序模模塊時,L51自動產生段表表(MAP),該表包含了每每個段的類型型、基址、長長度、可重定定位性和名字字。L51自動將所具有有相同名字的的所有部分段段組合到單一一可重定位段段中。例如,,三個程序模模塊包含字段段VAR,在組合時,三三個段的長度度相加,從而而組合段的長長度也增加了了。對組合段段有下列規(guī)則則:①所有具有有相同名的部部分段必須有有相同類型(CODE,DATA,IDATA,,XDATA或BIT)。②組合段的長度度不能超過存存儲區(qū)的物理理長度。③每個組合合的部分段的的定位方法也也必須相同。。④絕對段相相互不組合,,它們被直接接拷貝到輸出出文件。3)存儲器器分配物理存儲區(qū)最大長度地址區(qū)段類型程序64KB0~0FFFFHCODE外部數據64KB0~0FFFFHXDATA直接尋址片內數據128字節(jié)0~7FHDATA間接尋址片內數據256字節(jié)0~0FFHIDATA片內數據的位空間128位0~7FHBIT表7.10MCS-51系列的物理存存儲區(qū)4)采用覆覆蓋技術使用用數據存儲器器通過采用一定定的覆蓋技術術,MCS-51系列少量的片片內數據存儲儲器可由L51有效地使用。。由C51編譯器或是A51匯編器生成的的參數和局部部變量(若使使用它們的函函數不相互調調用)可在存存儲器中覆蓋蓋。這樣,所所用的存儲器器得到相當程程度地減少。。為完成數據覆覆蓋,L51分析所有不同同函數間的調調用,使用該該信息可以確確定哪個數據據和位段可被被覆蓋。使用用控制參數OVERLAY和NOOVERLAY可允許或禁止止覆蓋。OVERLAY是默認值,用用它可產生非非常緊湊的數數據區(qū)。5)決定外外部參考地址址具有相同名的的外部符號(EXTERN)和公用符號(PUBLIC)被確定后,外外部符號指向向其它模塊中中的地址。一一個已聲明的的外部符號用用具有相同名名字的功用符符號確定,外外部參考地址址由其公共參參考地址確定定。這還與類類型(DATA,IDATA,,XDATA,CODE,BIT或NUMBER)有關,如果類類型不符或未未發(fā)現(xiàn)外部符符號參考地址址的公用符號號,則會產生生錯誤。公用用符號的絕對對地址在段定定位后決定。。6)絕對地地址計算定義絕對地址址并計算可重重定位段的地地址。在段分分配和外部公公用參考地址址處理完后,,程序模塊中中所有可重定定位地址和外外部地址要進進行計算,此此時生成的目目標文件中的的符號信息(DEBUG)被改變以反映映新的值。7)產生絕絕對目標文件件可執(zhí)行程序以以絕對目標格格式產生。該該絕對目標文文件可包含附附加的符號信信息(DEBUG),從而使符號調調試成為可能能。符號信息息可用參數NODEBUGSYMBOLS,NODEBUGPUBLICS和NODEBUGLINES禁止。輸出文文件是可執(zhí)行行的,并可由由仿真器裝入入調試或被OHS51翻譯為IntelHEX格式文件以供供EPROM固化。8)產生映映像文件產生一個反映映每個處理步步驟的映像文文件,它顯示示有關連接/定位過程的的信息和程序序符號,并包包含一個公用用和外部符號號的交叉參考考報告。映像像文件包含下下列信息:①文件名和和命令行參數數。②模塊的文文件名和模塊塊名。③一個包含含段地址、類類型、定位方方法和名字的的存儲器分配配表。該表可可在命令行中中用NOMAP參考禁止。④段和符號號的所有錯誤誤列表。列表表文件末尾顯顯示出所有出出錯的原因。。⑤一個包含含輸入文件中中符號信息的的符號表。該該信息由MODULES,SYMBOLS,,PUBLICS和LINES名組成,LINES是C編譯器產生的的行號。符號號信息可用參參數NOSYMBOLS,NOPUBLICS和NOLINES完全或部分禁禁止。⑥一個按字字母順序排列列的有關所有有PUBLIC和EXTERN符號的交叉參參考報告,其其中顯示出符符號類型和模模塊名。第一一個顯示的模模塊名是定義義了PUBLIC符號的模塊,,后面的模塊塊名是定義了了EXTERN符號的模塊。。在命令行輸輸入參數IXREF可產生此報告告。⑦在連接器器/定位器運運行期間檢測測到的錯誤同同時顯示在屏屏幕和文件尾尾部。7.8.4程程序優(yōu)化化以下選擇對提提高程序效率率有很大影響響:(1)盡量量選擇小存儲儲模式以避免免使用MOVX指令。(2)使用用大模式(COMPACT/LARGE)應仔細考慮要要放在內部數數據存儲器的的變量要求是是經常用的或或是用于中間間結果的。訪訪問內部數據據存儲器要比比訪問外部數數據存儲器快快得多。內部部RAM由寄存器組、、位數據區(qū)和和其它用戶用用“data”類型定義的變變量共享。由由于內部RAM容量的限制(128~256字節(jié),,由使用的單單片機決定),必須權衡衡利弊以解決決訪問效率和和這些對象的的數量之間的的矛盾。(3)要考考慮操作順序序,完成一件件事后再做一一件事。(4)注意意程序編寫細細則。例如,,若使用for(;;;)循環(huán),DJNZ指令比CJNE指令更有效,,可減少重復復循環(huán)次數。。(5)若編編譯器不能使使用左移和右右移完成乘除除法,應立即即修改,例如如,左移為乘乘2。(6)用邏邏輯AND/&取模比用MOD/%操作更有效。。(7)因計計算機基于二二進制,仔細細選擇數據存存儲器和數組組大小可節(jié)省省操作。(8)盡可可能使用最小小的數據類型型,MCS-51系列是8位機機,顯然對具具有"char"類型的對象的的操作比"int"或"long"類型的對象的的操作要方便便得多。(9)盡可可能使用"unsigned"數據類型。MCS-51系列CPU并不直接支持持有符號數的的運算。因而而C51編譯器必須產產生與之相關關的更多的程程序代碼以解解決這個問題題。(10)盡盡可能使用局局部函數變量量。編譯器總總是嘗試在寄寄存器里保持持局部變量。。這樣,將循循環(huán)變量(如如for和while循環(huán)中的計數數變量)說明明為局部變量量是最好的。。使用"unsignedchar/int"的對象通常能能獲得最好的的結果。7.9MCS-51內部資源使用用的C語言編程7.9.1中中斷應用用的C語言編程C51編譯器支持在在C源程序中直接接開發(fā)中斷程程序。中斷服服務程序是通通過按規(guī)定語語法格式定義義的一個函數數。中斷服務程序序的函數定義義的語法格式式如下:返回值函函數名([參參數])interruptm[usingn]{}…表7.11MCS-51中斷源編號編號中斷源入口地址0外部中斷00003H1定時器/計數器0000BH2外部中斷10013H3定時器/計數器1001BH4串行口中斷0023Husingn選項用于實現(xiàn)現(xiàn)工作寄存器器組的切換,,n是中斷服務子子程序中選用用的工作寄存存器組號(0~3)。在許多情情況下,響應應中斷時需保保護有關現(xiàn)場場信息,以便便中斷返回后后,能使中斷斷前的源程序序從斷點處繼繼續(xù)正確地執(zhí)執(zhí)行下去。這這在MCS-51單片機中,能能很方便地利利用工作寄存存器組的切換換來實現(xiàn)。即即在進入中斷斷服務程序前前的程序中使使用一組工作作寄存器,進進入中斷服務務程序后,由由"usingn"切換到另一組組寄存器,中中斷返回后又又恢復到原寄寄存器組。這這樣互相切換換的兩組寄存存器中的內容容彼此都沒有有被破壞。圖7.5擴擴展展多個個中斷斷源例3圖7.5所示是利用優(yōu)先權解碼芯片,在單片機8031的一個外部中斷INT1上擴展多個中斷源的原理電路圖。圖中是以開關閉合來模擬中斷請求信號。當有任一中斷源產生中斷請求,能給8031的INT1引腳送一個有效中斷信號,由P1的低3位可得對應中斷源的中斷號。在中斷斷服務務程序序中僅僅設置置標志志,并并保存存I/O口輸入入狀態(tài)態(tài)。FranklinC51編譯器器提供供定義義特定定MCS-51系列成成員的的寄存存器頭頭文件件。MCS-51頭文件件為reg51.h。C51程序如如下::#include<reg51.h>unsignedcharstatus;;bitflag;;voidservice_int1()interrupt2using2/*INT1中斷服服務程程序,,使用用第2組工工作作寄存存器*/{flag=1;;/*設置標標志*/status=p1;/*存輸入入口狀狀態(tài)*/}voidmain(void){IP=0x04;;/*置INT1為高優(yōu)優(yōu)先級級中斷斷*/IE=-0x84;;/*INT1開中斷斷,CPU開中斷斷*/for(;;;;){if(flag)/*有中斷斷*/{switch(status)/*根據中中斷源源分支支*/{case0::break;;/*處理IN0*/case1::break;;/*處理IN1*/case2::break;;/*處理IN2*/case3::break;;/*處理IN3*/default::;;}flag=0;;/*處理完完成清清標志志*/}}}7.9.2定定時時器/計數數器(T/C)應用的的C語言編編程例4設單片片機的的fosc=12MHz晶振,,要求求在P1.0腳上輸輸出周周期為為2ms的方波波。周期為為2ms的方波波要求求定時時時間間隔1ms,,每次時時間到到P1.0取反。。機器周周期=12/fosc=1μμs需計數數次數數=1000/(12/fosc)=1000/1=1000由于計計數器器是加加1計計數,,為得得到1000個個計數數之后后的定定時器器溢出出,必必須給給定時時器置置初值值為-1000(即即1000的補補數)。(1)用用定定時時器器0的的方方式式1編編程程,,采采用用查查詢詢方方式式,,程程序序如如下下::#include<reg51.h>sbitP1_0=P1^0;;voidmain(void){TMOD=0x01;;/*設置置定定時時器器1為為非非門門控控制制方方式式1*/TR0=1;;/*啟動動T/C0*/for(;;;;){TH0=-(1000/256);;/*裝載載計計數數器器初初值值*/TL0=-(1000%256);;do{}while(!TF0);;/*查詢詢等等待待TF0置位位*/P1_0=!P1_0;;/*定時時時時間間到到P1.0反相相*/TF0=0;;/*軟件件清清TF0*/}}(2)用用定定時時器器0的的方方式式1編編程程,,采采用用中中斷斷方方式式。。程程序序如如下下::#include<reg51.h>sbitP1_0=P1^0;;voidtime(void)interrupt1using1/*T/C0中斷斷服服務務程程序序入入口口*/{P1_0=!P1_0;;/*P1.0取反反*/TH0=-(1000/256);;/*重新新裝裝載載計計數數初初值值*/}voidmain(void){TMOD=0x01;;/*T/C0工作作在在定定時時器器非非門門控控制制方方式式1*/P1_0=0;;TH0=-(1000/256);;/*預置置計計數數初初值值*/TL0=-(1000%256);;EA=1;;/*CPU中斷斷開開放放*/ET0=1;;/*T/C0中斷斷開開放放*/TR0=1;;/*啟動動T/C0開始始定定時時*/do{}while(1);;/*等待待中中斷斷*/}例5采用用10MHz晶振振,,在在P1.0腳上上輸輸出出周周期期為為2.5s,,占空空比比20%的的脈脈沖沖信信號號。。10MHz晶振振,,使使用用定定時時器器最最大大定定時時幾幾十十毫毫秒秒。。取取10ms定時時,,周周期期2.5s需250次次中中斷斷,,占占空空比比20%,,高高電電平平應應為為50次次中中斷斷。。10ms定時,晶晶振fosc=10MHz。需定時器器計數次次數=10×103××10/12=8333#include<reg51.h>#defineucharunsignedcharucharperiod=250;ucharhigh=50;timer0()interrupt1using1/*T/C0中斷服務務程序*/{TH0=-8333/256;;/*重置計數數值*/TL0=-8333%256;;if(++time==high)P1=0;/*高電平時時間到變變低*/elseif(time==period)/*周期時間間到變高高*/{time=0;;P1=1;}}main(){TMOD=0x01;;/*定時器0方式1*/TH0=-8333/256;;/*預置計數數初值*/TL0=-8333%256;;EA=1;/*開CPU中斷*/ET0=1;;/*開T/C0中斷*/TR0=1;;/*啟動T/C0*/do{}while(1);;}圖7.6中中斷服務務程序流流程圖產生一個個占空比比變化脈脈沖信號號的程序序,它產產生的脈脈寬調制制信號用用于電機機變速控控制。#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintunchartime,status,percent,period;bitone_round;uintoldcount,target=500;voidpulse(void)interrupt1using1/*T/C0中斷服務務程序*/{TH0=-833/256;;/*1ms--10MHz*/TL0=-833%256;;ET0=1;;if(++time=percent)P1=0;;elseif(time==100){time=0;;P1=1;}}voidtachmeter(void)interrupt2using2/*外中斷1服務務程序*/{union{unitword;struct{ucharhi;ucharlo;}byte;;}newcount;newcount.byte.hi=TH1;newcount.byte.lo=TL1;period=newcount.word-oldcount;/*測得周期*/oldcount=newcount.word;;one_round=1;/*每轉一圈,引引起中斷,設設置標志*/}voidmain(void){IP=0x04;;/*置INT1為高位優(yōu)先級級*/TMOD=0x11;;/*T0,T116位方式*/TCON=0x54;;/*T0,T1運行,IT1邊沿觸發(fā)*/TH1=0;;TL1=0;/*設置初始計數數值*/IE=0x86;/*允許中斷EX1,ET0*/for(;;;){if(one_round)/*每轉一圈,調調整*/{if(period<target){if(percent<100)++percent;; /*占空比增*/}elseif(percent>0)--percent;/*占空比減*/one_round=0;}}}7.9.3串串行口使使用的C語言編程例6單片機fosc=11.0592MHz,波特率為9600,各設設置32字節(jié)節(jié)的隊列緩沖沖區(qū)用于發(fā)送送接收。設計計單片機和終終端或另一計計算機通信的的程序。單片機串行口口初始化成9600波特特,中斷程序序雙向處理字字符,程序雙雙向緩沖字符符。背景程序序可以"放入入"和"提取取"在緩沖區(qū)區(qū)的字符串,,而實際傳入入和傳出SBUF的動作由中斷斷完成。Loadmsg函數加載緩沖沖數組,標志志發(fā)送開始。。緩沖區(qū)分發(fā)發(fā)(t)和收(r)緩沖,緩沖區(qū)區(qū)通過兩種指指示(進in和出out)和一些標志(滿full,空empty,,完成done)管理。隊列緩緩沖區(qū)32字字節(jié)接收緩沖沖(r_buf)區(qū)滿,不能再再有字符插入入。當t_in=t_out,,發(fā)送緩沖區(qū)(t_buf)空,發(fā)送中斷斷清除,停止止UART請求。具體程程序如下:#include<reg51.h>#defineucharunsignedcharucharxdatar_buf[32];;/*item1*/ucharxdatat_buf[32];;ucharr_in,r_out,t_in,t_done;/*隊列指針*/bitr_full,t_empty,t_done;;/*item2*/codeucharm[]={"thisisatestprogram\r\n"};;serial()interrupt4using1/*item3*/{if(RI&&~r_full){r_buf[r_in]=SBUF;RI=0;;r_in=++r_in&ox1f;;if(r_in==r_out)r_full=1;}elseif(TI&&~t_empty){SBUF=t_buf[t_out];TI=0;t_out=++t_out&0x1f;if(t_out==t_in)t_empty=1;;}elseif(TI){TI=0;t_done=1;}}voidloadmsg(ucharcode*msg)/*item4*/{while((*msg!=0)&&((((t_in+1)^t_out)&0x1f)!=0))/*測試緩沖區(qū)滿滿*/{t_buf[t_in]=*msg;msg++;t_in=++t_in&0x1f;if(t_done){TI=1;t_empty=t_done=0;/*完成重新開始始*/}}}voidprocess(ucharch){return;}/*item5*//*用戶定義*/voidprocessmsg(void)/*item6*/{while(((r_out+1)^r_in)!=0)/*接收非緩沖區(qū)區(qū)*/{process(r_buf[r_out]);;r_out=++r_out&0x1f;}}main()/*item7*/{TMOD=0x20;/*定時器1方方式2*/TH1=0xfd;;/*9600波特11.0592MHz*/TCON=0x40;/*啟動定時器器1*/SCON=0x50;/*允許接收*/IE=0x90;;/*允許串行口口中斷*/t_empty=t_done=1;;r_full=0;r_out=t_in=0;r_in=1;;/*接收緩沖和和發(fā)送緩沖沖置空*/for(;;;){loadmsg(&m);;processmsg();}}item1:背景程序"放入"和和"提取"字符隊列列緩沖區(qū)。。item2:緩沖區(qū)狀態(tài)態(tài)標志。item3:串行口中斷斷服務程序序,從RI,TI判別接收或或發(fā)送中斷斷,由軟件件清除。判判別緩沖區(qū)區(qū)狀態(tài)(滿滿full,,空empty)和全部發(fā)送送完成(done)。item4:此函數把字字符串放入入發(fā)送緩沖沖區(qū),準備備發(fā)送。item5:接受字符的的處理程序序,實際應應用自定義義。item6:此函數逐一一處理接收收緩沖區(qū)的的字符。item7:主程序即背背景程序,,進行串行行口的初始始化,載入入字符串,,處理接收收的字符串串。7.10MCS-51片外擴展的的C語言編程7.10.18255與與8031接口C應用程序舉舉例例78255控控制打印機機。圖7.7是是8031擴展8255與打打印機接口口的電路。。8255的片選線線為P0.7,,打印機與8031采采用查詢方方式交換數數據。打印印機的狀態(tài)態(tài)信號輸入入給PC7,打印機忙時時BUSY=1,微型打印機機的數據輸輸入采用選選通控制,,當STB上負跳變時時數據被輸輸入。8255采用用方式0由由PC0模擬產生STB信號。按照接口電電路,口A地址為7CH,口C地址為7EH,命令口地址址為7FH,PC7~PC4輸入,PC3~PC0輸出。方式式選擇命令令字為8EH。圖7.78031擴展8255與與打印機接接口的電路路向打印機輸輸出字符串串"WELCOME"的程序如下下:#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineCOM8255XBYTE[0x007f]/*命令口地址址*/#definePA8255XBYTE[0x007c]/*口A地址*/#definePC8255XBYTE[0x007e]/*口C地址*/voidtoprn(uchar*p)/*打印字符串串函數*/{while(*p!='\0'){while((0x80&PC8255)!=0);;/*查詢等待打打印機的BUSY狀態(tài)*/PA8255=*p;;/*輸出字符*/COM8255=0x00;/*模擬STB脈沖*/COM8255=0x01;;p++;;}}voidmain(void){ucharidataprn[]="WELCOME";/*設測試用字字符串*/COM8255=0x8e;;/*輸出方式選選擇命令*/toprn(prn);/*打印字符串串*/}例8EPROM編程器。由8031擴展1片片EPROM2716、2片SRAM6116及1片8255構成成EPROM編程器,編編程對象是是EPROM2732。擴展編程系系統(tǒng)中2716用來來存放固化化用監(jiān)控程程序,用戶戶的待固化化程序放在在2片6116中。。8255的口A作編程器數數據口,口口B輸出2732的低8位地址,,PC3~PC0輸出2732高4位位地址,PC7作2732啟動保持持控制器與與PGM連接。譯碼地址為為:6116(1):0800H;6116(2):1000H~17FFH;8255的口A:07FCH;口B:07FDH;口C:07FEH;命令口:07FFH。8255的的口A、口B、口C均工作在方方式0輸出出,方式選選擇命令字字為80H;2732的啟動編程程和停止編編程,由PC7的復位/置置位控制,,當PC7=0時啟動編程程,PC7=1時,編程無無效。EPROM編程如下所所示,參數數為RAM起始地址、、EPROM起始地址和和編程字節(jié)節(jié)數。#include<absacc.h>#include<reg51.h>#defineCOM8255XBYTE[0x07ff]#definePA8255XBYTE[0x07fc]#definePB8255XBYTE[0x07fd]#definePC8255XBYTE[0x07fe]#defineucharunsignedchar#defineuintunsignedintvoidd1_ms(unitx);voidprogram(ram,eprom,con)ucharxdata*ram;/*RAM起始地址*/uinteprom,con;/*EPROM起始固化地地址,固化化長度*/{inti;COM8255=0x08;;/*送方式選擇擇命令字*/COM8255=0x0f;;/*PC7=1*/for(i=0;;i<con;;i++){PA8255=*ram;;/*固化化內內容容口口A鎖存存*/PB8255=eprom%256;;/*2732地址址低低8位位*/PC8255=eprom/256;;/*2732地址址高高4位位*/eprom++;;ram++;;COM8255=0x0e;;/*PC7=0*/d1_ms(50);;COM8255=0x0f;;/*PC7=1*/}}main(){program(0x1000,0x0000,0x0100);;}7.10.2MCS-51數據據采采集集的的C語言言編編程程例9ADC0809與8031接接口口的的數數據據采采集集程程序序舉舉例例。。圖7.8ADC0809與8031的的接接口口電電路路程序序如如下下::#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineIN0XBYTE[0x7ff8]/*設置置AD0809的通通道道0地地址址*/sbitad_busy=P3^3;;/*即EOC狀態(tài)態(tài)*/voidad0809(ucharidata*x)/*采樣樣結結果果放放指指針針中中的的A/D采集集函函數數*/{uchari;;ucharxdata*ad_adr;ad_adr=&IN0;;for(i=0;;i<8;;i++)/*處理理8通通道道*/{*ad_adr=0;;/*啟動動轉轉換換*/i=i;;/*延時時等等待待EOC變低低*/i=i;;while(ad_busy==0);;/*查詢詢等等待待轉轉換換結結束束*/x[i]=*ad_adr;/*存轉轉換換結結果果*/ad_adr++;;/*下一一通通道道*/}}voidmain(void){staticucharidataad[10];;ad0809(ad);;/*采樣樣AD0809通道道的的值值*/}例10AD574與8031接口口的數數據采采集程程序舉舉例。。圖7.9AD574與8031的接接口電電路源程序序如下下:#include<absacc.h>#inlucde<reg51.h>#defineuintunsignedint#defineADCOMXBYTE[0xff7c]/*使A0=0,R/C=0,CS=0*/#defineADLOXBYTE[0xff7f]/*使R/C=1,A0=1,CS=0*/#defineADHIXBYTE[0xff7d]/*使R/C=1,A0=0,CS=0*/sbitr=P3^7;sbitw=P3^6;sbitadbusy=P1^0;uintad574(void)/*A
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國自立袋拉鏈數據監(jiān)測研究報告
- 2025至2030年中國管殼熱交換器數據監(jiān)測研究報告
- 2025至2030年中國電梯開關鎖數據監(jiān)測研究報告
- 2025至2030年中國洗衣機安全防護罩數據監(jiān)測研究報告
- 2025至2030年中國無苯雙組份裝修鏡亮清漆數據監(jiān)測研究報告
- 2025至2030年中國聲紋識別器數據監(jiān)測研究報告
- 2025年中國不銹鋼刀口角尺市場調查研究報告
- 滑坡災害成災模式研究
- 二零二四年度新型工業(yè)用地租賃合同范本3篇
- 2025年度個人房屋交易房地產經紀服務合同范本2篇
- 五年級上冊寒假作業(yè)答案(人教版)
- 2025年山東浪潮集團限公司招聘25人高頻重點提升(共500題)附帶答案詳解
- 2024年財政部會計法律法規(guī)答題活動題目及答案一
- 2025年江西省港口集團招聘筆試參考題庫含答案解析
- (2024年)中國傳統(tǒng)文化介紹課件
- 液化氣安全檢查及整改方案
- 《冠心病》課件(完整版)
- 2024年云網安全應知應會考試題庫
- 公園保潔服務投標方案
- 光伏電站項目合作開發(fā)合同協(xié)議書三方版
- 禪密功筑基功法
評論
0/150
提交評論