




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
ChapterFour單片機(jī)的C51編程語言目錄CONTENT4.1C51編程語言概述 4.2C51的標(biāo)識符和關(guān)鍵字 4.3C51的變量與數(shù)據(jù)類型 4.4C51語言的數(shù)組、指針與結(jié)構(gòu) 4.5C51的運(yùn)算符和表達(dá)式 4.6C51語言的程序結(jié)構(gòu) 4.7C51語言的函數(shù) 4.8中斷服務(wù)程序 4.9C51的預(yù)處理 4.10C51的庫函數(shù) 4.11使用C5I編譯器時(shí)的注意事項(xiàng) 4.1C51編程語言概述C語言是一種應(yīng)用廣泛的結(jié)構(gòu)化設(shè)計(jì)語言。單片機(jī)C51語言是由C語言繼承而來的,運(yùn)行于單片機(jī)平臺的編程語言。C51語言具有C語言的優(yōu)點(diǎn),便于學(xué)習(xí),可移植性好,同時(shí)具有匯編語言的硬件操作能力。C51己經(jīng)成為單片機(jī)的主流程序設(shè)計(jì)語言。C語言是單片機(jī)系統(tǒng)編程時(shí)的首選編程語言。用C語言來編寫目標(biāo)系統(tǒng)軟件,會大大縮短開發(fā)周期,且明顯地增加軟件的可讀性,便于改進(jìn)和移植?;?1系列單片機(jī)的C語言或C語言編譯器簡稱為C51語言或C51。C51語言編程與匯編語言編程相比的優(yōu)勢可讀性好、編程調(diào)試靈活方便生成的代碼編譯效率高完全模塊化可移植性好便于項(xiàng)目維護(hù)管理單片機(jī)C51與標(biāo)準(zhǔn)ANSlC編譯器的主要區(qū)別以Keil公司的KeilC51(以下簡稱C51)編譯器為例C51系列頭文件集中體現(xiàn)了各系列芯片的不同功能C51比ANSIC多一種“位”類型數(shù)據(jù)存儲類型有很大的區(qū)別函數(shù)的使用上,由于單片機(jī)系統(tǒng)的資源有限,它的編譯系統(tǒng)不允許太多的程序嵌套C51與標(biāo)準(zhǔn)ANSIC庫函數(shù),由于部分庫函數(shù)不適合單片機(jī)處理系統(tǒng),因此被排除在外,如字符屏幕和圖形函數(shù)。也有一些庫函數(shù)繼續(xù)使用,但這些庫函數(shù)是廠家針對硬件特點(diǎn)相應(yīng)開發(fā)的,它們與ANSIC的構(gòu)成及用法都有很大的區(qū)別,如printf和scanf。在ANSIC中這兩個(gè)函數(shù)通常用于屏幕打印和接收字符,而在C51中,它們則主要用于串行通信口數(shù)據(jù)的發(fā)送和接收。C51的開發(fā)過程設(shè)圖1-2系統(tǒng)要求是:當(dāng)S1閉合時(shí),報(bào)警燈亮;而S1打開時(shí),報(bào)警燈滅。用C51語言編寫實(shí)現(xiàn)該功能的程序,程序名為ex4-1.c:#include<reg51.h>//定義MCS-51的特殊功能寄存器SFRsbitP32=P3^2; //定義P3.2為P32sbitP20=P2^0; //定義P2.0為P20main(){ while(1){ P32=1; if(P32==0){ P20=1; }else{ P20=0; } }}例C51的開發(fā)過程在C51中,使用“/**/”和“//”符號進(jìn)行注釋。注釋不影響程序的功能,用于說明程序的用途、功能,增加程序的可讀性和可維護(hù)性。編譯后注釋不存在,不影響運(yùn)行文件的大小。優(yōu)秀的程序設(shè)計(jì)人員要養(yǎng)成良好的注釋習(xí)慣,一般在程序的開始要寫注釋,表明程序的要求、功能,編寫人員,編寫日期,版本號等信息。使用KEILC集成的編輯系統(tǒng)書寫程序。使用KEILC的C51編譯器和連接軟件(用KEILC集成開發(fā)工具uVision中的Buildtarget批處理),生成可以寫入單片機(jī)的目標(biāo)文件,通常為HEX文件(ex4-1.hex)用程序燒錄器將該文件寫入單片機(jī),單片機(jī)上電即可運(yùn)行。同時(shí)Buildtarget還生成許多中間文件,用于程序的調(diào)試?yán)纾瑥膃x4-1.lst文件中可以看見C程序編譯后生成的匯編程序,由此可以理解單片機(jī)硬件具體的執(zhí)行過程,還可以對C程序編程的效率進(jìn)行了解。ex4-1.lst文件0000?C0001:0000 D2B2SETBP320002 20B204JBP32,?C00030005 D2A0SETBP200007 80F7SJMP?C00010009?C0003:0009 C2A0CLRP20000B 80F3SJMP?C0001可以看出,C編譯器編譯的結(jié)果與我們大多人用匯編語言的編程結(jié)果相同,但是C51語言的可讀性更好,特別是當(dāng)程序更加復(fù)雜時(shí),C51語言有明顯的優(yōu)勢。4.2C51的標(biāo)識符和關(guān)鍵字標(biāo)識符用來標(biāo)識源程序中某個(gè)對象的名字,這些對象可以是語句、數(shù)據(jù)類型、函數(shù)、變量、數(shù)組等。C語言是區(qū)分大小寫的一種高級語言。標(biāo)識符由字符串、數(shù)字和下劃線等組成,第一個(gè)字符必須是字母或下劃線錯(cuò)誤的標(biāo)識符,編譯時(shí)會有錯(cuò)誤提示。C51中有些庫函數(shù)的標(biāo)識符是以下劃線開頭的,所以一般不要以下劃線開頭命名標(biāo)識符。表4-1ANSIC標(biāo)準(zhǔn)關(guān)鍵字關(guān)鍵字用途說明auto存儲種類說明用于聲明局部變量,為默認(rèn)值break程序語句退出最內(nèi)層循環(huán)體case程序語句switch語句中的選擇項(xiàng)char數(shù)據(jù)類型聲明單字節(jié)整型數(shù)或字符型數(shù)據(jù)const存儲種類說明在程序執(zhí)行過程中不可修改的值continue程序語句轉(zhuǎn)向下一次循環(huán)default程序語句switch語句中缺省選擇項(xiàng)do程序語句構(gòu)成do…while循環(huán)結(jié)構(gòu)double數(shù)據(jù)類型聲明雙精度浮點(diǎn)數(shù)else程序語句構(gòu)成if…else條件結(jié)構(gòu)enum數(shù)據(jù)類型聲明枚舉類型數(shù)據(jù)extern存儲種類說明在其他程序模塊中聲明了的全局變量float數(shù)據(jù)類型聲明單精度浮點(diǎn)數(shù)for程序語句構(gòu)成for循環(huán)結(jié)構(gòu)goto程序語句構(gòu)成goto循環(huán)結(jié)構(gòu)if程序語句構(gòu)成if…else條件結(jié)構(gòu)int數(shù)據(jù)類型聲明整型數(shù)long數(shù)據(jù)類型聲明長整型數(shù)register存儲種類說明使用CPU內(nèi)部寄存器變量return程序語句函數(shù)返回short數(shù)據(jù)類型聲明短整型signed數(shù)據(jù)類型聲明有符號整型數(shù)sizeof運(yùn)算符計(jì)算表達(dá)式或數(shù)據(jù)類型的字節(jié)數(shù)static存儲種類說明靜態(tài)變量struct數(shù)據(jù)類型聲明結(jié)構(gòu)體類型數(shù)據(jù)switch程序語句構(gòu)成switch選擇結(jié)構(gòu)typedef數(shù)據(jù)類型聲明重新進(jìn)行數(shù)據(jù)類型定義union數(shù)據(jù)類型聲明聯(lián)合類型數(shù)據(jù)unsigned數(shù)據(jù)類型聲明無符號數(shù)據(jù)void數(shù)據(jù)類型聲明無類型數(shù)據(jù)或函數(shù)volatile數(shù)據(jù)類型聲明聲明該變量在程序執(zhí)行中可被隱含地改變while程序語句構(gòu)成while和do…while循環(huán)結(jié)構(gòu)表4-2C51編譯器擴(kuò)充關(guān)鍵字關(guān)鍵字用途說明_at_地址定位為變量進(jìn)行絕對地址定位_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX51或RTX51Tiny的任務(wù)優(yōu)先級_task_任務(wù)聲明定義實(shí)時(shí)多任務(wù)函數(shù)alien函數(shù)特性聲明用于聲明與PL/M51兼容的函數(shù)bdata存儲器類型聲明可位尋址的MCS-51內(nèi)部數(shù)據(jù)存儲器bit位變量聲明聲明一個(gè)位變量或位類型函數(shù)code存儲器類型聲明MCS-51的程序存儲空間compact存儲器模式按compact模式分配變量的存儲空間data存儲器類型聲明直接尋址MCS-51的內(nèi)部數(shù)據(jù)寄存器idata存儲器類型聲明間接尋址MCS-51的內(nèi)部數(shù)據(jù)寄存器interrupt中斷函數(shù)聲明定義一個(gè)中斷服務(wù)函數(shù)large存儲器模式按large模式分配變量的存儲空間pdata存儲器類型聲明分頁尋址的MCS-5外部數(shù)據(jù)空間sbit位變量聲明聲明一個(gè)位變量sfr特殊功能寄存器聲明聲明一個(gè)8位特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個(gè)16位特殊功能寄存器small存儲器模式按small模式分配變量的存儲空間using寄存器組定義定義MCS-5的工作寄存器組xdata存儲器類型聲明定義MCS-5外部數(shù)據(jù)空間4.3C51的變量與數(shù)據(jù)類型常量又稱為標(biāo)量,它的值在程序執(zhí)行過程中不能改變,常量的數(shù)據(jù)類型有整型、浮點(diǎn)型字符型和字符串型等。實(shí)際使用中用#define定義在程序中經(jīng)常用到的常量,或者可能需要根據(jù)不同的情況進(jìn)行更改的常量,例如譯碼地址。而不是在程序中直接使用常量值。這樣一方面有助于提高程序的可讀性,另一方面也便于程序的修改和維護(hù)。常量4.3C51的變量與數(shù)據(jù)類型#definePI3.14 //以后的編程中用PI代替浮點(diǎn)數(shù)常量3.14,便于閱讀#defineSYSCLK12000000//長整型常量用SYSCLK代替12MHz時(shí)鐘#defineTRUE1 //用字符TRUE,在邏輯運(yùn)算中代替1#defineSTAR‘*’ //用STAR表示字符“*”#defineuintunsignedint//用uint代替unsignedint,簡化編輯常量例如語句if(key==TRUE){}if(key==1){}常量1)整型常量。整型常量值:可用十進(jìn)制表示,如128,-35等;也可以用十六進(jìn)制表示,如0x1000。2)浮點(diǎn)型常量。如0.12、-10.3等。3)字符型常量。字符型常量是用單引號括起來的一個(gè)字符,如‘A’、‘0’、‘=’等,編譯程序?qū)堰@些字符型常量轉(zhuǎn)換為ASCII碼,例如‘A’等于0x41。對于不可顯示的控制字符,可直接寫出字符的ASCII碼,或者在字符前加上反斜杠“\”組成轉(zhuǎn)義符。轉(zhuǎn)義符可以完成一些特殊功能和格式控制。4)字符串型常量。字符串型常量用一對雙引號括起一串字符來表示,如“Hello”、“OK”等。字符串型常量由雙引號作為界限符。當(dāng)字符串中需要出現(xiàn)雙引號時(shí),需使用轉(zhuǎn)義字符“\”來表示。表4-3常用的轉(zhuǎn)義符轉(zhuǎn)義字符含義ASCII碼16進(jìn)制(10進(jìn)制)\0空字符(NULL)0x00\n換行符(LF)0x0A\r回車符(CR)0x0D\t水平制表符(HT)0x09\’單引號0x27\”雙引號0x22\\反斜杠0x5C4.3C51的變量與數(shù)據(jù)類型變量是一種在程序執(zhí)行過程中,其數(shù)值不斷變化的量。C51規(guī)定變量必須先定義后使用。C51的變量主要有表4-4中的各種數(shù)據(jù)類型,而sfr、sfr16、sbit三種數(shù)據(jù)類型用于對MCS-51單片機(jī)的特殊功能寄存器(SFR)的操作,不是我們傳統(tǒng)意義上的變量。變量4.3C51的變量與數(shù)據(jù)類型C51對變量定義的格式如下:[存儲種類][數(shù)據(jù)類型]
[存儲器類型][變量名表]
變量#defineuintunsignedintinti,j,k;
//定義三個(gè)整型變量i,j,kunsignedintsi,sk;//定義無符號整型變量 uintsi,sk;//定義無符號整型變量si,skbitmy_bit;//定義位變量my_bit存儲種類變量的存儲種類反映了變量的作用范圍和壽命,將影響到編譯器對變量在RAM中位置的安排。C51有四種存儲種類:auto(自動)extern(外部)static(靜態(tài))register(寄存器)(如果不聲明變量的存儲種類,則該變量將為auto變量)與PC機(jī)的C編程相比,C51的存儲類型復(fù)雜很多,這是由于MCS-51單片機(jī)存儲器類型的多樣性決定的??梢酝ㄟ^存儲器類型的定義,將變量安排在不同的存儲區(qū)域。存儲種類和存儲器類型是可選項(xiàng)。如果沒有定義變量的存儲種類或存儲器類型,C51編譯器將根據(jù)變量定義的位置以及存儲器模式,由C51編譯器分配變量的在RAM中的位置(地址)。存儲種類數(shù)據(jù)類型決定變量的類型以及在存儲器中的長度,變量名表中各個(gè)變量用逗號隔開。例如:inti,j,k; //定義三個(gè)整型變量i,j,kunsignedintsi,sk; //定義無符號整型變量si,skbitmy_bit; //定義位變量my_bit數(shù)據(jù)類型C51具有ANSIC的所有標(biāo)準(zhǔn)數(shù)據(jù)類型,包括:char、int、short、long、float和double,對KeilC的C51編譯器來說,short類型和int類型相同,double類型和float類型相同。除此之外,為了更加有利地利用MCS-51的結(jié)構(gòu),C51還增加了一些特殊的數(shù)據(jù)類型,包括bit、sfr、sfr16、sbit。數(shù)據(jù)類型局部變量和全局變量1)局部變量:局部變量也稱為內(nèi)部變量,是指在函數(shù)內(nèi)部或以花括號“{}”括起來的功能模塊內(nèi)部定義的變量。局部變量只在定義它的函數(shù)或功能模塊內(nèi)有效,在該函數(shù)或功能模塊以外不能使用。在C51語言中局部變量必須定義在函數(shù)或功能模塊的開頭。2)全局變量。全局變量也稱為外部變量,是指在程序開始處或各個(gè)功能函數(shù)的外面定義的變量。在程序開始處定義的全局變量對于整個(gè)程序都有效,可供程序中所有的函數(shù)共同使用;而在各功能函數(shù)外面定義的全局變量只對全局變量定義語句后定義的函數(shù)有效,在全局變量定義之前定義的函數(shù)不能使用該變量。一般在程序開始處定義全局變量。根據(jù)變量作用域的不同,變量可分為:全局變量的缺點(diǎn)全局變量由C編譯器在動態(tài)區(qū)外的固定存儲區(qū)域中存儲,它在整個(gè)程序執(zhí)行期間均占用存儲空間,這將增大程序執(zhí)行時(shí)所占的內(nèi)存。全局變量是外部定義的,這將破壞函數(shù)的模塊化結(jié)構(gòu),不利于函數(shù)的移植。由于多個(gè)模塊均可對全局變量進(jìn)行修改,處理不當(dāng)時(shí)可能導(dǎo)致程序錯(cuò)誤,且難以調(diào)試。因此應(yīng)避免使用不必要的全局變量。有時(shí)函數(shù)需要引用一個(gè)在其后面定義的變量或在另一個(gè)程序文件中定義的變量,可使用exten關(guān)鍵字進(jìn)行外部變量聲明。外部變量聲明不同于外部變量定義,外部變量只定義一次,而可以多次使用外部變量聲明。表4-4C51變量的數(shù)據(jù)類型數(shù)據(jù)類型長度/bit長度/Byte值域unsignedchar810~255signedchar或char81-128~+127unsignedint1620~65535signedint162-32768~+32767unsignedlong3240~4294967295signedlong324-2147483648~+2147483647float324-1.175494E-38~+3.402823E+38*指針1~3bit10或1char字符類型char類型的長度是8位,1字節(jié)(簡稱1B);通常用于定義處理字符數(shù)據(jù)的變量或常量;分無符號字符類型unsignedchar和有符號字符類型signedchar;unsignedchar常用于處理ASCII字符或用于處理小于或等于255的整型數(shù);unsignedchar表示的數(shù)值范圍是0~255(0x00~0xFF)。01int整型int整型長度為16位,2字節(jié)(2B),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。分有符號int整型數(shù)signedint和無符號int整型數(shù)unsignedint,默認(rèn)值為signedint類型;signedint表示的數(shù)值范圍是-32768~+32767,字節(jié)中最高位表示數(shù)據(jù)的符號,0表示正數(shù),1表示負(fù)數(shù);unsignedint表示的數(shù)值范圍是0~65535(0x0000~0xFFFF)。02long長整型long長整型長度為32位,4字節(jié)(4B),用于存放一個(gè)4B數(shù)據(jù)。分有符號long長整型signedlong和無符號long長整型unsignedlong,默認(rèn)值為signedlong類型。signedint表示的數(shù)值范圍是-2147483648~+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號,0表示正數(shù),1表示負(fù)數(shù)。unsignedlong表示的數(shù)值范圍是0~4294967295(0x00000000~0xFFFFFFFF)。03float浮點(diǎn)型float浮點(diǎn)型在十進(jìn)制中具有7位有效數(shù)字,是符合IEEE-754標(biāo)準(zhǔn)(32)的單精度浮點(diǎn)型數(shù)據(jù),占用4B。具有24位精度。04*指針型指針型本身就是一個(gè)變量,在這個(gè)變量中存放的指向另一個(gè)數(shù)據(jù)的地址。這個(gè)指針變量要占據(jù)一定的內(nèi)存單元,對不同的處理器長度也不盡相同,在C51中它的長度一般為1~3個(gè)字節(jié)。05bit類型bit類型存放邏輯變量,占用一個(gè)位地址。C51編譯器將把bit類型的變量安排在單片機(jī)片內(nèi)RAM的位尋址區(qū)。06定義變量時(shí),根據(jù)51單片機(jī)存儲器的特點(diǎn),必須指明該變量所處的單片機(jī)的內(nèi)存空間。C5l編譯器支持MCS-51單片機(jī)的硬件結(jié)構(gòu),可完全訪問MCS-51硬件系統(tǒng)的所有部分。編譯器通過將變量或者常量定義成不同的存儲類型(data,bdata,idata,pdata,xdata,code)的方法,將它們定位在不同的存儲區(qū)中。存儲器類型表4-5存儲類型與存儲空間的對應(yīng)關(guān)系存儲類型與存儲空間的對應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲區(qū),訪問速度快(128字節(jié))data可位尋址片內(nèi)數(shù)據(jù)存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié))idata間接尋址片內(nèi)數(shù)據(jù)存儲區(qū),可訪問片內(nèi)全部RAM地址空間(256字節(jié))pdata分頁尋址片外數(shù)據(jù)存儲區(qū)(256字節(jié)),由MOVX@R0訪問xdata片外數(shù)據(jù)存儲區(qū)(64KB),由MOVX@DPTR訪問code代碼存儲區(qū)(64KB),由MOVC@DPTR訪問data區(qū)當(dāng)使用存儲類型data,bdata定義變量時(shí),C5l編譯器會將它們定位在片內(nèi)數(shù)據(jù)存儲區(qū)中(片內(nèi)RAM)。這個(gè)存儲區(qū)的長度為128字節(jié)。能快速存取各種數(shù)據(jù)。片內(nèi)數(shù)據(jù)存儲區(qū)是存放臨時(shí)性傳遞變量或使用頻率較高的變量的理想場所,所以應(yīng)該把使用頻率高的變量放在data區(qū),由于空間有限,必須注意使用data區(qū),data區(qū)除了包含程序變量外,還包含了堆棧和寄存器組data區(qū)。下面是在data區(qū)中聲明變量的例子:unsignedchardatasystem_status=0;unsignedintdataunit_id[2];chardatainp_string[16];floatdataoutp_value;mytypedatanew_var;在SMALL存儲模式下,未說明存儲器類型時(shí),變量默認(rèn)被定位在data區(qū)。01bdata區(qū)當(dāng)在data區(qū)的位尋址bdata區(qū)定義變量,這個(gè)變量就可進(jìn)行位尋址,并且聲明位變量。charbdatavar8bit; //在位尋址區(qū),定義字符型的變量02聲明的變量var8bit可以進(jìn)行位操作運(yùn)算,可以用sbit在bdata定義變量的基礎(chǔ)上聲明新的變量,sbitmy_bit2=var8bit^2;//位變量my_bit2位于變量var8bit的第2位下面是一些在bdata區(qū)中聲明變量和使用位變量的例子。unsignedcharbdatastatus_byte;編譯器不允許在bdata區(qū)中定義float和double類型的變量。idata區(qū)idata區(qū)也可以存放使用比較頻繁的變量,使用寄存器作為指針進(jìn)行尋址。在寄存器中設(shè)置8位地址進(jìn)行間接尋址,與外部存儲器尋址比較,它的指令執(zhí)行周期和代碼長度都比較短。對于AT89C52單片機(jī)中定義的idata變量,如果低128B的RAM容量不夠時(shí),C51編譯器會自動安排到高128B的區(qū)域。下面是一些在idata區(qū)中聲明變量的例子。unsignedcharidatasystem_status=0;unsignedintidataunit_id[2];charidatainp_string[16];floatidataoutp_value;03pdata和xdata區(qū)pdata和xdata用于單片機(jī)的片外RAM區(qū),在這兩個(gè)區(qū)聲明變量和在其他區(qū)的語法是一樣的,pdata區(qū)只有256B,而xdata區(qū)可達(dá)65536B。舉例:unsignedcharxdatasystem_status=0;unsignedintpdataunit_id[2];charxdatainp_string[16];floatpdataoutp_value;對pdata和xdata的操作是相似的,對pdata和xdata的尋址要使用MOVX指令,需要2個(gè)處理周期。對pdata區(qū)尋址需要裝入8位地址,使用Ri的間接尋址方式;而對xdata區(qū)尋址則需要裝入16位地址,使用DPTR的間接尋址方式;04code區(qū)code區(qū)即MCS-51單片機(jī)的程序代碼區(qū),所以代碼區(qū)的數(shù)據(jù)是不可改變的,讀取code區(qū)存放的數(shù)據(jù)相當(dāng)于用匯編語言的MOVC尋址。一般代碼區(qū)中可存放數(shù)據(jù)表,跳轉(zhuǎn)向量和狀態(tài)表,對code區(qū)的訪問和對xdata區(qū)的訪問的時(shí)間是一樣的,代碼區(qū)中的對象在編譯時(shí)初始化。下面是代碼區(qū)的聲明例子:unsignedintcodeunit_id[2]={0x1234,0x89ab};unsignedcharcodeuchar_data[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15};05儲存模式存儲器類型舉例在不同存儲器類型下等價(jià)于下面的變量聲明:unsignedchardatavar1;
/*SMALL模式,var1被定位在data區(qū)*/
/*即片內(nèi)直接尋址RAM*/unsignedcharpdatavar1;
/*COMPACT模式,var1被定位在
pdata區(qū),即片外按頁面間接尋址RAM*/unsignedcharxdatavar1;
/*LARGE模式,var1被定位在xdata區(qū)*/
/*即片外間接尋址RAM*/為了提高系統(tǒng)運(yùn)行速度,建議在編寫源程序時(shí),把存儲模式設(shè)定為SMALL,必要時(shí)在程序中把xdata、pdata和idata等類型變量進(jìn)行專門聲明。C51語言中的特殊數(shù)據(jù)類型由于單片機(jī)特殊的結(jié)構(gòu),為編程的需要,C51語言擴(kuò)展了ANSIC的數(shù)據(jù)類型。這些數(shù)據(jù)類型與單片機(jī)的結(jié)構(gòu)以及存儲區(qū)域相關(guān)。一般在頭文件中用數(shù)據(jù)類型SFR、SBIT等定義單片機(jī)的特殊功能寄存器(片內(nèi)RAM高128字節(jié)的SFR)。例如:由KEIL軟件提供的頭文件“regx51.h”定義了51單片機(jī)的特殊功能寄存器名稱和可位尋址的位名稱。8位的特殊功能寄存器sfrC51使用sfr對MCS-51中的特殊功能寄存器進(jìn)行定義,這種定義方法與標(biāo)準(zhǔn)C語言不兼容,只適用于對MCS-51系列單片機(jī)進(jìn)行C編程??梢园裺fr認(rèn)為是一種擴(kuò)充數(shù)據(jù)類型,占用一個(gè)內(nèi)存單元,值域?yàn)?x80~0xFF。定義方法是引人關(guān)鍵字sfr,語法如下:sfr變量名=SFR中的地址注意:sfr后面必須跟一個(gè)特殊寄存器名,“=”后面的地址必須是常數(shù),不允許帶有運(yùn)算符的表達(dá)式。sfrP0=0x80sfrP1=0x90
01
16位的特殊功能寄存器sfr16sfr16用于定義存在于MCS-51單片機(jī)內(nèi)部RAM的16位特殊功能寄存器。當(dāng)SFR的高端地址直接位于其低端地址之后時(shí),對SFRl6位值可以進(jìn)行直接訪問。例如AT89C52的定時(shí)器2就是這種情況。為了有效地訪問這類SFR,可使用關(guān)鍵宇“sfrl6”。16位SFR定義的語法與8位SFR相同,16位SFR的低端地址必須作為“sfrl6”的定義地址。sfr16T2=0xCDCC//定義定時(shí)器2為T2:TL2為0CCH,TH2為0CDH //等價(jià)于,對TL2和TH2分別定義。sfrTL2=0xCC;sfrTH2=0xCD;02位變量bit位變量可以用來定義變量、函數(shù)返回值的類型,用bit關(guān)鍵字來定義。位變量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,它的值是一個(gè)二進(jìn)制位,不是0,就是1,類似一些高級語言中布爾(Boolean)變量的True和False。利用bit可定義一個(gè)位變量,但不能定義位指針,也不能定義位數(shù)組。所有的位變量都存儲在內(nèi)部RAM的位尋址區(qū)中(20H~2FH),在一個(gè)作用域中最大可聲明128個(gè)位變量。bit變量的聲明與其他變量相同。例如:bitdone_flag =0 //定義位變量done_flag,初值為0bitfunc(bitbvar1){ //bit類型的函數(shù)
bitbvar2; …… return(bvar2); //返回值是bit類型}03特殊功能位sbit用關(guān)鍵字sbit定義位尋址的特殊功能寄存器的位尋址對象。定義方法有如下三種:(1)sbit位變量名=位地址位地址必須位于0x80H~0xFF之間。(2)sbit位變量名=特殊功能寄存器名^位位置位位置是一個(gè)0~7之間的常數(shù)。(3)sbit位變量名=字節(jié)地址^位位置字節(jié)地址作為基地址,在0x80H~0xFF之間。位位置是一個(gè)0~7之間的常數(shù)。04P78sbitP1_0=0x90;sbitP32=0xB0^2;P91sbitP32=P3^2;例如可用下面三種方法定義PSW中的第7位CY,結(jié)果相同:sbitCY=0xD7 //用絕對位地址表示PSW中的第7位,參見表2-4sbitCY=PSW^7 //必須事先已經(jīng)定義了PSWsbitCY=0xD0^7 //PSW的字節(jié)地址為0xD0,參見表2-4MCS-51單片機(jī)中的特殊功能寄存器和特殊功能寄存器可尋址位,已被預(yù)先定義放在文件reg51.h中,在程序的開頭只需加上#include<reg51.h>或#include<reg52.h>即可。sbit和bit的區(qū)別:sbit定義特殊功能寄存器中的可尋址位;而bit則定義了一個(gè)普通的位變量,一個(gè)函數(shù)中可包含bit類型的參數(shù),函數(shù)返回值也可為bit類型。sbit還可訪問MCS-51單片機(jī)片內(nèi)20H~2FH范圍內(nèi)的位對象。C51編譯器提供了一個(gè)bdata存儲器類型,允許將具有bdata類型的對象放入MCS-51單片機(jī)片內(nèi)可位尋址區(qū)。4.4C51語言的數(shù)組、指針與結(jié)構(gòu)4.4.1數(shù)組與指針4.4.2對絕對地址進(jìn)行訪問4.4.1數(shù)組與指針數(shù)組是一個(gè)由同種類型的變量組成的集合,它保存在連續(xù)的存儲區(qū)域中,第一個(gè)元素保存在最低地址中,最末一個(gè)元素保存在最高地址中。1數(shù)組數(shù)組的定義方式如下:數(shù)據(jù)類型[存儲器類型]數(shù)組名[常量1][常量2]…[常量n]例如在程序存儲器中用一維數(shù)組定義7段共陰LED數(shù)碼顯示的字形表,數(shù)組值分別對應(yīng)0~9的顯示數(shù)字。unsignedcharcodeLEDvalue[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};chararray[]=”HelloWorld”;4.4.1數(shù)組與指針指針是指某個(gè)變量所占用存儲單元的首地址。用來存放指針值的變量稱為指針變量。2
指針數(shù)組的定義方式如下:指針變量的定義格式為:類型說明符*指針變量名其中:“*”表示定義的是指針變量;類型說明符表示該指針變量指向的變量的類型。C5l語言的指針和標(biāo)準(zhǔn)C語言中的指針功能相同。char*s;//指向字符類型的指針char*str[4]; //定義字符類型的指針數(shù)組int*numptr; //指向整型類型的指針4.4.1數(shù)組與指針2
指針由于MCS-51存儲器結(jié)構(gòu)的特殊性,C51語言還提供指定存儲器類型的指針,在聲明時(shí)定義指針指向的存儲器類型,也稱為基于存儲器類型的指針,例如:chardata*str; //指針指向data區(qū)的字符intxdata*numtab; //指針指向xdata區(qū)的整型變量unsignedcharcode*powtab //指針指向code區(qū)的無符號字符這種基于存儲器類型的指針,因?yàn)榇鎯ζ黝愋驮诰幾g時(shí)就已經(jīng)指定了,所以指針可以保存在一個(gè)字節(jié)(idata、data、bdata等)或兩個(gè)字節(jié)(code和xdata類型指針)中。4.4.1數(shù)組與指針3.指針的應(yīng)用例4-2:/*ex4-2.c,將外部RAM地址1000H開始的10個(gè)字節(jié)讀入到內(nèi)部RAM中*/#include<reg51.h>//定義MCS-51的特殊功能寄存器SFR#defineXRAMaddr(unsignedcharxdata*)0x1000 //外部RAM的開始地址unsignedcharxdata*ptr; main(){ chari; unsignedchardataarray[10]; ptr=XRAMaddr; for(i=0;i<10;i++){ array[i]=ptr[i]; } while(1); }4.4.1數(shù)組與指針結(jié)構(gòu)變量是將互相關(guān)聯(lián)的、多個(gè)不同類型的變量結(jié)合在一起形成的一個(gè)組合形變量,簡稱結(jié)構(gòu)。構(gòu)成結(jié)構(gòu)的各個(gè)不同類型的變量稱為結(jié)構(gòu)元素(或成員),其定義規(guī)則與變量的定義相同。一般先聲明結(jié)構(gòu)類型,再定義結(jié)構(gòu)變量。4結(jié)構(gòu)定義一個(gè)結(jié)構(gòu)類型的格式為:struct結(jié)構(gòu)名{
結(jié)構(gòu)成員說明}結(jié)構(gòu)成員還可以是其他已定義的結(jié)果,結(jié)構(gòu)成員說明的格式為:類型標(biāo)識符成員名;C51結(jié)構(gòu)定義的格式為:struct結(jié)構(gòu)名變量表;4.4.1數(shù)組與指針例4-4結(jié)構(gòu)與結(jié)構(gòu)變量的定義structdate{ //定義名稱為date的結(jié)構(gòu)類型
unsignedcharmonth; unsignedcharday; unsignedcharyear;}structdatedate1,date2; //定義結(jié)構(gòu)變量date1和date2對結(jié)構(gòu)變量中成員的訪問使用“.”運(yùn)算符,例如:date1.year=07date1.month=1date1.day=254結(jié)構(gòu)4.4.2對絕對地址進(jìn)行訪問指針是C語言中十分重要的概念,MCS-51的總線工作方式下對絕對地址的操作,在使用C51編程時(shí)常用指針操作。C51語言中提供的兩個(gè)專門用于指針和地址的運(yùn)算符:*取內(nèi)容&取地址取內(nèi)容和取地址運(yùn)算的一般形式分別為:變量=*指針變量指針變量=&目標(biāo)變量1.使用指針例4-3使用指針對指定地址進(jìn)行訪問#defineucharunsignedchar#defineuintunsignedintvoidtest_memory(void){ucharidataivar1;ucharxdata*xdp;
/*定義一個(gè)指向xdata存儲器空間的指針*/chardata*dp;/*定義一個(gè)指向data存儲器空間的指針*/ucharidata*idp;/*定義一個(gè)指向idata存儲器空間的指針*/xdp=0x1000;/*xdata指針賦值,指向xdata存儲器地址1000H處*/*xdp=0x5A;/*將數(shù)據(jù)5AH送到xdata的1000H單元*/dp=0x61;/*data指針賦值,指向data存儲器地址61H處*/*dp=0x23;/*將數(shù)據(jù)23H送到data的61H單元*/idp=&ivar1; /*idp指向idata區(qū)變量ivar1*/*idp=0x16; /*等價(jià)于ivar1=0x16*/}4.4.2對絕對地址進(jìn)行訪問使用_at_對指定的存儲器空間的絕對地址進(jìn)行定位。格式如下:[存儲器類型]數(shù)據(jù)類型標(biāo)識符_at_常數(shù)當(dāng)對外部接口的地址進(jìn)行讀寫時(shí),存儲器類型為xdata數(shù)據(jù)類型;數(shù)據(jù)類型通常為uchar的1字節(jié)類型;使用_at_定義的變量必須為全局變量。2.使用C51擴(kuò)展關(guān)鍵字_at_對確定地址進(jìn)行訪問4.4.2對絕對地址進(jìn)行訪問例4-6用關(guān)鍵字_at_訪問指定地址/*將地址為1000H的內(nèi)容讀入。*/#include<reg51.h>//定義MCS-51的特殊功能寄存器SFRunsignedcharxdatay1_at_0x1000;main(){ unsignedcharx1; x1=y1;
while(1);}2.使用C51擴(kuò)展關(guān)鍵字_at_對確定地址進(jìn)行訪問4.4.2對絕對地址進(jìn)行訪問C51編譯器提供了一組宏定義用來對MCS-51系列單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對地址訪問。函數(shù)原型如下:#defineCBYTE((unsignedcharvolatilecode*)0)#defineDBYTE((unsignedcharvolatileidata*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)這些函數(shù)原型放在absacc.h文件中。例如
ucharuc_var1;
uc_var1=XBYTE[0x0002];
/*訪問外部RAM0002H地址的內(nèi)容*/3.使用C51運(yùn)行庫中預(yù)定義宏4.5C51的運(yùn)算符和表達(dá)式表達(dá)式后面加“;”號就構(gòu)成了一個(gè)表達(dá)式語句。1.賦值運(yùn)算符賦值運(yùn)算符“=”,在C中它的功能是給變量賦值,如x=10。2.算術(shù)運(yùn)算符C51中的算術(shù)運(yùn)算符如下:+加或取正值運(yùn)算符-減或取負(fù)值運(yùn)算符*乘運(yùn)算符/除運(yùn)算符%模(取余)運(yùn)算符,如8%5=3,即8除以5的余數(shù)是34.5C51的運(yùn)算符和表達(dá)式3.自增自減運(yùn)算自增自減運(yùn)算符可用在操作數(shù)之前,也可放在其后,例如“x=x+1”既可以寫成“++x”,也可寫成“x++”,其運(yùn)算結(jié)果完全相同。但在表達(dá)式中這兩種用法是有區(qū)別的。x=99;y=++x;則y=100,x=100,如果程序改為:x=99;y=x++;則y=99,x=100。在這兩種情況下,x都被置為100。在大多數(shù)C編譯程序中,為自增和自減操作生成的程序代碼比等價(jià)的賦值語句生成的代碼要快。4.5C51的運(yùn)算符和表達(dá)式3.自增自減運(yùn)算算術(shù)運(yùn)算符及其優(yōu)先級排列如下:最高 ++、-- -(取負(fù)值) *、/、%最低 +、-4.5C51的運(yùn)算符和表達(dá)式4.關(guān)系運(yùn)算符關(guān)系表達(dá)式用來判別某個(gè)條件是否滿足。關(guān)系運(yùn)算符的運(yùn)算結(jié)果只有0和1兩種,也就是邏輯的真與假,條件滿足時(shí)結(jié)果為1,不滿足時(shí)結(jié)果為0。C51中有6種關(guān)系運(yùn)算符:>大于<小于>=大于等于<=小于等于==測試等于!=測試不等于關(guān)系和邏輯運(yùn)算符的優(yōu)先級比算術(shù)運(yùn)算符低,例如表達(dá)式“10>x+12”的計(jì)算,應(yīng)看作是“10>(x+12)”。4.5C51的運(yùn)算符和表達(dá)式5.邏輯運(yùn)算符用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來就是邏輯表達(dá)式:邏輯與:條件式1&&條件式2。邏輯或:條件式1||條件式2。邏輯非:!條件式。例如a=7,b=6,c=0時(shí),則:!a=0,!c=1。a&&b=1;!a&&b=0;b||c=1。(a>0)&&(b>3)=1;(a>8)&&(b>0)=0。4.5C51的運(yùn)算符和表達(dá)式位運(yùn)算符也有優(yōu)先級,從高到低依次是:“~”(按位取反),“<<”(左移),“>>”(右移),“&”(按位與),“^”(按位異或),“|”(按位或)。如a=0x54=01010100B,b=0x3b=00111011B,則:a&b=00010000;a|b=01111111;a^b=01101111;~a=10101011;a<<2=01010000;b>>1=00011101。4.5C51的運(yùn)算符和表達(dá)式7.復(fù)合運(yùn)算符復(fù)合運(yùn)算符就是在賦值運(yùn)算符“=”的前面加上其他運(yùn)算符。以下是C51語言中的復(fù)合賦值運(yùn)算符:+=加法賦值>>=右移位賦值-=減法賦值&=邏輯與賦值*=乘法賦值|=邏輯或賦值/=除法賦值^=邏輯異或賦值%=取模賦值~=邏輯非賦值<<=左移位賦值其含義就是變量與表達(dá)式先進(jìn)行運(yùn)算符所要求的運(yùn)算,再把運(yùn)算結(jié)果賦值給參與運(yùn)算的變量。其實(shí)這是C語言中簡化程序的一種方法,凡是二目運(yùn)算都可以用復(fù)合賦值運(yùn)算符去簡化表達(dá)。例如:a+=56等價(jià)于a=a+56,y/=x+9等價(jià)于y=y/(x+9)。4.6C51語言的程序結(jié)構(gòu)C51語言的“語句”可以是以“;”號結(jié)束的簡單語句,也包括用“{}”組成的復(fù)合語句。C51語言大致可分為三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。4.6.1順序結(jié)構(gòu)順序結(jié)構(gòu)單片機(jī)上電后或復(fù)位后是從地址0000H開始執(zhí)行程序順序執(zhí)行指令代碼的。4.6.2選擇結(jié)構(gòu)if語句if語句的格式為:if(表達(dá)式)語句1else語句2if語句的例子可參見例4-1?!癳lse語句2”也可以省略。“語句2”還可以接續(xù)另一個(gè)if語句。構(gòu)成:if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2elseif(表達(dá)式3)語句3else語句3 ……else語句n例4-6,當(dāng)S1閉合時(shí),報(bào)警燈亮;當(dāng)計(jì)數(shù)器TL1大于30,同時(shí)而S1打開時(shí),報(bào)警燈滅。#include<reg51.h>//定義MCS-51的特殊功能寄存器SFRsbitP32=P3^2; //定義P3.2為P32sbitP20=P2^0; //定義P2.0為P20main(){while(1){ P32=1; //P32為輸入端
if(P32==0){ //P32是低電平?如果S1按下,P32為低
P20=1; //S1按下,則P20輸出高電平,報(bào)警燈亮
}elseif(TL1>30){ //如果S1沒有按下,并且TL1>30 P20=0; //則P20輸出低電平,報(bào)警燈滅
}}}swhch語句用于處理多路分支的情形,格式為:switch(表達(dá)式){case常量表達(dá)式:語句1;break;case常量表達(dá)式2:語句2;break;……case常量表達(dá)式n:語句n;break;default:語句n+1;break;}switch語句4.6.2選擇結(jié)構(gòu)對switch語句需要注意以下兩點(diǎn):(1)case分支中的常量表達(dá)式的值必須是整型、字符型,不能使用條件運(yùn)算符。(2)break語句用于跳出switch結(jié)構(gòu)。若case分支中未使用break語句,則程序?qū)⒗^續(xù)執(zhí)行到下一個(gè)case分支中的語句直至遇到break語句或整個(gè)switch語句結(jié)束。這可以用于多個(gè)分支需要執(zhí)行相同的語句進(jìn)行處理的情況。!4.6.3循環(huán)結(jié)構(gòu)C語言有for、while、do……while三種語句構(gòu)成循環(huán)結(jié)構(gòu)。
for循環(huán)語句的一般格式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體語句While循環(huán)語句的格式為:while(表達(dá)式)循環(huán)體語句for循環(huán)語句While語句do…whiIe循環(huán)語句的格式為:do循環(huán)體語句while(表達(dá)式);do…while語句4.6.3循環(huán)結(jié)構(gòu)goto語句的格式為:goto語句標(biāo)號;goto語句是無條件轉(zhuǎn)移語句,它將程序運(yùn)行的流向轉(zhuǎn)到指定的標(biāo)號處。goto語句break語句在循環(huán)語句中,break語句的作用是在循環(huán)體中控制程序立即跳出當(dāng)前循環(huán)結(jié)構(gòu),轉(zhuǎn)而執(zhí)行循環(huán)語句的后續(xù)操作。continue語句continue語句只能用于循環(huán)體結(jié)構(gòu)中,作用是結(jié)束本次循環(huán)。一且執(zhí)行了continue語句,程序就跳過循環(huán)體中位于該語句后的所有語句,提前結(jié)束本輪循環(huán)并開始下一輪循環(huán)。4.6.3循環(huán)結(jié)構(gòu)例4-7用do…while語句編程計(jì)算1+2+3+…+10的值。unsignedcharsum,i;sum=0;i=0;do{ sum+=i; i++;}while(i<=10);程序運(yùn)行結(jié)果sum=55;i=10。4.6.3循環(huán)結(jié)構(gòu)用while語句編程計(jì)算1+2+3+…+10的值。unsignedcharsum,i;sum=0;i=0;while(i<=10){ sum+=i; i++;}程序運(yùn)行結(jié)果sum=55;i=10。4.6.3循環(huán)結(jié)構(gòu)用for語句編程計(jì)算1+2+3+…+10的值。unsignedcharsum,i;sum=0;i=0;for(;i<=10;i++) sum+=i;程序運(yùn)行結(jié)果sum=55;i=10。4.7C51語言的函數(shù)C程序由一個(gè)主函數(shù)main()和若干個(gè)其他函數(shù)組成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用,同一個(gè)函數(shù)可以被調(diào)用多次。函數(shù)定義1函數(shù)定義的一般格式為函數(shù)類型函數(shù)名(形式參數(shù)列表)[interruptn][usingn]局部變量聲明部分語句(有返回值的要有return語句)函數(shù)類型定義了函數(shù)中返回語句(return)返回值的數(shù)據(jù)類型。參數(shù)表是一個(gè)用逗號分隔的變量表,當(dāng)函數(shù)被調(diào)用時(shí)這些變量接收調(diào)用參數(shù)的值。一個(gè)函數(shù)可以沒有參數(shù),這時(shí)函數(shù)參數(shù)表是空的。4.7C51語言的函數(shù)函數(shù)返回值2返回語句retum用來回送一個(gè)數(shù)值給定義的函數(shù),從函數(shù)中退出。返回值是通過retum語句返回的。返回值的類型如果與函數(shù)定義的類型不一致,那么返回值將被自動轉(zhuǎn)換成函數(shù)定義的類型。如果函數(shù)無須返回值,可以用void類型說明符指明函數(shù)無返回值。4.7C51語言的函數(shù)形式參數(shù)與實(shí)際參數(shù)3與使用變量一樣,在調(diào)用一個(gè)函數(shù)之前,必須對該函數(shù)進(jìn)行聲明。函數(shù)聲明的一般格式為:函數(shù)類型函數(shù)名(形式參數(shù)列表)函數(shù)定義時(shí)參數(shù)列表中的參數(shù)稱為形式參數(shù),簡稱形參。函數(shù)調(diào)用時(shí)所使用的替換參數(shù),是實(shí)際參數(shù),簡稱實(shí)參。定義的形參與函數(shù)調(diào)用的實(shí)參類型應(yīng)該一致,書寫順序應(yīng)該相同。調(diào)用函數(shù)的方式4被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)。函數(shù)作為語句。把函數(shù)調(diào)用作為一個(gè)語句,不使用函數(shù)返回值,只是完成函數(shù)所定義的操作。refresh_led();函數(shù)作為表達(dá)式。函數(shù)調(diào)用出現(xiàn)在一個(gè)表達(dá)式中,使用函數(shù)的返回值。intk;k=sum(a,b);函數(shù)作為一個(gè)參數(shù)。函數(shù)調(diào)用作為另一個(gè)函數(shù)的實(shí)參。intk;k=sum(sum(a,b),c);4.7C51語言的函數(shù)規(guī)定函數(shù)使用的寄存器組5使用usingn函數(shù)說明屬性來規(guī)定函數(shù)所使用的寄存器組,格式為函數(shù)類型函數(shù)名(形參列表)usingnusingn屬性使用一個(gè)0~3的整型參數(shù),這個(gè)參數(shù)表示使用的寄存器組的編號。using屬性一般用在中斷函數(shù)中。4.8中斷服務(wù)程序中斷服務(wù)程序是一種特殊的函數(shù),又稱為中斷函數(shù)。使用interrupt關(guān)鍵字來實(shí)現(xiàn)。定義中斷服務(wù)程序的一般格式如下:void函數(shù)名()interruptn[usingm]關(guān)鍵字interrupt后面的n是中斷號,理論上可以是0~31的整型參數(shù),用來表示中斷處理函數(shù)所對應(yīng)的中斷號,該參數(shù)不能是帶運(yùn)算符的表達(dá)式。對于AT89C51單片機(jī)n的取值范圍是0~4。4.8中斷服務(wù)程序使用C51編寫中斷服務(wù)程序,程序員無需關(guān)心ACC、B、DPH、DPL、PSW等寄存器的保護(hù),C51編譯器會根據(jù)上述寄存器的使用情況在目標(biāo)代碼中自動增加壓棧和出棧。表4-6中斷號和中斷源的對應(yīng)關(guān)系中斷號中斷源中斷向量0外部中斷00003H1定時(shí)/計(jì)數(shù)器0000BH2外部中斷10013H3定時(shí)/計(jì)數(shù)器1001BH4串行口0023H4.8中斷服務(wù)程序中斷函數(shù)應(yīng)遵循以下規(guī)則:01020304中斷函數(shù)不能進(jìn)行參數(shù)傳遞。中斷函數(shù)沒有返回值。不能在其他函數(shù)中直接調(diào)用中斷函數(shù)。若在中斷中調(diào)用了其他函數(shù),則必須保證這些函數(shù)和中斷函數(shù)使用了相同的寄存器組。4.9C51的預(yù)處理預(yù)處理功能包括宏定義、文件包含和條件編譯3個(gè)主要部分。預(yù)處理命令不同于C語言語句。具有以下特點(diǎn)。預(yù)處理命令以“#”開頭,后面不加分號。預(yù)處理命令在編譯前執(zhí)行。多數(shù)預(yù)處理命令習(xí)慣放在文件的開頭。4.9.1宏定義宏符號名一般采用大寫形式。不帶參數(shù)的宏定義的格式為:#define宏符號名常量表達(dá)式例如:#definePI3.14用宏符號名PI代替浮點(diǎn)數(shù)3.14。結(jié)束宏符號名的定義語句:#undef宏符號名4
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026屆黑龍江綏化市一中化學(xué)高二上期中統(tǒng)考試題含解析
- 2026屆福建省寧德市部分一級達(dá)標(biāo)中學(xué)化學(xué)高一第一學(xué)期期中經(jīng)典模擬試題含解析
- 2026屆河北省重點(diǎn)中學(xué)高一化學(xué)第一學(xué)期期末考試模擬試題含解析
- Unit2HobbiesWeletotheunit教學(xué)設(shè)計(jì)譯林版七年級英語上冊
- 機(jī)械司機(jī)安全培訓(xùn)課件
- 消防有關(guān)面試題目及答案
- 新解讀《GB-T 20409-2018高壓鍋爐用內(nèi)螺紋無縫鋼管》
- 湘水集團(tuán)面試題目及答案
- 機(jī)械原件基礎(chǔ)知識培訓(xùn)課件
- 化妝品配方知識培訓(xùn)課件
- 2025.4.15成都市住建局《房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)》解析
- 2025年初中語文八年級下冊試講稿(教師招聘面試)壺口瀑布
- 高一新生入學(xué)教育
- 線纜公司倉庫管理制度
- 醫(yī)院培訓(xùn)課件:《十八項(xiàng)核心醫(yī)療制度解讀》
- 課題申報(bào)書:英語單元整體教學(xué)設(shè)計(jì)與實(shí)施研究
- 2024中國演播室市場運(yùn)行態(tài)勢及行業(yè)發(fā)展前景預(yù)測報(bào)告
- 十字相乘法(最終版)
- LY/T 3408-2024林下經(jīng)濟(jì)術(shù)語
- 腎內(nèi)科醫(yī)生進(jìn)修總結(jié)匯報(bào)
- 小學(xué)數(shù)學(xué)跨學(xué)科學(xué)習(xí)案例
評論
0/150
提交評論