單片機(jī)原理、應(yīng)用以及程序設(shè)計(jì)_第1頁(yè)
單片機(jī)原理、應(yīng)用以及程序設(shè)計(jì)_第2頁(yè)
單片機(jī)原理、應(yīng)用以及程序設(shè)計(jì)_第3頁(yè)
單片機(jī)原理、應(yīng)用以及程序設(shè)計(jì)_第4頁(yè)
單片機(jī)原理、應(yīng)用以及程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩101頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、單片機(jī)原理、應(yīng)用以及程序設(shè)計(jì)C,C51及匯編的區(qū)別1單片機(jī)C語(yǔ)言程序設(shè)計(jì)C51基本元素2C51運(yùn)算符和表達(dá)式3C51語(yǔ)句和控制結(jié)構(gòu)4C51函數(shù)5C,C51及匯編的區(qū)別1一C語(yǔ)言的程序結(jié)構(gòu)每個(gè)C語(yǔ)言程序由一個(gè)或多個(gè)函數(shù)組成,在這些函數(shù)中至少應(yīng)包含一個(gè)主函數(shù)main()。程序總是從main()函數(shù)開始執(zhí)行,執(zhí)行到main()函數(shù)結(jié)束則結(jié)束。在main()函數(shù)中調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用。3.1 C,C51及匯編的區(qū)別C語(yǔ)言程序結(jié)構(gòu)一般如下:預(yù)處理命令 #include#define uchar unsigned char#define uint unsigned intsbit LED=

2、P10;功能函數(shù)主函數(shù)void DelayMS(uint x)uchar i;while(x-)for(i=0;i120;i+);void main()while(1)LED=LED;DelayMS(150); C語(yǔ)言與MCS-51單片機(jī)用匯編語(yǔ)言編寫MCS51單片機(jī)程序必須要考慮其存儲(chǔ)器結(jié)構(gòu),尤其必須考慮其片內(nèi)數(shù)據(jù)存儲(chǔ)器與特殊功能寄存器的使用以及按實(shí)際地址處理端口數(shù)據(jù)。用C語(yǔ)言編寫的MCS51單片機(jī)應(yīng)用程序,則不用像匯編語(yǔ)言那樣須具體組織、分配存儲(chǔ)器資源和處理端口數(shù)據(jù),但在C語(yǔ)言編程中,對(duì)數(shù)據(jù)類型與變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。二、C,C51及匯編

3、的區(qū)別C語(yǔ)言編寫單片機(jī)應(yīng)用程序時(shí),需根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量,而標(biāo)準(zhǔn)的C語(yǔ)言程序不需要考慮這些問(wèn)題;C51包含的數(shù)據(jù)類型、變量存儲(chǔ)模式、輸入輸出處理、函數(shù)等方面與標(biāo)準(zhǔn)的C語(yǔ)言有一定的區(qū)別。其它的語(yǔ)法規(guī)則、程序結(jié)構(gòu)及程序設(shè)計(jì)方法等與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同。C51與C程序的區(qū)別二、C,C51及匯編的區(qū)別三、 C51程序結(jié)構(gòu)(1)C51中定義的庫(kù)函數(shù)和標(biāo)準(zhǔn)C語(yǔ)言定義的庫(kù)函數(shù)不同。(2)C51中的數(shù)據(jù)類型與標(biāo)準(zhǔn)C的數(shù)據(jù)類型也有一定的區(qū)別,在C51中還增加了幾種針對(duì)MCS-51單片機(jī)特有的數(shù)據(jù)類型;(3)C51變量的存儲(chǔ)模式與標(biāo)準(zhǔn)C中變量的存儲(chǔ)模式不一樣,C51中變量的存儲(chǔ)

4、模式是與MCS-51單片機(jī)的存儲(chǔ)器緊密相關(guān);(4)C51與標(biāo)準(zhǔn)C的輸入輸出處理不一樣,C51中的輸入輸出是通過(guò)MCS-51串行口來(lái)完成的,輸入輸出指令執(zhí)行前必須要對(duì)串行口進(jìn)行初始化;(5)C51與標(biāo)準(zhǔn)C在函數(shù)使用方面也有一定的區(qū)別,C51中有專門的中斷函數(shù)。單片機(jī)C語(yǔ)言程序設(shè)計(jì)C51基本元素2C51運(yùn)算符和表達(dá)式3C51語(yǔ)句和控制結(jié)構(gòu)4C51函數(shù)5C51基本元素2C,C51及匯編的區(qū)別13.2 C51的基本元素3.2.1 常量常量是指在程序執(zhí)行過(guò)程中其值不能改變的量。在C51中支持整型常量、浮點(diǎn)型常量、字符型常量和字符串型常量。十進(jìn)制整數(shù)。如234、-56、0等。十六進(jìn)制整數(shù)。以0 x開頭表示

5、,如0 x12表示12H。長(zhǎng)整數(shù)。在C51中當(dāng)一個(gè)整數(shù)的值達(dá)到長(zhǎng)整型的范圍,則該數(shù)按長(zhǎng)整型存放,在存儲(chǔ)器中占四個(gè)字節(jié),另外,如一個(gè)整數(shù)后面加一個(gè)字母L,這個(gè)數(shù)在存儲(chǔ)器中也按長(zhǎng)整型存放。如123L在存儲(chǔ)器中占四個(gè)字節(jié)。一整型常量浮點(diǎn)型常量也就是實(shí)型常數(shù)。有十進(jìn)制表示形式和指數(shù)表示形式。十進(jìn)制表示形式,如、等指數(shù)表示形式,如:e-3、e2等二浮點(diǎn)型常量三字符型常量字符型常量是用單引號(hào)引起的字符,如a、1、F等??梢允强娠@示的ASCII字符,也可以是不可顯示的控制字符。對(duì)不可顯示的控制字符須在前面加上反斜杠“”組成轉(zhuǎn)義字符。 轉(zhuǎn)義字符含 義ASCII碼(十六進(jìn)制數(shù)) 0空字符(null)00H n換

6、行符(LF)0AH r回車符(CR)0DH t水平制表符(HT)09H b退格符(BS)08H f換頁(yè)符(FF)0CH 單引號(hào)27H ”雙引號(hào)22H 反斜杠5CH 字符串型常量由雙引號(hào)“”括起的字符組成。如“D”、“1234”、“ABCD”等。一個(gè)字符串常量在內(nèi)存中存放時(shí)不僅雙引號(hào)內(nèi)的字符一個(gè)占一個(gè)字節(jié),而且系統(tǒng)會(huì)自動(dòng)的在后面加一個(gè)轉(zhuǎn)義字符“0”作為字符串結(jié)束符。如字符常量 A 和字符串常量 “A” 是不一樣的。四字符串型常量 C51允許將程序中的常量定義為一個(gè)標(biāo)識(shí)符,稱為符號(hào)常量。標(biāo)識(shí)符一般用大寫字母#define PI#define TRUE 1#define FALSE 0#define

