單片機(jī)原理及應(yīng)用:第4章 單片機(jī)Cx51編程基礎(chǔ)_第1頁
單片機(jī)原理及應(yīng)用:第4章 單片機(jī)Cx51編程基礎(chǔ)_第2頁
單片機(jī)原理及應(yīng)用:第4章 單片機(jī)Cx51編程基礎(chǔ)_第3頁
單片機(jī)原理及應(yīng)用:第4章 單片機(jī)Cx51編程基礎(chǔ)_第4頁
單片機(jī)原理及應(yīng)用:第4章 單片機(jī)Cx51編程基礎(chǔ)_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、單片機(jī)原理及應(yīng)用(第 4 章 單片機(jī)Cx51編程基礎(chǔ))教學(xué)內(nèi)容編程語言簡介數(shù)制與編碼Cx51變量和運算符Cx51函數(shù)Cx51流程控制語句Cx51數(shù)組Cx51指針Cx51 預(yù)處理Keil C51集成開發(fā)環(huán)境DATE: 2022/7/17PAGE: 2 一、編程語言簡介機(jī)器語言是用二進(jìn)制代碼表示的,能被計算機(jī)直接識別和執(zhí)行的一種機(jī)器指令的集合。直觀性和通用性都很差匯編語言采用了助記符號編寫程序,通過編譯器轉(zhuǎn)換成能夠被計算機(jī)識別和處理的二進(jìn)制代碼程序。匯編語言仍然是面向機(jī)器的語言,編程煩瑣費時,通用性也差。高級語言用與自然語言接近的代碼編寫程序,通過編譯器轉(zhuǎn)換成二進(jìn)制代碼程序。高級語言易學(xué)易用,通用

2、性好。 C語言是一種結(jié)構(gòu)化的高級編程語言,在單片機(jī)系統(tǒng)開發(fā)中得到了廣泛應(yīng)用。DATE: 2022/7/17PAGE: 3 二、數(shù)制與編碼1.數(shù)制的基與權(quán)基:各計數(shù)制中每個數(shù)位上可用字符的個數(shù)。權(quán):數(shù)字“1”在數(shù)字不同的數(shù)位所代表的數(shù)值。二進(jìn)制基數(shù)為2( 0和1),權(quán)為以2為底的冪。二進(jìn)制數(shù)字后面用B表示十進(jìn)制基數(shù)為10(0-9),權(quán)是以10為底的冪。十進(jìn)制用D(或不加標(biāo)志)表示十進(jìn)制數(shù)十六進(jìn)制 基數(shù)為16(0-9以及A-F),權(quán)是以16為底的冪。十六進(jìn)制用H表示十六進(jìn)制數(shù)DATE: 2022/7/17PAGE: 4 二、數(shù)制與編碼1.數(shù)制的基與權(quán)例1:若數(shù)字1001.01分別為二進(jìn)制、十進(jìn)制數(shù)

3、和十六進(jìn)制數(shù),則權(quán)值分別為:二進(jìn)制數(shù)1001.11從左到右各位的權(quán)分別是23、22、21、20、2-1和2-2,即8、4、2、1、0.5、和0.25。十進(jìn)制數(shù)1001.01從左到右各位的權(quán)分別是103、102、101、100、10-1和10-2,即1000、100、10、1、0.1、和0.01。十六進(jìn)制數(shù)1001.01從左到右各位的權(quán)分別是163、162、161、160、16-1和16-2,即4096、256、16、1、0.0625、和0.00390625。DATE: 2022/7/17PAGE: 5 二、數(shù)制與編碼2.各種數(shù)制之間的相互轉(zhuǎn)換非十進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù) 方法:將系數(shù)與對應(yīng)的權(quán)值相

4、乘并求和,所得結(jié)果即為該數(shù)對應(yīng)的十進(jìn)制數(shù)。例2:將二進(jìn)制數(shù)110.11轉(zhuǎn)換為十進(jìn)制數(shù)解 110.11B=122+121+020+12-1+12-2 = 4+2+0.5+0.25 =6.75DATE: 2022/7/17PAGE: 6 二、數(shù)制與編碼2.各種數(shù)制之間的相互轉(zhuǎn)換非十進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)例3: 將十六進(jìn)制數(shù)121D.2轉(zhuǎn)換為十進(jìn)制數(shù) 解 121D.2H =1163+2162+1161+13160+216-1 = 4096+192+16+13+0.125 =4317.125DATE: 2022/7/17PAGE: 7 二、數(shù)制與編碼十進(jìn)制數(shù)轉(zhuǎn)換為非十進(jìn)制數(shù)對于整數(shù)部分采用“除基取余,先

