版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、單片機(jī)C語(yǔ)言程序設(shè)計(jì)根底2021年3月目錄1 C語(yǔ)言與MCS-512 C51數(shù)據(jù)類型3 C51的運(yùn)算量4 C51的運(yùn)算符及表達(dá)式5 表達(dá)式語(yǔ)句及復(fù)合語(yǔ)句6 C51程序根本結(jié)構(gòu)與相關(guān)語(yǔ)句7 函 數(shù)8 C51構(gòu)造數(shù)據(jù)類型1 C語(yǔ)言與MCS511.1 C語(yǔ)言的特點(diǎn)及程序結(jié)構(gòu)一C語(yǔ)言的特點(diǎn)1語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。2運(yùn)算符豐富。3數(shù)據(jù)結(jié)構(gòu)豐富。具有現(xiàn)代化語(yǔ)言的各種數(shù)據(jù)結(jié)構(gòu)。4可進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)。5可以直接對(duì)計(jì)算機(jī)硬件進(jìn)行操作。6生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。7可移植性好。二C語(yǔ)言的程序結(jié)構(gòu) C語(yǔ)言程序采用函數(shù)結(jié)構(gòu),每個(gè)C語(yǔ)言程序由一個(gè)或多個(gè)函數(shù)組成,在這些函數(shù)中至少應(yīng)包含一個(gè)主函數(shù)m
2、ain(),也可以包含一個(gè)main()函數(shù)和假設(shè)干個(gè)其它的功能函數(shù)。不管main()函數(shù)放于何處,程序總是從main()函數(shù)開始執(zhí)行,執(zhí)行到main()函數(shù)結(jié)束那么結(jié)束。在main()函數(shù)中調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用,但main()函數(shù)只能調(diào)用其它的功能函數(shù),而不能被其它的函數(shù)所調(diào)用。功能函數(shù)可以是C語(yǔ)言編譯器提供的庫(kù)函數(shù),也可以是由用戶定義的自定義函數(shù)。在編制C程序時(shí),程序的開始局部一般是預(yù)處理命令、函數(shù)說(shuō)明和變量定義等。 1.2 C語(yǔ)言與MCS-51單片機(jī) 用C語(yǔ)言編寫MCS-51單片機(jī)程序與用匯編語(yǔ)言編寫MCS51單片機(jī)程序不一樣。用匯編語(yǔ)言編寫MCS51單片機(jī)程序必須要考慮其
3、存儲(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語(yǔ)言編寫單片機(jī)應(yīng)用程序時(shí),需根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量,而標(biāo)準(zhǔn)的C語(yǔ)言程序不需要考慮這些問題; 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ì)相同。用C語(yǔ)言編寫單片
4、機(jī)應(yīng)用程序與標(biāo)準(zhǔn)的C語(yǔ)言程序也有相應(yīng)的區(qū)別: 現(xiàn)在支持MCS-51系列單片機(jī)的C語(yǔ)言編譯器有很多種,如American Automation、Avocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。各種編譯器的根本情況相同,但具體處理時(shí)有一定的區(qū)別,其中KEIL/Franklin以它的代碼緊湊和使用方便等特點(diǎn)優(yōu)于其它編譯器,現(xiàn)在使用特別廣泛。 本章主要以KEIL編譯器介紹MCS-51單片機(jī)C語(yǔ)言程序設(shè)計(jì)。1.3 C51程序結(jié)構(gòu) C51的語(yǔ)法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法都與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同,但C51程序與標(biāo)準(zhǔn)的C程序在以下幾個(gè)方面不一樣:
5、1C51中定義的庫(kù)函數(shù)和標(biāo)準(zhǔn)C語(yǔ)言定義的庫(kù)函數(shù)不同。 標(biāo)準(zhǔn)的C語(yǔ)言定義的庫(kù)函數(shù)是按通用微型計(jì)算機(jī)來(lái)定義的,而C51中的庫(kù)函數(shù)是按MCS-51單片機(jī)相應(yīng)情況來(lái)定義的;2C51中的數(shù)據(jù)類型與標(biāo)準(zhǔn)C的數(shù)據(jù)類型也有一定的區(qū)別,在C51中還增加了幾種針對(duì)MCS-51單片機(jī)特有的數(shù)據(jù)類型;3C51變量的存儲(chǔ)模式與標(biāo)準(zhǔn)C中變量的存儲(chǔ)模式不一樣,C51中變量的存儲(chǔ)模式是與MCS-51單片機(jī)的存儲(chǔ)器緊密相關(guān);4C51與標(biāo)準(zhǔn)C的輸入輸出處理不一樣,C51中的輸入輸出是通過(guò)MCS-51串行口來(lái)完成的,輸入輸出指令執(zhí)行前必須要對(duì)串行口進(jìn)行初始化;5C51與標(biāo)準(zhǔn)C在函數(shù)使用方面也有一定的區(qū)別,C51中有專門的中斷函數(shù)。
6、1.3 C51程序結(jié)構(gòu)2 C51數(shù)據(jù)類型C51的數(shù)據(jù)類型:位型(bit)、無(wú)符號(hào)字符(unsigned char)、有符號(hào)字符(singed char)、無(wú)符號(hào)整型(unsigned int )、有符號(hào)整型(signed int )、無(wú)符號(hào)長(zhǎng)整型(unsigned long )、有符號(hào)長(zhǎng)整型(signed long )、浮點(diǎn)型(float)和指針類型等。一字符型char 有signed char和unsigned char之分,默認(rèn)為signed char。它們的長(zhǎng)度均為一個(gè)字節(jié),用于存放一個(gè)單字節(jié)的數(shù)據(jù)。 對(duì)于signed char,它用于定義帶符號(hào)字節(jié)數(shù)據(jù),其字節(jié)的最高位為符號(hào)位,“0表示
7、正數(shù),“1表示負(fù)數(shù),補(bǔ)碼表示,所能表示的數(shù)值范圍是-128+127; 對(duì)于unsigned char,它用于定義無(wú)符號(hào)字節(jié)數(shù)據(jù)或字符,可以存放一個(gè)字節(jié)的無(wú)符號(hào)數(shù),其取值范圍為0255。unsigned char可以用來(lái)存放無(wú)符號(hào)數(shù),也可以存放西文字符,一個(gè)西文字符占一個(gè)字節(jié),在計(jì)算機(jī)內(nèi)部用ASCII碼存放。 二int整型 分singed int和unsigned int。默認(rèn)為signed int。它們的長(zhǎng)度均為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。對(duì)于signed int,用于存放兩字節(jié)帶符號(hào)數(shù),補(bǔ)碼表示,數(shù)的范疇為-32768+32767。對(duì)于unsigned int,用于存放兩字節(jié)無(wú)符號(hào)數(shù),
8、數(shù)的范圍為065535。三long長(zhǎng)整型 分singed long和unsigned long。默認(rèn)為signed long。它們的長(zhǎng)度均為四個(gè)字節(jié),用于存放一個(gè)四字節(jié)數(shù)據(jù)。對(duì)于signed long,用于存放四字節(jié)帶符號(hào)數(shù),補(bǔ)碼表示,數(shù)的范疇為-2147483648+2147483647。對(duì)于unsigned long,用于存放四字節(jié)無(wú)符號(hào)數(shù),數(shù)的范圍為04294967295。四float浮點(diǎn)型 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ù)位,由
9、于尾數(shù)的整數(shù)局部隱含為“1,所以尾數(shù)的精度為24位。 五* 指針型 指針型本身就是一個(gè)變量,在這個(gè)變量中存放的指向另一個(gè)數(shù)據(jù)的地址。這個(gè)指針變量要占用一定的內(nèi)存單元,對(duì)不同的處理器其長(zhǎng)度不一樣,在C51中它的長(zhǎng)度一般為13個(gè)字節(jié)。六特殊功能存放器型 這是C51擴(kuò)充的數(shù)據(jù)類型,用于訪問MCS-51單片機(jī)中的特殊功能存放器數(shù)據(jù),它分sfr和sfr16兩種類型。其中: sfr為字節(jié)型特殊功能存放器類型,占一個(gè)內(nèi)存單元,利用它可以訪問MCS-51內(nèi)部的所有特殊功能存放器; sfr16為雙字節(jié)型特殊功能存放器類型,占用兩個(gè)字節(jié)單元,利用它可以訪問MCS-51內(nèi)部的所有兩個(gè)字節(jié)的特殊功能存放器。 在C51
10、中對(duì)特殊功能存放器的訪問必須先用sfr或sfr16進(jìn)行聲明。七位類型 這也是C51中擴(kuò)充的數(shù)據(jù)類型,用于訪問MCS-51單片機(jī)中的可尋址的位單元。在C51中,支持兩種位類型:bit型和sbit型。它們?cè)趦?nèi)存中都只占一個(gè)二進(jìn)制位,其值可以是“1或“0。 其中:用bit定義的位變量在C51編譯器編譯時(shí),在不同的時(shí)候位地址是可以變化的,而用sbit定義的位變量必須與MCS-51單片機(jī)的一個(gè)可以尋址位單元或可位尋址的字節(jié)單元中的某一位聯(lián)系在一起,在C51編譯器編譯時(shí),其對(duì)應(yīng)的位地址是不可變化的。基本數(shù)據(jù)類型長(zhǎng)度取值范圍unsigned char1字節(jié)0255signed char1字節(jié)-128+127
11、unsigned 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é)065535KEIL C51編譯器能夠識(shí)別的根本數(shù)據(jù)類型: 在C51語(yǔ)言程序中,有可能會(huì)出現(xiàn)在運(yùn)算中數(shù)據(jù)類型不一致的情況。C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類型的隱式轉(zhuǎn)換,隱式轉(zhuǎn)換的優(yōu)先級(jí)順序如下: bitcharintlongfloat signedunsi
12、gned 也就是說(shuō),當(dāng)char型與int型進(jìn)行運(yùn)算時(shí),先自動(dòng)對(duì)char型擴(kuò)展為int型,然后與int型進(jìn)行運(yùn)算,運(yùn)算結(jié)果為int型。C51除了支持隱式類型轉(zhuǎn)換外,還可以通過(guò)強(qiáng)制類型轉(zhuǎn)換符“對(duì)數(shù)據(jù)類型進(jìn)行人為的強(qiáng)制轉(zhuǎn)換。 C5l編譯器除了能支持以上這些根本數(shù)據(jù)類型之外,還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型,在后面將相繼介紹。 在編程時(shí),如果只強(qiáng)調(diào)運(yùn)算速度而不進(jìn)行負(fù)數(shù)運(yùn)算時(shí),最好采用無(wú)符號(hào)(unsigned)格式。無(wú)符號(hào)字符類型的使用:無(wú)論何時(shí),應(yīng)盡可能使用無(wú)符號(hào)字符變量,因?yàn)樗苤苯颖籑CS-51所接受?;谕瑯拥脑颍矐?yīng)盡量使用位變量
13、。有符號(hào)字符變量雖然也只占用一個(gè)字節(jié),但需要進(jìn)行額外的操作來(lái)進(jìn)行測(cè)試代碼的符號(hào)位。這無(wú)疑會(huì)降低代碼效率。使用簡(jiǎn)化形式定義數(shù)據(jù)類型。其方法是在源程序開頭使用#define語(yǔ)句自定義簡(jiǎn)化的類型標(biāo)識(shí)符。例如:#define uchar unsigned char #define uint unsigned int 這樣,在編程中,就可以用uchar代替unsigned char,用uint代替unsigned int來(lái)定義變量。3 C51的運(yùn)算量3.1 常量3.2 變量3.3 存儲(chǔ)模式3.2.1 數(shù)據(jù)類型說(shuō)明符3.2.2 變量名3.2.3 存儲(chǔ)種類3.2.4 存儲(chǔ)器類型3.2.5 特殊功能存放器變量
14、3.2.6 位變量3.4 絕對(duì)地址的訪問3.1 常量常量是指在程序執(zhí)行過(guò)程中其值不能改變的量。在C51中支持整型常量、浮點(diǎn)型常量、字符型常量和字符串型常量。一整型常量 整型常量也就是整型常數(shù),根據(jù)其值范圍在計(jì)算機(jī)中分配不同的字節(jié)數(shù)來(lái)存放。在C51中它可以表示成以下幾種形式: 十進(jìn)制整數(shù)。如234、-56、0等。 十六進(jìn)制整數(shù)。以0 x開頭表示,如0 x12表示十六進(jìn)制數(shù)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)型常量 浮點(diǎn)型常量也
15、就是實(shí)型常數(shù)。有十進(jìn)制表示形式和指數(shù)表示形式。 十進(jìn)制表示形式又稱定點(diǎn)表示形式,由數(shù)字和小數(shù)點(diǎn)組成。如 0.123、34.645等都是十進(jìn)制數(shù)表示形式的浮點(diǎn)型常量。 指數(shù)表示形式為: 數(shù)字 .數(shù)字 e 數(shù)字 例如:123.456e-3、-3.123e2等都是指數(shù)形式的浮點(diǎn)型常量。三字符型常量 字符型常量是用單引號(hào)引起的字符,如a、1、F等??梢允强娠@示的ASCII字符,也可以是不可顯示的控制字符。對(duì)不可顯示的控制字符須在前面加上反斜杠“組成轉(zhuǎn)義字符。利用它可以完成一些特殊功能和輸出時(shí)的格式控制。常用的轉(zhuǎn)義字符如下表所示。 轉(zhuǎn)義字符含 義ASCII碼(十六進(jìn)制數(shù)) o空字符(null)00H n
16、換行符(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è)字符常量在計(jì)算機(jī)內(nèi)只用一個(gè)字節(jié)存放,而一個(gè)字符串常量在內(nèi)存中存放時(shí)不僅雙引號(hào)內(nèi)的字符一個(gè)占一個(gè)字節(jié),而且系統(tǒng)會(huì)自動(dòng)的在后面加一個(gè)轉(zhuǎn)義字符“o作為字符串結(jié)束符。因此不要將字符常量和字符串常量混淆,如字符常量A和字符串常量“A是不一樣的。3.2 變量變量是在程序運(yùn)行過(guò)程中其值可以改變的量。一個(gè)變量由兩局部組成:
17、變量名和變量值。 在C51中,變量在使用前必須對(duì)變量進(jìn)行定義,指出變量的數(shù)據(jù)類型和存儲(chǔ)模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲(chǔ)單元。定義的格式如下: 存儲(chǔ)種類 數(shù)據(jù)類型說(shuō)明符 存儲(chǔ)器類型 變量名1=初值,變量名2初值;3.2.1 數(shù)據(jù)類型說(shuō)明符 在定義變量時(shí),必須通過(guò)數(shù)據(jù)類型說(shuō)明符指明變量的數(shù)據(jù)類型,指明變量在存儲(chǔ)器中占用的字節(jié)數(shù)??梢允歉緮?shù)據(jù)類型說(shuō)明符,也可以是組合數(shù)據(jù)類型說(shuō)明符,還可以是用typedef定義的類型別名。 在C51中,為了增加程序的可讀性,允許用戶為系統(tǒng)固有的數(shù)據(jù)類型說(shuō)明符用typedef起別名,格式如下: typedef c51固有的數(shù)據(jù)類型說(shuō)明符 別名; 定義別名后,就可以
18、用別名代替數(shù)據(jù)類型說(shuō)明符對(duì)變量進(jìn)行定義。別名可以用大寫,也可以用小寫,為了區(qū)別一般用大寫字母表示?!纠?typedef的使用。typedef unsigned int WORD;typedef unsigned char BYTE;BYTE a1=0 x12;WORD a2=0 x1234;3.2.2 變量名 變量名是C51區(qū)分不同變量,為不同變量取的名稱。變量名起始必須為字母或下劃線。變量名有兩種:普通變量名和指針變量名它們的區(qū)別是指針變量名前面要帶“ * 號(hào)。3.2.3 存儲(chǔ)種類 存儲(chǔ)種類是指變量在程序執(zhí)行過(guò)程中的作用范圍。C51變量的存儲(chǔ)種類有四種,分別是自動(dòng)(auto)、外部(ext
19、ern)、靜態(tài)(static)和存放器(register)。1auto:使用auto定義的變量稱為自動(dòng)變量,其作用范圍在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部,當(dāng)定義它的函數(shù)體或復(fù)合語(yǔ)句執(zhí)行時(shí),C51才為該變量分配內(nèi)存空間,結(jié)束時(shí)占用的內(nèi)存空間釋放。自動(dòng)變量一般分配在內(nèi)存的堆??臻g中。定義變量時(shí),如果省略存儲(chǔ)種類,那么該變量默認(rèn)為自動(dòng)(auto)變量。3.2.3 存儲(chǔ)種類2extern:使用extern定義的變量稱為外部變量。在一個(gè)函數(shù)體內(nèi),要使用一個(gè)已在該函數(shù)體外或別的程序中定義過(guò)的外部變量時(shí),該變量在該函數(shù)體內(nèi)要用extern說(shuō)明。外部變量被定義后分配固定的內(nèi)存空間,在程序整個(gè)執(zhí)行時(shí)間內(nèi)都有效,直到
20、程序結(jié)束才釋放。3.2.3 存儲(chǔ)種類3static:使用static定義的變量稱為靜態(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í)值不被改變。外部靜態(tài)變量上在函數(shù)外部定義的靜態(tài)變量。它在程序中一直存在,但在定義的范圍之外是不可見的。如在多文件或多模塊處理中,外部靜態(tài)變量只在文件內(nèi)部或模塊內(nèi)部有效。3.2.3 存儲(chǔ)種類4register:使用register定義的變量稱為存放器變量。它定義的變量存放在CPU內(nèi)部的存放器中,處理速度快,但數(shù)目少。
21、C51編譯器編譯時(shí)能自動(dòng)識(shí)別程序中使用頻率最高的變量,并自動(dòng)將其作為存放器變量,用戶可以無(wú)需專門聲明。3.2.4 存儲(chǔ)器類型存儲(chǔ)器類型是用于指明變量所處的單片機(jī)的存儲(chǔ)器區(qū)域情況。存儲(chǔ)器類型與存儲(chǔ)種類完全不同。C51編譯器能識(shí)別的存儲(chǔ)器類型有以下幾種,見表所示。存儲(chǔ)器類型描 述 data直接尋址的片內(nèi)RAM低128B,訪問速度快 bdata片內(nèi)RAM的可位尋址區(qū)(20H2FH),允許字節(jié)和位混合訪問 idata間接尋址訪問的片內(nèi)RAM,允許訪問全部片內(nèi)RAM pdata用Ri間接訪問的片外RAM的低256B xdata用DPTR間接訪問的片外RAM,允許訪問全部64k片外RAM code程序存儲(chǔ)
22、器ROM 64k空間 定義變量時(shí)也可以省“存儲(chǔ)器類型,省略時(shí)C51編譯器將按編譯模式默認(rèn)存儲(chǔ)器類型,具體編譯模式的情況在后面介紹?!纠孔兞慷x存儲(chǔ)種類和存儲(chǔ)器類型相關(guān)情況。 char data varl; /*在片內(nèi)RAM低128B定義用直接尋址方式訪問的字符型變量var1*/ int idata var2; /*在片內(nèi)RAM256B定義用間接尋址方式訪問的整型變量var2*/ auto unsigned long data var3; /*在片內(nèi)RAM128B定義用直接尋址方式訪問的自動(dòng)無(wú)符號(hào)長(zhǎng)整型變量var3*/ extern float xdata var4; /*在片外RAM64KB
23、空間定義用間接尋址方式訪問的外部實(shí)型變量var4*/ int code var5; /*在ROM空間定義整型變量var5*/ unsign char bdata var6; /*在片內(nèi)RAM位尋址區(qū)20H2FH單元定義可字節(jié)處理和位處理的無(wú)符號(hào)字符型變量var6*/3.2.5 特殊功能存放器變量51系列單片機(jī)片內(nèi)有許多特殊功能存放器,通過(guò)這些特殊功能存放器可以控制定時(shí)器、計(jì)數(shù)器、串口、I/O及其它功能部件,每一個(gè)特殊功能存放器在片內(nèi)RAM中都對(duì)應(yīng)于一個(gè)字節(jié)單元或兩個(gè)字節(jié)單元。在C51中,允許用戶對(duì)這些特殊功能存放器進(jìn)行訪問,訪問時(shí)須通過(guò)sfr或sfr16類型說(shuō)明符進(jìn)行定義,定義時(shí)須指明它們所對(duì)
24、應(yīng)的片內(nèi)RAM單元的地址。格式如下:sfr或sfr16 特殊功能存放器名=地址;sfr用于對(duì)51單片機(jī)中單字節(jié)的特殊功能存放器進(jìn)行定義sfr16用于對(duì)雙字節(jié)特殊功能存放器進(jìn)行定義。特殊功能存放器名一般用大寫字母表示。地址一般用直接地址形式,具體特殊功能存放器地址見前面內(nèi)容?!纠刻厥夤δ艽娣牌鞯亩x。 sfr PSW=0 xd0; sfr SCON=0 x98; sfr TMOD=0 x89; sfr P0=0 x80; /* 定義并行P0口,地址為80H */ sfr P1=0 x90; /* 定義并行P1口,地址為90H */ sfr16 DPTR=0 x82; sfr16 T1=0X8A
25、;3.2.6 位變量在C51中,允許用戶通過(guò)位類型符定義位變量。位類型符有兩個(gè):bit和sbit??梢远x兩種位變量。bit位類型符用于定義一般的可位處理位變量。它的格式如下:bit 位變量名;在格式中可以加上各種修飾,但注意存儲(chǔ)器類型只能是bdata、data、idata。只能是片內(nèi)RAM的可位尋址區(qū),嚴(yán)格來(lái)說(shuō)只能是bdata?!纠?bit型變量的定義。bit data a1; /*正確*/bit bdata a2; /*正確*/bit pdata a3; /*錯(cuò)誤*/bit xdata a4; /*錯(cuò)誤*/3.2.6 位變量 sbit位類型符用于定義在可位尋址字節(jié)或特殊功能存放器中的位,
26、定義時(shí)須指明其位地址,可以是位直接地址,可以是可位尋址變量帶位號(hào),也可以是特殊功能存放器名帶位號(hào)。格式如下:sbit 位變量名=位地址;如位地址為位直接地址,其取值范圍為0 x000 xff;如位地址是可位尋址變量帶位號(hào)或特殊功能存放器名帶位號(hào),那么在它前面須對(duì)可位尋址變量或特殊功能存放器進(jìn)行定義。字節(jié)地址與位號(hào)之間、特殊功能存放器與位號(hào)之間一般用“作間隔?!纠縮bit型變量的定義:sbit OV=0 xd2;sbit CY=oxd7;sbit OV=PSW2 ; sbit CY=PSW7; unsigned char bdata flag;sbit flag0=flag0;sfr P1=0
27、 x90;sbit P1_0=P10;sbit P1_1=P11;sbit P1_2=P12;sbit P1_3=P13;sbit P1_4=P14;sbit P1_5=P15;在C51中,為了用戶處理方便,C51編譯器把MCS-51單片機(jī)的常用的特殊功能存放器和特殊位進(jìn)行了定義,放在一個(gè)“reg51.h或“reg52.h的頭文件中;當(dāng)用戶要使用時(shí),只須要在使用之前用一條預(yù)處理命令 #include 把這個(gè)頭文件包含到程序中,然后就可使用殊功能存放器名和特殊位名稱。3.3 存儲(chǔ)模式 C51編譯器支持三種存儲(chǔ)模式:SMALL模式、COMPACT模式和LARGE模式。不同的存儲(chǔ)模式對(duì)變量默認(rèn)的存儲(chǔ)
28、器類型不一樣。1SMALL模式。SMALL模式稱為小編譯模式,在SMALL模式下,編譯時(shí),函數(shù)參數(shù)和變量被默認(rèn)在片內(nèi)RAM中,存儲(chǔ)器類型為data。2COMPACT模式。COMPACT模式稱為緊湊編譯模式,在COMPACT模式下,編譯時(shí),函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的低256字節(jié)空間,存儲(chǔ)器類型為pdata。3LARGE模式。LARGE模式稱為大編譯模式,在LARGE模式下,編譯時(shí)函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的64K字節(jié)空間,存儲(chǔ)器類型為xdata。在程序中變量的存儲(chǔ)模式的指定通過(guò)#pragma預(yù)處理命令來(lái)實(shí)現(xiàn)。函數(shù)的存儲(chǔ)模式可通過(guò)在函數(shù)定義時(shí)后面帶存儲(chǔ)模式說(shuō)明。如果沒有指定,那么系統(tǒng)
29、都隱含為SMALL模式?!纠孔兞康拇鎯?chǔ)模式。#pragma small /*變量的存儲(chǔ)模式為SMALL*/char k1;int xdata m1;#pragma compact /*變量的存儲(chǔ)模式為SMALL*/char k2;int xdata m2;int func1(int x1,int y1) large /*函數(shù)的存儲(chǔ)模式為L(zhǎng)ARGE*/return(x1+y1);int func2(int x2,int y2) /*函數(shù)的存儲(chǔ)模式隱含為SMALL*/ return(x2-y2); 程序編譯時(shí),k1變量存儲(chǔ)器類型為data,k2變量存儲(chǔ)器類型為pdata,而m1和m2由于定義時(shí)帶
30、了存儲(chǔ)器類型xdata,因而它們?yōu)閤data型;函數(shù)func1的形參x1和y1的存儲(chǔ)器類型為xdata型,而函數(shù)func2由于沒有指明存儲(chǔ)模式,隱含為SMALL模式,形參x2和y2的存儲(chǔ)器類型為data。3.4 絕對(duì)地址的訪問一、使用C51運(yùn)行庫(kù)中預(yù)定義宏C51編譯器提供了一組宏定義來(lái)對(duì)51系列單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對(duì)尋址。這些宏規(guī)定只能以無(wú)符號(hào)數(shù)方式訪問, 在頭文件absacc.h中,定義了8個(gè)宏定義,其函數(shù)原型如下:#define CBYTE(unsigned char volatile*)0 x50000L)#define DBYTE(unsigne
31、d char volatile*)0 x40000L)#define PBYTE(unsigned char volatile*)0 x30000L)#define XBYTE(unsigned char volatile*)0 x20000L)#define CWORD(unsigned int volatile*)0 x50000L)#define DWORD(unsigned int volatile*)0 x40000L)#define PWORD(unsigned int volatile*)0 x30000L)#define XWORD(unsigned int volatile*
32、)0 x20000L)這些函數(shù)原型放在absacc.h文件中,使用時(shí)須用預(yù)處理命令把該頭文件包含到文件中:#include 其中:CBYTE以字節(jié)形式對(duì)code區(qū)尋址,DBYTE以字節(jié)形式對(duì)data區(qū)尋址,PBYTE以字節(jié)形式對(duì)pdata區(qū)尋址,XBYTE以字節(jié)形式對(duì)xdata區(qū)尋址,CWORD以字形式對(duì)code區(qū)尋址,DWORD以字形式對(duì)data區(qū)尋址,PWORD以字形式對(duì)pdata區(qū)尋址,XWORD以字形式對(duì)xdata區(qū)尋址?!纠拷^對(duì)地址對(duì)存儲(chǔ)單元的訪問#include /*將絕對(duì)地址頭文件包含在文件中*/#include /*將存放器頭文件包含在文件中*/#define uchar u
33、nsigned char #define uint unsigned int void main(void) uchar var1; uint var2;var1=XBYTE0 x0005; /*XBYTE0 x0005訪問片外RAM 的0005字節(jié)單元*/var2=XWORD0 x0002; /*XWORD0 x0002訪問片外RAM 的000字單元*/.while(1);在上面程序中,其中XBYTE0 x0005就是以絕對(duì)地址方式訪問的片外RAM 0005字節(jié)單元;XWORD0 x0002就是以絕對(duì)地址方式訪問的片外RAM 0002字單元?!纠?通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問。#define
34、 uchar unsigned char /*定義符號(hào)uchar為數(shù)據(jù)類 型符unsigned char*/#define uint unsigned int /*定義符號(hào)uint為數(shù)據(jù)類型 符unsigned int*/void func(void)uchar data var1;uchar pdata *dp1; /*定義一個(gè)指向pdata區(qū)的指針dp1*/uint xdata *dp2; /*定義一個(gè)指向xdata區(qū)的指針dp2*/uchar data *dp3; /*定義一個(gè)指向data區(qū)的指針dp3*/dp1=0 x30; /*dp1指針賦值,指向pdata區(qū)的30H單元*/dp2=
35、0 x1000; /*dp2指針賦值,指向xdata區(qū)的1000H單元*/*dp1=0 xff; /*將數(shù)據(jù)0 xff送到片外RAM30H單元*/*dp2=0 x1234; /*將數(shù)據(jù)0 x1234送到片外RAM1000H單元*/dp3=&var1; /*dp3指針指向data區(qū)的var1變量*/*dp3=0 x20; /*給變量var1賦值0 x20*/二通過(guò)指針訪問 采用指針的方法,可以實(shí)現(xiàn)在C51程序中對(duì)任意指定的存儲(chǔ)器單元進(jìn)行訪問。三使用C51擴(kuò)展關(guān)鍵字_at_ 使用_at_對(duì)指定的存儲(chǔ)器空間的絕對(duì)地址進(jìn)行訪問,一般格式如下: 存儲(chǔ)器類型 數(shù)據(jù)類型說(shuō)明符 變量名 _at_ 地址常數(shù);存
36、儲(chǔ)器類型為data、bdata、idata、pdata等C51能識(shí)別的數(shù)據(jù)類型,如省略那么按存儲(chǔ)模式規(guī)定的默認(rèn)存儲(chǔ)器類型確定變量的存儲(chǔ)器區(qū)域;數(shù)據(jù)類型為C51支持的數(shù)據(jù)類型。地址常數(shù)用于指定變量的絕對(duì)地址,必須位于有效的存儲(chǔ)器空間之內(nèi);使用_at_定義的變量必須為全局變量?!纠客ㄟ^(guò)_at_實(shí)現(xiàn)絕對(duì)地址的訪問。#define uchar unsigned char #define uint unsigned int void main(void)data uchar x1 _at_ 0 x40; /*在data區(qū)中定義字節(jié)變量 x1,它的地址為40H*/xdata uint x2 _at_ 0
37、 x2000; /*在xdata區(qū)中定義字 變量x2,它的地址為2000H*/x1=0 xff;x2=0 x1234;.while(1);4 C51的運(yùn)算符及表達(dá)式4.1 賦值運(yùn)算符4.2 算術(shù)運(yùn)算符4.3 關(guān)系運(yùn)算符4.4 邏輯運(yùn)算符4.5 位運(yùn)算符4.6 復(fù)合賦值運(yùn)算符4.7 逗號(hào)運(yùn)算符4.8 條件運(yùn)算符4.9 指針與地址運(yùn)算符4.1 賦值運(yùn)算符賦值運(yùn)算符“=在C51中,它的功能是將一個(gè)數(shù)據(jù)的值賦給一個(gè)變量,如x=10。利用賦值運(yùn)算符將一個(gè)變量與一個(gè)表達(dá)式連接起來(lái)的式子稱為賦值表達(dá)式,在賦值表達(dá)式的后面加一個(gè)分號(hào)“;就構(gòu)成了賦值語(yǔ)句,賦值語(yǔ)句的格式如下: 變量=表達(dá)式;執(zhí)行時(shí)先計(jì)算出右邊表
38、達(dá)式的值,然后賦給左邊的變量。例如:x=8+9; /*將8+9的值賦紿變量x*/x=y=5; /*將常數(shù)5同時(shí)賦給變量x和y*/C51中,允許在一個(gè)語(yǔ)句中同時(shí)給多個(gè)變量賦值,賦值順序自右向左。 4.2 算術(shù)運(yùn)算符C51中支持的算術(shù)運(yùn)算符有: + 加或取正值運(yùn)算符 - 減或取負(fù)值運(yùn)算符 * 乘運(yùn)算符 / 除運(yùn)算符 % 取余運(yùn)算符說(shuō)明:對(duì)于除運(yùn)算,如相除的兩個(gè)數(shù)為浮點(diǎn)數(shù),那么運(yùn)算的結(jié)果也為浮點(diǎn)數(shù),如相除的兩個(gè)數(shù)為整數(shù),那么運(yùn)算的結(jié)果也為整數(shù),即為整除。如25.0/20.0結(jié)果為1.25,而25/20結(jié)果為1。對(duì)于取余運(yùn)算,那么要求參加運(yùn)算的兩個(gè)數(shù)必須為整數(shù),運(yùn)算結(jié)果為它們的余數(shù)。例如:x=5%3,
39、結(jié)果x的值為2。4.3 關(guān)系運(yùn)算符C51中有6種關(guān)系運(yùn)算符: 大于 = 大于等于 3,結(jié)果為真1,而10= =100,結(jié)果為假0。注意:關(guān)系運(yùn)算符等于“= =, 賦值運(yùn)算符是由兩個(gè)“=組成。4.4 邏輯運(yùn)算符C51邏輯運(yùn)算符: | 邏輯或 & 邏輯與 ! 邏輯非邏輯運(yùn)算符用于求條件式的邏輯值,用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)的式子就是邏輯表達(dá)式關(guān)系運(yùn)算符用于反映兩個(gè)表達(dá)式之間的大小關(guān)系邏輯與,格式: 條件式1 & 條件式2當(dāng)條件式1與條件式2都為真時(shí)結(jié)果為真非0值,否那么為假0值.邏輯或,格式: 條件式1 | 條件式2 當(dāng)條件式1與條件式2都為假時(shí)結(jié)果為假0值,否那么為真非0值.邏輯非
40、,格式: !條件式當(dāng)條件式原來(lái)為真非0值,邏輯非后結(jié)果為假0值;條件式原來(lái)為假0值,邏輯非后結(jié)果為真非0值.例如:假設(shè)a=8,b=3,c=0,那么!a為假,a & b為真,b & c為假。4.5 位運(yùn)算符 C51語(yǔ)言能對(duì)運(yùn)算對(duì)象按位進(jìn)行操作,它與匯編語(yǔ)言使用一樣方便。位運(yùn)算是按位對(duì)變量進(jìn)行運(yùn)算,但并不改變參與運(yùn)算的變量的值。如果要求按位改變變量的值,那么要利用相應(yīng)的賦值運(yùn)算。C51中位運(yùn)算符只能對(duì)整數(shù)進(jìn)行操作,不能對(duì)浮點(diǎn)數(shù)進(jìn)行操作。C51中的位運(yùn)算符有:& 按位與| 按位或 按位異或 按位取反 右移【例】設(shè)a=0 x45=01010100B,b=0 x3b=00111011B,那么a&b、a|
41、b、ab、a、a2分別為多少?a&b=00010000b=0 x10a|b=01111111B=0 x7fab=01101111B=0 x6fa=10101011B=0 xaba2=00001110B=0 x0e4.6 復(fù)合賦值運(yùn)算符C51語(yǔ)言中支持在賦值運(yùn)算符“=的前面加上其它運(yùn)算符,組成復(fù)合賦值運(yùn)算符。下面是C51中支持的復(fù)合賦值運(yùn)算符 += 加法賦值 + 減法賦值 *= 乘法賦值 /= 除法賦值 %= 取模賦值 &= 邏輯與賦值 |= 邏輯或賦值 = 邏輯異或賦值 = 邏輯非賦值 = 右移位賦值 =2相當(dāng)于x=x2。4.7 逗號(hào)運(yùn)算符在C51語(yǔ)言中,逗號(hào)“,是一個(gè)特殊的運(yùn)算符,可以用它將
42、兩個(gè)或兩個(gè)以上的表達(dá)式連接起來(lái),稱為逗號(hào)表達(dá)式。逗號(hào)表達(dá)式的一般格式為:表達(dá)式1,表達(dá)式2,表達(dá)式n 程序執(zhí)行時(shí)對(duì)逗號(hào)表達(dá)式的處理:按從左至右的順序依次計(jì)算出各個(gè)表達(dá)式的值,而整個(gè)逗號(hào)表達(dá)式的值是最右邊的表達(dá)式表達(dá)式n的值。例如:x=(a=3,6*3)結(jié)果x的值為18。4.8 條件運(yùn)算符條件運(yùn)算符“?:是C51語(yǔ)言中唯一的一個(gè)三目運(yùn)算符,它要求有三個(gè)運(yùn)算對(duì)象,用它可以將三個(gè)表達(dá)式連接在一起構(gòu)成一個(gè)條件表達(dá)式。條件表達(dá)式的一般格式為: 邏輯表達(dá)式?表達(dá)式1:表達(dá)式2其功能是先計(jì)算邏輯表達(dá)式的值:當(dāng)邏輯表達(dá)式的值為真非0值時(shí),將計(jì)算的表達(dá)式1的值作為整個(gè)條件表達(dá)式的值;當(dāng)邏輯表達(dá)式的值為假0值時(shí),
43、將計(jì)算的表達(dá)式2的值作為整個(gè)條件表達(dá)式的值。 例如:條件表達(dá)式max=(ab)?a:b的執(zhí)行結(jié)果是將a和b中較大的數(shù)賦值給變量max。4.9 指針與地址運(yùn)算符 指針是C51語(yǔ)言中的一個(gè)十分重要的概念,在C51中的數(shù)據(jù)類型中專門有一種指針類型。指針為變量的訪問提供了另一種方式,變量的指針就是該變量的地址,還可以定義一個(gè)專門指向某個(gè)變量的地址的指針變量。 為了表示指針變量和它所指向的變量地址之間的關(guān)系,C51中提供了兩個(gè)專門的運(yùn)算符: * 指針運(yùn)算符 & 取地址運(yùn)算符指針運(yùn)算符“ * :通過(guò)它實(shí)現(xiàn)訪問以指針變量的內(nèi)容為地址所指向的存儲(chǔ)單元。例如:指針變量p中的地址為2000H,那么*p所訪問的是地
44、址為2000H的存儲(chǔ)單元,x=*p,實(shí)現(xiàn)把地址為2000H的存儲(chǔ)單元的內(nèi)容送給變量x。取地址運(yùn)算符“ & :通過(guò)它取得變量的地址,變量的地址通常送給指針變量。例如:設(shè)變量x的內(nèi)容為12H,地址為2000H,那么&x的值為2000H,如有一指針變量p,那么通常用p=&x,實(shí)現(xiàn)將x變量的地址送給指針變量p,指針變量p指向變量x,以后可以通過(guò)*p訪問變量x。5 表達(dá)式語(yǔ)句及復(fù)合語(yǔ)句5.1 表達(dá)式語(yǔ)句在表達(dá)式的后邊加一個(gè)分號(hào)“;就構(gòu)成了表達(dá)式語(yǔ)句 ,如:a=+b*9;x=8;y=7;+k;可以一行放一個(gè)表達(dá)式形成表達(dá)式語(yǔ)句,也可以一行放多個(gè)表達(dá)式形成表達(dá)式語(yǔ)句,這時(shí)每個(gè)表達(dá)式后面都必須帶“;號(hào)另外,還
45、可以僅由個(gè)分號(hào)“;占一行形成一個(gè)表達(dá)式語(yǔ)句,這種語(yǔ)句稱為空語(yǔ)句。 空語(yǔ)句在程序設(shè)計(jì)中通常用于兩種情況:1在程序中為有關(guān)語(yǔ)句提供標(biāo)號(hào),用以標(biāo)記程序執(zhí)行的位置。例如采用下面的語(yǔ)句可以構(gòu)成一個(gè)循環(huán)。repeat:; ; goto repeat;2在用while語(yǔ)句構(gòu)成的循環(huán)語(yǔ)句后面加一個(gè)分號(hào),形成一個(gè)不執(zhí)行其它操作的空循環(huán)體。這種結(jié)構(gòu)通常用于對(duì)某位進(jìn)行判斷,當(dāng)不滿足條件那么等待,滿足條件那么執(zhí)行?!纠肯旅孢@段子程序用于讀取51單片機(jī)的串行口的數(shù)據(jù),當(dāng)沒有接收到那么等待,當(dāng)接收到,接收數(shù)據(jù)后返回,返回值為接收的數(shù)據(jù)。#include char getchar()char c;while(!RI);
46、/當(dāng)接收中斷標(biāo)志位RI為0,那么 等待,當(dāng)接收中斷標(biāo)志位為1那么;等待結(jié)束c=SBUF;RI=0;return(c);5.2 復(fù)合語(yǔ)句 復(fù)合語(yǔ)句是由假設(shè)干條語(yǔ)句組合而成的一種語(yǔ)句,在C51中,用一個(gè)大括號(hào)“ 將假設(shè)干條語(yǔ)句括在一起就形成了一個(gè)復(fù)合語(yǔ)句復(fù)合語(yǔ)句最后不需要以分號(hào)“;結(jié)束,但它內(nèi)部的各條語(yǔ)句仍需以分號(hào)“;結(jié)束。復(fù)合語(yǔ)句的一般形式為:局部變量定義;語(yǔ)句l;語(yǔ)句2; 復(fù)合語(yǔ)句在執(zhí)行時(shí),其中的各條單語(yǔ)句按順序依次執(zhí)行,整個(gè)復(fù)合語(yǔ)句在語(yǔ)法上等價(jià)于一條單語(yǔ)句,因此在C51中可以將復(fù)合語(yǔ)句視為一條單語(yǔ)句。通常復(fù)合語(yǔ)句出現(xiàn)在函數(shù)中,實(shí)際上,函數(shù)的執(zhí)行局部即函數(shù)體就是一個(gè)復(fù)合語(yǔ)句;復(fù)合語(yǔ)句中的單語(yǔ)句
47、一般是可執(zhí)行語(yǔ)句,此外還可以是變量的定義語(yǔ)句說(shuō)明變量的數(shù)據(jù)類型。在復(fù)合語(yǔ)句內(nèi)部語(yǔ)句所定義的變量,稱為該復(fù)合語(yǔ)句中的局部變量,它僅在當(dāng)前這個(gè)復(fù)合語(yǔ)句中有效。利用復(fù)合語(yǔ)句將多條單語(yǔ)句組合在起,以及在復(fù)合語(yǔ)句中進(jìn)行局部變量定義是C51語(yǔ)言的一個(gè)重要特征。6 C51程序根本結(jié)構(gòu)與相關(guān)語(yǔ)句6.1 C51的根本結(jié)構(gòu)6.2 if語(yǔ)句6.3 switch/case語(yǔ)句6.4 while語(yǔ)句6.5 do while語(yǔ)句6.6 for語(yǔ)句6.7 循環(huán)的嵌套6.8 break和continue語(yǔ)句6.9 return語(yǔ)句6.1 C51的根本結(jié)構(gòu) 一、順序結(jié)構(gòu) 是最根本、最簡(jiǎn)單的結(jié)構(gòu),在這種結(jié)構(gòu)中,程序由低地址到高地
48、址依次執(zhí)行AB圖:順序結(jié)構(gòu)流程圖 選擇結(jié)構(gòu)可使程序根據(jù)不同的情況,選擇執(zhí)行不同的分支,在選擇結(jié)構(gòu)中,程序先都對(duì)一個(gè)條件進(jìn)行判斷。當(dāng)條件成立,即條件語(yǔ)句為“真時(shí),執(zhí)行一個(gè)分支,當(dāng)條件不成立時(shí),即條件語(yǔ)句為“假時(shí),執(zhí)行另一個(gè)分支。如圖4.4,當(dāng)條件S成立時(shí),執(zhí)行分支A,當(dāng)條件P不成立時(shí),執(zhí)行分支B。條件P語(yǔ)句A語(yǔ)句B成立不成立 在C51中,實(shí)現(xiàn)選擇結(jié)構(gòu)的語(yǔ)句為if/else,if/else if語(yǔ)句。另外在C51中還支持多分支結(jié)構(gòu),多分支結(jié)構(gòu)既可以通過(guò)if和else if語(yǔ)句嵌套實(shí)現(xiàn),可用swith/case語(yǔ)句實(shí)現(xiàn)。二選擇結(jié)構(gòu) 在程序處理過(guò)程中,有時(shí)需要某一段程序重復(fù)執(zhí)行屢次,這時(shí)就需要循環(huán)結(jié)構(gòu)
49、來(lái)實(shí)現(xiàn),循環(huán)結(jié)構(gòu)就是能夠使程序段重復(fù)執(zhí)行的結(jié)構(gòu)。循環(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)型循環(huán)結(jié)構(gòu)如圖4-3,當(dāng)條件P成立為“真時(shí),重復(fù)執(zhí)行語(yǔ)句A,當(dāng)條件不成立為“假時(shí)才停止重復(fù),執(zhí)行后面的程序。圖: 當(dāng)型循環(huán)結(jié)構(gòu) 三循環(huán)結(jié)構(gòu)條件P語(yǔ)句A成立不成立2直到型循環(huán)結(jié)構(gòu) 直到型循環(huán)結(jié)構(gòu)如圖4,先執(zhí)行語(yǔ)句A,再判斷條件P,當(dāng)條件成立為“真時(shí),再重復(fù)執(zhí)行語(yǔ)句A,直到條件不成立為“假時(shí)才停止重復(fù),執(zhí)行后面的程序。條件P語(yǔ)句A成立不成立圖:直到型循環(huán)結(jié)構(gòu)構(gòu)成循環(huán)結(jié)構(gòu)的語(yǔ)句主要有:while、do while、for、goto等。6.2 if語(yǔ)句 if語(yǔ)句
50、是C51中的一個(gè)根本條件選擇語(yǔ)句,它通常有三種格式:if 表達(dá)式 語(yǔ)句;if 表達(dá)式 語(yǔ)句1; else 語(yǔ)句2;if 表達(dá)式1 語(yǔ)句1;else if 表達(dá)式2 語(yǔ)句2;else if 表達(dá)式3 語(yǔ)句3;else if 表達(dá)式n-1 語(yǔ)句n-1;else 語(yǔ)句n【例】 if語(yǔ)句的用法。1if (x!=y) printf(“x=%d,y=%dn,x,y); 執(zhí)行上面語(yǔ)句時(shí),如果x不等于y,那么輸出x的值和y的值。2if (xy) max=x; else max=y; 執(zhí)行上面語(yǔ)句時(shí),如x大于y成立,那么把x送給最大值變量max,如x大于y不成立,那么把y送給最大值變量max。使max變量得到x
51、、y中的大數(shù)。3if (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 (score=60) printf(“Your result is an Dn);else printf(“Your result is an En); 執(zhí)行上面語(yǔ)句后,能夠根據(jù)分?jǐn)?shù)score分別打出A、B、C、D、E五個(gè)等級(jí)。6.3 switch/case語(yǔ)句 if語(yǔ)句通過(guò)嵌套可以
52、實(shí)現(xiàn)多分支結(jié)構(gòu),但結(jié)構(gòu)復(fù)雜。switch是C51中提供的專門處理多分支結(jié)構(gòu)的多分支選擇語(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;說(shuō)明如下:switch后面括號(hào)內(nèi)的表達(dá)式,可以是整型或字符型表達(dá)式。當(dāng)該表達(dá)式的值與某一“case后面的常量表達(dá)式的值相等時(shí),就執(zhí)行該“case后面的語(yǔ)句,然后遇到break語(yǔ)句退出switch語(yǔ)句。假設(shè)表達(dá)式的值與所有case后的常量表達(dá)式的值都不相同,那么執(zhí)行default后面的語(yǔ)句,然后退出switc
53、h結(jié)構(gòu)。每一個(gè)case常量表達(dá)式的值必須不同否那么會(huì)出現(xiàn)自相矛盾的現(xiàn)象。case語(yǔ)句和default語(yǔ)句的出現(xiàn)次序?qū)?zhí)行過(guò)程沒有影響。每個(gè)case語(yǔ)句后面可以有“break,也可以沒有。有break語(yǔ)句,執(zhí)行到break那么退出switch結(jié)構(gòu),假設(shè)沒有,那么會(huì)順次執(zhí)行后面的語(yǔ)句,直到遇到break或結(jié)束。每一個(gè)case語(yǔ)句后面可以帶一個(gè)語(yǔ)句,也可以帶多個(gè)語(yǔ)句,還可以不帶。語(yǔ)句可以用花括號(hào)括起,也可以不括。多個(gè)case可以共用一組執(zhí)行語(yǔ)句。【例】 switch/case語(yǔ)句的用法。 對(duì)學(xué)生成績(jī)劃分為AD,對(duì)應(yīng)不同的百分制分?jǐn)?shù),要求根據(jù)不同的等級(jí)打印出它的對(duì)應(yīng)百分?jǐn)?shù)??梢酝ㄟ^(guò)下面的switch/
54、case語(yǔ)句實(shí)現(xiàn)。switchgradecase A;printf90100n;break;case B;printf8090n;break;case C;printf7080n;break;case D;printf6070n;break;case E;printf60n;break;default;printferrorn6.4 while語(yǔ)句 while語(yǔ)句在C51中用于實(shí)現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu),格式如下: while表達(dá)式 語(yǔ)句; /*循環(huán)體*/while語(yǔ)句后面的表達(dá)式是能否循環(huán)的條件,后面的語(yǔ)句是循環(huán)體。當(dāng)表達(dá)式為非0真時(shí),就重復(fù)執(zhí)行循環(huán)體內(nèi)的語(yǔ)句;當(dāng)表達(dá)式為0假,那么中止while循環(huán),
55、程序?qū)?zhí)行循環(huán)結(jié)構(gòu)之外的下一條語(yǔ)句。特點(diǎn):先判斷條件,后執(zhí)行循環(huán)體。在循環(huán)體中對(duì)條件進(jìn)行改變,然后再判斷條件,如條件成立,那么再執(zhí)行循環(huán)體,如條件不成立,那么退出循環(huán)。如條件第一次就不成立,那么循環(huán)體一次也不執(zhí)行。 #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;while (i=100) /累加1100之和在s中s=s+i;i+;printf(“1+2+3+100=%dn,s);while
56、(1);【例】 下面程序是通過(guò)while語(yǔ)句實(shí)現(xiàn)計(jì)算并輸出1100的累加和。程序執(zhí)行的結(jié)果:1+2+3+100=50506.5 do while語(yǔ)句 do while語(yǔ)句在C51中用于實(shí)現(xiàn)直到型循環(huán)結(jié)構(gòu),它的格式如下: do 語(yǔ)句; /*循環(huán)體*/ while表達(dá)式;特點(diǎn):先執(zhí)行循環(huán)體中的語(yǔ)句,后判斷表達(dá)式。如表達(dá)式成立真,那么再執(zhí)行循環(huán)體,然后又判斷,直到有表達(dá)式不成立假時(shí),退出循環(huán),執(zhí)行do while結(jié)構(gòu)的下一條語(yǔ)句。do while語(yǔ)句在執(zhí)行時(shí),循環(huán)體內(nèi)的語(yǔ)句至少會(huì)被執(zhí)行一次。#include /包含特殊功能存放器庫(kù)#include /包含I/O函數(shù)庫(kù)void main(void) /
57、主函數(shù)int i,s=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);【例】 通過(guò)do while語(yǔ)句實(shí)現(xiàn)計(jì)算并輸出1100的累加和。6.6 for語(yǔ)句for表達(dá)式1;表達(dá)式2;表達(dá)式3語(yǔ)句; /*循環(huán)體*/for語(yǔ)句后面帶三個(gè)表達(dá)式,它的執(zhí)行過(guò)程如下:先求解表達(dá)式1的值。求解表達(dá)式2的值,如表達(dá)式2的值為真,那么執(zhí)行循環(huán)休中的語(yǔ)句,然后執(zhí)行下一步3的操作,如表達(dá)式2的值為假,那
58、么結(jié)束for循環(huán),轉(zhuǎn)到最后一步。假設(shè)表達(dá)式2的值為真,那么執(zhí)行完循環(huán)體中的語(yǔ)句后,求解表達(dá)式3,然后轉(zhuǎn)到第四步。轉(zhuǎn)到2繼續(xù)執(zhí)行。退出for循環(huán),執(zhí)行下面的一條語(yǔ)句。 在for循環(huán)中,一般表達(dá)式1為初值表達(dá)式,用于給循環(huán)變量賦初值;表達(dá)式2為條件表達(dá)式,對(duì)循環(huán)變量進(jìn)行判斷;表達(dá)式3為循環(huán)變量更新表達(dá)式,用于對(duì)循環(huán)變量的值進(jìn)行更新,使循環(huán)變量能不滿足條件而退出循環(huán)。【例】 用for語(yǔ)句實(shí)現(xiàn)計(jì)算并輸出1100的累加和。#include /包含特殊功能存放器庫(kù)#include /包含I/O函數(shù)庫(kù)void main(void) /主函數(shù)int i,s=0; /定義整型變量x和ySCON=0 x52; /
59、串口初始化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);程序執(zhí)行的結(jié)果:1+2+3+100=50506.7 循環(huán)的嵌套 在一個(gè)循環(huán)的循環(huán)體中允許又包含一個(gè)完整的循環(huán)結(jié)構(gòu),這種結(jié)構(gòu)稱為循環(huán)的嵌套。外面的循環(huán)稱為外循環(huán),里面的循環(huán)稱為內(nèi)循環(huán),如果在內(nèi)循環(huán)的循環(huán)體內(nèi)又包含循環(huán)結(jié)構(gòu),就構(gòu)成了多重循環(huán)。在C51中,允許三種循環(huán)結(jié)構(gòu)相互嵌套。【例】用嵌套結(jié)構(gòu)構(gòu)造一個(gè)延時(shí)程序。void delay(unsigned int x)unsigned char j;
60、while(x-)for (j=0;j125;j+); 這里,用內(nèi)循環(huán)構(gòu)造一個(gè)基準(zhǔn)的延時(shí),調(diào)用時(shí)通過(guò)參數(shù)設(shè)置外循環(huán)的次數(shù),這樣就可以形成各種延時(shí)關(guān)系。6.8 break和continue語(yǔ)句 break和continue語(yǔ)句通常用于循環(huán)結(jié)構(gòu)中,用來(lái)跳出循環(huán)結(jié)構(gòu)。但是二者又有所不同,下面分別介紹。1break語(yǔ)句 前面已介紹過(guò)用break語(yǔ)句可以跳出switch結(jié)構(gòu),使程序繼續(xù)執(zhí)行switch結(jié)構(gòu)后面的一個(gè)語(yǔ)句。使用break語(yǔ)句還可以從循環(huán)體中跳出循環(huán),提前結(jié)束循環(huán)而接著執(zhí)行循環(huán)結(jié)構(gòu)下面的語(yǔ)句。它不能用在除了循環(huán)語(yǔ)句和switch語(yǔ)句之外的任何其它語(yǔ)句中。【例】下面一段程序用于計(jì)算圓的面積,當(dāng)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度二手房買賣墊資擔(dān)保合同2篇
- 滅火器使用課程設(shè)計(jì)
- 2024模特經(jīng)紀(jì)公司藝人經(jīng)紀(jì)服務(wù)合同3篇
- 2025版綠色金融股權(quán)質(zhì)押與環(huán)保風(fēng)險(xiǎn)控制擔(dān)保服務(wù)協(xié)議2篇
- 焦慮狀態(tài)護(hù)理常規(guī)
- 2024某公司電子商務(wù)事業(yè)部虛擬現(xiàn)實(shí)購(gòu)物體驗(yàn)合作協(xié)議書3篇
- 2024年跨境電商服務(wù)合作協(xié)議
- 成都職業(yè)技術(shù)學(xué)院《創(chuàng)新綜合實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年版建筑工程招投標(biāo)與合同文本2篇
- 2024年項(xiàng)目中介服務(wù)協(xié)議細(xì)則版B版
- 華東師大版科學(xué)七年級(jí)上冊(cè)期末測(cè)試卷2
- 危機(jī)管理與應(yīng)急響應(yīng)
- 《安全生產(chǎn)法》宣傳周活動(dòng)宣貫課件
- 2024年度廢鋼再生資源買賣合同樣本3篇
- 2024年綜合實(shí)踐活動(dòng)課程實(shí)施計(jì)劃(4篇)
- 陸軍第七十五集團(tuán)軍醫(yī)院招聘筆試真題2023
- 2024年度鍋爐安全檢驗(yàn)與保養(yǎng)服務(wù)合同3篇
- 《政府經(jīng)濟(jì)學(xué)》期末考試復(fù)習(xí)題及答案
- 中南大學(xué)《大學(xué)物理C(一)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年01月11042國(guó)際經(jīng)濟(jì)法期末試題答案
- 高中生物課件
評(píng)論
0/150
提交評(píng)論