7、 STAR *五符號(hào)常量變量在使用前必須對(duì)變量進(jìn)行定義,定義的格式如下: 存儲(chǔ)種類 數(shù)據(jù)類型說(shuō)明符 存儲(chǔ)器類型 變量名1=初值,變量名2初值;3.2.2 變量一數(shù)據(jù)類型說(shuō)明符1、11個(gè)基本類型說(shuō)明符,如:unsinged int/singed int;2、在C51中,為了增加程序的可讀性,允許用戶為系統(tǒng)固有的數(shù)據(jù)類型說(shuō)明符用typedef或#define起別名,格式如下: typedef c51固有的數(shù)據(jù)類型說(shuō)明符 別名; 或 #define 別名 C51固有的數(shù)據(jù)類型說(shuō)明符;【例3-2】 typedef或#define的使用。typedef unsigned int WORD;#define

8、 BYTE unsigned charBYTE a1=0 x12;WORD a2=0 x1234;有signed char和unsigned char之分,默認(rèn)為signed char。長(zhǎng)度均為一個(gè)字節(jié),用于存放一個(gè)單字節(jié)的數(shù)據(jù)。signed char,它用于定義帶符號(hào)字節(jié)數(shù)據(jù),其字節(jié)的最高位為符號(hào)位,“0”表示正數(shù),“1”表示負(fù)數(shù);unsigned char,它用于定義無(wú)符號(hào)字節(jié)數(shù)據(jù)或字符,可以存放一個(gè)字節(jié)的無(wú)符號(hào)數(shù)。unsigned char可以用來(lái)存放無(wú)符號(hào)數(shù),也可以存放西文字符,在計(jì)算機(jī)內(nèi)部用ASCII碼存放。 1字符型char11個(gè)基本數(shù)據(jù)類型分signed int和unsigned

9、 int。默認(rèn)為signed int。長(zhǎng)度均為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。signed int,用于存放兩字節(jié)帶符號(hào)數(shù),補(bǔ)碼表示,數(shù)的范疇為-32768+32767。unsigned int,用于存放兩字節(jié)無(wú)符號(hào)數(shù),數(shù)的范圍為065535。2int整型unsigned int u=0 x12341234地址+0+1高位存放在低字節(jié)分signed long和unsigned long。默認(rèn)為signed long。長(zhǎng)度均為四個(gè)字節(jié),用于存放一個(gè)四字節(jié)數(shù)據(jù)。signed long,用于存放四字節(jié)帶符號(hào)數(shù),補(bǔ)碼表示,數(shù)的范疇為-2147483648+2147483647。unsigned lo

10、ng,用于存放四字節(jié)無(wú)符號(hào)數(shù),數(shù)的范圍為04294967295。3long長(zhǎng)整型 float型數(shù)據(jù)的長(zhǎng)度為四個(gè)字節(jié),格式符合IEEE-754標(biāo)準(zhǔn)的單精度浮點(diǎn)型數(shù)據(jù),包含指數(shù)和尾數(shù)兩部分,最高位為符號(hào)位,“1”表示負(fù)數(shù),“0”表示正數(shù),其次的8位為階碼,最后的23位為尾數(shù)的有效數(shù)位。 4float浮點(diǎn)型8位階碼23位尾數(shù)數(shù)符階碼的符號(hào)指針型本身就是一個(gè)變量,在這個(gè)變量中存放的指向另一個(gè)數(shù)據(jù)的地址。這個(gè)指針變量要占用一定的內(nèi)存單元,對(duì)不同的處理器其長(zhǎng)度不一樣,在C51中它的長(zhǎng)度一般為13個(gè)字節(jié)。5* 指針型C51擴(kuò)充的數(shù)據(jù)類型,用于訪問(wèn)MCS-51單片機(jī)中的特殊功能寄存器數(shù)據(jù)分sfr和sfr16兩

11、種類型sfr為字節(jié)型特殊功能寄存器類型,占一個(gè)內(nèi)存單元,利用它可以訪問(wèn)MCS-51內(nèi)部的所有特殊功能寄存器;sfr16為雙字節(jié)型特殊功能寄存器類型,利用它可以訪問(wèn)MCS-51內(nèi)部的所有兩個(gè)字節(jié)的特殊功能寄存器。在C51中對(duì)特殊功能寄存器的訪問(wèn)必須先用sfr或sfr16進(jìn)行聲明。6特殊功能寄存器型C51中擴(kuò)充的數(shù)據(jù)類型,用于訪問(wèn)MCS-51單片機(jī)中的可尋址的位單元。兩種位類型:bit型和sbit型。它們?cè)趦?nèi)存中都只占一個(gè)二進(jìn)制位,其值可以是“1”或“0”。用bit定義的位變量在C51編譯器編譯時(shí),在不同的時(shí)候位地址是可以變化的用sbit定義的位變量必須與MCS-51單片機(jī)的一個(gè)可以尋址位單元或可

12、位尋址的字節(jié)單元中的某一位聯(lián)系在一起,在C51編譯器編譯時(shí),其對(duì)應(yīng)的位地址是不可變化的。7位類型基本數(shù)據(jù)類型長(zhǎng)度取值范圍unsigned char1字節(jié)0255signed char1字節(jié)-128+127unsigned int2字節(jié)065535signed int2字節(jié)-32768+32767unsigned long4字節(jié)04294967295signed long4字節(jié)-2147483648+2147483647float4字節(jié)1.175494E-383.402823E+38bit1位0或1sbit1位0或1sfr1字節(jié)0255sfr162字節(jié)065535C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類型的隱式

13、轉(zhuǎn)換,隱式轉(zhuǎn)換的優(yōu)先級(jí)順序如下:bitcharintlongfloatsignedunsignedC5l編譯器除了能支持以上這些基本數(shù)據(jù)類型之外,還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型。在C51中規(guī)定變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個(gè)字母必須為字母或下劃線。變量名有兩種:普通變量名和指針變量名。它們的區(qū)別是指針變量名前面要帶“*”號(hào)。二變量名存儲(chǔ)種類是指變量在程序執(zhí)行過(guò)程中的作用范圍。C51變量的存儲(chǔ)種類:自動(dòng)(auto)、外部(extern)、靜態(tài)(static)和寄存器(register)。1auto:自動(dòng)變量,其作

