常量
常量是指在程序執行過程中其值不能改變的量。在C51中支持整型常量、浮點型常量、字符型常量和字符串型常量。
一.整型常量
整型常量也就是整型常數,根據其值範圍在計算機中分配不同的字節數來存放。在C51中它可以表示成以下幾種形式:
十進制整數。如234、-56、0等。
十六進制整數。以0x開頭表示,如0x12表示十六進制數12H。
長整數。在C51中當一個整數的值達到長整型的範圍,則該數按長整型存放,在存儲器中佔四個字節,另外,如一個整數後面加一個字母L,這個數在存儲器中也按長整型存放。如123L在存儲器中佔四個字節。
二.浮點型常量
浮點型常量也就是實型常數。有十進制表示形式和指數表示形式。
十進制表示形式又稱定點表示形式,由數字和小數點組成。如 0.123、34.645等都是十進制數表示形式的浮點型常量。
指數表示形式爲: [±] 數字 [.數字] e [±]數字
例如:123.456e-3、-3.123e2等都是指數形式的浮點型常量。
三.字符型常量
字符型常量是用單引號引起的字符,如‘a’、‘1’、‘F’等。可以是可顯示的ASCII字符,也可以是不可顯示的控制字符。對不可顯示的控制字符須在前面加上反斜槓“\”組成轉義字符。利用它可以完成一些特殊功能和輸出時的格式控制。常用的轉義字符如下表所示。
四.字符串型常量
字符串型常量由雙引號“”括起的字符組成。如“D”、“1234”、“ABCD”等。注意字符串常量與字符常量是不一樣,一個字符常量在計算機內只用一個字節存放,而一個字符串常量在內存中存放時不僅雙引號內的字符一個佔一個字節,而且系統會自動的在後面加一個轉義字符“\o”作爲字符串結束符。因此不要將字符常量和字符串常量混淆,如字符常量‘A’和字符串常量“A”是不一樣的。
變量
變量是在程序運行過程中其值可以改變的量。一個變量由兩部分組成:變量名和變量值。
在C51中,變量在使用前必須對變量進行定義,指出變量的數據類型和存儲模式。以便編譯系統爲它分配相應的存儲單元。定義的格式如下:
[存儲種類] 數據類型說明符 [存儲器類型] 變量名1[=初值],變量名2[初值]…;
一.數據類型說明符
在定義變量時,必須通過數據類型說明符指明變量的數據類型,指明變量在存儲器中佔用的字節數。可以是基本數據類型說明符,也可以是組合數據類型說明符,還可以是用typedef定義的類型別名。
在C51中,爲了增加程序的可讀性,允許用戶爲系統固有的數據類型說明符用typedef起別名,格式如下:
typedef c51固有的數據類型說明符 別名;
定義別名後,就可以用別名代替數據類型說明符對變量進行定義。別名可以用大寫,也可以用小寫,爲了區別一般用大寫字母表示。
【例】 typedef的使用。
typedef unsigned int WORD;
typedef unsigned char BYTE;
BYTE a1=0x12;
WORD a2=0x1234;
二.變量名
變量名是C51區分不同變量,爲不同變量取的名稱。在C51中規定變量名可以由字母、數字和下劃線三種字符組成,且第一個字母必須爲字母或下劃線。變量名有兩種:普通變量名和指針變量名。它們的區別是指針變量名前面要帶“*”號。
三.存儲種類
存儲種類是指變量在程序執行過程中的作用範圍。C51變量的存儲種類有四種,分別是自動(auto)、外部(extern)、靜態(static)和寄存器(register)。
1.auto:
使用auto定義的變量稱爲自動變量,其作用範圍在定義它的函數體或複合語句內部,當定義它的函數體或複合語句執行時,C51才爲該變量分配內存空間,結束時佔用的內存空間釋放。自動變量一般分配在內存的堆棧空間中。定義變量時,如果省略存儲種類,則該變量默認爲自動(auto)變量。
2.extern:
使用extern定義的變量稱爲外部變量。在一個函數體內,要使用一個已在該函數體外或別的程序中定義過的外部變量時,該變量在該函數體內要用extern說明。外部變量被定義後分配固定的內存空間,在程序整個執行時間內都有效,直到程序結束才釋放。
3.static:
使用static定義的變量稱爲靜態變量。它又分爲內部靜態變量和外部靜態變量。在函數體內部定義的靜態變量爲內部靜態變量,它在對應的函數體內有效,一直存在,但在函數體外不可見,這樣不僅使變量在定義它的函數體外被保護,還可以實現當離開函數時值不被改變。外部靜態變量上在函數外部定義的靜態變量。它在程序中一直存在,但在定義的範圍之外是不可見的。如在多文件或多模塊處理中,外部靜態變量只在文件內部或模塊內部有效。
4.register:
使用register定義的變量稱爲寄存器變量。它定義的變量存放在CPU內部的寄存器中,處理速度快,但數目少。C51編譯器編譯時能自動識別程序中使用頻率最高的變量,並自動將其作爲寄存器變量,用戶可以無需專門聲明。
四.存儲器類型
存儲器類型是用於指明變量所處的單片機的存儲器區域情況。存儲器類型與存儲種類完全不同。C51編譯器能識別的存儲器類型有以下幾種,見表所示。
定義變量時也可以省“存儲器類型”,省時C51編譯器將按編譯模式默認存儲器類型,具體編譯模式的情況在後面介紹。
【例】變量定義存儲種類和存儲器類型相關情況。
char data varl; /*在片內RAM低128B定義用直接尋址方式訪問的字符型變量var1*/
int idata var2; /*在片內RAM256B定義用間接尋址方式訪問的整型變量var2*/
auto unsigned long data var3; /*在片內RAM128B定義用直接尋址方式訪問的自動無符號長整型變量var3*/
extern float xdata var4; /*在片外RAM64KB空間定義用間接尋址方式訪問的外部實型變量var4*/
int code var5; /*在ROM空間定義整型變量var5*/
unsign char bdata var6; /*在片內RAM位尋址區20H~2FH單元定義可字節處理和位處理的無符號字符型變量var6*/
五.特殊功能寄存器變量
51系列單片機片內有許多特殊功能寄存器,通過這些特殊功能寄存器可以控制51系列單片機的定時器、計數器、串口、I/O及其它功能部件,每一個特殊功能寄存器在片內RAM中都對應於一個字節單元或兩個字節單元。
在C51中,允許用戶對這些特殊功能寄存器進行訪問,訪問時須通過sfr或sfr16類型說明符進行定義,定義時須指明它們所對應的片內RAM單元的地址。格式如下:
sfr或sfr16 特殊功能寄存器名=地址;
sfr用於對51單片機中單字節的特殊功能寄存器進行定義,sfr16用於對雙字節特殊功能寄存器進行定義。特殊功能寄存器名一般用大寫字母表示。地址一般用直接地址形式,具體特殊功能寄存器地址見前面內容。
【例】特殊功能寄存器的定義。
sfr PSW=0xd0;
sfr SCON=0x98;
sfr TMOD=0x89;
sfr P1=0x90;
sfr16 DPTR=0x82;
sfr16 T1=0X8A;
六.位變量
在C51中,允許用戶通過位類型符定義位變量。位類型符有兩個:bit和sbit。可以定義兩種位變量。
bit位類型符用於定義一般的可位處理位變量。它的格式如下:
bit 位變量名;
在格式中可以加上各種修飾,但注意存儲器類型只能是bdata、data、idata。只能是片內RAM的可位尋址區,嚴格來說只能是bdata。
【例】 bit型變量的定義。
bit data a1; /*正確*/
bit bdata a2; /*正確*/
bit pdata a3; /*錯誤*/
bit xdata a4; /*錯誤*/
sbit位類型符用於定義在可位尋址字節或特殊功能寄存器中的位,定義時須指明其位地址,可以是位直接地址,可以是可位尋址變量帶位號,也可以是特殊功能寄存器名帶位號。格式如下:
sbit 位變量名=位地址;
如位地址爲位直接地址,其取值範圍爲0x00~0xff;如位地址是可位尋址變量帶位號或特殊功能寄存器名帶位號,則在它前面須對可位尋址變量或特殊功能寄存器進行定義。字節地址與位號之間、特殊功能寄存器與位號之間一般用“^”作間隔。
【例】sbit型變量的定義:
sbit OV=0xd2;
sbit CY=oxd7;
unsigned char bdata flag;
sbit flag0=flag^0;
sfr P1=0x90;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
在C51中,爲了用戶處理方便,C51編譯器把51單片機的常用的特殊功能寄存器和特殊位進行了定義,放在一個“reg51.h”或“reg52.h”的頭文件中,當用戶要使用時,只須要在使用之前用一條預處理命令#include <reg52.h>把這個頭文件包含到程序中,然後就可使用殊功能寄存器名和特殊位名稱。