單片機(jī)C語(yǔ)言編程基礎(chǔ)知識(shí)專題培訓(xùn)課件_第1頁(yè)
單片機(jī)C語(yǔ)言編程基礎(chǔ)知識(shí)專題培訓(xùn)課件_第2頁(yè)
單片機(jī)C語(yǔ)言編程基礎(chǔ)知識(shí)專題培訓(xùn)課件_第3頁(yè)
單片機(jī)C語(yǔ)言編程基礎(chǔ)知識(shí)專題培訓(xùn)課件_第4頁(yè)
單片機(jī)C語(yǔ)言編程基礎(chǔ)知識(shí)專題培訓(xùn)課件_第5頁(yè)
已閱讀5頁(yè),還剩47頁(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、127.1.1標(biāo)識(shí)符和關(guān)鍵字7.1.2C51 數(shù)據(jù)類型7.1.3常量與變量3C語(yǔ)言編程的基本概念和知識(shí)1函數(shù)。C語(yǔ)言程序由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成,程序中由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)之間也可以相互調(diào)用。指針與指針變量。若定義變量x,&x即為x的指針,指針變量是指針的指針,若xp=&x,利用*xp即可訪問(wèn)變量x。23#include(包含處理命令)。一個(gè)源文件將另一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來(lái),或者說(shuō)把一個(gè)外部文件包含到本文件之中。4#define(宏定義)。在C程序中,可以指定一標(biāo)志符去定義一個(gè)常量或字符串。5主函數(shù)名必須為main()。C程序通過(guò)函數(shù)調(diào)用去執(zhí)行指定的工作。6一個(gè)函數(shù)由說(shuō)

2、明部分和函數(shù)體兩部分組成。函數(shù)說(shuō)明部分是對(duì)函數(shù)名、函數(shù)類型、形參名和形參類型等所做的說(shuō)明。C程序的執(zhí)行是從main()函數(shù)開(kāi)始,而對(duì)該函數(shù)的位置無(wú)特殊的規(guī)定。78源程序文件需要包含其他源程序文件時(shí),應(yīng)在本程序頭部用包含命令#include處理。9C程序中的一個(gè)函數(shù)需要調(diào)用另一個(gè)子函數(shù)時(shí),另一個(gè)函數(shù)應(yīng)寫在前面,否則應(yīng)聲明。10C程序書寫格式自由,一行可寫一個(gè)語(yǔ)句或幾個(gè)語(yǔ)句。每個(gè)語(yǔ)句結(jié)尾用“;”結(jié)束。41標(biāo)識(shí)符標(biāo)識(shí)符是用來(lái)表示源程序中自定義對(duì)象名稱的符號(hào)。其中的自定義對(duì)象可以是常量、變量、數(shù)組、結(jié)構(gòu)、語(yǔ)句標(biāo)號(hào)以及函數(shù)等。在C51語(yǔ)言中,標(biāo)識(shí)符可以由字母(az,AZ)、數(shù)字(09)和下劃線“_”組成

3、,最多可支持32個(gè)字符。C51標(biāo)識(shí)符的定義不是隨意的,應(yīng)遵循“簡(jiǎn)潔”和“見(jiàn)名知意”的原則,并需要符合一定的規(guī)則:標(biāo)識(shí)符的第一個(gè)字符必須是字母或者下劃線,不能為數(shù)字。由于有些編譯系統(tǒng)專用的標(biāo)識(shí)符以下劃線開(kāi)頭,所以用戶在定義標(biāo)識(shí)符時(shí)一般不要以下劃線開(kāi)頭。C51的標(biāo)識(shí)符區(qū)分大小寫,例如“ch1”和“Ch1”表示兩個(gè)不同的標(biāo)識(shí)符。用戶自定義的標(biāo)識(shí)符不能與系統(tǒng)保留的關(guān)鍵字重復(fù)。52關(guān)鍵字關(guān)鍵字是C51編譯器保留的一些特殊標(biāo)識(shí)符,具有特定的含義和用法。單片機(jī)C51程序語(yǔ)言繼承了ANSI C標(biāo)準(zhǔn)定義的32個(gè)關(guān)鍵字,如表7-1所示。表7-1 C51的關(guān)鍵字auto存儲(chǔ)種類說(shuō)明用以說(shuō)明局部變量,缺省值為此bre

4、ak程序語(yǔ)句退出最內(nèi)層循環(huán)case程序語(yǔ)句Switch 語(yǔ)句中的選擇項(xiàng)char數(shù)據(jù)類型說(shuō)明單字節(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)關(guān)鍵字用 途說(shuō) 明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)goto程序語(yǔ)句構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)if程序語(yǔ)句構(gòu)成if els

