現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐_第1頁(yè)
現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐_第2頁(yè)
現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐_第3頁(yè)
現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐_第4頁(yè)
現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2 C51單片機(jī)開(kāi)發(fā)語(yǔ)言單片機(jī)開(kāi)發(fā)語(yǔ)言n7.2.1 C51程序語(yǔ)言簡(jiǎn)介 n7.2.2 C51程序語(yǔ)言的基本結(jié)構(gòu)n7.2.3 C51的數(shù)據(jù)類(lèi)型n7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n7.2.5 C51的算術(shù)與邏輯運(yùn)算n7.2.6 C51程序語(yǔ)言的語(yǔ)句n7.2.7 函數(shù)和指針數(shù)組n7.2.8 預(yù)處理指令 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.1 C51程序語(yǔ)言簡(jiǎn)介 n初級(jí)單片機(jī)程序設(shè)計(jì)者喜歡使用匯編語(yǔ)言撰寫(xiě) 8051 單片機(jī)程序,因?yàn)樗梢灾苯硬僮骷拇嫫骱痛鎯?chǔ)器,并掌控單片機(jī)內(nèi)部的每個(gè)工作細(xì)節(jié)。但隨著 8051 系列單片機(jī)種類(lèi)的多樣化,功能多元化與程序復(fù)雜化,使得

2、程序設(shè)計(jì)者都逐漸采用C51 語(yǔ)言程序編寫(xiě) 8051 單片機(jī)程序,原因有以下幾點(diǎn): n若使用匯編語(yǔ)言,程序設(shè)計(jì)者必須熟悉它所針對(duì)的硬體結(jié)構(gòu)的每一細(xì)節(jié),才能正確的操作裝置。如果要將程序移植到其它不同的單片機(jī)上,則因?yàn)槠涮幚砥骷按鎯?chǔ)器配置有所不同,勢(shì)必大量修改其程序,增加開(kāi)發(fā)時(shí)間。尤其是現(xiàn)在以 8051 為核心的單片機(jī)型號(hào)種類(lèi)繁多。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.1 C51程序語(yǔ)言簡(jiǎn)介n使用匯編語(yǔ)言處理復(fù)雜運(yùn)算時(shí),程序設(shè)計(jì)者必須考慮程序中每個(gè)操作細(xì)節(jié),例如在進(jìn)行四則運(yùn)算時(shí),還要考慮如何配合特定的寄存器去執(zhí)行任務(wù),使程序變的十分冗長(zhǎng),缺乏可讀性,增加程序設(shè)計(jì)與調(diào)試的難度。 n基于以上原因,8051

3、系列單片機(jī)有必要引用一套C51高級(jí)語(yǔ)言,作為程序開(kāi)發(fā)語(yǔ)言。采用 Keil Vision 提供的C51程序語(yǔ)言編譯與連結(jié)功能進(jìn)行編譯,通過(guò)編譯的方式,協(xié)助使用者處理程序中許多瑣碎且重復(fù)的細(xì)節(jié)。現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.2 C51程序語(yǔ)言的基本結(jié)構(gòu)nC51 的程序?qū)懛ɑ旧虾鸵话鉉語(yǔ)言相類(lèi)似。程序主體是由許多的函數(shù)(function) 匯編而成,函數(shù)的主體內(nèi)容必須以大括號(hào) 包含。程序的執(zhí)行,就是在函數(shù)彼此調(diào)用完成。n一個(gè)完整的程序,無(wú)論它有幾個(gè)函數(shù),其中必定有一個(gè)函數(shù)名為“main()”,它被C語(yǔ)言的編譯器認(rèn)定為是程序的起始點(diǎn),也就是程序第一個(gè)被執(zhí)行的函數(shù)。以下就是一個(gè)最基本C51程序。現(xiàn)

4、代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.2 C51程序語(yǔ)言的基本結(jié)構(gòu)n/ 例:C51示例n #include n void main() n n P0=0 x81; / 輸出到 P0 口 n P1=0 x0F; / 輸出到 P1口n P2=0 x55; /* 輸出到 P2口*/ n P3=0 xC3; /* 輸出到 P3口*/ n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.2 C51程序語(yǔ)言的基本結(jié)構(gòu)n從C51 程序的基本結(jié)構(gòu)看出,程序主體是由一個(gè) main()的函數(shù)所組成。大括號(hào)內(nèi)內(nèi)容即為C51程序碼。n撰寫(xiě)C51程序需要注意如下的事項(xiàng): n1. C51 程序結(jié)構(gòu)中,程序碼是由語(yǔ)句 (Statement)

5、組成,每個(gè)語(yǔ)句就相當(dāng)一行指令碼,必須用分號(hào)標(biāo)記 “;”做為結(jié)尾。因此在程序編輯器中換行,若編譯器沒(méi)有看到 “;”,會(huì)視為同一行處理。反之,就算在編輯器沒(méi)換行,但是您打了“;”,編譯器會(huì)視為兩個(gè)不同的敘述。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.2 C51程序語(yǔ)言的基本結(jié)構(gòu)n2. C51 會(huì)區(qū)分字母大小寫(xiě),這和 BASIC 程序語(yǔ)言不同,所以千萬(wàn)不要將大小寫(xiě)混用,如main不可寫(xiě)成MAIN。 n3. C51 的注解有兩種寫(xiě)法。一種以“/”開(kāi)頭,編譯器會(huì)把“/”之后的文字全部當(dāng)做注解,直到此行的尾端。另一種方式是用 /*( 注解 )*/ 。標(biāo)記“/*”是注解的開(kāi)始,標(biāo)記“*/”為注解的結(jié)束,兩者之間不

6、限行數(shù)。 n4. 注解不參與程序的執(zhí)行,若適時(shí)在程序中加入注解,標(biāo)明各區(qū)段程序的功能,可增加程序的可讀性,對(duì)于日后程序的調(diào)試與維護(hù)都有很大的幫助。 n5. #include 是預(yù)編譯指令,是C51 程序執(zhí)行前對(duì)編譯器所下的指示。 是編譯 8051單片機(jī)程序必須指定載入的頭文件?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n在標(biāo)準(zhǔn)的C 語(yǔ)言中,提供 char, int, short, long, float, double 等基本的數(shù)據(jù)類(lèi)型。數(shù)據(jù)類(lèi)型的預(yù)設(shè)值是帶有正負(fù)號(hào) (以最高數(shù)據(jù)位來(lái)表示其正負(fù)號(hào),0為正,1為負(fù)) 。若在數(shù)據(jù)類(lèi)型前面加上關(guān)鍵字 “unsigned”,指明數(shù)據(jù)是不帶符

