單片機-C51對標(biāo)準(zhǔn)C語言的擴展_第1頁
單片機-C51對標(biāo)準(zhǔn)C語言的擴展_第2頁
單片機-C51對標(biāo)準(zhǔn)C語言的擴展_第3頁
單片機-C51對標(biāo)準(zhǔn)C語言的擴展_第4頁
單片機-C51對標(biāo)準(zhǔn)C語言的擴展_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章

C51對標(biāo)準(zhǔn)C語言的擴展7.1C程序的流程控制1.C語言簡介C語言的優(yōu)點:語言簡潔,使用靈活方便;可移植性好;表達能力強;表達方式靈活;適用結(jié)構(gòu)化設(shè)計;可直接操作計算機硬件;生成的目標(biāo)代碼質(zhì)量高。缺點:不能自動檢查數(shù)組邊界,運算符級別多等。 7.1C程序的流程控制2.簡單C程序舉例Voidmain(){

inta=1; b=a+1;}說明:C語言從main開始執(zhí)行程序,void表示無值返回;C程序中用到的變量一定要先定義變量的數(shù)據(jù)類型,只有定義了數(shù)據(jù)類型后,變量才會在內(nèi)存中按其數(shù)據(jù)類型長度給其分配空間。 7.1C程序的流程控制變量用來存放數(shù)據(jù),運算符用來處理數(shù)據(jù)。運算符分:算術(shù)運算符、關(guān)系運算符、邏輯運算符、賦值運算符、逗號運算符、條件運算符、位運算符、指針運算符等。7.1C程序的流程控制在邏輯運算中,凡是結(jié)果為非“0”的數(shù)值即為真,等于“0”即為假。當(dāng)一個表達式中出現(xiàn)各種運算符時,要考慮運算符的優(yōu)先級及結(jié)合性。

3.C程序的流程控制(1)#define#define宏名字符串以一個宏名稱來代表一個字符串,即當(dāng)程序任何地方使用到宏名稱時,則將以代表的字符串來替換。宏的定義可以是一個常數(shù)、表達式或含有參數(shù)的表達式。范例:#defineuchar

unsignedchar//用uchar代替unsignedchar#defineuint

unsignedint//用uint代替unsignedint3.C程序的流程控制(2)if語句①if(條件表達式)

{

動作 }如果條件表達式的值為真,則執(zhí)行{}內(nèi)的動作;否則,則略過該動作而繼續(xù)往下執(zhí)行。

3.C程序的流程控制(2)if語句②if(條件表達式) {動作1}else {動作2}如果條件表達式為真,則執(zhí)行動作1,略過else的部分,接著往下執(zhí)行;否則,則略過動作1而執(zhí)行動作2,然后再往下執(zhí)行。

3.C程序的流程控制(2)if語句③if(條件表達式1) if(條件表達式2) if(條件表達式3) {動作A}else {動作B} else {動作C}else {動作D}動作A

:是條件1、2、3都成立時才會執(zhí)行。動作B

:是條件1、2成立,3不成立時才會執(zhí)行。動作C

:是條件1成立,2不成立時才會執(zhí)行。動作D:是條件1不成立時才會執(zhí)行。

3.C程序的流程控制(2)if語句④if(條件表達式1) {動作A} elseif(條件表達式2) {動作B} elseif(條件表達式3) {動作C}else {動作D}動作A

:是條件1成立時才會執(zhí)行。動作B

:是條件1不成立,2成立時才會執(zhí)行。動作C

:是條件1、2不成立,3成立時才會執(zhí)行。動作D:是條件1、2、3都不成立時才會執(zhí)行。

3.C程序的流程控制(3)switch-case語句switch(條件表達式){ case條件值1:

動作1 break; case條件值2:

動作2 break;

case條件值3:

動作3 break; default:

動作4 break;} 3.C程序的流程控制(3)switch-case語句switch內(nèi)的條件表達式必須為整數(shù)或字符。Switch用條件表達式的值來與各case的條件值對比,如果符合,則執(zhí)行該case的動作,之后一定要寫break退出循環(huán)。如果所有的條件值都不符合,則執(zhí)行default的動作。每個動作之后一定要寫break,否則會繼續(xù)執(zhí)行。另外,case之后的條件值一定是數(shù)據(jù)常數(shù),不能為變量,而且不可以重復(fù)。

3.C程序的流程控制(4)while循環(huán)語句while(條件表達式) {動作}先測試條件表達式是否成立。當(dāng)表達式為真時,則執(zhí)行循環(huán)內(nèi)動作,做完后又繼續(xù)跳回條件表達式再做測試;如此反復(fù)直到條件表達式為假,退出循環(huán)。3.C程序的流程控制(5)do-while循環(huán)語句 do{動作} while(條件表達式);