14、用范圍在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部,當(dāng)定義它的函數(shù)體或復(fù)合語(yǔ)句執(zhí)行時(shí),C51才為該變量分配內(nèi)存空間,結(jié)束時(shí)占用的內(nèi)存空間釋放。定義變量時(shí)如果省略存儲(chǔ)種類,則該變量默認(rèn)為自動(dòng)(auto)變量。2register:寄存器變量。它定義的變量存放在CPU內(nèi)部的寄存器中,處理速度快,但數(shù)目少。C51編譯器編譯時(shí)能自動(dòng)識(shí)別程序中使用頻率最高的變量,并自動(dòng)將其作為寄存器變量,用戶可以無(wú)需專門聲明。三存儲(chǔ)種類3extern:外部變量。在一個(gè)函數(shù)體內(nèi),要使用一個(gè)已在該函數(shù)體外或別的程序中定義過(guò)的外部變量時(shí),該變量在該函數(shù)體內(nèi)要用extern說(shuō)明。外部變量被定義后分配固定的內(nèi)存空間,在程序整個(gè)執(zhí)行時(shí)間內(nèi)都有效,

15、直到程序結(jié)束才釋放。4static:靜態(tài)變量。它又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在對(duì)應(yīng)的函數(shù)體內(nèi)有效,一直存在,但在函數(shù)體外不可見,這樣不僅使變量在定義它的函數(shù)體外被保護(hù),還可以實(shí)現(xiàn)當(dāng)離開函數(shù)時(shí)值不被改變。存儲(chǔ)器類型是用于指明變量所處的單片機(jī)的存儲(chǔ)器區(qū)域情況。存儲(chǔ)器類型描 述 data直接尋址的片內(nèi)RAM低128B,訪問(wèn)速度快 bdata片內(nèi)RAM的可位尋址區(qū)(20H2FH),允許字節(jié)和位混合訪問(wèn) idata間接尋址訪問(wèn)的片內(nèi)RAM,允許訪問(wèn)全部片內(nèi)RAM pdata用Ri間接訪問(wèn)的片外RAM的低256B xdata用DPTR間接訪問(wèn)的片外RAM,

16、允許訪問(wèn)全部64k片外RAM code程序存儲(chǔ)器ROM64k空間定義變量時(shí)也可以省“存儲(chǔ)器類型”,省時(shí)C51編譯器將按編譯模式默認(rèn)存儲(chǔ)器類型。四存儲(chǔ)器類型(難點(diǎn))【例3-3】變量定義存儲(chǔ)種類和存儲(chǔ)器類型相關(guān)情況。 char data varl; /*在片內(nèi)RAM低128B定義用直接尋址方式訪問(wèn)的字符型變量var1*/ int idata var2; /*在片內(nèi)RAM256B定義用間接尋址方式訪問(wèn)的整型變量var2*/ auto unsigned long data var3; /*在片內(nèi)RAM128B定義用直接尋址方式訪問(wèn)的自動(dòng)無(wú)符號(hào)長(zhǎng)整型變量var3*/ extern float xdata

17、 var4; /*在片外RAM64KB空間定義用間接尋址方式訪問(wèn)的外部實(shí)型變量var4*/ int code var5; /*在ROM空間定義整型變量var5*/ unsigned char bdata var6; /*在片內(nèi)RAM位尋址區(qū)20H2FH單元定義可字節(jié)處理和位處理的無(wú)符號(hào)字符型變量var6*/變量在使用前必須對(duì)變量進(jìn)行定義,定義的格式如下: 存儲(chǔ)種類 數(shù)據(jù)類型說(shuō)明符 存儲(chǔ)器類型 變量名1=初值,變量名2初值;上節(jié)回顧常量變量常量是指在程序執(zhí)行過(guò)程中其值不能改變的量。在C51中支持整型常量、浮點(diǎn)型常量、字符型常量和字符串型常量?;緮?shù)據(jù)類型長(zhǎng)度取值范圍unsigned char1字

18、節(jié)0255signed char1字節(jié)-128+127unsigned int2字節(jié)065535signed int2字節(jié)-32768+32767unsigned long4字節(jié)04294967295signed long4字節(jié)-2147483648+2147483647float4字節(jié)1.175494E-383.402823E+38bit1位0或1Sbit1位0或1sfr1字節(jié)0255sfr162字節(jié)065535存儲(chǔ)器類型是用于指明變量所處的單片機(jī)的存儲(chǔ)器區(qū)域情況。存儲(chǔ)器類型描 述 data直接尋址的片內(nèi)RAM低128B,訪問(wèn)速度快 bdata片內(nèi)RAM的可位尋址區(qū)(20H2FH),允許字節(jié)

19、和位混合訪問(wèn) idata間接尋址訪問(wèn)的片內(nèi)RAM,允許訪問(wèn)全部片內(nèi)RAM pdata用Ri間接訪問(wèn)的片外RAM的低256B xdata用DPTR間接訪問(wèn)的片外RAM,允許訪問(wèn)全部64k片外RAM code程序存儲(chǔ)器ROM64k空間定義變量時(shí)也可以省“存儲(chǔ)器類型”,省時(shí)C51編譯器將按編譯模式默認(rèn)存儲(chǔ)器類型。DATA區(qū)的尋址最快,所以應(yīng)該把經(jīng)常使用的變量放在DATA區(qū),但存儲(chǔ)空間有限。(需考慮系統(tǒng)寄存器組,堆??臻g) unsinged char data system_status=0; /*在片內(nèi)RAM低128B定義無(wú)符號(hào)字符型變量*/ unsigned int data unit_id; /

20、*在片內(nèi)RAM128B定義用整型變量*/ auto unsigned long data var3; /*在片內(nèi)RAM128B定義用直接尋址方式訪問(wèn)的自動(dòng)無(wú)符號(hào)長(zhǎng)整型變量var3*/ (1)DATA區(qū)變量BDATA區(qū)是DATA中的可位尋址區(qū)(20H-2FH),在這個(gè)區(qū)中聲明變量,就可以進(jìn)行位尋址。 unsinged char bdata status_byte; /*在片內(nèi)RAM20H-2FH定義無(wú)符號(hào)字符型變量*/ unsigned int bdata status_word; /*在片內(nèi)RAM128B定義用整型變量*/ sbit stat_flag=status_byte4; /*將sta

21、tus_byte的第4位設(shè)為位變量stat_flag*/ if (status_word12) stat_flag=1; (2)BDATA區(qū)變量在C51中,允許用戶對(duì)這些特殊功能寄存器進(jìn)行訪問(wèn),訪問(wèn)時(shí)須通過(guò)sfr或sfr16類型說(shuō)明符進(jìn)行定義,定義時(shí)須指明它們所對(duì)應(yīng)的片內(nèi)RAM單元的地址。格式如下: sfr或sfr16 特殊功能寄存器名=地址; sfr用于對(duì)MCS-51單片機(jī)中單字節(jié)的特殊功能寄存器進(jìn)行定義,sfr16用于對(duì)雙字節(jié)特殊功能寄存器進(jìn)行定義。特殊功能寄存器名一般用大寫字母表示。地址一般用直接地址形式。五特殊功能寄存器變量【例3-4】特殊功能寄存器的定義。 sfr PSW=0 xd0