7、號(hào)。為了配合 8051 單片機(jī)的操作,C51額外定義 bit 、sfr 、sfr16 、sbit 等數(shù)據(jù)類(lèi)型。這些類(lèi)型原本不包含在ANSI C中,其定義及使用方法與前述的基本形態(tài)有所差異,C51的常數(shù)、變量與各種結(jié)構(gòu)的聲明,是在存儲(chǔ)器位置上預(yù)留數(shù)據(jù)存放的空間。不同的數(shù)據(jù)類(lèi)型,占有存儲(chǔ)器空間的大小與數(shù)據(jù)存放格式有所不同,因此聲明就等于是在配置存儲(chǔ)器空間。這樣可以省去繁雜的數(shù)據(jù)搬移與尋址工作。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n表7-3Keil C51編譯器支持的數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型長(zhǎng)度值域char1字節(jié)有符號(hào)字符,范圍-128127unsigned char1字節(jié)無(wú)符號(hào)字符,范

8、圍0255int2字節(jié)有符號(hào)整型數(shù)據(jù),范圍-32768+32767unsigned int2字節(jié)無(wú)符號(hào)整數(shù)型態(tài),范圍065535long4字節(jié)有符號(hào)長(zhǎng)整數(shù)型態(tài),范圍-214783648+214783647unsigned long4字節(jié)無(wú)符號(hào)長(zhǎng)整數(shù)型態(tài),范圍04294967295float4字節(jié)符點(diǎn)型數(shù)據(jù),范圍1.75494E-38 3.402823E+38*13字節(jié)對(duì)象的地址bit位0或1sfr1字節(jié)0255sfr162字節(jié)065535sbit位0或1現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n(1)char:占用一個(gè)字節(jié)(byte)的存儲(chǔ)器空間,即8個(gè)數(shù)據(jù)位(bit) 。一般可

9、表示-128127的整數(shù),定義為 unsigned(無(wú)號(hào)數(shù))時(shí)可表示 0255的整數(shù)。這是C51程序最常用到的數(shù)據(jù)類(lèi)型,因?yàn)?051單片機(jī)是8位數(shù)據(jù)的,主要運(yùn)算都以8位數(shù)據(jù)為主,而且存儲(chǔ)器空間有限,所以采用這種變量型式最經(jīng)濟(jì)。 n(2)int:整數(shù)占用2個(gè)字節(jié),也就是16個(gè)數(shù)據(jù)位 (bit) ,可表示-3276832767之間的整數(shù),定義為 unsigned(無(wú)號(hào)數(shù))可表示065536的整數(shù)。由于int需要使用兩個(gè)單位的空間,在操作上也同時(shí)增加處理器的負(fù)擔(dān),所以若非必要請(qǐng)盡量少用。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n(3)short:短整數(shù)在C51中,它和 int 是等價(jià)

10、,這里不重復(fù)說(shuō)明。 n(4)long:長(zhǎng)整數(shù)占用4個(gè)字節(jié) ,即32個(gè)數(shù)據(jù)位(bit),可表示-21474836482147483647之間的整數(shù),定義為 unsigned(無(wú)號(hào)數(shù))可表示04294967295之間的整數(shù),一般在 C51較少使用。 n(5)float:浮點(diǎn)數(shù)占用4個(gè)字節(jié) ,即32個(gè)數(shù)據(jù)位(bit)。其中第一個(gè)數(shù)據(jù)位為正負(fù)號(hào),接下來(lái) 8個(gè)數(shù)據(jù)位代表指數(shù) (以2為底),最后23數(shù)據(jù)位數(shù)代表有效位數(shù) (忽略開(kāi)頭的1以節(jié)省一個(gè)數(shù)據(jù)位) ,最多可表示-3.410-38 3.41038,共有7位有效數(shù)字(十進(jìn)制) ,請(qǐng)?zhí)貏e注意,不可定義unsigned float 。此外, float的操作

11、是很浪費(fèi)空間和時(shí)間,若不是特殊的情況,不要輕易使用 (操作浮點(diǎn)數(shù),必須連結(jié) C51FPS.LIB 程序庫(kù))。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n(6)double:在C51中,此類(lèi)型和 float 等價(jià)為 32 數(shù)據(jù)位的浮點(diǎn)數(shù)。 n由于C51程序處理有符號(hào)數(shù)的機(jī)會(huì)較少,為了提高存儲(chǔ)器的使用效率,通常在數(shù)據(jù)類(lèi)型定義時(shí)指明為不帶符號(hào)的“unsigned”。由表7-3所示,數(shù)據(jù)類(lèi)型的可表示范圍在不用符號(hào)數(shù)情況下,正數(shù)的涵蓋范圍可增加一倍。n(7)bit:位標(biāo)量 nbit位標(biāo)量是 C51編譯器的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可定義一個(gè)位標(biāo)量,但不能定義n位指針,也不能定義位數(shù)組。它的值

12、是一個(gè)二進(jìn)制位,不是 0就是1,類(lèi)似一些高級(jí)語(yǔ)n言中Boolean類(lèi)型中的True 和False。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n(8)sfr:C51特別提供給直接存取單片機(jī)上位于 0 x800 xFF 位址的特殊寄存器,它的定義方法為 : sfr 變量名稱(chēng) = 特殊寄存器的地址。 n通過(guò)這個(gè)變量名稱(chēng)的定義,就可以存取特殊寄存器的內(nèi)容。例如定義 “sfr P0=0 x80;”,操作P0來(lái)實(shí)現(xiàn)對(duì)Port 0的讀寫(xiě)。但請(qǐng)注意,sfr不可在任何函數(shù)中定義,必須定義成全局變量 (也就是不包含在任何大括號(hào)中) ,這個(gè)數(shù)據(jù)類(lèi)型占用8位數(shù)據(jù)。(見(jiàn)KeilC51INCreg51.h

13、標(biāo)頭檔,里面有一些常用的 8051特殊寄存器的定義)。現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n(9)sfr16:16位特殊功能寄存器 nsfr16 :定義方式和特性均與 sfr 一樣,但是它是針對(duì) 16位數(shù)據(jù)的特殊寄存器,因此其內(nèi)容會(huì)占用 16位數(shù)據(jù)。 n(10)sbit :有兩種功用,一是能定義存取RAM 中可位尋址區(qū) (20H-2FH) 的內(nèi)容。二是能定義存取位數(shù)據(jù)(80H-FFH) 中的特定數(shù)據(jù),其定義方式與sfr相同,另外由于存儲(chǔ)器位址都是以1個(gè)字節(jié)也就是8個(gè)位數(shù)據(jù),如果想指明是哪個(gè)位數(shù)據(jù),則可使用”符號(hào),定義方式如下: n sbit 變量名稱(chēng) =特殊寄存器的位址 位數(shù)