5、e選擇結(jié)構(gòu)int數(shù)據(jù)類型說(shuō)明基本整型數(shù)long數(shù)據(jù)類型說(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ō)明重新進(jìn)行數(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ō)明該變量在程序執(zhí)行中可被隱含地改

6、變while程序語(yǔ)句構(gòu)成while和do while循環(huán)語(yǔ)句同時(shí)C51又結(jié)合單片機(jī)硬件的特點(diǎn)擴(kuò)展了19個(gè)關(guān)鍵字:_at_ idata sfr16 alien interrupt small bdata large _task_ code bit pdata using reentrant xdata compact sbit data sfr6表7-2列出了Keil uVision2 C51編譯器所支持的數(shù)據(jù)類型。數(shù)據(jù)類型長(zhǎng) 度值 域unsigned char單字節(jié)0255signed char單字節(jié)-128+127unsigned int雙字節(jié)065535signed int雙字節(jié)-3276

7、8+32767unsigned long四字節(jié)04294967295signed long四字節(jié)-2147483648+2147483647表7-2 C51編譯器所支持的數(shù)據(jù)類型float四字節(jié)1.175494E-383.402823E+38*13 字節(jié)對(duì)象的地址bit位0 或1sfr單字節(jié)0255sfr16雙字節(jié)065535sbit位0 或171char字符類型char類型的長(zhǎng)度是一個(gè)字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常量。char字符類型分為無(wú)符號(hào)字符類型(unsigned char)和有符號(hào)字符類型(signed char),默認(rèn)值為signed char類型。unsigned ch

8、ar類型用字節(jié)中所有的位來(lái)表示數(shù)值,可以表達(dá)的數(shù)值范圍是0255;signed char類型中字節(jié)最高位表示數(shù)據(jù)的符號(hào),“0”表示正數(shù),“1”表示負(fù)數(shù)(負(fù)數(shù)用補(bǔ)碼表示),所能表示的數(shù)值范圍是-128+127。 unsigned char常用于處理ASCII字符或小于等于255的整型數(shù)。正數(shù)的補(bǔ)碼與原碼相同,負(fù)二進(jìn)制數(shù)的補(bǔ)碼等于它的絕對(duì)值按位取反后加1。說(shuō) 明82int整型int整型長(zhǎng)度為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。分為有符號(hào)整型數(shù)signed int和無(wú)符號(hào)整型數(shù)unsigned int,默認(rèn)值為signed int類型。signed int表示的數(shù)值范圍是-32768+32767,字節(jié)

9、中最高位表示數(shù)據(jù)的符號(hào),“0”表示正數(shù),“1”表示負(fù)數(shù);unsigned int表示的數(shù)值范圍是065535。3long長(zhǎng)整型long長(zhǎng)整型長(zhǎng)度為四個(gè)字節(jié),用于存放一個(gè)四字節(jié)數(shù)據(jù)。分有符號(hào)長(zhǎng)整型signed long和無(wú)符號(hào)長(zhǎng)整型unsigned long,默認(rèn)值為signed long類型。signed int表示的數(shù)值范圍是-2147483648+2147483647,字節(jié)中最高位表示數(shù)據(jù)的符號(hào),“0”表示正數(shù),“1”表示負(fù)數(shù);unsigned long表示的數(shù)值范圍是04294967295。95*指針型指針型數(shù)據(jù)本身是一個(gè)變量,在這個(gè)變量中存放著指向另一個(gè)數(shù)據(jù)的地址。根據(jù)處理器的不同,指

10、針型數(shù)據(jù)所占的內(nèi)存單元也不盡相同,在C51中它的長(zhǎng)度一般為13個(gè)字節(jié)。4float浮點(diǎn)型float浮點(diǎn)型在十進(jìn)制中具有7位有效數(shù)字,是符合IEEE754標(biāo)準(zhǔn)的單精度浮點(diǎn)型數(shù)據(jù),占用四個(gè)字節(jié)。浮點(diǎn)數(shù)的結(jié)構(gòu)較復(fù)雜,單片機(jī)使用較少。6bit位標(biāo)量bit 位標(biāo)量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個(gè)位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,非0即1。定義格式:bit 變量名=變量值。7sfr特殊功能寄存器sfr是一種擴(kuò)充數(shù)據(jù)類型,占用一個(gè)內(nèi)存單元,地址范圍為0 x800 xFF。定義格式為:sfr 變量名=變量地址。利用它可以訪問(wèn)51單片機(jī)內(nèi)部的所有特殊功能寄存器。