22、; sfr P1=0 x90; sfr SCON=0 x98; sfr16 DPTR=0 x82; sfr TMOD=0 x89; sfr16 T0=0X8A;預(yù)處理命令#include #include 在C51中,bit和sbit??梢远x兩種位變量bit位類型符用于定義一般的位變量。格式如下: bit 位變量名; 在格式中可以加上各種修飾,但注意存儲(chǔ)器類型只能是bdata、data、idata。只能是片內(nèi)RAM的可位尋址區(qū),嚴(yán)格來(lái)說(shuō)只能是bdata?!纠?-5】 bit型變量的定義。bit data a1; /*正確*/bit bdata a2; /*正確*/bit pdata a3;

23、/*錯(cuò)誤*/bit xdata a4; /*錯(cuò)誤*/六位變量 sbit位類型符用于定義在可位尋址字節(jié)或特殊功能寄存器中的位,定義時(shí)須指明其位地址,可以是位直接地址,可以是可位尋址變量帶位號(hào),也可以是特殊功能寄存器名帶位號(hào)。格式如下: sbit 位變量名=位地址;1、位地址若是位直接地址,其取值范圍為0 x000 xff;2、位地址若是可位尋址變量帶位號(hào)或特殊功能寄存器名帶位號(hào),則在它前面須對(duì)可位尋址變量或特殊功能寄存器進(jìn)行定義。【例3-6】sbit型變量的定義。sbit OV=0 xd2;sbit CY=oxd7;unsigned char bdata flag;sbit flag0=flag

24、0;sfr P1=0 x90;sbit P1_0=P10; sbit P1_4=P14;sbit P1_1=P11; sbit P1_5=P15;sbit P1_2=P12; sbit P1_6=P16; sbit P1_3=P13; sbit P1_7=P17;預(yù)處理命令#include if (P1_3)bit direction_bit;direction_bit=P1_6&P1_3;P1_5= direction_bit;flag0=1; sfr P1=0 x90;/P1口的SFR定義sfr P3=0 xB0;/P3口的SFR定義sbit DIPswitch=P14;/P1口位4的DI

25、P開關(guān)輸入sbit greenLED=P15;/P1口位5的綠LED輸出void main(void) unsigned char data inval; inval=0; /inval的初始化值 while(1) P1=0 xFF; /準(zhǔn)備讀P1引腳if (DIPswitch=0) /檢查輸入是否為低 inval=P1&0 x0f; /讀P1的低4位 greenLED=1; /亮綠燈 P3=( P3&0 xf0 ) | ( P1&0 x0f ); /值輸出到else greenLED=0; /滅綠燈 例:片內(nèi)I/O口及其位的定義單片機(jī)C語(yǔ)言程序設(shè)計(jì)C51基本元素2C51運(yùn)算符和表達(dá)式3C51

26、語(yǔ)句和控制結(jié)構(gòu)4C51函數(shù)5C,C51及匯編的區(qū)別1C51運(yùn)算符和表達(dá)式33. 3 C51的運(yùn)算符及表達(dá)式 賦值運(yùn)算符“=”,將一個(gè)數(shù)據(jù)的值賦給一個(gè)變量,如x=10。 利用賦值運(yùn)算符將一個(gè)變量與一個(gè)表達(dá)式連接起來(lái)的式子稱為賦值表達(dá)式 在賦值表達(dá)式的后面加一個(gè)分號(hào)“;”就構(gòu)成了賦值語(yǔ)句,一個(gè)賦值語(yǔ)句的格式如下: 變量=表達(dá)式; 執(zhí)行時(shí)先計(jì)算出右邊表達(dá)式的值,然后賦給左邊的變量。例如: x=8+9; /*將8+9的值賦紿變量x*/ x=y=5; /*將常數(shù)5同時(shí)賦給變量x和y*/ 一、 賦值運(yùn)算符在C51中,允許在一個(gè)語(yǔ)句中同時(shí)給多個(gè)變量賦值,賦值順序自右向左。C51中支持的算術(shù)運(yùn)算符有:+ 加或

27、取正值運(yùn)算符- 減或取負(fù)值運(yùn)算符 * 乘運(yùn)算符/ 除運(yùn)算符 % 取余運(yùn)算符二、 算術(shù)運(yùn)算符相除的兩個(gè)數(shù)為浮點(diǎn)數(shù),則運(yùn)算的結(jié)果也為浮點(diǎn)數(shù);相除的兩個(gè)數(shù)為整數(shù),則運(yùn)算的結(jié)果也為整數(shù),即為整除結(jié)果為,而25/20結(jié)果為1C51中有6種關(guān)系運(yùn)算符: 大于= 大于等于3,結(jié)果為真(1),而10= =100,結(jié)果為假(0)。四、 邏輯運(yùn)算符C51有3種邏輯運(yùn)算符:| 邏輯或& 邏輯與! 邏輯非邏輯與,格式: 條件式1 & 條件式2 當(dāng)條件式1與條件式2都為真時(shí)結(jié)果為真(非0值邏輯或,格式: 條件式1 | 條件式2 當(dāng)條件式1與條件式2都為假時(shí)結(jié)果為假(0值邏輯非,格式: !條件式例如:若a=8,b=3,c

28、=0,則!a為假,a & b為真,b & c為假五、 位運(yùn)算符位運(yùn)算是按位對(duì)變量進(jìn)行運(yùn)算,但并不改變參與運(yùn)算的變量的值。C51中的位運(yùn)算符有:& 按位與| 按位或 按位異或 按位取反 右移【例3-10】設(shè)a=0 x54=01010100B,b=0 x3b=00111011B,則a&b、a|b、ab、a、a2分別為多少? a&b=00010000b=0 x10。 a|b=01111111B=0 x7f。 ab=01101111B=0 x6f。 a=10101011B=0 xab。 a2=00001110B=0 x0e。a=a2【例3-11】設(shè)a=11000011B,編程實(shí)現(xiàn)將a的循環(huán)右移2位?分

29、析:實(shí)現(xiàn)將a的循環(huán)右移n位,即將左邊的(8-n)位右移n位,將原來(lái)右端的n位移到最左邊1)將a的右端n位先放到b中的高n位中b=an3)將b、C或運(yùn)算a=c|ba7a6a5a4a3a2a1a0a1a0a7a6a5a4a3a2a1a000000000a7a6a5a4a3a2main() unsigned char a=0 xc3, b, c; int n=2; b=an; a=c|b;六、 復(fù)合賦值運(yùn)算符C51中支持的復(fù)合賦值運(yùn)算符:+= 加法賦值 = 減法賦值*= 乘法賦值 /= 除法賦值%= 取模賦值 &= 邏輯與賦值|= 邏輯或賦值 = 邏輯異或賦值= 邏輯非賦值 = 右移位賦值=2相當(dāng)于