5、低后高”的方法,對小數(shù)部分采用“乘基取整,先高后低”的方法,可將十進(jìn)制數(shù)轉(zhuǎn)換為非十進(jìn)制數(shù)。 例4:將50.75轉(zhuǎn)換為二進(jìn)制數(shù) 因此可得:50.75=110010.11BDATE: 2022/7/17PAGE: 8 二、數(shù)制與編碼例5 將十進(jìn)制數(shù)500.03125轉(zhuǎn)換為十六進(jìn)制數(shù) 解 : 因此可得: 500.03125=1F4.08HDATE: 2022/7/17PAGE: 9 二、數(shù)制與編碼十六進(jìn)制數(shù)與二進(jìn)制數(shù)之間的轉(zhuǎn)換整數(shù)部分由小數(shù)點向左每4位一組,若整數(shù)最高位的一組不足4位,則在其左邊加0補(bǔ)足4位;小數(shù)部分由小數(shù)點向右每4位一組,若小數(shù)最低位的一組不足4位,則在其右邊加0補(bǔ)足4位;用與每組

6、二進(jìn)制數(shù)所對應(yīng)的十六進(jìn)制數(shù)取代每組的4位二進(jìn)制數(shù)即可轉(zhuǎn)換為十六進(jìn)制。將十六進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)時,過程相反。 DATE: 2022/7/17PAGE: 10 二、數(shù)制與編碼十六進(jìn)制數(shù)與二進(jìn)制數(shù)之間的轉(zhuǎn)換例6:將十六進(jìn)制數(shù)9F4.1H轉(zhuǎn)換為二進(jìn)制數(shù)解 將每位十六進(jìn)制數(shù)寫為二進(jìn)制數(shù) 9 F 4 . 1 1001 1111 0100 . 0001 可得: 9F4.1H = 100111110100.0001BDATE: 2022/7/17PAGE: 11 二、數(shù)制與編碼編碼是計算機(jī)為輸入處理字母、數(shù)字和符號等組成的信息,依靠輸入設(shè)備先把要輸入的字符按一定格式編成的二進(jìn)制代碼。目前國際上使用的字符編碼

7、是ASCII碼(American standard coded for information interchange,美國信息交換標(biāo)準(zhǔn)碼)。ASCII碼用一個字節(jié)來表示一個字符,采用7位二進(jìn)制代碼來對字符進(jìn)行編碼,最高位一般用做校驗位,因此共128個,包括32個通用控制符號、10個阿拉伯?dāng)?shù)字、52個英文大寫和小寫字母及34個專用符號。數(shù)字0-9的ASCII碼為30H-39H,英文大寫字母A-Z的ASCII碼為41H-5AHDATE: 2022/7/17PAGE: 12 三、Cx51變量和運算符數(shù)據(jù)可分為常量和變量。常量是數(shù)值和字符等不能改變的量,可以不經(jīng)說明和定義直接使用,而變量是在程序運行

8、過程中可以根據(jù)需要改變的量,在引用之前必須定義類型。C51 定義一個變量的格式如下: 數(shù)據(jù)類型 存儲類型 變量名表 其中“數(shù)據(jù)類型”和“存儲類型”的先后次序可以互換。DATE: 2022/7/17PAGE: 13 三、Cx51變量和運算符-數(shù)據(jù)類型 表4-1 Cx51支持的數(shù)據(jù)類型DATE: 2022/7/17PAGE: 14 三、Cx51變量和運算符-數(shù)據(jù)類型bit 、 sfr 、 sfr16 和 sbit是 Keil C51中新增的變量類型。(1)bit用來定義位變量,值只能是0或1。位變量位于8051單片機(jī)內(nèi)部RAM位尋址區(qū)(20H2FH),共為16字節(jié),最多可定義128個位變量。DAT

9、E: 2022/7/17PAGE: 15 三、Cx51變量和運算符-數(shù)據(jù)類型(2)sfr用于定義特殊功能寄存器變量。該變量存儲在片內(nèi)的特殊功能寄存器存儲區(qū)中,用來對特殊功能寄存器進(jìn)行讀寫操作。 例如:51頭文件中有定義sfr P0=0 x90,這一語句定義了P0端口在片內(nèi)的寄存器,在程序中可以使用P0對該端口寄存器進(jìn)行操作。DATE: 2022/7/17PAGE: 16 二、Cx51變量和運算符-數(shù)據(jù)類型(3)sfr16也用于定義特殊功能寄存器,所不同的是它用于操作占兩個字節(jié)的特殊功能寄存器。 例如:sfr16 DPTR=0 x82語句定義了片內(nèi)16位數(shù)據(jù)指針寄存器DPTR,其低8位字節(jié)地址為

10、82H,高8位字節(jié)地址為83H,在程序中可以對DPTR進(jìn)行操作。DATE: 2022/7/17PAGE: 17 三、Cx51變量和運算符-數(shù)據(jù)類型(4)sbit用于定義特殊功能寄存器位變量,用來對特殊功能寄存器的可位尋址位進(jìn)行讀寫操作。 例如sbit P0_0=P00 定義了特殊功能寄存器P0的第0位,后面對該位的操作可用P0_0代替。符號后面的數(shù)字定義特殊功能寄存器可尋址位在寄存器中的位置,取值必須是0-7。DATE: 2022/7/17PAGE: 18 三、Cx51變量和運算符-存儲類型表4-2 Cx51存儲類型DATE: 2022/7/17PAGE: 19 三、Cx51變量和運算符-存儲