11、例如,用“sfr P1=0 x90”這一句定P1為P1端口在片內(nèi)的寄存器。109sbit可位尋址位sbit是C51中的一種擴(kuò)充數(shù)據(jù)類型,利用它可以訪問(wèn)芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。定義格式:sbit 變量名=位地址;sbit 變量名=SFR地址位序號(hào);sbit 變量名=sfr16變量位序號(hào)。因P1端口的寄存器是可位尋址的,所以我們可以定義P1_1為P1中的P1.1引腳,同樣我們可以用P1.1的地址去寫,這樣在以后的程序語(yǔ)句中就可以用P1_1來(lái)對(duì)P1.1引腳進(jìn)行讀寫操作了。例如:sbit P1_1=P11;sbit P1_1=0 x91;8sfr16 16位特殊功能寄

12、存器sfr16是一種擴(kuò)充數(shù)據(jù)類型,占用兩個(gè)內(nèi)存單元,sfr16和sfr一樣用于操作特殊功能寄存器,所不同的是,此類型的變量可訪問(wèn)16為特殊功能寄存器。定義格式:sfr16 變量名=變量地址。此處的變量地址為16位中的低8位地址,其地址范圍為0 x800 xFF。通過(guò)sfr16變量讀16位特殊功能寄存器時(shí),先讀低字節(jié),后讀高字節(jié);寫特殊功能寄存器時(shí)先寫高字節(jié),后寫低字節(jié)。11(2)浮點(diǎn)型常量浮點(diǎn)型常量可分為十進(jìn)制和指數(shù)表示形式。十進(jìn)制浮點(diǎn)型常量由數(shù)字和小數(shù)點(diǎn)組成,整數(shù)或小數(shù)部分為0,可以省略但必須有小數(shù)點(diǎn),如0.888,3345.345,0.0等。指數(shù)浮點(diǎn)型常量表示形式為:數(shù)字.數(shù)字e數(shù)字 中的

13、內(nèi)容為可選項(xiàng),如125e3,7e9,-3.0e-3等。1常量常量是在程序運(yùn)行過(guò)程中不能改變的量,如固定的數(shù)據(jù)表、字符等。常量的數(shù)據(jù)類型只有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。(1)整型常量不同數(shù)據(jù)類型的整型常量表示方法不同,十進(jìn)制如123,0,-89等;十六進(jìn)制則以0 x開(kāi)頭如0 x34,-0 x3B等;長(zhǎng)整型就在數(shù)字后面加字母L,如104L,034L,0 xF340等。121常量常量是在程序運(yùn)行過(guò)程中不能改變的量,如固定的數(shù)據(jù)表、字符等。常量的數(shù)據(jù)類型只有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。(3)字符型常量字符型常量是單引號(hào)內(nèi)的字符,如a,d等。表示不顯示的控制字符,可以在該字符前面

14、加一個(gè)反斜杠“”組成專用轉(zhuǎn)義字符,常用轉(zhuǎn)義字符如表7-3所示。o空字符(NULL)00H/0n換行符(LF)0AH/10r回車符(CR)0DH/13轉(zhuǎn)義字符含 義ASCII 碼(16/10 進(jìn)制)表7-3 常用轉(zhuǎn)義字符表t水平制表符(HT)09H/9b退格符(BS)08H/8f換頁(yè)符(FF)0CH/12單引號(hào)27H/39雙引號(hào)22H/34反斜杠5CH/92131常量常量是在程序運(yùn)行過(guò)程中不能改變的量,如固定的數(shù)據(jù)表、字符等。常量的數(shù)據(jù)類型只有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。(4)字符串型常量字符串型常量由雙引號(hào)內(nèi)的字符組成,如“test”,“OK”等。當(dāng)引號(hào)內(nèi)沒(méi)有字符時(shí),為空字符串。在

15、C中字符串常量是做為字符類型數(shù)組來(lái)處理的,在存儲(chǔ)字符串時(shí)系統(tǒng)會(huì)在字符串尾部加上“0”轉(zhuǎn)義字符以作為該字符串的結(jié)束符。字符串常量“A”和字符常量A是不同的,前者在存儲(chǔ)時(shí)多占用一個(gè)字節(jié)的空間。14(5)位標(biāo)量位標(biāo)量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,它的值是一個(gè)二進(jìn)制位,不是0就是1。下面我們來(lái)看一些常量定義的例子:#define False 0 x0;/用預(yù)定義語(yǔ)句可以定義常量,這里定義False為0,True 為1#define True 0 x1; /在程序中用到False編譯時(shí)自動(dòng)用0替換,同理True替換為1unsigned int code a=100; /這一句用code把a(bǔ)定義在程序

