一:C語言特點
C 語言程序采用函數結構, 每個 C 語言程序由一個或多個函數組成, 在這些函數中至少應包含一個主函數 main(), 也可以包含一個 main()函數和若干個其它的功能函數。 不管 main()函數放於何處, 程序總是從 main()函數開始執行,執行到 main()函數結束則結束。 在 main()函數中調用其它函數, 其它函數也可以相互調用, 但 main()函數只能調用其它的功能函數, 而不能被其它的函數所 調用。 功能函數可以是 C 語言編譯器提供的庫函數, 也可以是由用戶定義的自定義函數。 在編制 C 程序時, 程序的開始部分一般是預處理命令、 函數說明和變量 。
二:C51與C的區別
-
C51 中定義的庫函數和標准 C 語言定義的庫函數不同。 標准的 C 語言定義的庫函數是按通用微型計算機來定義的,
-
C51 中還增加了幾種針對 51 單片機特有的數據類型
-
C51 變量的存儲模式與標准 C 中變量的存儲模式不一樣, C51 中變量的存儲模式是與 51 單片機的存儲器緊密相關
-
C51 與標准 C 的輸入輸出處理不一樣, C51 中的輸入輸出是通過 51 串行口來完成的, 輸入輸出指令執行前必須要對串行口進行初始化
-
C51 與標准 C 在函數使用方面也有一定的區別, C51 中有專門的中斷函數
三:基礎知識
基本數據類型
-
基本數據類型