11、類型1.片內(nèi)存儲區(qū)(1)data將變量存儲在片內(nèi)可直接尋址的數(shù)據(jù)存儲器DATA區(qū)中。DATA區(qū)位于片內(nèi)RAM的低128字節(jié)(0X000X7F)。使用data存儲模式,目標(biāo)代碼中對變量的訪問速度最快,把經(jīng)常使用的變量放在DATA區(qū)可提高程序運行速度。若定義i為存儲類型為data的無符號字符型數(shù)據(jù),可聲明為: unsigned char data iDATE: 2022/7/17PAGE: 20 三、Cx51變量和運算符-存儲類型(2) bdata用于將變量定義在數(shù)據(jù)存儲器可位尋址的BDATA區(qū),允許位與字節(jié)混合訪問。BDATA區(qū)位于單片機(jī)內(nèi)部RAM字節(jié)地址0 x200 x2F的16個字節(jié)中,每個

12、字節(jié)8位,共計16x8=128個可尋址位。例如如下聲明后可用位變量value0訪問字節(jié)value的0位: unsigned char bdata value; bit value0=value0; 若value的原值為0 x00,欲將value的第0位置為1,可采用按字節(jié)訪問方式“value=0 x01”實現(xiàn),也可以按位尋址方式“value0=1”實現(xiàn)。DATE: 2022/7/17PAGE: 21 三、Cx51變量和運算符-存儲類型idata將變量存儲在片內(nèi)間接尋址的數(shù)據(jù)存儲區(qū)IDATA區(qū)中。IDATA區(qū)使用指針來進(jìn)行尋址和訪問。51內(nèi)核單片機(jī)RAM僅有128個字節(jié),因此無間接尋址數(shù)據(jù)存儲器

13、區(qū),idata與data無區(qū)別。52內(nèi)核單片機(jī)RAM有256個字節(jié),當(dāng)片內(nèi)128字節(jié)的直接尋址數(shù)據(jù)存儲區(qū)不夠用時,可以使用128字節(jié)間接尋址數(shù)據(jù)存儲區(qū),訪問速度較data慢一些。DATE: 2022/7/17PAGE: 22 三、Cx51變量和運算符-存儲類型2.片外存儲區(qū)xdata將變量存儲在片外數(shù)據(jù)存儲器中,采用16位地址,可以訪問外部數(shù)據(jù)存儲區(qū)64KB內(nèi)的任何地址。pdata將變量存儲在片外數(shù)據(jù)存儲器中的第一頁(地址00HFFH)中,存儲空間為256字節(jié)。對PDATA區(qū)尋址,只需要裝入8位地址,而對XDATA區(qū)尋址要裝入16位地址,因此對PDATA區(qū)的尋址要比對XDATA區(qū)尋址快。pda

14、ta和xdata存儲類型的變量由于需要訪問外存,訪問速度最慢,應(yīng)盡量減少對變量的訪問次數(shù)。這兩種類型適合保存原始數(shù)據(jù)或最終結(jié)果,需要頻繁訪問的中間結(jié)果應(yīng)盡量不用或少用。DATE: 2022/7/17PAGE: 23 三、Cx51變量和運算符-存儲類型3.程序存儲器ROMcode將變量存儲在程序存儲器中,變量只能讀不能寫,因此適合存儲常量或查表類的數(shù)組數(shù)據(jù),不能用于存儲程序運行過程中需要修改的變量。如果想改變變量值,只能在程序中修改后重新將程序燒寫進(jìn)ROM中。DATE: 2022/7/17PAGE: 24 三、Cx51變量和運算符-運算符表4-3 Cx51中的算術(shù)運算符DATE: 2022/7/

15、17PAGE: 25 三、Cx51變量和運算符-運算符表4-4 Cx51中的關(guān)系運算符DATE: 2022/7/17PAGE: 26 三、Cx51變量和運算符-運算符表4-5 Cx51中的邏輯運算符DATE: 2022/7/17PAGE: 27 三、Cx51變量和運算符-運算符表4-6 Cx51中的位運算符DATE: 2022/7/17PAGE: 28 三、Cx51變量和運算符-運算符表4-7 Cx51中的復(fù)合運算符DATE: 2022/7/17PAGE: 29 四、Cx51函數(shù) 函數(shù)可分為主函數(shù)、標(biāo)準(zhǔn)庫函數(shù)、自定義函數(shù)三類。1、主函數(shù)Cx51語言程序中有且只能有一個主函數(shù)main()。一個C

