第3章 單片機的C語言程序設計_第1頁
第3章 單片機的C語言程序設計_第2頁
第3章 單片機的C語言程序設計_第3頁
第3章 單片機的C語言程序設計_第4頁
第3章 單片機的C語言程序設計_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

3單片機的C語言程序設計教學目的熟悉C51的程序結構掌握C51的數(shù)據(jù)類型、存儲類型及函數(shù)等概念了解C51與標準C的不同之處熟悉C51的開發(fā)工具KeilC512本章內容C51的程序結構數(shù)據(jù)類型、存儲類型及存儲模式運算符、函數(shù)及程序流程控制C51的構造數(shù)據(jù)類型C51實例分析及混合編程KeilC51簡介33.1C51的程序結構與匯編語言相比,C51在功能、結構性、可讀性、可維護性及可移植性上有明顯的優(yōu)勢。C51程序結構與一般C語言沒有差別。C51的特點:

1.C51在吸取了匯編語言精華的基礎上又有所改進

2.C51繼承和發(fā)揚了高級語言的長處

3.C51的可移植性好

4.生成的代碼質量高,在代碼效率方面可以和匯編語言相媲美

C51的程序結構3.1C51的程序結構

5C51程序的結構一個C51程序大體上是一個函數(shù)定義的集合,在這個集合中僅有一個名為main的函數(shù)(主函數(shù))。

函數(shù)定義由類型、函數(shù)名、參數(shù)表和函數(shù)體四部分組成。函數(shù)的一般格式如下:

類型函數(shù)名(參數(shù)表)

參數(shù)說明;

{

數(shù)據(jù)說明部分;

執(zhí)行語句部分;

}C51的程序結構3.1C51的程序結構

6編寫C51 程序時應注意以下幾點:1.一個C51程序總是從main函數(shù)開始執(zhí)行的,而不論main函數(shù)在整個程序中的位置如何。2.C語言程序的書寫格式十分自由。一條語句可以寫成一行,也可以寫成幾行,還可以在一行內寫多條語句。但每條語句都必須以分號“;”作為結束符。3.C語言對大小字母敏感,C語言編譯器編譯程序時對同一個字母的大小寫作為不同的變量來處理。4.可以用/*……*/對C程序中的任何部分作注釋。程序加上必要的注釋,可增加程序的可讀性。C51的程序結構3.1C51的程序結構

73.2數(shù)據(jù)類型、存儲類型及存儲模式數(shù)據(jù)類型常量和變量C51的存儲類型及存儲模式特殊功能寄存器、并行接口及位變量的定義數(shù)據(jù)類型

可分為基本數(shù)據(jù)類型和構造數(shù)據(jù)類型。構造數(shù)據(jù)類型由基本數(shù)據(jù)類型構造而成。C51的數(shù)據(jù)類型分類如下所示:

數(shù)據(jù)類型、存儲類型及存儲模式3.2數(shù)據(jù)類型、存儲類型及存儲模式

9C51編譯器能識別的數(shù)據(jù)類型數(shù)據(jù)類型長度大小unsignedchar1B0~255char1B-128~+127unsignedint2B0~65535int2B-32768~+32767unsignedlong4B0~4294967295long4B-2147483648~+2147483647float4B1.175494E-38~3.402823E+38*1B~3B對象的地址bit位0或1sfr1B0~255sfr162B0~65535sbit位0或110常量和變量

C語言中的數(shù)據(jù)有常量、變量之分。

常量——在程序運行的過程中,其值不能改變的量稱為常量。C語言支持4種常量:整數(shù)常量、浮點數(shù)常量、枚舉量常量、字符常量。

變量——在程序執(zhí)行過程中,其值能不斷變化的量。使用一個變量之前必須進行定義,用一個標識符作為變量名并指出它的數(shù)據(jù)類型和存儲類型,以便編譯系統(tǒng)為它分配相應的存儲單元。

數(shù)據(jù)類型、存儲類型及存儲模式3.2數(shù)據(jù)類型、存儲類型及存儲模式

11

存儲種類是指變量在程序執(zhí)行過程中的作用范圍。變量的存儲種類有四種,分別為:自動(auto)外部(extern)靜態(tài)(static)寄存器(register)C51中變量定義的格式如下:

[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名表其中,存儲種類和存儲器類型是可選項。例如:staticchardatavar;12C51的存儲類型及存儲模式51系列單片機的存儲器采用哈佛結構。即其程序存儲器和數(shù)據(jù)存儲器分開,并有各自的尋址機構和尋址方式。以AT89C52為例,其具體結構如圖3.1所示。

數(shù)據(jù)類型、存儲類型及存儲模式3.2數(shù)據(jù)類型、存儲類型及存儲模式

13

AT89C52單片機在物理上有四個存儲空間:1.片內程序存儲器空間8KB2.片外程序存儲器空間64KB3.片內數(shù)據(jù)存儲器空間256B4.片外數(shù)據(jù)存儲器空間64KBAT89C52單片機在邏輯上有三個存儲空間:1.片內、片外程序存儲器空間64KB2.片內數(shù)據(jù)存儲器空間256B3.片外數(shù)據(jù)存儲器空間64KB數(shù)據(jù)類型、存儲類型及存儲模式3.2數(shù)據(jù)類型、存儲類型及存儲模式

14C51的存儲類型及存儲模式

C51在定義變量、常量時,將通過不同的存儲類型將它們定位在不同的存儲區(qū)中。存儲類型與AT89C52單片機實際存儲空間的對應關系如表所列。數(shù)據(jù)類型、存儲類型及存儲模式3.2數(shù)據(jù)類型、存儲類型及存儲模式

15存儲器類型描述data直接尋址的片內數(shù)據(jù)存儲器低128B,訪問速度最快bdata可位尋址的片內數(shù)據(jù)存儲器(地址20H~2FH共16B)允許位和字節(jié)混合訪問idata間接尋址片內數(shù)據(jù)存儲器256B。允許訪問片內全部地址pdata分頁尋址片外數(shù)據(jù)存儲器256B,使用指令MOVX@Rn訪問,需要2個指令周期xdata尋址片外數(shù)據(jù)存儲器64KB,使用指令MOVX@DPTR訪問code尋址程序存儲器區(qū)64KB,使用指令MOVC@A+DPTR訪問16存儲模式

C51編譯器允許采用三種存儲模式:小編譯模式SMALL、緊湊編譯模式COMPACT、大編譯模式LARGE。

一個變量的存儲器模式確定了未聲明存儲器類型的變量在內存中的地址空間。在SMALL模式下,該變量在80C51單片機的內部RAM中;在COMPACT和LARGE模式下,該變量在80C51單片機的外部RAM中。

建議在編寫源程序時,把存儲模式設定為SMALL,再在程序中把xdata、pdata和idata等類型變量進行專門聲明。17特殊功能寄存器的定義

AT89C52單片機中除了程序計數(shù)器PC和4組通用寄存器組(R0R7)之外,其他所有寄存器均稱為特殊功能寄存器(SFR),它們分散在片內RAM區(qū)的高128B中,它們只能采用直接尋址方式訪問。

為了能直接訪問這些SFR,C51擴充了類型說明符sfr、sfr16、sbit。利用它們可在C語言源程序中直接對AT89C52單片機的特殊功能寄存器進行定義。

定義方法如下:

sfr特殊功能寄存器名=地址常數(shù)

sfr16特殊功能寄存器名=地址常數(shù)例如:sfrP0=0x80;sfr16DPTR=0x82;//即DPTR低8位地址為0x82,高8位為0x83

數(shù)據(jù)類型、存儲類型及存儲模式3.2數(shù)據(jù)類型、存儲類型及存儲模式

18并行接口的定義

AT89C52單片機內部有4個8位并行口,即SFR中的P0-P3。這些內部并行口既可進行字節(jié)尋址,也可進行位尋址。

除了內部4個并行口之外,AT89C52單片機還可以在片外擴展硬件I/O口,這些I/O口大多只能進行字節(jié)尋址。

AT89C52單片機沒有專用的I/O指令,它的口地址是和數(shù)據(jù)存儲器統(tǒng)一編址的。即把一個口看作是數(shù)據(jù)存儲器的一個單元。程序采用訪問數(shù)據(jù)存儲器的指令來訪問I/O口。數(shù)據(jù)類型、存儲類型及存儲模式3.2數(shù)據(jù)類型、存儲類型及存儲模式

19位變量的定義

1.定義位變量的語法如下:

bitcheck_bit;/*將變量check_bit定義為位變量*/2.函數(shù)可包含類型為bit的參數(shù),也可將其作為返回值。3.可位尋址對象的定義和訪問(分兩步)例如:bdatachartemp;//先把temp定義為char類型sbittemp3=temp^3;//再把temp3為temp的第3位數(shù)據(jù)類型、存儲類型及存儲模式3.2數(shù)據(jù)類型、存儲類型及存儲模式

203.3運算符、函數(shù)及程序流程控制C51的運算符C51的函數(shù)C51的流程控制語句C51的運算符1.C51的賦值運算符和算術運算符(+、-、*、/、%)2.C51的關系運算符(>、<、>=、<=、==、!=)3.C51邏輯運算符(||、&&、?。?.C51位操作運算符(~、|、&、︿、<<

、>>

)5.自增減運算6.復合運算符(10種)運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

22C51的函數(shù)函數(shù)是C語言中的一種基本模塊,一個C語言程序就是由若干個模塊化的函數(shù)所構成的。

1.函數(shù)的分類從用戶使用角度劃分,函數(shù)分為標準庫函數(shù)和用戶自定義函數(shù)。用戶自定義函數(shù)是指用戶根據(jù)任務自己編寫的函數(shù)。從函數(shù)定義的形式上可劃分為三種形式:無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)。運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

23C51的函數(shù)

2.函數(shù)的定義無參數(shù)函數(shù)的定義

返回值類型函數(shù)名()

{函數(shù)體語句}有參數(shù)函數(shù)的定義

返回值類型函數(shù)名(形式參數(shù)列表)

形式參數(shù)類型說明

{函數(shù)體語句}空函數(shù)的定義

返回值類型函數(shù)名()

{}運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

24C51的函數(shù)

3.函數(shù)的參數(shù)和返回值形式參數(shù)和實際參數(shù)

形參:定義函數(shù)時,位于函數(shù)名后面圓括號中的變量名稱為“形式參數(shù)”。

實參:調用函數(shù)時,主調用函數(shù)名后面括號中的表達式稱為“實際參數(shù)”。參數(shù)的返回值

通過函數(shù)調用使主調用函數(shù)獲得一個確定的值,這就是函數(shù)的返回值。函數(shù)的返回值是通過return語句獲得的。運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

25C51的函數(shù)

4.函數(shù)的調用調用的形式為:函數(shù)名(實際參數(shù)表列);

函數(shù)的調用方式有三種:

1.函數(shù)調用語句:即把被調用函數(shù)名作為調用函數(shù)的一個語句,如func()

2.被調用函數(shù)作為表達式的運算對象:如x=2*func(a,b)

3.被調用函數(shù)作為另一個函數(shù)的實際參數(shù):如x=min(a,func(a,b));

運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

26C51的函數(shù)

5.對被調用函數(shù)的說明

在調用一個函數(shù)之前,應對該函數(shù)的類型進行說明,即“先說明,后調用”。被調用函數(shù)必須是已經(jīng)存在的函數(shù)(庫函數(shù)或用戶自定義函數(shù))。6.函數(shù)變量的存儲方式函數(shù)變量按其有效作用范圍可劃分為局部變量和全局變量。變量按其存儲方式可分為四種存儲種類,分別是自動變量(auto)、外部變量(extern)、靜態(tài)變量(static)和寄存器變量(register),這些存儲種類與變量的關系為:內部變量可定義為自動變量、靜態(tài)變量或寄存器變量,外部變量可定義為全局變量或靜態(tài)變量。運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

27C51的流程控制語句C語言有三種基本結構:順序結構、選擇結構與循環(huán)結構。運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

順序結構流程圖

28C51的流程控制語句運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

選擇結構流程圖

其中選擇結構又派生出串行多分支結構和并行多分支結構,29C51的流程控制語句運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

循環(huán)結構流程圖

循環(huán)結構又分為“while”型循環(huán)結構和“dowhile”型循環(huán)結構。30C51的流程控制語句1.選擇語句if

C語言提供了3種形式的if語句:

(1)if(條件表達式){語句;}

(2)if(條件表達式){語句1;}

else{語句2;}

(3)if(條件表達式1){語句1;}

elseif(條件表達式2){語句2;}

elseif(條件表達式3){語句3;}

elseif(條件表達式m){語句m;}

else{語句n;}

運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

31C51的流程控制語句2.switch/case語句

該語句形式如下:

switch(表達式)

{

case常量表達式1:{語句1;}break;case常量表達式2:{語句2;}break;

……

case常量表達式n:{語句n;}break;

default:{語句n+1;}

}運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

32C51的流程控制語句3.循環(huán)語句while語句

一般形式為:

while(條件表達式)

{

語句;/*循環(huán)體*/

}dowhile語句

一般形式如下:

do{

語句;/*循環(huán)體*/

}

while(條件表達式);運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

33C51的流程控制語句3.循環(huán)語句

for語句

一般形式如下:

for([初值設定表達式];[循環(huán)條件表達式];[更新表達式])

{

語句;/*循環(huán)體*/

}運算符、函數(shù)及程序流程控制3.3運算符、函數(shù)及程序流程控制

343.4C51的構造數(shù)據(jù)類型數(shù)組結構聯(lián)合枚舉指針數(shù)組一維數(shù)組一維數(shù)組的定義方式

類型說明符數(shù)組名[整型表達式]初始化intarry[10]={1,1,1,1,2,2,2,3,4,5}二維數(shù)組二維數(shù)組的定義方式

類型說明符數(shù)組名[常量表達式][常量表達式]二維數(shù)組的初始化intarry[2][2]={1,2,3,4}C51的構造數(shù)據(jù)類型3.4C51的構造數(shù)據(jù)類型36結構結構的定義結構是結構是一種數(shù)據(jù)類型,通常定義結構數(shù)據(jù)類型后再用它去定義相關變量。定義結構類型的方法如下:

struct結構名

{結構成員說明};

結構成員說明的格式為:

類型標識符成員名;用結構類型去定義變量的方法有三種:先定義結構類型再定義類型為該結構的變量定義結構類型的同時,定義該結構的變量直接定義結構類型變量結構變量的引用

引用的方式為:結構變量名.成員名

C51的構造數(shù)據(jù)類型3.4C51的構造數(shù)據(jù)類型37聯(lián)合又稱為共用體。它也是C語言中的一種構造數(shù)據(jù)類型。在一個聯(lián)合中可以包含多個不同類型的數(shù)據(jù)元素。其定義格式為:

union聯(lián)合類型名

{

類型說明符變量名;

};

聯(lián)合與結構的區(qū)別在于:聯(lián)合所包含的各個成員只能分時共享同一存儲空間。定義聯(lián)合類型變量的方法類似于定義結構變量,同樣有三種。

引用聯(lián)合成員的一般格式為:

聯(lián)合變量名.聯(lián)合元素或:聯(lián)合變量名->聯(lián)合元素C51的構造數(shù)據(jù)類型3.4C51的構造數(shù)據(jù)類型38枚舉

枚舉數(shù)據(jù)類型是一個有名字的某些整數(shù)型常量的集合。這些整數(shù)型常量是該類型變量可取的所有的合法值。枚舉定義應當列出該類型變量的可取值。

定義枚舉類型變量的一般格式為:

enum枚舉名{枚舉值表列}變量表列;enumweekday{1,2,3,4,5,6,7}x1,x2;C51的構造數(shù)據(jù)類型3.4C51的構造數(shù)據(jù)類型39指針指針是C語言的一個重要概念,也是特色之一。使用指針可以有效地表示復雜的數(shù)據(jù)結構,直接處理內存地址,而且可以更有效地使用數(shù)組。

指針的概念變量的指針就是變量的地址

指針變量的定義

指針變量定義的一般形式如下:

類型標示符*指針變量名指針變量的引用

通過舉例說明。應注意的是:“*”在指針變量定義時和在指針運算時所代表的含義是不同的。C51的指針類型C51的構造數(shù)據(jù)類型3.4C51的構造數(shù)據(jù)類型40指針C51的指針類型C51編譯器支持“基于存儲器”的指針和“一般”指針兩種類型。基于存儲器的指針:在編譯時一般被“行內”編碼,無須庫調用。即指針所指的對象所在的存儲空間由定義時C源代碼中的存儲類型決定。該指針只占用1-2個字節(jié)。一般指針:包含3個字節(jié)。其中2個字節(jié)偏移量(即指針的地址)和1個字節(jié)存儲器類型。為了表示這種指針必須用長整數(shù)來定義存儲類型。C51的構造數(shù)據(jù)類型3.4C51的構造數(shù)據(jù)類型41指針基于存儲器的指針該指針不但指出了指針本身的存儲類型(缺省時由編譯時的存儲模式?jīng)Q定),而且還明確的指出了指針所指向的對象變量的存儲類型(不能缺省)?;诖鎯ζ鞯闹羔橀L度短,速度快,但因為它所指的對象變量有確定的存儲器空間,所以這類指針缺乏兼容性。一般指針

定義指針時若未明確指明指針所指對象變量的存儲類型,則該指針為一般指針。定義一般指針的方法與標準C語言相同。C51的構造數(shù)據(jù)類型3.4C51的構造數(shù)據(jù)類型42指針

對比一般指針和基于存儲器的指針,可得出以下結論:基于存儲器的指針長度短,運行速度快。而一般指針由于其所指對象變量的存儲器空間位置只有在運行期間才能確定,編譯器在編譯期間無法優(yōu)化存儲方式,必須生成一般代碼以保證能對任意空間的對象進行存取,所以一般指針所產(chǎn)生的代碼運行速度較慢。一般指針可用于存取任何變量而不必考慮變量在AT89

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論