14、據(jù)編號(hào);現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n其中位數(shù)據(jù)編號(hào)可為 07,分別對(duì)應(yīng)這個(gè)位元組中的8個(gè)位數(shù)據(jù)。例如8位數(shù)據(jù)sw,可分別設(shè)定每一個(gè)位數(shù)據(jù)的名稱(chēng),如 n sbit sw_0=sw0; n sbit sw_1=sw1; n 請(qǐng)注意,這里的符號(hào)意義是指8位數(shù)據(jù)的第07的數(shù)據(jù)位,而不是XOR運(yùn)算符?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型nreg51.h 頭文件頭文件 nC51將8051單片機(jī)的寄存器地址定義寫(xiě)成一個(gè)頭文件reg51.h,文件內(nèi)部就利用 sfr 將寄存器以習(xí)慣常用的名稱(chēng)做定義。在 C:KeilC51INC 目錄上可以找到這個(gè)文件,可以使用一般文

15、字編輯器,如記事本打開(kāi),內(nèi)容如下: 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型nHeader file for generic 80C51 and 80C31 microcontroller. n Copyright (c) 1988-1997 Keil Elektronik GmbH and Keil Software, Inc. n All rights reserved. n - -*/ n /* BYTE Register */ n sfr P0 = 0 x80; n sfr P1 = 0 x90; n sfr P2 = 0 xA0; n sfr P3 = 0 xB0; n

16、 sfr PSW = 0 xD0; n sfr ACC = 0 xE0; n sfr B = 0 xF0; n sfr SP = 0 x81; n sfr DPL = 0 x82; n sfr DPH = 0 x83; 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n sfr PCON = 0 x87; n sfr TCON = 0 x88; n sfr TMOD = 0 x89; n sfr TL0 = 0 x8A; n sfr TL1 = 0 x8B; n sfr TH0 = 0 x8C; n sfr TH1 = 0 x8D; n sfr IE = 0 xA8; n sfr IP

17、= 0 xB8; n sfr SCON = 0 x98; n sfr SBUF = 0 x99; n /* BIT Register */ n /* PSW */ 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型nsbit CY = 0 xD7; n sbit AC = 0 xD6; n sbit F0 = 0 xD5; n sbit RS1 = 0 xD4; n sbit RS0 = 0 xD3; n sbit OV = 0 xD2; n sbit P = 0 xD0; n /* TCON */ n sbit TF1 = 0 x8F; n sbit TR1 = 0 x8E; n sbi

18、t TF0 = 0 x8D; 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n sbit TR0 = 0 x8C; n sbit IE1 = 0 x8B; n sbit IT1 = 0 x8A; n sbit IE0 = 0 x89; n sbit IT0 = 0 x88; n /* IE */ n sbit EA = 0 xAF; n sbit ES = 0 xAC; n sbit ET1 = 0 xAB; n sbit EX1 = 0 xAA; n sbit ET0 = 0 xA9; n sbit EX0 = 0 xA8; 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n

19、/* IP */ n sbit PS = 0 xBC; n sbit PT1 = 0 xBB; n sbit PX1 = 0 xBA; n sbit PT0 = 0 xB9; n sbit PX0 = 0 xB8; n /* P3 */ n sbit RD = 0 xB7; n sbit WR = 0 xB6; n sbit T1 = 0 xB5; n sbit T0 = 0 xB4; n sbit INT1 = 0 xB3; n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型n sbit INT0 = 0 xB2; n sbit TXD = 0 xB1; n sbit RXD = 0

20、 xB0; n/* SCON */ n sbit SM0 = 0 x9F; n sbit SM1 = 0 x9E; n sbit SM2 = 0 x9D; n sbit REN = 0 x9C; n sbit TB8 = 0 x9B; n sbit RB8 = 0 x9A; n sbit TI = 0 x99; n sbit RI = 0 x98 ;現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.3 C51的數(shù)據(jù)類(lèi)型nreg51.h 這個(gè)文件是 Keil Vision 系統(tǒng)內(nèi)建的頭文件,在編寫(xiě) 8051 單片機(jī)程序時(shí),每個(gè)程序開(kāi)頭只要使用 “#include“ 預(yù)編譯指令將它加入,就可以直接在程序中使用這個(gè)

21、以使用者習(xí)慣使用的變量名稱(chēng)定義的特殊寄存器 (SFR) ,免除使用者自行定義的麻煩?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n1. 變量的定義 n變量使用之前,必須先定義變量的類(lèi)型?;镜淖兞慷x方法如下: n(unsigned/singed) 變量類(lèi)型 變量名稱(chēng) (= 初始值 ); n 變量類(lèi)型與變量名稱(chēng)以加粗體顯示,表示一定要寫(xiě)出,未寫(xiě)unsigned一律視為signed類(lèi)型。變量可以先預(yù)設(shè)初始值,也可以暫時(shí)先不給定。 n有關(guān)變量的名稱(chēng),要注意以下幾點(diǎn): n(1)禁止使用ANSI C/C51所保留的關(guān)鍵字,因?yàn)樗诔绦蛑杏兄厥獾淖饔谩?n(2)變量開(kāi)頭的字符

22、不可以是數(shù)字,另外一些有特殊意義的符號(hào)如“+-*/?#;&”,也不要用在變量中,而且名稱(chēng)中不可有空格,如果需要分隔可使用下劃線“_”來(lái)完成。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n(3)在相同區(qū)域內(nèi) (位于同一中)的變量名稱(chēng)不可重復(fù)使用,即使它們具有不同的變量類(lèi)型。 n(4)在同一個(gè)變量定義中,允許定義多個(gè)相同類(lèi)型的變量,變量和變量間只須用逗號(hào)分隔即可,如 “int a=1,b=2,c=3;” 。 n(5)通常變量的內(nèi)容是可以被任意變更的,如果想定義一個(gè)常數(shù) (也就是在程序的任何地方都不能被改變),可在變量定義前加入關(guān)鍵字 ”const”,例如 const i

23、nt size=5;被定義成 const 的變量必須立即給予初始值,嘗試改變一個(gè)常數(shù)會(huì)被 Compiler 所糾正?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n2. 變量的有效范圍 nC51語(yǔ)言由函數(shù)組成,在不同的函數(shù)中定義的變量,有效范圍也有一定的規(guī)范,即變量在函數(shù)中保存或釋放存儲(chǔ)器空間的方式有所不同。一般可分為局部變量、靜態(tài)變量、全局變量。分別說(shuō)明如下: n(1)局部變量:C51語(yǔ)言最常使用的變量類(lèi)型。在函數(shù)的大括號(hào)“內(nèi)定義的變量,有效范圍僅限于大括號(hào)內(nèi)部,當(dāng)程序一離開(kāi)此函數(shù),變量就失去作用,占有的存儲(chǔ)器也會(huì)被釋放。在不同括號(hào)內(nèi)的程序也不允許存取它,只有在 ma