16、x51語言程序的執(zhí)行從主函數(shù)開始,主函數(shù)可以調(diào)用其它函數(shù),包括庫函數(shù)和自定義函數(shù),其它函數(shù)不能調(diào)用主函數(shù)。主函數(shù)的標(biāo)準(zhǔn)寫法是 int main( void ) 前面的int是main 函數(shù)的返回值類型,用于向操作系統(tǒng)說明程序的退出狀態(tài),返回0代表正常退出,1代表異常。形式參數(shù)“void”用于說明主函沒有輸入?yún)?shù)。DATE: 2022/7/17PAGE: 30 四、Cx51函數(shù) 2、庫函數(shù) Cx51編譯器提供了豐富的庫函數(shù),庫函數(shù)是已經(jīng)編寫好的功能函數(shù),可完成數(shù)學(xué)計算、輸入輸出等常用功能,供開發(fā)人員調(diào)用,以提高編程效率。 如果程序中使用了庫函數(shù),則應(yīng)該在程序的開頭處使用#include包含語句,

17、將所用的函數(shù)頭文件包含到程序中來。DATE: 2022/7/17PAGE: 31 四、Cx51函數(shù) 3、自定義函數(shù)可根據(jù)需要編寫自定義功能函數(shù),結(jié)構(gòu)如下:返回值類型 函數(shù)名(類型 形參) 數(shù)據(jù)定義; 執(zhí)行語句; 返回值;DATE: 2022/7/17PAGE: 32 四、Cx51函數(shù) 形參和返回值是函數(shù)與外界聯(lián)系的橋梁。形參是在函數(shù)調(diào)用時由外界傳入函數(shù)體內(nèi)的參數(shù),形參可以沒有,也可以有多個;返回值是函數(shù)運行完畢時返回給調(diào)用該函數(shù)語句的值。如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型,凡不加返回值類型限定的函數(shù),就會被編譯器作為返回整型值處理。根據(jù)作用范圍的不同,變量可分為局部變量和全局變量。局

18、部變量是定義在函數(shù)內(nèi)部的變量,只在該函數(shù)內(nèi)部有效;全局變量是定義在函數(shù)外部的變量,從其定義位置開始到源文件結(jié)束都有效。如果全局變量和某一函數(shù)的局部變量同名,則在該函數(shù)內(nèi)部只有局部變量有效。DATE: 2022/7/17PAGE: 33 四、Cx51函數(shù) DATE: 2022/7/17PAGE: 34 例7 左圖是8051單片機(jī)的P1.0口上連接了一個LED,請編程實現(xiàn)LED周期閃爍。四、Cx51函數(shù) #include /包含單片機(jī)定義寄存器的頭文件 sbit led = P10; /將led定義為P1.0位void delay(void) /延時函數(shù) unsigned int i; /定義無符

19、號整數(shù),最大取值范圍65535 for(i=0;i20000;i+);/做20000次空循環(huán),以進(jìn)行延時。 int main(void ) /主函數(shù) while(1) /無限循環(huán),以使LED持續(xù)閃爍。 led =0; / P1.0輸出低電平,燈亮 delay(); /延時一段時間 led =1; / P1.0輸出高電平,燈滅 delay(); /延時一段時間 DATE: 2022/7/17PAGE: 35 四、Cx51函數(shù) 例8 下圖是8051單片機(jī)的P0口上連接了8個LED,請采用移位操作編寫程序?qū)崿F(xiàn)LED流水燈。DATE: 2022/7/17PAGE: 36 四、Cx51函數(shù) #inclu

20、de /包含單片機(jī)定義寄存器的頭文件void delay(void) /延時函數(shù) unsigned int i; /定義無符號整數(shù),最大取值范圍65535 for(i=0;i7; /將led最高位先放到a中的最低位中,a中其它位全為0b = led1; /將led左移一位,最低位補(bǔ)零led = b|a; /位或運算 delay(); DATE: 2022/7/17PAGE: 37 五、流程控制語句-順序結(jié)構(gòu)Cx51流程控制共有3種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)以及循環(huán)結(jié)構(gòu)。1.順序結(jié)構(gòu) 順序結(jié)構(gòu)是最基本、最簡單的編程結(jié)構(gòu),程序按先后順序執(zhí)行指令代碼。DATE: 2022/7/17PAGE: 38

21、 五、流程控制語句-順序結(jié)構(gòu)例 9:下圖是8051單片機(jī)的P0口和P1口上分別連接了8個LED,請分別用P0和P1口顯示加法125+34和減法176-98的運算結(jié)果DATE: 2022/7/17PAGE: 39 五、流程控制語句-順序結(jié)構(gòu)#includeint main(void) unsigned char a=125,b=34,c=176,d=98; P1=a+b; /加法運算結(jié)果送P1端口,P1=159=1001 1111B P0=c-d; /減法運算結(jié)果送P0端口,P0=78=0100 1110B while(1); /循環(huán)等待,防止主程序退出后單片機(jī)跑飛 DATE: 2022/7/1