先執(zhí)行動作,再測試條件表達式是否成立。當(dāng)表達式為真時,則繼續(xù)回到前面動作;如此反復(fù)直到直到條件表達式為假為止。不論條件表達式的結(jié)果為何,至少會做一次動作。3.C程序的流程控制(6)for循環(huán)語句 for(表達式1;表達式2;表達式3){動作}表達式1:通常是設(shè)定起始值。表達式2:通常是條件判斷式。如果條件為真時,則執(zhí)行動作;否則終止循環(huán)。表達式3:通常是步長表達式。執(zhí)行動作完畢后,必須再回到這里做運算,然后再到表達式2做判斷。

3.C程序的流程控制(7)函數(shù)(FUNCTION)①數(shù)據(jù)類型

函數(shù)名稱(數(shù)據(jù)類型參數(shù)1,數(shù)據(jù)類型參數(shù)2)函數(shù)即子程序。使用函數(shù)的注意事項:函數(shù)定義時要同時聲明其類型;調(diào)用函數(shù)前要先聲明該函數(shù);傳給函數(shù)的參數(shù)值,其類型要與函數(shù)原定義一致;接受函數(shù)返回值的變量,其類型也要與函數(shù)一致。

3.C程序的流程控制(7)函數(shù)(FUNCTION)②函數(shù)的聲明voidfunction1(void)此函數(shù)無返回值,也不傳遞參數(shù)。

voidfunction2(unsignedchari,intj)此函數(shù)無返回值,但需要傳遞參數(shù)。unsignedcharfunction3(unsignedchari)此函數(shù)有unsignedchar類型的返回值給原調(diào)用程序。3.C程序的流程控制(7)函數(shù)(FUNCTION)③函數(shù)的返回值return是用來使函數(shù)結(jié)束并返回原調(diào)用程序的指令,而且可以把函數(shù)內(nèi)的最后結(jié)果數(shù)據(jù)傳回給原調(diào)用程序。7.2單片機匯編語言與C語言7.2.1單片機匯編語言與C語言程序設(shè)計對照范例例:編程將外部存儲器2050H和2060H單元的內(nèi)容互換。匯編程序:

ORG0000H LJMPMAIN ORG0100HMAIN:MOVDPTR,#2050H MOVXA,@DPTR MOVB,A MOVDPTR,#2060H MOVXA,@DPTR XCHA,B MOVX@DPTR,A MOVA,B MOVDPTR,#2050h MOVX@DPTR,A SJMP$ END7.2單片機匯編語言與C語言7.2.1單片機匯編語言與C語言程序設(shè)計對照范例C語言對地址的指示方法可以采用指針變量,也可以引用頭文件absacc.h作為絕對地址訪問。 看#include<absacc.h>頭函數(shù):

#defineCBYTE((unsignedcharvolatilecode*)0) #defineDBYTE((unsignedcharvolatiledata*)0)#definePBYTE((unsignedcharvolatilepdata*)0) #defineXBYTE((unsignedcharvolatilexdata*)0)使用XBYTE指向不數(shù)據(jù)存儲器的首地址:如:XBYTE(2050),即用來指向外部數(shù)據(jù)存儲器的2050H地址。在程序中,使用#include<absacc.h>即可使用其中聲明的宏來訪問絕對地址。7.2單片機匯編語言與C語言7.2.1單片機匯編語言與C語言程序設(shè)計對照范例例:編程將外部存儲器2050H和2060H單元的內(nèi)容互換。C程序:#include<absacc.h>voidmain(void){ charc;

c=XBYTE[2050H]; XBYTE[2050H]=XBYTE[2060H];

XBYTE[2060H]=c;while(1);}7.3C51語言對標(biāo)準(zhǔn)C語言的擴展C51語言的特色:C51雖然繼承了標(biāo)準(zhǔn)C語言的絕大部分特性,而且基本語法相同;但其本身又在特定的硬件結(jié)構(gòu)上有所發(fā)展,如關(guān)鍵字sbit、data、idata、pdata、xdata、code等。應(yīng)用C51個更要注重對系統(tǒng)資源的理解。因為單片機的資源相對PC機來說很貧乏,對于RAM、ROM中的每一個字節(jié)都要充分利用。程序上引用的各種算法要精簡,不要對系統(tǒng)構(gòu)成過重的負擔(dān)。盡量少用浮點運算,可以用無符號型數(shù)據(jù)的就不要用用符號型數(shù)據(jù);盡量避免多字節(jié)的乘除運算,多使用移位運算等。7.3C51語言對標(biāo)準(zhǔn)C語言的擴展7.3.1數(shù)據(jù)類型C51具有標(biāo)準(zhǔn)C語言的所有標(biāo)準(zhǔn)數(shù)據(jù)類型。除此之外,為了更加有效地利用8051結(jié)構(gòu),還加入了以下特殊的數(shù)據(jù)類型: bit:位變量,值為0或1;

sbit:特殊功能位變量,值為0或1;

sfr:特殊功能寄存器,sfr字節(jié)地址為0~255;

sfr16:16位的特殊功能寄存器,sfr16字節(jié)地址為0-65535。

7.3C51語言對標(biāo)準(zhǔn)C語言的擴展7.3.1數(shù)據(jù)類型