16、存儲(chǔ)器中并賦值const unsigned int c=100; /用const定義c為無(wú)符號(hào)int常量并賦值以上兩句它們的值都保存在程序存儲(chǔ)器中,而程序存儲(chǔ)器在運(yùn)行中是不允許被修改的,所以如果在這兩句后面用了類似a=110,a+這樣的賦值語(yǔ)句,編譯時(shí)將會(huì)出錯(cuò)。1常量常量是在程序運(yùn)行過(guò)程中不能改變的量,如固定的數(shù)據(jù)表、字符等。常量的數(shù)據(jù)類型只有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。152變量變量是可以在程序運(yùn)行過(guò)程中不斷變化的量,變量的定義可以使用所有C51編譯器支持的數(shù)據(jù)類型。要在程序中使用變量必須先用標(biāo)識(shí)符作為變量名,并指出所用的數(shù)據(jù)類型和存儲(chǔ)模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲(chǔ)空

17、間。16(1)變量的定義和作用范圍定義一個(gè)變量的格式如下:存儲(chǔ)類型 數(shù)據(jù)類型 存儲(chǔ)器類型 變量名表在定義格式中除了數(shù)據(jù)類型和變量名表是必要的,其他都是可選項(xiàng)。存儲(chǔ)類型不同存儲(chǔ)類型的變量以及不同位置定義的變量具有不同的代碼有效范圍,也就是變量的作用域。在單片機(jī)程序中,按照變量的存儲(chǔ)類型,可以分為:自動(dòng)變量、全局變量、靜態(tài)變量和寄存器變量。2變量17存儲(chǔ)類型自動(dòng)變量是以關(guān)鍵字auto標(biāo)識(shí)的變量類型,其一般是在函數(shù)的內(nèi)部或者復(fù)合語(yǔ)句中使用。自動(dòng)型變量的作用域范圍是函數(shù)或者復(fù)合語(yǔ)句的內(nèi)部。在C51中,函數(shù)或復(fù)合語(yǔ)句內(nèi)部定義自動(dòng)變量時(shí),關(guān)鍵字auto可以省略,即默認(rèn)為自動(dòng)型變量。在程序執(zhí)行過(guò)程中,自動(dòng)變

18、量是動(dòng)態(tài)分配存儲(chǔ)空間的。當(dāng)程序執(zhí)行到該變量聲明語(yǔ)句時(shí),根據(jù)變量類型自動(dòng)為其分配存儲(chǔ)空間。當(dāng)該函數(shù)或者復(fù)合語(yǔ)句執(zhí)行完畢后,該變量的存儲(chǔ)空間將立刻自動(dòng)取消,此時(shí),該自動(dòng)變量失效,在函數(shù)或者復(fù)合語(yǔ)句外部將不能夠使用該變量。 自動(dòng)變量全局變量是以關(guān)鍵字extern標(biāo)識(shí)的變量類型,如果一個(gè)變量定義在所有函數(shù)的外部,即整個(gè)程序文件的最前面,那么這個(gè)變量便是全局變量。全局變量有時(shí)也稱為外部變量。在編譯程序時(shí),全局變量將被靜態(tài)地分配適當(dāng)?shù)拇鎯?chǔ)空間。該變量一旦分配空間,在整個(gè)程序運(yùn)行過(guò)程中便不會(huì)消失。因此,全局變量對(duì)整個(gè)程序文件都有效,即全局變量可以被該程序文件中的任何函數(shù)使用。 全局變量靜態(tài)變量以關(guān)鍵字sta

19、tic定義,從變量作用域來(lái)看,靜態(tài)變量和自動(dòng)變量類似,作用域只是定義該變量的函數(shù)內(nèi)部。如果靜態(tài)變量定義在函數(shù)外部,將具有全局的作用域。而從內(nèi)存占用的角度,靜態(tài)變量和全局變量類似,其始終占有內(nèi)存空間。單片機(jī)的CPU寄存器中也可以保存少量的變量,這種變量稱為寄存器變量。寄存器變量以關(guān)鍵字register聲明。由于單片機(jī)對(duì)CPU寄存器的讀寫十分快,因此寄存器變量的操作速度要原高于其他類型的變量。寄存器變量常用于某一變量名頻繁使用的情況,這樣做可以提高系統(tǒng)的運(yùn)算速度。由于單片機(jī)資源有限,程序中只允許同時(shí)定義兩個(gè)寄存器變量。如果多于兩個(gè),在編譯時(shí)會(huì)自動(dòng)地將其他的寄存器變量當(dāng)做非寄存器變量來(lái)處理。 寄存器