22、7PAGE: 40 五、流程控制語句-選擇結(jié)構(gòu)2.選擇結(jié)構(gòu)(1)if語句 if語句用于根據(jù)條件判定結(jié)果決定執(zhí)行的語句。if語句有三種基本形式:if(表達(dá)式) 語句組 說明:如果“表達(dá)式”為真,則執(zhí)行花括號中的語句組,否則跳過花括號執(zhí)行下面的語句。if(表達(dá)式) 語句組1 else 語句組2 說明:如果“表達(dá)式”真,則執(zhí)行語句組1,否則執(zhí)行語句組2。DATE: 2022/7/17PAGE: 41 五、流程控制語句-選擇結(jié)構(gòu)if(表達(dá)式1) 語句1 else if(表達(dá)式2) 語句組2 else if(表達(dá)式3) 語句組3 else if(表達(dá)式m) 語句組m else 語句組n 說明:如果“表達(dá)

23、式1”為真,則執(zhí)行“語句組1”,否則如果“表達(dá)式2”為真,則執(zhí)行“語句組2”,如果所有的表達(dá)式都不滿足,則執(zhí)行語句組n。DATE: 2022/7/17PAGE: 42 五、流程控制語句-選擇結(jié)構(gòu)例10:同圖4-2,用if語句根據(jù)54/18的計算結(jié)果選擇P0口8位LED的狀態(tài).DATE: 2022/7/17PAGE: 43 五、流程控制語句-選擇結(jié)構(gòu)#include /包含單片機(jī)寄存器的頭文件int main(void) unsigned char a=54,b=18; if (a/b=1)P0=0 xfe; /第一個LED亮 else if (a/b=2) P0=0 xfd; /第二個LED亮

24、 else if (a/b=3) P0=0 xfb; /第三個LED亮 else if (a/b=4) P0=0 xf7; /第四個LED亮 else if (a/b=5) P0=0 xef; /第五個LED亮 else if (a/b=6) P0=0 xdf; /第八個LED亮 else if (a/b=7) P0=0 xbf; /第七個LED亮 else if (a/b=8) P0=0 x7f; /第八個LED亮 else P0=0 xff; /缺省值,關(guān)閉所有LED while(1); DATE: 2022/7/17PAGE: 44 五、流程控制語句-選擇結(jié)構(gòu)(2)switch/case

25、語句 根據(jù)表達(dá)式的值決定要執(zhí)行的語句組,用于實現(xiàn)多中選一,形式如下: switch(表達(dá)式) case常量表達(dá)式1:/如果1滿足,則執(zhí)行語句組1 語句組1; break; /跳出switch結(jié)構(gòu)case常量表達(dá)式2:/如果2滿足,則執(zhí)行語句組2 語句組2; break; /跳出switch結(jié)構(gòu)default: /條件都不滿足時,執(zhí)行語句組n 語句組n; DATE: 2022/7/17PAGE: 45 五、流程控制語句-選擇結(jié)構(gòu)例 11:同圖4-2,用swtich語句根據(jù)54/18的計算結(jié)果選擇P0口8位LED的狀態(tài)DATE: 2022/7/17PAGE: 46 五、流程控制語句-選擇結(jié)構(gòu)#in

26、clude /包含單片機(jī)寄存器的頭文件int main(void) unsigned char a=56,b=18; switch(a/b) /使用多分支選擇語句 case 1: P0=0 xfe; break; /第一個LED亮 case 2: P0=0 xfd; break; /第二個LED亮 case 3: P0=0 xfb; break; /第三個LED亮 case 4: P0=0 xf7; break; /第四個LED亮 case 5: P0=0 xef; break; /第五個LED亮 case 6:P0=0 xdf; break; /第六個LED亮 case 7:P0=0 xbf

27、; break; /第七個LED亮 case 8:P0=0 x7f; break; /第八個LED亮 default: P0=0 xff; /缺省值,關(guān)閉所有LED while(1);DATE: 2022/7/17PAGE: 47 五、流程控制語句-循環(huán)結(jié)構(gòu)1、for循環(huán) for 循環(huán)結(jié)構(gòu)用于按指定的次數(shù)循環(huán)執(zhí)行一組語句,格式如下:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句;for循環(huán)語句執(zhí)行過程如下:(1)先執(zhí)行表達(dá)式1,一般是對循環(huán)變量賦初值;(2)執(zhí)行表達(dá)式2,若表達(dá)式2結(jié)果為真,則執(zhí)行循環(huán)體語句,并求解表達(dá)式3(一般是改變循環(huán)變量的值); 然后再次執(zhí)行表達(dá)式2;并判斷結(jié)果真假(3)若表

28、達(dá)式2結(jié)果為假,則退出for循環(huán)。DATE: 2022/7/17PAGE: 48 五、流程控制語句-循環(huán)結(jié)構(gòu)例 12:同圖4-3,用for循環(huán)計算7的階乘并送P1和P0口顯示結(jié)果。DATE: 2022/7/17PAGE: 49 五、流程控制語句-循環(huán)結(jié)構(gòu)#include /包含單片機(jī)寄存器的頭文件int main(void) unsigned char i; unsigned int s=1; for(i=1;i=7;i+) s=s*i; /計算階乘 P1=s/256; /高8位送P1顯示 P0=s%256; /低8位送P0顯示 while(1);DATE: 2022/7/17PAGE: 50

