版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十章 單片機(jī)10.2 C51語(yǔ)言的標(biāo)識(shí)符和關(guān)鍵字 10.4 C51語(yǔ)言的程序流程控制 10.3 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符 10.5 函 數(shù) 10.1 C51語(yǔ)言的特點(diǎn)及其程序結(jié)構(gòu) 10.6 編譯預(yù)處理命令 10.7 C51程序設(shè)計(jì)舉例 教學(xué)目的和要求 本章主要介紹單片機(jī)高級(jí)語(yǔ)言C51的語(yǔ)法、數(shù)據(jù)結(jié)構(gòu)、語(yǔ)句函數(shù)的分類以及簡(jiǎn)單的C51程序設(shè)計(jì)。重點(diǎn)要求掌握C51的語(yǔ)法、數(shù)據(jù)結(jié)構(gòu)、語(yǔ)句函數(shù)等,以達(dá)到設(shè)計(jì)簡(jiǎn)單的應(yīng)用程序的目的。C51語(yǔ)言的特點(diǎn)及其程序結(jié)構(gòu) C語(yǔ)言是一種通用的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,在國(guó)際上十分流行,它既可用來(lái)編寫計(jì)算機(jī)的系統(tǒng)程序,也可用來(lái)編寫一般的應(yīng)用程序。以前計(jì)算機(jī)的系統(tǒng)軟件主要是
2、用匯編語(yǔ)言編寫的,對(duì)于單片機(jī)應(yīng)用系統(tǒng)來(lái)說(shuō)更是如此。由于匯編語(yǔ)言程序的可讀性和可移植性都較差,采用匯編語(yǔ)言編寫單片機(jī)應(yīng)用系統(tǒng)程序的周期長(zhǎng),而且調(diào)試和排錯(cuò)也比較困難。為了提高編制計(jì)算機(jī)系統(tǒng)和應(yīng)用程序的效率,改善程序的可讀性和可移植性,最好采用高級(jí)語(yǔ)言編程。 語(yǔ)言既具有一般高級(jí)語(yǔ)言的特點(diǎn),又能直接對(duì)計(jì)算機(jī)的硬件進(jìn)行操作,并且采用語(yǔ)言編寫的程序能夠很容易地在不同類型的計(jì)算機(jī)之間進(jìn)行移植,因此語(yǔ)言的應(yīng)用范圍越來(lái)越廣泛。 C51語(yǔ)言的特點(diǎn)及其程序結(jié)構(gòu)語(yǔ)言具有以下一些特點(diǎn): 1、語(yǔ)言簡(jiǎn)潔,使用方便靈活。 2、可移植性好。 3、表達(dá)能力強(qiáng)。 4、表達(dá)方式靈活。 、可進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)。 、可以直接操作計(jì)算機(jī)硬
3、件。 、生成的目標(biāo)代碼質(zhì)量高。 盡管語(yǔ)言具有很多的優(yōu)點(diǎn),但和其它任何一種程序設(shè)計(jì)語(yǔ)言一樣也有其自身的缺點(diǎn),如不能自動(dòng)檢查數(shù)組的邊界、各種運(yùn)算符的優(yōu)先級(jí)別太多、某些運(yùn)算符具有多種用途等。 C51語(yǔ)言的特點(diǎn)及其程序結(jié)構(gòu) 語(yǔ)言程序是由若干個(gè)函數(shù)單元組成的,每個(gè)函數(shù)都是完成某個(gè)特殊任務(wù)的子程序段。組成一個(gè)程序的若干個(gè)函數(shù)可以保存在一個(gè)源程序文件中,也可以保存在幾個(gè)源程序文件中,最后再將它們連接在一起。語(yǔ)言源程序文件的擴(kuò)展名為“.C”,如EX1_1.C,EX1_2.C等。 一個(gè)語(yǔ)言程序必須有而且只能有一個(gè)名為main()的函數(shù),它是一個(gè)特殊的函數(shù),也稱為該程序的主函數(shù),程序的執(zhí)行都是從main()函數(shù)開
4、始的。下面我們先來(lái)看一個(gè)簡(jiǎn)單的程序例子。 C51語(yǔ)言的特點(diǎn)及其程序結(jié)構(gòu) 例10-1: 已知x=10,y=20,計(jì)算z=x+y的結(jié)果。 main( ) /*主函數(shù)名*/ /*主函數(shù)體開始*/ int x,y,z; /*主函數(shù)內(nèi)部變量類型說(shuō)明*/ x=10;y=20; /*變量賦值*/ z=x+y; /*計(jì)算z=x+y的值*/ /*程序結(jié)束*/ 本例的程序是很簡(jiǎn)單的,它只有一個(gè)主函數(shù)main()。一般情況下,一個(gè)語(yǔ)言程序除了必須有一個(gè)主函數(shù)之外,還可能有若干個(gè)其它的功能函數(shù)。下面我們?cè)賮?lái)看一個(gè)例子。 C51語(yǔ)言的特點(diǎn)及其程序結(jié)構(gòu)例10-2: 求最大值。include /* 預(yù)處理命令*/inclu
5、demain() /*主函數(shù)名*/ /*主函數(shù)體開始*/int a,A,c; /*主函數(shù)的內(nèi)部變量類型說(shuō)明*/int max(int x,int y); /*功能函數(shù)max及其形式參數(shù)說(shuō)明*/SCON=0 x52; /*8051單片機(jī)串行口初始化*/TMOD=0 x20;TCON=0 x69;TH1=0 x0f3;TL1=0 x0f3; C51語(yǔ)言的特點(diǎn)及其程序結(jié)構(gòu)scanf(“%d%d”,&a,&A); /*輸入變量a和A的值*/c=max(a,A); /*調(diào)用max函數(shù)*/printf(“max=%d”,c); /* 輸出變量c的值*/ /*主程序結(jié)束*int max(int x,int
6、y) /*定義max函數(shù),x、y為形式參數(shù)*/ *max函數(shù)體開始*/int z; *max函數(shù)內(nèi)部變量類型說(shuō)明*/if(xy) x; *計(jì)算最大值*else z=y;return(z); *將計(jì)算得到的最大值返回到調(diào)用處* *max函數(shù)結(jié)束* C51語(yǔ)言的特點(diǎn)及其程序結(jié)構(gòu) 從以上兩個(gè)例子可以看到,一般語(yǔ)言程序具有如下的結(jié)構(gòu): 預(yù)處理命令 include 函數(shù)說(shuō)明 long fun1(); float fun2(); 功能函數(shù) fun1() 函數(shù)體 主函數(shù) main() 主函數(shù)體 功能函數(shù) fun2() 函數(shù)體 C51語(yǔ)言的標(biāo)志符和關(guān)鍵字 語(yǔ)言的標(biāo)識(shí)符是用來(lái)標(biāo)識(shí)源程序中某個(gè)對(duì)象名字的。這些對(duì)象
7、可以是函數(shù)、變量、常量、數(shù)組、數(shù)據(jù)類型、存儲(chǔ)方式和語(yǔ)句等。一個(gè)標(biāo)識(shí)符由字符串、數(shù)字和下劃線等組成,第一個(gè)字符必須是字母或下劃線 。 關(guān)鍵字是一類具有固定名稱和特定含義的特殊標(biāo)識(shí)符,有時(shí)又稱為保留字。在編寫語(yǔ)言源程序時(shí)一般不允許將關(guān)鍵字另作別用,換句話說(shuō),就是對(duì)于標(biāo)識(shí)符的命名不要與關(guān)鍵字相同。與其它計(jì)算機(jī)語(yǔ)言相比,語(yǔ)言的關(guān)鍵字是比較少的,ANSIC標(biāo)準(zhǔn)一共規(guī)定了32個(gè)關(guān)鍵字,表10-1按用途列出了ANSIC標(biāo)準(zhǔn)的關(guān)鍵字。 C51語(yǔ)言的標(biāo)志符和關(guān)鍵字關(guān)鍵字用 途說(shuō) 明auto存儲(chǔ)類型說(shuō)明用以說(shuō)明局部變量break程序語(yǔ)句退出最內(nèi)層循環(huán)體case程序語(yǔ)句switch語(yǔ)句中的選擇項(xiàng)char數(shù)據(jù)類型說(shuō)明
8、單字節(jié)整型數(shù)或字符型數(shù)據(jù)const存儲(chǔ)類型說(shuō)明在程序執(zhí)行過(guò)程中不可修改的變量值continue程序語(yǔ)句轉(zhuǎn)向下一次循環(huán)default程序語(yǔ)句switch語(yǔ)句中的失敗選擇項(xiàng)do程序語(yǔ)句構(gòu)成dowhile循環(huán)結(jié)構(gòu)double數(shù)據(jù)類型說(shuō)明雙精度浮點(diǎn)數(shù)else程序語(yǔ)句構(gòu)成ifelse選擇結(jié)構(gòu)enum數(shù)據(jù)類型說(shuō)明枚舉extern存儲(chǔ)類型說(shuō)明在其他程序模塊中說(shuō)明的全局變量float數(shù)據(jù)類型說(shuō)明單精度浮點(diǎn)數(shù)for程序語(yǔ)句構(gòu)成for循環(huán)結(jié)構(gòu)表10-1 ANSIC標(biāo)準(zhǔn)的關(guān)鍵字 C51語(yǔ)言的標(biāo)志符和關(guān)鍵字goto程序語(yǔ)句構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)if程序語(yǔ)句構(gòu)成ifelse轉(zhuǎn)移結(jié)構(gòu)int數(shù)據(jù)類型說(shuō)明基本整型數(shù)long數(shù)據(jù)
9、類型說(shuō)明長(zhǎng)整型數(shù)register存儲(chǔ)類型說(shuō)明使用CPU內(nèi)部寄存器的變量return程序語(yǔ)句函數(shù)返回short數(shù)據(jù)類型說(shuō)明短整型數(shù)signed數(shù)據(jù)類型說(shuō)明有符號(hào)數(shù),二進(jìn)制數(shù)據(jù)的最高位為符號(hào)位sizeof運(yùn)算符計(jì)算表達(dá)式或數(shù)據(jù)類型的字節(jié)數(shù)static存儲(chǔ)類型說(shuō)明靜態(tài)變量struct數(shù)據(jù)類型說(shuō)明結(jié)構(gòu)類型數(shù)據(jù)switch程序語(yǔ)句構(gòu)成switch選擇結(jié)構(gòu)typedef數(shù)據(jù)類型說(shuō)明數(shù)據(jù)類型定義union數(shù)據(jù)類型說(shuō)明聯(lián)合類型數(shù)據(jù)unsigned數(shù)據(jù)類型說(shuō)明無(wú)符號(hào)數(shù)據(jù)void數(shù)據(jù)類型說(shuō)明無(wú)類型數(shù)據(jù)volatile數(shù)據(jù)類型說(shuō)明說(shuō)明該變量在程序執(zhí)行中可被隱含地改變while程序語(yǔ)句構(gòu)成while 和dowhile
10、循環(huán)結(jié)構(gòu)C51語(yǔ)言的標(biāo)志符和關(guān)鍵字 C51編譯器除了支持ANSIC標(biāo)準(zhǔn)的關(guān)鍵字以外,還擴(kuò)展了如表10-2所示的關(guān)鍵字: 關(guān)鍵字用 途說(shuō) 明bit位變量說(shuō)明聲明一個(gè)位變量或位類型的函數(shù)sbit位變量說(shuō)明聲明一個(gè)可位尋址的變量sfr8位特殊功能寄存器聲明聲明一個(gè)特殊功能寄存器(8位)sfr1616位特殊功能寄存器聲明聲明一個(gè)特殊功能寄存器(16位)data存儲(chǔ)器類型說(shuō)明直接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器bdata存儲(chǔ)器類型說(shuō)明可位尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類型說(shuō)明間接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器pdata存儲(chǔ)器類型說(shuō)明“分頁(yè)” 尋址的8051外部數(shù)據(jù)存儲(chǔ)器xdata存儲(chǔ)器類型說(shuō)明8
11、051外部數(shù)據(jù)存儲(chǔ)器code存儲(chǔ)器類型說(shuō)明8051程序存儲(chǔ)器interrupt中斷函數(shù)聲明定義一個(gè)中斷函數(shù)reentrant再入函數(shù)聲明定義一個(gè)再入函數(shù)using寄存器組定義定義一個(gè)8051的工作寄存器組表10-2 C51編譯器的擴(kuò)展關(guān)鍵字 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符C51語(yǔ)言的數(shù)據(jù)類型 任何程序設(shè)計(jì)都離不開對(duì)數(shù)據(jù)的處理。數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的存放情況由數(shù)據(jù)結(jié)構(gòu)決定。語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型出現(xiàn)的,數(shù)據(jù)類型可分為基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型,復(fù)雜數(shù)據(jù)類型由基本數(shù)據(jù)類型構(gòu)造而成。1、基本數(shù)據(jù)類型 語(yǔ)言中的基本數(shù)據(jù)類型有char,int,short,long,float等。C51數(shù)據(jù)類型以及數(shù)據(jù)長(zhǎng)
12、度和其值域見表10-3 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符數(shù)據(jù)類型位數(shù)字節(jié)數(shù)值域bit101signed char81-128+127unsigned char810255enum162-32768+32767signed short162-32768+32767unsigned short162065535signed int162-32768+32767unsigned int162065535signed long324-21474836482147483647unsigned long32404294967295float3240.175494E-380.402823E+38sbit101s
13、fr810255sfr16162065535表10-3 基本數(shù)據(jù)類型的長(zhǎng)度 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符2、復(fù)雜數(shù)據(jù)類型 (1)數(shù)組類型 數(shù)組是一組有序數(shù)據(jù)的集合,數(shù)組中的每一個(gè)數(shù)據(jù)元素都屬于同一個(gè)數(shù)據(jù)類型。數(shù)組中的各個(gè)元素可以用數(shù)組名和下標(biāo)來(lái)唯一確定。一維數(shù)組只有一個(gè)下標(biāo),多維數(shù)組有兩個(gè)以上的下標(biāo)。在C語(yǔ)言中,數(shù)組必須先定義,然后才能使用。一維數(shù)組的定義形式如下: 數(shù)據(jù)類型 數(shù)組名常量表達(dá)式; 其中,“數(shù)據(jù)類型”說(shuō)明了數(shù)組中各個(gè)元素的類型?!皵?shù)組名”是整個(gè)數(shù)組的標(biāo)識(shí)符,它的命名方法與變量的命名方法一樣?!俺A勘磉_(dá)式”說(shuō)明了該數(shù)組的長(zhǎng)度,即該數(shù)組中的元素個(gè)數(shù)。常數(shù)表達(dá)式必須用方括號(hào)“”括起來(lái),
14、而且其中不能含有變量。下面是幾個(gè)定義一維數(shù)組的例子。 char xx15; /定義字符型數(shù)組xx,它有15個(gè)元素 int yy20; / 定義整型數(shù)組yy,它有20個(gè)元素 float zz15; / 定義浮點(diǎn)型數(shù)組zz,它有15個(gè)元素 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符 定義多維數(shù)組時(shí),只要在數(shù)組名后面增加相應(yīng)于維數(shù)的常量表達(dá)式即可。對(duì)于二維數(shù)組的定義形式為: 數(shù)據(jù)類型 數(shù)組名常量表達(dá)式 常量表達(dá)式; 需要指出的是,C語(yǔ)言中數(shù)組的下標(biāo)是從0開始的。在引用數(shù)值數(shù)組時(shí),只能逐個(gè)引用數(shù)組中的各個(gè)元素,而不能一次引用整個(gè)數(shù)組;但如果是字符數(shù)組則可以一次引用整個(gè)數(shù)組。 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符例10-3:
15、 利用指針將一個(gè)字符數(shù)組中的字符串復(fù)制到另一個(gè)字符數(shù)組中去。#includeextern serial_initial(); main() char *s1;char xdata *s2;char code str=“How are you?”;s1=str;s2=0 x1000;serial_initial();C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符while(*s2=*s1)!=0)s2+;s1+;s1=str;s2=0 x1000;printf(“%sn%sn”,s1,s2);while(1);執(zhí)行程序結(jié)果:How are you?How are you? C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符 (2)指針
16、類型 指針類型數(shù)據(jù)在C語(yǔ)言程序中的使用十分普遍。正確地使用指針類型數(shù)據(jù),可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),直接訪問(wèn)內(nèi)存地址,而且可以更為有效地使用數(shù)組。指針和地址 指針變量的定義 指針變量定義的一般格式: 數(shù)據(jù)類型 存儲(chǔ)器類型 *標(biāo)識(shí)符; 其中,“標(biāo)識(shí)符”是所定義的指針變量名。 指針變量的引用 指針變量是含有一個(gè)數(shù)據(jù)對(duì)象地址的特殊變量,指針變量中只能存放地址。有關(guān)的運(yùn)算符有兩個(gè),它們是地址運(yùn)算符“&”和間接訪問(wèn)運(yùn)算符“*”。例如:&a為變量a地址,*p為指針變量p所指向的變量。 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符例10-4: 輸入兩個(gè)整數(shù)x和y,經(jīng)比較后按大小順序輸出。#include extern s
17、erial_initial();main()int x,y;int *p,*p1,*p2;serial_initial();printf(“Input x and y :n”);scanf(“%d %d”,&x,&y);p1=&x;p2=&y;if(xy) p1=p2;p2=p;C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符printf(“max=%d,min=%dn”,*p1,*p2);while(1);程序執(zhí)行結(jié)果:Input x and y:4 8(回車) max=8,min=4 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符 (2)結(jié)構(gòu)類型 結(jié)構(gòu)是一種構(gòu)造類型的數(shù)據(jù),它是將若干不同類型的數(shù)據(jù)變量有序地組合在一起而形成的一
18、種數(shù)據(jù)的集合體。組成該集合的各個(gè)數(shù)據(jù)變量稱為結(jié)構(gòu)成員,整個(gè)集合體使用一個(gè)單獨(dú)的結(jié)構(gòu)變量名。 結(jié)構(gòu)變量的定義 有三種定義結(jié)構(gòu)變量的方法,分述如下。 先定義結(jié)構(gòu)類型再定義結(jié)構(gòu)變量名 定義結(jié)構(gòu)類型的一般格式為: struct 結(jié)構(gòu)名 結(jié)構(gòu)元素表; 定義好一個(gè)結(jié)構(gòu)類型之后,就可以用它來(lái)定義結(jié)構(gòu)變 量。一般格式為:struct 結(jié)構(gòu)名 結(jié)構(gòu)變量名1,結(jié)構(gòu)變量名2,結(jié)構(gòu)變量名3,.結(jié)構(gòu)變量名n; C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符在定義結(jié)構(gòu)類型的同時(shí)定義結(jié)構(gòu)變量名一般格式為:struct 結(jié)構(gòu)名結(jié)構(gòu)元素表 結(jié)構(gòu)變量名1,結(jié)構(gòu)變量名2,結(jié)構(gòu)變量名3,結(jié)構(gòu)變量名n;直接定義結(jié)構(gòu)變量一般格式為:struct 結(jié)構(gòu)元素
19、表 結(jié)構(gòu)變量名1,結(jié)構(gòu)變量名2,結(jié)構(gòu)變量名3,結(jié)構(gòu)變量名n; C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符結(jié)構(gòu)變量的引用 在定義了一個(gè)結(jié)構(gòu)變量之后,就可以對(duì)它進(jìn)行引用,即可以進(jìn)行賦值、存取和運(yùn)算。一般情況下,結(jié)構(gòu)變量的引用是通過(guò)對(duì)其結(jié)構(gòu)元素的引用來(lái)實(shí)現(xiàn)的。引用結(jié)構(gòu)元素的一般格式為: 結(jié)構(gòu)變量名.結(jié)構(gòu)元素 其中“.”是存取結(jié)構(gòu)元素的成員運(yùn)算符。 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符例10-5: 給外部結(jié)構(gòu)變量賦初值。#include extern serial_initial();struct mepointunsigned char name11;unsigned char pressure;unsigned cha
20、r temperature;po1=“firstpoint”,0 x99,0 x64;void main(void)serial_initial(); printf(“name:%sn pressure:%bxn temperature:%bxn” ,,po1.pressure,po1.temperature);while(1);程序執(zhí)行結(jié)果:name:firstpointpressure:99temperature:64 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符 (4)聯(lián)合類型 聯(lián)合也是C語(yǔ)言中一種構(gòu)造類型的數(shù)據(jù)結(jié)構(gòu)。在一個(gè)聯(lián)合中可以包含多個(gè)不同類型的數(shù)據(jù)元素,例如可以將一個(gè)float型
21、變量、一個(gè)int型變量和一個(gè)char型變量放在同一個(gè)地址開始的內(nèi)存單元中,如圖10-1所示。以上三個(gè)變量在內(nèi)存中的字節(jié)數(shù)不同,但卻都從同一個(gè)地址開始存放,即采用了所謂“覆蓋技術(shù)“。這種技術(shù)可使不同的變量分時(shí)使用同一個(gè)內(nèi)存空間,提高內(nèi)存的利用效率。 float iint j起始地址char k圖10-1 聯(lián)合中變量的存儲(chǔ)方法 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符聯(lián)合的定義 聯(lián)合類型變量的一般定義方法為: union 聯(lián)合類型名 成員表列 變量表列; 例如:定義一個(gè)data聯(lián)合。 union data float i; int j; char k; a,b,c; 聯(lián)合變量的引用 與結(jié)構(gòu)變量類似,對(duì)聯(lián)合變量
22、的引用也是通過(guò)對(duì)其聯(lián)合元素的引用來(lái)實(shí)現(xiàn)的。引用元素的一般格式為: 聯(lián)合變量名.聯(lián)合元素 或 聯(lián)合變量名-聯(lián)合元素 注意:引用聯(lián)合元素時(shí),要注意聯(lián)合變量用法的一致性。 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符例10-6: 利用聯(lián)合將整型數(shù)轉(zhuǎn)變成兩個(gè)字節(jié)輸出。#include extern serial_initial();union int i;struct unsigned char high,unsigned char lowbytes;word;main()int k;k=0 x67ab;serial_initial();word.i=k;printf(“The high is :n”,word.by
23、tes.high);printf(“The low is :n”,word.bytes.low);程序執(zhí)行結(jié)果:The high is 0 x67The low is 0 xab C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符 (5)枚舉類型 在C語(yǔ)言中,用作標(biāo)志的變量通常只能被賦予下述兩個(gè)值的一個(gè):True或False。但由于疏忽,我們有時(shí)會(huì)將一個(gè)在程序中作為標(biāo)志使用的變量,賦予了除True或False以外的值。另外,這些變量通常被定義成int數(shù)據(jù)類型,從而使他們?cè)诔绦蛑械淖饔媚:磺?。如果我們可以定義標(biāo)志類型的數(shù)據(jù)變量,然后指定這種被說(shuō)明的數(shù)據(jù)變量只能賦值True或False,不能賦予其它值,就可以避免上述
24、情況的發(fā)生。枚舉數(shù)據(jù)類型正是因這種需要而產(chǎn)生的。 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符枚舉的定義 枚舉數(shù)據(jù)類型是一個(gè)有名字的某些整數(shù)型常數(shù)的集合。這些整數(shù)型常數(shù)是該類型變量可取的所有合法值。枚舉定義應(yīng)當(dāng)列出該類型變量的可取值。 枚舉定義說(shuō)明語(yǔ)句的一般格式: enum 枚舉名 枚舉值列表 變量列表; 枚舉的定義和說(shuō)明也可以分成兩句完成: enum 枚舉名 枚舉值列表; enum 枚舉名 變量列表; 枚舉變量的取值 枚舉列表中,每一項(xiàng)符號(hào)代表一個(gè)整數(shù)值。在默認(rèn)情況下,第一項(xiàng)符號(hào)取值為0,第二項(xiàng)符號(hào)取值為1,第三項(xiàng)符號(hào)取值為2,依次類推。此外,也可以通過(guò)初始化,指定某些項(xiàng)的符號(hào)值。某項(xiàng)符號(hào)初始化后,該項(xiàng)后續(xù)
25、各項(xiàng)符號(hào)值隨之依次遞增。 C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符例10-7: 將顏色為紅、綠、藍(lán)的三個(gè)球作全排列,共有幾種排法?打印出每種組合的三種顏色。#include #include extern serial_initial();main()enum colorred,green,blue;/定義枚舉類型enum color i,j,k,st;/定義枚舉類型變量int n=0,lp;serial_initial();for(i=red;i=blue;i+) for(j=red;j=blue;j+) for(k=red;k=blue;k+) n=n+1; printf(“%-4d”,n); for
26、(lp=1;lpAb測(cè)試A是否大于bA=A=b測(cè)試A是否大于或等于b=AAb將A按位右移b位,左側(cè)補(bǔ)零Ab將A按位左移b位,右側(cè)補(bǔ)零|A|b按位或運(yùn)算&A&b按位與運(yùn)算Ab按位異或運(yùn)算A按位取反運(yùn)算&A=&b將b變量的地址存入A寄存器中*A用來(lái)取寄存器所指地址內(nèi)的值C51語(yǔ)言的數(shù)據(jù)類型及運(yùn)算符例10-8: a=1;b=+a;其運(yùn)算過(guò)程是a值加1變?yōu)?,然后再將2賦值給b,所以b=2,a=2。例10-9:a=1;b=a+;其運(yùn)算過(guò)程是a原先的值1,先賦值給b,然后a再加1變?yōu)?,所以b=1,a=2。 C51語(yǔ)言的程序流程控制if 語(yǔ)句 1、 if(條件表達(dá)式) 動(dòng)作 如果條件表達(dá)式的值為真(非零
27、的數(shù)),則執(zhí)行 內(nèi)的動(dòng)作,如果條件表達(dá)式為假,則略過(guò)該動(dòng)作而繼續(xù)往下執(zhí)行。2、 if(條件表達(dá)式) 動(dòng)作1 else 動(dòng)作2 C51語(yǔ)言的程序流程控制3、if(條件表達(dá)式1) if(條件表達(dá)式2) if(條件表達(dá)式3) 動(dòng)作1 else 動(dòng)作2 else 動(dòng)作3 else 動(dòng)作4 動(dòng)作1:是條件表達(dá)式1、2、3都成立時(shí)才會(huì)執(zhí)行。 動(dòng)作2:是條件表達(dá)式1、2成立,但條件表達(dá)式3不成立時(shí)才會(huì)執(zhí)行。 動(dòng)作3:是條件表達(dá)式1成立,但條件表達(dá)式2不成立時(shí)才會(huì)執(zhí)行。 動(dòng)作4:是條件表達(dá)式1不成立時(shí)才會(huì)執(zhí)行。 C51語(yǔ)言的程序流程控制4、if(條件表達(dá)式1)動(dòng)作1else if(條件表達(dá)式2)動(dòng)作2else
28、 if(條件表達(dá)式3)動(dòng)作3else if(條件表達(dá)式4)動(dòng)作4 動(dòng)作1:是條件表達(dá)式1成立時(shí)才會(huì)執(zhí)行。 動(dòng)作2:是條件表達(dá)式1不成立,但條件表達(dá)式2成立時(shí)才會(huì)執(zhí)行。 動(dòng)作3:是條件表達(dá)式1、2不成立,但條件表達(dá)式3成立時(shí)才會(huì)執(zhí)行。 動(dòng)作4:是條件表達(dá)式1、2、3不成立,但條件表達(dá)式4成立時(shí)才會(huì)執(zhí)行。 C51語(yǔ)言的程序流程控制switch case語(yǔ)句 switch (條件表達(dá)式)case 條件值1:動(dòng)作1break;case 條件值2:動(dòng)作2break;case 條件值3:動(dòng)作3break;case 條件值4:動(dòng)作4break; default:break; C51語(yǔ)言的程序流程控制 swi
29、tch 內(nèi)的條件表達(dá)式的結(jié)果必須為整數(shù)或字符。switch以條件表達(dá)式的值來(lái)與各case的條件值對(duì)比,如果與某個(gè)條件值相符合,則執(zhí)行該case的動(dòng)作,如果所有的條件值都不符合,則執(zhí)行default的動(dòng)作,每一個(gè)動(dòng)作之后一般要寫break,否則就會(huì)繼續(xù)執(zhí)行下一個(gè)case的動(dòng)作,這是我們不希望看到的。另外case之后的條件值必須是數(shù)據(jù)常數(shù),不能是變量,而且不可以重復(fù),即條件值必須各不相同,如果有數(shù)種case所做的動(dòng)作一樣時(shí),也可以寫在一起,即上下并列。一般當(dāng)程序必須作多選1時(shí),可以采用switch語(yǔ)句。break:是跳出循環(huán)的語(yǔ)句,任何由switch、for 、while、do while構(gòu)成的循
30、環(huán),都可以用break來(lái)跳出,必須注意的是,break一次只能跳出一層循環(huán),通常都和if連用,當(dāng)某些條件成立后就跳出循環(huán)。default:當(dāng)所有case的條件值都不成立時(shí),就執(zhí)行default所指定的動(dòng)作,執(zhí)行完成后也要使用break指令跳出switch循環(huán)。 C51語(yǔ)言的程序流程控制while循環(huán)語(yǔ)句 while(條件表達(dá)式) (動(dòng)作) 先測(cè)試條件表達(dá)式是否成立,當(dāng)條件表達(dá)式為真時(shí),則執(zhí)行循環(huán)內(nèi)動(dòng)作,做完后又繼續(xù)跳回條件表達(dá)式作測(cè)試,如此反復(fù)直到條件表達(dá)式為假為止,使用時(shí)要避免條件永真,造成死循環(huán)。 C51語(yǔ)言的程序流程控制do while循環(huán)語(yǔ)句 do (動(dòng)作)while(條件表達(dá)式);
31、先執(zhí)行動(dòng)作后,再測(cè)試條件表達(dá)式是否成立。當(dāng)條件表達(dá)式為真,則繼續(xù)回到前面執(zhí)行動(dòng)作,如此反復(fù)直到條件表達(dá)式為假為止,不論條件表達(dá)式的結(jié)果為何,至少會(huì)做一次動(dòng)作,使用時(shí)要避免條件永真,造成死循環(huán)。 C51語(yǔ)言的程序流程控制for循環(huán)語(yǔ)句 for (表達(dá)式1;表達(dá)式2;表達(dá)式3)(動(dòng)作)表達(dá)式 1:通常是設(shè)定起始值。表達(dá)式 2:通常是條件判斷式,如果條件為真時(shí),則執(zhí)行動(dòng)作,否則終止循環(huán)。表達(dá)式3:通常是步長(zhǎng)表達(dá)式,執(zhí)行動(dòng)作完畢后,必須再回到這里做運(yùn)算,然后再到表達(dá)式2做判斷。 C51語(yǔ)言的程序流程控制goto語(yǔ)句 編寫程序,盡量不要使用goto語(yǔ)句,以避免程序閱讀困難。但是,如果確實(shí)需要跳離很多層循
32、環(huán),則可以使用goto語(yǔ)句。goto的目的位置必須在同一個(gè)程序文件內(nèi),不能跳到其它程序文件。標(biāo)簽的寫法和變量是一樣的,標(biāo)簽后面必須加一個(gè)冒號(hào)。goto經(jīng)常和if 連用,如果程序中檢查到異常時(shí),即使用goto語(yǔ)句去處理。 C51語(yǔ)言的程序流程控制continue語(yǔ)句 continue語(yǔ)句是一種中斷語(yǔ)句,它一般用在循環(huán)結(jié)構(gòu)中,其功能是結(jié)束本次循環(huán),即跳過(guò)循環(huán)體中下面尚未執(zhí)行的語(yǔ)句,把程序流程轉(zhuǎn)移到當(dāng)前循環(huán)語(yǔ)句的下一個(gè)循環(huán)周期,并根據(jù)循環(huán)控制條件決定是否重復(fù)執(zhí)行該循環(huán)體。continue語(yǔ)句的一般形式為:continue; continue語(yǔ)句通常和條件語(yǔ)句一起用在由while、do while和f
33、or語(yǔ)句構(gòu)成的循環(huán)結(jié)構(gòu)中,它也是一種具有特殊功能的無(wú)條件轉(zhuǎn)移語(yǔ)句,但它與break語(yǔ)句不同,continue語(yǔ)句并不跳出循環(huán)體,而只是根據(jù)循環(huán)控制條件確定是否繼續(xù)執(zhí)行循環(huán)語(yǔ)句。 函 數(shù)函數(shù)格式:類型 函數(shù)名稱(類型 參數(shù)1,類型 參數(shù)2,類型 參數(shù)3,類型) 所謂函數(shù),即子程序,也就是“語(yǔ)句的集合”。它把經(jīng)常使用的語(yǔ)句群定義成函數(shù),在程序中用到時(shí)調(diào)用,這樣可以減少重復(fù)編寫程序的麻煩,也可以縮短程序的長(zhǎng)度。當(dāng)一個(gè)程序太大時(shí),建議將其中的一部分程序改用函數(shù)的方式調(diào)用較好,因?yàn)榇蟪绦蜻^(guò)于繁雜,容易出錯(cuò),而小程序容易調(diào)試,也易于閱讀和修改。使用函數(shù)的注意事項(xiàng):1、函數(shù)定義時(shí)要同時(shí)聲明其類型。2、調(diào)用函
34、數(shù)前要先聲明該函數(shù)。3、傳給函數(shù)的參數(shù)值,其類型要與函數(shù)原定義一致。4、接受函數(shù)返回值的變量,其類型也要與函數(shù)一致。 函 數(shù)中斷服務(wù)函數(shù)與寄存器組定義 C51編譯器支持在C語(yǔ)言源程序中直接編寫8051單片機(jī)的中斷服務(wù)函數(shù)程序。定義中斷服務(wù)函數(shù)的一般形式為: 1函數(shù)類型 函數(shù)名(形式參數(shù)表) interrupt n using n 2關(guān)鍵字using對(duì)函數(shù)目標(biāo)代碼的影響如下: 在函數(shù)的入口處將當(dāng)前工作寄存器組保護(hù)到堆棧中;指定的工作寄存器內(nèi)容不會(huì)改變;函數(shù)返回之前將被保護(hù)的工作寄存器組從堆棧中恢復(fù)。 3關(guān)鍵字interrupt也不允許用于外部函數(shù),它對(duì)中斷函數(shù)目標(biāo)代碼的影響如下: 在進(jìn)入中斷函數(shù)
35、時(shí),特殊功能寄存器ACC、B、DPH、DPL、PSW將被保存入棧;如果不使用寄存器組切換,則將中斷函數(shù)中所用到的全部工作寄存器都入棧;函數(shù)返回之前,所有的寄存器內(nèi)容出棧;中斷函數(shù)由8051單片機(jī)指令RETI結(jié)束。 函 數(shù) 4編寫8051單片機(jī)中斷函數(shù)時(shí)應(yīng)遵循以下規(guī)則:(1)中斷函數(shù)不能進(jìn)行參數(shù)傳遞,如果中斷函數(shù)中包含任何參數(shù)聲明都將導(dǎo)致編譯出錯(cuò)。(2)中斷函數(shù)沒(méi)有返回值,如果企圖定義一個(gè)返回值將得到不正確的結(jié)果。(3)在任何情況下都不能直接調(diào)用中斷函數(shù),否則會(huì)產(chǎn)生編譯錯(cuò)誤。(4)如果中斷函數(shù)中用到浮點(diǎn)運(yùn)算,必須保存浮點(diǎn)寄存器的狀態(tài),當(dāng)沒(méi)有其他程序執(zhí)行浮點(diǎn)運(yùn)算時(shí)可以不保存。(5)如果在中斷函數(shù)中
36、調(diào)用了其它函數(shù),則被調(diào)用函數(shù)所使用的寄存器組必須與中斷函數(shù)相同。(6)C51編譯器從絕對(duì)地址8n3處產(chǎn)生一個(gè)中斷向量,其中n為中斷號(hào)。該向量包含一個(gè)到中斷函數(shù)入口地址的絕對(duì)跳轉(zhuǎn)。函 數(shù)函數(shù)的返回值 return return是用來(lái)使函數(shù)立即結(jié)束并返回原調(diào)用函數(shù)的指令,而且可以把函數(shù)內(nèi)的最后結(jié)果數(shù)據(jù)傳回給原調(diào)用函數(shù)。 編譯預(yù)處理命令文件包含 文件包含是指一個(gè)程序文件將另一個(gè)指定文件的全部?jī)?nèi)容包含進(jìn)來(lái)。文件包含命令的功能是用指定文件的全部?jī)?nèi)容替換該預(yù)處理行。文件包含命令的一般格式為:#include 或 #include “文件名”。 編譯預(yù)處理命令宏定義 宏定義命令為#define,它的作用是用
37、一個(gè)宏定義來(lái)替換一個(gè)字符串,而這個(gè)字符串既可以是常數(shù),也可以是其他字符串,甚至還可以是帶參數(shù)的宏。 宏定義的一般格式: #define 宏名 字符串 以一個(gè)宏名稱來(lái)代表一個(gè)字符串,即當(dāng)程序任何地方使用到宏名稱時(shí),則將以所代表的字符串來(lái)替換。宏的定義可以是一個(gè)常數(shù)、表達(dá)式,或含有參數(shù)的表達(dá)式,在程序中如果多次使用宏,則會(huì)占用較多的內(nèi)存,但執(zhí)行速度較快。 編譯預(yù)處理命令條件編譯 一般情況下對(duì)C語(yǔ)言程序進(jìn)行編譯時(shí),所有的程序行都參加編譯,但是有時(shí)希望對(duì)其中一部分內(nèi)容只在滿足一定條件時(shí)才進(jìn)行編譯,這就是所謂的條件編譯。條件編譯可以選擇不同的編譯范圍,從而產(chǎn)生不同的代碼。 條件編譯命令格式: #if 表
38、達(dá)式 #else #endif 如果表達(dá)式成立,則編譯#if 下的程序,否則編譯#else下的程序,#endif為結(jié)束條件表達(dá)式編譯。#ifdef 宏名; 如果宏名稱已被定義過(guò),則編譯以下的程序。#ifndef 宏名; 如果宏名稱未被定義過(guò),則編譯以下的程序。 條件表達(dá)式編譯通常用來(lái)調(diào)試,保留程序(但不編譯),或者有兩種狀況而須做不同處理的程序編寫時(shí)使用。 編譯預(yù)處理命令用typedef重新定義數(shù)據(jù)類型名稱 在C語(yǔ)言中除了可以采用前面介紹的數(shù)據(jù)類型之外,用戶還可以根據(jù)自己的需要對(duì)數(shù)據(jù)類型重新定義。 數(shù)據(jù)類型重新定義的方法如下: typedef 已有的數(shù)據(jù)類型 新的數(shù)據(jù)類型名;例如:typede
39、f bit bit ;可以用bit作為bit數(shù)據(jù)類型。typedef bit bool;可以用bool作為bit數(shù)據(jù)類型。typedef unsigned char byte;可以用byte 作為unsigned char數(shù)據(jù)類型。typedef unsigned int word;可以用word作為unsigned int數(shù)據(jù)類型。typedef unsigned long long:可以用long 作為unsigned long數(shù)據(jù)類型。 C51程序設(shè)計(jì)舉例例10-10: 求z=xy/k# include # include void main (void)unsigned char id
40、ata x , y , k , z;z=xy/k; C51程序設(shè)計(jì)舉例例10-11: 如圖10-2所示,8051的P1.0、P1.1、P1.2、P1.4分別接入4支發(fā)光二極管L0、L1、L2、L3,P3.0、P3.1、P3.2、P3.4分別接4支開關(guān)K0、K1、K2、K3,開關(guān)斷開對(duì)應(yīng)的發(fā)光二極管亮,開關(guān)閉合對(duì)應(yīng)的發(fā)光二極管滅。 圖10-2 開關(guān)控制發(fā)光二極管接口電路 C51程序設(shè)計(jì)舉例C51編程如下:#include /預(yù)處理命令#includevoid main(void) /主函數(shù)unsigned char buf; /變量說(shuō)明P1=0 xff; /P1口全置1while(1)buf=P3; /讀P3口狀態(tài)if(buf&0 x01)=0 x01) P1=(P1&0 x00)|0 x01; else if (buf&0 x02)=0 x02) P1=(P1&0 x00)|0 x02; else if (buf&0 x04)=0 x
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 滁州一模考試數(shù)學(xué)試卷
- 餐飲業(yè)廚房砌墻施工合同
- 企業(yè)并購(gòu)差旅費(fèi)開支管理辦法
- 眼鏡代銷協(xié)議書模板
- 精密儀器防塵儲(chǔ)存
- 初中月考答案數(shù)學(xué)試卷
- 網(wǎng)吧員工健康與安全培訓(xùn)
- 安陽(yáng)中考2024數(shù)學(xué)試卷
- 2025年河源貨運(yùn)從業(yè)資格證科目一考試答案
- 劇院舞臺(tái)電梯維護(hù)施工協(xié)議
- 路面基層允許彎沉值計(jì)算+彎沉系數(shù)圖+允許彎沉值計(jì)算公式
- 連鑄意外事故處理
- 國(guó)家開放大學(xué)(中央廣播電視大學(xué))報(bào)名登記表【模板】
- 新職業(yè)英語(yǔ)1-基礎(chǔ)篇-Unit 3(課堂PPT)
- 公司各部門協(xié)作情況互評(píng)表滿意度調(diào)查表
- 第二章水準(zhǔn)測(cè)量PPT課件
- 長(zhǎng)輸管道原油輸送基本知識(shí)
- 完美世界的材料
- 藻類名稱(漢拉對(duì)照)
- 勞資專管員任命書
- 1百家姓全文帶拼音打印
評(píng)論
0/150
提交評(píng)論