24、in()函數(shù)中才有作用。此外,一些 C51語(yǔ)言的程序流程控制指令,如 for, while 等,也具有大括號(hào),如果在其中定義變量,則有效范圍也只限于大括號(hào)中的程序部分。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n(2)靜態(tài)變量 :局部變量一旦離開(kāi)其所在的大括號(hào)就失去作用,存儲(chǔ)器會(huì)被釋放,但是能通過(guò)在定義前加入static關(guān)鍵字,靜態(tài)變量定義讓系統(tǒng)幫保留變量的內(nèi)容,以留待下一次被調(diào)用時(shí)使用,如下面的例子 :n void function() n n static int s; n s=5; n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n

25、當(dāng)?shù)谝淮握{(diào)用functon 時(shí),會(huì)建立靜態(tài)變量s,并且在它結(jié)束時(shí),保留它的值 (s=5) 。當(dāng)再次調(diào)用function 時(shí),不會(huì)再重建一個(gè)變量s,而直接把原先s的值拿出來(lái)用,所以一進(jìn)入function,s的值就已經(jīng)是 5了( 在執(zhí)行 s=5 之前) ,靜態(tài)變量一直要到程序結(jié)束后才會(huì)被清除。 n(3)全局變量:必須定義在所有大括號(hào)之外,而且通常在程序的最前面定義,它的特點(diǎn)是能在任何函數(shù)中被使用,而且一直要到程序結(jié)束后才會(huì)被釋放,如:現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型nint g; n void main() n n g=5; n n void fun1() n

26、 n g=8; n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n雖然定義全局變量十分方便,但是由于所有函數(shù)都能存取,因而增加管理上的不便,另外,萬(wàn)一外部變量和局部變量同名(這是被允許的),則系統(tǒng)會(huì)優(yōu)先存取局部變量。 n(4)外部變量:有時(shí)候,需要存取定義在別的局部的變量或該局部下方才定義的變量,可以用extern關(guān)鍵字來(lái)連接這個(gè)變量,嚴(yán)格說(shuō)起來(lái),用 extern 定義時(shí)并不會(huì)建立一個(gè)變量,它只會(huì)到其它模組去找尋同名的變量以連結(jié)。如:現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n void main() n n extern int e; n

27、 / below main or in other file n int e; 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n此時(shí),由于全局變量e是定義在 main函數(shù)之后,所以在main中不能直接存取這個(gè)變量(Compiler 會(huì)視同e是一個(gè)沒(méi)有定義的符號(hào)),但是通過(guò)加入外部變量,就可以在main中存取變量e了,但如果定義的外部變量確實(shí)在程序中沒(méi)有相應(yīng)的真實(shí)變量,則易造成程序出錯(cuò),在編譯程序時(shí),編譯器也會(huì)提醒這一點(diǎn)。現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n3. 變量的存儲(chǔ)種類(lèi)n變量定義時(shí)就指定了內(nèi)存種類(lèi)即變量存儲(chǔ)空間的分配,定義一個(gè)變

28、量的格式如下: n存儲(chǔ)種類(lèi) 數(shù)據(jù)類(lèi)型 存儲(chǔ)器類(lèi)型 變量名表;n存儲(chǔ)種類(lèi)有四種:自動(dòng)(auto),外部(extern),靜態(tài)(static)和寄存器(register),缺省類(lèi)型為自動(dòng)(auto)。此外,C51中提供了 data 、 bdata 、 idata 、 pdata 、 xdata 、 code 等修飾字,協(xié)助指定變量?jī)?chǔ)存的存儲(chǔ)器種類(lèi),而各種存儲(chǔ)器的特性如下: n(1)data類(lèi)型:指將變量存放在內(nèi)部存儲(chǔ)器前128字節(jié) (00H-7FH),使用直接尋址方式存取(8位尋址),所以速度最快。但這塊內(nèi)存的空間有限,而且前32個(gè)字節(jié)00H-20H是內(nèi)定的四組暫存器使用位置,所以必須節(jié)省使用?,F(xiàn)

29、代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n(2)bdata 類(lèi)型:即位于內(nèi)部存儲(chǔ)器20H-2FH 的可位尋址區(qū),包括16個(gè)字節(jié)(128bits) 。 定義bdata 型變量可做個(gè)別位處理。n(3)idata 類(lèi)型:通過(guò)間接尋址存取的變量,如果芯片內(nèi)部存儲(chǔ)器不止128字節(jié) ( 如 8052),則可以通過(guò)它來(lái)定義 80H 以上的存儲(chǔ)器內(nèi)容,速度不如 data 但可以存取所有的內(nèi)部存儲(chǔ)器地址 (00H-FFH),和data 一樣采8位尋址。 n(4)xdata 類(lèi)型:指將變量存放在外部存儲(chǔ)器之中,通過(guò)DPTR 暫存器作間接尋址存取,為十六位尋址,處理時(shí)間較長(zhǎng),一般有 64

30、 Kbytes 的儲(chǔ)存空間,如果占用空間大但存取不頻繁的變量可以盡量存在這里。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n(5)pdata 類(lèi)型:是指外部存儲(chǔ)器中的8位尋址區(qū),稱(chēng)為“分頁(yè)尋址區(qū)”,它位于 XDATA局部中,總共有256 個(gè)字節(jié),采用間接尋址的方式存取,速度稍快于 xdata ,而PDATA 位于 XDATA 中的位置則要看輸出給P2的內(nèi)容,它決定 XDATA的16位尋址中高8位,例如若 P2=0 xFF,則 PDATA 就位于 X:0 xFF00X:0 xFFFF 中。 n(6)code 類(lèi)型:是指存放程序的只讀存儲(chǔ)器ROM,定義其中的數(shù)據(jù)不可被任

31、意變更,所以一般可在其中定義一些常數(shù),code 使用DPTR寄存器作16位尋址。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.4 C51變量的存儲(chǔ)種類(lèi)和存儲(chǔ)器類(lèi)型n表7-4 存儲(chǔ)器種類(lèi)存儲(chǔ)器類(lèi)型 范圍 說(shuō)明 rgister R0R7 寄存器 code C:0 x0000C:0 xFFFF 程序存儲(chǔ)器 data D:0 x00D:0 x7F 128Byte 的內(nèi)部存儲(chǔ)器 ( 可直接指定地址 ) idata 0 x800 xFF 可間接尋址存儲(chǔ)器區(qū) bdata 00 x200 x2F 可位尋址的內(nèi)部存儲(chǔ)器 xdata 64KB 外部存儲(chǔ)器 pdata a=8,b=9 n b=-a; / result-a=7