29、 五、流程控制語句-循環(huán)結(jié)構(gòu)(3)while循環(huán) while循環(huán)語句先判斷條件真假,若表達(dá)式為真,則執(zhí)行花括號內(nèi)的語句組,否則終止循環(huán),格式如下: while(表達(dá)式) 語句組DATE: 2022/7/17PAGE: 51 五、流程控制語句-循環(huán)結(jié)構(gòu)例 13:同圖4-3,用while循環(huán)計算7的階乘并送P1和P0口顯示結(jié)果。DATE: 2022/7/17PAGE: 52 五、流程控制語句-循環(huán)結(jié)構(gòu)#include /包含單片機(jī)寄存器的頭文件int main(void) unsigned char i=1; unsigned int s=1; while(i=7) s=s*i; /計算階乘 i+

30、; /i自增運算 P1=s/256; /高8位送P1顯示 P0=s%256; /低8位送P0顯示 while(1);DATE: 2022/7/17PAGE: 53 五、流程控制語句-循環(huán)結(jié)構(gòu)(4) do while 循環(huán) 先執(zhí)行花括號內(nèi)的語句組,然后執(zhí)行表達(dá)式,若結(jié)果為真,則重復(fù)執(zhí)行花括號內(nèi)的語句組,否則終止循環(huán),格式如下:do 語句組while(表達(dá)式);DATE: 2022/7/17PAGE: 54 五、流程控制語句-循環(huán)結(jié)構(gòu)例14:根據(jù)下圖用do while循環(huán)計算7的階乘并送P1和P0口顯示結(jié)果。DATE: 2022/7/17PAGE: 55 五、流程控制語句-循環(huán)結(jié)構(gòu)#include

31、 /包含單片機(jī)寄存器的頭文件int main(void) unsigned char i=1; unsigned int s=1; do s=s*i; /計算階乘 i+; /i自增運算 while(i=7); P1=s/256; /高8位送P1顯示 P0=s%256; /低8位送P0顯示 while(1);DATE: 2022/7/17PAGE: 56 六、Cx51數(shù)組-一維數(shù)組1.一維數(shù)組 (1)一維數(shù)組的定義方式為: 數(shù)據(jù)類型 數(shù)組名 常量表達(dá)式;例如定義有3個元素字符型數(shù)組m:char m3; m的3個元素分別是m0, m1, m2。數(shù)組的類型指數(shù)組元素的取值類型。對于同一個數(shù)組,其所有

32、元素的數(shù)據(jù)類型都是相同的。DATE: 2022/7/17PAGE: 57 六、Cx51數(shù)組-一維數(shù)組(2)一維數(shù)組的初始化 數(shù)組初始化是指在數(shù)組定義時給數(shù)組元素賦予初值。例如: int m3= 0,1,2;相當(dāng)于a0=0,a1=1,a2=2。當(dāng) 中值的個數(shù)少于元素個數(shù)時,只給前面部分元素賦值,其他元素自動賦0值。例如: int m3=0,1結(jié)果是a0=0,a1=1,a2=0。DATE: 2022/7/17PAGE: 58 六、Cx51數(shù)組-一維數(shù)組(3)一維數(shù)組元素的引用 數(shù)組必須預(yù)先定義才能使用。數(shù)組只能逐個地使用各元素,而不能一次引用整個數(shù)組。例如,輸出有10個元素的數(shù)組必須使用循環(huán)語句逐

33、個輸出各下標(biāo)變量: for(i=0; i3; i+) printf(%d,mi);而不能用一個語句輸出整個數(shù)組。因此,下面的寫法是錯誤的: printf(%d,m);DATE: 2022/7/17PAGE: 59 六、Cx51數(shù)組-一維數(shù)組例 15:用一維數(shù)組實現(xiàn)流水點亮P0口的8位LEDDATE: 2022/7/17PAGE: 60 六、Cx51數(shù)組-一維數(shù)組int main(void) /主函數(shù) unsigned char i; unsigned char code Tab =0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; /定義無符號字符

34、型數(shù)組 while(1) for(i=0;i8;i+) P0=Tabi;/依次引用數(shù)組元素,并將其送P0口顯示 delay();/調(diào)用延時函數(shù) DATE: 2022/7/17PAGE: 61 六、Cx51數(shù)組-二維數(shù)組2.二維數(shù)組 二維數(shù)組是以行列矩陣的形式存儲數(shù)據(jù)。 (1)二維數(shù)組定義 數(shù)據(jù)類型 數(shù)組名下標(biāo)1下標(biāo)2; 第一個下標(biāo)代表行,第二個下標(biāo)代表列。例如語句 int a23 定義了二維整形數(shù)組,共有2行3列6個元素。DATE: 2022/7/17PAGE: 62 六、Cx51數(shù)組-二維數(shù)組 (2)二維數(shù)組的初始化 可以采用以下兩種方式初始化: 按先行后列的存儲順序整體賦值,例如: int

