51單片機(jī)輕松入門—基于STC15W4K系列(C語(yǔ)言版) 李友全 編著:http://www.zg4o1577.cn/bbs/dpj-37954-1.html
第2章 C語(yǔ)言基礎(chǔ) 1 變量的數(shù)據(jù)類型(bit、char、int、long、float) 2 變量存儲(chǔ)空間(code、data 、xdata) 3 變量存儲(chǔ)類型(auto、static)
%E7%AC%AC2%E7%AB%A0-c%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80-2.jpg (18.13 KB, 下載次數(shù): 143)
下載附件
2016-3-28 00:54 上傳
4 變量作用域 5 運(yùn)算符 6 分支結(jié)構(gòu) 7 循環(huán)結(jié)構(gòu) 8 函數(shù) 1 變量的數(shù)據(jù)類型(bit、char、int、long、float) 常用變量定義舉例: bit a; // bit位型變量長(zhǎng)度是1個(gè)位,取值范圍是0和1,通常用作程序中的標(biāo)志位。 unsigned char b; // 正數(shù)運(yùn)算,占用內(nèi)存1個(gè)字節(jié)(8位,運(yùn)算范圍:0 ~ 255) unsigned | int c; | // 正數(shù)運(yùn)算,占用內(nèi)存2個(gè)字節(jié)(2*8=16位,運(yùn)算范圍:0 ~ 65535 ) | unsigned | long d; | // 正數(shù)運(yùn)算,占用內(nèi)存4個(gè)字節(jié)(4*8=32位) | float f; | | // 帶小數(shù)點(diǎn)的數(shù)值運(yùn)算 |
數(shù)據(jù)類型 | 符號(hào) | 說(shuō)明 | 字節(jié)數(shù) | 表示形式 | 數(shù)值范圍 | 位 型 | 無(wú) | | 1/8 | bit、sbit | 0或1 |
字符型 | 有 | | 1 | char | -128 ~ +127 | 無(wú) | | 1 | unsigned char | 0 ~ 255 |
| 整數(shù)型 | 有 | 整型 | 2 | int | -32768 ~ +32767 | 長(zhǎng)整型 | 4 | long | -2147483648~ +2147483647 |
| 無(wú) | 整型 | 2 | unsigned int | 0 ~ 65535 | 長(zhǎng)整型 | 4 | unsigned long | 0 ~ 4294967295 |
|
|
實(shí)型 | 有 | 有效值24位 | 4 | float | (±16777215)× 10±127 |
2 變量存儲(chǔ)空間(code、data 、xdata) code :變量存放在程序存儲(chǔ)器空間,最主要的用途是存放表格數(shù)據(jù)。 比如:unsigned char code Table[]={0x12,0x23,… ,0x34};P0 = Table[ i ]; data :變量存放在內(nèi)部RAM ,訪問(wèn)速度快。 xdata :變量存放在外部RAM, 訪問(wèn)速度慢(單片機(jī)內(nèi)部擴(kuò)展的xdata 速度仍然很 快) 如果定義變量時(shí)沒有說(shuō)明存儲(chǔ)空間,此時(shí)變量存儲(chǔ)空間由keil環(huán)境確定,單擊工具 欄按鈕options for target,選擇target選項(xiàng)卡,在Memory model后就可以選擇變 量默認(rèn)存儲(chǔ)空間。
%E7%AC%AC2%E7%AB%A0-c%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80-1.jpg (38.23 KB, 下載次數(shù): 141)
下載附件
2016-3-28 00:54 上傳
void fun() { 3 變量存儲(chǔ)類型(auto、static)
auto unsigned char x; static unsigned char y=5; //初次運(yùn)行時(shí)進(jìn)行初始化賦值1次 x++; y++; } auto:只用于函數(shù)內(nèi)部變量定義,單片機(jī)在執(zhí)行這個(gè)函數(shù)的時(shí)為它分配內(nèi)存地址, 當(dāng)函數(shù) 執(zhí)行完畢返回后,auto變量就會(huì)被銷毀,再次進(jìn)入這個(gè)函數(shù)時(shí),它的初值是不確定的, auto變量是局部變量,只允許在定義它的函數(shù)內(nèi)使用,由于auto變量在定義它的函數(shù)外的 任何地方都是不可見的,所以允許我們?cè)谶@個(gè)函數(shù)外的其它地方或者是其它的函數(shù)內(nèi)定義 同名的變量,它們之間不會(huì)發(fā)生沖突,因?yàn)樗麄兌加凶约旱膮^(qū)域性,由于函數(shù)內(nèi)部變量默 認(rèn)存儲(chǔ)類型就是動(dòng)態(tài)型auto,所以實(shí)際代碼中一般都省略了這個(gè)關(guān)鍵字。 static:在函數(shù)內(nèi)部,static允許一個(gè)變量在重新進(jìn)入這個(gè)函數(shù)時(shí)能夠保持原來(lái)的值不 變,在函數(shù)內(nèi)部用static定義的變量在函數(shù)初次運(yùn)行時(shí)進(jìn)行初始化賦值1次, 且只操作一 次,以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只引用上次函數(shù)調(diào)用結(jié)束時(shí)的值,在函數(shù)內(nèi)部 使用static定義的變量是局部變量, 只能在定義該變量的函數(shù)內(nèi)使用該變量。 4 變量作用域 如果一個(gè)變量在某個(gè)文件或函數(shù)范圍內(nèi)是有效的,則稱該文件或函數(shù)為該變量的作用 域,在此作用域內(nèi)可以使用該變量,所以又稱變量在此作用域內(nèi)“可見”,通常,變量的 作用域都是通過(guò)它在程序中的位置隱式說(shuō)明的。 局部變量 : ① 在一個(gè)函數(shù)內(nèi)部定義的變量是局部變量,只能在函數(shù)內(nèi)部使用,在main主函數(shù)內(nèi)部 定義的變量也是局部變量,其它函數(shù)也不能使用主函數(shù)中的變量。 ② 局部變量在沒有賦值以前的值是不確定的,是以前殘留在內(nèi)存里的隨機(jī)值,所以在定 義局部變量的時(shí)候一定要初始化。 ③ 不同函數(shù)中可以使用同名變量,它們作用域不同,因此不會(huì)發(fā)生沖突。 ④局部變量在函數(shù)被調(diào)用的過(guò)程中動(dòng)態(tài)占有存儲(chǔ)單元,調(diào)用結(jié)束立即釋放。 全局變量 : ① 在函數(shù)外部定義的變量是全局變量,其作用域是變量定義位置開始至整個(gè)程序文件結(jié) 束,實(shí)際中全局變量一般是在程序的開頭位置定義。 ② 全局變量在沒有賦值以前系統(tǒng)默認(rèn)為0。 ③局部變量若與全局變量同名,則在局部變量的作用域內(nèi),全局變量存在,但不可見, 全局變量的作用被屏蔽。 ④全局變量在程序運(yùn)行過(guò)程中一直占用RAM存儲(chǔ)單元。 5 運(yùn)算符 C語(yǔ)言中的常用運(yùn)算符可以歸納為下列7大類: 算術(shù)運(yùn)算符 ( +、 -、 *、 /、 %、 ++、 -- ) 關(guān)系運(yùn)算符 ( <, >, <=, >=, ==, != )輸入數(shù)值,輸出0或1 邏輯運(yùn)算符 ( && 、||、 ! ) 輸入數(shù)值,輸出0或1 位操作運(yùn)算符( & 、| 、~ 、^ 、<< 、 >> )輸入數(shù)值,輸出數(shù)值 賦值運(yùn)算符 ( = ) 特殊運(yùn)算符 ( & 、 * ) 分隔符主要包括這幾個(gè):[ ] ( ) { } , : ; (1) if (表達(dá)式) { 6 分支結(jié)構(gòu)
語(yǔ)句塊; } 示例: if (a >=3) { b = 0; } 說(shuō)明:① 如果表達(dá)式的結(jié)果為真(0代表“假”,用非0代表“真”),則執(zhí)行語(yǔ)句塊,否則執(zhí)行if語(yǔ) 句后面的語(yǔ)句(即語(yǔ)句塊后面的語(yǔ)句)。 (2) if (表達(dá)式) { } else { } 語(yǔ)句塊1;
語(yǔ)句塊2; 示例: if (a >=3) { b = 0; } else { b = 1000; } switch(變量表達(dá)式) { case 常量表達(dá)式1: { 語(yǔ)句塊1;} break; // 必須使用break跳出當(dāng)前switch結(jié)構(gòu)。 case 常量表達(dá)式2: { 語(yǔ)句塊2;} break; // 必須使用break跳出當(dāng)前switch結(jié)構(gòu)。 case 常量表達(dá)式n: { 語(yǔ)句塊n;} break; // 特別提示:default前也必須有break。 default: { 語(yǔ)句塊n+1;} break; //必須使用break跳出當(dāng)前switch結(jié)構(gòu)。 } 補(bǔ)充說(shuō)明: ① “變量表達(dá)式”結(jié)果必須是字符型、整型或長(zhǎng)整型,而不能是浮點(diǎn)型,否則編譯錯(cuò)誤。 ② “break;”語(yǔ)句可放在{ 語(yǔ)句塊X} 外,如上面格式所示,也可放在{ 語(yǔ)句塊X}內(nèi)的最后 一行。 ③ 多個(gè)case語(yǔ)句可以共享一組執(zhí)行語(yǔ)句,例如下面的語(yǔ)句case 1與case 2執(zhí)行同一個(gè)語(yǔ) 句塊。 case 1: case 2:{ 語(yǔ)句塊;} (1) while (表達(dá)式) { 7 循環(huán)結(jié)構(gòu)
語(yǔ)句塊; } 說(shuō)明:如果表達(dá)式的結(jié)果為真(0代表“假”,用非0代表“真”),則執(zhí)行語(yǔ)句塊,否則執(zhí) 行while語(yǔ)句后面的語(yǔ)句(即語(yǔ)句塊后面的語(yǔ)句)。 特殊的: while (1) 構(gòu)成1個(gè)無(wú)限循環(huán)過(guò)程。 (2) do { 很常用
語(yǔ)句塊; } while (表達(dá)式); // 當(dāng)表達(dá)式的值為真(非0都算作真)時(shí)繼續(xù)執(zhí)行循環(huán)體
%E7%AC%AC2%E7%AB%A0-c%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80-3.jpg (10.67 KB, 下載次數(shù): 149)
下載附件
2016-3-28 00:54 上傳
(3) for (表達(dá)式1;表達(dá)式2;表達(dá)式3) { 語(yǔ)句塊; } for循環(huán)的等效結(jié)構(gòu)如下。 for (循環(huán)變量初值;循環(huán)條件;循環(huán)變量增值) { 語(yǔ)句塊; } 特殊的:for (;;); // 構(gòu)成1個(gè)無(wú)限循環(huán)過(guò)程 示例1:void print_message() { 8 函 數(shù)
print (“How do you do!
” ); } 無(wú)參數(shù)函數(shù)定義格式: 返回值類型 函數(shù)名() { 變量聲明; 語(yǔ)句塊 ; return (變量或表達(dá)式); }
可以不用 示例2:int max (int x,int y) { int z ; z = x > y ? x:y; return (z); } 帶參數(shù)函數(shù)定義格式: 返回值類型 函數(shù)名(類型 形參1,類型 形參2,…) { 變量聲明; 語(yǔ)句塊 ; return (變量或表達(dá)式); } Ø 有些函數(shù)即將執(zhí)行完畢時(shí)會(huì)返回一個(gè)值,函數(shù)定義時(shí)的“返回值類型”應(yīng)該與函數(shù)內(nèi)部 return語(yǔ)句行的變量數(shù)據(jù)類型相同,也就是說(shuō)只要按變量類型來(lái)定義“返回值類型”就 行了,若函數(shù)不需要返回值,“返回值類型”要寫作“void”,此時(shí)函數(shù)內(nèi)部也不需要 return語(yǔ)句。 Ø return語(yǔ)句功能是立即從所在的函數(shù)中退出, 返回到調(diào)用它的程序中去,同時(shí)還能返回 一個(gè)值給調(diào)用它的函數(shù),一個(gè)函數(shù)中可以有多個(gè)return 語(yǔ)句(如分支結(jié)構(gòu)),執(zhí)行到 哪各return 語(yǔ)句則哪個(gè)return 語(yǔ)句起作用。 Ø 形式參數(shù)是指調(diào)用函數(shù)時(shí)要傳入到函數(shù)體內(nèi)參與運(yùn)算的變量,形式參數(shù)必須指定類型, 它可以有任意多個(gè)或沒有(由于單片機(jī)RAM存儲(chǔ)空間有限,所以實(shí)際上達(dá)不到任意多 個(gè)),當(dāng)不需要形式參數(shù)時(shí)括號(hào)內(nèi)可為空或?qū)懭搿皏oid”表示,但括號(hào)不能少。 調(diào)用格式(1)函數(shù)名(變量或常數(shù)1,變量或常數(shù)2,…); 示例:Switch (x,y) ;print_message(); 調(diào)用格式(2) V = 函數(shù)名(變量或常數(shù)1,變量或常數(shù)2,…); 示例:z = max (5,9) 說(shuō)明:當(dāng)函數(shù)有多個(gè)參數(shù)時(shí)各參數(shù)要用逗號(hào)隔開。 Ø 傳值調(diào)用方式:主調(diào)函數(shù)的實(shí)參可以是常數(shù)、變量、數(shù)組元素(比如array[ i ])、結(jié)構(gòu)體 成員變量(比如student.name),傳遞過(guò)去的是常數(shù)、變量、數(shù)組元素或結(jié)構(gòu)體成員變量 里面的值,不管被調(diào)函數(shù)里面內(nèi)容如何,調(diào)用結(jié)束后主調(diào)函數(shù)參數(shù)都不會(huì)發(fā)生變化。 Ø 傳地址調(diào)用方式:當(dāng)用數(shù)組名作為函數(shù)實(shí)參時(shí),是將數(shù)組所在內(nèi)存單元首地址傳遞給函 數(shù),而不是將整個(gè)數(shù)組元素都復(fù)制到被調(diào)函數(shù)中去,被調(diào)函數(shù)直接操作數(shù)組內(nèi)的元素,所 以被調(diào)函數(shù)的操作會(huì)影響到主調(diào)函數(shù)的實(shí)參,這里是傳地址調(diào)用。例如: int array[]={10,12,20,18,9,11,}; MaxNum=avrage(array,6); 注意: ① 函數(shù)定義行結(jié)尾不能有分號(hào),函數(shù)調(diào)用語(yǔ)句結(jié)尾必須有分號(hào)。 ② 主調(diào)函數(shù)的實(shí)參與被調(diào)函數(shù)的形參個(gè)數(shù)和類型必須一致,否則在傳值的過(guò)程中發(fā)生自動(dòng)類 型轉(zhuǎn)換可能導(dǎo)致最終結(jié)果不正確。 ③ 如果被調(diào)函數(shù)書寫在主調(diào)函數(shù)之后,則應(yīng)在文件的開頭(即所有函數(shù)外的最上端)聲明被 調(diào)函數(shù),聲明方法是將函數(shù)定義的一整行復(fù)制到文件開頭并在行尾添加分號(hào)即可。 |