30、x=x2。在C51語(yǔ)言中,逗號(hào)“,”是一個(gè)特殊的運(yùn)算符,可以用它將兩個(gè)或兩個(gè)以上的表達(dá)式連接起來(lái),稱為逗號(hào)表達(dá)式。一般格式為: 表達(dá)式1,表達(dá)式2,表達(dá)式n 程序執(zhí)行時(shí)對(duì)逗號(hào)表達(dá)式的處理:按從左至右的順序依次計(jì)算出各個(gè)表達(dá)式的值,而整個(gè)逗號(hào)表達(dá)式的值是最右邊的表達(dá)式的值。七、 逗號(hào)運(yùn)算符x=(a=3,6*3) 結(jié)果x的值為18條件運(yùn)算符“?:” ,用它可以將三個(gè)表達(dá)式連接在一起構(gòu)成一個(gè)條件表達(dá)式。格式為: 邏輯表達(dá)式?表達(dá)式1:表達(dá)式2 其功能是先計(jì)算邏輯表達(dá)式的值,當(dāng)邏輯表達(dá)式的值為真(非0值)時(shí),將計(jì)算的表達(dá)式1的值作為整個(gè)條件表達(dá)式的值;當(dāng)邏輯表達(dá)式的值為假(0值)時(shí),將計(jì)算的表達(dá)式2的

31、值作為整個(gè)條件表達(dá)式的值。條件表達(dá)式 max=(ab)?a:b的執(zhí)行結(jié)果:將a和b中較大的數(shù)賦值給變量max。八 、 條件運(yùn)算符為了表示指針變量和它所指向的變量地址之間的關(guān)系,C51中提供了兩個(gè)專門的運(yùn)算符: * 指針運(yùn)算符 & 取地址運(yùn)算符 指針運(yùn)算符“*”放在指針變量前面,通過(guò)它實(shí)現(xiàn)訪問(wèn)以指針變量的內(nèi)容為地址所指向的存儲(chǔ)單元。指針變量p中的地址為2000H,則*p所訪問(wèn)的是地址為2000H的存儲(chǔ)單元,x=*p,實(shí)現(xiàn)把地址為2000H的存儲(chǔ)單元的內(nèi)容送給變量x。 九、 指針與地址運(yùn)算符1、變量的指針就是該變量的地址取地址運(yùn)算符“&”放在變量的前面,通過(guò)它取得變量的地址,變量的地址通常送給指針

32、變量。設(shè)變量x的內(nèi)容為12H,地址為2000H,則&x的值為2000H,如有一指針變量p,則通常用p=&x,實(shí)現(xiàn)將x變量的地址送給指針變量p,指針變量p指向變量x,以后可以通過(guò)*p訪問(wèn)變量x。間接訪問(wèn)方式:要存取變量a中的值時(shí),可以先將變量a的地址放在另一個(gè)變量b中,訪問(wèn)時(shí)先找到變量b,從變量b中取出變量a的地址,然后根據(jù)這個(gè)地址從內(nèi)存單元中取出變量a的值從變量b中取出的不是所訪問(wèn)的數(shù)據(jù),而是訪問(wèn)的數(shù)據(jù)(變量a的值)的地址,這就是指針,變量b稱為指針變量變量的指針就是變量的地址。對(duì)于變量a,如果它所對(duì)應(yīng)的內(nèi)存單元地址為2000H,它的指針就是2000H。指針變量是指一個(gè)專門用來(lái)存放另一個(gè)變量地

33、址的變量,它的值是指針。上面變量b中存放的是變量a的地址,變量b就是一個(gè)指向變量a的指針變量。變量的指針和指針變量10Ha2指針變量的定義數(shù)據(jù)類型說(shuō)明符 存儲(chǔ)器類型 *指針變量名;“數(shù)據(jù)類型說(shuō)明符”說(shuō)明了該指針變量所指向的變量的類型。 int * p1; /*定義一個(gè)指向整型變量的指針變量p1*/char * p2; /*定義一個(gè)指向字符變量的指針變量p2*/char data * p3; /*定義一個(gè)指向字符變量的指針變量p3,該指針訪問(wèn)的數(shù)據(jù)在片內(nèi)數(shù)據(jù)存儲(chǔ)器中,該指針在內(nèi)存中占一個(gè)字節(jié)*/float xdata * p4; /*定義一個(gè)指向字符變量的指針變量p4,該指針訪問(wèn)的數(shù)據(jù)在片外數(shù)據(jù)

34、存儲(chǔ)器中,該指針在內(nèi)存中占兩個(gè)字節(jié)*/3指針變量的引用指針變量是存放另一變量地址的特殊變量,指針變量只能存放地址。指針變量使用時(shí)注意兩個(gè)運(yùn)算符:&和*。“&”是取地址運(yùn)算符,“*”是指針運(yùn)算符int x,* px,* py; /*變量及指針變量定義*/px=&x; /*將變量x的地址賦給指針變量px,使px指向變量x*/* px=5; /*等價(jià)于x=5*/py=px; /*將指針變量px中的地址賦給指針變量py,使指針變量py也指向x*/【例3-29】輸入兩個(gè)整數(shù)x與y,經(jīng)比較后按大小順序輸出。#include /包含特殊功能寄存器庫(kù)#include /包含I/O函數(shù)庫(kù)extern seria

35、l_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) p=p1;p1=p2;p2=p;printf(“max=%d,min=%dn”,*p1,*p2);while(1);程序執(zhí)行結(jié)果:input x and y:4 8max=8,min=4十、 數(shù)組(1)“數(shù)據(jù)類型說(shuō)明符”說(shuō)明了數(shù)組中各個(gè)元素存儲(chǔ)的數(shù)據(jù)的類型。(2)“數(shù)組名”是整個(gè)數(shù)組的標(biāo)識(shí)符,它的取名方法與變量的取名方法相同。(3)“常量表達(dá)式