35、 a23=0,1,2,3,4,5 按每行分別賦值,例如: int a23=0,1,2,3,4,5;DATE: 2022/7/17PAGE: 63 六、Cx51數(shù)組-二維數(shù)組例 16:用二維數(shù)組實現(xiàn)流水點亮P0口的8位LED。DATE: 2022/7/17PAGE: 64 六、Cx51數(shù)組-二維數(shù)組int main(void) unsigned char i,j; unsigned char code Tab24=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; /定義無符 /號字符型數(shù)組 while(1) for(i=0;i2;i+) for(j

36、=0;j4;j+) P0=Tabij;/依次引用數(shù)組元素,并將其送P0口顯示 delay();/調(diào)用延時函數(shù) DATE: 2022/7/17PAGE: 65 六、Cx51指針變量的指針就是變量的地址。在C語言中,允許用一個變量來存放指針,這種變量稱為指針變量。指針變量是一種特殊的變量,它也和一般變量一樣,具有變量名、類型和值,但它的值就是變量所存放的地址。通過指針對變量進(jìn)行操作是間接操作,比直接操作變量更費時間,且不夠直觀,但可以通過靈活運用指針使程序代碼更為簡潔、有效。DATE: 2022/7/17PAGE: 66 六、Cx51指針1、指針變量的定義 指針變量同普通變量一樣,使用之前要進(jìn)行定

37、義。指針變量定義的一般形式為: 數(shù)據(jù)類型 *變量名; 其中,數(shù)據(jù)類型表示本指針變量所指向變量的數(shù)據(jù)類型,*表示這是一個指針變量。 例如: 定義:int *point,表示point指向一個整型變量,但point具體指向哪一個整型變量,取決于point中所存儲的地址。一個指針變量只能指向同類型的變量,如上述point 只能指向整形變量,不能指向一個字符變量。DATE: 2022/7/17PAGE: 67 六、Cx51指針2、指針變量的引用 指針變量在使用之前必須賦予具體的地址,使用未經(jīng)賦值的指針變量會引起嚴(yán)重后果。指針變量的引用有兩個重要運算符: &:取地址運算符; *:指針運算符(或稱“間接訪

38、問” 運算符)。 在指針變量定義中所出現(xiàn)的“*”是類型說明符,表示其后的變量是指針類型,而指針運算符“*”則出現(xiàn)在表達(dá)式中,用以表示指針指向的變量值。DATE: 2022/7/17PAGE: 68 六、Cx51指針地址運算符&用來取出變量的地址。其形式為: &變量名;指針運算符*用來取出指針指向變量的值,其形式為: *指針變量名;例如語句:point = &i;j= *point; 表示取出變量i的值賦予變量j,與語句j=i的效果相同。對*point的任何操作與直接對變量i的操作效果相同。DATE: 2022/7/17PAGE: 69 六、Cx51指針3、數(shù)組指針一個變量有一個地址,一個數(shù)組包

39、含若干元素,每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。數(shù)組的指針是指數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。一個數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的。數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。一個數(shù)組也是由各個數(shù)組元素(下標(biāo)變量)組成的。每個數(shù)組元素按其類型不同占有幾個連續(xù)的內(nèi)存單元。一個數(shù)組元素的首地址也是指它所占有的幾個內(nèi)存單元的首地址。DATE: 2022/7/17PAGE: 70 六、Cx51指針定義一個指向數(shù)組元素的指針變量,與定義普通變量的指針相同。例如:int m=1,2,3;int *p;p=&m0; 經(jīng)上述定義后,p就是數(shù)組m的指針。因為數(shù)組名代表數(shù)組的首地址,也

40、就是第一個元素的地址,因此下面兩個語句等價:p=&m0;p=m;p指向數(shù)組m的首地址后,p+i就是數(shù)組的元素mi。DATE: 2022/7/17PAGE: 71 六、Cx51指針例 17:用一維數(shù)組實現(xiàn)流水點亮P0口的8位LED。 DATE: 2022/7/17PAGE: 72 六、Cx51指針int main(void) unsigned char i; unsigned char code Tab8=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; /*定義無符號字符型數(shù)組*/ unsigned char *p=&Tab0;/*定義指針變量并

41、指向Tab數(shù)組,也可寫為unsigned char *p=Tab */ while(1) for(i=0;i8;i+) P0=*(p+i);/通過指針變量依次引用數(shù)組元素,并將其送P0口顯示 delay();/調(diào)用延時函數(shù) DATE: 2022/7/17PAGE: 73 六、Cx51指針指向二維數(shù)組的指針變量的說明形式為類型說明符 (*指針變量名)長度;“長度”是二維數(shù)組的列數(shù)。二維數(shù)組的每一行都代表一個一維數(shù)組,該一維數(shù)組的長度就是二維數(shù)組的列數(shù)。若該指針變量指向二組數(shù)組Amn的首地址,則 *(指針變量名+i)就是Ai,而Ai是一維數(shù)組Ain的首地址,*(*(指針變量名+i)+j)就是Aij