32、,b=7 n遞增/遞減運(yùn)算符放前面時(shí),會(huì)被先執(zhí)行,再執(zhí)行其它的操作,如果放后面,則會(huì)先執(zhí)行其它操作,再執(zhí)行遞增或遞減的操作?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n2. 關(guān)系運(yùn)算符 n 關(guān)系運(yùn)算符包含“”,“=”,“!=”,“=”等運(yùn)算符,它們只會(huì)產(chǎn)生兩種結(jié)果,分別是1(成立),或0(不成立),如寫(xiě)“c=6 5”,則c就為0,另外“=”在C語(yǔ)言中才代表相等,請(qǐng)不要將它和指定運(yùn)算符“=”搞混了,而“!=”則代表不等于。關(guān)系運(yùn)算的符號(hào)、表示式與說(shuō)明如表7-6所示?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n表 7-6 關(guān)系運(yùn)算符 運(yùn)算 符號(hào) 表達(dá)式說(shuō)明小于

33、ab a ab ab 判斷 a 是否大于 b ,成立為 1 小于等于 = a= a=b a 是否大于等于 b ,成立為 1 等于 = a=b 判斷 a 是否等于 b ,成立為 1 不等于 != a!=b 判斷 a 是否不等于 b ,成立為 1 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n3. 邏輯運(yùn)算符 n 邏輯運(yùn)算符:(&,|,!)邏輯運(yùn)算符只會(huì)針對(duì)真(1)和假(0)兩種情形去處理。邏輯運(yùn)算的符號(hào)、表示式與說(shuō)明如表7-7所示。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n表7-7 邏輯運(yùn)算符運(yùn)算 符號(hào) 表達(dá)式 說(shuō)明 AND & a&b 若 ab 兩數(shù)都非零

34、,得出結(jié)果 1 ,否則為 0 OR | a|b 若 ab 兩數(shù)有一數(shù)非零,得出結(jié)果 1 ,否則為 0 NOT ! !a 置于 a 數(shù)前方 ! 表示 a 數(shù)反相 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n4. 位運(yùn)算符 n 位運(yùn)算符:(&, |, , ,) ,這些運(yùn)算符是針對(duì)變量中每一個(gè)位操作。位運(yùn)算的符號(hào)、表示式與說(shuō)明如表7-8所示。 n(1)&運(yùn)算符:代表對(duì)兩個(gè)變量中的每一個(gè)位作AND運(yùn)算 (千萬(wàn)不要將它和邏輯運(yùn)算符& 混為一談)。n(2)|運(yùn)算符:代表對(duì)兩個(gè)變量中的每一個(gè)位作 OR 運(yùn)算。n(3) 運(yùn)算符:代表對(duì)兩個(gè)變量中的每一個(gè)位作 XOR 運(yùn)算。n(4)運(yùn)算符:會(huì)將

35、變量取補(bǔ)數(shù) (1補(bǔ)數(shù)),即會(huì)把所有位作 NOT 運(yùn)算。 n(4) 運(yùn)算符:代表將變量左移/右移,并在最右/左端補(bǔ)上0, 左端代表要位移的變量,右端代表位移量?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n表 7-8 位運(yùn)算符運(yùn)算 符號(hào) 表達(dá)式 說(shuō)明 AND & a&b a 與 b 兩變量的相對(duì)位元做 AND 運(yùn)算 OR | A|b a 與 b 兩變量的相對(duì)位元做 OR 運(yùn)算 XOR ab a 與 b 兩變量的相對(duì)位元做 XOR 運(yùn)算 取反 ab a 變量的每一位元做反相運(yùn)算 右移 an a 變量 內(nèi) 位元右移 n 次 (n=1,2,3) 左移 an a 變量 內(nèi) 位元左移 n

36、次 (n=1,2,3) 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n5. 賦值運(yùn)算符 n在執(zhí)行算術(shù)邏輯運(yùn)算時(shí),通常運(yùn)算結(jié)果需要存回原來(lái)的運(yùn)算元,賦值運(yùn)算符就提供一種處理方式。例如c=b+a,等同于a+=b,將 a+b 的結(jié)果直接存回a,省略了c變量的定義。其中“+=”就是指定運(yùn)算符。其它的賦值運(yùn)算符如表7-9所示。 n賦值運(yùn)算符“=”,在C語(yǔ)言中單一等號(hào)并不代表等于,而代表將等號(hào)右側(cè)的內(nèi)容指定給左側(cè)的變量,一般寫(xiě)成這種型式:變量 = 表示式;現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n在右端的表示式可以是一個(gè)變量、常數(shù)或任意的的算術(shù)或邏輯運(yùn)算式,左端則必為一

37、個(gè)變量,不可以放置運(yùn)算式,如果同時(shí)指定給多個(gè)變量,則可以使用下式:n變量 = 變量 = 表示式;n例如,若想讓 a, b 等于5,則可以寫(xiě)成 a=b=5;另外,定義成const的變量不能放置于等號(hào)左端。在這里,順變補(bǔ)充一下常數(shù)的表示法,在以后的程序編寫(xiě)中,一般只會(huì)用十進(jìn)制或十六進(jìn)制來(lái)表示其值,在C語(yǔ)言中無(wú)論鍵入任何數(shù),都被預(yù)設(shè)為十進(jìn)制的,如果想使用十六進(jìn)制表示數(shù),必須在前面加上 “ox” ,如想表示16進(jìn)制數(shù)1FH ,則寫(xiě)成 0 x1F 。如果將一個(gè)四則運(yùn)算式指定給一個(gè)變量,而該四則運(yùn)算中又包含該變量,可以用復(fù)合指定運(yùn)算符來(lái)簡(jiǎn)化,如 a=a+4 可以簡(jiǎn)寫(xiě)成 a+=4 。n變量 A= 變量 A

38、(+,-,*,/,%) 表達(dá)式等價(jià)于變量 A (+,-,*,/,%)= 表達(dá)式;現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n表 7-9 賦值運(yùn)算符運(yùn)算 符號(hào) 表達(dá)式 說(shuō)明 加法 += a+=b 等同于 a=a+b 減法 -= a-=b 等同于 a=ab 乘法 *= a*=b 等同于 a=a*b 除法 /= a/=b 等同于 a=a/b 余數(shù) %= a%=b 等同于 a=a%b 與&= a&=b 等同于 a=a&b 或 |= a|=b 等同于 a=a&b 互斥 = a=b 等同于 a=a&b 左移 = a= a=b 等同于 a=a&b 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C5