20、變量 靜態(tài)變量18存儲(chǔ)器類型存儲(chǔ)器類型的說(shuō)明就是指定該變量在C51硬件系統(tǒng)中所使用的存儲(chǔ)區(qū)域,并在編譯時(shí)準(zhǔn)確的定位。表7-4中是KEIL uVision2所能認(rèn)別的存儲(chǔ)器類型。表7-4 存儲(chǔ)器類型存儲(chǔ)器類型說(shuō) 明data直接訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器(128 字節(jié)),訪問(wèn)速度最快bdata可位尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器(16 字節(jié)),允許位與字節(jié)混合訪問(wèn)idata間接訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器(256 字節(jié)),允許訪問(wèn)全部?jī)?nèi)部地址pdata分頁(yè)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器(256 字節(jié)),用MOVXRi指令訪問(wèn)xdata外部數(shù)據(jù)存儲(chǔ)器(64KB),用MOVXDPTR指令訪問(wèn)code程序存儲(chǔ)器(64KB),用MOVCA+DPTR

21、指令訪問(wèn) 在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位則在52芯片中才有用,并和特殊寄存器地址重疊。說(shuō) 明19如果省略存儲(chǔ)器類型,系統(tǒng)則會(huì)按編譯模式small,compact或large所規(guī)定的默認(rèn)存儲(chǔ)器類型去指定變量的存儲(chǔ)區(qū)域。 small存儲(chǔ)模式small存儲(chǔ)模式將函數(shù)參數(shù)和局部變量放在片內(nèi)RAM(默認(rèn)變量類型為DATA,最大128字節(jié))。另外所有對(duì)象包括棧都優(yōu)先放置在片內(nèi)RAM,當(dāng)片內(nèi)RAM用滿,再向片外RAM放置。 compact存儲(chǔ)模式compact存儲(chǔ)模式中將參數(shù)和局部變量放在片外RAM(默認(rèn)存儲(chǔ)類型是PDATA,最大256字節(jié));通過(guò)R0、R1間接尋

22、址。 large存儲(chǔ)模式large存儲(chǔ)模式將參數(shù)和局部變量直接放入片外RAM(默認(rèn)的存儲(chǔ)類型是XDATA,最大64KB);使用數(shù)據(jù)指針DPTR間接尋址,因此訪問(wèn)效率較低。20對(duì)變量進(jìn)行絕對(duì)定位C51擴(kuò)展的關(guān)鍵字_at_專門用于對(duì)變量作絕對(duì)定位,_at_使用在變量的定義中,其格式為:存儲(chǔ)類型 數(shù)據(jù)類型 存儲(chǔ)區(qū) 變量名1 _at_ 地址常數(shù),變量名2例如: 對(duì)data區(qū)域中的 unsigned char變量aa作絕對(duì)定位:unsigned chardata aa _at_ 0 x30; 對(duì)pdata區(qū)域中的 unsigned int數(shù)組cc作絕對(duì)定位:unsigned int pdata cc10

23、 _at_ 0 x34; 對(duì)xdata區(qū)域中的 unsigned char變量printer_port作絕對(duì)定位:unsigned charxdata printer_port _at_ 0 x7fff;21對(duì)變量進(jìn)行絕對(duì)定位絕對(duì)地址變量在定義時(shí)不能初始化,因此不能對(duì)code型常量絕對(duì)定位對(duì)變量絕對(duì)定位的幾點(diǎn)說(shuō)明:絕對(duì)地址變量只能夠是全局變量,不能在函數(shù)中對(duì)變量絕對(duì)定位絕對(duì)地址變量多用于I/O端口,一般情況下不對(duì)變量作絕對(duì)定位位變量不能使用_at_絕對(duì)定位22(2)變量的初始化和賦值變量的初始化變量的初始化是指變量在被說(shuō)明的同時(shí)賦給一個(gè)初值。外部變量和靜態(tài)全程變量在程序開(kāi)始處被初始化,局部變量