42、的值。DATE: 2022/7/17PAGE: 74 六、Cx51指針例 18:用二維數(shù)組實現(xiàn)流水點亮P0口的8位LED。 DATE: 2022/7/17PAGE: 75 六、Cx51指針int main(void) unsigned char i,j; unsigned char code Tab24=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; /定 /義無符號字符型數(shù)組 unsigned char (*p)4; /定義二維數(shù)組指針 p=Tab;/指向二維數(shù)組首地址 while(1) for(i=0;i2;i+) for(j=0;j4;j

43、+) P0=*(*(p+i)+j);/依次引用數(shù)組元素,并將其送P0口顯示 delay();/調(diào)用延時函數(shù) DATE: 2022/7/17PAGE: 76 七、Cx51 預(yù)處理預(yù)處理部分放源程序的前面,以“#”號開頭,包含命令#include、宏定義命令#define等。編譯器在對程序進(jìn)行編譯前,首先對源程序中的預(yù)處理部分進(jìn)行處理,然后才對源程序進(jìn)行編譯。合理地使用預(yù)處理功能編寫的程序更簡潔,便于維護(hù)和修改,有利于模塊化程序設(shè)計。C語言提供了多種預(yù)處理功能,如文件包含、宏定義以及條件編譯等。DATE: 2022/7/17PAGE: 77 七、Cx51 預(yù)處理-文件包含1、文件包含文件包含是把指

44、定文件的內(nèi)容全部插入該命令行位置,從而把指定的文件和當(dāng)前的源程序文件連成一個源文件。文件包含命令行的一般形式為: #include 或 #include 文件名使用尖括號表示在用戶系統(tǒng)環(huán)境設(shè)置的包含目錄中查找;使用雙引號則首先在當(dāng)前的源文件目錄中查找,若未到才到包含目錄中去查找。DATE: 2022/7/17PAGE: 78 七、Cx51 預(yù)處理-宏定義2、宏定義宏定義是指用一個標(biāo)識符來表示一個字符串。在編譯預(yù)處理時,對程序中所有出現(xiàn)的宏標(biāo)識符,都用宏定義中的字符串去代換,稱為宏代換。字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查,如有錯誤也只能在程序編譯時發(fā)現(xiàn)

45、。宏定義不是實際程序語句,在行末不必加分號,如加上分號則連分號也一起置換。宏定義可以有參數(shù)也可以無參數(shù)。DATE: 2022/7/17PAGE: 79 七、Cx51 預(yù)處理-宏定義(1)無參數(shù)宏定義 無參數(shù)宏的宏名后不帶參數(shù)。其定義的一般形式為: #define 標(biāo)識符 字符串 其中“字符串”可以是常數(shù)、表達(dá)式、格式串等。 例如: 宏定義 “ #define AREA 3.14*r*r”的作用是指定標(biāo)識符AREA 來代替計算圓面積的表達(dá)式3.14*r*r。在編寫程序時,用到計算圓面積都可由宏名AREA代替,當(dāng)程序編譯時,編程器將首先進(jìn)行宏代換,即用表達(dá)式3.14*r*r去置換所有的宏名AREA

46、,然后再進(jìn)行編譯。DATE: 2022/7/17PAGE: 80 七、Cx51 預(yù)處理-宏定義(2)帶參數(shù)宏定義 對帶參數(shù)的宏不僅要宏代換,而且要用實際的值替換參數(shù)。帶參宏定義的一般形式為: #define 宏名(參數(shù)表) 字符串 帶參宏調(diào)用的一般形式為: 宏名(實際參數(shù)值); 例如: 宏定義“#define AREA(r) 3.14*r*r”在程序中調(diào)用時需要給出半徑r具體值:area= AREA(4) 在宏調(diào)用時,用實際半徑值4去代替參數(shù)r,經(jīng)宏代換后的語句為: area=3.14*4*4DATE: 2022/7/17PAGE: 81 七、Cx51 預(yù)處理-條件編譯3、條件編譯條件編譯可以

47、按不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件。條件編譯對于程序的移植和調(diào)試很方便。條件編譯有三種形式:(1)第一種形式 #ifdef 標(biāo)識符 程序段1 #else 程序段2 #endifDATE: 2022/7/17PAGE: 82 七、Cx51 預(yù)處理-條件編譯 如果標(biāo)識符已被 #define命令定義過則對程序段1進(jìn)行編譯;否則對程序段2進(jìn)行編譯。如果沒有程序段2,則可以寫為: #ifdef 標(biāo)識符 程序段 #endifDATE: 2022/7/17PAGE: 83 七、Cx51 預(yù)處理-條件編譯第二種形式 #ifndef 標(biāo)識符 程序段1 #else 程序段2 #endif 與第一種形式的區(qū)別是將“ifdef”改為“ifndef”。它的功能是,如果標(biāo)識符未被#define定義過則對程序段1進(jìn)行編譯,否則對程序段2進(jìn)行編譯。這與第一種形式的功能正相反。DATE: 2022/7/

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論