39、1的算術(shù)與邏輯運(yùn)算n 6. 運(yùn)算符優(yōu)先順序 n 在一個(gè)復(fù)雜的算式中,若包括超過(guò)一個(gè)以上的運(yùn)算符,如 h=a*(b+c|d)-e/(f&g),必須考慮到運(yùn)算的優(yōu)先順序。最常見(jiàn)有 “先乘除,后加減”,因?yàn)槌顺膬?yōu)先順序高于加減運(yùn)算符,說(shuō)明如表 7-10所示?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.5 C51的算術(shù)與邏輯運(yùn)算n表 7-10 運(yùn)算符的優(yōu)先順序順序 運(yùn)算符 作用 1 () 括號(hào) 2 ,! 取反, NOT 運(yùn)算 3 +,- 遞增 / 遞減 4 *, /,% 乘,除,余數(shù) 5 +,- 加,減 6 移位 7 =, 關(guān)系運(yùn)算符 8 =, != 相等 / 不相等 9 & 位操作 AND 10 位操作 X

40、OR 11 | 位操作OR 12 & 邏輯 AND 運(yùn)算 13 | 邏輯 OR 運(yùn)算 14 =,*=,+=,/=,-=,=,&=,|=,= 賦值 / 復(fù)合賦值 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句nC51程序語(yǔ)言的代碼,相當(dāng)于匯編語(yǔ)言的指令碼,但其功能與形式比匯編語(yǔ)言更為強(qiáng)大與精簡(jiǎn)。C51程序語(yǔ)言的語(yǔ)句大致可分為下列四種: n聲明、定義語(yǔ)句,利用常數(shù)、變量與各種結(jié)構(gòu)的聲明、定義,替代匯編語(yǔ)言中繁瑣的數(shù)據(jù)搬移與定址方式。 n算術(shù)邏輯運(yùn)算語(yǔ)句,利用簡(jiǎn)單的運(yùn)算符號(hào),提供加、減、乘、除、與AND、OR 、NOT、 XOR等運(yùn)算。 n程序流程控制語(yǔ)句,提供更簡(jiǎn)便的循環(huán)、條件判斷等的

41、程序流程控制功能。 n函數(shù)調(diào)用語(yǔ)句,通過(guò)函數(shù)調(diào)用功能,提供具有結(jié)構(gòu)化的程序。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n1. 循環(huán)控制語(yǔ)句 n 循環(huán)控制功能是讓程序某幾行語(yǔ)句能夠重復(fù)執(zhí)行。C51語(yǔ)言常用的循環(huán)語(yǔ)句有for、while、do-while 三個(gè)。三者的差異在于判斷循環(huán)是否執(zhí)行的先后時(shí)機(jī),用法分述如下: n(1)for 循環(huán):最典型的循環(huán)形式,控制循環(huán)的方式包含循環(huán)變量初值、循環(huán)條件與循環(huán)變量增值。要求重復(fù)執(zhí)行的程序段落必須放置在大括號(hào)內(nèi)。語(yǔ)句的寫(xiě)法如下: n for (循環(huán)變量初值; 循環(huán)條件; 循環(huán)變量增值) n n ( 要求重復(fù)執(zhí)行的語(yǔ)句 ) n 現(xiàn)代電子技術(shù)

42、工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n進(jìn)入for循環(huán)會(huì)先給循環(huán)變量賦初值,然后再判斷循環(huán)條件。這里的循環(huán)條件主要是由7.2 節(jié)的關(guān)系運(yùn)算符與邏輯運(yùn)算符組成,也可為任意運(yùn)算表示式,如果運(yùn)算結(jié)果為成立 (非0),則循環(huán)會(huì)繼續(xù)執(zhí)行,若不成立 (0)則會(huì)跳出循環(huán)。如果指定一個(gè)非0的常數(shù)或根本不寫(xiě)判斷條件,就會(huì)形成無(wú)窮循環(huán) (當(dāng)然如果指定常數(shù)0,這將是一個(gè)沒(méi)有意義的循環(huán)),最后會(huì)執(zhí)行循環(huán)變量的增加或減少。循環(huán)變量初值和循環(huán)變量增值都可以省略。兩個(gè)以上敘述之間以逗號(hào)“,”分隔。n例如: for (i=0,j=0;i5;) 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n循環(huán)內(nèi)重復(fù)執(zhí)行

43、的程序必須加上大括號(hào)。如果只有一個(gè)敘述,括號(hào)可省略。需要注意的是,無(wú)論是for,還是之后將介紹的while,do while,ifelse,switch 等等,其所包含的程序區(qū)段一樣會(huì)被視為一個(gè)局部,在其中定義的變量,視為局部變量,只有在該局部有效。 n(2)while循環(huán):若程序循環(huán)不需初始條件和更新條件,則可考慮使用while循環(huán),它只須處理判斷條件,語(yǔ)句的寫(xiě)法如下: n while ( 判斷運(yùn)算式 ) n n ( 要求重復(fù)執(zhí)行的語(yǔ)句 ) n n判斷運(yùn)算式的作用和for循環(huán)一樣,如果為非0值,會(huì)被繼續(xù)執(zhí)行,為0則跳出循環(huán)。常看到以”while(1)”代表程序?qū)⑦M(jìn)入無(wú)窮循環(huán),而被大括號(hào)括住的

44、程序碼會(huì)被重復(fù)執(zhí)行。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n(3)dowhile循環(huán):功能幾乎和while一樣,唯一的差別在于它先執(zhí)行后判斷,也就是說(shuō)它至少會(huì)做一次,語(yǔ)句的寫(xiě)法如下: ndo n (要求重復(fù)執(zhí)行的語(yǔ)句) n n while(判斷運(yùn)算式) n 例 循環(huán)應(yīng)用實(shí)例 n使用三種不同方式的循環(huán),執(zhí)行 1 累加到10的計(jì)算過(guò)程。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n void main() n n int i,sum1=0; / for 循環(huán)用變量 n int j=1,sum2=0; / while 循環(huán)用變量 n int k=1,sum3=0

45、; / do while 循環(huán)用變量 n /* for 循環(huán)敘述計(jì)算 1 加到 10 的總和 */ n for(i=1;i=10;i+) n sum1+=i; n /* while 循環(huán)敘述計(jì)算 1 加到 10 的總和 */ n while(j=10)n n sum2+=j; n j+; n n /* do-while 循環(huán)敘述計(jì)算 1 加到 10 的總和 */ n do n sum3+=k; n k+; n n while(k=10); n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n2. 條件分支控制 n 條件分支控制的功能是讓程序在某些條件成立下,才去執(zhí)行某些敘述。C51

46、語(yǔ)言常用的有ifelse和switchcase。功能與使用說(shuō)明如下:n(1)ifelse 語(yǔ)句n最典型的條件形式,只有判斷條件成立才會(huì)執(zhí)行其所包含的程序敘述,它的寫(xiě)法如下: n if ( 判斷運(yùn)算式 A) n n (A 成立時(shí)要執(zhí)行的敘述 ) n n else if ( 判斷運(yùn)算式 B) n n (A 不成立但 B 成立要執(zhí)行的敘述 ) n else n (A 、 B 皆不成立要執(zhí)行的敘述 ) n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n判斷運(yùn)算式的寫(xiě)法和前述的 for 和 while 寫(xiě)法完全一樣,基本上由關(guān)系和邏輯運(yùn)算式組成。對(duì)于單一條件的判斷,通??梢允÷?else