24、包括靜態(tài)局部變量是在進(jìn)入定義它們的函數(shù)或復(fù)合語(yǔ)句時(shí)才作初始化。所有全程變量在沒(méi)有明確的初始化時(shí)將被自動(dòng)清零,而局部變量和寄存器變量在未賦值前其值是不確定的。對(duì)于外部變量和靜態(tài)變量,初值必須是常數(shù)表達(dá)式,而自動(dòng)變量和寄存器變量可以是任意的表達(dá)式,這個(gè)表達(dá)式可以包括常數(shù)和前面說(shuō)明過(guò)的變量和函數(shù)。23例如:float f0,f1=0.2; /定義全程變量,在初始化時(shí)f0被清零,f1被賦0.2main()static int i=10,j; /定義靜態(tài)局部變量,初始化時(shí)i被賦10,j不確定int k=i*5; /定義局部變量,初始化時(shí)k 被賦10*5=50char c=y; /定義字符型指什變量并初始

25、化變量的初始化24變量的賦值變量賦值是給已說(shuō)明的變量賦給一個(gè)特定值。單個(gè)變量的賦值: 整型變量和浮點(diǎn)變量。賦值格式如下:變量名=表達(dá)式;例如:main()int a,m; /定義局部整型變量a,mfloat n; /定義局部浮點(diǎn)變量na=100,m=20; /給變量賦值n=a*m*0.1; C語(yǔ)言中允許給多個(gè)變量賦同一值時(shí)可用連等的方式。說(shuō) 明main()int a,b,c;a=b=c=0;/同時(shí)給a,b,c賦值25變量的賦值 字符型變量。字符型變量可以用三種方法賦值。例如:main()char a0,a1,a2; /定義局部字符型變量a0,a1,a2a0=b; /將字母b賦給a0a1=50;

26、 /將十進(jìn)制數(shù)字2的ASCII值50賦給a1a2=x0d; /將回車符賦給a226277.2.1算術(shù)運(yùn)算符7.2.2關(guān)系運(yùn)算符7.2.3邏輯運(yùn)算符7.2.4布爾“位”運(yùn)算符7.2.5賦值運(yùn)算符7.2.6遞增/遞減運(yùn)算符7.2.7運(yùn)算符的優(yōu)先級(jí)28單片機(jī)C程序的運(yùn)算符和表達(dá)式如下: 關(guān)系運(yùn)算符6個(gè)=大于xy若x變量的值大于y變量的值,其結(jié)果為1,否則為0。小于x=大于等于x=y若x變量的值大于或等于y變量的值,則結(jié)果為1,否則為0。=小于等于xy)|(yz)若x變量的值大于y變量的值,或y變量的值也大于z變量的值,其結(jié)果為真(值為1),否則為假(值為0)!非運(yùn)算?。▁y)若x變量的值大于y變量的

27、值,其結(jié)果為真(值為1),否則為假(值為0)32布爾“位”運(yùn)算符與邏輯運(yùn)算符比較相似,不同之處在于邏輯運(yùn)算的最終結(jié)果為真或假,而布爾“位”運(yùn)算符的結(jié)果是一個(gè)具體數(shù)據(jù)。布爾“位”運(yùn)算符如表7-8所示。表7-8 布爾“位”運(yùn)算符符號(hào)作用舉例解釋&與運(yùn)算A=x&y變量A的結(jié)果為將x與y變量的每個(gè)位進(jìn)行AND運(yùn)算|或運(yùn)算B=x|y變量B的結(jié)果為將x與y變量的每個(gè)位進(jìn)行OR運(yùn)算異或運(yùn)算C=xy變量C的結(jié)果為將x與y變量的每個(gè)位進(jìn)行XOR運(yùn)算取反運(yùn)算D=x變量D的結(jié)果為將x與y變量的每個(gè)位進(jìn)行取反運(yùn)算左移運(yùn)算E=x右移運(yùn)算F=xn變量F的結(jié)果為將變量x值右移n位。33賦值運(yùn)算符包括“=”運(yùn)算符,還有算術(shù)運(yùn)

28、算符,邏輯運(yùn)算符等,如表7-9所示。表7-9 賦值運(yùn)算符=賦值A(chǔ)=x將x變量的值賦給變量A中+=賦值加B+=x將B變量的值與x變量的值相加,和存存到變量B當(dāng)中,功能相當(dāng)于B=B+x- =賦值減C-=x將C變量的值與x變量的值相減,差存存到變量C當(dāng)中,功能相當(dāng)于C=C+x* =賦值乘D*=x將D變量的值與x變量的值相乘,積存入D變量當(dāng)中,功能相當(dāng)于D=D*x/ =賦值除E/=x將E變量的值除于變量x,商存入到變量E當(dāng)中,功能相當(dāng)于E=E/x% =賦值取余F%=x將F變量的值除于x變量,余數(shù)存入F變量中,功能相當(dāng)于F=F%x符號(hào)作用舉例解釋& =賦值與G&=x將G變量的值與變量x的值進(jìn)行AND運(yùn)算