-
指針型
指針型本身就是一個變量, 在這個變量中存放的指向另一個數據的地址
-
寄存器型
這是 C51 擴充的數據類型, 用於訪問 51 單片機中的特殊功能寄存器數據,分 sfr 和 sfr16 兩種類型,在 C51 中對特殊功能寄存器的訪問必須先用 sfr 或 sfr16 進行聲明
-
位類型
這也是 C51 中擴充的數據類型, 用於訪問 51 單片機中的可尋址的位單元。分為bit 型和 sbit 型。它們在內存中都只占一個二進 制位, 其值可以是“1” 或“0” 。
-
KEIL C51 編譯器能夠識別的基本數據類型:
| 基本數據類型 | 長度 | 取值范圍 |
|---|---|---|
| unsigned char | 1 字節 | 0~255 |
| signed char | 1 字節 | -128~+127 |
| unsigned int | 2 字節 | 0~65535 |
| signed int | 2 字節 | -32768~+32767 |
| unsigned long | 4 字節 | 0~4294967295 |
| signed long | 4 字節 | -2147483648~+2147483647 |
| float | 4 字節 | 1.175494E-38~3.402823E+38 |
| bit | 1 位 | 0 或 1 |
| sbit | 1 位 | 0 或 1 |
| sfr | 1 字節 | 0~255 |
| sfr16 | 2 字節 | 0~65535 |
-
隱式轉換的優先級順序與強制轉換 Bit→char→int→long→float→signed→unsigned
通過強制類型轉換符“() ” 對數據類型進行強制轉換
-
C5l 編譯器除了能支持以上這些基本數據類型之外, 還能支持一些復雜的組合型數據類型, 如數組類型、 指針類型、 結構類型、 聯合類型等這些復雜的數據類型
變量
-
變量名
變量名是 C51 區分不同變量, 為不同變量取的名稱。 在 C51 中規定變量名可以由字母、 數字和下划線三種字符組成, 且第一個字母必須為字母或下划線。 變量名有兩種: 普通變量名和指針變量名。 它們的區別是指針變量名前面要帶“*”號。
-
存儲種類
存儲種類是指變量在程序執行過程中的作用范圍。 C51 變量的存儲種類有四種, 分別是自動(auto)、 外部(extern)、 靜態(static)和寄存器(register) 。
-
存儲器類型
存儲器類型 描 述 data 直接尋址的片內 RAM 低 128B, 訪問速度快 bdata 片內 RAM 的可位尋址區(20H~2FH) , 允許字節和位混合訪問 idata 間接尋址訪問的片內 RAM, 允許訪問全部片內 RAM pdata 用 Ri 間接訪問的片外 RAM 的低 256B xdata 用 DPTR 間接訪問的片外 RAM, 允許訪問全部 64k 片外 RAM code 程序存儲器 ROM 64k 空間 -
特殊功能寄存器變量
51 系列單片機片內有許多特殊功能寄存器, 通過這些特殊功能寄存器可以控制 51 系列單片機的定時器、 計數器、 串口、 I/O 及其它功能部件, 每一個特殊功能寄存器在片內 RAM 中都對應於一個字節單元或兩個字節單元。
在 C51 中, 允許用戶對這些特殊功能寄存器進行訪問, 訪問時須通過 sfr 或sfr16 類型說明符進行定義, 定義時須指明它們所對應的片內 RAM 單元的地址。 格式如下:sfr 或 sfr16 特殊功能寄存器名 = 地址; sfr PSW=0xd0;
-
位變量
格式:bit 位變量名;
sbit 位變量名=位地址; sbit LED=P1^0; -
在 C51 中, 為了用戶處理方便, C51 編譯器把 51 單片機的常用的特殊功能寄存器和特殊位進行了定義, 放在一個“reg51.h” 或“reg52.h” 的頭文件中, 當用戶要使用時, 只須要在使用之前用一條預處理命令#include <reg52.h>把這個頭文件包含到程序中, 然后就可使用殊功能寄存器名和特殊位名稱 。
C51運算符
-
賦值運算符 格式:變量=表達式;
-
算術運算符 + - * / %
-
關系運算符 > < >= <= == !=
-
邏輯運算符 || && !
-
位運算符 & | ~ ^ << >>
位運算是按位對變量進行運算, 但並不改變參與運算的變量的值。 如果要求按位改變變量的值, 則要利用相應的賦值運算。
C51 中位運算符只能對整數進行操作
-
復合賦值運算符
+= -= *= /= %=
|= &= ^= ~= >>= <<=
-
逗號運算符
在 C51 語言中, 逗號“, ” 是一個特殊的運算符, 可以用它將兩個或兩個以上的表達式連接起來, 稱為逗號表達式。 逗號表達式的一般格式為:表達式 1, 表達式 2, ……, 表達式 n
按從左至右的順序依次計算出各個表達式的值, 而整個逗號表達式的值是最右邊的表達式( 表達式 n) 的值。
例如:x=(a=3,6*3)結果 x 的值為 18。
-
條件運算符
條件運算符“? : ” 是 C51 語言中唯一的一個三目運算符
條件表達式的一般格式為:邏輯表達式? 表達式 1: 表達式 2 ;
-
指針與地址運算符
指針是 C51 語言中的一個十分重要的概念, 在 C51 中的數據類型中專門有一種指針類型。 指針為變量的訪問提供了另一種方式, 變量的指針就是該變量的地址, 還可以定義一個專門指向某個變量的地址的指針變量 。
* 指針運算符 & 取地址運算符
C51基本結構和語句
-
基本結構
-
順序結構
-
選擇結構
-
循環結構
-
-
基本語句
-
if 語句
①if (表達式) {語句; }
②if (表達式) {語句 1; } else {語句 2; }
③if (表達式 1) {語句 1; }
else if (表達式 2) (語句 2; )
else if (表達式 3) (語句 3; )
……
else if (表達式 n-1) (語句 n-1; )
else {語句 n}
/* 單分支,雙分支,多分支(else if)*/ -
switch/case 語句
switch (表達式)
{case 常量表達式 1: {語句 1; }break;
case 常量表達式 2: {語句 2; }break;
……
case 常量表達式 n: {語句 n; }break;
default: {語句 n+1; }
/*當該表達式的值與某一“case” 后面的常量表達式的值相等時, 就執行該“case” 后面的語句, 然后遇到 break 語句退出 switch 語句。 若表達式的值與所有 case 后的常量表達式的值都不相同, 則執行 default 后面的語句, 然后退出 switch 結構。*/ -
while 語句 do...while 語句
while(表達式)
{語句; } /*循環體*/
do
{語句; } /*循環體*/
while(表達式) ; -
for 語句
for(表達式 1; 表達式 2; 表達式 3)
{語句; } /*循環體*/
/*
在 for 循環中, 一般表達式 1 為初值表達式, 用於給循環變量賦初值; 表達式 2 為條件表達式, 對循環變量進行判斷; 表達式 3 為循環變量更新表達式, 用於對循環變量的值進行更新, 使循環變量能不滿足條件而退出循環。
*/ -
循環的嵌套
void delay(unsigned int x)
{
unsigned char j;
while(x--)
{for (j=0;j<125;j++);}
}
/*用內循環構造一個基准的延時, 調用時通過參數設置外循環的次數,這樣就可以形成各種延時關系。*/ -
break 和 continue 語句
-
return 語句
-
函數
-
函數的定義
函數類型 函數名(形式參數表) [reentrant][interrupt m][using n]
形式參數說明
{
局部變量定義
函數體
}
/*
1. 函數類型
函數類型說明了函數返回值的類型。
2. 函數名
函數名是用戶為自定義函數取的名字以便調用函數時使用。
3. 形式參數表
形式參數表用於列錄在主調函數與被調用函數之間進行數據傳遞的形式參數。
4. reentrant 修飾符
這個修飾符用於把函數定義為可重入函數。 所謂可重入函數就是允許被遞歸調用的函數
5. interrupt m 修飾符
interrupt m 是 C51 函數中非常重要的一個修飾符, 這是因為中斷函數必須通過它進行修飾。m 的取值為 0~31, 對應各種中斷情況
*/ -
函數的調用
//函數調用的一般形式
函數名(實參列表) ;
//函數調用方式有以下三種: 函數語句 函數表達式, 函數參數 -
自定義函數的聲明
//在 C51 中, 函數原型一般形式如下:
[extern] 函數類型 函數名(形式參數表);
//函數的聲明是把函數的名字、 函數類型以及形參的類型、 個數和順序通知編譯系統, 以便調用函數時系統進行對照檢查
//如果聲明的函數在文件內部, 則聲明時不用 extern, 如果聲明的函數不在文件內部, 而在另一個文件中, 聲明時須帶 extern
構造數據類型
-
數組
格式:數據類型說明符 數組名 [常量表達式]={初值, 初值……} 數組有兩種定義方法
-
unsigned char x[5];
-
unsigned int y[3]={1,2,3};
-
-
字符數組
用來存放字符數據的數組稱為字符數組, 它是 C 語言中常用的一種數組 ,定義時把數據類型定義為 char 型。 例如: char string[10];
在 C51 語言中, 字符數組用於存放一組字符或字符串, 字符串以“\0” 作為結束符, 只存放一般字符的字符數組的賦值與使用和一般的數組完全相同。 對於存放字符串的字符數組。 既可以對字符數組的元素逐個進行訪問, 也可以對整個數組按字符串的方式進行處理。