47、if 敘述,只需使用 ifelse ,如下面的范例所示的簡(jiǎn)單條件分支應(yīng)用。若不考慮條件不成立的情況,連 else 也可以省略掉。 n例:簡(jiǎn)單條件分支應(yīng)用實(shí)例 n使用 if-else簡(jiǎn)單條件支判斷功能,執(zhí)行由P1口的輸入狀態(tài),決定 P0 輸出的執(zhí)行過(guò)程。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n#include n void main() n n while(1)n n if(P1=0 x01) n P0=0 x80; n else n P0=0; n n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n(2)switchcase 語(yǔ)句n如果條件分支判斷要處理多種

48、不同情形時(shí),雖然可用多個(gè) ifelse if if 來(lái)完成,但是如果是要依照某個(gè)變量的值,判斷要執(zhí)行那一部份的程序,則 switch case語(yǔ)句會(huì)使程序更為清楚明確:現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n switch ( 要判斷的變量名稱(chēng) ) n n case 常數(shù) 1: n ( 程序敘述 1) n break; n case 常數(shù) 2: n ( 程序敘述 2) n break; n case 常數(shù) 3: n ( 程序敘述 3) n break; n . n default: n ( 程序敘述 n) n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句nsw

49、itch 結(jié)構(gòu)是由多個(gè)case標(biāo)記組成的,case后面必須是一個(gè)已定義的常數(shù)(不能是變量),如果變量值正好等于其中某一常數(shù),則程序就會(huì)跳到該標(biāo)記去執(zhí)行,然后一直執(zhí)行到switch敘述尾端。假如不想讓程序逐一執(zhí)行到最后一項(xiàng),則可以用break敘述,強(qiáng)迫跳出 switch 敘述。至于default標(biāo)記是用來(lái)處理這些常數(shù)都不等于該變量時(shí),程序所要跳到的地方,但也可以將它省略。現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句n(3)無(wú)條件跳轉(zhuǎn) (goto) n這是最基本的流程控制指令,意義相當(dāng)于匯編語(yǔ)言中的 ”JMP” 指令,程序一旦執(zhí)行到 goto 指令,就會(huì)跳到其后面指定的程序位址,由于

50、在C語(yǔ)言中一般沒(méi)有用行號(hào)來(lái)標(biāo)示各程序敘述,也不過(guò)問(wèn)程序碼放置在存儲(chǔ)器中的位址,使用 goto 敘述時(shí),必須自己定義標(biāo)記,定義方式如下 : n 標(biāo)記名稱(chēng) : ( 程序敘述 ) n其中標(biāo)記名稱(chēng)是可以自己命名的 (只要不是C51的關(guān)鍵字即可) ,在后面加上一個(gè)冒號(hào)以聲明它是標(biāo)記,例如 :現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.6 C51程序語(yǔ)言的語(yǔ)句nredo: n ( 程序敘述 ) ;n goto redo; n程序就會(huì)不斷執(zhí)行標(biāo)記 redo 到goto 敘述中間的程序敘述。雖然使用goto很方便,但是在程序碼中加入太多的goto會(huì)破壞程序整體的結(jié)構(gòu),降低程序的可讀性以及增加日后程序修改維護(hù)的難度,而且

51、在大多數(shù)情形下,goto 敘述是可以被其它流程控制方式所取代。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n1. 函數(shù)nC語(yǔ)言程序的架構(gòu)由函數(shù)組成,其中又以函數(shù) main()最為重要。理論上可以把所有程序敘述全部放在 main()函數(shù)中,但是這樣會(huì)使程序看起來(lái)沒(méi)有條理,而且有許多程序敘述會(huì)重復(fù),所以當(dāng)程序愈寫(xiě)愈大時(shí),必須試著將負(fù)責(zé)處理各種機(jī)能的程序敘述分別寫(xiě)成一個(gè)個(gè)不同的函數(shù),這樣一來(lái),不但程序代碼變的清楚明了,而且許多重復(fù)的地方,都可以通過(guò)調(diào)用相同的函數(shù)來(lái)完成。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n(1)基本函數(shù)的建構(gòu) n函數(shù)主體在程序中存放的位置,可以在程序中的

52、任何地方,而函數(shù)之間也可以互相調(diào)用。但不可在一個(gè)函數(shù)中包含另一個(gè)函數(shù),通常在定義函數(shù)之前,會(huì)在程序的最前端,定義函數(shù)的原型 (function prototype),方法如下:n函數(shù)返回值數(shù)據(jù)類(lèi)型 函數(shù)名稱(chēng) ( 數(shù)據(jù)類(lèi)型 傳遞參數(shù) 1, 數(shù)據(jù)類(lèi)型 傳遞參數(shù) 2 ); n定義函數(shù)原型的用意在于讓編譯器知道程序有哪些函數(shù),這樣不論函數(shù)放在程序的那個(gè)地方,最后一定能順利連結(jié)。另外,定義函數(shù)原型就像寫(xiě)作文之前先將大綱列出來(lái)一樣,能讓別人更容易了解程序架構(gòu)與內(nèi)容。定義完原型后,就可以在程序中的任何地方撰寫(xiě)函數(shù)主體。定義完原型后,就可以在程序中的任何地方撰寫(xiě)函數(shù)主體。函數(shù)主體如下:現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)

53、踐7.2.7 函數(shù)和指針數(shù)組n函數(shù)返回值數(shù)據(jù)類(lèi)型 函數(shù)名稱(chēng) (數(shù)據(jù)類(lèi)型 傳遞參數(shù) 1, 數(shù)據(jù)類(lèi)型 傳遞參數(shù) 2); n n ( 函數(shù)中的程序語(yǔ)句 ) n . n . nreturn 返回值 ; n n這里無(wú)論是函數(shù)返回?cái)?shù)據(jù)類(lèi)型,函數(shù)名稱(chēng)及傳遞參數(shù)數(shù)量和其數(shù)據(jù)類(lèi)型等等,都必須和函數(shù)的原型吻合,否則會(huì)發(fā)生連結(jié)的錯(cuò)誤,在函數(shù)的最后使用 return語(yǔ)句將數(shù)值返回,當(dāng)想要調(diào)用函數(shù)的時(shí)后,可以用以下的格式調(diào)用:函數(shù)名稱(chēng) (傳遞參數(shù)1,傳遞參數(shù) 2) n所傳遞參數(shù)的數(shù)量和型態(tài)都必須和想調(diào)用的函數(shù)相同,否則會(huì)出錯(cuò)。 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n例:函數(shù)應(yīng)用-延遲子程序范例 n805