29、,其結(jié)果存入G變量中,功能相當(dāng)于G=G&x| =賦值或H|=x將H變量的值與x變量的值進(jìn)行OR運(yùn)算,結(jié)果存入H變量中,功能相當(dāng)于H=H&x =賦值異或I=x將I變量的值與x變量的值進(jìn)行XOR運(yùn)算,結(jié)果存入I變量中,功能相當(dāng)于I=Ix =左移賦值J=n將J變量的值左移n位,其功能與J=J =右移賦值K=n將K變量的值右移n位,其功能與K=Kn相當(dāng)34遞增/遞減運(yùn)算符也是一種比較有效的運(yùn)算符,包括自增與自減運(yùn)算符,如表7-10所示。表7-10 遞增/遞減運(yùn)算符符號(hào)作用舉例解釋+ +自加1x+將x變量的值自加1 - -自減1x- -將x變量的值自減135運(yùn)算符的優(yōu)先級(jí)如表7-11所示。表7-11 運(yùn)

30、算符的優(yōu)先級(jí)1(、)小括號(hào)2、!取補(bǔ)碼、反相運(yùn)算符3+ +、- -自加1,自減14*、/、%乘、除、取余數(shù)5+、-加、減6左移、右移7、=、=、!=關(guān)系運(yùn)算符優(yōu)先級(jí)運(yùn)算符或提示符解釋8&布爾“位”AND運(yùn)算符9布爾“位”XOR運(yùn)算符10|布爾“位”O(jiān)R運(yùn)算符11&邏輯運(yùn)算符AND12|邏輯運(yùn)算符OR13=、*=、/=、%=、+=、-=、=、&=、=、|=賦值運(yùn)算符36377.3.1循環(huán)指令7.3.2選擇指令38循環(huán)指令就是將程序流控制在指定的循環(huán)里,直到符合指定條件才結(jié)束循環(huán),繼續(xù)往下執(zhí)行。Keil C所提供的循環(huán)指令有for語(yǔ)句、while語(yǔ)句、do-while語(yǔ)句。1計(jì)數(shù)循環(huán)for語(yǔ)句是一

31、個(gè)很實(shí)用的計(jì)數(shù)循環(huán),其格式如下:for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 指令; break; 例如:for(int i=0;i0;x-) for(;);2前條件循環(huán)while語(yǔ)句將判斷條件放在語(yǔ)句之前,稱為前條件循環(huán),其格式如下:while(表達(dá)式) 指令; break; 3后條件循環(huán)do-while語(yǔ)句提供先執(zhí)行再判斷的功能,稱為后條件循環(huán),其格式如下:do 指令; break; while(表達(dá)式);39選擇指令的功能是根據(jù)條件決定程序的流程,Keil C所提供的選擇指令有if-else語(yǔ)句及switch-case語(yǔ)句。if-else語(yǔ)句提供條件判斷的語(yǔ)句,稱為條件選擇語(yǔ)句,其格式(如下)

32、與流程圖(如圖7-1):if(表達(dá)式) 指令區(qū)域1; else 指令區(qū)域2; 圖7-1 if-else條件選擇流程圖if的多重條件判斷語(yǔ)句如下,其流程圖如圖7-2所示。if(表達(dá)式1) 指令區(qū)域1; else if(表達(dá)式2) 指令區(qū)域2; else if(表達(dá)式3) 指令區(qū)域3; else 指令區(qū)域4; 圖7-2 if-else 條件判斷多重選擇流程圖1條件選擇402多分支選擇switch-case語(yǔ)句提供多重選擇,就像是波段開(kāi)關(guān)一樣,稱為多分支選擇語(yǔ)句。這種選擇方式不會(huì)有優(yōu)先等級(jí)的問(wèn)題,其格式如下,switch-case語(yǔ)句的流程圖如圖7-3所示。switch(表達(dá)式) case(常數(shù)1)