36、”用于說(shuō)明該數(shù)組的長(zhǎng)度,即該數(shù)組元素的個(gè)數(shù)。(4)“初值部分”用于給數(shù)組元素賦初值,這部分在數(shù)組定義時(shí)屬于可選項(xiàng)。1一維數(shù)組 數(shù)據(jù)類型說(shuō)明符 數(shù)組名常量表達(dá)式=初值,初值第一句定義的5個(gè)元素分別是:x0、x1、x2、x3、x4。第二句定義的3個(gè)元素分別是:y0、y1、y2。賦值情況為:y0=1;y1=2;y2=3。 C51規(guī)定在引用數(shù)組時(shí),只能逐個(gè)引用數(shù)組中的各個(gè)元素,而不能一次引用整個(gè)數(shù)組。但如果是字符數(shù)組則可以一次引用整個(gè)數(shù)組。 unsigned char x5;unsigned int y3=1,2,3;#include /包含特殊功能寄存器庫(kù)#define unsigned int u

37、intuint buf6=1,2,3,4,5,6 main()int i;for (i=0;i6;i+) bufi+=1;while(1); 【例3-27】用數(shù)組計(jì)算,將數(shù)組buf6=1,2,3,4,5,6個(gè)數(shù)據(jù)值均加12字符數(shù)組字符數(shù)組中的每一個(gè)元素都用來(lái)存放一個(gè)字符也可用字符數(shù)組來(lái)存放字符串。字符串以“0”作為結(jié)束符只存放一般字符的字符數(shù)組的賦值與使用和一般的數(shù)組完全相同對(duì)于存放字符串的字符數(shù)組。既可以對(duì)字符數(shù)組的元素逐個(gè)進(jìn)行訪問(wèn),也可以對(duì)整個(gè)數(shù)組按字符串的方式進(jìn)行處理char string110;char string220;#include /包含特殊功能寄存器庫(kù)#include /包

38、含I/O函數(shù)庫(kù)extern serial_initial();main()char string20;serial_initial();printf(“please type any character:”);scanf(“%s”,string);printf(“%sn”,string);while(1);【例3-28】對(duì)字符數(shù)組進(jìn)行輸入和輸出單片機(jī)C語(yǔ)言程序設(shè)計(jì)C51基本元素2C51運(yùn)算符和表達(dá)式3C51語(yǔ)句和控制結(jié)構(gòu)4C51函數(shù)5C,C51及匯編的區(qū)別1C51語(yǔ)句和控制結(jié)構(gòu)43.4 表達(dá)式語(yǔ)句及復(fù)合語(yǔ)句一、表達(dá)式語(yǔ)句在表達(dá)式的后邊加一個(gè)分號(hào)“;”就構(gòu)成了表達(dá)式語(yǔ)句 ,如:a=+b*9;x=

39、8;y=7;+k; 可以一行放一個(gè)表達(dá)式形成表達(dá)式語(yǔ)句也可以一行放多個(gè)表達(dá)式形成表達(dá)式語(yǔ)句每個(gè)表達(dá)式后面都必須帶“;”號(hào),還可以僅由個(gè)分號(hào)“;”占一行形成一個(gè)表達(dá)式語(yǔ)句(空語(yǔ)句) (1)在程序中為有關(guān)語(yǔ)句提供標(biāo)號(hào),用以標(biāo)記程序執(zhí)行的位置。例如采用下面的語(yǔ)句可以構(gòu)成一個(gè)循環(huán)。repeat:; ; goto repeat;空語(yǔ)句的使用場(chǎng)合(2)在用while語(yǔ)句構(gòu)成的循環(huán)語(yǔ)句后面加一個(gè)分號(hào),形成一個(gè)不執(zhí)行其它操作的空循環(huán)體【例3-11】下面這段子程序用于讀取8051單片機(jī)的串行口的數(shù)據(jù),當(dāng)沒有接收到則等待,當(dāng)接收到,接收數(shù)據(jù)后返回,返回值為接收的數(shù)據(jù)。#include char getchar()

40、 char c; while(!RI); /當(dāng)接收中斷標(biāo)志位RI為0則等待,當(dāng) /接收中斷標(biāo)志位為1則結(jié)束等待。 c=SBUF; RI=0; return(c);二、 復(fù)合語(yǔ)句執(zhí)行時(shí),各條單語(yǔ)句按順序依次執(zhí)行,整個(gè)復(fù)合語(yǔ)句在語(yǔ)法上等價(jià)于一條單語(yǔ)句。函數(shù)的執(zhí)行部分(即函數(shù)體)就是一個(gè)復(fù)合語(yǔ)句;在復(fù)合語(yǔ)句內(nèi)部語(yǔ)句所定義的變量,稱為該復(fù)合語(yǔ)句中的局部變量,它僅在當(dāng)前這個(gè)復(fù)合語(yǔ)句中有效。復(fù)合語(yǔ)句是由若干條語(yǔ)句組合而成的一種語(yǔ)句,一般形式為: 局部變量定義; 語(yǔ)句l; 語(yǔ)句2;三、 C51的輸入輸出在C51的標(biāo)準(zhǔn)函數(shù)庫(kù)中提供了一個(gè)名為“stdio.h”的一般I/O函數(shù)庫(kù),當(dāng)中定義了C51中的輸入和輸出函

41、數(shù)。當(dāng)對(duì)輸入和輸出函數(shù)使用時(shí),須先用預(yù)處理命令“#include ”將該函數(shù)庫(kù)包含到文件中。I/O函數(shù)都是通過(guò)串行接口實(shí)現(xiàn),在使用I/O函數(shù)之前,應(yīng)先對(duì)MCS-51單片機(jī)的串行接口和定時(shí)器/計(jì)數(shù)器1進(jìn)行初始化。串行工作于方式1,定時(shí)器/計(jì)數(shù)器1工作于方式2(8位自動(dòng)重載方式),設(shè)系統(tǒng)時(shí)鐘為12MHZ,波特率為2400,則初始化程序如下:SCON=0 x52;TMOD=0X20;TH1=0 xf3;TR1=1;1、格式輸出函數(shù)printf()格式控制是用雙引號(hào)括起來(lái)的字符串,它包括三種信息:格式說(shuō)明符、普通字符和轉(zhuǎn)義字符。(1)格式說(shuō)明符,由“%”和格式字符組成,它的作用是用于指明輸出的數(shù)據(jù)的格

42、式輸出,如%d、%f等(2)普通字符,這些字符按原樣輸出,用來(lái)輸出某些提示信息。(3)轉(zhuǎn)義字符,就是前面介紹的轉(zhuǎn)義字符,用來(lái)輸出特定的控制符,如輸出轉(zhuǎn)義字符n就是使輸出換一行。輸出參數(shù)表是需要輸出的一組數(shù)據(jù),可以是表達(dá)式。printf()函數(shù)的的作用是通過(guò)串行接口輸出若干任意類型的數(shù)據(jù),格式如下:printf(格式控制,輸出參數(shù)表)printf(“input x,y:n”); /輸出提示信息printf(“n”); /輸出換行 printf(“%d+%d=%d”,x,y,x+y);格式字符數(shù)據(jù)類型輸出格式dint帶符號(hào)十進(jìn)制數(shù)uint無(wú)符號(hào)十進(jìn)制數(shù)oint無(wú)符號(hào)八進(jìn)制數(shù)xint無(wú)符號(hào)十六進(jìn)制數(shù)

