




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、單片機原理及應用(第 4 章 單片機Cx51編程基礎)教學內容編程語言簡介數制與編碼Cx51變量和運算符Cx51函數Cx51流程控制語句Cx51數組Cx51指針Cx51 預處理Keil C51集成開發環境DATE: 2022/7/17PAGE: 2 一、編程語言簡介機器語言是用二進制代碼表示的,能被計算機直接識別和執行的一種機器指令的集合。直觀性和通用性都很差匯編語言采用了助記符號編寫程序,通過編譯器轉換成能夠被計算機識別和處理的二進制代碼程序。匯編語言仍然是面向機器的語言,編程煩瑣費時,通用性也差。高級語言用與自然語言接近的代碼編寫程序,通過編譯器轉換成二進制代碼程序。高級語言易學易用,通用
2、性好。 C語言是一種結構化的高級編程語言,在單片機系統開發中得到了廣泛應用。DATE: 2022/7/17PAGE: 3 二、數制與編碼1.數制的基與權基:各計數制中每個數位上可用字符的個數。權:數字“1”在數字不同的數位所代表的數值。二進制基數為2( 0和1),權為以2為底的冪。二進制數字后面用B表示十進制基數為10(0-9),權是以10為底的冪。十進制用D(或不加標志)表示十進制數十六進制 基數為16(0-9以及A-F),權是以16為底的冪。十六進制用H表示十六進制數DATE: 2022/7/17PAGE: 4 二、數制與編碼1.數制的基與權例1:若數字1001.01分別為二進制、十進制數
3、和十六進制數,則權值分別為:二進制數1001.11從左到右各位的權分別是23、22、21、20、2-1和2-2,即8、4、2、1、0.5、和0.25。十進制數1001.01從左到右各位的權分別是103、102、101、100、10-1和10-2,即1000、100、10、1、0.1、和0.01。十六進制數1001.01從左到右各位的權分別是163、162、161、160、16-1和16-2,即4096、256、16、1、0.0625、和0.00390625。DATE: 2022/7/17PAGE: 5 二、數制與編碼2.各種數制之間的相互轉換非十進制數轉換為十進制數 方法:將系數與對應的權值相
4、乘并求和,所得結果即為該數對應的十進制數。例2:將二進制數110.11轉換為十進制數解 110.11B=122+121+020+12-1+12-2 = 4+2+0.5+0.25 =6.75DATE: 2022/7/17PAGE: 6 二、數制與編碼2.各種數制之間的相互轉換非十進制數轉換為十進制數例3: 將十六進制數121D.2轉換為十進制數 解 121D.2H =1163+2162+1161+13160+216-1 = 4096+192+16+13+0.125 =4317.125DATE: 2022/7/17PAGE: 7 二、數制與編碼十進制數轉換為非十進制數對于整數部分采用“除基取余,先
5、低后高”的方法,對小數部分采用“乘基取整,先高后低”的方法,可將十進制數轉換為非十進制數。 例4:將50.75轉換為二進制數 因此可得:50.75=110010.11BDATE: 2022/7/17PAGE: 8 二、數制與編碼例5 將十進制數500.03125轉換為十六進制數 解 : 因此可得: 500.03125=1F4.08HDATE: 2022/7/17PAGE: 9 二、數制與編碼十六進制數與二進制數之間的轉換整數部分由小數點向左每4位一組,若整數最高位的一組不足4位,則在其左邊加0補足4位;小數部分由小數點向右每4位一組,若小數最低位的一組不足4位,則在其右邊加0補足4位;用與每組
6、二進制數所對應的十六進制數取代每組的4位二進制數即可轉換為十六進制。將十六進制數轉換為二進制數時,過程相反。 DATE: 2022/7/17PAGE: 10 二、數制與編碼十六進制數與二進制數之間的轉換例6:將十六進制數9F4.1H轉換為二進制數解 將每位十六進制數寫為二進制數 9 F 4 . 1 1001 1111 0100 . 0001 可得: 9F4.1H = 100111110100.0001BDATE: 2022/7/17PAGE: 11 二、數制與編碼編碼是計算機為輸入處理字母、數字和符號等組成的信息,依靠輸入設備先把要輸入的字符按一定格式編成的二進制代碼。目前國際上使用的字符編碼
7、是ASCII碼(American standard coded for information interchange,美國信息交換標準碼)。ASCII碼用一個字節來表示一個字符,采用7位二進制代碼來對字符進行編碼,最高位一般用做校驗位,因此共128個,包括32個通用控制符號、10個阿拉伯數字、52個英文大寫和小寫字母及34個專用符號。數字0-9的ASCII碼為30H-39H,英文大寫字母A-Z的ASCII碼為41H-5AHDATE: 2022/7/17PAGE: 12 三、Cx51變量和運算符數據可分為常量和變量。常量是數值和字符等不能改變的量,可以不經說明和定義直接使用,而變量是在程序運行
8、過程中可以根據需要改變的量,在引用之前必須定義類型。C51 定義一個變量的格式如下: 數據類型 存儲類型 變量名表 其中“數據類型”和“存儲類型”的先后次序可以互換。DATE: 2022/7/17PAGE: 13 三、Cx51變量和運算符-數據類型 表4-1 Cx51支持的數據類型DATE: 2022/7/17PAGE: 14 三、Cx51變量和運算符-數據類型bit 、 sfr 、 sfr16 和 sbit是 Keil C51中新增的變量類型。(1)bit用來定義位變量,值只能是0或1。位變量位于8051單片機內部RAM位尋址區(20H2FH),共為16字節,最多可定義128個位變量。DAT
9、E: 2022/7/17PAGE: 15 三、Cx51變量和運算符-數據類型(2)sfr用于定義特殊功能寄存器變量。該變量存儲在片內的特殊功能寄存器存儲區中,用來對特殊功能寄存器進行讀寫操作。 例如:51頭文件中有定義sfr P0=0 x90,這一語句定義了P0端口在片內的寄存器,在程序中可以使用P0對該端口寄存器進行操作。DATE: 2022/7/17PAGE: 16 二、Cx51變量和運算符-數據類型(3)sfr16也用于定義特殊功能寄存器,所不同的是它用于操作占兩個字節的特殊功能寄存器。 例如:sfr16 DPTR=0 x82語句定義了片內16位數據指針寄存器DPTR,其低8位字節地址為
10、82H,高8位字節地址為83H,在程序中可以對DPTR進行操作。DATE: 2022/7/17PAGE: 17 三、Cx51變量和運算符-數據類型(4)sbit用于定義特殊功能寄存器位變量,用來對特殊功能寄存器的可位尋址位進行讀寫操作。 例如sbit P0_0=P00 定義了特殊功能寄存器P0的第0位,后面對該位的操作可用P0_0代替。符號后面的數字定義特殊功能寄存器可尋址位在寄存器中的位置,取值必須是0-7。DATE: 2022/7/17PAGE: 18 三、Cx51變量和運算符-存儲類型表4-2 Cx51存儲類型DATE: 2022/7/17PAGE: 19 三、Cx51變量和運算符-存儲
11、類型1.片內存儲區(1)data將變量存儲在片內可直接尋址的數據存儲器DATA區中。DATA區位于片內RAM的低128字節(0X000X7F)。使用data存儲模式,目標代碼中對變量的訪問速度最快,把經常使用的變量放在DATA區可提高程序運行速度。若定義i為存儲類型為data的無符號字符型數據,可聲明為: unsigned char data iDATE: 2022/7/17PAGE: 20 三、Cx51變量和運算符-存儲類型(2) bdata用于將變量定義在數據存儲器可位尋址的BDATA區,允許位與字節混合訪問。BDATA區位于單片機內部RAM字節地址0 x200 x2F的16個字節中,每個
12、字節8位,共計16x8=128個可尋址位。例如如下聲明后可用位變量value0訪問字節value的0位: unsigned char bdata value; bit value0=value0; 若value的原值為0 x00,欲將value的第0位置為1,可采用按字節訪問方式“value=0 x01”實現,也可以按位尋址方式“value0=1”實現。DATE: 2022/7/17PAGE: 21 三、Cx51變量和運算符-存儲類型idata將變量存儲在片內間接尋址的數據存儲區IDATA區中。IDATA區使用指針來進行尋址和訪問。51內核單片機RAM僅有128個字節,因此無間接尋址數據存儲器
13、區,idata與data無區別。52內核單片機RAM有256個字節,當片內128字節的直接尋址數據存儲區不夠用時,可以使用128字節間接尋址數據存儲區,訪問速度較data慢一些。DATE: 2022/7/17PAGE: 22 三、Cx51變量和運算符-存儲類型2.片外存儲區xdata將變量存儲在片外數據存儲器中,采用16位地址,可以訪問外部數據存儲區64KB內的任何地址。pdata將變量存儲在片外數據存儲器中的第一頁(地址00HFFH)中,存儲空間為256字節。對PDATA區尋址,只需要裝入8位地址,而對XDATA區尋址要裝入16位地址,因此對PDATA區的尋址要比對XDATA區尋址快。pda
14、ta和xdata存儲類型的變量由于需要訪問外存,訪問速度最慢,應盡量減少對變量的訪問次數。這兩種類型適合保存原始數據或最終結果,需要頻繁訪問的中間結果應盡量不用或少用。DATE: 2022/7/17PAGE: 23 三、Cx51變量和運算符-存儲類型3.程序存儲器ROMcode將變量存儲在程序存儲器中,變量只能讀不能寫,因此適合存儲常量或查表類的數組數據,不能用于存儲程序運行過程中需要修改的變量。如果想改變變量值,只能在程序中修改后重新將程序燒寫進ROM中。DATE: 2022/7/17PAGE: 24 三、Cx51變量和運算符-運算符表4-3 Cx51中的算術運算符DATE: 2022/7/
15、17PAGE: 25 三、Cx51變量和運算符-運算符表4-4 Cx51中的關系運算符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中的復合運算符DATE: 2022/7/17PAGE: 29 四、Cx51函數 函數可分為主函數、標準庫函數、自定義函數三類。1、主函數Cx51語言程序中有且只能有一個主函數main()。一個C
16、x51語言程序的執行從主函數開始,主函數可以調用其它函數,包括庫函數和自定義函數,其它函數不能調用主函數。主函數的標準寫法是 int main( void ) 前面的int是main 函數的返回值類型,用于向操作系統說明程序的退出狀態,返回0代表正常退出,1代表異常。形式參數“void”用于說明主函沒有輸入參數。DATE: 2022/7/17PAGE: 30 四、Cx51函數 2、庫函數 Cx51編譯器提供了豐富的庫函數,庫函數是已經編寫好的功能函數,可完成數學計算、輸入輸出等常用功能,供開發人員調用,以提高編程效率。 如果程序中使用了庫函數,則應該在程序的開頭處使用#include包含語句,
17、將所用的函數頭文件包含到程序中來。DATE: 2022/7/17PAGE: 31 四、Cx51函數 3、自定義函數可根據需要編寫自定義功能函數,結構如下:返回值類型 函數名(類型 形參) 數據定義; 執行語句; 返回值;DATE: 2022/7/17PAGE: 32 四、Cx51函數 形參和返回值是函數與外界聯系的橋梁。形參是在函數調用時由外界傳入函數體內的參數,形參可以沒有,也可以有多個;返回值是函數運行完畢時返回給調用該函數語句的值。如果函數沒有返回值,那么應聲明為void類型,凡不加返回值類型限定的函數,就會被編譯器作為返回整型值處理。根據作用范圍的不同,變量可分為局部變量和全局變量。局
18、部變量是定義在函數內部的變量,只在該函數內部有效;全局變量是定義在函數外部的變量,從其定義位置開始到源文件結束都有效。如果全局變量和某一函數的局部變量同名,則在該函數內部只有局部變量有效。DATE: 2022/7/17PAGE: 33 四、Cx51函數 DATE: 2022/7/17PAGE: 34 例7 左圖是8051單片機的P1.0口上連接了一個LED,請編程實現LED周期閃爍。四、Cx51函數 #include /包含單片機定義寄存器的頭文件 sbit led = P10; /將led定義為P1.0位void delay(void) /延時函數 unsigned int i; /定義無符
19、號整數,最大取值范圍65535 for(i=0;i20000;i+);/做20000次空循環,以進行延時。 int main(void ) /主函數 while(1) /無限循環,以使LED持續閃爍。 led =0; / P1.0輸出低電平,燈亮 delay(); /延時一段時間 led =1; / P1.0輸出高電平,燈滅 delay(); /延時一段時間 DATE: 2022/7/17PAGE: 35 四、Cx51函數 例8 下圖是8051單片機的P0口上連接了8個LED,請采用移位操作編寫程序實現LED流水燈。DATE: 2022/7/17PAGE: 36 四、Cx51函數 #inclu
20、de /包含單片機定義寄存器的頭文件void delay(void) /延時函數 unsigned int i; /定義無符號整數,最大取值范圍65535 for(i=0;i7; /將led最高位先放到a中的最低位中,a中其它位全為0b = led1; /將led左移一位,最低位補零led = b|a; /位或運算 delay(); DATE: 2022/7/17PAGE: 37 五、流程控制語句-順序結構Cx51流程控制共有3種基本結構:順序結構、選擇結構以及循環結構。1.順序結構 順序結構是最基本、最簡單的編程結構,程序按先后順序執行指令代碼。DATE: 2022/7/17PAGE: 38
21、 五、流程控制語句-順序結構例 9:下圖是8051單片機的P0口和P1口上分別連接了8個LED,請分別用P0和P1口顯示加法125+34和減法176-98的運算結果DATE: 2022/7/17PAGE: 39 五、流程控制語句-順序結構#includeint main(void) unsigned char a=125,b=34,c=176,d=98; P1=a+b; /加法運算結果送P1端口,P1=159=1001 1111B P0=c-d; /減法運算結果送P0端口,P0=78=0100 1110B while(1); /循環等待,防止主程序退出后單片機跑飛 DATE: 2022/7/1
22、7PAGE: 40 五、流程控制語句-選擇結構2.選擇結構(1)if語句 if語句用于根據條件判定結果決定執行的語句。if語句有三種基本形式:if(表達式) 語句組 說明:如果“表達式”為真,則執行花括號中的語句組,否則跳過花括號執行下面的語句。if(表達式) 語句組1 else 語句組2 說明:如果“表達式”真,則執行語句組1,否則執行語句組2。DATE: 2022/7/17PAGE: 41 五、流程控制語句-選擇結構if(表達式1) 語句1 else if(表達式2) 語句組2 else if(表達式3) 語句組3 else if(表達式m) 語句組m else 語句組n 說明:如果“表達
23、式1”為真,則執行“語句組1”,否則如果“表達式2”為真,則執行“語句組2”,如果所有的表達式都不滿足,則執行語句組n。DATE: 2022/7/17PAGE: 42 五、流程控制語句-選擇結構例10:同圖4-2,用if語句根據54/18的計算結果選擇P0口8位LED的狀態.DATE: 2022/7/17PAGE: 43 五、流程控制語句-選擇結構#include /包含單片機寄存器的頭文件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; /缺省值,關閉所有LED while(1); DATE: 2022/7/17PAGE: 44 五、流程控制語句-選擇結構(2)switch/case
25、語句 根據表達式的值決定要執行的語句組,用于實現多中選一,形式如下: switch(表達式) case常量表達式1:/如果1滿足,則執行語句組1 語句組1; break; /跳出switch結構case常量表達式2:/如果2滿足,則執行語句組2 語句組2; break; /跳出switch結構default: /條件都不滿足時,執行語句組n 語句組n; DATE: 2022/7/17PAGE: 45 五、流程控制語句-選擇結構例 11:同圖4-2,用swtich語句根據54/18的計算結果選擇P0口8位LED的狀態DATE: 2022/7/17PAGE: 46 五、流程控制語句-選擇結構#in
26、clude /包含單片機寄存器的頭文件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; /缺省值,關閉所有LED while(1);DATE: 2022/7/17PAGE: 47 五、流程控制語句-循環結構1、for循環 for 循環結構用于按指定的次數循環執行一組語句,格式如下:for(表達式1;表達式2;表達式3)語句;for循環語句執行過程如下:(1)先執行表達式1,一般是對循環變量賦初值;(2)執行表達式2,若表達式2結果為真,則執行循環體語句,并求解表達式3(一般是改變循環變量的值); 然后再次執行表達式2;并判斷結果真假(3)若表
28、達式2結果為假,則退出for循環。DATE: 2022/7/17PAGE: 48 五、流程控制語句-循環結構例 12:同圖4-3,用for循環計算7的階乘并送P1和P0口顯示結果。DATE: 2022/7/17PAGE: 49 五、流程控制語句-循環結構#include /包含單片機寄存器的頭文件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、 五、流程控制語句-循環結構(3)while循環 while循環語句先判斷條件真假,若表達式為真,則執行花括號內的語句組,否則終止循環,格式如下: while(表達式) 語句組DATE: 2022/7/17PAGE: 51 五、流程控制語句-循環結構例 13:同圖4-3,用while循環計算7的階乘并送P1和P0口顯示結果。DATE: 2022/7/17PAGE: 52 五、流程控制語句-循環結構#include /包含單片機寄存器的頭文件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 五、流程控制語句-循環結構(4) do while 循環 先執行花括號內的語句組,然后執行表達式,若結果為真,則重復執行花括號內的語句組,否則終止循環,格式如下:do 語句組while(表達式);DATE: 2022/7/17PAGE: 54 五、流程控制語句-循環結構例14:根據下圖用do while循環計算7的階乘并送P1和P0口顯示結果。DATE: 2022/7/17PAGE: 55 五、流程控制語句-循環結構#include
31、 /包含單片機寄存器的頭文件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數組-一維數組1.一維數組 (1)一維數組的定義方式為: 數據類型 數組名 常量表達式;例如定義有3個元素字符型數組m:char m3; m的3個元素分別是m0, m1, m2。數組的類型指數組元素的取值類型。對于同一個數組,其所有
32、元素的數據類型都是相同的。DATE: 2022/7/17PAGE: 57 六、Cx51數組-一維數組(2)一維數組的初始化 數組初始化是指在數組定義時給數組元素賦予初值。例如: int m3= 0,1,2;相當于a0=0,a1=1,a2=2。當 中值的個數少于元素個數時,只給前面部分元素賦值,其他元素自動賦0值。例如: int m3=0,1結果是a0=0,a1=1,a2=0。DATE: 2022/7/17PAGE: 58 六、Cx51數組-一維數組(3)一維數組元素的引用 數組必須預先定義才能使用。數組只能逐個地使用各元素,而不能一次引用整個數組。例如,輸出有10個元素的數組必須使用循環語句逐
33、個輸出各下標變量: for(i=0; i3; i+) printf(%d,mi);而不能用一個語句輸出整個數組。因此,下面的寫法是錯誤的: printf(%d,m);DATE: 2022/7/17PAGE: 59 六、Cx51數組-一維數組例 15:用一維數組實現流水點亮P0口的8位LEDDATE: 2022/7/17PAGE: 60 六、Cx51數組-一維數組int main(void) /主函數 unsigned char i; unsigned char code Tab =0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; /定義無符號字符
34、型數組 while(1) for(i=0;i8;i+) P0=Tabi;/依次引用數組元素,并將其送P0口顯示 delay();/調用延時函數 DATE: 2022/7/17PAGE: 61 六、Cx51數組-二維數組2.二維數組 二維數組是以行列矩陣的形式存儲數據。 (1)二維數組定義 數據類型 數組名下標1下標2; 第一個下標代表行,第二個下標代表列。例如語句 int a23 定義了二維整形數組,共有2行3列6個元素。DATE: 2022/7/17PAGE: 62 六、Cx51數組-二維數組 (2)二維數組的初始化 可以采用以下兩種方式初始化: 按先行后列的存儲順序整體賦值,例如: int
35、 a23=0,1,2,3,4,5 按每行分別賦值,例如: int a23=0,1,2,3,4,5;DATE: 2022/7/17PAGE: 63 六、Cx51數組-二維數組例 16:用二維數組實現流水點亮P0口的8位LED。DATE: 2022/7/17PAGE: 64 六、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; /定義無符 /號字符型數組 while(1) for(i=0;i2;i+) for(j
36、=0;j4;j+) P0=Tabij;/依次引用數組元素,并將其送P0口顯示 delay();/調用延時函數 DATE: 2022/7/17PAGE: 65 六、Cx51指針變量的指針就是變量的地址。在C語言中,允許用一個變量來存放指針,這種變量稱為指針變量。指針變量是一種特殊的變量,它也和一般變量一樣,具有變量名、類型和值,但它的值就是變量所存放的地址。通過指針對變量進行操作是間接操作,比直接操作變量更費時間,且不夠直觀,但可以通過靈活運用指針使程序代碼更為簡潔、有效。DATE: 2022/7/17PAGE: 66 六、Cx51指針1、指針變量的定義 指針變量同普通變量一樣,使用之前要進行定
37、義。指針變量定義的一般形式為: 數據類型 *變量名; 其中,數據類型表示本指針變量所指向變量的數據類型,*表示這是一個指針變量。 例如: 定義:int *point,表示point指向一個整型變量,但point具體指向哪一個整型變量,取決于point中所存儲的地址。一個指針變量只能指向同類型的變量,如上述point 只能指向整形變量,不能指向一個字符變量。DATE: 2022/7/17PAGE: 67 六、Cx51指針2、指針變量的引用 指針變量在使用之前必須賦予具體的地址,使用未經賦值的指針變量會引起嚴重后果。指針變量的引用有兩個重要運算符: &:取地址運算符; *:指針運算符(或稱“間接訪
38、問” 運算符)。 在指針變量定義中所出現的“*”是類型說明符,表示其后的變量是指針類型,而指針運算符“*”則出現在表達式中,用以表示指針指向的變量值。DATE: 2022/7/17PAGE: 68 六、Cx51指針地址運算符&用來取出變量的地址。其形式為: &變量名;指針運算符*用來取出指針指向變量的值,其形式為: *指針變量名;例如語句:point = &i;j= *point; 表示取出變量i的值賦予變量j,與語句j=i的效果相同。對*point的任何操作與直接對變量i的操作效果相同。DATE: 2022/7/17PAGE: 69 六、Cx51指針3、數組指針一個變量有一個地址,一個數組包
39、含若干元素,每個數組元素都在內存中占用存儲單元,它們都有相應的地址。數組的指針是指數組的起始地址,數組元素的指針是數組元素的地址。一個數組是由連續的一塊內存單元組成的。數組名就是這塊連續內存單元的首地址。一個數組也是由各個數組元素(下標變量)組成的。每個數組元素按其類型不同占有幾個連續的內存單元。一個數組元素的首地址也是指它所占有的幾個內存單元的首地址。DATE: 2022/7/17PAGE: 70 六、Cx51指針定義一個指向數組元素的指針變量,與定義普通變量的指針相同。例如:int m=1,2,3;int *p;p=&m0; 經上述定義后,p就是數組m的指針。因為數組名代表數組的首地址,也
40、就是第一個元素的地址,因此下面兩個語句等價:p=&m0;p=m;p指向數組m的首地址后,p+i就是數組的元素mi。DATE: 2022/7/17PAGE: 71 六、Cx51指針例 17:用一維數組實現流水點亮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; /*定義無符號字符型數組*/ unsigned char *p=&Tab0;/*定義指針變量并
41、指向Tab數組,也可寫為unsigned char *p=Tab */ while(1) for(i=0;i8;i+) P0=*(p+i);/通過指針變量依次引用數組元素,并將其送P0口顯示 delay();/調用延時函數 DATE: 2022/7/17PAGE: 73 六、Cx51指針指向二維數組的指針變量的說明形式為類型說明符 (*指針變量名)長度;“長度”是二維數組的列數。二維數組的每一行都代表一個一維數組,該一維數組的長度就是二維數組的列數。若該指針變量指向二組數組Amn的首地址,則 *(指針變量名+i)就是Ai,而Ai是一維數組Ain的首地址,*(*(指針變量名+i)+j)就是Aij
42、的值。DATE: 2022/7/17PAGE: 74 六、Cx51指針例 18:用二維數組實現流水點亮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; /定 /義無符號字符型數組 unsigned char (*p)4; /定義二維數組指針 p=Tab;/指向二維數組首地址 while(1) for(i=0;i2;i+) for(j=0;j4;j
43、+) P0=*(*(p+i)+j);/依次引用數組元素,并將其送P0口顯示 delay();/調用延時函數 DATE: 2022/7/17PAGE: 76 七、Cx51 預處理預處理部分放源程序的前面,以“#”號開頭,包含命令#include、宏定義命令#define等。編譯器在對程序進行編譯前,首先對源程序中的預處理部分進行處理,然后才對源程序進行編譯。合理地使用預處理功能編寫的程序更簡潔,便于維護和修改,有利于模塊化程序設計。C語言提供了多種預處理功能,如文件包含、宏定義以及條件編譯等。DATE: 2022/7/17PAGE: 77 七、Cx51 預處理-文件包含1、文件包含文件包含是把指
44、定文件的內容全部插入該命令行位置,從而把指定的文件和當前的源程序文件連成一個源文件。文件包含命令行的一般形式為: #include 或 #include 文件名使用尖括號表示在用戶系統環境設置的包含目錄中查找;使用雙引號則首先在當前的源文件目錄中查找,若未到才到包含目錄中去查找。DATE: 2022/7/17PAGE: 78 七、Cx51 預處理-宏定義2、宏定義宏定義是指用一個標識符來表示一個字符串。在編譯預處理時,對程序中所有出現的宏標識符,都用宏定義中的字符串去代換,稱為宏代換。字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查,如有錯誤也只能在程序編譯時發現
45、。宏定義不是實際程序語句,在行末不必加分號,如加上分號則連分號也一起置換。宏定義可以有參數也可以無參數。DATE: 2022/7/17PAGE: 79 七、Cx51 預處理-宏定義(1)無參數宏定義 無參數宏的宏名后不帶參數。其定義的一般形式為: #define 標識符 字符串 其中“字符串”可以是常數、表達式、格式串等。 例如: 宏定義 “ #define AREA 3.14*r*r”的作用是指定標識符AREA 來代替計算圓面積的表達式3.14*r*r。在編寫程序時,用到計算圓面積都可由宏名AREA代替,當程序編譯時,編程器將首先進行宏代換,即用表達式3.14*r*r去置換所有的宏名AREA
46、,然后再進行編譯。DATE: 2022/7/17PAGE: 80 七、Cx51 預處理-宏定義(2)帶參數宏定義 對帶參數的宏不僅要宏代換,而且要用實際的值替換參數。帶參宏定義的一般形式為: #define 宏名(參數表) 字符串 帶參宏調用的一般形式為: 宏名(實際參數值); 例如: 宏定義“#define AREA(r) 3.14*r*r”在程序中調用時需要給出半徑r具體值:area= AREA(4) 在宏調用時,用實際半徑值4去代替參數r,經宏代換后的語句為: area=3.14*4*4DATE: 2022/7/17PAGE: 81 七、Cx51 預處理-條件編譯3、條件編譯條件編譯可以
47、按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。條件編譯對于程序的移植和調試很方便。條件編譯有三種形式:(1)第一種形式 #ifdef 標識符 程序段1 #else 程序段2 #endifDATE: 2022/7/17PAGE: 82 七、Cx51 預處理-條件編譯 如果標識符已被 #define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。如果沒有程序段2,則可以寫為: #ifdef 標識符 程序段 #endifDATE: 2022/7/17PAGE: 83 七、Cx51 預處理-條件編譯第二種形式 #ifndef 標識符 程序段1 #else 程序段2 #endif 與第一種形式的區別是將“ifdef”改為“ifndef”。它的功能是,如果標識符未被#define定義過則對程序段1進行編譯,否則對程序段2進行編譯。這與第一種形式的功能正相反。DATE: 2022/7/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2024學年吉林省部分名校高一下學期聯合考試數學試題(解析版)
- 2023-2024學年河南省部分學校高二下學期期末考試數學試卷(解析版)
- 2025屆河南省豫東部分名校高三三模語文試題(解析版)
- 2025屆福建省龍巖市高高三3月教學質量檢測語文試題(解析版)
- 2025年江西省中考生物真題(無答案)
- 一次性蒸汽眼罩產品質量河南省監督抽查實施細則(2023年版)
- 食源性疾病培訓課件完整版
- C語言入門講課件
- 作業防護安全管理制度
- 供暖夜間值班管理制度
- 涼山州木里縣選聘社區工作者筆試真題2024
- 2025年安徽省高考物理試卷真題(含答案解析)
- 配電線路高級工練習試題附答案
- GB/T 45439-2025燃氣氣瓶和燃氣瓶閥溯源二維碼應用技術規范
- YC/T 620-2024煙草零售客戶滿意度調查規范
- 《公路橋梁掛籃設計與施工技術指南》
- 16J914-1 公用建筑衛生間
- 2024年南昌市產業投資集團有限公司招聘筆試參考題庫附帶答案詳解
- 試驗檢測單位安全培訓課件
- (外研社)新編進出口英語函電答案-Unit-2-11-包含部分test-yourself
- JC25-92 天然花崗石建筑板材
評論
0/150
提交評論