54、1單片機(jī)程序中常常會(huì)用到時(shí)間延遲子程序。建立一個(gè)時(shí)間為 10ms 延遲子程序,并利用傳遞參數(shù)100,做1秒鐘的時(shí)間延遲(1sec=10010ms) 。nvoid delay10ms(int count) n n int i,j; n for(i=0;icount;i+) / 通過(guò)引數(shù) count 控制外循環(huán)數(shù) n for(j=0;j1940;j+); n n main() n n delay10ms(100); n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n(2)C51的特殊函數(shù) nC51為了配合8051程序的需求,衍生出一些具有特殊作用的函數(shù),例如中斷函數(shù) (interrupt

55、function)。 n所謂中斷函數(shù)就是在執(zhí)行程序時(shí),因?yàn)槟臣虑榘l(fā)生 ( 如計(jì)時(shí)器時(shí)間到了,或者觸動(dòng)開(kāi)關(guān) 等等)中斷函數(shù),去處理這種狀況所定義的函數(shù)。在匯編語(yǔ)言中,處理中斷的方法是將處理中斷的程序碼放置于特定的存儲(chǔ)器局部,觸發(fā)中斷時(shí)就會(huì)自動(dòng)跳過(guò)去執(zhí)行,但在C51中可以讓編譯器幫助完成這項(xiàng)工作。在C51中定義中斷函數(shù)的方法如下:函數(shù)定義 interrupt 中斷編號(hào) using 暫存器組。n中斷編號(hào)是指明要處理何種中斷,在C51中其值可以是031,不過(guò)常用的是05,其作用如下表7-11 所示:現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n表 7-11 中斷編號(hào)與中斷向量地址n 中斷編號(hào)

56、 中斷源名稱(chēng) 中斷向量地址 0 外部中斷 0 0 x03 0 x03 1 計(jì)時(shí)計(jì)數(shù) 0 0 x0B 0 x0B 2 外部中斷 1 0 x13 0 x13 3 計(jì)時(shí)計(jì)數(shù)器 1 0 x1B 0 x1B 4 串行通信0 x23 0 x23 5 計(jì)時(shí)計(jì)數(shù) 1 0 x2B 0 x2B 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組nusing后面接的是使用寄存器編號(hào),其值為03,可以省略,如下面的例子將會(huì)定義外部中斷0并使用第0組寄存器的中斷函數(shù)。 nvoid Int_0() interrupt 0 using 0 n n ( 中斷常式 ) n 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組

57、n(3)C51的函數(shù)庫(kù) nC51即是程序庫(kù)(run-time library)提供超過(guò)100個(gè)預(yù)設(shè)的函數(shù)和宏指令, 8051程序設(shè)計(jì)者可直接取用,這對(duì)單片機(jī)系統(tǒng)程序設(shè)計(jì),會(huì)有很大的幫助。例如數(shù)據(jù)的轉(zhuǎn)換、字串與緩沖區(qū)的操作,數(shù)學(xué)函數(shù)與浮點(diǎn)數(shù)的運(yùn)算等相關(guān)的資料,KeilVision2 都有提供,讀者可自行查詢(xún)參考。參考文件的取得可以直接在Vision2 中開(kāi)啟 Books Windows 中的C51 Users Guide與C51 Library Functions文件手冊(cè)?,F(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n2. 指針 nC語(yǔ)言有一種特殊的數(shù)據(jù)類(lèi)型,稱(chēng)為指針(Pointer),

58、專(zhuān)門(mén)用來(lái)存放存儲(chǔ)器位址。這項(xiàng)功能跟 8051 匯編語(yǔ)言的間接尋址存取存儲(chǔ)器的觀念類(lèi)似。假設(shè)一個(gè)變量 ptr_a 資料,存放在另一個(gè)變量 var_a 的存儲(chǔ)器地址,稱(chēng)為“變量 ptr_a 指向變量 var_a 的指針”,或“ptr_a 為一指針的變量”。當(dāng)定義變量 ptr_a 為一個(gè)指針時(shí),必須在變量名稱(chēng)前以星號(hào)*標(biāo)示,它的定義方式如下:n數(shù)據(jù)類(lèi)型 * 指針 變量名稱(chēng) (= 初始值 ); 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n3. 數(shù)組與指針 n在高級(jí)語(yǔ)言中,數(shù)組 (Array)可用來(lái)處理一長(zhǎng)串連續(xù)的變量數(shù)據(jù)。使用數(shù)組處理大量的變量數(shù)據(jù),除了可免除每一變量必須逐一定義的麻煩外,變

59、量資料的存取程序更便捷。在單片機(jī)系統(tǒng)中,數(shù)組是一段連續(xù)的存儲(chǔ)空間。因此使用指針來(lái)存取數(shù)組資料,是一種常用的方式。它的定義如下:n變量型 態(tài)存儲(chǔ)器類(lèi)型數(shù)組 名稱(chēng)元素個(gè)數(shù)= 初始值 ,; 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n其中元素各數(shù)必須是一個(gè)常數(shù),初始值和初始值之間必須用逗號(hào)來(lái)分隔,假如不指定元素個(gè)數(shù),編譯器會(huì)根據(jù)在后面加入了多少個(gè)初始值,來(lái)決定數(shù)組長(zhǎng)度,若連初始值都沒(méi)寫(xiě),則編譯器會(huì)顯示錯(cuò)誤信息。另外,數(shù)組名稱(chēng)被賦予的意義是一個(gè)指針,它指向數(shù)組開(kāi)始處的存儲(chǔ)器地址。 n如果要存取數(shù)組中第一個(gè)元素,只要用 *Array 即可,第二個(gè)即為 *(Array+1) 第 n 個(gè)就是 *(

60、Array+n-1),為了簡(jiǎn)化寫(xiě)法,C語(yǔ)言中特別定義 Arrayn 為 *(Array+n),存取數(shù)組Array中第n個(gè)元素就可簡(jiǎn)寫(xiě)成Arrayn-1 ,如此一來(lái),配合程序循環(huán)的使用,就可以輕松地處理大量連續(xù)的數(shù)據(jù)。 n應(yīng)用范例:觀察指針與數(shù)組 現(xiàn)代電子技術(shù)工程設(shè)計(jì)與實(shí)踐7.2.7 函數(shù)和指針數(shù)組n將數(shù)組數(shù)據(jù)結(jié)合指針功能,利用 Keil Vision 觀察如何利用指針存取數(shù)組資料。程序如下: n #include n void main() n n int i; n char array5=0 xc1,0 xc2,0 xc3,0 xc4,0 xc5; n char *ptr_a; n ptr_

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論