43、,用“af”表示Xint無(wú)符號(hào)十六進(jìn)制數(shù),用“AF”表示ffloat帶符號(hào)十進(jìn)制數(shù)浮點(diǎn)數(shù),形式為-dddd.dddde,Efloat帶符號(hào)十進(jìn)制數(shù)浮點(diǎn)數(shù),形式為-d.ddddEddg,Gfloat自動(dòng)選擇e或f格式中更緊湊的一種輸出格式cchar單個(gè)字符s指針指向一個(gè)帶結(jié)束符的字符串p指針帶存儲(chǔ)器批示符和偏移量的指針,形式為M:aaaa其中,M可分別為:C(code),D(data),I(idata),P(pdata)如M為a,則表示的是指針偏移量格式說(shuō)明符表printf(“input x,y:n”); /輸出提示信息printf(“n”); /輸出換行 printf(“%d+%d=%d”,x

44、,y,x+y);2、格式輸入函數(shù)scanf()格式控制可以包括以下三種信息:空白字符、普通字符和格式說(shuō)明。(1)空白字符,包含空格、制表符、換行符等(2)普通字符,除了以百分號(hào)“%”開頭的格式說(shuō)明符而外的所有非空白字符,在輸入時(shí)要求原樣輸入。(3)格式說(shuō)明,由百分號(hào)“%”和格式說(shuō)明符組成,用于指明輸入數(shù)據(jù)的格式,它的基本情況與printf()相同。地址列表是由若干個(gè)地址組成,它可以是指針變量、取地址運(yùn)算符“&”加變量(變量的地址)或字符串名(表示字符串的首地址)。scanf()函數(shù)的作用是通過(guò)串行接口實(shí)現(xiàn)數(shù)據(jù)輸入,格式如下:scanf(格式控制,地址列表)格式字符數(shù)據(jù)類型輸出格式dint指針帶

45、符號(hào)十進(jìn)制數(shù)uint指針無(wú)符號(hào)十進(jìn)制數(shù)oint指針無(wú)符號(hào)八進(jìn)制數(shù)xint指針無(wú)符號(hào)十六進(jìn)制數(shù)f,e,Efloat指針浮點(diǎn)數(shù)cchar指針字符sstring指針字符串格式說(shuō)明符表scanf(“%d%d”,&x,&y); /輸入x和y的值#include /包含特殊功能寄存器庫(kù)#include /包含I/O函數(shù)庫(kù)void main(void) /主函數(shù) int x,y; /定義整型變量x和y SCON=0 x52; /串口初始化 TMOD=0 x20; TH1=0XF3; TR1=1; printf(“input x,y:n”); /輸出提示信息 scanf(“%d%d”,&x,&y); /輸入x

46、和y的值 printf(“n”); /輸出換行 printf(“%d+%d=%d”,x,y,x+y); /按十進(jìn)制形式輸出 printf(“n”); /輸出換行 printf(“%xH+%xH=%XH”,x,y,x+y); /按十六進(jìn)制形式輸出 while(1); /結(jié)束【例3-12】 使用格式輸入輸出函數(shù)的例子3.4.2 C51程序基本結(jié)構(gòu)與相關(guān)語(yǔ)句一、 C51的基本結(jié)構(gòu)1、順序結(jié)構(gòu)AB2、選擇結(jié)構(gòu)條件P語(yǔ)句A語(yǔ)句B成立不成立循環(huán)結(jié)構(gòu)又分為兩種:當(dāng)(while)型循環(huán)結(jié)構(gòu)和直到(do.while)型循環(huán)結(jié)構(gòu)。(1)當(dāng)型循環(huán)結(jié)構(gòu)當(dāng)條件P成立(為“真”)時(shí),重復(fù)執(zhí)行語(yǔ)句A,當(dāng)條件不成立(為“假”

47、)時(shí)才停止重復(fù),執(zhí)行后面的程序。3、循環(huán)結(jié)構(gòu)條件P語(yǔ)句A成立不成立圖4.5 當(dāng)型循環(huán)結(jié)構(gòu) (2)直到型循環(huán)結(jié)構(gòu)先執(zhí)行語(yǔ)句A,再判斷條件P,當(dāng)條件成立(為“真”)時(shí),再重復(fù)執(zhí)行語(yǔ)句A,直到條件不成立(為“假”)時(shí)才停止重復(fù),執(zhí)行后面的程序。條件P語(yǔ)句A成立不成立圖4.6 直到型循環(huán)結(jié)構(gòu)構(gòu)成循環(huán)結(jié)構(gòu)的語(yǔ)句主要有:while、do while、for、goto等。if語(yǔ)句通常有三種格式:(1)if (表達(dá)式) 語(yǔ)句;(2)if (表達(dá)式) 語(yǔ)句1; else 語(yǔ)句2;(3)if (表達(dá)式1) 語(yǔ)句1; else if (表達(dá)式2) (語(yǔ)句2;) else if (表達(dá)式3) (語(yǔ)句3;) else

48、if (表達(dá)式n-1) (語(yǔ)句n-1;) else 語(yǔ)句n二、 if語(yǔ)句(1)if (x!=y) printf(“x=%d,y=%dn”,x,y);如果x不等于y,則輸出x的值和y的值。(2)if (xy) max=x; else max=y;使max變量得到x、y中的大數(shù)。(3)if (score=90) printf(“Your result is an An”); else if (score=80) printf(“Your result is an Bn”); else if (score=70) printf(“Your result is an Cn”); else if (sc

49、ore=60) printf(“Your result is an Dn”); else printf(“Your result is an En”);根據(jù)分?jǐn)?shù)score分別打出A、B、C、D、E五個(gè)等級(jí)?!纠?-13】 if語(yǔ)句的用法三、switch/case語(yǔ)句switch (表達(dá)式)case 常量表達(dá)式1:語(yǔ)句1;break;case 常量表達(dá)式2:語(yǔ)句2;break;case 常量表達(dá)式n:語(yǔ)句n;break;default:語(yǔ)句n+1;(1)每個(gè)case語(yǔ)句后面可以有“break”,也可以沒有。有break語(yǔ)句,執(zhí)行到break則退出switch結(jié)構(gòu),若沒有,則會(huì)順次執(zhí)行后面的語(yǔ)句,

