




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
演示文稿語言程序設(shè)計基礎(chǔ)目前一頁\總數(shù)八十四頁\編于四點(優(yōu)選)語言程序設(shè)計基礎(chǔ)目前二頁\總數(shù)八十四頁\編于四點
本章主要介紹C51語言的數(shù)據(jù)類型、數(shù)據(jù)存儲類型、數(shù)據(jù)運算、程序設(shè)計的基本結(jié)構(gòu)、數(shù)組和指針,要求學(xué)習(xí)者初步掌握C51語言程序設(shè)計的基本方法。目前三頁\總數(shù)八十四頁\編于四點3.1C51語言概述C語言是美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)制定的編程語言標(biāo)準(zhǔn)。1987年,ANSI公布了87ANSIC,即標(biāo)準(zhǔn)C語言。C51語言是在ANSIC的基礎(chǔ)上針對51單片機的硬件特點進行了擴展,并向51單片機上移植。經(jīng)過多年努力,C51語言已經(jīng)成為公認(rèn)的高效、簡潔而又貼近51單片機硬件的實用高級編程語言。目前四頁\總數(shù)八十四頁\編于四點3.1.1使用C51語言的優(yōu)點C51語言具有結(jié)構(gòu)化和模塊化的特點,便于閱讀和維護。C51語言的可移植性好,很多微控制器都支持C51編譯器。C51語言提供的庫函數(shù)包含許多標(biāo)準(zhǔn)子程序,具有較強的數(shù)據(jù)處理能力。用C51語言編寫的程序比用匯編語言編寫的程序更符合人們的思考習(xí)慣。寄存器分配、不同存儲器的尋址及數(shù)據(jù)類型等細(xì)節(jié)交由編譯器管理,使開發(fā)者可以更專心地考慮算法,而不是考慮一些細(xì)節(jié)問題。C51語言和微控制器是相對獨立的,開發(fā)者不必知道處理器的具體內(nèi)部結(jié)構(gòu)和處理過程。當(dāng)用新型的微控制器開發(fā)程序時,可以很快上手,縮短學(xué)習(xí)時間和程序開發(fā)時間。目前五頁\總數(shù)八十四頁\編于四點3.1.2C51與ANSIC的主要區(qū)別1.頭文件的區(qū)別
51系列單片機的生產(chǎn)廠家有多個,它們的差異在于內(nèi)部資源如定時器、中斷、I/O等的數(shù)量以及功能的不同,而對使用者來說,只需要將相應(yīng)的功能寄存器的頭文件加載在程序內(nèi),就可實現(xiàn)其所具有的功能。因此,C51系列的頭文件集中體現(xiàn)了各系列芯片的不同資源及功能。
2.數(shù)據(jù)類型的區(qū)別計算機的CPU是32位或64位的,運算能力強,內(nèi)存大,ANSIC可以大量使用float型與longint型變量;單片機的CPU一般為8位或16位的,運算能力較弱,因此C51變量類型以char型為主,int型為輔。目前六頁\總數(shù)八十四頁\編于四點3.數(shù)據(jù)存儲類型的區(qū)別
C語言最初是為通用計算機設(shè)計的,在通用計算機中只有一個程序和數(shù)據(jù)統(tǒng)一尋址的內(nèi)存空間,而51系列單片機有片內(nèi)、片外程序存儲器,還有片內(nèi)、片外數(shù)據(jù)存儲器。標(biāo)準(zhǔn)C語言并沒有提供這部分存儲器的地址范圍的定義。此外,標(biāo)準(zhǔn)C語言對于51系列單片機中大量的特殊功能寄存器也沒有定義。
4.中斷方面的區(qū)別
ANSIC語言沒有處理單片機中斷的定義。而C51中有專門的中斷函數(shù)。
5.庫函數(shù)的區(qū)別由于ANSIC中的部分庫函數(shù)不適于嵌入式處理器系統(tǒng),因此被排除在C51之外,如字符屏幕和圖形函數(shù)等。目前七頁\總數(shù)八十四頁\編于四點6.目標(biāo)代碼的區(qū)別
ANSIC由計算機生成.exe文件,編譯完成后直接在計算機上運行;C51由單片機編譯生成.bin或.hex代碼文件,需要燒寫到單片機中并結(jié)合外圍電路執(zhí)行。
7.仿真調(diào)試的區(qū)別
C51程序在計算機上進行編譯,然后需通過仿真器連接后進行仿真調(diào)試。近年來隨著電路仿真軟件的不斷完善,也可通過Proteus等軟件直接在計算機上進行仿真調(diào)試。但是從數(shù)據(jù)運算操作、程序控制語句以及函數(shù)的使用上來說,C51與ANSIC幾乎沒有什么明顯的差別。如果程序設(shè)計者具備了有關(guān)標(biāo)準(zhǔn)C的編程基礎(chǔ),只要注意KeilC51與標(biāo)準(zhǔn)C的不同之處,并熟悉MCS-51單片機的硬件結(jié)構(gòu),就能夠較快地掌握C51的編程。目前八頁\總數(shù)八十四頁\編于四點3.2C51數(shù)據(jù)類型3.2.1常量與變量常量:程序運行過程中值不能改變的量稱為常量。常量存在于ROM中。變量:變量代表存儲器中的一個或多個存儲單元,用來存放數(shù)據(jù)。一般來講,這些數(shù)據(jù)在程序運行過程中可以改變(只讀變量除外)。變量名命名規(guī)則:變量名只能由半角的字母、數(shù)字、下劃線組成,且第一個字符不能是數(shù)字。數(shù)據(jù)類型:變量存在的類型稱為數(shù)據(jù)類型。C51的數(shù)據(jù)類型如表3-1所示。目前九頁\總數(shù)八十四頁\編于四點目前十頁\總數(shù)八十四頁\編于四點3.2.2變量定義與賦值1.定義一個變量變量必須先定義,后使用。例如:
inta;charb;2.變量賦初值
C語言允許在定義變量的同時給變量賦初值。例如:charc=‘a(chǎn)’;inta=7;inta,b,c=9;//定義a、b、c為整型變量,對c賦初值。inta=3,b=3,c=3;目前十一頁\總數(shù)八十四頁\編于四點
在存儲空間夠用的情況下,盡量選擇8位即一個字節(jié)的char型,特別是unsignedchar。對于51系列單片機而言,浮點類型變量將明顯增加運算時間和程序長度,如果可以的話,盡量使用靈活巧妙的算法來避免浮點變量的引入。目前十二頁\總數(shù)八十四頁\編于四點3.2.3C51的擴展數(shù)據(jù)類型1.位變量bitbit的值可以是1(true),也可以是0(false)。例如:bitlock; //將lock定義為位變量bitdirention;//將direction定義為位變量位變量的使用說明:①位變量不能定義成一個指針,如不能定義:bit*pointer;②位變量不存在位數(shù)組,如不能定義:bitb_array[];③定義位變量時,存儲類型只允許為data、bdata或者idata,如果將位變量的存儲類型定義成其他類型都將導(dǎo)致編譯出錯。目前十三頁\總數(shù)八十四頁\編于四點
2.特殊功能寄存器sfr
MCS-51單片機特殊功能寄存器在片內(nèi)RAM區(qū)的80H~FFH之間?!皊fr”數(shù)據(jù)類型占用一個內(nèi)存單元,利用它可訪問MCS-51單片機內(nèi)部的所有特殊功能寄存器。
例如:“sfrP1=0x90;”這一語句定義了P1口在片內(nèi)的寄存器,在后面語句中可用“P1=0xff”(使P1的所有引腳輸出為高電平)之類的語句來操作特殊功能寄存器。
標(biāo)準(zhǔn)特殊功能寄存器在reg51.h、reg52.h等頭文件中已經(jīng)被定義,只要用文件包含做出申明即可使用。目前十四頁\總數(shù)八十四頁\編于四點3.特殊功能寄存器sfr16“sfr16”數(shù)據(jù)類型占用兩個內(nèi)存單元。sfr16和sfr一樣用于操作特殊功能寄存器。所不同的是它用于操作占兩個字節(jié)的特殊功能寄存器。例如:“sfr16DPTR=0x82;”語句定義了片內(nèi)16位數(shù)據(jù)指針寄存器DPTR,其低8位字節(jié)地址為82H。在后面的語句中可以對DPTR進行操作。目前十五頁\總數(shù)八十四頁\編于四點4.特殊功能位sbitsbit是指MCS--51單片機片內(nèi)特殊功能寄存器的可尋址位。例如:
sfrPSW=0xd0; //定義PSW寄存器地址為0xd0sbitOV=PSW^2; //定義OV位為PSW.2
符號“^”前面是特殊功能寄存器的名字,“^”后面的數(shù)字定義了特殊功能寄存器可尋址位在寄存器中的位置,取值必須是0~7。
注意:不要把bit與sbit混淆。bit用來定義普通的位變量,值只能是二進制的0或1。而sbit定義的是特殊功能位。目前十六頁\總數(shù)八十四頁\編于四點3.3C51數(shù)據(jù)的存儲類型3.3.1數(shù)據(jù)存儲類型
MCS-51系列單片機采用了哈佛結(jié)構(gòu),即程序存儲器和數(shù)據(jù)存儲器是分離的。51系列單片提供了三種不同類型的存儲區(qū)域(memoryareas):程序存儲區(qū)(programmemory);內(nèi)部數(shù)據(jù)存儲區(qū)(internaldatamemory);外部數(shù)據(jù)存儲區(qū)(externaldatamemory)。
C51編譯器完全支持MCS-51單片機及其系列的結(jié)構(gòu),可完全訪問MCS-51硬件系統(tǒng)所有部分。每個變量可準(zhǔn)確地賦予不同的存儲器類型(data,idata,pdata,xdata,code)。訪問內(nèi)部數(shù)據(jù)存儲器(idata)要比訪問外部數(shù)據(jù)存儲器(xdata)更快一些,因此,可將經(jīng)常使用的變量置于內(nèi)部數(shù)據(jù)存儲器中,而將較大及很少使用的數(shù)據(jù)單元置于外部數(shù)據(jù)存儲器中。目前十七頁\總數(shù)八十四頁\編于四點目前十八頁\總數(shù)八十四頁\編于四點
例如:datacharcharvar;charcodemsg[]=“ENTERPARAMETER:”;unsignedlongxdataarray[100];floatidatax,y,z;unsignedcharxdatavector[10][4];sfrP0=0x80;sbitRI=0x98;charbdataflags;sbitflag0=flags^0;說明:聲明變量時存儲區(qū)修飾符和數(shù)據(jù)類型修飾符的位置可以互換,即“chardatax;”和“datacharx;”是完全等效的。不過從兼容性的角度考慮,建議使用前一種格式。目前十九頁\總數(shù)八十四頁\編于四點3.3.2存儲器模式
如果在變量定義時略去存儲類型標(biāo)識符,編譯器會自動選擇默認(rèn)存儲類型。默認(rèn)存儲類型進一步由SMALL、COMPACT和LARGE存儲模式指令限制。C51變量的存儲器模式如表3-3所示。目前二十頁\總數(shù)八十四頁\編于四點3.3.3C51語言的絕對地址訪問1.絕對宏
C51編譯器提供一組宏定義來對code、data、pdata和xdata空間進行絕對尋址,包括CBYTE、CWORD、DBYTE、DWORD、XBYTE、XWORD、PBYTE、PWORD。這些宏包含在名為absacc.h的頭文件中。在使用前,需要將頭文件包含進來,即#include<absacc.h>。其中:
CBYTE:以字節(jié)形式對code區(qū)尋址;
CWORD:以字形式對code區(qū)尋址;
DBYTE:以字節(jié)形式對data區(qū)尋址;
DWORD:以字形式對data區(qū)尋址;
XBYTE:以字節(jié)形式對xdata區(qū)尋址;
XWORD:以字形式對xdata區(qū)尋址;
PBYTE:以字節(jié)形式對pdata區(qū)尋址;
PWORD:以字形式對pdata區(qū)尋址。目前二十一頁\總數(shù)八十四頁\編于四點(1)按字節(jié)訪問存儲器宏的形式 宏名[地址]
數(shù)組中的下標(biāo)就是存儲器的地址,因此使用起來非常方便。例如:
DBYTE[0x30]=0x48; //給片內(nèi)RAM送數(shù)據(jù)
XBYTE[0x0002]=0x36; //給片外RAM送數(shù)據(jù)
dis_buf[0]=CBYTE[TABLE+5];//從CODE區(qū)讀取數(shù)據(jù)目前二十二頁\總數(shù)八十四頁\編于四點
(2)按整型數(shù)訪問存儲器宏的形式
宏名[下標(biāo)]
由于整型數(shù)占兩個字節(jié),所以下標(biāo)與地址的關(guān)系為:地址=下標(biāo)×2。由于數(shù)組中的下標(biāo)與存儲器的地址是倍數(shù)關(guān)系,使用時要注意。例如:
DWORD[0x20]=0x1234;//給片內(nèi)RAM的0x40、0x41單元送數(shù)
XWORD[0x0002]=0x5678;//給片外RAM的0x0004、0x0005單元送數(shù)
目前二十三頁\總數(shù)八十四頁\編于四點2._at_關(guān)鍵字格式如下:
[存儲器類型]數(shù)據(jù)類型說明符變量名_at_地址常數(shù)存儲器類型和數(shù)據(jù)類型必須為C51能識別的。地址常數(shù)必須位于有效的存儲器空間之內(nèi)。使用_at_定義的變量必須為全局變量。例如:
dataunsignedcharx1_at_0x40;
//在data區(qū)定義字節(jié)變量x1,它的地址為40Hxdataunsignedintx2_at_0x2000;
//在xdata區(qū)定義字變量x2,它的地址為2000Hdataunsignedcharbuffer[8]_at_0x50;
//在data區(qū)定義數(shù)組buffer,它的起始地址為50H目前二十四頁\總數(shù)八十四頁\編于四點3.4C51的數(shù)據(jù)運算
主要有:算術(shù)運算符、邏輯運算符、關(guān)系運算符、位運算符及賦值運算符等3.4.1算術(shù)運算算術(shù)運算操作符主要包括:
+(加法運算符),-(減法運算符),*(乘法運算符),
/(除法運算符),%(模運算或取余運算符),++(自增運算符),--(自減運算符)。注意:“/”的功能是取除運算結(jié)果的整數(shù)部分;“%”的功能是取除運算結(jié)果的余數(shù)部分。例如:“5/3”的結(jié)果為1(商),而“5%3”的結(jié)果為2(余數(shù))。目前二十五頁\總數(shù)八十四頁\編于四點
自增和自減運算符的功能是使變量自動加1或減1。自增和自減運算符放在變量之前和變量之后是不同的。
++i,--i:在使用i之前,先使i值加(減)1。
i++,i--:在使用i之后,再使i值加(減)1。例如:若i=4,則執(zhí)行x=++i時,先使i加1,再引用結(jié)果,即x=5,運算結(jié)果為i=5,x=5。再如:若i=4,則執(zhí)行x=i++時,先引用i值,即x=4,再使i加1,運算結(jié)果為i=5,x=4。目前二十六頁\總數(shù)八十四頁\編于四點3.4.2邏輯運算邏輯運算操作符主要包括:
&&(邏輯與),||(邏輯或),?。ㄟ壿嫹牵?。邏輯運算結(jié)果為真時取1,否則取0。
3.4.3關(guān)系運算關(guān)系運算主要用于比較操作數(shù)的大小關(guān)系,包括:
<(小于),<=(小于等于),>(大于),>=(大于等于),
==(等于),!=(不等于)。若關(guān)系成立,結(jié)果為1;若關(guān)系不成立,結(jié)果為0。目前二十七頁\總數(shù)八十四頁\編于四點
3.4.4位運算
位運算是將兩個操作數(shù)按二進制數(shù)展開,然后對應(yīng)位進行邏輯運算。位運算操作符包括:&(按位與),|(按位或),^(按位異或),~(按位取反),<<(位左移),>>(位右移)。位運算的操作對象只能是整型和字符型數(shù)據(jù)。這些位運算和匯編語言中的位操作指令十分類似。目前二十八頁\總數(shù)八十四頁\編于四點1.左移運算符(<<)該運算符用來將一個數(shù)的各二進制位全部左移若干位,左高位溢出,右低位補0。例如:
b=a<<2;a=a<<2;a<<=2;高位左移后溢出,舍棄掉。在該數(shù)左移時被溢出舍棄的高位不為1時,左移1位相當(dāng)于該數(shù)乘以2。例如:
15<<2=60;又如,143<<2=60,原因是最高位為1,左移后被溢出,不能等同于乘以2。目前二十九頁\總數(shù)八十四頁\編于四點2.右移運算符(>>)該運算符用來將一個數(shù)的各二進制位全部右移若干位,左高位補0,右低位溢出。例如:
b=a>>2;a=a>>2;a>>=2;低位右移后溢出,舍棄掉。在該數(shù)右移時被溢出舍棄的低位不為1時,右移1位相當(dāng)于該數(shù)除以2。例如:
16>>2=4又如,63>>2=15,原因是最后2位為1,右移后被溢出,不能等同于除以4。目前三十頁\總數(shù)八十四頁\編于四點3.按位異或運算符(^)異或運算的規(guī)則是:參加運算的兩個二進制位相同時結(jié)果為0(假),相異時結(jié)果為1(真)。即
0^0=0;0^1=1;1^0=1;1^1=0;例如:0x2D^0x0F=0x22,將十六進制數(shù)0x2D與十六進制數(shù)0x0F進行按位異或運算,則高四位保持不變,低四位全部翻轉(zhuǎn)。通過按位異或運算可以實現(xiàn)對變量的某一位或某幾位的取反操作。目前三十一頁\總數(shù)八十四頁\編于四點4.按位取反運算符(~)按位取反運算符是一個單目運算符,用來對一個二進制數(shù)按位取反,即將0變?yōu)?,1變?yōu)?。取反運算符常與移位運算符及按位與、按位或、按位異或運算符結(jié)合使用,以實現(xiàn)對某一位或某幾位清0、置1、取反的操作。
5.按位與運算符(&)參加運算的兩個數(shù)據(jù),按二進制位進行與運算。
6.按位或運算符(|)參加運算的兩個數(shù)據(jù),按二進制位進行或運算。目前三十二頁\總數(shù)八十四頁\編于四點3.4.5賦值運算1.格式:變量名=表達式;例如:
a=2;b=3;c=2*a+b;2.復(fù)合賦值運算符賦值符號前加上其他運算符可構(gòu)成復(fù)合運算符。C51語言10種復(fù)合運算符:
+=,-=,*=,/=,%=,﹠=,︱=,^=,<<=,>>=
例如:
a+=b; //等價于a=(a+b)
x*=a+b; //等價于x=(x*(a+b))
a&=b; //等價于a=(a&b)
a<<=4; //等價于a=(a<<4)目前三十三頁\總數(shù)八十四頁\編于四點類型符號功能算術(shù)運算符+,-,*,/%,++,--加、減、乘、除求余、自增1、自減1邏輯運算符&&,||,!與、或、非關(guān)系運算符>,<,>=<=,==,!=
大于、小于、大于等于、小于等于、等于、不等于位運算符&,|,~,^<<,>>位與、位或、位反、異或左移、右移C51基本運算符運算符的優(yōu)先級從低到高依次為:賦值運算符、&&和||、關(guān)系運算符、算術(shù)運算符、邏輯非(!)運算符。目前三十四頁\總數(shù)八十四頁\編于四點3.5C51程序設(shè)計的基本結(jié)構(gòu)3.5.1C51語言中語句的分類控制語句:控制程序運行的語句??照Z句:只有一個分號的語句,稱為空語句。它不進行任何操作。表達式語句:表達式后面加上分號就構(gòu)成一個表達式語句。函數(shù)調(diào)用語句也是表達式語句,由函數(shù)調(diào)用加分號構(gòu)成。復(fù)合語句:可以把多個語句用{}括起來,構(gòu)成復(fù)合語句,多用于選擇或循環(huán)結(jié)構(gòu)中。注釋語句:在C51中,由“/*”和“*/”符號對包含的內(nèi)容以及雙斜杠“//”后面的內(nèi)容均表示注釋語句。編程人員可使用注釋語句來解釋程序的功能,標(biāo)注修改時間等。目前三十五頁\總數(shù)八十四頁\編于四點目前三十六頁\總數(shù)八十四頁\編于四點3.5.2C51語言程序結(jié)構(gòu)C51程序按結(jié)構(gòu)可分為三類,即順序、選擇和循環(huán)結(jié)構(gòu)。
1.順序結(jié)構(gòu)順序結(jié)構(gòu)的程序是從前往后依次執(zhí)行語句。從整體上看,所有程序都是順序結(jié)構(gòu),只不過中間某些部分是由選擇結(jié)構(gòu)或循環(huán)結(jié)構(gòu)構(gòu)成,選擇結(jié)構(gòu)或循環(huán)結(jié)構(gòu)部分執(zhí)行完成后,程序重新按順序結(jié)構(gòu)向下執(zhí)行。目前三十七頁\總數(shù)八十四頁\編于四點2.選擇結(jié)構(gòu)
選擇結(jié)構(gòu)的基本特點是程序由多路分支構(gòu)成,在程序的一次執(zhí)行中根據(jù)指定的條件,選擇執(zhí)行其中的一條分支,而其他分支上的語句被直接跳過。通過選擇結(jié)構(gòu),可以使計算機具有決策能力,從而使計算機能夠按照我們的意志在某個特定條件下完成相應(yīng)的操作,即能夠“隨機應(yīng)變”。選擇結(jié)構(gòu)包括:if語句、switch語句。目前三十八頁\總數(shù)八十四頁\編于四點圖3-1if語句流程圖目前三十九頁\總數(shù)八十四頁\編于四點
(1)if語句
if語句用來判定所給定的條件是否滿足,并根據(jù)判定結(jié)果決定執(zhí)行給出的兩種操作之一。C51語言提供3種形式的if語句:
形式一:
if(表達式)
{語句;}
括號中的表達式成立時,執(zhí)行大括號內(nèi)的語句,否則跳過大括號中的語句而直接執(zhí)行下面的語句。例如:
if(x>y)
{max=x;min=y;}目前四十頁\總數(shù)八十四頁\編于四點形式二:流程圖如圖3-2所示。
if(表達式)
{語句1;}
else{語句2;}例如:
if(x>y){max=x;}else{max=y;}圖3-2if-else語句流程圖目前四十一頁\總數(shù)八十四頁\編于四點形式三:流程圖如圖3-3所示。if(表達式1){語句1;}elseif(表達式2){語句2;}……elseif(表達式m){語句m;}else{語句n;}圖3-3if-elseif-else語句流程圖目前四十二頁\總數(shù)八十四頁\編于四點例如:
if(x>1000){key=1;}elseif(x>500){key=2;}elseif(x>300){key=3;}elseif(x>100){key=4;}else{key=5;}目前四十三頁\總數(shù)八十四頁\編于四點(2)switch語句switch語句是多分支選擇語句,一般形式如下:switch(表達式){ case常量表達式1:
{語句1;}break;
case常量表達式2:
{語句2;}break;
case常量表達式3:
{語句3;}break;
……case常量表達式n:
{語句n;}break;
default:
{語句n+1;}}目前四十四頁\總數(shù)八十四頁\編于四點3.循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)是根據(jù)某個或某些條件是否成立,來決定是否重復(fù)運行一段相同的程序。(1)采用if和goto構(gòu)成的循環(huán)采用if和goto語句可以構(gòu)成“當(dāng)型”循環(huán),格式如下:
Loop:if(表達式)
{語句;
gotoloop;
}
采用if和goto語句也可以構(gòu)成“直到型”循環(huán)程序,格式如下:
Loop:{語句;
if(表達式)gotoloop;
}
采用goto語句可構(gòu)成無條件轉(zhuǎn)向語句,格式如下:
goto語句標(biāo)號;目前四十五頁\總數(shù)八十四頁\編于四點(2)for循環(huán)語句其一般格式為:
for(表達式1;表達式2;表達式3){循環(huán)體語句(內(nèi)部可為空)}for循環(huán)語句的執(zhí)行過程為:第一步:求解表達式1。第二步:求解表達式2。若其值為真,則執(zhí)行循環(huán)體;若其值為假,則循環(huán)語句結(jié)束,執(zhí)行后續(xù)語句。第三步:求解表達式3。并轉(zhuǎn)到第二步繼續(xù)執(zhí)行,直至條件為假時結(jié)束循環(huán)。目前四十六頁\總數(shù)八十四頁\編于四點【例3-1】用for語句求1+2+…+100的值。
程序如下:
#include<stdio.h>
voidmain()
{inti,s;
s=0;
for(i=0;i<=100;i++)
{s=s+i;}printf(“1+2+…+100=%d\n”,s);
}注意:3個表達式都是可選項,可以任意省略,但“;”不能省。省略表達式1是不對循環(huán)變量賦初值;省略表達式2是不判斷循環(huán)條件的真假;省略表達式3是不對循環(huán)變量進行操作。例如:for(;;)//表示無限循環(huán)。目前四十七頁\總數(shù)八十四頁\編于四點(3)while循環(huán)語句其一般格式為;
while(表達式){循環(huán)體語句(內(nèi)部可為空)}
流程圖while語句先求解循環(huán)條件表達式的值。如果為真,則執(zhí)行循環(huán)體;否則跳出循環(huán),執(zhí)行后續(xù)操作。注意:一般來說在循環(huán)體中應(yīng)該有使循環(huán)最終能結(jié)束的語句。如果表達式初始值為假,則循環(huán)體將一次都不執(zhí)行。目前四十八頁\總數(shù)八十四頁\編于四點【例3-2】用while語句求1+2+…+100的值。
程序如下:
#include<stdio.h>voidmain()
{inti,s;
i=100;s=0;
while(i>0)
{s=s+i;i=i-1;}printf(“1+2+…+100=%d\n”,s);
}目前四十九頁\總數(shù)八十四頁\編于四點(4)do-while循環(huán)語句其語句格式為:
do{循環(huán)體語句;}while(表達式);do-while循環(huán)是先執(zhí)行循環(huán)體一次,再判斷表達式的值,若為真,則繼續(xù)執(zhí)行循環(huán),否則退出循環(huán)。
do-while語句至少執(zhí)行循環(huán)體一次。目前五十頁\總數(shù)八十四頁\編于四點【例3-3】用do-while語句求1+2+…+100的值。程序如下:#include<stdio.h>voidmain()
{inti,s;
i=100;s=0;
do{s=s+i;i=i-1;}while(i>0);
printf(“1+2+…+100=%d\n”,s);
}注意:do-while語句先執(zhí)行,后判斷。如果循環(huán)體內(nèi)只有一條語句,可以不用{},循環(huán)體{}后無分號。while(表達式)后的分號不能省。目前五十一頁\總數(shù)八十四頁\編于四點綜上所述,無限循環(huán)可以由下面三種方法實現(xiàn):①for(;;)
{……//代碼段;
}②while(1)
{……//代碼段;
}③do{……//代碼段;
}while(1);目前五十二頁\總數(shù)八十四頁\編于四點(5)break語句、continue語句、goto語句在循環(huán)語句執(zhí)行過程中,如果需要在滿足循環(huán)判定條件的情況下跳出代碼段,可以使用break或continue語句;如果要從任意地方跳轉(zhuǎn)到代碼的某個地方,可以使用goto語句。break語句:用于從循環(huán)代碼中退出,然后執(zhí)行循環(huán)語句之后的語句,不再進入循環(huán)。
格式:break;continue語句:用于退出當(dāng)前循環(huán),不再執(zhí)行本輪循環(huán),程序代碼從下一輪循環(huán)開始執(zhí)行,直到判斷條件不滿足為止。其與break語句的區(qū)別是該語句不是退出整個循環(huán)。
格式:continue;goto語句:是一個無條件轉(zhuǎn)移語句。當(dāng)執(zhí)行g(shù)oto語句時,程序指針跳轉(zhuǎn)到goto給出的下一條代碼。
格式:goto標(biāo)號;目前五十三頁\總數(shù)八十四頁\編于四點3.6C51的數(shù)組與指針C51語言的構(gòu)造數(shù)據(jù)類型主要有數(shù)組、指針和結(jié)構(gòu)等。在單片機系統(tǒng)中,數(shù)組的應(yīng)用比較廣泛,指針則次之,結(jié)構(gòu)用得相對較少。這里我們只討論數(shù)組和指針。
3.6.1數(shù)組簡介數(shù)組是同類數(shù)據(jù)的一個有序結(jié)合,用數(shù)組名來標(biāo)識。整型變量的有序結(jié)合稱為整型數(shù)組,字符型變量的有序結(jié)合稱為字符型數(shù)組。數(shù)組中的數(shù)據(jù),稱為數(shù)組元素。數(shù)組中各元素的順序用下標(biāo)表示,下標(biāo)為n的元素可以表示為:數(shù)組名[n]。改變[]中的下標(biāo)就可以訪問數(shù)組中的所有的元素。目前五十四頁\總數(shù)八十四頁\編于四點
C51語言中常用的有一維、二維數(shù)組和字符數(shù)組。
(1)一維數(shù)組具有一個下標(biāo)的數(shù)組元素組成的數(shù)組稱為一維數(shù)組。一維數(shù)組的形式如下:
類型說明符數(shù)組名[元素個數(shù)]
其中,數(shù)組名是一個標(biāo)識符,元素個數(shù)是一個常量表達式,不能是含有變量的表達式。例如:
charch[10];該例定義了一個一維字符型數(shù)組ch[],有10個元素,每個元素由不同的下標(biāo)表示,分別為ch[0],ch[1],ch[2],…,ch[9]。目前五十五頁\總數(shù)八十四頁\編于四點在定義數(shù)組的時候可對全部元素賦初值,例如:
intidataa[6]={0,1,2,3,4,5};也可只對數(shù)組的部分元素初始化,例如:
intidataa[10]={0,1,2,3,4,5}在定義數(shù)組時,若不對數(shù)組全部元素賦初值,則元素被缺省地賦值為0。目前五十六頁\總數(shù)八十四頁\編于四點
(2)二維或多維數(shù)組具有兩個或兩個以上下標(biāo)的數(shù)組稱為二維數(shù)組或多維數(shù)組。定義二維數(shù)組的一般形式為:數(shù)據(jù)類型說明符數(shù)組名[行數(shù)][列數(shù)]
其中,數(shù)組名是一個標(biāo)識符,行數(shù)和列數(shù)都是常量表達式。二維數(shù)組可以在定義時進行整體初始化,也可以在定義以后單個進行賦值。例如:
floatdemo2[3][4];//demo2數(shù)組有3行4列共12個實型元素
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
//全部初始化目前五十七頁\總數(shù)八十四頁\編于四點
(3)字符數(shù)組
若一個數(shù)組的元素是字符型的,則該數(shù)組就是一個字符數(shù)組。例如:
chara[10]={‘B’,‘E’,‘I’,‘’,‘J’,‘I’,‘N’,‘G’,‘/0’};
上面定義了一個字符型數(shù)組a[],有10個數(shù)組元素,并且將9個字符(其中包括一個字符串結(jié)束標(biāo)志‘\0’)分別賦給了a[0]~a[8],剩余的a[9]被系統(tǒng)自動賦予空格字符。
目前五十八頁\總數(shù)八十四頁\編于四點
C51還允許用字符串直接給字符數(shù)組置初值,例如:
chara[10]={“BEIJING”};
用雙引號括起來的一串字符,稱為字符串常量,C51編譯器會自動地在字符串末尾加上結(jié)束符‘\0’。用單引號括起來的字符為字符的ASCII碼值,而不是字符串。例如‘a(chǎn)’表示a的ASCII碼值為61H,而“a”表示一個字符串,由兩個字符a和\0組成。一個字符串可以用一維數(shù)組來裝入,但數(shù)組的元素數(shù)目一定要比字符數(shù)多一個,以便C51編譯器自動在其后面加入結(jié)束符‘\0’。目前五十九頁\總數(shù)八十四頁\編于四點3.6.2數(shù)組的應(yīng)用
在C51編程中,數(shù)組的一個非常有用的功能是查表。例如數(shù)學(xué)運算,編程者更愿意采用查表計算而不是公式計算。又如,對于傳感器的非線性轉(zhuǎn)換需要進行補償,使用查表法就要有效得多。再如,LED顯示程序中,根據(jù)要顯示的數(shù)值,通過查表找到對應(yīng)的顯示段碼送到LED顯示器顯示。目前六十頁\總數(shù)八十四頁\編于四點
【例3-4】使用查表法,計算數(shù)0~9的平方。
#defineucharunsignedchar
ucharcodesquare[10]={0,1,4,9,16,25,36,49,64,81};
//0~9的平方表,在程序存儲器中
ucharfuction(ucharnumber)
{returnsquare[number];//返回要求得其平方的數(shù)
};
main() //主函數(shù)
{ucharresult;
result=fuction(7);
//函數(shù)fuction()的返回值為7的平方49,存入result變量中
}目前六十一頁\總數(shù)八十四頁\編于四點3.6.3數(shù)組與存儲空間
當(dāng)程序中設(shè)定了一個數(shù)組時,C51編譯器就會在系統(tǒng)的存儲空間中開辟一個區(qū)域,用于存放數(shù)組的內(nèi)容。數(shù)組就包含在這個由連續(xù)存儲單元組成的模塊的存儲體內(nèi)。對于字符(char)數(shù)組而言,它占據(jù)了內(nèi)存中一連串的字節(jié)位置。對于整型(int)數(shù)組而言,它將在存儲區(qū)中占據(jù)一連串連續(xù)的字節(jié)對的位置。對于長整型(long)數(shù)組或浮點型(float)數(shù)組而言,一個成員將占有4字節(jié)的存儲空間。目前六十二頁\總數(shù)八十四頁\編于四點當(dāng)一維數(shù)組被創(chuàng)建時,C51編譯器就會根據(jù)數(shù)組的類型在內(nèi)存中開辟一塊大小等于數(shù)組長度乘以數(shù)據(jù)類型長度(即類型占有的字節(jié)數(shù))的區(qū)域。對于二維數(shù)組a[m][n]而言,其存儲順序是按行存儲,先存第0行元素的第0列、第1列、第2列,直至第n-1列;然后存第1行元素的第0列、第1列、第2列,直至第n-1列;……;按此順序存儲,直到第m-1行的第n-1列。當(dāng)數(shù)組特別是多維數(shù)組中大多數(shù)元素沒有被有效利用時,就會浪費大量的存儲空間。對于51單片機,其存儲資源極為有限,因此在進行C51語言編程時,要仔細(xì)地根據(jù)需要來選擇數(shù)組的大小。目前六十三頁\總數(shù)八十四頁\編于四點3.7C51函數(shù)
函數(shù)是指能夠執(zhí)行特定功能和任務(wù)的程序代碼段。一個完整的C51程序是由一個主函數(shù)和若干個其他函數(shù)組成。主函數(shù)是main()函數(shù),主函數(shù)是唯一的,整個程序從這個主函數(shù)開始執(zhí)行。使用函數(shù)時應(yīng)注意:①函數(shù)數(shù)目不受限制;②main()函數(shù)是主函數(shù),可以調(diào)用其他函數(shù),而不允許被其他函數(shù)調(diào)用;③除主函數(shù)外,其他函數(shù)之間允許互相調(diào)用。目前六十四頁\總數(shù)八十四頁\編于四點
3.7.1函數(shù)的分類1.按有無返回值分無返回值函數(shù):執(zhí)行完成后不向主調(diào)函數(shù)返回函數(shù)值。類型說明符為void。有返回值函數(shù):執(zhí)行完成后向主調(diào)函數(shù)返回一個執(zhí)行的結(jié)果(返回值)。2.按有無參數(shù)傳遞分無參函數(shù):主調(diào)函數(shù)和被調(diào)函數(shù)之間不進行參數(shù)的傳遞。有參函數(shù):主調(diào)函數(shù)和被調(diào)函數(shù)之間存在參數(shù)的傳遞。被調(diào)函數(shù)所帶的參數(shù)稱為形式參數(shù),主調(diào)函數(shù)所帶的參數(shù)稱為實際參數(shù)。3.按函數(shù)定義分函數(shù)按照定義可分為主函數(shù)、自定義函數(shù)、庫函數(shù)。目前六十五頁\總數(shù)八十四頁\編于四點3.7.2函數(shù)的定義
1.無參函數(shù)的定義此種函數(shù)在被調(diào)用時,既無參數(shù)輸入,也不返回結(jié)果給調(diào)用函數(shù),只是為完成某種操作而編寫的函數(shù)。無參函數(shù)的定義形式為:
函數(shù)類型函數(shù)名()
{
函數(shù)體;
}目前六十六頁\總數(shù)八十四頁\編于四點2.有參函數(shù)的定義調(diào)用此種函數(shù)時,必須提供實際的輸入函數(shù)。有參函數(shù)的定義形式為:
函數(shù)類型函數(shù)名(形式參數(shù)列表)形式參數(shù)說明;
{
函數(shù)體;
}
其中,“函數(shù)類型”說明了自定義函數(shù)返回值的類型。目前六十七頁\總數(shù)八十四頁\編于四點
【例3-7】設(shè)計可調(diào)節(jié)時間的延時程序。
voiddelay(unsignedintn)
{unsignedchari,j;
while(n--)
{ for(i=128;i>0;i--)
for(j=10;j>0;j--);
} } 目前六十八頁\總數(shù)八十四頁\編于四點
3.空函數(shù)此種函數(shù)體內(nèi)是空白的。調(diào)用空函數(shù)時,什么工作也不做,不起任何作用。定義空函數(shù)的目的,并不是為了執(zhí)行某種操作,而是為了以后程序功能的擴充??蘸瘮?shù)的定義形式為:返回值類型標(biāo)識符函數(shù)名()
{}
例如:
floatmin()
{} //空函數(shù),占好位置目前六十九頁\總數(shù)八十四頁\編于四點1.函數(shù)的參數(shù)函數(shù)的參數(shù)包括形式參數(shù)和實際參數(shù)。①形式參數(shù):函數(shù)的函數(shù)名后面括號中的變量名稱為形式參數(shù),簡稱形參。②實際參數(shù):在函數(shù)調(diào)用時,主調(diào)函數(shù)名后面括號中的表達式稱為實際參數(shù),簡稱實參。在C語言的函數(shù)調(diào)用中,實際參數(shù)與形式參數(shù)之間的數(shù)據(jù)傳遞是單向進行的,只能由實際參數(shù)傳遞給形式參數(shù),而不能由形式參數(shù)傳遞給實際參數(shù)。實際參數(shù)與形式參數(shù)的類型必須一致,否則會發(fā)生類型不匹配的錯誤。目前七十頁\總數(shù)八十四頁\編于四點2.函數(shù)的返回值函數(shù)返回值是通過return語句獲得的。一個函數(shù)可有一個以上的return語句,但是多于一個的return語句必須在選擇結(jié)構(gòu)(if或do/case)中使用,因為被調(diào)用函數(shù)一定只能返回一個變量。函數(shù)返回值的類型一般在定義函數(shù)時,由返回值的標(biāo)識符來指定。例如在函數(shù)名之前的int,指定函數(shù)的返回值的類型為整型數(shù)(int)。若沒有指定函數(shù)的返回值類型,默認(rèn)返回值為整型類型。當(dāng)函數(shù)沒有返回值時,則使用標(biāo)識符void進行說明。目前七十一頁\總數(shù)八十四頁\編于四點3.7.4函數(shù)的調(diào)用
在一個函數(shù)中需要用到某個函數(shù)的功能時,就調(diào)用該函數(shù)。調(diào)用者稱為主調(diào)函數(shù),被調(diào)用者稱為被調(diào)函數(shù)。1.函數(shù)調(diào)用的一般形式 函數(shù)名 {實際參數(shù)列表};
若被調(diào)函數(shù)是有參函數(shù),則主調(diào)函數(shù)必須把被調(diào)函數(shù)所需的參數(shù)傳遞給被調(diào)函數(shù),要求實參與形參數(shù)據(jù)在數(shù)量、類型和順序上都一致。實參可以是常量、變量和表達式。實參對形參的數(shù)據(jù)傳遞是單向的,即只能將實參傳遞給形參。目前七十二頁\總數(shù)八十四頁\編于四點2.函數(shù)調(diào)用的方式(1)函數(shù)調(diào)用語句函數(shù)調(diào)用語句把被調(diào)用函數(shù)的函數(shù)名作為主調(diào)函數(shù)的一個語句。例如:
print_message();(2)函數(shù)結(jié)果作為表達式的一個運算對象函數(shù)結(jié)果作為表達式的一個運算對象,例如:
result=2*gcd(a,b);
被調(diào)用函數(shù)作為一個運算對象出現(xiàn)在表達式中。這要求被調(diào)用函數(shù)帶有return語句,以便返回一個明確的數(shù)值參加表達式的運算。(3)函數(shù)參數(shù)函數(shù)參數(shù)即被調(diào)函數(shù)作為另一個函數(shù)的實際參數(shù)。例如:
m=max(a,gcd(u,v));
其中,gcd(u,v)是一次函數(shù)調(diào)用,它的值作為另一個函數(shù)的max()的實際參數(shù)之一。目前七十三頁\總數(shù)八十四頁\編于四點
在一個函數(shù)調(diào)用另一個函數(shù)時,須具備以下條件:①被調(diào)用函數(shù)必須是已經(jīng)存在的函數(shù)(庫函數(shù)或用戶自定義的函數(shù))。②如果程序中使用了庫函數(shù),或使用了不在同一文件中的其他自定義函數(shù),則應(yīng)該在程序的開頭處使用#include包含語句,將所有的函數(shù)信息包含到程序中來。③如果程序中使用了自定義函數(shù),且該函數(shù)與調(diào)用它的函數(shù)同在一個文件中,則應(yīng)根據(jù)主調(diào)函數(shù)與被調(diào)函數(shù)在文件中的位置,決定是否對被調(diào)函數(shù)做出說明。如果被調(diào)函數(shù)在主調(diào)函數(shù)之后,一般應(yīng)在主調(diào)函數(shù)中,在被調(diào)用函數(shù)調(diào)之前,對被調(diào)函數(shù)的返回值類型做出說明。如果被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不用對被調(diào)函數(shù)進行說明。如果在所有函數(shù)定義之前,在文件的開頭處,在函數(shù)的外部已經(jīng)說明了函數(shù)的類型,則在主調(diào)函數(shù)中不必對所調(diào)用的函數(shù)再做返回值類型說明。目前七十四頁\總數(shù)八十四頁\編于四點3.7.5中斷服務(wù)函數(shù)
使用interrupt可以將一個函數(shù)定義成中斷服務(wù)函數(shù)。中斷服務(wù)函數(shù)的一般形式為:函數(shù)類型函數(shù)名(形式參數(shù)表)interruptnusingn關(guān)鍵字interrupt后的n是中斷號。對于51單片機,n取值為0~4。關(guān)鍵字using后的n是所選擇的寄存器組。using是一個選項,可省略。如果沒有使用using關(guān)鍵字指明寄存器組,中斷函數(shù)中的所有工作寄存器的內(nèi)容將被保存到堆棧中。目前七十五頁\總數(shù)八十四頁\編于四點
3.7.6變量及存儲方式
1.變量①局部變量:是某一個函數(shù)中存在的變量,它只在該函數(shù)內(nèi)部有效。②全局變量:在整個源文件中都存在的變量。其有效區(qū)間是從定義點開始到源文件結(jié)束,其中的所有函數(shù)都可直接訪問該變量。如果定
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年小學(xué)語文畢業(yè)升學(xué)考試全真模擬卷(基礎(chǔ)夯實版)-小學(xué)語文閱讀理解能力訓(xùn)練實戰(zhàn)
- 統(tǒng)計質(zhì)量管理在現(xiàn)代制造業(yè)中的應(yīng)用-2025年統(tǒng)計學(xué)期末試卷
- 2025年網(wǎng)絡(luò)安全培訓(xùn)考試題庫:網(wǎng)絡(luò)安全防護技術(shù)與應(yīng)用實踐試題
- 熱水鍋爐定期檢驗工作制度
- 1200×650mm真空蒸鍍技術(shù)協(xié)議
- 專題15:《鋼鐵是怎樣煉成的》課件-中考語文一輪復(fù)習(xí)名著導(dǎo)讀課件與習(xí)題精練
- 2024年廣西職業(yè)院校技能大賽中職組《植物嫁接》賽項題庫
- 紀(jì)念品創(chuàng)業(yè)計劃書
- 物業(yè)施工現(xiàn)場安全管理
- 希沃課件導(dǎo)出功能詳解
- 總復(fù)習(xí)(教案)2023-2024學(xué)年數(shù)學(xué) 四年級下冊 北師大版
- 2022 年山東省職業(yè)院校技能大賽高職組復(fù)雜部件數(shù)控多軸聯(lián)動加工技術(shù)賽項-試題圖紙
- 【青松雪】中考數(shù)學(xué)幾何模型【模型08】費馬點最值模型
- 【項目方案】湖北省石首楚源“源網(wǎng)荷儲”一體化項目方案
- DL∕T 241-2012 火電建設(shè)項目文件收集及檔案整 理規(guī)范
- 2024風(fēng)電場架空線路融冰技術(shù)規(guī)范
- 淺談國家國家中小學(xué)智慧教育平臺在初中數(shù)學(xué)教學(xué)中的運用
- 化學(xué)運行值班員試題庫
- 濟南泛華AI-6000介損儀說明書
- 2024-2029年中國β-內(nèi)酰胺類抗生素行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展研究報告
- 北京海淀區(qū)-第2學(xué)期高二數(shù)學(xué)教概率統(tǒng)計教材分析-(64)課件
評論
0/150
提交評論