33、; 指令區(qū)域1; break; case(常數(shù)2): 指令區(qū)域2; break; default: 指令區(qū)域n; break; 圖7-3 switch-case多重選擇流程圖4142數(shù)組也是一種變量,將一堆相同數(shù)據(jù)形態(tài)的變量,以一個(gè)相同的變量名稱來(lái)表示。既然是一種變量,使用之前就得聲明,其聲明格式如下:數(shù)據(jù)類型 數(shù)組名數(shù)組大小例如聲明一個(gè)含有5個(gè)字符的數(shù)組:char LPC5;這個(gè)數(shù)組包括LPC0LPC4等5個(gè)字符,是字符的數(shù)組,相當(dāng)于常說(shuō)的“字符串”。但是Keil C沒(méi)有“字符串”數(shù)據(jù)類型,所以用字符數(shù)組來(lái)代替字符串變量。聲明數(shù)組的同時(shí)也可以賦初值,如 char LPC5=ABCD經(jīng)過(guò)上述聲

34、明后,LPC0=A, LPC1=B, LPC2=C, LPC3=D, LPC4= 0。數(shù)組(array)是一種將同類型數(shù)據(jù)集合管理的數(shù)據(jù)結(jié)構(gòu),而指針(Pointer)是存放存儲(chǔ)器地址的變量,因此,數(shù)組與指針可謂是數(shù)據(jù)管理的好幫手。若不知道數(shù)組的大小可不填數(shù)組大小,而由程序來(lái)處理,例如:char string1= welcome to hua dong jiao da li gong xue yuan如果聲明整數(shù)(int)或浮點(diǎn)數(shù)(float)數(shù)組,也要指定其初始值,可利用大括號(hào)實(shí)現(xiàn),語(yǔ)句如下:int Num6= 30,22,33,44,55,66;若要定義多維數(shù)組,可以按如下形式:數(shù)據(jù)類型 數(shù)

35、組名數(shù)組大小1數(shù)組大小2數(shù)組大小n;如:int Num32=10,11,12,13,14,15;1數(shù)組432指針指針是用來(lái)存放存儲(chǔ)器地址的變量,既然是變量,使用前均需要先定義才能使用。數(shù)據(jù)類型 *變量名稱;通常指針都采用整數(shù)數(shù)據(jù)類型,例如要聲明一個(gè)名為ptr的指針,語(yǔ)句如下:int *ptr;也可以將同類型的變量與指針?lè)旁谝黄鹇暶?,語(yǔ)句如下:int *ptr1, *ptr2, a, b, c;與指針息息相關(guān)的運(yùn)算符是“&”,該運(yùn)算符的功能是取變量的地址,運(yùn)算符可以將指定的變量的地址放入指針變量,以便后續(xù)操作,語(yǔ)句如下:ptr1=&a;執(zhí)行以上語(yǔ)句后,a變量的地址就被放入ptr1指針變量。當(dāng)然,

36、這些操作主要是針對(duì)數(shù)組,通常會(huì)先取得數(shù)組的第一個(gè)元素的地址,如ptr1=&Num00;執(zhí)行以上語(yǔ)句后,Num數(shù)組的首地址將被放入ptr1指針變量。若要將Num00內(nèi)容輸出到P2口,可執(zhí)行P2=Num00;或以指針變量的方式實(shí)現(xiàn)以上操作,語(yǔ)句如下:P2=*ptr1;同理,若要將Num11的內(nèi)容賦值給P2,語(yǔ)句如下:P2=Num11;或以指針變量的方式實(shí)現(xiàn)以上操作,語(yǔ)句如下:P2=*(ptr1+3);4445函數(shù)(Function)和中斷子程序都屬于子程序。也可以稱函數(shù)為子程序,稱中斷子程序?yàn)橹袛嗪瘮?shù)。1函數(shù)函數(shù)的結(jié)構(gòu)與主程序的結(jié)構(gòu)類似,不過(guò)函數(shù)還能傳入自變量,其結(jié)構(gòu)如下:void Sub_nam

37、e(int x) int i, j ; unsigned char LED; LED=0 xff;/*關(guān)閉LED*/ 其中,void為傳出自變量,Sub_name為函數(shù)名,x為傳入自變量,“int i,j;和unsigned char LED;”為變量聲明區(qū),“LED=0 xff; /*關(guān)閉LED*/”為程序區(qū)。46中斷子程序的結(jié)構(gòu)與函數(shù)的結(jié)構(gòu)類似,不過(guò)中斷子程序不能傳入自變量,也不返回值。而且使用中斷子程序之前不需要聲明,但需要在主程序中進(jìn)行中斷的相關(guān)設(shè)置。從中斷子程序的第一行就可以看出它與一般函數(shù)的不同,如下所示:void 中斷子程序名稱 (void) interrupt 中斷編號(hào) using 寄存器組2中斷

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論