50、直到遇到break或結(jié)束。(2)每一個(gè)case語(yǔ)句后面可以帶一個(gè)語(yǔ)句,也可以帶多個(gè)語(yǔ)句,還可以不帶。語(yǔ)句可以用花括號(hào)括起,也可以不括?!纠?-14】 switch/case語(yǔ)句的用法。對(duì)學(xué)生成績(jī)劃分為AD,對(duì)應(yīng)不同的百分制分?jǐn)?shù),要求根據(jù)不同的等級(jí)打印出它的對(duì)應(yīng)百分?jǐn)?shù)??梢酝ㄟ^(guò)下面的switch/case語(yǔ)句實(shí)現(xiàn)。switch(grade)case A: printf(”90100n”);break;case B: printf(”8090n”);break;case C: printf(”7080n”);break;case D: printf(”6070n”);break;case E: p

51、rintf(”60n”);break;Default: printf(”error”n);四、 while語(yǔ)句當(dāng)表達(dá)式為非0(真)時(shí),就重復(fù)執(zhí)行循環(huán)體內(nèi)的語(yǔ)句;當(dāng)表達(dá)式為0(假),則中止while循環(huán),程序?qū)?zhí)行循環(huán)結(jié)構(gòu)之外的下一條語(yǔ)句例4-15】 通過(guò)while語(yǔ)句實(shí)現(xiàn)計(jì)算并輸出1100的累加和。 while(表達(dá)式) 語(yǔ)句; /*循環(huán)體*/#include /包含特殊功能寄存器庫(kù)#include /包含I/O函數(shù)庫(kù)void main(void) /主函數(shù) int i,s=0; /定義整型變量x和yi=1;SCON=0 x52; /串口初始化TMOD=0 x20;TH1=0XF3;TR1=1

52、;while (i=100) /累加1100之和在s中s=s+i;i+;printf(“1+2+3+100=%dn”,s);while(1);程序執(zhí)行的結(jié)果:1+2+3+100=5050五、do while語(yǔ)句先執(zhí)行循環(huán)體中的語(yǔ)句,后判斷表達(dá)式。如表達(dá)式成立(真),則再執(zhí)行循環(huán)體,然后又判斷,直到有表達(dá)式不成立(假)時(shí),退出循環(huán),執(zhí)行do while結(jié)構(gòu)的下一條語(yǔ)句。【例4-16】 計(jì)算并輸出1100的累加和。#include /包含特殊功能寄存器庫(kù)#include /包含I/O函數(shù)庫(kù)void main(void) /主函數(shù) do 語(yǔ)句; /*循環(huán)體*/ while(表達(dá)式);int i,s=

53、0; /定義整型變量x和yi=1;SCON=0 x52; /串口初始化TMOD=0 x20;TH1=0XF3;TR1=1;do /累加1100之和在s中s=s+i;i+;while (i=100);printf(“1+2+3+100=%dn”,s);while(1);程序執(zhí)行的結(jié)果:1+2+3+100=5050六、 for語(yǔ)句for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語(yǔ)句; /*循環(huán)體*/表達(dá)式1表達(dá)式3表達(dá)式2循環(huán)體YN退出循環(huán)#include /包含特殊功能寄存器庫(kù)#include /包含I/O函數(shù)庫(kù)void main(void) /主函數(shù)int i,s=0; /定義整型變量x和ySCON=0

54、 x52; /串口初始化TMOD=0 x20;TH1=0XF3;TR1=1;for (i=1;i=100;i+) s=s+i; /累加1100之和在s中printf(“1+2+3+100=%dn”,s);while(1);【例3-17】 用for語(yǔ)句實(shí)現(xiàn)計(jì)算并輸出1100的累加和。程序執(zhí)行的結(jié)果:1+2+3+100=5050七、循環(huán)的嵌套在一個(gè)循環(huán)的循環(huán)體中允許又包含一個(gè)完整的循環(huán)結(jié)構(gòu),這種結(jié)構(gòu)稱為循環(huán)的嵌套。設(shè)單片機(jī)的晶振為12MHz,編程實(shí)現(xiàn)Xms(如5ms)的通用延時(shí)函數(shù)。/以下的程序能產(chǎn)生x ms的延時(shí)void msec(unsigned int x) unsigned char j;

55、 while(x-) for(j=0;j125;j+)/1ms的延時(shí) ;/ j的內(nèi)部循環(huán)賦值判斷等大約延時(shí)8us for (r=1;r100) break;printf(“%fn”,area);八、break和continue語(yǔ)句1break語(yǔ)句使用break語(yǔ)句還可以從循環(huán)體中跳出循環(huán),提前結(jié)束整個(gè)循環(huán)【例4-19】計(jì)算圓的面積,當(dāng)計(jì)算到面積大于100時(shí),由break語(yǔ)句跳出循環(huán)for (i=100;iy?x:y;return(z);也可以用成這樣:int max(x,y)int x,y;int z;z=xy?x:y;return(z);【例3-21】定義一個(gè)返回兩個(gè)整數(shù)的最大值的函數(shù)max

56、()void int0() interrupt 0 using 1 x+;中斷函數(shù)(interrupt m修飾符)1)中斷函數(shù)無(wú)參數(shù),無(wú)返回值,函數(shù)內(nèi)部無(wú)return語(yǔ)句2)使用interrupt m修飾符m的取值為031,對(duì)應(yīng)的中斷情況如下:0外部中斷01定時(shí)/計(jì)數(shù)器T02外部中斷13定時(shí)/計(jì)數(shù)器T14串行口中斷5定時(shí)/計(jì)數(shù)器T2using n 修飾符修飾符using n用于指定本函數(shù)內(nèi)部使用的工作寄存器組,其中n的取值為03,表示寄存器組號(hào)。(一般用在中斷函數(shù)中) 【例4-22】編寫一個(gè)用于統(tǒng)計(jì)外中斷0的中斷次數(shù)的中斷服務(wù)程序extern int x;void int0() interrupt 0 using 1 x+;extern void int0() interrupt 0 using 1中斷函數(shù)不能作為外部函數(shù)使用二、 函數(shù)的調(diào)用與聲明1函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式如下: 函數(shù)名(實(shí)參列表);對(duì)于有參數(shù)的函數(shù)調(diào)用,若實(shí)參列表包含多個(gè)實(shí)參,則各個(gè)實(shí)參之間用逗號(hào)隔開。 printf(“max is:%dn”,max(a,b) );int max(int x,int y)int z;z=xy?x:y;return(z);max函數(shù)的定義max函數(shù)的調(diào)用2自定義函數(shù)的聲明 extern 函數(shù)類型 函數(shù)名(形式參數(shù)表); 函數(shù)的聲明是把函數(shù)的名字、函數(shù)類型以及形參

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論