版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
會計學(xué)1C的C語言程序設(shè)計基礎(chǔ)實(shí)用教學(xué)目的通過本章學(xué)習(xí),使學(xué)生:理解單片機(jī)上的C語言和普通C語言的區(qū)別熟悉C51種關(guān)于中斷函數(shù)和變量的存儲類型、存儲模式的特殊性掌握單片機(jī)實(shí)際應(yīng)用過程中,將原來匯編語言寫的源程序改寫成C的源程序,最后能到自己用C語言獨(dú)立完成實(shí)際任務(wù)的程序設(shè)計。第1頁/共85頁第5章 80C51的C語言程序設(shè)計基礎(chǔ)單片機(jī)設(shè)計語言有:機(jī)器語言匯編語言高級語言第2頁/共85頁機(jī)器語言特點(diǎn):單片機(jī)能直接識別面向機(jī)器的硬件不同廠家、不同系列的單片機(jī)其指令系統(tǒng)也不同;第3頁/共85頁匯編語言特點(diǎn):是一種用文字助記符來表示機(jī)器指令的符號語言最接近機(jī)器碼的一種語言優(yōu)點(diǎn):利于初學(xué)者掌握微機(jī)的硬件資源占用資源少、程序執(zhí)行效率高、容易優(yōu)化直接操作機(jī)器的硬件指令的執(zhí)行速度快缺點(diǎn):不易移植,可讀性不強(qiáng),不易于維護(hù)。第4頁/共85頁高級語言特點(diǎn):它兼顧了多種高級語言的特點(diǎn),并具備匯編語言的功能。有功能豐富的庫函數(shù)、運(yùn)算速度快、編譯效率高、有良好的可移植性,而且可以直接實(shí)現(xiàn)對系統(tǒng)硬件的控制。編譯器豐富典型的是美國Franklin軟件公司推出的FranklinC51就是專為MCS-51系列單片機(jī)設(shè)計的C編譯器。第5頁/共85頁第5章 80C51的C語言程序設(shè)計基礎(chǔ)5.1 C51程序設(shè)計的基礎(chǔ)知識FranklinC51編譯器是標(biāo)準(zhǔn)的FranklinC語言編譯器專門為MCS-51系列的單片機(jī)量身定做的一套精簡的編譯器,這就是通常所說的C51。它為C語言在嵌入式系統(tǒng)上的應(yīng)用,提供了一種用編程的方法和途徑。而這種簡化的C語言又完全符合C語言的ANSI標(biāo)準(zhǔn)。第6頁/共85頁5.1.1 C51的特點(diǎn)可以直接操作微機(jī)硬件程序可讀性好,易于維護(hù)編程效率高目標(biāo)代碼質(zhì)量高可移植性好模塊化的程序設(shè)計在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。開發(fā)工具齊全第7頁/共85頁5.1.2 C51中的標(biāo)識符和關(guān)鍵字1 標(biāo)識符標(biāo)識符是用來標(biāo)識源程序中某個對象的名字的,這些對象可以是語句、數(shù)據(jù)類型、函數(shù)、變量、常量、數(shù)組等等。標(biāo)識符由字符串,數(shù)字和下劃線等組成。2 關(guān)鍵字關(guān)鍵字則是編程語言保留的特殊標(biāo)識符,它們具有固定名稱和含義,在程序編寫中不允許標(biāo)識符與關(guān)鍵字相同。在KEILuVision2中的關(guān)鍵字除了有ANSIC標(biāo)準(zhǔn)的32個關(guān)鍵字外(見表5-1),根據(jù)51單片機(jī)的特點(diǎn),又?jǐn)U展了如表5-2所列舉的13個特殊關(guān)鍵字。其實(shí)在KEILuVision2的文本編輯器中編寫C程序,系統(tǒng)可以把保留字以不同顏色顯示,缺省顏色為天藍(lán)色。第8頁/共85頁標(biāo)識符建立和定義的時候,要注意以下四點(diǎn):標(biāo)識符的長度最長可以達(dá)到255個字符盡量要做到見名思義嚴(yán)格區(qū)分大小寫第一個字符必須是字母或下劃線第9頁/共85頁C51編譯器中能識別的擴(kuò)展關(guān)鍵字關(guān)鍵字用途說明bit位標(biāo)量聲明聲明一個位標(biāo)量或位類型的函數(shù)sbit位標(biāo)量聲明聲明一個可位尋址變量Sfr特殊功能寄存器聲明聲明一個8位的特殊功能寄存器Sfr16特殊功能寄存器聲明聲明一個16位的特殊功能寄存器data存儲器類型說明說明一個變量在直接尋址的內(nèi)部數(shù)據(jù)存儲器bdata存儲器類型說明說明一個變量在可位尋址的內(nèi)部數(shù)據(jù)存儲器idata存儲器類型說明間接尋址的內(nèi)部數(shù)據(jù)存儲器pdata存儲器類型說明分頁尋址的外部數(shù)據(jù)存儲器xdata存儲器類型說明說明一個變量在外部數(shù)據(jù)存儲器code存儲器類型說明程序存儲器interrupt中斷函數(shù)說明定義一個中斷函數(shù)reentrant再入函數(shù)說明定義一個再入函數(shù)using寄存器組定義定義80C51芯片的工作寄存器第10頁/共85頁5.2 C51中的數(shù)據(jù)類型char字符類型nt整型long長整型float浮點(diǎn)型指針型bit位標(biāo)量sfr特殊功能寄存器sfr1616位特殊功能寄存器sbit特殊功能位第11頁/共85頁5.2 C51中的數(shù)據(jù)類型數(shù)據(jù)類型名稱長度值域unsignedchar無符號字符單字節(jié)0~255signedchar有符號字符單字節(jié)-128~+127unsignedint無符號整型雙字節(jié)0~65535signedint有符號整型雙字節(jié)-32768~+32767unsignedlong無符號長整型四字節(jié)0~4294967295signedlong有符號長整型四字節(jié)-2147483648~+2147483647float浮點(diǎn)型四字節(jié)±1.175494E-38~±3.402823E+38*一般指針1~3字節(jié)對象的地址bit位型位0或1sfr8位特殊功能寄存器單字節(jié)0~255sfr1616位特殊功能寄存器雙字節(jié)0~65535sbit可編程的位位0或1第12頁/共85頁5.2.1、char字符類型長度:一個字節(jié)功能:定義處理字符數(shù)據(jù)的變量或常量分類:無符號字符類型unsignedchar有符號字符類型signedchar默認(rèn)值為signedchar類型注意:當(dāng)定義一個變量為字符數(shù)據(jù)類型時,在程序使用該變量不應(yīng)使它的值超過它的值域不能賦超出0~255第13頁/共85頁5.2.2 int整型長度:兩個字節(jié)功能:存放一個雙字節(jié)數(shù)據(jù)分類:符號整型signedint無符號整型unsignedint默認(rèn)值為signedint類型。第14頁/共85頁5.2.2 int整型(續(xù))范圍:signedint:-32768~+32767字節(jié)中最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負(fù)數(shù)unsignedint:范圍是0~65535。注意:如果C51的程序,出現(xiàn)延時或循環(huán)體次數(shù)的錯誤,都可能是因?yàn)樽址秃驼偷臄?shù)據(jù)類型運(yùn)用得不恰當(dāng),解決的辦法是可以把變量的類型由原來的字符型或整型換成另外一種。第15頁/共85頁關(guān)于整型和字符型,可以通過下面的程序繼續(xù)得以區(qū)分:main(){char i;//char和int這里的時間延時是不一樣的P1=0X55;while(1){P1=~P1;for(i=0;i<1000;i++);}}char類型下面的for語句執(zhí)行一次循環(huán)要3個機(jī)器周期int類型則要5個機(jī)器周期第16頁/共85頁5.2.3 long長整型長度:四個字節(jié)功能:存放一個四字節(jié)數(shù)據(jù)分類:有符號長整型signedlong無符號長整型unsignedlong默認(rèn)值為signedlong類型分為:signedint:-2147483648~+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負(fù)數(shù)unsignedlong:0~4294967295第17頁/共85頁5.2.4 float浮點(diǎn)型長度:四個字節(jié)依次存放數(shù)的符號(占用1位)階碼(占用8位)尾碼(占用23位)功能:存放一個4字節(jié)的數(shù)據(jù)第18頁/共85頁float浮點(diǎn)數(shù)據(jù)類型在內(nèi)存中具體的存放格式如下:字節(jié)地址+3+2+1+0浮點(diǎn)數(shù)內(nèi)容格式SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMS代表數(shù)的符號位“1”表示負(fù)“0”表示正E代表階碼占用8個位,E大于127,則將結(jié)果減127作為2的指數(shù),若小于127,則用127減結(jié)果然后作為2的指數(shù);M代表精度為23位的尾數(shù)第19頁/共85頁5.2.5 指針型長度:一般為1~3個字節(jié)特點(diǎn):指針型本身就是一個變量,在這個變量中存放的指向另一個數(shù)據(jù)的地址。這個指針變量要占據(jù)一定的內(nèi)存單元分類:一般指針(GenericPointer)存儲器指針(Memory_SpecificPointer)第20頁/共85頁1 一般指針特點(diǎn):一般指針的聲明和使用均與標(biāo)準(zhǔn)C相同,不過同時還可以說明指針的存儲類型一般指針本身用3個字節(jié)存放,分別存放:存儲器類型高位偏移低位偏移量例句:long*state;為一個指向long型整數(shù)的指針,而state本身則依存儲模式存放。第21頁/共85頁2 存儲器指針特點(diǎn):利用存儲類型的關(guān)鍵字指定存儲類型指針本身只需一個字節(jié)或2個字節(jié)存放偏移量例如:char data *str;str指向data區(qū)中char型數(shù)據(jù)int xdata*pow;pow指向外部RAM的int型整數(shù)。char *xdataptr;ptr為一個指向char數(shù)據(jù)的指針,而ptr本身放于外部RAM區(qū)。第22頁/共85頁5.2.6 bit位標(biāo)量長度:一個二進(jìn)制位范圍:只有兩個結(jié)果:不是“0”就是“1”功能:存儲一些單片機(jī)的中間位處理結(jié)果注意:bit位標(biāo)量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。第23頁/共85頁5.2.7 sfr特殊功能寄存器長度:一個字節(jié)范圍:是0~255功能:利用sfr可以訪問51單片機(jī)內(nèi)部的所有特殊功能寄存器第24頁/共85頁5.2.7 sfr特殊功能寄存器(續(xù))具體格式為:sfr 特殊功能寄存器名=特殊功能寄存器地址常數(shù);特點(diǎn):這種數(shù)據(jù)類型通常用在C51的頭文件中,用來定義特殊功能寄存器,這樣在C的源程序中,就可以直接引用這些特殊功能寄存器了。第25頁/共85頁表5-4 51系列單片機(jī)的特殊功能寄存器符號地址注釋*ACCE0H累加器*BF0H乘法寄存器*PSWD0H程序狀態(tài)字SP81H堆棧指針DPL82H數(shù)據(jù)存儲器指針低8位DPH83H數(shù)據(jù)存儲器指針高8位*IEA8H中斷允許控制器*IPD8H中斷優(yōu)先控制器*P080H端口0*P190H端口1*P2A0H端口2*P3B0H端口3PCON87H電源控制及波特率選擇*SCON98H串行口控制器SBUF99H串行數(shù)據(jù)緩沖器*TCON88H定時器控制TMOD89H定時器方式選擇TL08AH定時器0低8位TL18BH定時器1低8位TH08CH定時器0低8位TH18DH定時器1高8位第26頁/共85頁5.2.8 sfr1616位特殊功能寄存器長度:占用兩個內(nèi)存單元范圍:是0~65535功能:定義兩個字節(jié)長度的特殊功能寄存器具體格式為:sfr16 特殊功能寄存器名=特殊功能寄存器地址常數(shù);第27頁/共85頁5.2.9 sbit特殊功能位長度:一個二進(jìn)制位功能:訪問芯片內(nèi)部RAM中可尋址的空定義單片機(jī)某些I/O引腳,以完成對單片機(jī)的I/O控制例句:sbit key=P1^0;if(key)……便可對P1端口的P1.1引腳進(jìn)行直接操作第28頁/共85頁5.3 C51中的常量定義:常量是在程序執(zhí)行過程中其值不能改變的量。分類:整型常量浮點(diǎn)型常量字符串型常量位標(biāo)量第29頁/共85頁5.3.1 整型常量表示方法:八進(jìn)制用0開頭十六進(jìn)制則以0x開頭而默認(rèn)的格式是十進(jìn)制數(shù)在C51中不能直接處理二進(jìn)制常量。例句:十進(jìn)制數(shù)100,表示成十六進(jìn)制是0x64八進(jìn)制就應(yīng)該寫成0144第30頁/共85頁5.3.2 浮點(diǎn)型常量分類:十進(jìn)制基本型組成:數(shù)字小數(shù)點(diǎn)如0.888,3345.345,0.0等特點(diǎn):整數(shù)或小數(shù)部分為0,可以省略但必須有小數(shù)點(diǎn)。指數(shù)標(biāo)準(zhǔn)形式[±]數(shù)字[.數(shù)字]e[±]數(shù)字如125e3,7e9,-3.0e-3。第31頁/共85頁5.3.3 字符型常量特點(diǎn):單引號內(nèi)的字符不可以顯示的控制字符,可以在該字符前面加一個反斜杠“\”,組成專用轉(zhuǎn)義字符,進(jìn)而使之顯示,常用轉(zhuǎn)義字符表請看表5-5所示。例句:如‘a(chǎn)’,‘d’第32頁/共85頁表5-5常用轉(zhuǎn)義字符轉(zhuǎn)義字符含義ASCII碼(16/10進(jìn)制)\o空字符(NULL)00H/0\n換行符(LF)0AH/10\r回車符(CR)0DH/13\t水平制表符(HT)09H/9\b退格符(BS)08H/8\f換頁符(FF)0CH/12\'單引號27H/39\"雙引號22H/34\\反斜杠5CH/92第33頁/共85頁5.3.4 字符串型常量特點(diǎn):由雙引號內(nèi)的字符組成引號內(nèi)的沒有字符時,為空字符串在C中字符串常量是字符串常量"A"和字符常量'A'是不同的,前者在存儲時多占用兩個字節(jié)的空間,而后者只占用一個字節(jié)的空間。功能:做為字符類型數(shù)組來處理的,在存儲字符串時系統(tǒng)會在字符串尾部加上\o轉(zhuǎn)義字符,以作為該字符串的結(jié)束符。例句:如“test”,“OK”等,都屬于字符串類型的常量第34頁/共85頁5.3.5 位標(biāo)量取值:位標(biāo)量的值是一個二進(jìn)制數(shù)。定義的語法結(jié)構(gòu):bit 標(biāo)量名作用:是定義一個標(biāo)量,用來表示某個二進(jìn)制位的值例句:bit
flag//定義一個位標(biāo)量flag,作為程序中的一個標(biāo)志位第35頁/共85頁5.3.6 常量的定義常量的定義最常使用的方式有以下兩種:1、用宏定義語句#difineFalse0x0;//用預(yù)定義語句可以定義常量#difineTrue0x1;//這里定義False為0,True為1//在程序中用到False編譯時自動用0替換,同理True替換為1第36頁/共85頁5.3.6 常量的定義(續(xù))常量的定義最常使用的方式有以下兩種:2、用賦值語句unsignedintcodea=100;//這一句用code把a(bǔ)定義在程序存儲器中并賦值,因?yàn)槌绦虼鎯ζ髦蛔x的特性,所以a在程序執(zhí)行的過程中值始終都是100,不允許修改,這樣a也相當(dāng)于一個常量。constunsignedintc=100;//用const定義c為無符號int常量并賦值第37頁/共85頁5.4 C51中的變量及其存儲模式5.4.1 C51中的變量 定義:變量是在程序執(zhí)行過程中其值可以變化的量。特點(diǎn):變量的值可能因?yàn)槌绦驁?zhí)行不同的語句,而有不同的結(jié)果,也可能由硬件的動作狀態(tài)所制約要在程序中使用變量必須先用標(biāo)識符作為變量名,并指出所用的數(shù)據(jù)類型和存儲模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲空間。第38頁/共85頁定義一個變量的格式定義一個變量的格式如下:[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名表1、存儲種類有四種:自動(auto)外部(extern)靜態(tài)(static)寄存器(register)缺省類型為自動(auto)2、數(shù)據(jù)類型和我們在前面提到的名種數(shù)據(jù)類型的定義是一樣的。第39頁/共85頁5.4.2 C51中存儲器類型數(shù)據(jù)類型決定變量的空間大小存儲器類型決定變量的空間位置第40頁/共85頁5.4.2.1 存儲器類型KEILuVision2中給用戶提供了3大塊兒不同的存儲空間:程序存儲器空間片內(nèi)數(shù)據(jù)存儲器空間片外數(shù)據(jù)存儲器空間存儲類型的分類:CODEDATABDATAIDATAXDATA如圖5-1所示,給出了每塊兒存儲器空間上分布的相應(yīng)存儲器類型。第41頁/共85頁圖5-1 51單片機(jī)內(nèi)部存儲空間對應(yīng)的存儲類型第42頁/共85頁1、CODE存儲器類型變量位置:程序存儲器的整個64K字節(jié)范圍特點(diǎn):變量的值只能訪問和引用,不能修改如同匯編語言中以下兩天指令:MOVC A,@A+DPTRMOVC A,@A+PC第43頁/共85頁2、DATA存儲器類型變量位置:變量存儲在內(nèi)部低128字節(jié)RAM地址空間特點(diǎn):在這個區(qū)內(nèi),指令用一個或兩個周期來訪問數(shù)據(jù),是所有區(qū)內(nèi)訪問速度最快的一個使用比較頻繁的變量或局部變量存儲在DATA區(qū)中必須節(jié)省使用DATA區(qū)的空間,因?yàn)樗目臻g畢竟有限的。第44頁/共85頁3、BDATA存儲器類型變量位置:片內(nèi)數(shù)據(jù)存儲器從地址20H開始到2FH特點(diǎn):包括16個字節(jié),共128個可以尋址的位每一位都可單獨(dú)尋址第45頁/共85頁4、IDATA存儲器類型變量位置:片內(nèi)數(shù)據(jù)存儲器空間間接尋址區(qū)特點(diǎn):可以訪問全部內(nèi)部數(shù)據(jù)存儲器空間在IDATA區(qū)內(nèi)的變量,在匯編語言中只能通過間接尋址來訪問。在匯編語言中是通過R0和R1采用間接尋址,來訪問這個區(qū)的,R0和R1被作為指針,將要恢復(fù)或改變字節(jié)的地址放入R0或R1中。根據(jù)源操作數(shù)和目的操作數(shù)的不同,執(zhí)行指令需要一個或兩個周期。第46頁/共85頁5、XDATA存儲器類型變量位置:外部RAM一些I/O接口范圍:64K字節(jié)特點(diǎn):讀寫操作需要至少兩個處理周期使用DPTR、R0或R1匯編語言指令,都可以定義成屬于這個區(qū)域的變量第47頁/共85頁5.4.3 C51中存儲模式作用:決定了變量的默認(rèn)存儲類型C51提供了這3種存儲器模式來存儲變量:SMALLCOMPACTLARGE如果省略存儲器類型第48頁/共85頁1、SMALL存儲模式名稱:這是C51默認(rèn)的一種模式,也叫小模式特點(diǎn):C51把所有函數(shù)變量和局部數(shù)據(jù)段,以及所有參數(shù)傳遞,都放在內(nèi)部數(shù)據(jù)存儲器DATA區(qū)中數(shù)據(jù)訪問非??斓刂房臻g受限第49頁/共85頁2、COMPACT存儲模式名稱:又稱為壓縮的存儲模式特點(diǎn):所有的函數(shù)和程序變量和局部數(shù)據(jù)段定位在51單片機(jī)系統(tǒng)的外部數(shù)據(jù)存儲區(qū)外部數(shù)據(jù)存儲區(qū)分頁訪問,每頁256字節(jié),最多256頁如果不加說明的變量,將被分配在PDATA區(qū)中將擴(kuò)充能夠使用的RAM數(shù)量,對XDATA區(qū)以外的數(shù)據(jù)存儲仍然是很快的第50頁/共85頁3 LARGE存儲模式名稱:也叫大模式特點(diǎn):所有函數(shù)和過程的變量和局部數(shù)據(jù)段,都定位在51單片機(jī)系統(tǒng)的外部數(shù)據(jù)存儲器中容量最多可支持64KB要求使用DPTR數(shù)據(jù)指針訪問數(shù)據(jù)或定義成XDADA的存儲器類型。第51頁/共85頁關(guān)于存儲模式的設(shè)置,我們要注意以下點(diǎn):(1)如果用參數(shù)傳遞和分配再入函數(shù)的堆棧,應(yīng)盡量使用SMALL存儲模式(2)可以使用混合存儲模式第52頁/共85頁5.5 C51中的中斷函數(shù)C51中的函數(shù)聲明除了一般函數(shù)以外,還對標(biāo)準(zhǔn)的C作了擴(kuò)展,具體包括:中斷函數(shù)再入函數(shù)第53頁/共85頁5.5.1 一般函數(shù)組成:函數(shù)說明函數(shù)體一般結(jié)構(gòu)如下:[函數(shù)類型] 函數(shù)名(函數(shù)參數(shù)表)/*函數(shù)說明*/{ 說明語句部分;執(zhí)行語句部分;/*函數(shù)體部分*/}第54頁/共85頁5.5.1 一般函數(shù)(續(xù))其中:[...]表示可選項(xiàng)(即可以指定,也可以缺?。╊愋秃妥兞康臄?shù)據(jù)類型相同,表示函數(shù)的返回值。函數(shù)說明部分,由函數(shù)類型、函數(shù)名和函數(shù)參數(shù)表三部分組成,其中函數(shù)參數(shù)表的格式為:數(shù)據(jù)類型形參[,數(shù)據(jù)類型形參2……]在函數(shù)說明部分的下面、大括號(必須配對使用)內(nèi)的部分。函數(shù)體第55頁/共85頁函數(shù)體一般由說明語句和執(zhí)行體兩部分構(gòu)成:1、說明語句部分組成變量定義自定義類型定義自定義函數(shù)說明外部變量說明2、執(zhí)行體執(zhí)行體一般由若干條可執(zhí)行語句構(gòu)成。還可以強(qiáng)行指定函數(shù)的存儲模式,主要由small、compact及l(fā)arge來說明,例如:voidfun1(void)small{}第56頁/共85頁5.5.2 中斷函數(shù)中斷函數(shù)的功能:提高系統(tǒng)的運(yùn)行效率聲明格式:函數(shù)類型函數(shù)名(參數(shù)表)[interruptn] [usingn]其中關(guān)鍵字interrupt后面的n是中斷號,n的取值范圍是0~31。編譯器從8n+3處,正好是對應(yīng)中斷源的入口地址處,產(chǎn)生中斷向量,具體的中斷號n和中斷向量取決于不同的51系列單片機(jī)芯片。80C51的中斷源和中斷向量如表5-6所示。第57頁/共85頁表5-6常用的中斷源和中斷向量n中斷源中斷向量8n+30外部中斷源00003H1定時器T0中斷000BH2外部中斷源10013H3定時器T1中斷001BH4串行口中斷0023H第58頁/共85頁定義和使用中斷函數(shù),需要注意以下幾點(diǎn):1、為提高代碼的容錯能力和系統(tǒng)的抗干擾能力,通常把沒用到的中斷源,寫成下列形式的中斷函數(shù)。voide xtern0_ISR()interrupt0{}/*notused*/Voidtimer0_ISR()interrupt 1{}/*notused*/Voidextern1_ISR()interrupt 2{}/*notused*/void timer1_ISR()interrupt3{}/*notused*/void serial_ISR()interrupt 4{}/*notused*/第59頁/共85頁定義和使用中斷函數(shù),需要注意以下幾點(diǎn)(續(xù))2、中斷函數(shù)沒有返回值3、中斷函數(shù)不能進(jìn)行參數(shù)傳遞。4、中斷函數(shù)在任何情況下,都不能被其他任何函數(shù)直接調(diào)用。5、在中斷函數(shù)中可以調(diào)用其它非中斷函數(shù)。但要注意其它非中斷函數(shù)和中斷函數(shù)必須使用一個工作寄存器組。第60頁/共85頁5.5.3 再入函數(shù)定義:可以在函數(shù)體內(nèi)直接或間接調(diào)用其自身的一種函數(shù)。特點(diǎn):在一個一般的函數(shù)后面加個擴(kuò)展的關(guān)鍵字reentrant第61頁/共85頁可以用以下兩種方法解決函數(shù)重入:1、在相應(yīng)的函數(shù)前使用前述“#pragmadisable”聲明,即只允許主程序或中斷之一調(diào)用該函數(shù);2、將該函數(shù)說明為可再入的。如下:voidfunc(param...)reentrant;注意:通常中斷使用與主程序不同的工作寄存器組。另外,對可再入函數(shù),在相應(yīng)的函數(shù)前面加上開關(guān)“#pragmanoaregs”,以禁止編譯器使用絕對寄存器尋址,可生成不依賴于寄存器組的代碼。第62頁/共85頁5.6 C程序和匯編語言程序的結(jié)合結(jié)合原因:假設(shè)你要執(zhí)行的操作很難用C代碼來完成具體過程:KeilC51的某個項(xiàng)目文件,對應(yīng)的選項(xiàng)卡上,找到“GenerateAssemblerSRCFile”和“AssembleSRCFile”兩項(xiàng)檢查是否設(shè)為有效,若是有效的,則點(diǎn)擊使檢查框變成無效狀態(tài),這樣再次編譯這個項(xiàng)目文件,到此你已經(jīng)得到匯編函數(shù)的主體,修改函數(shù)里面的匯編代碼就得到你所需的匯編函數(shù)了第63頁/共85頁5.6 C程序和匯編語言程序的結(jié)合(續(xù))在C51源代碼中嵌入如下匯編代碼即可:#pragmaASM匯編語言的指令序列#pragmaENDASM注意這里的大小寫第64頁/共85頁5.7 典型設(shè)計要求的C語言實(shí)現(xiàn)方法這里我們用一個電子日歷的實(shí)際例子,來具體介紹怎樣用C51程序,完成實(shí)際任務(wù)的設(shè)計。例子中用四位數(shù)碼管顯示日歷中的月份和日期,分別由四片74LS164連接,受單片機(jī)的串行口控制。詳細(xì)電路原理圖,見圖5-2所示。第65頁/共85頁圖5-2 電子日歷電路原理圖第66頁/共85頁電子日歷源程序下面是用C語言寫的源程序:li()//判斷月份是否大于12月,如果大于再次從1月顯示void timer0() interrupt 1//定時器T0的中斷函數(shù)disp()//控制串行口輸出顯示的函數(shù)main()//系統(tǒng)的主函數(shù)第67頁/共85頁5.8 C51程序設(shè)計的幾點(diǎn)注意事項(xiàng)1 在軟件編程和調(diào)試時盡可能使用Small模式編譯2 在仿真前做好充分的準(zhǔn)備3 使用庫函數(shù)4 使用const5 使用static6 不要忽視編譯器的警告編譯器的給出的警告都是有的放矢,在沒有查清引起警告的真正原因之前,不要忽視它。7 代碼優(yōu)化第68頁/共85頁1、在軟件編程和調(diào)試時盡可能使用Small模式編譯對比起Large模式和Compact模式,Small模式能生成更為緊湊的代碼。在Small模式下,C51編譯器將沒有使用關(guān)鍵詞,如idata、pdata、xdata特殊聲明的變量通通放在data單元中。第69頁/共85頁2、在仿真前做好充分的準(zhǔn)備程序編完后,對代碼仔細(xì)逐行檢查對每個子函數(shù)進(jìn)行單獨(dú)測試如果代碼有修改,再次對代碼進(jìn)行檢查。有可能的話,進(jìn)行軟件仿真——KeilC的軟件仿真功能十分強(qiáng)大。第70頁/共85頁3、使用庫函數(shù)重用代碼,尤其是是標(biāo)準(zhǔn)庫的代碼,而不是手工編寫你自己的代碼。這樣更快、更容易也更安全。KeilC中提供了多個庫函數(shù),這些庫函數(shù)的用法在KeilC的幫助文件中有詳細(xì)的描述。第71頁/共85頁4、使用const意義:可以防止,無意中錯誤的賦值可以防止,在作為參數(shù),將指針傳遞給函數(shù)時,可能會修改了本不想改變的指針?biāo)赶驅(qū)ο蟮闹?。例如:const int num=7;num=9;/*可能得到編譯器的警告。*/第72頁/共85頁5、使用static意義:命名沖突的有用工具將不會和其他模塊,可能具有相同名稱的函數(shù)和變量,在模塊連接時,產(chǎn)生名稱沖突。將子程序中的變量使用static修飾時,表示這個變量在程序開始時分配內(nèi)存,在程序結(jié)束時釋放,它們在程序執(zhí)行期間保持它們的值。第73頁/共85頁6、不要忽視編譯器的警告編譯器的給出的警告都是有的放矢,在沒有查清引起警告的真正原因之前,不要忽視它。第74頁/共85頁7、代碼優(yōu)化具體可以從以下幾個方面考慮:采用短變量使用無符號類型避免使用浮點(diǎn)指針使用位變量用局部變量代替全局變量為變量分配內(nèi)部存儲區(qū)使用特定指針使用調(diào)令使用宏替代函數(shù)合理選擇存儲器類型。充分利用運(yùn)行庫第75頁/共85頁本章小結(jié)這章主要介紹了用C51編程的一些基礎(chǔ)知識C51關(guān)鍵字五種存儲類:DATA、BDATA、IDATA、XDATA和CODE三個存儲模式:SMALL、COMPACT和LARGE中斷函數(shù)具體格式是:函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表)[interruptn] [usingn]第76頁/共85頁本章習(xí)題5.1 、在C51中,有幾種存儲類型?分別是什么?有幾種存儲器類型?有什么作用?他們的名稱是什么?什么又是存儲模式?有何意義?可以分成哪些模式?5.2、51單片機(jī)對應(yīng)的五個中斷源它們的中斷函數(shù)因該怎樣定義?5.3、中斷函數(shù)可否定義成再入函數(shù)?第77頁/共85頁本章習(xí)題(續(xù)1)5.4 在定義函數(shù)的時候能否強(qiáng)行指定存儲模式,如果能應(yīng)怎樣把某個函數(shù)指定成壓縮的存儲模式?5.5 在匯編語言中MOV DPTR,#4000HMOVX @DPTR,A兩條語句想實(shí)現(xiàn)什么功能,如果用C語言語句編程也實(shí)現(xiàn)同樣的功能,應(yīng)如何編程?第78頁/共85頁本章習(xí)題(續(xù)2)5.6
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源綠色電力供應(yīng)合同
- 新能源電動車購車合同及保修免責(zé)條款
- 基金管理服務(wù)合同
- 智能硬件設(shè)備銷售與推廣合同
- 廣告設(shè)計發(fā)布合同
- 草牧場承包合同
- 物流行業(yè)貨物運(yùn)輸保險合同
- 城市綠化建設(shè)項(xiàng)目承包合同
- 2024年財務(wù)審計服務(wù)與戰(zhàn)略規(guī)劃合同
- 2024年體育賽事直播合同
- 納米技術(shù)增強(qiáng)早期疾病生物標(biāo)志物的檢測
- 產(chǎn)品銷量分析表折線圖excel模板
- 辦公設(shè)備(電腦、一體機(jī)、投影機(jī)等)采購 投標(biāo)方案(技術(shù)方案)
- 【真題】2023年南京市中考語文試卷(含答案解析)
- 功率模塊可靠性壽命評估與預(yù)測
- 案卷評查培訓(xùn)課件模板
- 湘教版七年級地理第一學(xué)期期末試卷分析
- 上海春季高考英語真題試題word精校版(含答案)
- “數(shù)”我精彩-“學(xué)”有特色-小學(xué)六年級數(shù)學(xué)寒假特色作業(yè)展示
- 牛津譯林版八年級上冊英語8A期末復(fù)習(xí)-閱讀理解(含答案)
- 普通高等新郎接親試卷(2022全國卷)
評論
0/150
提交評論