數(shù)據(jù)類型位數(shù)字節(jié)數(shù)數(shù)值范圍bit10~1char81-128~+127unsignedchar810~255enum162-32768~+32767short162-32768~+32767unsignedshort1620~65535int162-32768~+32767unsignedint1620~65535long324-2147483648~+2147483647unsignedlong3240~4294976295float324±1.175494E-38~±3.402823E+38sbit10~1sfr810~255sfr161620~655357.3C51語言對標(biāo)準(zhǔn)C語言的擴展7.3.2存儲類型及存儲區(qū)1.存儲類型及存儲區(qū)描述

存儲區(qū)描述dataRAM的低128B,可在一個機器周期內(nèi)直接尋址bdatadata區(qū)是字節(jié)、位混合尋址的的16B區(qū)idataRAM的高128B,必須采用間接尋址xdata外部存儲區(qū),使用DPTR間接尋址pdata外部存儲區(qū)的256Bcode程序存儲區(qū)2.存儲類型及存儲區(qū)使用舉例1)DATA區(qū):DATA區(qū)聲明中的存儲類型標(biāo)示符為data。例如:

unsignedchardatasystem

status=0;//定義無符號字符型變量system

status初始值為0,//使其存儲在低128B

unsignedintdatauint_id[2];//定義無符號整型數(shù)組uint_id,存儲在低128B中2.存儲類型及存儲區(qū)使用舉例2)BDATA區(qū):BDATA區(qū)聲明中的存儲類型標(biāo)示符為bdata(20H-2FH)。例如:

unsignedchar

bdata

status_byte;//定義無符號字符型變量status_byte,使其存儲在//20H-2FH區(qū),可進行位尋址

unsignedint

bdata

status_word;//定義無符號整型變量status_word,使其存儲在//20H-2FH區(qū)2.存儲類型及存儲區(qū)使用舉例3)IDATA區(qū):IDATA區(qū)聲明中的存儲類型標(biāo)示符為idata,指內(nèi)部的256B的存儲區(qū);但是只能間接尋址,速度比直接尋址慢。例如:

unsignedchar

idata

system_status;

unsignedint

idatauint_id[2];

2.存儲類型及存儲區(qū)使用舉例4)PDATA區(qū)和XDATA區(qū):均屬于外部存儲區(qū)。

PDATA區(qū)和XDATA區(qū)聲明中的標(biāo)識符分別為pdata和xdata。Xdata存儲類型標(biāo)識符可以指定外部數(shù)據(jù)存儲區(qū)64KB內(nèi)的任何地址,而pdata僅指定256B的外部數(shù)據(jù)區(qū)。

5)程序存儲區(qū)CODE。

CODE區(qū)聲明中的標(biāo)識符為code。7.3.3函數(shù)的使用1.函數(shù)聲明

keilC51編譯器擴展了標(biāo)準(zhǔn)C函數(shù)聲明,這些擴展有:(1)指定一個函數(shù)作為一個中斷函數(shù);(2)選擇所用的寄存器組;(3)選擇存儲模式;(4)指定重入。在函數(shù)聲明中可以包含這些擴展或?qū)傩?。聲明C51函數(shù)的標(biāo)準(zhǔn)格式如下:

[return_type]funcname([args])[{smallcompactlarge}][reentrant][interruptn][usingn]

7.3.3函數(shù)的使用1.函數(shù)聲明標(biāo)準(zhǔn)格式如下:

[return_type]funcname([args])[{smallcompactlarge}][reentrant][interruptn][usingn]return_type:函數(shù)返回值的類型,如果不指定缺省是int。funcname:函數(shù)名。args:函數(shù)的參數(shù)列表。small、compact或large:函數(shù)的存儲模式。reentrant:表示函數(shù)是遞歸的或可重入的。interrupt:表示是一個中斷函數(shù)。using:指定函數(shù)所用的寄存器組。7.3.3函數(shù)的使用2.中斷函數(shù)中斷函數(shù)聲明如下:返回值函數(shù)名interruptnusingninterruptn中的n對應(yīng)中斷源的編號,n的取值0~4。中斷編號告訴編譯器中斷程序的入口地址。usingn的n對應(yīng)四組通用寄存器中的一組。n的取值0~3。2.中斷函數(shù)8051單片機的中斷源以及中斷編號:

中斷編號中斷源入口地址0外部中斷00003H1定時器/計數(shù)器0000BH2外部中斷10013H3定時器/計數(shù)器1001BH4串行口中斷0023H2.中斷函數(shù)在51系列單片機中,有的單片機多達32個中斷源,所以中斷編號是0~31。中斷函數(shù)的完整語法如下:返回值函數(shù)名([參數(shù)][模式][重入])interruptn[usingn]

例:voidtimer()(void)interrupt1using2{ ……}3.重入函數(shù)由于51單片機內(nèi)部堆??臻g有限,C51采用一種壓縮棧的方法,即為每個函數(shù)設(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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論